Wordfence Security – Firewall & Malware Scan - Version 6.3.1

Version Description

  • Improvement: Locked out IPs are now enforced at the WAF level to reduce server load.
  • Improvement: Added a "Show more" link to the IP block list and login attempts list.
  • Improvement: Added network data for the top countries blocked list.
  • Improvement: Added a notification when a premium key is installed on one site but registered for another URL.
  • Improvement: Switching tabs in the various pages now updates the page title as well.
  • Improvement: Various styling consistency improvements.
  • Change: Separated the various blocking-related pages out from the Firewall top-level menu into "Blocking".
  • Fix: Improved compatibility with our GeoIP interface.
  • Fix: The updates available notification is refreshed after updates are installed.
  • Fix: The scan notification is refreshed when issues are resolved or ignored.
Download this release

Release Info

Developer wfryan
Plugin Icon 128x128 Wordfence Security – Firewall & Malware Scan
Version 6.3.1
Comparing to
See all releases

Code changes from version 6.3.0 to 6.3.1

css/main.css CHANGED
@@ -1 +1 @@
1
- .wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}@-ms-viewport{width:device-width}.wf-visible-xs{display:none !important}.wf-visible-sm{display:none !important}.wf-visible-md{display:none !important}.wf-visible-lg{display:none !important}.wf-visible-xs-block,.wf-visible-xs-inline,.wf-visible-xs-inline-block,.wf-visible-sm-block,.wf-visible-sm-inline,.wf-visible-sm-inline-block,.wf-visible-md-block,.wf-visible-md-inline,.wf-visible-md-inline-block,.wf-visible-lg-block,.wf-visible-lg-inline,.wf-visible-lg-inline-block{display:none !important}@media (max-width: 767px){.wf-visible-xs{display:block !important}table.wf-visible-xs{display:table !important}tr.wf-visible-xs{display:table-row !important}th.wf-visible-xs,td.wf-visible-xs{display:table-cell !important}}@media (max-width: 767px){.wf-visible-xs-block{display:block !important}}@media (max-width: 767px){.wf-visible-xs-inline{display:inline !important}}@media (max-width: 767px){.wf-visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm{display:block !important}table.wf-visible-sm{display:table !important}tr.wf-visible-sm{display:table-row !important}th.wf-visible-sm,td.wf-visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md{display:block !important}table.wf-visible-md{display:table !important}tr.wf-visible-md{display:table-row !important}th.wf-visible-md,td.wf-visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.wf-visible-lg{display:block !important}table.wf-visible-lg{display:table !important}tr.wf-visible-lg{display:table-row !important}th.wf-visible-lg,td.wf-visible-lg{display:table-cell !important}}@media (min-width: 1200px){.wf-visible-lg-block{display:block !important}}@media (min-width: 1200px){.wf-visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.wf-visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.wf-hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.wf-hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-hidden-md{display:none !important}}@media (min-width: 1200px){.wf-hidden-lg{display:none !important}}.wf-visible-print{display:none !important}@media print{.wf-visible-print{display:block !important}table.wf-visible-print{display:table !important}tr.wf-visible-print{display:table-row !important}th.wf-visible-print,td.wf-visible-print{display:table-cell !important}}.wf-visible-print-block{display:none !important}@media print{.wf-visible-print-block{display:block !important}}.wf-visible-print-inline{display:none !important}@media print{.wf-visible-print-inline{display:inline !important}}.wf-visible-print-inline-block{display:none !important}@media print{.wf-visible-print-inline-block{display:inline-block !important}}@media print{.wf-hidden-print{display:none !important}}.wf-container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wf-container:before,.wf-container:after{content:" ";display:table}.wf-container:after{clear:both}@media (min-width: 768px){.wf-container{width:750px}}@media (min-width: 992px){.wf-container{width:970px}}@media (min-width: 1200px){.wf-container{width:1170px}}.wf-container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wf-container-fluid:before,.wf-container-fluid:after{content:" ";display:table}.wf-container-fluid:after{clear:both}.wf-row{margin-left:-15px;margin-right:-15px}.wf-row:before,.wf-row:after{content:" ";display:table}.wf-row:after{clear:both}.wf-col-xs-1,.wf-col-sm-1,.wf-col-md-1,.wf-col-lg-1,.wf-col-xs-2,.wf-col-sm-2,.wf-col-md-2,.wf-col-lg-2,.wf-col-xs-3,.wf-col-sm-3,.wf-col-md-3,.wf-col-lg-3,.wf-col-xs-4,.wf-col-sm-4,.wf-col-md-4,.wf-col-lg-4,.wf-col-xs-5,.wf-col-sm-5,.wf-col-md-5,.wf-col-lg-5,.wf-col-xs-6,.wf-col-sm-6,.wf-col-md-6,.wf-col-lg-6,.wf-col-xs-7,.wf-col-sm-7,.wf-col-md-7,.wf-col-lg-7,.wf-col-xs-8,.wf-col-sm-8,.wf-col-md-8,.wf-col-lg-8,.wf-col-xs-9,.wf-col-sm-9,.wf-col-md-9,.wf-col-lg-9,.wf-col-xs-10,.wf-col-sm-10,.wf-col-md-10,.wf-col-lg-10,.wf-col-xs-11,.wf-col-sm-11,.wf-col-md-11,.wf-col-lg-11,.wf-col-xs-12,.wf-col-sm-12,.wf-col-md-12,.wf-col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px;box-sizing:border-box}.wf-col-xs-1,.wf-col-xs-2,.wf-col-xs-3,.wf-col-xs-4,.wf-col-xs-5,.wf-col-xs-6,.wf-col-xs-7,.wf-col-xs-8,.wf-col-xs-9,.wf-col-xs-10,.wf-col-xs-11,.wf-col-xs-12{float:left}.wf-col-xs-1{width:8.33333%}.wf-col-xs-2{width:16.66667%}.wf-col-xs-3{width:25%}.wf-col-xs-4{width:33.33333%}.wf-col-xs-5{width:41.66667%}.wf-col-xs-6{width:50%}.wf-col-xs-7{width:58.33333%}.wf-col-xs-8{width:66.66667%}.wf-col-xs-9{width:75%}.wf-col-xs-10{width:83.33333%}.wf-col-xs-11{width:91.66667%}.wf-col-xs-12{width:100%}.wf-col-xs-pull-0{right:auto}.wf-col-xs-pull-1{right:8.33333%}.wf-col-xs-pull-2{right:16.66667%}.wf-col-xs-pull-3{right:25%}.wf-col-xs-pull-4{right:33.33333%}.wf-col-xs-pull-5{right:41.66667%}.wf-col-xs-pull-6{right:50%}.wf-col-xs-pull-7{right:58.33333%}.wf-col-xs-pull-8{right:66.66667%}.wf-col-xs-pull-9{right:75%}.wf-col-xs-pull-10{right:83.33333%}.wf-col-xs-pull-11{right:91.66667%}.wf-col-xs-pull-12{right:100%}.wf-col-xs-push-0{left:auto}.wf-col-xs-push-1{left:8.33333%}.wf-col-xs-push-2{left:16.66667%}.wf-col-xs-push-3{left:25%}.wf-col-xs-push-4{left:33.33333%}.wf-col-xs-push-5{left:41.66667%}.wf-col-xs-push-6{left:50%}.wf-col-xs-push-7{left:58.33333%}.wf-col-xs-push-8{left:66.66667%}.wf-col-xs-push-9{left:75%}.wf-col-xs-push-10{left:83.33333%}.wf-col-xs-push-11{left:91.66667%}.wf-col-xs-push-12{left:100%}.wf-col-xs-offset-0{margin-left:0%}.wf-col-xs-offset-1{margin-left:8.33333%}.wf-col-xs-offset-2{margin-left:16.66667%}.wf-col-xs-offset-3{margin-left:25%}.wf-col-xs-offset-4{margin-left:33.33333%}.wf-col-xs-offset-5{margin-left:41.66667%}.wf-col-xs-offset-6{margin-left:50%}.wf-col-xs-offset-7{margin-left:58.33333%}.wf-col-xs-offset-8{margin-left:66.66667%}.wf-col-xs-offset-9{margin-left:75%}.wf-col-xs-offset-10{margin-left:83.33333%}.wf-col-xs-offset-11{margin-left:91.66667%}.wf-col-xs-offset-12{margin-left:100%}.wf-col-xs-half-padding-left{padding-left:8px}.wf-col-xs-half-padding-right{padding-right:7px}@media (min-width: 768px){.wf-col-sm-1,.wf-col-sm-2,.wf-col-sm-3,.wf-col-sm-4,.wf-col-sm-5,.wf-col-sm-6,.wf-col-sm-7,.wf-col-sm-8,.wf-col-sm-9,.wf-col-sm-10,.wf-col-sm-11,.wf-col-sm-12{float:left}.wf-col-sm-1{width:8.33333%}.wf-col-sm-2{width:16.66667%}.wf-col-sm-3{width:25%}.wf-col-sm-4{width:33.33333%}.wf-col-sm-5{width:41.66667%}.wf-col-sm-6{width:50%}.wf-col-sm-7{width:58.33333%}.wf-col-sm-8{width:66.66667%}.wf-col-sm-9{width:75%}.wf-col-sm-10{width:83.33333%}.wf-col-sm-11{width:91.66667%}.wf-col-sm-12{width:100%}.wf-col-sm-pull-0{right:auto}.wf-col-sm-pull-1{right:8.33333%}.wf-col-sm-pull-2{right:16.66667%}.wf-col-sm-pull-3{right:25%}.wf-col-sm-pull-4{right:33.33333%}.wf-col-sm-pull-5{right:41.66667%}.wf-col-sm-pull-6{right:50%}.wf-col-sm-pull-7{right:58.33333%}.wf-col-sm-pull-8{right:66.66667%}.wf-col-sm-pull-9{right:75%}.wf-col-sm-pull-10{right:83.33333%}.wf-col-sm-pull-11{right:91.66667%}.wf-col-sm-pull-12{right:100%}.wf-col-sm-push-0{left:auto}.wf-col-sm-push-1{left:8.33333%}.wf-col-sm-push-2{left:16.66667%}.wf-col-sm-push-3{left:25%}.wf-col-sm-push-4{left:33.33333%}.wf-col-sm-push-5{left:41.66667%}.wf-col-sm-push-6{left:50%}.wf-col-sm-push-7{left:58.33333%}.wf-col-sm-push-8{left:66.66667%}.wf-col-sm-push-9{left:75%}.wf-col-sm-push-10{left:83.33333%}.wf-col-sm-push-11{left:91.66667%}.wf-col-sm-push-12{left:100%}.wf-col-sm-offset-0{margin-left:0%}.wf-col-sm-offset-1{margin-left:8.33333%}.wf-col-sm-offset-2{margin-left:16.66667%}.wf-col-sm-offset-3{margin-left:25%}.wf-col-sm-offset-4{margin-left:33.33333%}.wf-col-sm-offset-5{margin-left:41.66667%}.wf-col-sm-offset-6{margin-left:50%}.wf-col-sm-offset-7{margin-left:58.33333%}.wf-col-sm-offset-8{margin-left:66.66667%}.wf-col-sm-offset-9{margin-left:75%}.wf-col-sm-offset-10{margin-left:83.33333%}.wf-col-sm-offset-11{margin-left:91.66667%}.wf-col-sm-offset-12{margin-left:100%}.wf-col-sm-half-padding-left{padding-left:8px}.wf-col-sm-half-padding-right{padding-right:7px}}@media (min-width: 992px){.wf-col-md-1,.wf-col-md-2,.wf-col-md-3,.wf-col-md-4,.wf-col-md-5,.wf-col-md-6,.wf-col-md-7,.wf-col-md-8,.wf-col-md-9,.wf-col-md-10,.wf-col-md-11,.wf-col-md-12{float:left}.wf-col-md-1{width:8.33333%}.wf-col-md-2{width:16.66667%}.wf-col-md-3{width:25%}.wf-col-md-4{width:33.33333%}.wf-col-md-5{width:41.66667%}.wf-col-md-6{width:50%}.wf-col-md-7{width:58.33333%}.wf-col-md-8{width:66.66667%}.wf-col-md-9{width:75%}.wf-col-md-10{width:83.33333%}.wf-col-md-11{width:91.66667%}.wf-col-md-12{width:100%}.wf-col-md-pull-0{right:auto}.wf-col-md-pull-1{right:8.33333%}.wf-col-md-pull-2{right:16.66667%}.wf-col-md-pull-3{right:25%}.wf-col-md-pull-4{right:33.33333%}.wf-col-md-pull-5{right:41.66667%}.wf-col-md-pull-6{right:50%}.wf-col-md-pull-7{right:58.33333%}.wf-col-md-pull-8{right:66.66667%}.wf-col-md-pull-9{right:75%}.wf-col-md-pull-10{right:83.33333%}.wf-col-md-pull-11{right:91.66667%}.wf-col-md-pull-12{right:100%}.wf-col-md-push-0{left:auto}.wf-col-md-push-1{left:8.33333%}.wf-col-md-push-2{left:16.66667%}.wf-col-md-push-3{left:25%}.wf-col-md-push-4{left:33.33333%}.wf-col-md-push-5{left:41.66667%}.wf-col-md-push-6{left:50%}.wf-col-md-push-7{left:58.33333%}.wf-col-md-push-8{left:66.66667%}.wf-col-md-push-9{left:75%}.wf-col-md-push-10{left:83.33333%}.wf-col-md-push-11{left:91.66667%}.wf-col-md-push-12{left:100%}.wf-col-md-offset-0{margin-left:0%}.wf-col-md-offset-1{margin-left:8.33333%}.wf-col-md-offset-2{margin-left:16.66667%}.wf-col-md-offset-3{margin-left:25%}.wf-col-md-offset-4{margin-left:33.33333%}.wf-col-md-offset-5{margin-left:41.66667%}.wf-col-md-offset-6{margin-left:50%}.wf-col-md-offset-7{margin-left:58.33333%}.wf-col-md-offset-8{margin-left:66.66667%}.wf-col-md-offset-9{margin-left:75%}.wf-col-md-offset-10{margin-left:83.33333%}.wf-col-md-offset-11{margin-left:91.66667%}.wf-col-md-offset-12{margin-left:100%}.wf-col-md-half-padding-left{padding-left:8px}.wf-col-md-half-padding-right{padding-right:7px}}@media (min-width: 1200px){.wf-col-lg-1,.wf-col-lg-2,.wf-col-lg-3,.wf-col-lg-4,.wf-col-lg-5,.wf-col-lg-6,.wf-col-lg-7,.wf-col-lg-8,.wf-col-lg-9,.wf-col-lg-10,.wf-col-lg-11,.wf-col-lg-12{float:left}.wf-col-lg-1{width:8.33333%}.wf-col-lg-2{width:16.66667%}.wf-col-lg-3{width:25%}.wf-col-lg-4{width:33.33333%}.wf-col-lg-5{width:41.66667%}.wf-col-lg-6{width:50%}.wf-col-lg-7{width:58.33333%}.wf-col-lg-8{width:66.66667%}.wf-col-lg-9{width:75%}.wf-col-lg-10{width:83.33333%}.wf-col-lg-11{width:91.66667%}.wf-col-lg-12{width:100%}.wf-col-lg-pull-0{right:auto}.wf-col-lg-pull-1{right:8.33333%}.wf-col-lg-pull-2{right:16.66667%}.wf-col-lg-pull-3{right:25%}.wf-col-lg-pull-4{right:33.33333%}.wf-col-lg-pull-5{right:41.66667%}.wf-col-lg-pull-6{right:50%}.wf-col-lg-pull-7{right:58.33333%}.wf-col-lg-pull-8{right:66.66667%}.wf-col-lg-pull-9{right:75%}.wf-col-lg-pull-10{right:83.33333%}.wf-col-lg-pull-11{right:91.66667%}.wf-col-lg-pull-12{right:100%}.wf-col-lg-push-0{left:auto}.wf-col-lg-push-1{left:8.33333%}.wf-col-lg-push-2{left:16.66667%}.wf-col-lg-push-3{left:25%}.wf-col-lg-push-4{left:33.33333%}.wf-col-lg-push-5{left:41.66667%}.wf-col-lg-push-6{left:50%}.wf-col-lg-push-7{left:58.33333%}.wf-col-lg-push-8{left:66.66667%}.wf-col-lg-push-9{left:75%}.wf-col-lg-push-10{left:83.33333%}.wf-col-lg-push-11{left:91.66667%}.wf-col-lg-push-12{left:100%}.wf-col-lg-offset-0{margin-left:0%}.wf-col-lg-offset-1{margin-left:8.33333%}.wf-col-lg-offset-2{margin-left:16.66667%}.wf-col-lg-offset-3{margin-left:25%}.wf-col-lg-offset-4{margin-left:33.33333%}.wf-col-lg-offset-5{margin-left:41.66667%}.wf-col-lg-offset-6{margin-left:50%}.wf-col-lg-offset-7{margin-left:58.33333%}.wf-col-lg-offset-8{margin-left:66.66667%}.wf-col-lg-offset-9{margin-left:75%}.wf-col-lg-offset-10{margin-left:83.33333%}.wf-col-lg-offset-11{margin-left:91.66667%}.wf-col-lg-offset-12{margin-left:100%}.wf-col-lg-half-padding-left{padding-left:8px}.wf-col-lg-half-padding-right{padding-right:7px}}.wf-btn{display:inline-block;margin-bottom:0;font-weight:bold;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.wf-btn:focus,.wf-btn.wf-focus,.wf-btn:active:focus,.wf-btn:active.wf-focus,.wf-btn.wf-active:focus,.wf-btn.wf-active.wf-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wf-btn:hover,.wf-btn:focus,.wf-btn.wf-focus{color:#333;text-decoration:none}.wf-btn:active,.wf-btn.wf-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wf-btn.wf-disabled,.wf-btn[disabled],fieldset[disabled] .wf-btn{cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.wf-btn{text-decoration:none}a.wf-btn.wf-disabled,fieldset[disabled] a.wf-btn{pointer-events:none}.wf-btn-default{color:#333;background-color:#fff;border-color:#ccc}.wf-btn-default:focus,.wf-btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.wf-btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.wf-btn-default:active,.wf-btn-default.active,.wf-open>.wf-btn-default.wf-dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.wf-btn-default:active:hover,.wf-btn-default:active:focus,.wf-btn-default:active.focus,.wf-btn-default.active:hover,.wf-btn-default.active:focus,.wf-btn-default.active.focus,.wf-open>.wf-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-btn-default.wf-dropdown-toggle.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.wf-btn-default:active,.wf-btn-default.wf-active,.wf-open>.wf-btn-default.wf-dropdown-toggle{background-image:none}.wf-btn-default.wf-disabled:hover,.wf-btn-default.wf-disabled:focus,.wf-btn-default.wf-disabled.wf-focus,.wf-btn-default[disabled]:hover,.wf-btn-default[disabled]:focus,.wf-btn-default[disabled].wf-focus,fieldset[disabled] .wf-btn-default:hover,fieldset[disabled] .wf-btn-default:focus,fieldset[disabled] .wf-btn-default.wf-focus{background-color:#fff;border-color:#ccc}.wf-btn-default .wf-badge{color:#fff;background-color:#333}.wf-btn-primary{color:#fff;background-color:#00709e;border-color:#005e85}.wf-btn-primary:focus,.wf-btn-primary.focus{color:#fff;background-color:#004c6b;border-color:#000405}.wf-btn-primary:hover{color:#fff;background-color:#004c6b;border-color:#003347}.wf-btn-primary:active,.wf-btn-primary.active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}.wf-btn-primary:active:hover,.wf-btn-primary:active:focus,.wf-btn-primary:active.focus,.wf-btn-primary.active:hover,.wf-btn-primary.active:focus,.wf-btn-primary.active.focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}.wf-btn-primary:active,.wf-btn-primary.wf-active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{background-image:none}.wf-btn-primary.wf-disabled:hover,.wf-btn-primary.wf-disabled:focus,.wf-btn-primary.wf-disabled.wf-focus,.wf-btn-primary[disabled]:hover,.wf-btn-primary[disabled]:focus,.wf-btn-primary[disabled].wf-focus,fieldset[disabled] .wf-btn-primary:hover,fieldset[disabled] .wf-btn-primary:focus,fieldset[disabled] .wf-btn-primary.wf-focus{background-color:#00709e;border-color:#005e85}.wf-btn-primary .wf-badge{color:#00709e;background-color:#fff}.wf-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.wf-btn-success:focus,.wf-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.wf-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.wf-btn-success:active,.wf-btn-success.active,.wf-open>.wf-btn-success.wf-dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.wf-btn-success:active:hover,.wf-btn-success:active:focus,.wf-btn-success:active.focus,.wf-btn-success.active:hover,.wf-btn-success.active:focus,.wf-btn-success.active.focus,.wf-open>.wf-btn-success.wf-dropdown-toggle:hover,.wf-open>.wf-btn-success.wf-dropdown-toggle:focus,.wf-open>.wf-btn-success.wf-dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.wf-btn-success:active,.wf-btn-success.wf-active,.wf-open>.wf-btn-success.wf-dropdown-toggle{background-image:none}.wf-btn-success.wf-disabled:hover,.wf-btn-success.wf-disabled:focus,.wf-btn-success.wf-disabled.wf-focus,.wf-btn-success[disabled]:hover,.wf-btn-success[disabled]:focus,.wf-btn-success[disabled].wf-focus,fieldset[disabled] .wf-btn-success:hover,fieldset[disabled] .wf-btn-success:focus,fieldset[disabled] .wf-btn-success.wf-focus{background-color:#5cb85c;border-color:#4cae4c}.wf-btn-success .wf-badge{color:#5cb85c;background-color:#fff}.wf-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.wf-btn-info:focus,.wf-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.wf-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.wf-btn-info:active,.wf-btn-info.active,.wf-open>.wf-btn-info.wf-dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.wf-btn-info:active:hover,.wf-btn-info:active:focus,.wf-btn-info:active.focus,.wf-btn-info.active:hover,.wf-btn-info.active:focus,.wf-btn-info.active.focus,.wf-open>.wf-btn-info.wf-dropdown-toggle:hover,.wf-open>.wf-btn-info.wf-dropdown-toggle:focus,.wf-open>.wf-btn-info.wf-dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.wf-btn-info:active,.wf-btn-info.wf-active,.wf-open>.wf-btn-info.wf-dropdown-toggle{background-image:none}.wf-btn-info.wf-disabled:hover,.wf-btn-info.wf-disabled:focus,.wf-btn-info.wf-disabled.wf-focus,.wf-btn-info[disabled]:hover,.wf-btn-info[disabled]:focus,.wf-btn-info[disabled].wf-focus,fieldset[disabled] .wf-btn-info:hover,fieldset[disabled] .wf-btn-info:focus,fieldset[disabled] .wf-btn-info.wf-focus{background-color:#5bc0de;border-color:#46b8da}.wf-btn-info .wf-badge{color:#5bc0de;background-color:#fff}.wf-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.wf-btn-warning:focus,.wf-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.wf-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.wf-btn-warning:active,.wf-btn-warning.active,.wf-open>.wf-btn-warning.wf-dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.wf-btn-warning:active:hover,.wf-btn-warning:active:focus,.wf-btn-warning:active.focus,.wf-btn-warning.active:hover,.wf-btn-warning.active:focus,.wf-btn-warning.active.focus,.wf-open>.wf-btn-warning.wf-dropdown-toggle:hover,.wf-open>.wf-btn-warning.wf-dropdown-toggle:focus,.wf-open>.wf-btn-warning.wf-dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.wf-btn-warning:active,.wf-btn-warning.wf-active,.wf-open>.wf-btn-warning.wf-dropdown-toggle{background-image:none}.wf-btn-warning.wf-disabled:hover,.wf-btn-warning.wf-disabled:focus,.wf-btn-warning.wf-disabled.wf-focus,.wf-btn-warning[disabled]:hover,.wf-btn-warning[disabled]:focus,.wf-btn-warning[disabled].wf-focus,fieldset[disabled] .wf-btn-warning:hover,fieldset[disabled] .wf-btn-warning:focus,fieldset[disabled] .wf-btn-warning.wf-focus{background-color:#f0ad4e;border-color:#eea236}.wf-btn-warning .wf-badge{color:#f0ad4e;background-color:#fff}.wf-btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.wf-btn-danger:focus,.wf-btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.wf-btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.wf-btn-danger:active,.wf-btn-danger.active,.wf-open>.wf-btn-danger.wf-dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#ac2925}.wf-btn-danger:active:hover,.wf-btn-danger:active:focus,.wf-btn-danger:active.focus,.wf-btn-danger.active:hover,.wf-btn-danger.active:focus,.wf-btn-danger.active.focus,.wf-open>.wf-btn-danger.wf-dropdown-toggle:hover,.wf-open>.wf-btn-danger.wf-dropdown-toggle:focus,.wf-open>.wf-btn-danger.wf-dropdown-toggle.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.wf-btn-danger:active,.wf-btn-danger.wf-active,.wf-open>.wf-btn-danger.wf-dropdown-toggle{background-image:none}.wf-btn-danger.wf-disabled:hover,.wf-btn-danger.wf-disabled:focus,.wf-btn-danger.wf-disabled.wf-focus,.wf-btn-danger[disabled]:hover,.wf-btn-danger[disabled]:focus,.wf-btn-danger[disabled].wf-focus,fieldset[disabled] .wf-btn-danger:hover,fieldset[disabled] .wf-btn-danger:focus,fieldset[disabled] .wf-btn-danger.wf-focus{background-color:#d9534f;border-color:#d43f3a}.wf-btn-danger .wf-badge{color:#d9534f;background-color:#fff}.wf-btn-callout{padding:1rem;text-transform:uppercase}.wf-btn-link{color:#00709e;font-weight:normal;border-radius:0}.wf-btn-link,.wf-btn-link:active,.wf-btn-link.wf-active,.wf-btn-link[disabled],fieldset[disabled] .wf-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.wf-btn-link,.wf-btn-link:hover,.wf-btn-link:focus,.wf-btn-link:active{border-color:transparent}.wf-btn-link:hover,.wf-btn-link:focus{color:#003a52;text-decoration:underline;background-color:transparent}.wf-btn-link[disabled]:hover,.wf-btn-link[disabled]:focus,fieldset[disabled] .wf-btn-link:hover,fieldset[disabled] .wf-btn-link:focus{color:#777;text-decoration:none}.wf-btn-lg,.wf-btn-group-lg>.wf-btn{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wf-btn-sm,.wf-btn-group-sm>.wf-btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px;text-transform:none}.wf-btn-xs,.wf-btn-group-xs>.wf-btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px;text-transform:none}.wf-btn-block{display:block;width:100%}.wf-btn-block+.wf-btn-block{margin-top:5px}input[type="submit"].wf-btn-block,input[type="reset"].wf-btn-block,input[type="button"].wf-btn-block{width:100%}.wf-btn-group,.wf-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.wf-btn-group>.wf-btn,.wf-btn-group-vertical>.wf-btn{position:relative;float:left}.wf-btn-group>.wf-btn:hover,.wf-btn-group>.wf-btn:focus,.wf-btn-group>.wf-btn:active,.wf-btn-group>.wf-btn.wf-active,.wf-btn-group-vertical>.wf-btn:hover,.wf-btn-group-vertical>.wf-btn:focus,.wf-btn-group-vertical>.wf-btn:active,.wf-btn-group-vertical>.wf-btn.wf-active{z-index:2}.wf-btn-group .wf-btn+.wf-btn,.wf-btn-group .wf-btn+.wf-btn-group,.wf-btn-group .wf-btn-group+.wf-btn,.wf-btn-group .wf-btn-group+.wf-btn-group{margin-left:-1px}.wf-btn-toolbar{margin-left:-5px}.wf-btn-toolbar:before,.wf-btn-toolbar:after{content:" ";display:table}.wf-btn-toolbar:after{clear:both}.wf-btn-toolbar .wf-btn,.wf-btn-toolbar .wf-btn-group,.wf-btn-toolbar .wf-input-group{float:left}.wf-btn-toolbar>.wf-btn,.wf-btn-toolbar>.wf-btn-group,.wf-btn-toolbar>.wf-input-group{margin-left:5px}.wf-btn-group>.wf-btn:not(:first-child):not(:last-child):not(.wf-dropdown-toggle){border-radius:0}.wf-btn-group>.wf-btn:first-child{margin-left:0}.wf-btn-group>.wf-btn:first-child:not(:last-child):not(.wf-dropdown-toggle){-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group>.wf-btn:last-child:not(:first-child),.wf-btn-group>.wf-dropdown-toggle:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wf-btn-group>.wf-btn-group{float:left}.wf-btn-group>.wf-btn-group:not(:first-child):not(:last-child)>.wf-btn{border-radius:0}.wf-btn-group>.wf-btn-group:first-child:not(:last-child)>.wf-btn:last-child,.wf-btn-group>.wf-btn-group:first-child:not(:last-child)>.wf-dropdown-toggle{-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group>.wf-btn-group:last-child:not(:first-child)>.wf-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wf-btn-group .wf-dropdown-toggle:active,.wf-btn-group.wf-open .wf-dropdown-toggle{outline:0}.wf-btn-group>.wf-btn+.wf-dropdown-toggle{padding-left:8px;padding-right:8px}.wf-btn-group>.wf-btn-lg+.wf-dropdown-toggle,.wf-btn-group-lg.wf-btn-group>.wf-btn+.wf-dropdown-toggle{padding-left:12px;padding-right:12px}.wf-btn-group.open .wf-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wf-btn-group.open .wf-dropdown-toggle.wf-btn-link{-webkit-box-shadow:none;box-shadow:none}.wf-btn .wf-caret{margin-left:0}.wf-btn-lg .wf-caret,.wf-btn-group-lg>.wf-btn .wf-caret{border-width:5px 5px 0;border-bottom-width:0}.wf-dropup .wf-btn-lg .wf-caret,.wf-dropup .wf-btn-group-lg>.wf-btn .wf-caret{border-width:0 5px 5px}.wf-btn-group-vertical>.wf-btn,.wf-btn-group-vertical>.wf-btn-group,.wf-btn-group-vertical>.wf-btn-group>.wf-btn{display:block;float:none;width:100%;max-width:100%}.wf-btn-group-vertical>.wf-btn-group:before,.wf-btn-group-vertical>.wf-btn-group:after{content:" ";display:table}.wf-btn-group-vertical>.wf-btn-group:after{clear:both}.wf-btn-group-vertical>.wf-btn-group>.wf-btn{float:none}.wf-btn-group-vertical>.wf-btn+.wf-btn,.wf-btn-group-vertical>.wf-btn+.wf-btn-group,.wf-btn-group-vertical>.wf-btn-group+.wf-btn,.wf-btn-group-vertical>.wf-btn-group+.wf-btn-group{margin-top:-1px;margin-left:0}.wf-btn-group-vertical>.wf-btn:not(:first-child):not(:last-child){border-radius:0}.wf-btn-group-vertical>.wf-btn:first-child:not(:last-child){-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group-vertical>.wf-btn:last-child:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wf-btn-group-vertical>.wf-btn-group:not(:first-child):not(:last-child)>.wf-btn{border-radius:0}.wf-btn-group-vertical>.wf-btn-group:first-child:not(:last-child)>.wf-btn:last-child,.wf-btn-group-vertical>.wf-btn-group:first-child:not(:last-child)>.wf-dropdown-toggle{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group-vertical>.wf-btn-group:last-child:not(:first-child)>.wf-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wf-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.wf-btn-group-justified>.wf-btn,.wf-btn-group-justified>.wf-btn-group{float:none;display:table-cell;width:1%}.wf-btn-group-justified>.wf-btn-group .wf-btn{width:100%}.wf-btn-group-justified>.wf-btn-group .wf-dropdown-menu{left:auto}[data-toggle="buttons"]>.wf-btn input[type="radio"],[data-toggle="buttons"]>.wf-btn input[type="checkbox"],[data-toggle="buttons"]>.wf-btn-group>.wf-btn input[type="radio"],[data-toggle="buttons"]>.wf-btn-group>.wf-btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.wf-pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.wf-pagination>li{display:inline}.wf-pagination>li>a,.wf-pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857;text-decoration:none;color:#00709e;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.wf-pagination>li:first-child>a,.wf-pagination>li:first-child>span{margin-left:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.wf-pagination>li:last-child>a,.wf-pagination>li:last-child>span{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wf-pagination>li>a:hover,.wf-pagination>li>a:focus,.wf-pagination>li>span:hover,.wf-pagination>li>span:focus{z-index:2;color:#003a52;background-color:#e2e2e2;border-color:#ddd}.wf-pagination>.wf-active>a,.wf-pagination>.wf-active>a:hover,.wf-pagination>.wf-active>a:focus,.wf-pagination>.wf-active>span,.wf-pagination>.wf-active>span:hover,.wf-pagination>.wf-active>span:focus{z-index:3;color:#fff;background-color:#00709e;border-color:#00709e;cursor:default}.wf-pagination>.wf-disabled>span,.wf-pagination>.wf-disabled>span:hover,.wf-pagination>.wf-disabled>span:focus,.wf-pagination>.wf-disabled>a,.wf-pagination>.wf-disabled>a:hover,.wf-pagination>.wf-disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.wf-pagination-lg>li>a,.wf-pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33333}.wf-pagination-lg>li:first-child>a,.wf-pagination-lg>li:first-child>span{-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wf-pagination-lg>li:last-child>a,.wf-pagination-lg>li:last-child>span{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wf-pagination-sm>li>a,.wf-pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.wf-pagination-sm>li:first-child>a,.wf-pagination-sm>li:first-child>span{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.wf-pagination-sm>li:last-child>a,.wf-pagination-sm>li:last-child>span{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.wrap.wordfence{direction:ltr;min-width:1024px}.wrap.wordfence>.wf-container-fluid{padding-left:0px;padding-right:0px}.wrap.wordfence .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709E}.wrap.wordfence h3{font-size:1.15em}.wordfenceWrap{margin:20px 0 0 20px}.wordfence-icon32{width:32px;height:32px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:7px 5px 0 0;float:left}#wfHeading{white-space:nowrap}#wfHeading:after{content:'.';visibility:hidden;display:block;clear:both;height:0px}div.wordfence-lock-icon{background-image:url(../images/wordfence-logo-32x32.png)}a.wfhelp{background-image:url(../images/help.png);width:12px;height:12px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:0 3px 0 3px;text-decoration:none;display:inline-block;vertical-align:middle}.wordfence .resulticon{display:block;float:left;width:16px;height:16px;background-position:0 0;background-repeat:no-repeat;border-width:0;padding:0;margin:0 3px 0 0;background-image:url(../images/icons/bullet_yellow.png)}.wordfenceBoldTD{font-weight:bold}.wfAjax24{display:none;width:24px;height:24px;background-image:url(../images/icons/ajax24.gif);margin:0;padding:0}div.wfLoadingWhite32{width:32px;height:32px;background-image:url(../images/icons/ajaxWhite32x32.gif);margin:0;padding:0}.wfTabsContainer{background-color:#FFF;overflow:hidden;border:1px solid #CCC;padding:15px;min-height:200px;-webkit-font-smoothing:antialiased}#wfTabs::after{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}#wfTabs a{float:left;z-index:10;height:18px;margin:0 5px -1px 0;padding:5px 8px;border:1px solid #CCC;text-decoration:none;background-color:#EFEFEF;color:#21759B;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px}#wfTabs a.selected{border-bottom:1px solid #FFF;background-color:#FFF;color:#777}.wordfenceTopTab{display:none;margin-top:15px}.wordfenceTopTab.active{display:block}.wordfenceHelpLink{margin-top:15px}.wfAjaxLight128{background-image:url(../images/icons/ajax3.gif)}.wfStrong{font-weight:bold}.wordfenceModeElem{width:1px;height:1px;opacity:0}.wfWarn{color:#F00}img.wfFlag{vertical-align:middle;margin:-3px 4px 0 0}.wfHitTime{font-style:italic}.wfAvatar img{vertical-align:middle}.wf-hex-sequence{color:#587ECB}.wfLoadMoreButton.disabled,.wfLoadMoreButton[disabled]{pointer-events:none;opacity:0.65}table.wfConfigForm th{font-weight:normal;text-align:left;padding:2px 3px 1px 0;vertical-align:middle}table.wfConfigForm td{vertical-align:middle}table.wfConfigForm td.align-top{vertical-align:top}table th.wfConfigEnable{font-weight:bold;min-width:25%}.wfSavedMsg{display:none;color:#A00}table th.wfSubheading{font-weight:bold;padding-top:10px}h3.wfConfigHeading{font-size:22px;color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic;font-weight:normal}.wfTipText{color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic}.wfBlackCursor{color:#FFF}.wf-spinner{display:inline-block;width:4px}.wferror{color:#F00}#wordfenceWorking{padding:2px 8px 2px 24px;z-index:100000;position:fixed;right:2px;bottom:2px;border:1px solid #000;background-color:#F00;color:#FFF;font-size:12px;font-weight:bold;font-family:Arial;text-align:center;background-image:url("../images/icons/ajaxRed16.gif");background-position:2px 2px;background-repeat:no-repeat}#paidWrap{position:relative}.paidInnerMsg{width:500px;margin:150px auto 0 auto;color:#000;font-size:18px;font-family:Georgia,Times New Roman,Times,serif;line-height:1.8em;text-align:center;-webkit-font-smoothing:antialiased}.wfMarker{height:1px;width:1px}.wfPaidOnlyNotice{width:500px;background-color:#FFFFE0;border:1px solid #000;padding:10px;margin:20px}.wfOnOffSwitch{position:relative !important;width:69px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.wfOnOffSwitch-checkbox{display:none !important}.wfOnOffSwitch-label{display:block !important;overflow:hidden !important;cursor:pointer !important;border:2px solid #999999 !important;border-radius:19px !important}.wfOnOffSwitch-inner{width:200% !important;margin-left:-100% !important;-webkit-transition:margin 0.3s ease-in !important;-o-transition:margin 0.3s ease-in !important;transition:margin 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important}.wfOnOffSwitch-inner:before,.wfOnOffSwitch-inner:after{float:left !important;width:50% !important;height:19px !important;padding:0 !important;line-height:19px !important;font-size:14px !important;color:white !important;font-family:Trebuchet, Arial, sans-serif !important;font-weight:bold !important;-webkit-box-sizing:border-box !important;-moz-box-sizing:border-box !important;box-sizing:border-box !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;-webkit-box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important;box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important}.wfOnOffSwitch-inner:before{content:"ON" !important;padding-left:10px !important;background-color:#30D965 !important;color:#FFFFFF !important;-moz-border-radius:19px 0 0 19px !important;-webkit-border-radius:19px;border-radius:19px 0 0 19px !important}.wfOnOffSwitch-inner:after{content:"OFF" !important;padding-right:10px !important;background-color:#EEEEEE !important;color:#999999 !important;text-align:right !important;-moz-border-radius:0 19px 19px 0 !important;-webkit-border-radius:0;border-radius:0 19px 19px 0 !important}.wfOnOffSwitch-switch{width:19px !important;margin:0 !important;background:#FFFFFF !important;border:2px solid #999999 !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;position:absolute !important;top:0 !important;bottom:0 !important;right:46px !important;-webkit-transition:all 0.3s ease-in !important;-o-transition:all 0.3s ease-in !important;transition:all 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjEiLz48c3RvcCBvZmZzZXQ9IjgwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA=') !important;background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0.1)),color-stop(80%, rgba(0,0,0,0))) !important;background-image:-moz-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:-webkit-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:linear-gradient(to center bottom, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;box-shadow:0 1px 1px white inset !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-inner{margin-left:0 !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-switch{right:0 !important}#wordfenceConfigWarning,#wordfenceAdminEmailWarning{clear:left;margin-top:5px}.wf-striped-table{width:100%;max-width:100%;border-collapse:collapse}.wf-striped-table th,.wf-striped-table td{padding:6px 4px;border:1px solid #ccc}.wf-striped-table thead th,.wf-striped-table thead td,.wf-striped-table tfoot th,.wf-striped-table tfoot td,.wf-striped-table tbody.thead th,.wf-striped-table tbody.thead td{background-color:#222;color:#fff;font-weight:bold;border-color:#474747;text-align:left}.wf-striped-table tbody tr.even td,.wf-striped-table tbody tr:nth-child(2n) td{background-color:#eee}.wf-striped-table tbody tr td,.wf-striped-table tbody tr.odd td{background-color:#fff}.wf-striped-table tbody tr:hover>td{background-color:#fffbd8}.wf-striped-table tbody.empty-row tr td{border-width:0;padding:8px 0;background-color:transparent}.wf-striped-table td.error{color:#d0514c;font-weight:bold}.wf-striped-table td.error:before{content:"\2718"}.wf-striped-table td.success{color:#008c10;font-weight:bold;max-width:20%}.wf-striped-table td.success:before{content:"\2713"}.wf-striped-table td.success:before,.wf-striped-table td.error:before{font-size:16px;display:inline-block;margin:0px 8px 0px 0px}.wf-striped-table td.inactive{font-weight:bold;color:#666666}.wordfence-waiting{line-height:32px}.wordfence-waiting img{vertical-align:middle}pre.wf-pre{margin:8px 0 20px;padding:12px;background:#ffffff;border:1px solid #999999;overflow:auto}.wf-center{text-align:center}#wfConfigForm{max-width:1035px}.wf-hidden{display:none !important}.wf-card{position:relative;margin:0 auto .625rem;padding:1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wf-card .wf-card-inner{min-height:76px;width:100%;padding:8px;box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;position:relative}.wf-card .wf-card-inner .wf-card-content{max-width:75%}.wf-card .wf-card-inner .wf-card-content .wf-card-title{font-size:1.125rem;width:100%}.wf-card .wf-card-inner .wf-card-content .wf-card-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.875rem;color:#4f748e}.wf-card .wf-card-inner .wf-card-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-card .wf-card-inner .wf-card-action .wf-card-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wf-card .wf-card-inner .wf-card-action .wf-card-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-card .wf-card-inner .wf-card-action .wf-card-action-checkbox.checked{background-position:right center}.wf-card .wf-card-extra{display:none;padding:16px;margin-top:1rem;border-top:1px solid #f3f6f8}.wf-card.active .wf-card-extra{display:block}.wf-card.wf-card-left .wf-card-content{margin-left:48px}.wf-card.wf-card-left .wf-card-action{right:auto;left:0px}.wf-card.disabled .wf-card-content .wf-card-title{color:#aaaaaa}.wf-card.disabled .wf-card-content .wf-card-subtitle{color:#8ea6be}.wf-add-top{margin-top:20px !important}.wf-add-top-small{margin-top:10px !important}.wf-add-bottom{margin-bottom:20px !important}.wf-add-bottom-small{margin-bottom:10px !important}.select2-container{min-width:320px}#wf-notices{margin-top:15px}#wf-notices .wf-admin-notice{margin-left:0px;margin-right:0px}.wf-success-text,.wf-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wf-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wf-notice-text{color:#6d798c}.wf-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #74cb76;border-width:1px 1px 1px 10px}.wf-success-text{color:#11967A}.wf-premium-callout{border:1px solid #00709E;background-color:#ffffff;padding:16px;margin:20px 0 0}.wf-premium-callout h3{margin:0 0 8px;color:#11967A}.wf-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wf-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wf-premium-callout .center{text-align:center;margin:0}.wf-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709E}#wfLiveTrafficOverlayAnchor::after{position:absolute;z-index:3002;top:0;right:0;width:0;height:0;background:rgba(241,241,241,0.6);content:'';opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wordfenceLiveActivityPaused #wfLiveTrafficOverlayAnchor::after{width:100%;height:100%;opacity:1;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}#wordfenceLiveActivityDisabled{background:#fff;border-left:4px solid #ffb900;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);margin-bottom:12px;padding:1px 13px;max-width:900px}#wfLiveTrafficDisabledMessage{display:none;position:fixed;z-index:3003;left:0;width:100%;top:50%;transform:translateY(-50%);text-align:center;color:#666666;opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}#wfLiveTrafficDisabledMessage h2{background-color:#FFF;overflow:hidden;border:1px solid #CCC;max-width:350px;margin:0 auto;padding:15px;font-size:2.0em}#wfLiveTrafficDisabledMessage h2 small{font-size:0.5em;font-weight:normal;margin-top:20px}.wordfenceLiveActivityPaused #wfLiveTrafficDisabledMessage{display:block;opacity:1;-webkit-transition:opacity 0.5s;transition:opacity 0.5s}.wf-live-activity{position:relative;margin:20px 0 10px 0;padding:0.75rem;box-sizing:border-box;background:#FFFCEF;box-shadow:0 0 0 1px rgba(153,155,135,0.5),0 1px 2px #e8f3e0}.wf-live-activity .wf-live-activity-inner{width:100%;box-sizing:border-box;position:relative}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:flex-start}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content .wf-live-activity-title{color:#888888;font-size:0.85rem;font-weight:bold;padding-right:0.5rem}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content .wf-live-activity-message{font-size:0.80rem;color:#000000}.wf-live-activity .wf-live-activity-inner .wf-live-activity-state{position:absolute;top:0px;right:0px;bottom:0px;left:0px;background:rgba(255,252,239,0.9);display:none;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:center;z-index:3001;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wordfenceLiveActivityPaused .wf-live-activity .wf-live-activity-inner .wf-live-activity-state{display:-ms-flexbox;display:flex;opacity:1;-webkit-transition:opacity 0.5s;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}.wordfence .wordfenceScanButton{margin:20px 0 20px 0}.wordfence .wordfenceScanButton input.button-wf-grey{background:#EFEFEF url(../images/button-grad-grey.png) repeat-x scroll left top;border-color:#EFEFEF}.wordfence .wordfenceScanButton table td{vertical-align:top}.wordfence .wordfenceScanButton .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709E;height:44px;line-height:44px;padding:0px 20px}table.wfSummaryParent{font-family:sans-serif;font-size:14px;color:#000;z-index:9}table.wfSummaryParent td{vertical-align:top;padding:0;margin:0}table.wfSummaryParent table.wfSummaryChild th{font-weight:bold;text-align:right;font-family:Georgia,Times New Roman,Times,serif;color:#000;padding:5px 10px 5px 0;border-top:1px solid #CCC}table.wfSummaryParent table.wfSummaryChild td{font-weight:normal;text-align:left;padding:5px 0 5px 0;border-top:1px solid #CCC}table.wfSummaryParent table.wfSC1 td{width:300px;padding:0 25px 10px 0}table.wfSummaryParent table.wfSC2 th{width:80px}table.wfSummaryParent table.wfSC2 td{width:100px}table.wfSummaryParent table.wfSC3 th{width:80px}table.wfSummaryParent table.wfSC3 td{width:250px}table.wfSummaryParent th.wfHead{font-size:22px;font-family:Georgia,Times New Roman,Times,serif;font-style:italic;color:#555;font-weight:bold;text-align:left;padding:20px 0 20px 0;-webkit-font-smoothing:antialiased}div.wfIssue table.wfIssue td{padding:2px;margin:0;border-width:0;text-align:left}div.wfIssue table.wfIssue th{padding:2px;margin:0;font-weight:bold;text-align:left;color:#777}div.wfIssue table.wfIssueLinks td{border-width:0;text-align:left;padding-right:10px}div.wfIssue h2{margin:0 0 5px 0;padding:0}.wfIssueOptions{border-top:1px solid #CCC;padding:10px}.wfIssueOptions a{margin-left:10px}.wfIssueOptions strong{float:left;display:block;width:60px}.wfIssueOptions p{margin:6px 0px 0px}.wfProbSev1,.wfProbSev2,.wfAjaxLight128,.wfResolved{width:128px;height:128px;border:0;margin:0 auto;background-repeat:no-repeat;background-position:0 0;text-decoration:none;display:block}.wfProbSev1{background-image:url(../images/icons/error128.png)}.wfProbSev2{background-image:url(../images/icons/warning128.png)}.wfResolved{background-image:url(../images/icons/tick128.png)}.wfIssuesContainer{width:100%;display:none}.wfIssuesContainer p{width:550px}.wfALogTime{color:#999}.wfALogMailLink,.wfALogViewLink{display:block;position:absolute;padding:0 0 0 18px;margin:0;right:10px;top:0;background-repeat:no-repeat;font-weight:normal}.wfALogMailLink{background-image:url(../images/icons/email_go.png)}.wfALogViewLink{background-image:url(../images/icons/magnifier.png)}#wfActivity{position:relative}.consoleHead{position:relative;padding:0 0 0 3px;font-weight:bold;width:100%}.consoleHeadText{margin-bottom:4px;font-size:18px;font-family:Georgia,Times New Roman,Times,serif;color:#555;font-weight:bold;-webkit-font-smoothing:antialiased}.consoleFooter{position:relative}.consoleOuter{width:100%}.consoleInner{height:116px;overflow:auto;z-index:1}.bevelDiv1{border:1px solid #EFEFEF}.bevelDiv2{border:1px solid #AAA}.bevelDiv3{background-color:#ffffed;padding:5px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased}.wfSecure{color:#0A0;font-weight:bold}.wfSummaryDate{float:left;margin-left:3px}.wfSummaryMsg{float:left;margin-left:3px}.wfSummaryResult{float:right;text-align:left;width:280px}.wfSummaryLoading{width:16px;height:11px;background-image:url("../images/icons/ajaxScan.gif")}.wfSummaryBad,.wfSummaryErr{color:#A00}.wfSummaryOK{color:#0A0}.wfClear{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}.wfSummaryFinal{-webkit-font-smoothing:antialiased;font-weight:bold;color:#555}.wfStartScanButton{text-align:center}.wordfenceScanHelp{border:1px solid #CCC;padding:4px}.scan-schedule{border-collapse:collapse;border-spacing:0}.scan-schedule td{padding:0}.scan-schedule th{padding:0 8px 0 0}.next-scan{font-size:1em;display:block;position:relative;width:7em;height:7em;background-color:#fff;border-radius:0.6em;box-shadow:0 1px 0 rgba(189,189,189,0.6);overflow:hidden}.next-scan *{display:block;width:100%;font-size:1em;font-weight:bold;font-style:normal;text-align:center}.next-scan strong{position:absolute;top:0;padding:0.4em 0;color:#fff;background-color:#00709E;box-shadow:0 2px 0 #00709E}.next-scan em{position:absolute;bottom:0.3em;color:#00709E}.next-scan span{width:100%;font-size:2.8em;padding-top:1.15em;color:#2f2f2f}.schedule-times{margin-bottom:0;padding-left:0;list-style:none;clear:both}.schedule-times>li{float:left;position:relative;display:block;margin:0px 0px 2px 0px}.schedule-times>li.disabled>a{color:#777}.schedule-times>li.disabled>a:hover,.schedule-times>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.schedule-times>li>a{text-decoration:none;border:1px solid #e2e2e2;border-radius:4px;position:relative;display:block;padding:8px 12px}.schedule-times>li>a:hover,.schedule-times>li>a:focus{text-decoration:none;background-color:#e2e2e2}.schedule-times>li+li{margin-left:2px}.schedule-times>li.active>a,.schedule-times>li.active>a:hover,.schedule-times>li.active>a:focus{color:#fff;background-color:#00709e;border-color:#00709e}.schedule-times>li.text-only{position:relative;display:block;padding:8px 12px}.schedule-times>li>a>img{max-width:none}#wf-lt-listings .wfActEvent{padding-left:15px;border-left:5px solid #cccccc}#wf-lt-listings .wfActEvent.wfHuman{border-left:5px solid #74cb76}#wf-lt-listings .wfActEvent.wfActionBlocked{border-left:5px solid #d03935}#wf-lt-listings .wfActEvent.wfNotice,#wf-lt-listings .wfActEvent.wf404{border-left:5px solid #ffeaa0}#wf-lt-listings .wfActEvent.wfWarning{border-left:5px solid #ffa13f}#wf-lt-listings .wfActEvent:hover{background-color:#fff9e9 !important}#wf-live-traffic{position:relative;overflow:visible}#wf-live-traffic-legend{white-space:nowrap;background-color:#fff;border:1px solid #cccccc;padding:12px}#wf-live-traffic-legend.sticky{position:fixed;top:42px;right:auto;left:182px;z-index:2000}#wf-live-traffic-legend-placeholder{display:none;padding:12px}#wf-live-traffic-legend-placeholder.sticky{display:block}#wf-live-traffic-legend ul{margin:0;padding:0}#wf-live-traffic-legend ul:before,#wf-live-traffic-legend ul:after{content:" ";display:table}#wf-live-traffic-legend ul:after{clear:both}#wf-live-traffic-legend ul li{margin:0;padding:0;position:relative;float:left}#wf-live-traffic-legend ul li+li{margin-left:8px}#wf-live-traffic-legend ul li:before{content:'';display:block;float:left;margin:3px 6px 0 0;width:12px;height:12px;background-color:#CCCCCC}#wf-live-traffic-legend ul li.wfHuman:before{background-color:#74cb76}#wf-live-traffic-legend ul li.wfNotice:before{background-color:#ffeaa0}#wf-live-traffic-legend ul li.wfBlocked:before{background-color:#d03935}.wfTimeAgo{font-family:Georgia,Times New Roman,Times,serif;color:#999;font-weight:bold;font-style:italic}.wfActEvent{border-bottom:1px solid #CCC;padding:10px 20px;overflow:auto}.wf-pad-small{margin:8px 0}#wf-lt-listings{margin:0 0 0}#wf-lt-listings a{cursor:pointer;text-decoration:underline}#wf-lt-listings a.button{text-decoration:none}.wfActionBlocked{background-color:#fff6f6}[class*="span"]{float:left;min-height:1px;margin-left:30px}.highlighted{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-moz-keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@-webkit-keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@-moz-keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}@-webkit-keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}@keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}.highlighted{-webkit-animation-name:highlighted;animation-name:highlighted}.highlighted.wfActionBlocked{-webkit-animation-name:highlightedBlocked;animation-name:highlightedBlocked}#wf-lt-preset-filters{min-width:250px}#wf-lt-advanced-filters>table{width:100%}#wf-lt-advanced-filters>table>tr>td{vertical-align:top}.wf-lt-url{white-space:nowrap}table.block-ranges-table{border-collapse:collapse;margin:10px 0 0}table.block-ranges-table tr td{border:1px solid #CCC;border-width:1px 0;padding:10px 0 12px 0}#input-wafStatus,#input-wafStatus option,.select2-container--default{font-size:18px}.wafStatus-enabled,.wafStatus-learning-mode,.wafStatus-disabled,.wafStatus-enabled.select2-container--default .select2-selection--single .select2-selection__rendered,.wafStatus-learning-mode.select2-container--default .select2-selection--single .select2-selection__rendered,.wafStatus-disabled.select2-container--default .select2-selection--single .select2-selection__rendered{color:#ffffff}#waf-config-form .waf-config-label{font-size:1.3em}#waf-config-form .select2-container--default .select2-selection--single{padding:4px;text-shadow:0 0 3px #000000;font-weight:bold;border-radius:3px}#waf-config-form .select2-container .select2-selection--single{height:auto}.wafStatus-enabled.select2-container--default .select2-selection--single{background-color:#61e157;border-color:#43ad3f}.wafStatus-learning-mode.select2-container--default .select2-selection--single{background-color:#ffe674;border-color:#e5ae35}.wafStatus-disabled.select2-container--default .select2-selection--single,.wafStatus-disabled.select2-container--default.select2-container--disabled .select2-selection--single,.wafStatus-learning-mode.select2-container--default.select2-container--disabled .select2-selection--single,.wafStatus-enabled.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#ff6d69;border-color:#dd422c}#waf-config-form .select2-container--default .select2-selection--single .select2-selection__arrow{height:100%;top:0}.wafStatus-enabled.select2-container--default .select2-selection--single .select2-selection__arrow b,.wafStatus-learning-mode.select2-container--default .select2-selection--single .select2-selection__arrow b,.wafStatus-disabled.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#ffffff transparent transparent}.wafStatus-enabled.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b,.wafStatus-learning-mode.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b,.wafStatus-disabled.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #ffffff}.wafStatus-description{display:none;max-width:500px;font-style:italic;font-size:14px;line-height:1.3}table.whitelist-table .whitelist-edit{display:none}table.whitelist-table .edit-mode .whitelist-display{display:none}table.whitelist-table .edit-mode .whitelist-edit{display:block}table.whitelist-table .edit-mode span.whitelist-edit,table.whitelist-table .edit-mode input.whitelist-edit{display:inline}.wf-bulk-action{margin:12px 0}tr.wf-table-filters input{max-width:120px}#wordfenceRightRail img{max-width:100%}#wordfenceRightRail ul{list-style-type:none;margin:0;margin-top:15px}#wordfenceRightRail .center{text-align:center}#wordfenceRightRail .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709E}.wordfenceRightRail img{width:100%}.wordfenceRightRailLiveTraffic,.wordfenceRightRailOptions,.wordfenceRightRailDiagnostics{margin-left:1055px}.wordfenceRightRailBlockedIPs,.wordfenceRightRailWAF,.wordfenceRightRailCountryBlocking,.wordfenceRightRailScanSchedule{margin-left:950px}.wordfenceRightRail ul{list-style-type:none;margin:0}.wordfenceRightRail .center{text-align:center}.wordfenceRightRail .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709E}.wordfenceWrap.wordfence-community{min-height:760px}#wfTwoFactorQRCodeTable{width:256px;height:256px;margin:0 auto}#wfTwoFactorRecoveryCodes{list-style-type:none}#wfTwoFactorRecoveryCodes li{font-family:monospace;text-align:center}#wfTwoFactorDownload .dashicons{line-height:26px}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857;color:#555}.wf-form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wf-form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.wf-form-control::-moz-placeholder{color:#999;opacity:1}.wf-form-control:-ms-input-placeholder{color:#999}.wf-form-control::-webkit-input-placeholder{color:#999}.wf-form-control::-ms-expand{border:0;background-color:transparent}.wf-form-control[disabled],.wf-form-control[readonly],fieldset[disabled] .wf-form-control{background-color:#e2e2e2;opacity:1}.wf-form-control[disabled],fieldset[disabled] .wf-form-control{cursor:not-allowed}textarea.wf-form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"].wf-form-control,input[type="time"].wf-form-control,input[type="datetime-local"].wf-form-control,input[type="month"].wf-form-control{line-height:34px}input[type="date"].wf-input-sm,.wf-input-group-sm input[type="date"],input[type="time"].wf-input-sm,.wf-input-group-sm input[type="time"],input[type="datetime-local"].wf-input-sm,.wf-input-group-sm input[type="datetime-local"],input[type="month"].wf-input-sm,.wf-input-group-sm input[type="month"]{line-height:30px}input[type="date"].wf-input-lg,.wf-input-group-lg input[type="date"],input[type="time"].wf-input-lg,.wf-input-group-lg input[type="time"],input[type="datetime-local"].wf-input-lg,.wf-input-group-lg input[type="datetime-local"],input[type="month"].wf-input-lg,.wf-input-group-lg input[type="month"]{line-height:46px}}.wf-form-group{margin-bottom:8px}.wf-form-group.wf-sub-group label{color:#666666;font-weight:normal;padding-left:20px}.wf-form-group.wf-focus{border-left:4px solid #11967a;padding-bottom:8px;background-color:#e5e5e5}.wf-form-group.wf-focus label{margin-left:-4px}.wf-radio,.wf-checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.wf-radio label,.wf-checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.wf-radio input[type="radio"],.wf-radio-inline input[type="radio"],.wf-checkbox input[type="checkbox"],.wf-checkbox-inline input[type="checkbox"]{margin-top:4px \9}.wf-radio+.wf-radio,.wf-checkbox+.wf-checkbox{margin-top:-5px}.wf-radio-inline,.wf-checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.wf-radio-inline+.wf-radio-inline,.wf-checkbox-inline+.wf-checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"].wf-disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"].wf-disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.wf-radio-inline.wf-disabled,fieldset[disabled] .wf-radio-inline,.wf-checkbox-inline.wf-disabled,fieldset[disabled] .wf-checkbox-inline{cursor:not-allowed}.wf-radio.wf-disabled label,fieldset[disabled] .wf-radio label,.wf-checkbox.wf-disabled label,fieldset[disabled] .wf-checkbox label{cursor:not-allowed}.wf-form-control-static{padding-top:7px;padding-bottom:7px;margin:0;line-height:1}.wf-form-control-static.wf-input-lg,.wf-form-control-static.wf-input-sm{padding-left:0;padding-right:0}.wf-input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.wf-input-sm{height:30px;line-height:30px}textarea.wf-input-sm,select[multiple].wf-input-sm{height:auto}.wf-form-group-sm .wf-form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wf-form-group-sm select.wf-form-control{height:30px;line-height:30px}.wf-form-group-sm textarea.wf-form-control,.wf-form-group-sm select[multiple].wf-form-control{height:auto}.wf-form-group-sm .wf-form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.wf-input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}select.wf-input-lg{height:46px;line-height:46px}textarea.wf-input-lg,select[multiple].wf-input-lg{height:auto}.wf-form-group-lg .wf-form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wf-form-group-lg select.wf-form-control{height:46px;line-height:46px}.wf-form-group-lg textarea.wf-form-control,.wf-form-group-lg select[multiple].wf-form-control{height:auto}.wf-form-group-lg .wf-form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.33333}.wf-has-feedback{position:relative}.wf-has-feedback .wf-form-control{padding-right:42.5px}.wf-form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.wf-input-lg+.wf-form-control-feedback,.wf-input-group-lg+.wf-form-control-feedback,.wf-form-group-lg .wf-form-control+.wf-form-control-feedback{width:46px;height:46px;line-height:46px}.wf-input-sm+.wf-form-control-feedback,.wf-input-group-sm+.wf-form-control-feedback,.wf-form-group-sm .wf-form-control+.wf-form-control-feedback{width:30px;height:30px;line-height:30px}.wf-has-success .wf-help-block,.wf-has-success .wf-control-label,.wf-has-success .wf-radio,.wf-has-success .wf-checkbox,.wf-has-success .wf-radio-inline,.wf-has-success .wf-checkbox-inline,.wf-has-success.wf-radio label,.wf-has-success.wf-checkbox label,.wf-has-success.wf-radio-inline label,.wf-has-success.wf-checkbox-inline label{color:#3c763d}.wf-has-success .wf-form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-success .wf-form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.wf-has-success .wf-input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.wf-has-success .wf-form-control-feedback{color:#3c763d}.wf-has-warning .wf-help-block,.wf-has-warning .wf-control-label,.wf-has-warning .wf-radio,.wf-has-warning .wf-checkbox,.wf-has-warning .wf-radio-inline,.wf-has-warning .wf-checkbox-inline,.wf-has-warning.wf-radio label,.wf-has-warning.wf-checkbox label,.wf-has-warning.wf-radio-inline label,.wf-has-warning.wf-checkbox-inline label{color:#8a6d3b}.wf-has-warning .wf-form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-warning .wf-form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.wf-has-warning .wf-input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.wf-has-warning .wf-form-control-feedback{color:#8a6d3b}.wf-has-error .wf-help-block,.wf-has-error .wf-control-label,.wf-has-error .wf-radio,.wf-has-error .wf-checkbox,.wf-has-error .wf-radio-inline,.wf-has-error .wf-checkbox-inline,.wf-has-error.wf-radio label,.wf-has-error.wf-checkbox label,.wf-has-error.wf-radio-inline label,.wf-has-error.wf-checkbox-inline label{color:#a94442}.wf-has-error .wf-form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-error .wf-form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.wf-has-error .wf-input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.wf-has-error .wf-form-control-feedback{color:#a94442}.wf-has-feedback label ~ .wf-form-control-feedback{top:25px}.wf-has-feedback label.wf-sr-only ~ .wf-form-control-feedback{top:0}.wf-help-block{display:block;margin-top:5px;color:#737373}@media (min-width: 768px){.wf-form-inline .wf-form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-form-control{display:inline-block;width:auto;vertical-align:middle}.wf-form-inline .wf-form-control-static{display:inline-block}.wf-form-inline .wf-input-group{display:inline-table;vertical-align:middle}.wf-form-inline .wf-input-group .wf-input-group-addon,.wf-form-inline .wf-input-group .wf-input-group-btn,.wf-form-inline .wf-input-group .wf-form-control{width:auto}.wf-form-inline .wf-input-group>.wf-form-control{width:100%}.wf-form-inline .wf-control-label{margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-radio,.wf-form-inline .wf-checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-radio label,.wf-form-inline .wf-checkbox label{padding-left:0}.wf-form-inline .wf-radio input[type="radio"],.wf-form-inline .wf-checkbox input[type="checkbox"]{position:relative;margin-left:0}.wf-form-inline .wf-has-feedback .wf-form-control-feedback{top:0}}.wf-form-horizontal .wf-radio,.wf-form-horizontal .wf-checkbox,.wf-form-horizontal .wf-radio-inline,.wf-form-horizontal .wf-checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.wf-form-horizontal .wf-radio,.wf-form-horizontal .wf-checkbox{min-height:27px}.wf-form-horizontal .wf-form-group{margin-left:-15px;margin-right:-15px}.wf-form-horizontal .wf-form-group:before,.wf-form-horizontal .wf-form-group:after{content:" ";display:table}.wf-form-horizontal .wf-form-group:after{clear:both}@media (min-width: 768px){.wf-form-horizontal .wf-control-label{text-align:right;margin-bottom:0;padding-top:7px}}.wf-form-horizontal .wf-has-feedback .wf-form-control-feedback{right:15px}@media (min-width: 768px){.wf-form-horizontal .wf-form-group-lg .wf-control-label{padding-top:11px;font-size:18px}}@media (min-width: 768px){.wf-form-horizontal .wf-form-group-sm .wf-control-label{padding-top:6px;font-size:12px}}.wf-dashboard-item{position:relative;margin:0 auto 1rem;padding:0 1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wf-dashboard-item .wf-dashboard-item-inner{min-height:44px;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content{max-width:75%}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content .wf-dashboard-item-title{font-size:0.75rem;width:100%}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content .wf-dashboard-item-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text{width:auto}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-success{color:#11967a}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-warning{color:#930000}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-warning a{color:#930000}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-checkbox.checked{background-position:right center}.wf-dashboard-item .wf-dashboard-item-extra{display:none;margin:0 -1rem;padding:0 1rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list{margin:0 -1rem;padding:0;list-style:none}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li{display:block;min-height:44px;padding:0 1rem;margin:0;border-top:1px solid #eeeeee;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li>*:first-child{-webkit-flex-grow:1;flex-grow:1}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li>.wf-dashboard-item-list>li{border-top:0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0;border-left:1px solid #eeeeee}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>*:first-child{border-left:0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-enabled .fa{color:#11967a}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-disabled .fa{color:#525355}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-premium{color:#9f9fa0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-dismiss{padding-left:2rem;font-size:1.25rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-dismiss a{color:#525355}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count-count{font-size:3rem;line-height:3rem;color:#9f9fa0;padding:1rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count-label{font-size:0.75rem;color:#9f9fa0;padding:0 1rem 1rem 1rem}.wf-dashboard-item.active .wf-dashboard-item-extra{display:block}.wf-dashboard-item.wf-dashboard-item-left .wf-dashboard-item-content{margin-left:48px}.wf-dashboard-item.wf-dashboard-item-left .wf-dashboard-item-action{right:auto;left:0px}.wf-dashboard-item.disabled .wf-dashboard-item-content .wf-dashboard-item-title{color:#aaaaaa}.wf-dashboard-item.disabled .wf-dashboard-item-content .wf-dashboard-item-subtitle{color:#8ea6be}.wf-notifications-empty{font-size:0.9rem;color:#9f9fa0}.wf-dashboard-graph-wrapper{width:100%}.wf-dashboard-badge{display:inline-block;min-width:10px;padding:3px 7px;margin-left:0.5rem;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#fcb214;border-radius:10px}.wf-dashboard-badge:empty{display:none}.wf-btn .wf-dashboard-badge{position:relative;top:-1px}.wf-btn-xs .wf-dashboard-badge,.wf-btn-group-xs>.wf-btn .wf-dashboard-badge,.wf-btn-group-xs>.wf-btn .wf-dashboard-badge{top:0;padding:1px 5px}.wf-list-group-item.active>.wf-dashboard-badge,.wf-nav-pills>.active>a>.wf-dashboard-badge{color:#00709e;background-color:#fff}.wf-list-group-item>.wf-dashboard-badge{float:right}.wf-list-group-item>.wf-dashboard-badge+.wf-dashboard-badge{margin-right:5px}.wf-nav-pills>li>a>.wf-dashboard-badge{margin-left:3px}.wf-dashboard-toggle-btns{text-align:center}.wf-dashboard-toggle-btns .wf-pagination{margin:1rem 1rem 0.5rem 1rem}table.wf-table{background-color:transparent;border-collapse:collapse;border-spacing:0}table.wf-table td,table.wf-table th{padding:0}.wf-table caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}.wf-table th{text-align:left}.wf-table{width:100%;max-width:100%;margin-bottom:20px}.wf-table>thead>tr>th,.wf-table>thead>tr>td,.wf-table>tbody>tr>th,.wf-table>tbody>tr>td,.wf-table>tfoot>tr>th,.wf-table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.wf-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.wf-table>caption+thead>tr:first-child>th,.wf-table>caption+thead>tr:first-child>td,.wf-table>colgroup+thead>tr:first-child>th,.wf-table>colgroup+thead>tr:first-child>td,.wf-table>thead:first-child>tr:first-child>th,.wf-table>thead:first-child>tr:first-child>td{border-top:0}.wf-table>tbody+tbody{border-top:2px solid #ddd}.wf-table .wf-table{background-color:#fff}.wf-table-condensed>thead>tr>th,.wf-table-condensed>thead>tr>td,.wf-table-condensed>tbody>tr>th,.wf-table-condensed>tbody>tr>td,.wf-table-condensed>tfoot>tr>th,.wf-table-condensed>tfoot>tr>td{padding:5px}.wf-table-bordered{border:1px solid #ddd}.wf-table-bordered>thead>tr>th,.wf-table-bordered>thead>tr>td,.wf-table-bordered>tbody>tr>th,.wf-table-bordered>tbody>tr>td,.wf-table-bordered>tfoot>tr>th,.wf-table-bordered>tfoot>tr>td{border:1px solid #ddd}.wf-table-bordered>thead>tr>th,.wf-table-bordered>thead>tr>td{border-bottom-width:2px}.wf-table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.wf-table-hover>tbody>tr:hover{background-color:#f5f5f5}table.wf-table col[class*="col-"]{position:static;float:none;display:table-column}table.wf-table td[class*="col-"],table.wf-table th[class*="col-"]{position:static;float:none;display:table-cell}.wf-table>thead>tr>td.active,.wf-table>thead>tr>th.active,.wf-table>thead>tr.active>td,.wf-table>thead>tr.active>th,.wf-table>tbody>tr>td.active,.wf-table>tbody>tr>th.active,.wf-table>tbody>tr.active>td,.wf-table>tbody>tr.active>th,.wf-table>tfoot>tr>td.active,.wf-table>tfoot>tr>th.active,.wf-table>tfoot>tr.active>td,.wf-table>tfoot>tr.active>th{background-color:#f5f5f5}.wf-table-hover>tbody>tr>td.active:hover,.wf-table-hover>tbody>tr>th.active:hover,.wf-table-hover>tbody>tr.active:hover>td,.wf-table-hover>tbody>tr:hover>.active,.wf-table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.wf-table>thead>tr>td.success,.wf-table>thead>tr>th.success,.wf-table>thead>tr.success>td,.wf-table>thead>tr.success>th,.wf-table>tbody>tr>td.success,.wf-table>tbody>tr>th.success,.wf-table>tbody>tr.success>td,.wf-table>tbody>tr.success>th,.wf-table>tfoot>tr>td.success,.wf-table>tfoot>tr>th.success,.wf-table>tfoot>tr.success>td,.wf-table>tfoot>tr.success>th{background-color:#dff0d8}.wf-table-hover>tbody>tr>td.success:hover,.wf-table-hover>tbody>tr>th.success:hover,.wf-table-hover>tbody>tr.success:hover>td,.wf-table-hover>tbody>tr:hover>.success,.wf-table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.wf-table>thead>tr>td.info,.wf-table>thead>tr>th.info,.wf-table>thead>tr.info>td,.wf-table>thead>tr.info>th,.wf-table>tbody>tr>td.info,.wf-table>tbody>tr>th.info,.wf-table>tbody>tr.info>td,.wf-table>tbody>tr.info>th,.wf-table>tfoot>tr>td.info,.wf-table>tfoot>tr>th.info,.wf-table>tfoot>tr.info>td,.wf-table>tfoot>tr.info>th{background-color:#d9edf7}.wf-table-hover>tbody>tr>td.info:hover,.wf-table-hover>tbody>tr>th.info:hover,.wf-table-hover>tbody>tr.info:hover>td,.wf-table-hover>tbody>tr:hover>.info,.wf-table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.wf-table>thead>tr>td.warning,.wf-table>thead>tr>th.warning,.wf-table>thead>tr.warning>td,.wf-table>thead>tr.warning>th,.wf-table>tbody>tr>td.warning,.wf-table>tbody>tr>th.warning,.wf-table>tbody>tr.warning>td,.wf-table>tbody>tr.warning>th,.wf-table>tfoot>tr>td.warning,.wf-table>tfoot>tr>th.warning,.wf-table>tfoot>tr.warning>td,.wf-table>tfoot>tr.warning>th{background-color:#fcf8e3}.wf-table-hover>tbody>tr>td.warning:hover,.wf-table-hover>tbody>tr>th.warning:hover,.wf-table-hover>tbody>tr.warning:hover>td,.wf-table-hover>tbody>tr:hover>.warning,.wf-table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.wf-table>thead>tr>td.danger,.wf-table>thead>tr>th.danger,.wf-table>thead>tr.danger>td,.wf-table>thead>tr.danger>th,.wf-table>tbody>tr>td.danger,.wf-table>tbody>tr>th.danger,.wf-table>tbody>tr.danger>td,.wf-table>tbody>tr.danger>th,.wf-table>tfoot>tr>td.danger,.wf-table>tfoot>tr>th.danger,.wf-table>tfoot>tr.danger>td,.wf-table>tfoot>tr.danger>th{background-color:#f2dede}.wf-table-hover>tbody>tr>td.danger:hover,.wf-table-hover>tbody>tr>th.danger:hover,.wf-table-hover>tbody>tr.danger:hover>td,.wf-table-hover>tbody>tr:hover>.danger,.wf-table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.wf-table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.wf-table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.wf-table-responsive>.wf-table{margin-bottom:0}.wf-table-responsive>.wf-table>thead>tr>th,.wf-table-responsive>.wf-table>thead>tr>td,.wf-table-responsive>.wf-table>tbody>tr>th,.wf-table-responsive>.wf-table>tbody>tr>td,.wf-table-responsive>.wf-table>tfoot>tr>th,.wf-table-responsive>.wf-table>tfoot>tr>td{white-space:nowrap}.wf-table-responsive>.wf-table-bordered{border:0}.wf-table-responsive>.wf-table-bordered>thead>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>thead>tr>td:first-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>td:first-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>td:first-child{border-left:0}.wf-table-responsive>.wf-table-bordered>thead>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>thead>tr>td:last-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>td:last-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>td:last-child{border-right:0}.wf-table-responsive>.wf-table-bordered>tbody>tr:last-child>th,.wf-table-responsive>.wf-table-bordered>tbody>tr:last-child>td,.wf-table-responsive>.wf-table-bordered>tfoot>tr:last-child>th,.wf-table-responsive>.wf-table-bordered>tfoot>tr:last-child>td{border-bottom:0}}
1
+ .wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}@-ms-viewport{width:device-width}.wf-visible-xs{display:none !important}.wf-visible-sm{display:none !important}.wf-visible-md{display:none !important}.wf-visible-lg{display:none !important}.wf-visible-xs-block,.wf-visible-xs-inline,.wf-visible-xs-inline-block,.wf-visible-sm-block,.wf-visible-sm-inline,.wf-visible-sm-inline-block,.wf-visible-md-block,.wf-visible-md-inline,.wf-visible-md-inline-block,.wf-visible-lg-block,.wf-visible-lg-inline,.wf-visible-lg-inline-block{display:none !important}@media (max-width: 767px){.wf-visible-xs{display:block !important}table.wf-visible-xs{display:table !important}tr.wf-visible-xs{display:table-row !important}th.wf-visible-xs,td.wf-visible-xs{display:table-cell !important}}@media (max-width: 767px){.wf-visible-xs-block{display:block !important}}@media (max-width: 767px){.wf-visible-xs-inline{display:inline !important}}@media (max-width: 767px){.wf-visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm{display:block !important}table.wf-visible-sm{display:table !important}tr.wf-visible-sm{display:table-row !important}th.wf-visible-sm,td.wf-visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md{display:block !important}table.wf-visible-md{display:table !important}tr.wf-visible-md{display:table-row !important}th.wf-visible-md,td.wf-visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.wf-visible-lg{display:block !important}table.wf-visible-lg{display:table !important}tr.wf-visible-lg{display:table-row !important}th.wf-visible-lg,td.wf-visible-lg{display:table-cell !important}}@media (min-width: 1200px){.wf-visible-lg-block{display:block !important}}@media (min-width: 1200px){.wf-visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.wf-visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.wf-hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.wf-hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-hidden-md{display:none !important}}@media (min-width: 1200px){.wf-hidden-lg{display:none !important}}.wf-visible-print{display:none !important}@media print{.wf-visible-print{display:block !important}table.wf-visible-print{display:table !important}tr.wf-visible-print{display:table-row !important}th.wf-visible-print,td.wf-visible-print{display:table-cell !important}}.wf-visible-print-block{display:none !important}@media print{.wf-visible-print-block{display:block !important}}.wf-visible-print-inline{display:none !important}@media print{.wf-visible-print-inline{display:inline !important}}.wf-visible-print-inline-block{display:none !important}@media print{.wf-visible-print-inline-block{display:inline-block !important}}@media print{.wf-hidden-print{display:none !important}}.wf-container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wf-container:before,.wf-container:after{content:" ";display:table}.wf-container:after{clear:both}@media (min-width: 768px){.wf-container{width:750px}}@media (min-width: 992px){.wf-container{width:970px}}@media (min-width: 1200px){.wf-container{width:1170px}}.wf-container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wf-container-fluid:before,.wf-container-fluid:after{content:" ";display:table}.wf-container-fluid:after{clear:both}.wf-row{margin-left:-15px;margin-right:-15px}.wf-row:before,.wf-row:after{content:" ";display:table}.wf-row:after{clear:both}.wf-col-xs-1,.wf-col-sm-1,.wf-col-md-1,.wf-col-lg-1,.wf-col-xs-2,.wf-col-sm-2,.wf-col-md-2,.wf-col-lg-2,.wf-col-xs-3,.wf-col-sm-3,.wf-col-md-3,.wf-col-lg-3,.wf-col-xs-4,.wf-col-sm-4,.wf-col-md-4,.wf-col-lg-4,.wf-col-xs-5,.wf-col-sm-5,.wf-col-md-5,.wf-col-lg-5,.wf-col-xs-6,.wf-col-sm-6,.wf-col-md-6,.wf-col-lg-6,.wf-col-xs-7,.wf-col-sm-7,.wf-col-md-7,.wf-col-lg-7,.wf-col-xs-8,.wf-col-sm-8,.wf-col-md-8,.wf-col-lg-8,.wf-col-xs-9,.wf-col-sm-9,.wf-col-md-9,.wf-col-lg-9,.wf-col-xs-10,.wf-col-sm-10,.wf-col-md-10,.wf-col-lg-10,.wf-col-xs-11,.wf-col-sm-11,.wf-col-md-11,.wf-col-lg-11,.wf-col-xs-12,.wf-col-sm-12,.wf-col-md-12,.wf-col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px;box-sizing:border-box}.wf-col-xs-1,.wf-col-xs-2,.wf-col-xs-3,.wf-col-xs-4,.wf-col-xs-5,.wf-col-xs-6,.wf-col-xs-7,.wf-col-xs-8,.wf-col-xs-9,.wf-col-xs-10,.wf-col-xs-11,.wf-col-xs-12{float:left}.wf-col-xs-1{width:8.33333%}.wf-col-xs-2{width:16.66667%}.wf-col-xs-3{width:25%}.wf-col-xs-4{width:33.33333%}.wf-col-xs-5{width:41.66667%}.wf-col-xs-6{width:50%}.wf-col-xs-7{width:58.33333%}.wf-col-xs-8{width:66.66667%}.wf-col-xs-9{width:75%}.wf-col-xs-10{width:83.33333%}.wf-col-xs-11{width:91.66667%}.wf-col-xs-12{width:100%}.wf-col-xs-pull-0{right:auto}.wf-col-xs-pull-1{right:8.33333%}.wf-col-xs-pull-2{right:16.66667%}.wf-col-xs-pull-3{right:25%}.wf-col-xs-pull-4{right:33.33333%}.wf-col-xs-pull-5{right:41.66667%}.wf-col-xs-pull-6{right:50%}.wf-col-xs-pull-7{right:58.33333%}.wf-col-xs-pull-8{right:66.66667%}.wf-col-xs-pull-9{right:75%}.wf-col-xs-pull-10{right:83.33333%}.wf-col-xs-pull-11{right:91.66667%}.wf-col-xs-pull-12{right:100%}.wf-col-xs-push-0{left:auto}.wf-col-xs-push-1{left:8.33333%}.wf-col-xs-push-2{left:16.66667%}.wf-col-xs-push-3{left:25%}.wf-col-xs-push-4{left:33.33333%}.wf-col-xs-push-5{left:41.66667%}.wf-col-xs-push-6{left:50%}.wf-col-xs-push-7{left:58.33333%}.wf-col-xs-push-8{left:66.66667%}.wf-col-xs-push-9{left:75%}.wf-col-xs-push-10{left:83.33333%}.wf-col-xs-push-11{left:91.66667%}.wf-col-xs-push-12{left:100%}.wf-col-xs-offset-0{margin-left:0%}.wf-col-xs-offset-1{margin-left:8.33333%}.wf-col-xs-offset-2{margin-left:16.66667%}.wf-col-xs-offset-3{margin-left:25%}.wf-col-xs-offset-4{margin-left:33.33333%}.wf-col-xs-offset-5{margin-left:41.66667%}.wf-col-xs-offset-6{margin-left:50%}.wf-col-xs-offset-7{margin-left:58.33333%}.wf-col-xs-offset-8{margin-left:66.66667%}.wf-col-xs-offset-9{margin-left:75%}.wf-col-xs-offset-10{margin-left:83.33333%}.wf-col-xs-offset-11{margin-left:91.66667%}.wf-col-xs-offset-12{margin-left:100%}.wf-col-xs-half-padding-left{padding-left:8px}.wf-col-xs-half-padding-right{padding-right:7px}@media (min-width: 768px){.wf-col-sm-1,.wf-col-sm-2,.wf-col-sm-3,.wf-col-sm-4,.wf-col-sm-5,.wf-col-sm-6,.wf-col-sm-7,.wf-col-sm-8,.wf-col-sm-9,.wf-col-sm-10,.wf-col-sm-11,.wf-col-sm-12{float:left}.wf-col-sm-1{width:8.33333%}.wf-col-sm-2{width:16.66667%}.wf-col-sm-3{width:25%}.wf-col-sm-4{width:33.33333%}.wf-col-sm-5{width:41.66667%}.wf-col-sm-6{width:50%}.wf-col-sm-7{width:58.33333%}.wf-col-sm-8{width:66.66667%}.wf-col-sm-9{width:75%}.wf-col-sm-10{width:83.33333%}.wf-col-sm-11{width:91.66667%}.wf-col-sm-12{width:100%}.wf-col-sm-pull-0{right:auto}.wf-col-sm-pull-1{right:8.33333%}.wf-col-sm-pull-2{right:16.66667%}.wf-col-sm-pull-3{right:25%}.wf-col-sm-pull-4{right:33.33333%}.wf-col-sm-pull-5{right:41.66667%}.wf-col-sm-pull-6{right:50%}.wf-col-sm-pull-7{right:58.33333%}.wf-col-sm-pull-8{right:66.66667%}.wf-col-sm-pull-9{right:75%}.wf-col-sm-pull-10{right:83.33333%}.wf-col-sm-pull-11{right:91.66667%}.wf-col-sm-pull-12{right:100%}.wf-col-sm-push-0{left:auto}.wf-col-sm-push-1{left:8.33333%}.wf-col-sm-push-2{left:16.66667%}.wf-col-sm-push-3{left:25%}.wf-col-sm-push-4{left:33.33333%}.wf-col-sm-push-5{left:41.66667%}.wf-col-sm-push-6{left:50%}.wf-col-sm-push-7{left:58.33333%}.wf-col-sm-push-8{left:66.66667%}.wf-col-sm-push-9{left:75%}.wf-col-sm-push-10{left:83.33333%}.wf-col-sm-push-11{left:91.66667%}.wf-col-sm-push-12{left:100%}.wf-col-sm-offset-0{margin-left:0%}.wf-col-sm-offset-1{margin-left:8.33333%}.wf-col-sm-offset-2{margin-left:16.66667%}.wf-col-sm-offset-3{margin-left:25%}.wf-col-sm-offset-4{margin-left:33.33333%}.wf-col-sm-offset-5{margin-left:41.66667%}.wf-col-sm-offset-6{margin-left:50%}.wf-col-sm-offset-7{margin-left:58.33333%}.wf-col-sm-offset-8{margin-left:66.66667%}.wf-col-sm-offset-9{margin-left:75%}.wf-col-sm-offset-10{margin-left:83.33333%}.wf-col-sm-offset-11{margin-left:91.66667%}.wf-col-sm-offset-12{margin-left:100%}.wf-col-sm-half-padding-left{padding-left:8px}.wf-col-sm-half-padding-right{padding-right:7px}}@media (min-width: 992px){.wf-col-md-1,.wf-col-md-2,.wf-col-md-3,.wf-col-md-4,.wf-col-md-5,.wf-col-md-6,.wf-col-md-7,.wf-col-md-8,.wf-col-md-9,.wf-col-md-10,.wf-col-md-11,.wf-col-md-12{float:left}.wf-col-md-1{width:8.33333%}.wf-col-md-2{width:16.66667%}.wf-col-md-3{width:25%}.wf-col-md-4{width:33.33333%}.wf-col-md-5{width:41.66667%}.wf-col-md-6{width:50%}.wf-col-md-7{width:58.33333%}.wf-col-md-8{width:66.66667%}.wf-col-md-9{width:75%}.wf-col-md-10{width:83.33333%}.wf-col-md-11{width:91.66667%}.wf-col-md-12{width:100%}.wf-col-md-pull-0{right:auto}.wf-col-md-pull-1{right:8.33333%}.wf-col-md-pull-2{right:16.66667%}.wf-col-md-pull-3{right:25%}.wf-col-md-pull-4{right:33.33333%}.wf-col-md-pull-5{right:41.66667%}.wf-col-md-pull-6{right:50%}.wf-col-md-pull-7{right:58.33333%}.wf-col-md-pull-8{right:66.66667%}.wf-col-md-pull-9{right:75%}.wf-col-md-pull-10{right:83.33333%}.wf-col-md-pull-11{right:91.66667%}.wf-col-md-pull-12{right:100%}.wf-col-md-push-0{left:auto}.wf-col-md-push-1{left:8.33333%}.wf-col-md-push-2{left:16.66667%}.wf-col-md-push-3{left:25%}.wf-col-md-push-4{left:33.33333%}.wf-col-md-push-5{left:41.66667%}.wf-col-md-push-6{left:50%}.wf-col-md-push-7{left:58.33333%}.wf-col-md-push-8{left:66.66667%}.wf-col-md-push-9{left:75%}.wf-col-md-push-10{left:83.33333%}.wf-col-md-push-11{left:91.66667%}.wf-col-md-push-12{left:100%}.wf-col-md-offset-0{margin-left:0%}.wf-col-md-offset-1{margin-left:8.33333%}.wf-col-md-offset-2{margin-left:16.66667%}.wf-col-md-offset-3{margin-left:25%}.wf-col-md-offset-4{margin-left:33.33333%}.wf-col-md-offset-5{margin-left:41.66667%}.wf-col-md-offset-6{margin-left:50%}.wf-col-md-offset-7{margin-left:58.33333%}.wf-col-md-offset-8{margin-left:66.66667%}.wf-col-md-offset-9{margin-left:75%}.wf-col-md-offset-10{margin-left:83.33333%}.wf-col-md-offset-11{margin-left:91.66667%}.wf-col-md-offset-12{margin-left:100%}.wf-col-md-half-padding-left{padding-left:8px}.wf-col-md-half-padding-right{padding-right:7px}}@media (min-width: 1200px){.wf-col-lg-1,.wf-col-lg-2,.wf-col-lg-3,.wf-col-lg-4,.wf-col-lg-5,.wf-col-lg-6,.wf-col-lg-7,.wf-col-lg-8,.wf-col-lg-9,.wf-col-lg-10,.wf-col-lg-11,.wf-col-lg-12{float:left}.wf-col-lg-1{width:8.33333%}.wf-col-lg-2{width:16.66667%}.wf-col-lg-3{width:25%}.wf-col-lg-4{width:33.33333%}.wf-col-lg-5{width:41.66667%}.wf-col-lg-6{width:50%}.wf-col-lg-7{width:58.33333%}.wf-col-lg-8{width:66.66667%}.wf-col-lg-9{width:75%}.wf-col-lg-10{width:83.33333%}.wf-col-lg-11{width:91.66667%}.wf-col-lg-12{width:100%}.wf-col-lg-pull-0{right:auto}.wf-col-lg-pull-1{right:8.33333%}.wf-col-lg-pull-2{right:16.66667%}.wf-col-lg-pull-3{right:25%}.wf-col-lg-pull-4{right:33.33333%}.wf-col-lg-pull-5{right:41.66667%}.wf-col-lg-pull-6{right:50%}.wf-col-lg-pull-7{right:58.33333%}.wf-col-lg-pull-8{right:66.66667%}.wf-col-lg-pull-9{right:75%}.wf-col-lg-pull-10{right:83.33333%}.wf-col-lg-pull-11{right:91.66667%}.wf-col-lg-pull-12{right:100%}.wf-col-lg-push-0{left:auto}.wf-col-lg-push-1{left:8.33333%}.wf-col-lg-push-2{left:16.66667%}.wf-col-lg-push-3{left:25%}.wf-col-lg-push-4{left:33.33333%}.wf-col-lg-push-5{left:41.66667%}.wf-col-lg-push-6{left:50%}.wf-col-lg-push-7{left:58.33333%}.wf-col-lg-push-8{left:66.66667%}.wf-col-lg-push-9{left:75%}.wf-col-lg-push-10{left:83.33333%}.wf-col-lg-push-11{left:91.66667%}.wf-col-lg-push-12{left:100%}.wf-col-lg-offset-0{margin-left:0%}.wf-col-lg-offset-1{margin-left:8.33333%}.wf-col-lg-offset-2{margin-left:16.66667%}.wf-col-lg-offset-3{margin-left:25%}.wf-col-lg-offset-4{margin-left:33.33333%}.wf-col-lg-offset-5{margin-left:41.66667%}.wf-col-lg-offset-6{margin-left:50%}.wf-col-lg-offset-7{margin-left:58.33333%}.wf-col-lg-offset-8{margin-left:66.66667%}.wf-col-lg-offset-9{margin-left:75%}.wf-col-lg-offset-10{margin-left:83.33333%}.wf-col-lg-offset-11{margin-left:91.66667%}.wf-col-lg-offset-12{margin-left:100%}.wf-col-lg-half-padding-left{padding-left:8px}.wf-col-lg-half-padding-right{padding-right:7px}}.wrap.wordfence{direction:ltr;min-width:1024px}.wrap.wordfence>.wf-container-fluid{padding-left:0px;padding-right:0px}.wrap.wordfence .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wrap.wordfence h3{font-size:1.15em}a{color:#00709e}.wordfenceWrap{margin:20px 0 0 20px}.wordfence-icon32{width:32px;height:32px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:7px 5px 0 0;float:left}#wfHeading{white-space:nowrap}#wfHeading:after{content:'.';visibility:hidden;display:block;clear:both;height:0px}div.wordfence-lock-icon{background-image:url(../images/wordfence-logo-32x32.png)}a.wfhelp{background-image:url(../images/help.png);width:12px;height:12px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:0 3px 0 3px;text-decoration:none;display:inline-block;vertical-align:middle}.wordfence .resulticon{display:block;float:left;width:16px;height:16px;background-position:0 0;background-repeat:no-repeat;border-width:0;padding:0;margin:0 3px 0 0;background-image:url(../images/icons/bullet_yellow.png)}.wordfenceBoldTD{font-weight:bold}.wfAjax24{display:none;width:24px;height:24px;background-image:url(../images/icons/ajax24.gif);margin:0;padding:0}div.wfLoadingWhite32{width:32px;height:32px;background-image:url(../images/icons/ajaxWhite32x32.gif);margin:0;padding:0}.wfTabsContainer{background-color:#FFF;overflow:hidden;border:1px solid #CCC;padding:15px;min-height:200px;-webkit-font-smoothing:antialiased}#wfTabs::after{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}#wfTabs a{float:left;z-index:10;height:18px;margin:0 5px -1px 0;padding:5px 8px;border:1px solid #CCC;text-decoration:none;background-color:#EFEFEF;color:#21759B;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px}#wfTabs a.selected{border-bottom:1px solid #FFF;background-color:#FFF;color:#777}.wordfenceTopTab{display:none;margin-top:15px}.wordfenceTopTab.active{display:block}.wordfenceHelpLink{margin-top:15px}.wfAjaxLight128{background-image:url(../images/icons/ajax3.gif)}.wfStrong{font-weight:bold}.wordfenceModeElem{width:1px;height:1px;opacity:0}.wfWarn{color:#F00}img.wfFlag{vertical-align:middle;margin:-3px 4px 0 0}.wfHitTime{font-style:italic}.wfAvatar img{vertical-align:middle}.wf-hex-sequence{color:#587ECB}.wfLoadMoreButton.disabled,.wfLoadMoreButton[disabled]{pointer-events:none;opacity:0.65}table.wfConfigForm th{font-weight:normal;text-align:left;padding:2px 3px 1px 0;vertical-align:middle}table.wfConfigForm td{vertical-align:middle}table.wfConfigForm td.align-top{vertical-align:top}table th.wfConfigEnable{font-weight:bold;min-width:25%}.wfSavedMsg{display:none;color:#A00}table th.wfSubheading{font-weight:bold;padding-top:10px}h3.wfConfigHeading{font-size:22px;color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic;font-weight:normal}.wfTipText{color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic}.wfBlackCursor{color:#FFF}.wf-spinner{display:inline-block;width:4px}.wferror{color:#F00}#wordfenceWorking{padding:2px 8px 2px 24px;z-index:100000;position:fixed;right:2px;bottom:2px;border:1px solid #000;background-color:#F00;color:#FFF;font-size:12px;font-weight:bold;font-family:Arial;text-align:center;background-image:url("../images/icons/ajaxRed16.gif");background-position:2px 2px;background-repeat:no-repeat}#paidWrap{position:relative}.paidInnerMsg{width:500px;margin:150px auto 0 auto;color:#000;font-size:18px;font-family:Georgia,Times New Roman,Times,serif;line-height:1.8em;text-align:center;-webkit-font-smoothing:antialiased}.wfMarker{height:1px;width:1px}.wfPaidOnlyNotice{width:500px;background-color:#FFFFE0;border:1px solid #000;padding:10px;margin:20px}.wfOnOffSwitch{position:relative !important;width:69px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.wfOnOffSwitch-checkbox{display:none !important}.wfOnOffSwitch-label{display:block !important;overflow:hidden !important;cursor:pointer !important;border:2px solid #999999 !important;border-radius:19px !important}.wfOnOffSwitch-inner{width:200% !important;margin-left:-100% !important;-webkit-transition:margin 0.3s ease-in !important;-o-transition:margin 0.3s ease-in !important;transition:margin 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important}.wfOnOffSwitch-inner:before,.wfOnOffSwitch-inner:after{float:left !important;width:50% !important;height:19px !important;padding:0 !important;line-height:19px !important;font-size:14px !important;color:white !important;font-family:Trebuchet, Arial, sans-serif !important;font-weight:bold !important;-webkit-box-sizing:border-box !important;-moz-box-sizing:border-box !important;box-sizing:border-box !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;-webkit-box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important;box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important}.wfOnOffSwitch-inner:before{content:"ON" !important;padding-left:10px !important;background-color:#30D965 !important;color:#FFFFFF !important;-moz-border-radius:19px 0 0 19px !important;-webkit-border-radius:19px;border-radius:19px 0 0 19px !important}.wfOnOffSwitch-inner:after{content:"OFF" !important;padding-right:10px !important;background-color:#EEEEEE !important;color:#999999 !important;text-align:right !important;-moz-border-radius:0 19px 19px 0 !important;-webkit-border-radius:0;border-radius:0 19px 19px 0 !important}.wfOnOffSwitch-switch{width:19px !important;margin:0 !important;background:#FFFFFF !important;border:2px solid #999999 !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;position:absolute !important;top:0 !important;bottom:0 !important;right:46px !important;-webkit-transition:all 0.3s ease-in !important;-o-transition:all 0.3s ease-in !important;transition:all 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjEiLz48c3RvcCBvZmZzZXQ9IjgwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA=') !important;background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0.1)),color-stop(80%, rgba(0,0,0,0))) !important;background-image:-moz-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:-webkit-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:linear-gradient(to center bottom, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;box-shadow:0 1px 1px white inset !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-inner{margin-left:0 !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-switch{right:0 !important}#wordfenceConfigWarning,#wordfenceAdminEmailWarning{clear:left;margin-top:5px}.wf-striped-table{width:100%;max-width:100%;border-collapse:collapse}.wf-striped-table th,.wf-striped-table td{padding:6px 4px;border:1px solid #ccc}.wf-striped-table thead th,.wf-striped-table thead td,.wf-striped-table tfoot th,.wf-striped-table tfoot td,.wf-striped-table tbody.thead th,.wf-striped-table tbody.thead td{background-color:#222;color:#fff;font-weight:bold;border-color:#474747;text-align:left}.wf-striped-table tbody tr.even td,.wf-striped-table tbody tr:nth-child(2n) td{background-color:#eee}.wf-striped-table tbody tr td,.wf-striped-table tbody tr.odd td{background-color:#fff}.wf-striped-table tbody tr:hover>td{background-color:#fffbd8}.wf-striped-table tbody.empty-row tr td{border-width:0;padding:8px 0;background-color:transparent}.wf-striped-table td.error{color:#d0514c;font-weight:bold}.wf-striped-table td.error:before{content:"\2718"}.wf-striped-table td.success{color:#008c10;font-weight:bold;max-width:20%}.wf-striped-table td.success:before{content:"\2713"}.wf-striped-table td.success:before,.wf-striped-table td.error:before{font-size:16px;display:inline-block;margin:0px 8px 0px 0px}.wf-striped-table td.inactive{font-weight:bold;color:#666666}.wordfence-waiting{line-height:32px}.wordfence-waiting img{vertical-align:middle}pre.wf-pre{margin:8px 0 20px;padding:12px;background:#ffffff;border:1px solid #999999;overflow:auto}.wf-center{text-align:center}#wfConfigForm{max-width:1035px}.wf-hidden{display:none !important}.wf-card{position:relative;margin:0 auto .625rem;padding:1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wf-card .wf-card-inner{min-height:76px;width:100%;padding:8px;box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;position:relative}.wf-card .wf-card-inner .wf-card-content{max-width:75%}.wf-card .wf-card-inner .wf-card-content .wf-card-title{font-size:1.125rem;width:100%}.wf-card .wf-card-inner .wf-card-content .wf-card-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.875rem;color:#4f748e}.wf-card .wf-card-inner .wf-card-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-card .wf-card-inner .wf-card-action .wf-card-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wf-card .wf-card-inner .wf-card-action .wf-card-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-card .wf-card-inner .wf-card-action .wf-card-action-checkbox.checked{background-position:right center}.wf-card .wf-card-extra{display:none;padding:16px;margin-top:1rem;border-top:1px solid #f3f6f8}.wf-card.active .wf-card-extra{display:block}.wf-card.wf-card-left .wf-card-content{margin-left:48px}.wf-card.wf-card-left .wf-card-action{right:auto;left:0px}.wf-card.disabled .wf-card-content .wf-card-title{color:#aaaaaa}.wf-card.disabled .wf-card-content .wf-card-subtitle{color:#8ea6be}.wf-add-top{margin-top:20px !important}.wf-add-top-small{margin-top:10px !important}.wf-add-bottom{margin-bottom:20px !important}.wf-add-bottom-small{margin-bottom:10px !important}.wf-center{text-align:center}.wf-right{text-align:right}.wf-scroll-x::-webkit-scrollbar,.wf-scroll-y::-webkit-scrollbar{-webkit-appearance:none;width:7px;height:7px}.wf-scroll-x::-webkit-scrollbar-thumb,.wf-scroll-y::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgba(0,0,0,0.194);-webkit-box-shadow:0 0 1px rgba(255,255,255,0.5)}.select2-container{min-width:320px}#wf-notices{margin-top:15px}#wf-notices .wf-admin-notice{margin-left:0px;margin-right:0px}.wf-success-text,.wf-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wf-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wf-notice-text{color:#6d798c}.wf-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #16bc9b;border-width:1px 1px 1px 10px}.wf-success-text{color:#11967a}.wf-premium-callout{border:1px solid #00709e;background-color:#ffffff;padding:16px;margin:20px 0 0}.wf-premium-callout h3{margin:0 0 8px;color:#11967a}.wf-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wf-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wf-premium-callout .center{text-align:center;margin:0}.wf-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}#wfLiveTrafficOverlayAnchor::after{position:absolute;z-index:3002;top:0;right:0;width:0;height:0;background:rgba(241,241,241,0.6);content:'';opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wordfenceLiveActivityPaused #wfLiveTrafficOverlayAnchor::after{width:100%;height:100%;opacity:1;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}#wordfenceLiveActivityDisabled{background:#fff;border-left:4px solid #ffb900;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);margin-bottom:12px;padding:1px 13px;max-width:900px}#wfLiveTrafficDisabledMessage{display:none;position:fixed;z-index:3003;left:0;width:100%;top:50%;transform:translateY(-50%);text-align:center;color:#666666;opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}#wfLiveTrafficDisabledMessage h2{background-color:#FFF;overflow:hidden;border:1px solid #CCC;max-width:350px;margin:0 auto;padding:15px;font-size:2.0em}#wfLiveTrafficDisabledMessage h2 small{font-size:0.5em;font-weight:normal;margin-top:20px}.wordfenceLiveActivityPaused #wfLiveTrafficDisabledMessage{display:block;opacity:1;-webkit-transition:opacity 0.5s;transition:opacity 0.5s}.wf-live-activity{position:relative;margin:20px 0 10px 0;padding:0.75rem;box-sizing:border-box;background:#FFFCEF;box-shadow:0 0 0 1px rgba(153,155,135,0.5),0 1px 2px #e8f3e0}.wf-live-activity .wf-live-activity-inner{width:100%;box-sizing:border-box;position:relative}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:flex-start}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content .wf-live-activity-title{color:#888888;font-size:0.85rem;font-weight:bold;padding-right:0.5rem}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content .wf-live-activity-message{font-size:0.80rem;color:#000000}.wf-live-activity .wf-live-activity-inner .wf-live-activity-state{position:absolute;top:0px;right:0px;bottom:0px;left:0px;background:rgba(255,252,239,0.9);display:none;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:center;z-index:3001;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wordfenceLiveActivityPaused .wf-live-activity .wf-live-activity-inner .wf-live-activity-state{display:-ms-flexbox;display:flex;opacity:1;-webkit-transition:opacity 0.5s;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}.wordfence .wordfenceScanButton{margin:20px 0 20px 0}.wordfence .wordfenceScanButton input.button-wf-grey{background:#EFEFEF url(../images/button-grad-grey.png) repeat-x scroll left top;border-color:#EFEFEF}.wordfence .wordfenceScanButton table td{vertical-align:top}.wordfence .wordfenceScanButton .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709E;height:44px;line-height:44px;padding:0px 20px}table.wfSummaryParent{font-family:sans-serif;font-size:14px;color:#000;z-index:9}table.wfSummaryParent td{vertical-align:top;padding:0;margin:0}table.wfSummaryParent table.wfSummaryChild th{font-weight:bold;text-align:right;font-family:Georgia,Times New Roman,Times,serif;color:#000;padding:5px 10px 5px 0;border-top:1px solid #CCC}table.wfSummaryParent table.wfSummaryChild td{font-weight:normal;text-align:left;padding:5px 0 5px 0;border-top:1px solid #CCC}table.wfSummaryParent table.wfSC1 td{width:300px;padding:0 25px 10px 0}table.wfSummaryParent table.wfSC2 th{width:80px}table.wfSummaryParent table.wfSC2 td{width:100px}table.wfSummaryParent table.wfSC3 th{width:80px}table.wfSummaryParent table.wfSC3 td{width:250px}table.wfSummaryParent th.wfHead{font-size:22px;font-family:Georgia,Times New Roman,Times,serif;font-style:italic;color:#555;font-weight:bold;text-align:left;padding:20px 0 20px 0;-webkit-font-smoothing:antialiased}div.wfIssue table.wfIssue td{padding:2px;margin:0;border-width:0;text-align:left}div.wfIssue table.wfIssue th{padding:2px;margin:0;font-weight:bold;text-align:left;color:#777}div.wfIssue table.wfIssueLinks td{border-width:0;text-align:left;padding-right:10px}div.wfIssue h2{margin:0 0 5px 0;padding:0}.wfIssueOptions{border-top:1px solid #CCC;padding:10px}.wfIssueOptions a{margin-left:10px}.wfIssueOptions strong{float:left;display:block;width:60px}.wfIssueOptions p{margin:6px 0px 0px}.wfProbSev1,.wfProbSev2,.wfAjaxLight128,.wfResolved{width:128px;height:128px;border:0;margin:0 auto;background-repeat:no-repeat;background-position:0 0;text-decoration:none;display:block}.wfProbSev1{background-image:url(../images/icons/error128.png)}.wfProbSev2{background-image:url(../images/icons/warning128.png)}.wfResolved{background-image:url(../images/icons/tick128.png)}.wfIssuesContainer{width:100%;display:none}.wfIssuesContainer p{width:550px}.wfALogTime{color:#999}.wfALogMailLink,.wfALogViewLink{display:block;position:absolute;padding:0 0 0 18px;margin:0;right:10px;top:0;background-repeat:no-repeat;font-weight:normal}.wfALogMailLink{background-image:url(../images/icons/email_go.png)}.wfALogViewLink{background-image:url(../images/icons/magnifier.png)}#wfActivity{position:relative}.consoleHead{position:relative;padding:0 0 0 3px;font-weight:bold;width:100%}.consoleHeadText{margin-bottom:4px;font-size:18px;font-family:Georgia,Times New Roman,Times,serif;color:#555;font-weight:bold;-webkit-font-smoothing:antialiased}.consoleFooter{position:relative}.consoleOuter{width:100%}.consoleInner{height:116px;overflow:auto;z-index:1}.bevelDiv1{border:1px solid #EFEFEF}.bevelDiv2{border:1px solid #AAA}.bevelDiv3{background-color:#ffffed;padding:5px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased}.wfSecure{color:#0A0;font-weight:bold}.wfSummaryDate{float:left;margin-left:3px}.wfSummaryMsg{float:left;margin-left:3px}.wfSummaryResult{float:right;text-align:left;width:280px}.wfSummaryLoading{width:16px;height:11px;background-image:url("../images/icons/ajaxScan.gif")}.wfSummaryBad,.wfSummaryErr{color:#930000}.wfSummaryOK{color:#11967a}.wfClear{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}.wfSummaryFinal{-webkit-font-smoothing:antialiased;font-weight:bold;color:#555}.wfStartScanButton{text-align:center}.wordfenceScanHelp{border:1px solid #CCC;padding:4px}.wf-scan-no-issues{font-size:1.25rem;color:#11967a}.scan-schedule{border-collapse:collapse;border-spacing:0}.scan-schedule td{padding:0}.scan-schedule th{padding:0 8px 0 0}.next-scan{font-size:1em;display:block;position:relative;width:7em;height:7em;background-color:#fff;border-radius:0.6em;box-shadow:0 1px 0 rgba(189,189,189,0.6);overflow:hidden}.next-scan *{display:block;width:100%;font-size:1em;font-weight:bold;font-style:normal;text-align:center}.next-scan strong{position:absolute;top:0;padding:0.4em 0;color:#fff;background-color:#00709E;box-shadow:0 2px 0 #00709E}.next-scan em{position:absolute;bottom:0.3em;color:#00709E}.next-scan span{width:100%;font-size:2.8em;padding-top:1.15em;color:#2f2f2f}.schedule-times{margin-bottom:0;padding-left:0;list-style:none;clear:both}.schedule-times>li{float:left;position:relative;display:block;margin:0px 0px 2px 0px}.schedule-times>li.disabled>a{color:#777}.schedule-times>li.disabled>a:hover,.schedule-times>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.schedule-times>li>a{text-decoration:none;border:1px solid #e2e2e2;border-radius:4px;position:relative;display:block;padding:8px 12px}.schedule-times>li>a:hover,.schedule-times>li>a:focus{text-decoration:none;background-color:#e2e2e2}.schedule-times>li+li{margin-left:2px}.schedule-times>li.active>a,.schedule-times>li.active>a:hover,.schedule-times>li.active>a:focus{color:#fff;background-color:#00709e;border-color:#00709e}.schedule-times>li.text-only{position:relative;display:block;padding:8px 12px}.schedule-times>li>a>img{max-width:none}#wf-lt-listings .wfActEvent{padding-left:15px;border-left:5px solid #cccccc}#wf-lt-listings .wfActEvent.wfHuman{border-left:5px solid #16bc9b}#wf-lt-listings .wfActEvent.wfActionBlocked{border-left:5px solid #d03935}#wf-lt-listings .wfActEvent.wfNotice{border-left:5px solid #c10000}#wf-lt-listings .wfActEvent.wfWarning,#wf-lt-listings .wfActEvent.wf404{border-left:5px solid #ffd10a}#wf-lt-listings .wfActEvent:hover{background-color:#fff9e9 !important}#wf-live-traffic{position:relative;overflow:visible}#wf-live-traffic-legend{white-space:nowrap;background-color:#fff;border:1px solid #cccccc;padding:12px}#wf-live-traffic-legend.sticky{position:fixed;top:42px;right:auto;left:182px;z-index:2000}#wf-live-traffic-legend-placeholder{display:none;padding:12px}#wf-live-traffic-legend-placeholder.sticky{display:block}#wf-live-traffic-legend ul{margin:0;padding:0}#wf-live-traffic-legend ul:before,#wf-live-traffic-legend ul:after{content:" ";display:table}#wf-live-traffic-legend ul:after{clear:both}#wf-live-traffic-legend ul li{margin:0;padding:0;position:relative;float:left}#wf-live-traffic-legend ul li+li{margin-left:8px}#wf-live-traffic-legend ul li:before{content:'';display:block;float:left;margin:3px 6px 0 0;width:12px;height:12px;background-color:#CCCCCC}#wf-live-traffic-legend ul li.wfHuman:before{background-color:#16bc9b}#wf-live-traffic-legend ul li.wfNotice:before{background-color:#ffd10a}#wf-live-traffic-legend ul li.wfBlocked:before{background-color:#d03935}.wfTimeAgo{font-family:Georgia,Times New Roman,Times,serif;color:#999;font-weight:bold;font-style:italic}.wfActEvent{border-bottom:1px solid #CCC;padding:10px 20px;overflow:auto}.wf-pad-small{margin:8px 0}#wf-lt-listings{margin:0 0 0}#wf-lt-listings a{cursor:pointer;text-decoration:underline}#wf-lt-listings a.button,#wf-lt-listings a.wf-btn{text-decoration:none}.wfActionBlocked{background-color:#fff6f6}[class*="span"]{float:left;min-height:1px;margin-left:30px}.highlighted{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-moz-keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@-webkit-keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@-moz-keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}@-webkit-keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}@keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}.highlighted{-webkit-animation-name:highlighted;animation-name:highlighted}.highlighted.wfActionBlocked{-webkit-animation-name:highlightedBlocked;animation-name:highlightedBlocked}#wf-lt-preset-filters{min-width:250px}#wf-lt-advanced-filters>table{width:100%}#wf-lt-advanced-filters>table>tr>td{vertical-align:top}.wf-lt-url{white-space:nowrap}table.block-ranges-table{border-collapse:collapse;margin:10px 0 0}table.block-ranges-table tr td{border:1px solid #CCC;border-width:1px 0;padding:10px 0 12px 0}#input-wafStatus,#input-wafStatus option,.select2-container--default{font-size:18px}.wafStatus-enabled,.wafStatus-learning-mode,.wafStatus-disabled,.wafStatus-enabled.select2-container--default .select2-selection--single .select2-selection__rendered,.wafStatus-learning-mode.select2-container--default .select2-selection--single .select2-selection__rendered,.wafStatus-disabled.select2-container--default .select2-selection--single .select2-selection__rendered{color:#ffffff}#waf-config-form .waf-config-label{font-size:1.3em}#waf-config-form .select2-container--default .select2-selection--single{padding:4px;text-shadow:0 0 3px #000000;font-weight:bold;border-radius:3px}#waf-config-form .select2-container .select2-selection--single{height:auto}.wafStatus-enabled.select2-container--default .select2-selection--single{background-color:#11967a;border-color:#073a2f}.wafStatus-learning-mode.select2-container--default .select2-selection--single{background-color:#ffd10a;border-color:#a38400}.wafStatus-disabled.select2-container--default .select2-selection--single,.wafStatus-disabled.select2-container--default.select2-container--disabled .select2-selection--single,.wafStatus-learning-mode.select2-container--default.select2-container--disabled .select2-selection--single,.wafStatus-enabled.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#c10000;border-color:#5b0000}#waf-config-form .select2-container--default .select2-selection--single .select2-selection__arrow{height:100%;top:0}.wafStatus-enabled.select2-container--default .select2-selection--single .select2-selection__arrow b,.wafStatus-learning-mode.select2-container--default .select2-selection--single .select2-selection__arrow b,.wafStatus-disabled.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#ffffff transparent transparent}.wafStatus-enabled.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b,.wafStatus-learning-mode.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b,.wafStatus-disabled.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #ffffff}.wafStatus-description{display:none;max-width:500px;font-style:italic;font-size:14px;line-height:1.3}table.whitelist-table .whitelist-edit{display:none}table.whitelist-table .edit-mode .whitelist-display{display:none}table.whitelist-table .edit-mode .whitelist-edit{display:block}table.whitelist-table .edit-mode span.whitelist-edit,table.whitelist-table .edit-mode input.whitelist-edit{display:inline}.wf-bulk-action{margin:12px 0}tr.wf-table-filters input{max-width:120px}#wordfenceRightRail img{max-width:100%}#wordfenceRightRail ul{list-style-type:none;margin:0;margin-top:15px}#wordfenceRightRail .center{text-align:center}#wordfenceRightRail .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wordfenceRightRail img{width:100%}.wordfenceRightRailLiveTraffic,.wordfenceRightRailOptions,.wordfenceRightRailDiagnostics{margin-left:1055px}.wordfenceRightRailBlockedIPs,.wordfenceRightRailWAF,.wordfenceRightRailCountryBlocking,.wordfenceRightRailScanSchedule{margin-left:950px}.wordfenceRightRail ul{list-style-type:none;margin:0}.wordfenceRightRail .center{text-align:center}.wordfenceRightRail .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wordfenceWrap.wordfence-community{min-height:760px}#wfTwoFactorQRCodeTable{width:256px;height:256px;margin:0 auto}#wfTwoFactorRecoveryCodes{list-style-type:none}#wfTwoFactorRecoveryCodes li{font-family:monospace;text-align:center}#wfTwoFactorDownload .dashicons{line-height:26px}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}label.wf-plain{font-weight:normal}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857;color:#555}.wf-form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wf-form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.wf-form-control::-moz-placeholder{color:#999;opacity:1}.wf-form-control:-ms-input-placeholder{color:#999}.wf-form-control::-webkit-input-placeholder{color:#999}.wf-form-control::-ms-expand{border:0;background-color:transparent}.wf-form-control[disabled],.wf-form-control[readonly],fieldset[disabled] .wf-form-control{background-color:#e2e2e2;opacity:1}.wf-form-control[disabled],fieldset[disabled] .wf-form-control{cursor:not-allowed}textarea.wf-form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"].wf-form-control,input[type="time"].wf-form-control,input[type="datetime-local"].wf-form-control,input[type="month"].wf-form-control{line-height:34px}input[type="date"].wf-input-sm,.wf-input-group-sm input[type="date"],input[type="time"].wf-input-sm,.wf-input-group-sm input[type="time"],input[type="datetime-local"].wf-input-sm,.wf-input-group-sm input[type="datetime-local"],input[type="month"].wf-input-sm,.wf-input-group-sm input[type="month"]{line-height:30px}input[type="date"].wf-input-lg,.wf-input-group-lg input[type="date"],input[type="time"].wf-input-lg,.wf-input-group-lg input[type="time"],input[type="datetime-local"].wf-input-lg,.wf-input-group-lg input[type="datetime-local"],input[type="month"].wf-input-lg,.wf-input-group-lg input[type="month"]{line-height:46px}}.wf-form-group{margin-bottom:8px}.wf-form-group.wf-sub-group label{color:#666666;font-weight:normal;padding-left:20px}.wf-form-group.wf-focus{border-left:4px solid #11967a;padding-bottom:8px;background-color:#e5e5e5}.wf-form-group.wf-focus label{margin-left:-4px}.wf-radio,.wf-checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.wf-radio label,.wf-checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.wf-radio input[type="radio"],.wf-radio-inline input[type="radio"],.wf-checkbox input[type="checkbox"],.wf-checkbox-inline input[type="checkbox"]{margin-top:4px \9}.wf-radio+.wf-radio,.wf-checkbox+.wf-checkbox{margin-top:-5px}.wf-radio-inline,.wf-checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.wf-radio-inline+.wf-radio-inline,.wf-checkbox-inline+.wf-checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"].wf-disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"].wf-disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.wf-radio-inline.wf-disabled,fieldset[disabled] .wf-radio-inline,.wf-checkbox-inline.wf-disabled,fieldset[disabled] .wf-checkbox-inline{cursor:not-allowed}.wf-radio.wf-disabled label,fieldset[disabled] .wf-radio label,.wf-checkbox.wf-disabled label,fieldset[disabled] .wf-checkbox label{cursor:not-allowed}.wf-form-control-static{padding-top:7px;padding-bottom:7px;margin:0;line-height:1}.wf-form-control-static.wf-input-lg,.wf-form-control-static.wf-input-sm{padding-left:0;padding-right:0}.wf-input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.wf-input-sm{height:30px;line-height:30px}textarea.wf-input-sm,select[multiple].wf-input-sm{height:auto}.wf-form-group-sm .wf-form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wf-form-group-sm select.wf-form-control{height:30px;line-height:30px}.wf-form-group-sm textarea.wf-form-control,.wf-form-group-sm select[multiple].wf-form-control{height:auto}.wf-form-group-sm .wf-form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.wf-input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}select.wf-input-lg{height:46px;line-height:46px}textarea.wf-input-lg,select[multiple].wf-input-lg{height:auto}.wf-form-group-lg .wf-form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wf-form-group-lg select.wf-form-control{height:46px;line-height:46px}.wf-form-group-lg textarea.wf-form-control,.wf-form-group-lg select[multiple].wf-form-control{height:auto}.wf-form-group-lg .wf-form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.33333}.wf-has-feedback{position:relative}.wf-has-feedback .wf-form-control{padding-right:42.5px}.wf-form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.wf-input-lg+.wf-form-control-feedback,.wf-input-group-lg+.wf-form-control-feedback,.wf-form-group-lg .wf-form-control+.wf-form-control-feedback{width:46px;height:46px;line-height:46px}.wf-input-sm+.wf-form-control-feedback,.wf-input-group-sm+.wf-form-control-feedback,.wf-form-group-sm .wf-form-control+.wf-form-control-feedback{width:30px;height:30px;line-height:30px}.wf-has-success .wf-help-block,.wf-has-success .wf-control-label,.wf-has-success .wf-radio,.wf-has-success .wf-checkbox,.wf-has-success .wf-radio-inline,.wf-has-success .wf-checkbox-inline,.wf-has-success.wf-radio label,.wf-has-success.wf-checkbox label,.wf-has-success.wf-radio-inline label,.wf-has-success.wf-checkbox-inline label{color:#3c763d}.wf-has-success .wf-form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-success .wf-form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.wf-has-success .wf-input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.wf-has-success .wf-form-control-feedback{color:#3c763d}.wf-has-warning .wf-help-block,.wf-has-warning .wf-control-label,.wf-has-warning .wf-radio,.wf-has-warning .wf-checkbox,.wf-has-warning .wf-radio-inline,.wf-has-warning .wf-checkbox-inline,.wf-has-warning.wf-radio label,.wf-has-warning.wf-checkbox label,.wf-has-warning.wf-radio-inline label,.wf-has-warning.wf-checkbox-inline label{color:#8a6d3b}.wf-has-warning .wf-form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-warning .wf-form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.wf-has-warning .wf-input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.wf-has-warning .wf-form-control-feedback{color:#8a6d3b}.wf-has-error .wf-help-block,.wf-has-error .wf-control-label,.wf-has-error .wf-radio,.wf-has-error .wf-checkbox,.wf-has-error .wf-radio-inline,.wf-has-error .wf-checkbox-inline,.wf-has-error.wf-radio label,.wf-has-error.wf-checkbox label,.wf-has-error.wf-radio-inline label,.wf-has-error.wf-checkbox-inline label{color:#a94442}.wf-has-error .wf-form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-error .wf-form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.wf-has-error .wf-input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.wf-has-error .wf-form-control-feedback{color:#a94442}.wf-has-feedback label ~ .wf-form-control-feedback{top:25px}.wf-has-feedback label.wf-sr-only ~ .wf-form-control-feedback{top:0}.wf-help-block{display:block;margin-top:5px;color:#737373}@media (min-width: 768px){.wf-form-inline .wf-form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-form-control{display:inline-block;width:auto;vertical-align:middle}.wf-form-inline .wf-form-control-static{display:inline-block}.wf-form-inline .wf-input-group{display:inline-table;vertical-align:middle}.wf-form-inline .wf-input-group .wf-input-group-addon,.wf-form-inline .wf-input-group .wf-input-group-btn,.wf-form-inline .wf-input-group .wf-form-control{width:auto}.wf-form-inline .wf-input-group>.wf-form-control{width:100%}.wf-form-inline .wf-control-label{margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-radio,.wf-form-inline .wf-checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-radio label,.wf-form-inline .wf-checkbox label{padding-left:0}.wf-form-inline .wf-radio input[type="radio"],.wf-form-inline .wf-checkbox input[type="checkbox"]{position:relative;margin-left:0}.wf-form-inline .wf-has-feedback .wf-form-control-feedback{top:0}}.wf-form-horizontal .wf-radio,.wf-form-horizontal .wf-checkbox,.wf-form-horizontal .wf-radio-inline,.wf-form-horizontal .wf-checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.wf-form-horizontal .wf-radio,.wf-form-horizontal .wf-checkbox{min-height:27px}.wf-form-horizontal .wf-form-group{margin-left:-15px;margin-right:-15px}.wf-form-horizontal .wf-form-group:before,.wf-form-horizontal .wf-form-group:after{content:" ";display:table}.wf-form-horizontal .wf-form-group:after{clear:both}@media (min-width: 768px){.wf-form-horizontal .wf-control-label{text-align:right;margin-bottom:0;padding-top:7px}}.wf-form-horizontal .wf-has-feedback .wf-form-control-feedback{right:15px}@media (min-width: 768px){.wf-form-horizontal .wf-form-group-lg .wf-control-label{padding-top:11px;font-size:18px}}@media (min-width: 768px){.wf-form-horizontal .wf-form-group-sm .wf-control-label{padding-top:6px;font-size:12px}}.wf-dashboard-item{position:relative;margin:0 auto 1rem;padding:0 1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wf-dashboard-item .wf-dashboard-item-inner{min-height:44px;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content{max-width:75%}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content .wf-dashboard-item-title{font-size:0.75rem;width:100%}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content .wf-dashboard-item-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text{width:auto}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-success{color:#11967a}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-warning{color:#930000}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-warning a{color:#930000}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-checkbox.checked{background-position:right center}.wf-dashboard-item .wf-dashboard-item-extra{display:none;margin:0 -1rem;padding:0 1rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list{margin:0 -1rem;padding:0;list-style:none}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li{display:block;min-height:44px;padding:0 1rem;margin:0;border-top:1px solid #eeeeee;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li>.wf-dashboard-item-list>li{border-top:0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0;border-left:1px solid #eeeeee}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>*:first-child{border-left:0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-enabled .fa{color:#11967a}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-disabled .fa{color:#525355}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-premium{color:#9f9fa0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-dismiss{padding-left:2rem;font-size:1.25rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-dismiss a{color:#525355}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count-count{font-size:3rem;line-height:3rem;color:#9f9fa0;padding:1rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count-label{font-size:0.75rem;color:#9f9fa0;padding:0 1rem 1rem 1rem}.wf-dashboard-item.active .wf-dashboard-item-extra{display:block}.wf-dashboard-item.wf-dashboard-item-left .wf-dashboard-item-content{margin-left:48px}.wf-dashboard-item.wf-dashboard-item-left .wf-dashboard-item-action{right:auto;left:0px}.wf-dashboard-item.disabled .wf-dashboard-item-content .wf-dashboard-item-title{color:#aaaaaa}.wf-dashboard-item.disabled .wf-dashboard-item-content .wf-dashboard-item-subtitle{color:#8ea6be}.wf-notifications-empty{font-size:0.9rem;color:#9f9fa0}.wf-dashboard-graph-wrapper{width:100%}.wf-dashboard-badge{display:inline-block;min-width:10px;padding:3px 7px;margin-left:0.5rem;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#fcb214;border-radius:10px}.wf-dashboard-badge:empty{display:none}.wf-btn .wf-dashboard-badge{position:relative;top:-1px}.wf-btn-xs .wf-dashboard-badge,.wf-btn-group-xs>.wf-btn .wf-dashboard-badge{top:0;padding:1px 5px}.wf-list-group-item.active>.wf-dashboard-badge,.wf-nav-pills>.active>a>.wf-dashboard-badge{color:#00709e;background-color:#fff}.wf-list-group-item>.wf-dashboard-badge{float:right}.wf-list-group-item>.wf-dashboard-badge+.wf-dashboard-badge{margin-right:5px}.wf-nav-pills>li>a>.wf-dashboard-badge{margin-left:3px}.wf-dashboard-toggle-btns{text-align:center}.wf-dashboard-toggle-btns .wf-pagination{margin:1rem 1rem 0.5rem 1rem}.wf-dashboard-show-more{position:relative;font-size:14px;color:#959595;text-align:center;line-height:1rem;background:#ffffff;width:60%;margin:20px auto 0 auto}.wf-dashboard-show-more:before{display:inline-block;content:"";position:absolute;height:1px;background:#dddddd;top:50%;width:100%;left:0;right:0}.wf-dashboard-show-more a{display:inline-block;position:relative;padding:0 10px;background-color:#ffffff}.wf-ips,.wf-recent-logins,.wf-countries{max-height:30rem;overflow-y:hidden;margin-bottom:20px}.wf-ips .wf-table,.wf-recent-logins .wf-table,.wf-countries .wf-table{margin-bottom:0}table.wf-table{background-color:transparent;border-collapse:collapse;border-spacing:0}table.wf-table td,table.wf-table th{padding:0}.wf-table caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}.wf-table th{text-align:left}.wf-table{width:100%;max-width:100%;margin-bottom:20px}.wf-table>thead>tr>th,.wf-table>thead>tr>td,.wf-table>tbody>tr>th,.wf-table>tbody>tr>td,.wf-table>tfoot>tr>th,.wf-table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.wf-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.wf-table>caption+thead>tr:first-child>th,.wf-table>caption+thead>tr:first-child>td,.wf-table>colgroup+thead>tr:first-child>th,.wf-table>colgroup+thead>tr:first-child>td,.wf-table>thead:first-child>tr:first-child>th,.wf-table>thead:first-child>tr:first-child>td{border-top:0}.wf-table>tbody+tbody{border-top:2px solid #ddd}.wf-table .wf-table{background-color:#fff}.wf-table-condensed>thead>tr>th,.wf-table-condensed>thead>tr>td,.wf-table-condensed>tbody>tr>th,.wf-table-condensed>tbody>tr>td,.wf-table-condensed>tfoot>tr>th,.wf-table-condensed>tfoot>tr>td{padding:5px}.wf-table-bordered{border:1px solid #ddd}.wf-table-bordered>thead>tr>th,.wf-table-bordered>thead>tr>td,.wf-table-bordered>tbody>tr>th,.wf-table-bordered>tbody>tr>td,.wf-table-bordered>tfoot>tr>th,.wf-table-bordered>tfoot>tr>td{border:1px solid #ddd}.wf-table-bordered>thead>tr>th,.wf-table-bordered>thead>tr>td{border-bottom-width:2px}.wf-table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.wf-table-hover>tbody>tr:hover{background-color:#f5f5f5}table.wf-table col[class*="col-"]{position:static;float:none;display:table-column}table.wf-table td[class*="col-"],table.wf-table th[class*="col-"]{position:static;float:none;display:table-cell}.wf-table>thead>tr>td.active,.wf-table>thead>tr>th.active,.wf-table>thead>tr.active>td,.wf-table>thead>tr.active>th,.wf-table>tbody>tr>td.active,.wf-table>tbody>tr>th.active,.wf-table>tbody>tr.active>td,.wf-table>tbody>tr.active>th,.wf-table>tfoot>tr>td.active,.wf-table>tfoot>tr>th.active,.wf-table>tfoot>tr.active>td,.wf-table>tfoot>tr.active>th{background-color:#f5f5f5}.wf-table-hover>tbody>tr>td.active:hover,.wf-table-hover>tbody>tr>th.active:hover,.wf-table-hover>tbody>tr.active:hover>td,.wf-table-hover>tbody>tr:hover>.active,.wf-table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.wf-table>thead>tr>td.success,.wf-table>thead>tr>th.success,.wf-table>thead>tr.success>td,.wf-table>thead>tr.success>th,.wf-table>tbody>tr>td.success,.wf-table>tbody>tr>th.success,.wf-table>tbody>tr.success>td,.wf-table>tbody>tr.success>th,.wf-table>tfoot>tr>td.success,.wf-table>tfoot>tr>th.success,.wf-table>tfoot>tr.success>td,.wf-table>tfoot>tr.success>th{background-color:#dff0d8}.wf-table-hover>tbody>tr>td.success:hover,.wf-table-hover>tbody>tr>th.success:hover,.wf-table-hover>tbody>tr.success:hover>td,.wf-table-hover>tbody>tr:hover>.success,.wf-table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.wf-table>thead>tr>td.info,.wf-table>thead>tr>th.info,.wf-table>thead>tr.info>td,.wf-table>thead>tr.info>th,.wf-table>tbody>tr>td.info,.wf-table>tbody>tr>th.info,.wf-table>tbody>tr.info>td,.wf-table>tbody>tr.info>th,.wf-table>tfoot>tr>td.info,.wf-table>tfoot>tr>th.info,.wf-table>tfoot>tr.info>td,.wf-table>tfoot>tr.info>th{background-color:#d9edf7}.wf-table-hover>tbody>tr>td.info:hover,.wf-table-hover>tbody>tr>th.info:hover,.wf-table-hover>tbody>tr.info:hover>td,.wf-table-hover>tbody>tr:hover>.info,.wf-table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.wf-table>thead>tr>td.warning,.wf-table>thead>tr>th.warning,.wf-table>thead>tr.warning>td,.wf-table>thead>tr.warning>th,.wf-table>tbody>tr>td.warning,.wf-table>tbody>tr>th.warning,.wf-table>tbody>tr.warning>td,.wf-table>tbody>tr.warning>th,.wf-table>tfoot>tr>td.warning,.wf-table>tfoot>tr>th.warning,.wf-table>tfoot>tr.warning>td,.wf-table>tfoot>tr.warning>th{background-color:#fcf8e3}.wf-table-hover>tbody>tr>td.warning:hover,.wf-table-hover>tbody>tr>th.warning:hover,.wf-table-hover>tbody>tr.warning:hover>td,.wf-table-hover>tbody>tr:hover>.warning,.wf-table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.wf-table>thead>tr>td.danger,.wf-table>thead>tr>th.danger,.wf-table>thead>tr.danger>td,.wf-table>thead>tr.danger>th,.wf-table>tbody>tr>td.danger,.wf-table>tbody>tr>th.danger,.wf-table>tbody>tr.danger>td,.wf-table>tbody>tr.danger>th,.wf-table>tfoot>tr>td.danger,.wf-table>tfoot>tr>th.danger,.wf-table>tfoot>tr.danger>td,.wf-table>tfoot>tr.danger>th{background-color:#f2dede}.wf-table-hover>tbody>tr>td.danger:hover,.wf-table-hover>tbody>tr>th.danger:hover,.wf-table-hover>tbody>tr.danger:hover>td,.wf-table-hover>tbody>tr:hover>.danger,.wf-table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.wf-table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.wf-table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.wf-table-responsive>.wf-table{margin-bottom:0}.wf-table-responsive>.wf-table>thead>tr>th,.wf-table-responsive>.wf-table>thead>tr>td,.wf-table-responsive>.wf-table>tbody>tr>th,.wf-table-responsive>.wf-table>tbody>tr>td,.wf-table-responsive>.wf-table>tfoot>tr>th,.wf-table-responsive>.wf-table>tfoot>tr>td{white-space:nowrap}.wf-table-responsive>.wf-table-bordered{border:0}.wf-table-responsive>.wf-table-bordered>thead>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>thead>tr>td:first-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>td:first-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>td:first-child{border-left:0}.wf-table-responsive>.wf-table-bordered>thead>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>thead>tr>td:last-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>td:last-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>td:last-child{border-right:0}.wf-table-responsive>.wf-table-bordered>tbody>tr:last-child>th,.wf-table-responsive>.wf-table-bordered>tbody>tr:last-child>td,.wf-table-responsive>.wf-table-bordered>tfoot>tr:last-child>th,.wf-table-responsive>.wf-table-bordered>tfoot>tr:last-child>td{border-bottom:0}}
css/wf-adminbar.css CHANGED
@@ -1 +1 @@
1
- #wf-adminbar-icon{float:left;width:20px;height:30px;background-image:url(../images/wordfence-logo-16x16.png);background-repeat:no-repeat;background-position:left center}#wpadminbar .wf-notification-counter{display:inline;background-color:inherit}#wpadminbar .wf-notification-counter span.wf-count{padding:1px 7px 1px 6px !important;border-radius:50%;color:#fff;background-color:#fcb214}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-submenu-title{-webkit-flex-grow:1;flex-grow:1}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-notification-counter{display:block}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status{width:1.25rem;font-size:1.25rem;text-align:center}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status-neutral{color:#9f9fa0}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status-good{color:#16bc9b}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status-bad{color:#ffd10a}#adminmenu .update-plugins.wf-menu-badge{background-color:#fcb214 !important}.wf-hidden{display:none !important}.wfpopover{position:fixed;top:0;left:0;z-index:106000;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.wfpopover.wf-top{margin-top:-10px}.wfpopover.wf-right{margin-left:10px}.wfpopover.wf-bottom{margin-top:10px}.wfpopover.wf-left{margin-left:-10px}.wfpopover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.wfpopover-content{padding:9px 14px}.wfpopover>.wf-arrow,.wfpopover>.wf-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.wfpopover>.wf-arrow{border-width:11px}.wfpopover>.wf-arrow:after{border-width:10px;content:""}.wfpopover.wf-top>.wf-arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.wfpopover.wf-top>.wf-arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.wfpopover.wf-right>.wf-arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.wfpopover.wf-right>.wf-arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.wfpopover.wf-bottom>.wf-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.wfpopover.wf-bottom>.wf-arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.wfpopover.wf-left>.wf-arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.wfpopover.wf-left>.wf-arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}
1
+ .wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}.wf-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.wf-btn:focus,.wf-btn.wf-focus,.wf-btn:active:focus,.wf-btn:active.wf-focus,.wf-btn.wf-active:focus,.wf-btn.wf-active.wf-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wf-btn:hover,.wf-btn:focus,.wf-btn.wf-focus{color:#333;text-decoration:none}.wf-btn:active,.wf-btn.wf-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wf-btn.wf-disabled,.wf-btn[disabled],fieldset[disabled] .wf-btn{cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.wf-btn{text-decoration:none}a.wf-btn.wf-disabled,fieldset[disabled] a.wf-btn{pointer-events:none}.wf-btn-default{color:#333;background-color:#fff;border-color:#ccc}.wf-btn-default:focus,.wf-btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.wf-btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.wf-btn-default:active,.wf-btn-default.active,.wf-open>.wf-btn-default.wf-dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.wf-btn-default:active:hover,.wf-btn-default:active:focus,.wf-btn-default:active.focus,.wf-btn-default.active:hover,.wf-btn-default.active:focus,.wf-btn-default.active.focus,.wf-open>.wf-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-btn-default.wf-dropdown-toggle.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.wf-btn-default:active,.wf-btn-default.wf-active,.wf-open>.wf-btn-default.wf-dropdown-toggle{background-image:none}.wf-btn-default.wf-disabled:hover,.wf-btn-default.wf-disabled:focus,.wf-btn-default.wf-disabled.wf-focus,.wf-btn-default[disabled]:hover,.wf-btn-default[disabled]:focus,.wf-btn-default[disabled].wf-focus,fieldset[disabled] .wf-btn-default:hover,fieldset[disabled] .wf-btn-default:focus,fieldset[disabled] .wf-btn-default.wf-focus{background-color:#fff;border-color:#ccc}.wf-btn-default .wf-badge{color:#fff;background-color:#333}.wf-btn-primary{color:#fff;background-color:#00709e;border-color:#005e85}.wf-btn-primary:focus,.wf-btn-primary.focus{color:#fff;background-color:#004c6b;border-color:#000405}.wf-btn-primary:hover{color:#fff;background-color:#004c6b;border-color:#003347}.wf-btn-primary:active,.wf-btn-primary.active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}.wf-btn-primary:active:hover,.wf-btn-primary:active:focus,.wf-btn-primary:active.focus,.wf-btn-primary.active:hover,.wf-btn-primary.active:focus,.wf-btn-primary.active.focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}.wf-btn-primary:active,.wf-btn-primary.wf-active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{background-image:none}.wf-btn-primary.wf-disabled:hover,.wf-btn-primary.wf-disabled:focus,.wf-btn-primary.wf-disabled.wf-focus,.wf-btn-primary[disabled]:hover,.wf-btn-primary[disabled]:focus,.wf-btn-primary[disabled].wf-focus,fieldset[disabled] .wf-btn-primary:hover,fieldset[disabled] .wf-btn-primary:focus,fieldset[disabled] .wf-btn-primary.wf-focus{background-color:#00709e;border-color:#005e85}.wf-btn-primary .wf-badge{color:#00709e;background-color:#fff}.wf-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.wf-btn-success:focus,.wf-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.wf-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.wf-btn-success:active,.wf-btn-success.active,.wf-open>.wf-btn-success.wf-dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.wf-btn-success:active:hover,.wf-btn-success:active:focus,.wf-btn-success:active.focus,.wf-btn-success.active:hover,.wf-btn-success.active:focus,.wf-btn-success.active.focus,.wf-open>.wf-btn-success.wf-dropdown-toggle:hover,.wf-open>.wf-btn-success.wf-dropdown-toggle:focus,.wf-open>.wf-btn-success.wf-dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.wf-btn-success:active,.wf-btn-success.wf-active,.wf-open>.wf-btn-success.wf-dropdown-toggle{background-image:none}.wf-btn-success.wf-disabled:hover,.wf-btn-success.wf-disabled:focus,.wf-btn-success.wf-disabled.wf-focus,.wf-btn-success[disabled]:hover,.wf-btn-success[disabled]:focus,.wf-btn-success[disabled].wf-focus,fieldset[disabled] .wf-btn-success:hover,fieldset[disabled] .wf-btn-success:focus,fieldset[disabled] .wf-btn-success.wf-focus{background-color:#5cb85c;border-color:#4cae4c}.wf-btn-success .wf-badge{color:#5cb85c;background-color:#fff}.wf-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.wf-btn-info:focus,.wf-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.wf-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.wf-btn-info:active,.wf-btn-info.active,.wf-open>.wf-btn-info.wf-dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.wf-btn-info:active:hover,.wf-btn-info:active:focus,.wf-btn-info:active.focus,.wf-btn-info.active:hover,.wf-btn-info.active:focus,.wf-btn-info.active.focus,.wf-open>.wf-btn-info.wf-dropdown-toggle:hover,.wf-open>.wf-btn-info.wf-dropdown-toggle:focus,.wf-open>.wf-btn-info.wf-dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.wf-btn-info:active,.wf-btn-info.wf-active,.wf-open>.wf-btn-info.wf-dropdown-toggle{background-image:none}.wf-btn-info.wf-disabled:hover,.wf-btn-info.wf-disabled:focus,.wf-btn-info.wf-disabled.wf-focus,.wf-btn-info[disabled]:hover,.wf-btn-info[disabled]:focus,.wf-btn-info[disabled].wf-focus,fieldset[disabled] .wf-btn-info:hover,fieldset[disabled] .wf-btn-info:focus,fieldset[disabled] .wf-btn-info.wf-focus{background-color:#5bc0de;border-color:#46b8da}.wf-btn-info .wf-badge{color:#5bc0de;background-color:#fff}.wf-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.wf-btn-warning:focus,.wf-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.wf-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.wf-btn-warning:active,.wf-btn-warning.active,.wf-open>.wf-btn-warning.wf-dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.wf-btn-warning:active:hover,.wf-btn-warning:active:focus,.wf-btn-warning:active.focus,.wf-btn-warning.active:hover,.wf-btn-warning.active:focus,.wf-btn-warning.active.focus,.wf-open>.wf-btn-warning.wf-dropdown-toggle:hover,.wf-open>.wf-btn-warning.wf-dropdown-toggle:focus,.wf-open>.wf-btn-warning.wf-dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.wf-btn-warning:active,.wf-btn-warning.wf-active,.wf-open>.wf-btn-warning.wf-dropdown-toggle{background-image:none}.wf-btn-warning.wf-disabled:hover,.wf-btn-warning.wf-disabled:focus,.wf-btn-warning.wf-disabled.wf-focus,.wf-btn-warning[disabled]:hover,.wf-btn-warning[disabled]:focus,.wf-btn-warning[disabled].wf-focus,fieldset[disabled] .wf-btn-warning:hover,fieldset[disabled] .wf-btn-warning:focus,fieldset[disabled] .wf-btn-warning.wf-focus{background-color:#f0ad4e;border-color:#eea236}.wf-btn-warning .wf-badge{color:#f0ad4e;background-color:#fff}.wf-btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.wf-btn-danger:focus,.wf-btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.wf-btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.wf-btn-danger:active,.wf-btn-danger.active,.wf-open>.wf-btn-danger.wf-dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#ac2925}.wf-btn-danger:active:hover,.wf-btn-danger:active:focus,.wf-btn-danger:active.focus,.wf-btn-danger.active:hover,.wf-btn-danger.active:focus,.wf-btn-danger.active.focus,.wf-open>.wf-btn-danger.wf-dropdown-toggle:hover,.wf-open>.wf-btn-danger.wf-dropdown-toggle:focus,.wf-open>.wf-btn-danger.wf-dropdown-toggle.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.wf-btn-danger:active,.wf-btn-danger.wf-active,.wf-open>.wf-btn-danger.wf-dropdown-toggle{background-image:none}.wf-btn-danger.wf-disabled:hover,.wf-btn-danger.wf-disabled:focus,.wf-btn-danger.wf-disabled.wf-focus,.wf-btn-danger[disabled]:hover,.wf-btn-danger[disabled]:focus,.wf-btn-danger[disabled].wf-focus,fieldset[disabled] .wf-btn-danger:hover,fieldset[disabled] .wf-btn-danger:focus,fieldset[disabled] .wf-btn-danger.wf-focus{background-color:#d9534f;border-color:#d43f3a}.wf-btn-danger .wf-badge{color:#d9534f;background-color:#fff}.wf-btn-callout{font-weight:bold;text-transform:uppercase}.wf-btn-link{color:#00709e;font-weight:normal;border-radius:0}.wf-btn-link,.wf-btn-link:active,.wf-btn-link.wf-active,.wf-btn-link[disabled],fieldset[disabled] .wf-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.wf-btn-link,.wf-btn-link:hover,.wf-btn-link:focus,.wf-btn-link:active{border-color:transparent}.wf-btn-link:hover,.wf-btn-link:focus{color:#003a52;text-decoration:underline;background-color:transparent}.wf-btn-link[disabled]:hover,.wf-btn-link[disabled]:focus,fieldset[disabled] .wf-btn-link:hover,fieldset[disabled] .wf-btn-link:focus{color:#777;text-decoration:none}.wf-btn-lg,.wf-btn-group-lg>.wf-btn{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wf-btn-sm,.wf-btn-group-sm>.wf-btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px;text-transform:none}.wf-btn-xs,.wf-btn-group-xs>.wf-btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px;text-transform:none}.wf-btn-block{display:block;width:100%}.wf-btn-block+.wf-btn-block{margin-top:5px}input[type="submit"].wf-btn-block,input[type="reset"].wf-btn-block,input[type="button"].wf-btn-block{width:100%}.wf-btn-group,.wf-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.wf-btn-group>.wf-btn,.wf-btn-group-vertical>.wf-btn{position:relative;float:left}.wf-btn-group>.wf-btn:hover,.wf-btn-group>.wf-btn:focus,.wf-btn-group>.wf-btn:active,.wf-btn-group>.wf-btn.wf-active,.wf-btn-group-vertical>.wf-btn:hover,.wf-btn-group-vertical>.wf-btn:focus,.wf-btn-group-vertical>.wf-btn:active,.wf-btn-group-vertical>.wf-btn.wf-active{z-index:2}.wf-btn-group .wf-btn+.wf-btn,.wf-btn-group .wf-btn+.wf-btn-group,.wf-btn-group .wf-btn-group+.wf-btn,.wf-btn-group .wf-btn-group+.wf-btn-group{margin-left:-1px}.wf-btn-toolbar{margin-left:-5px}.wf-btn-toolbar:before,.wf-btn-toolbar:after{content:" ";display:table}.wf-btn-toolbar:after{clear:both}.wf-btn-toolbar .wf-btn,.wf-btn-toolbar .wf-btn-group,.wf-btn-toolbar .wf-input-group{float:left}.wf-btn-toolbar>.wf-btn,.wf-btn-toolbar>.wf-btn-group,.wf-btn-toolbar>.wf-input-group{margin-left:5px}.wf-btn-group>.wf-btn:not(:first-child):not(:last-child):not(.wf-dropdown-toggle){border-radius:0}.wf-btn-group>.wf-btn:first-child{margin-left:0}.wf-btn-group>.wf-btn:first-child:not(:last-child):not(.wf-dropdown-toggle){-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group>.wf-btn:last-child:not(:first-child),.wf-btn-group>.wf-dropdown-toggle:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wf-btn-group>.wf-btn-group{float:left}.wf-btn-group>.wf-btn-group:not(:first-child):not(:last-child)>.wf-btn{border-radius:0}.wf-btn-group>.wf-btn-group:first-child:not(:last-child)>.wf-btn:last-child,.wf-btn-group>.wf-btn-group:first-child:not(:last-child)>.wf-dropdown-toggle{-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group>.wf-btn-group:last-child:not(:first-child)>.wf-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wf-btn-group .wf-dropdown-toggle:active,.wf-btn-group.wf-open .wf-dropdown-toggle{outline:0}.wf-btn-group>.wf-btn+.wf-dropdown-toggle{padding-left:8px;padding-right:8px}.wf-btn-group>.wf-btn-lg+.wf-dropdown-toggle,.wf-btn-group-lg.wf-btn-group>.wf-btn+.wf-dropdown-toggle{padding-left:12px;padding-right:12px}.wf-btn-group.open .wf-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wf-btn-group.open .wf-dropdown-toggle.wf-btn-link{-webkit-box-shadow:none;box-shadow:none}.wf-btn .wf-caret{margin-left:0}.wf-btn-lg .wf-caret,.wf-btn-group-lg>.wf-btn .wf-caret{border-width:5px 5px 0;border-bottom-width:0}.wf-dropup .wf-btn-lg .wf-caret,.wf-dropup .wf-btn-group-lg>.wf-btn .wf-caret{border-width:0 5px 5px}.wf-btn-group-vertical>.wf-btn,.wf-btn-group-vertical>.wf-btn-group,.wf-btn-group-vertical>.wf-btn-group>.wf-btn{display:block;float:none;width:100%;max-width:100%}.wf-btn-group-vertical>.wf-btn-group:before,.wf-btn-group-vertical>.wf-btn-group:after{content:" ";display:table}.wf-btn-group-vertical>.wf-btn-group:after{clear:both}.wf-btn-group-vertical>.wf-btn-group>.wf-btn{float:none}.wf-btn-group-vertical>.wf-btn+.wf-btn,.wf-btn-group-vertical>.wf-btn+.wf-btn-group,.wf-btn-group-vertical>.wf-btn-group+.wf-btn,.wf-btn-group-vertical>.wf-btn-group+.wf-btn-group{margin-top:-1px;margin-left:0}.wf-btn-group-vertical>.wf-btn:not(:first-child):not(:last-child){border-radius:0}.wf-btn-group-vertical>.wf-btn:first-child:not(:last-child){-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group-vertical>.wf-btn:last-child:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wf-btn-group-vertical>.wf-btn-group:not(:first-child):not(:last-child)>.wf-btn{border-radius:0}.wf-btn-group-vertical>.wf-btn-group:first-child:not(:last-child)>.wf-btn:last-child,.wf-btn-group-vertical>.wf-btn-group:first-child:not(:last-child)>.wf-dropdown-toggle{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group-vertical>.wf-btn-group:last-child:not(:first-child)>.wf-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wf-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.wf-btn-group-justified>.wf-btn,.wf-btn-group-justified>.wf-btn-group{float:none;display:table-cell;width:1%}.wf-btn-group-justified>.wf-btn-group .wf-btn{width:100%}.wf-btn-group-justified>.wf-btn-group .wf-dropdown-menu{left:auto}[data-toggle="buttons"]>.wf-btn input[type="radio"],[data-toggle="buttons"]>.wf-btn input[type="checkbox"],[data-toggle="buttons"]>.wf-btn-group>.wf-btn input[type="radio"],[data-toggle="buttons"]>.wf-btn-group>.wf-btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.wf-pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.wf-pagination>li{display:inline}.wf-pagination>li>a,.wf-pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857;text-decoration:none;color:#00709e;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.wf-pagination>li:first-child>a,.wf-pagination>li:first-child>span{margin-left:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.wf-pagination>li:last-child>a,.wf-pagination>li:last-child>span{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wf-pagination>li>a:hover,.wf-pagination>li>a:focus,.wf-pagination>li>span:hover,.wf-pagination>li>span:focus{z-index:2;color:#003a52;background-color:#e2e2e2;border-color:#ddd}.wf-pagination>.wf-active>a,.wf-pagination>.wf-active>a:hover,.wf-pagination>.wf-active>a:focus,.wf-pagination>.wf-active>span,.wf-pagination>.wf-active>span:hover,.wf-pagination>.wf-active>span:focus{z-index:3;color:#fff;background-color:#00709e;border-color:#00709e;cursor:default}.wf-pagination>.wf-disabled>span,.wf-pagination>.wf-disabled>span:hover,.wf-pagination>.wf-disabled>span:focus,.wf-pagination>.wf-disabled>a,.wf-pagination>.wf-disabled>a:hover,.wf-pagination>.wf-disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.wf-pagination-lg>li>a,.wf-pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33333}.wf-pagination-lg>li:first-child>a,.wf-pagination-lg>li:first-child>span{-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wf-pagination-lg>li:last-child>a,.wf-pagination-lg>li:last-child>span{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wf-pagination-sm>li>a,.wf-pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.wf-pagination-sm>li:first-child>a,.wf-pagination-sm>li:first-child>span{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.wf-pagination-sm>li:last-child>a,.wf-pagination-sm>li:last-child>span{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}#wf-adminbar-icon{float:left;width:20px;height:30px;background-image:url(../images/wordfence-logo-16x16.png);background-repeat:no-repeat;background-position:left center}#wpadminbar .wf-notification-counter{display:inline;background-color:inherit}#wpadminbar .wf-notification-counter span.wf-count{padding:1px 7px 1px 6px !important;border-radius:50%;color:#fff;background-color:#fcb214}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-submenu-title{-webkit-flex-grow:1;flex-grow:1}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-notification-counter{display:block}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status{width:1.25rem;font-size:1.25rem;text-align:center}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status-neutral{color:#9f9fa0}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status-good{color:#16bc9b}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status-bad{color:#ffd10a}#adminmenu .update-plugins.wf-menu-badge{background-color:#fcb214 !important}.wf-hidden{display:none !important}.wfpopover{position:fixed;top:0;left:0;z-index:106000;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.wfpopover.wf-top{margin-top:-10px}.wfpopover.wf-right{margin-left:10px}.wfpopover.wf-bottom{margin-top:10px}.wfpopover.wf-left{margin-left:-10px}.wfpopover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.wfpopover-content{padding:9px 14px}.wfpopover>.wf-arrow,.wfpopover>.wf-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.wfpopover>.wf-arrow{border-width:11px}.wfpopover>.wf-arrow:after{border-width:10px;content:""}.wfpopover.wf-top>.wf-arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.wfpopover.wf-top>.wf-arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.wfpopover.wf-right>.wf-arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.wfpopover.wf-right>.wf-arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.wfpopover.wf-bottom>.wf-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.wfpopover.wf-bottom>.wf-arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.wfpopover.wf-left>.wf-arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.wfpopover.wf-left>.wf-arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}
js/admin.js CHANGED
@@ -43,12 +43,14 @@
43
  serverMicrotime: 0,
44
  wfLiveTraffic: null,
45
  loadingBlockedIPs: false,
 
46
 
47
  init: function() {
48
  this.nonce = WordfenceAdminVars.firstNonce;
49
  this.debugOn = WordfenceAdminVars.debugOn == '1' ? true : false;
50
  this.tourClosed = WordfenceAdminVars.tourClosed == '1' ? true : false;
51
  this.welcomeClosed = WordfenceAdminVars.welcomeClosed == '1' ? true : false;
 
52
  var startTicker = false;
53
  var self = this;
54
 
@@ -99,6 +101,7 @@
99
  var tab = jQuery('#' + jQuery(this).attr('id').replace('-tab', ''));
100
  tab.addClass('active');
101
  jQuery('#wfHeading').html(tab.data('title'));
 
102
  self.sectionInit();
103
  });
104
  if (window.location.hash) {
@@ -235,7 +238,7 @@
235
  startTicker = true;
236
  if (this.needTour()) {
237
  this.tour('wfWelcomeContent3', 'wfHeading', 'top', 'left', "Learn about IP Blocking", function() {
238
- self.tourRedir('WordfenceWAF#top#blockedips');
239
  });
240
  }
241
  } else if (jQuery('#wordfenceMode_options:visible').length > 0) {
@@ -290,7 +293,7 @@
290
  this.doPasswdAuditUpdate();
291
  if (this.needTour()) {
292
  this.tour('wfWelcomePasswd', 'wfHeading', 'top', 'left', "Learn about Cellphone Sign-in", function() {
293
- self.tourRedir('WordfenceWAF#top#twofactor');
294
  });
295
  }
296
  } else if (jQuery('#wordfenceMode_twoFactor:visible').length > 0) {
@@ -298,7 +301,7 @@
298
  startTicker = true;
299
  if (this.needTour()) {
300
  this.tour('wfWelcomeTwoFactor', 'wfHeading', 'top', 'left', "Learn how to Block Countries", function() {
301
- self.tourRedir('WordfenceWAF#top#countryblocking');
302
  });
303
  }
304
  this.loadTwoFactor();
@@ -326,7 +329,7 @@
326
  startTicker = true;
327
  if (this.needTour()) {
328
  this.tour('wfWelcomeContentWhois', 'wfHeading', 'top', 'left', "Learn how to use Advanced Blocking", function() {
329
- self.tourRedir('WordfenceWAF#top#advancedblocking');
330
  });
331
  }
332
  this.calcRangeTotal();
@@ -424,7 +427,7 @@
424
  });
425
  },
426
  downgradeLicense: function() {
427
- this.colorbox('400px', "Confirm Downgrade", "Are you sure you want to downgrade your Wordfence Premium License? This will disable all Premium features and return you to the free version of Wordfence. <a href=\"https://www.wordfence.com/manage-wordfence-api-keys/\" target=\"_blank\">Click here to renew your paid membership</a> or click the button below to confirm you want to downgrade.<br /><br /><input type=\"button\" value=\"Downgrade and disable Premium features\" onclick=\"WFAD.downgradeLicenseConfirm();\" /><br />");
428
  },
429
  downgradeLicenseConfirm: function() {
430
  jQuery.colorbox.close();
@@ -440,7 +443,7 @@
440
  }
441
  var options = {
442
  buttons: function(event, t) {
443
- var buttonElem = jQuery('<div id="wfTourButCont"><a id="pointer-close" style="margin-left:5px" class="button-secondary">End the Tour</a></div><div><a id="wfRateLink" href="http://wordpress.org/extend/plugins/wordfence/" target="_blank" style="font-size: 10px; font-family: Verdana;">Help spread the word by rating us 5&#9733; on WordPress.org</a></div>');
444
  buttonElem.find('#pointer-close').bind('click.pointer', function(evtObj) {
445
  var evtSourceElem = evtObj.srcElement ? evtObj.srcElement : evtObj.target;
446
  if (evtSourceElem.id == 'wfRateLink') {
@@ -463,7 +466,7 @@
463
  };
464
  this.currentPointer = jQuery('#' + elemID).pointer(options).pointer('open');
465
  if (buttonLabel && buttonCallback) {
466
- jQuery('#pointer-close').after('<a id="pointer-primary" class="button-primary">' + buttonLabel + '</a>');
467
  jQuery('#pointer-primary').click(buttonCallback);
468
  }
469
 
@@ -939,7 +942,7 @@
939
  if (res.issuesLists[issueStatus].length < 1) {
940
  if (issueStatus == 'new') {
941
  if (res.lastScanCompleted == 'ok') {
942
- jQuery('#' + containerID).html('<p style="font-size: 20px; color: #0A0;">Congratulations! No security problems were detected by Wordfence.</p>');
943
  } else if (res['lastScanCompleted']) {
944
  //jQuery('#' + containerID).html('<p style="font-size: 12px; color: #A00;">The latest scan failed: ' + res.lastScanCompleted + '</p>');
945
  } else {
@@ -1135,9 +1138,9 @@
1135
  return;
1136
  }
1137
  if (op == 'del') {
1138
- this.colorbox('400px', "Are you sure you want to delete?", "Are you sure you want to delete a total of " + ids.length + " files? Do not delete files on your system unless you're ABSOLUTELY sure you know what you're doing. If you delete the wrong file it could cause your WordPress website to stop functioning and you will probably have to restore from backups. If you're unsure, Cancel and work with your hosting provider to clean your system of infected files.<br /><br /><input type=\"button\" value=\"Delete Files\" onclick=\"WFAD.bulkOperationConfirmed('" + op + "');\" />&nbsp;&nbsp;<input type=\"button\" value=\"Cancel\" onclick=\"jQuery.colorbox.close();\" /><br />");
1139
  } else if (op == 'repair') {
1140
- this.colorbox('400px', "Are you sure you want to repair?", "Are you sure you want to repair a total of " + ids.length + " files? Do not repair files on your system unless you're sure you have reviewed the differences between the original file and your version of the file in the files you are repairing. If you repair a file that has been customized for your system by a developer or your hosting provider it may leave your system unusable. If you're unsure, Cancel and work with your hosting provider to clean your system of infected files.<br /><br /><input type=\"button\" value=\"Repair Files\" onclick=\"WFAD.bulkOperationConfirmed('" + op + "');\" />&nbsp;&nbsp;<input type=\"button\" value=\"Cancel\" onclick=\"jQuery.colorbox.close();\" /><br />");
1141
  }
1142
  } else {
1143
  return;
@@ -1241,7 +1244,7 @@
1241
  if (res.ok) {
1242
  self.colorbox("400px", title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
1243
  + '<br/>'
1244
- + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wfFPDNextBut\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a><br /><br /><input type="button" name="but1" id="wfFPDNextBut" value="Click to fix .htaccess" disabled="disabled" onclick="WFAD.fixFPD_WriteHtAccess(' + issueID + ');" />');
1245
  } else if (res.nginx) {
1246
  self.colorbox("400px", title, 'You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually modify your php.ini to disable <em>display_error</em>');
1247
  } else if (res.err) {
@@ -1274,7 +1277,7 @@
1274
  self.colorbox("400px", title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
1275
  + '<br/>'
1276
  + '<a id="dlButton" href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '">Click here to download a backup copy of your .htaccess file now</a>'
1277
- + '<br /><br /><input type="button" name="but1" id="wfFPDNextBut" value="Click to fix .htaccess" disabled="disabled" />'
1278
  );
1279
  jQuery('#dlButton').click('click', function() {
1280
  jQuery('#wfFPDNextBut').prop('disabled', false);
@@ -1350,7 +1353,7 @@
1350
  + '<br/>'
1351
  + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wf-htaccess-confirm\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a>' +
1352
  '<br /><br />' +
1353
- '<button class="button" type="button" id="wf-htaccess-confirm" disabled="disabled" onclick="WFAD.confirmDisableDirectoryListing(' + issueID + ');">Add code to .htaccess</button>');
1354
  } else if (res.nginx) {
1355
  self.colorbox('400px', "You are using Nginx as your web server. " +
1356
  "You'll need to disable autoindexing in your nginx.conf. " +
@@ -1404,7 +1407,7 @@
1404
  } else {
1405
  return;
1406
  }
1407
- this.colorbox('450px', head, body + '<br /><br /><center><input type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />&nbsp;&nbsp;&nbsp;<input type="button" name="but2" value="Yes I\'m sure" onclick="jQuery.colorbox.close(); WFAD.confirmUpdateAllIssues(\'' + op + '\');" /><br />');
1408
  },
1409
  confirmUpdateAllIssues: function(op) {
1410
  var self = this;
@@ -1457,7 +1460,7 @@
1457
  });
1458
  },
1459
  emailActivityLog: function() {
1460
- this.colorbox('400px', 'Email Wordfence Activity Log', "Enter the email address you would like to send the Wordfence activity log to. Note that the activity log may contain thousands of lines of data. This log is usually only sent to a member of the Wordfence support team. It also contains your PHP configuration from the phpinfo() function for diagnostic data.<br /><br /><input type='text' value='wftest@wordfence.com' size='20' id='wfALogRecip' /><input type='button' value='Send' onclick=\"WFAD.completeEmailActivityLog();\" /><input type='button' value='Cancel' onclick='jQuery.colorbox.close();' /><br /><br />");
1461
  },
1462
  completeEmailActivityLog: function() {
1463
  jQuery.colorbox.close();
@@ -1469,7 +1472,7 @@
1469
  var self = this;
1470
  this.ajax('wordfence_sendActivityLog', {email: jQuery('#wfALogRecip').val()}, function(res) {
1471
  if (res.ok) {
1472
- self.colorbox('400px', 'Activity Log Sent', "Your Wordfence activity log was sent to " + email + "<br /><br /><input type='button' value='Close' onclick='jQuery.colorbox.close();' /><br /><br />");
1473
  }
1474
  });
1475
  },
@@ -1855,7 +1858,7 @@
1855
  var ip2num = self.inet_aton(ips[1]);
1856
  totalIPs = ip2num - ip1num + 1;
1857
  }
1858
- return "<a href=\"admin.php?page=WordfenceWAF&wfBlockRange=" + ipRange + "#top#advancedblocking\"" + redStyle + ">" + ipRange + " [" + (!isNaN(totalIPs) ? "<strong>" + totalIPs + "</strong> addresses in this network. " : "") + "Click to block this network]<\/a>";
1859
  }
1860
 
1861
  function buildRangeLink2(str, octet1, octet2, octet3, octet4, cidrRange) {
@@ -1874,7 +1877,7 @@
1874
  rangeEndNum = rangeEndNum >>> 0;
1875
  var ipRange = self.inet_ntoa(rangeStartNum) + '-' + self.inet_ntoa(rangeEndNum);
1876
  var totalIPs = rangeEndNum - rangeStartNum;
1877
- return "<a href=\"admin.php?page=WordfenceWAF&wfBlockRange=" + ipRange + "#top#advancedblocking\"" + redStyle + ">" + ipRange + " [" + (!isNaN(totalIPs) ? "<strong>" + totalIPs + "</strong> addresses in this network. " : "") + "Click to block this network]<\/a>";
1878
  }
1879
  return str;
1880
  }
@@ -2028,10 +2031,10 @@
2028
  jQuery('.wfAjax24').hide();
2029
  if (res.ok) {
2030
  if (res['paidKeyMsg']) {
2031
- self.colorbox('400px', "Congratulations! You have been upgraded to Premium Scanning.", "You have upgraded to a Premium API key. Once this page reloads, you can choose which premium scanning options you would like to enable and then click save. Click the button below to reload this page now.<br /><br /><center><input type='button' name='wfReload' value='Reload page and enable Premium options' onclick='window.location.reload(true);' /></center>");
2032
  return;
2033
  } else if (res['reload'] == 'reload' || WFAD.reloadConfigPage) {
2034
- self.colorbox('400px', "Please reload this page", "You selected a config option that requires a page reload. Click the button below to reload this page to update the menu.<br /><br /><center><input type='button' name='wfReload' value='Reload page' onclick='window.location.reload(true);' /></center>");
2035
  return;
2036
  } else {
2037
  self.pulse('.wfSavedMsg');
@@ -2101,8 +2104,8 @@
2101
  return;
2102
  }
2103
  this.colorbox('450px', "Please confirm", body +
2104
- '<br /><br /><center><input type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />&nbsp;&nbsp;&nbsp;' +
2105
- '<input type="button" name="but2" value="Yes I\'m sure" onclick="jQuery.colorbox.close(); WFAD.confirmClearAllBlocked(\'' + op + '\');"><br />');
2106
  },
2107
  confirmClearAllBlocked: function(op) {
2108
  var self = this;
@@ -2168,7 +2171,7 @@
2168
  this.countryCodesToSave = codesArr.join(',');
2169
  if (ownCountryBlocked) {
2170
  this.colorbox('400px', "Please confirm blocking yourself", "You are about to block your own country. This could lead to you being locked out. Please make sure that your user profile on this machine has a current and valid email address and make sure you know what it is. That way if you are locked out, you can send yourself an unlock email. If you're sure you want to block your own country, click 'Confirm' below, otherwise click 'Cancel'.<br />" +
2171
- '<input type="button" name="but1" value="Confirm" onclick="jQuery.colorbox.close(); WFAD.confirmSaveCountryBlocking();" />&nbsp;<input type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />');
2172
  } else {
2173
  this.confirmSaveCountryBlocking();
2174
  }
@@ -2327,7 +2330,7 @@
2327
 
2328
  message = message + "</ul>";
2329
 
2330
- message = message + "<p class=\"wf-center\"><a href=\"#\" class=\"button\" id=\"wfTwoFactorDownload\" target=\"_blank\"><i class=\"dashicons dashicons-download\"></i> Download</a></p>";
2331
  }
2332
 
2333
  message = message + "<p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
@@ -2357,7 +2360,7 @@
2357
  recoveryCodeFileContents = recoveryCodeFileContents + chunks[0] + " " + chunks[1] + " " + chunks[2] + " " + chunks[3] + "\r\n";
2358
  }
2359
 
2360
- message = message + "<p class=\"wf-center\"><a href=\"#\" class=\"button\" id=\"wfTwoFactorDownload\" target=\"_blank\"><i class=\"dashicons dashicons-download\"></i> Download</a></p>";
2361
 
2362
  message = message + "</ul><p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
2363
 
@@ -2539,7 +2542,7 @@
2539
  var self = this;
2540
  this.ajax('wordfence_importSettings', {token: token}, function(res) {
2541
  if (res.ok) {
2542
- self.colorbox('400px', "Import Successful", "You successfully imported " + res.totalSet + " options. Your import is complete. Please reload this page or click the button below to reload it:<br /><br /><input type=\"button\" value=\"Reload Page\" onclick=\"window.location.reload(true);\" />");
2543
  } else if (res.err) {
2544
  self.colorbox('400px', "Error during Import", res.err);
2545
  } else {
@@ -2810,7 +2813,7 @@
2810
  + '<br/>'
2811
  + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wf-htaccess-confirm\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a>' +
2812
  '<br /><br />' +
2813
- '<button class="button" type="button" id="wf-htaccess-confirm" disabled="disabled" onclick="WFAD.confirmWAFConfigureAutoPrepend();">Add code to .htaccess</button>');
2814
  },
2815
 
2816
  confirmWAFConfigureAutoPrepend: function() {
43
  serverMicrotime: 0,
44
  wfLiveTraffic: null,
45
  loadingBlockedIPs: false,
46
+ basePageName: '',
47
 
48
  init: function() {
49
  this.nonce = WordfenceAdminVars.firstNonce;
50
  this.debugOn = WordfenceAdminVars.debugOn == '1' ? true : false;
51
  this.tourClosed = WordfenceAdminVars.tourClosed == '1' ? true : false;
52
  this.welcomeClosed = WordfenceAdminVars.welcomeClosed == '1' ? true : false;
53
+ this.basePageName = document.title;
54
  var startTicker = false;
55
  var self = this;
56
 
101
  var tab = jQuery('#' + jQuery(this).attr('id').replace('-tab', ''));
102
  tab.addClass('active');
103
  jQuery('#wfHeading').html(tab.data('title'));
104
+ document.title = tab.data('title') + " \u2039 " + self.basePageName;
105
  self.sectionInit();
106
  });
107
  if (window.location.hash) {
238
  startTicker = true;
239
  if (this.needTour()) {
240
  this.tour('wfWelcomeContent3', 'wfHeading', 'top', 'left', "Learn about IP Blocking", function() {
241
+ self.tourRedir('WordfenceBlocking#top#blockedips');
242
  });
243
  }
244
  } else if (jQuery('#wordfenceMode_options:visible').length > 0) {
293
  this.doPasswdAuditUpdate();
294
  if (this.needTour()) {
295
  this.tour('wfWelcomePasswd', 'wfHeading', 'top', 'left', "Learn about Cellphone Sign-in", function() {
296
+ self.tourRedir('WordfenceTools#top#twofactor');
297
  });
298
  }
299
  } else if (jQuery('#wordfenceMode_twoFactor:visible').length > 0) {
301
  startTicker = true;
302
  if (this.needTour()) {
303
  this.tour('wfWelcomeTwoFactor', 'wfHeading', 'top', 'left', "Learn how to Block Countries", function() {
304
+ self.tourRedir('WordfenceBlocking#top#countryblocking');
305
  });
306
  }
307
  this.loadTwoFactor();
329
  startTicker = true;
330
  if (this.needTour()) {
331
  this.tour('wfWelcomeContentWhois', 'wfHeading', 'top', 'left', "Learn how to use Advanced Blocking", function() {
332
+ self.tourRedir('WordfenceBlocking#top#advancedblocking');
333
  });
334
  }
335
  this.calcRangeTotal();
427
  });
428
  },
429
  downgradeLicense: function() {
430
+ this.colorbox('400px', "Confirm Downgrade", "Are you sure you want to downgrade your Wordfence Premium License? This will disable all Premium features and return you to the free version of Wordfence. <a href=\"https://www.wordfence.com/manage-wordfence-api-keys/\" target=\"_blank\">Click here to renew your paid membership</a> or click the button below to confirm you want to downgrade.<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Downgrade and disable Premium features\" onclick=\"WFAD.downgradeLicenseConfirm();\" /><br />");
431
  },
432
  downgradeLicenseConfirm: function() {
433
  jQuery.colorbox.close();
443
  }
444
  var options = {
445
  buttons: function(event, t) {
446
+ var buttonElem = jQuery('<div id="wfTourButCont"><a id="pointer-close" style="margin-left:5px" class="wf-btn wf-btn-default">End the Tour</a></div><div><a id="wfRateLink" href="http://wordpress.org/extend/plugins/wordfence/" target="_blank" style="font-size: 10px; font-family: Verdana;">Help spread the word by rating us 5&#9733; on WordPress.org</a></div>');
447
  buttonElem.find('#pointer-close').bind('click.pointer', function(evtObj) {
448
  var evtSourceElem = evtObj.srcElement ? evtObj.srcElement : evtObj.target;
449
  if (evtSourceElem.id == 'wfRateLink') {
466
  };
467
  this.currentPointer = jQuery('#' + elemID).pointer(options).pointer('open');
468
  if (buttonLabel && buttonCallback) {
469
+ jQuery('#pointer-close').after('<a id="pointer-primary" class="wf-btn wf-btn-primary">' + buttonLabel + '</a>');
470
  jQuery('#pointer-primary').click(buttonCallback);
471
  }
472
 
942
  if (res.issuesLists[issueStatus].length < 1) {
943
  if (issueStatus == 'new') {
944
  if (res.lastScanCompleted == 'ok') {
945
+ jQuery('#' + containerID).html('<p class="wf-scan-no-issues">Congratulations! No security problems were detected by Wordfence.</p>');
946
  } else if (res['lastScanCompleted']) {
947
  //jQuery('#' + containerID).html('<p style="font-size: 12px; color: #A00;">The latest scan failed: ' + res.lastScanCompleted + '</p>');
948
  } else {
1138
  return;
1139
  }
1140
  if (op == 'del') {
1141
+ this.colorbox('400px', "Are you sure you want to delete?", "Are you sure you want to delete a total of " + ids.length + " files? Do not delete files on your system unless you're ABSOLUTELY sure you know what you're doing. If you delete the wrong file it could cause your WordPress website to stop functioning and you will probably have to restore from backups. If you're unsure, Cancel and work with your hosting provider to clean your system of infected files.<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Delete Files\" onclick=\"WFAD.bulkOperationConfirmed('" + op + "');\" />&nbsp;&nbsp;<input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Cancel\" onclick=\"jQuery.colorbox.close();\" /><br />");
1142
  } else if (op == 'repair') {
1143
+ this.colorbox('400px', "Are you sure you want to repair?", "Are you sure you want to repair a total of " + ids.length + " files? Do not repair files on your system unless you're sure you have reviewed the differences between the original file and your version of the file in the files you are repairing. If you repair a file that has been customized for your system by a developer or your hosting provider it may leave your system unusable. If you're unsure, Cancel and work with your hosting provider to clean your system of infected files.<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Repair Files\" onclick=\"WFAD.bulkOperationConfirmed('" + op + "');\" />&nbsp;&nbsp;<input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Cancel\" onclick=\"jQuery.colorbox.close();\" /><br />");
1144
  }
1145
  } else {
1146
  return;
1244
  if (res.ok) {
1245
  self.colorbox("400px", title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
1246
  + '<br/>'
1247
+ + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wfFPDNextBut\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a><br /><br /><input type="button" class="wf-btn wf-btn-default" name="but1" id="wfFPDNextBut" value="Click to fix .htaccess" disabled="disabled" onclick="WFAD.fixFPD_WriteHtAccess(' + issueID + ');" />');
1248
  } else if (res.nginx) {
1249
  self.colorbox("400px", title, 'You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually modify your php.ini to disable <em>display_error</em>');
1250
  } else if (res.err) {
1277
  self.colorbox("400px", title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
1278
  + '<br/>'
1279
  + '<a id="dlButton" href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '">Click here to download a backup copy of your .htaccess file now</a>'
1280
+ + '<br /><br /><input type="button" class="wf-btn wf-btn-default" name="but1" id="wfFPDNextBut" value="Click to fix .htaccess" disabled="disabled" />'
1281
  );
1282
  jQuery('#dlButton').click('click', function() {
1283
  jQuery('#wfFPDNextBut').prop('disabled', false);
1353
  + '<br/>'
1354
  + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wf-htaccess-confirm\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a>' +
1355
  '<br /><br />' +
1356
+ '<button class="wf-btn wf-btn-default" type="button" id="wf-htaccess-confirm" disabled="disabled" onclick="WFAD.confirmDisableDirectoryListing(' + issueID + ');">Add code to .htaccess</button>');
1357
  } else if (res.nginx) {
1358
  self.colorbox('400px', "You are using Nginx as your web server. " +
1359
  "You'll need to disable autoindexing in your nginx.conf. " +
1407
  } else {
1408
  return;
1409
  }
1410
+ this.colorbox('450px', head, body + '<br /><br /><center><input class="wf-btn wf-btn-default" type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />&nbsp;&nbsp;&nbsp;<input class="wf-btn wf-btn-default" type="button" name="but2" value="Yes I\'m sure" onclick="jQuery.colorbox.close(); WFAD.confirmUpdateAllIssues(\'' + op + '\');" /><br />');
1411
  },
1412
  confirmUpdateAllIssues: function(op) {
1413
  var self = this;
1460
  });
1461
  },
1462
  emailActivityLog: function() {
1463
+ this.colorbox('400px', 'Email Wordfence Activity Log', "Enter the email address you would like to send the Wordfence activity log to. Note that the activity log may contain thousands of lines of data. This log is usually only sent to a member of the Wordfence support team. It also contains your PHP configuration from the phpinfo() function for diagnostic data.<br /><br /><input type='text' value='wftest@wordfence.com' size='20' id='wfALogRecip' /><input class='wf-btn wf-btn-default' type='button' value='Send' onclick=\"WFAD.completeEmailActivityLog();\" /><input class='wf-btn wf-btn-default' type='button' value='Cancel' onclick='jQuery.colorbox.close();' /><br /><br />");
1464
  },
1465
  completeEmailActivityLog: function() {
1466
  jQuery.colorbox.close();
1472
  var self = this;
1473
  this.ajax('wordfence_sendActivityLog', {email: jQuery('#wfALogRecip').val()}, function(res) {
1474
  if (res.ok) {
1475
+ self.colorbox('400px', 'Activity Log Sent', "Your Wordfence activity log was sent to " + email + "<br /><br /><input class='wf-btn wf-btn-default' type='button' value='Close' onclick='jQuery.colorbox.close();' /><br /><br />");
1476
  }
1477
  });
1478
  },
1858
  var ip2num = self.inet_aton(ips[1]);
1859
  totalIPs = ip2num - ip1num + 1;
1860
  }
1861
+ return "<a href=\"admin.php?page=WordfenceBlocking&wfBlockRange=" + ipRange + "#top#advancedblocking\"" + redStyle + ">" + ipRange + " [" + (!isNaN(totalIPs) ? "<strong>" + totalIPs + "</strong> addresses in this network. " : "") + "Click to block this network]<\/a>";
1862
  }
1863
 
1864
  function buildRangeLink2(str, octet1, octet2, octet3, octet4, cidrRange) {
1877
  rangeEndNum = rangeEndNum >>> 0;
1878
  var ipRange = self.inet_ntoa(rangeStartNum) + '-' + self.inet_ntoa(rangeEndNum);
1879
  var totalIPs = rangeEndNum - rangeStartNum;
1880
+ return "<a href=\"admin.php?page=WordfenceBlocking&wfBlockRange=" + ipRange + "#top#advancedblocking\"" + redStyle + ">" + ipRange + " [" + (!isNaN(totalIPs) ? "<strong>" + totalIPs + "</strong> addresses in this network. " : "") + "Click to block this network]<\/a>";
1881
  }
1882
  return str;
1883
  }
2031
  jQuery('.wfAjax24').hide();
2032
  if (res.ok) {
2033
  if (res['paidKeyMsg']) {
2034
+ self.colorbox('400px', "Congratulations! You have been upgraded to Premium Scanning.", "You have upgraded to a Premium API key. Once this page reloads, you can choose which premium scanning options you would like to enable and then click save. Click the button below to reload this page now.<br /><br /><center><input class='wf-btn wf-btn-default' type='button' name='wfReload' value='Reload page and enable Premium options' onclick='window.location.reload(true);' /></center>");
2035
  return;
2036
  } else if (res['reload'] == 'reload' || WFAD.reloadConfigPage) {
2037
+ self.colorbox('400px', "Please reload this page", "You selected a config option that requires a page reload. Click the button below to reload this page to update the menu.<br /><br /><center><input class='wf-btn wf-btn-default' type='button' name='wfReload' value='Reload page' onclick='window.location.reload(true);' /></center>");
2038
  return;
2039
  } else {
2040
  self.pulse('.wfSavedMsg');
2104
  return;
2105
  }
2106
  this.colorbox('450px', "Please confirm", body +
2107
+ '<br /><br /><center><input class="wf-btn wf-btn-default" type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />&nbsp;&nbsp;&nbsp;' +
2108
+ '<input class="wf-btn wf-btn-default" type="button" name="but2" value="Yes I\'m sure" onclick="jQuery.colorbox.close(); WFAD.confirmClearAllBlocked(\'' + op + '\');"><br />');
2109
  },
2110
  confirmClearAllBlocked: function(op) {
2111
  var self = this;
2171
  this.countryCodesToSave = codesArr.join(',');
2172
  if (ownCountryBlocked) {
2173
  this.colorbox('400px', "Please confirm blocking yourself", "You are about to block your own country. This could lead to you being locked out. Please make sure that your user profile on this machine has a current and valid email address and make sure you know what it is. That way if you are locked out, you can send yourself an unlock email. If you're sure you want to block your own country, click 'Confirm' below, otherwise click 'Cancel'.<br />" +
2174
+ '<input class="wf-btn wf-btn-default" type="button" name="but1" value="Confirm" onclick="jQuery.colorbox.close(); WFAD.confirmSaveCountryBlocking();" />&nbsp;<input class="wf-btn wf-btn-default" type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" />');
2175
  } else {
2176
  this.confirmSaveCountryBlocking();
2177
  }
2330
 
2331
  message = message + "</ul>";
2332
 
2333
+ message = message + "<p class=\"wf-center\"><a href=\"#\" class=\"wf-btn wf-btn-default\" id=\"wfTwoFactorDownload\" target=\"_blank\"><i class=\"dashicons dashicons-download\"></i> Download</a></p>";
2334
  }
2335
 
2336
  message = message + "<p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
2360
  recoveryCodeFileContents = recoveryCodeFileContents + chunks[0] + " " + chunks[1] + " " + chunks[2] + " " + chunks[3] + "\r\n";
2361
  }
2362
 
2363
+ message = message + "<p class=\"wf-center\"><a href=\"#\" class=\"wf-btn wf-btn-default\" id=\"wfTwoFactorDownload\" target=\"_blank\"><i class=\"dashicons dashicons-download\"></i> Download</a></p>";
2364
 
2365
  message = message + "</ul><p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
2366
 
2542
  var self = this;
2543
  this.ajax('wordfence_importSettings', {token: token}, function(res) {
2544
  if (res.ok) {
2545
+ self.colorbox('400px', "Import Successful", "You successfully imported " + res.totalSet + " options. Your import is complete. Please reload this page or click the button below to reload it:<br /><br /><input class=\"wf-btn wf-btn-default\" type=\"button\" value=\"Reload Page\" onclick=\"window.location.reload(true);\" />");
2546
  } else if (res.err) {
2547
  self.colorbox('400px', "Error during Import", res.err);
2548
  } else {
2813
  + '<br/>'
2814
  + '<a href="' + WordfenceAdminVars.ajaxURL + '?action=wordfence_downloadHtaccess&nonce=' + self.nonce + '" onclick="jQuery(\'#wf-htaccess-confirm\').prop(\'disabled\', false); return true;">Click here to download a backup copy of your .htaccess file now</a>' +
2815
  '<br /><br />' +
2816
+ '<button class="wf-btn wf-btn-default" type="button" id="wf-htaccess-confirm" disabled="disabled" onclick="WFAD.confirmWAFConfigureAutoPrepend();">Add code to .htaccess</button>');
2817
  },
2818
 
2819
  confirmWAFConfigureAutoPrepend: function() {
lib/dashboard/widget_countries.php CHANGED
@@ -5,7 +5,7 @@
5
  <div class="wf-dashboard-item-inner">
6
  <div class="wf-dashboard-item-content">
7
  <div class="wf-dashboard-item-title">
8
- <strong>Top Countries by Number of Attacks</strong>
9
  </div>
10
  <div class="wf-dashboard-item-action"><div class="wf-dashboard-item-action-disclosure"></div></div>
11
  </div>
@@ -33,7 +33,7 @@
33
  <?php if (count($d->countriesNetwork) == 0): ?>
34
  <div class="wf-dashboard-item-list-text"><p><em>No blocks have been recorded.</em></p></div>
35
  <?php else: ?>
36
- <?php //$data = array_slice($d->loginsFail, 0, min(10, count($d->loginsFail)), true); include(dirname(__FILE__) . '/widget_content_logins.php'); ?>
37
  <?php endif; ?>
38
  </div>
39
  <script type="application/javascript">
5
  <div class="wf-dashboard-item-inner">
6
  <div class="wf-dashboard-item-content">
7
  <div class="wf-dashboard-item-title">
8
+ <strong>Top Countries by Number of Attacks - Last 7 Days</strong>
9
  </div>
10
  <div class="wf-dashboard-item-action"><div class="wf-dashboard-item-action-disclosure"></div></div>
11
  </div>
33
  <?php if (count($d->countriesNetwork) == 0): ?>
34
  <div class="wf-dashboard-item-list-text"><p><em>No blocks have been recorded.</em></p></div>
35
  <?php else: ?>
36
+ <?php $data = array_slice($d->countriesNetwork, 0, min(10, count($d->countriesNetwork)), true); include(dirname(__FILE__) . '/widget_content_countries.php'); ?>
37
  <?php endif; ?>
38
  </div>
39
  <script type="application/javascript">
lib/dashboard/widget_ips.php CHANGED
@@ -1,4 +1,9 @@
1
- <?php //$d is defined here as a wfDashboard instance ?>
 
 
 
 
 
2
  <div class="wf-row">
3
  <div class="wf-col-xs-12">
4
  <div class="wf-dashboard-item active">
@@ -25,21 +30,30 @@
25
  <?php if (count($d->ips24h) == 0): ?>
26
  <div class="wf-dashboard-item-list-text"><p><em>No blocks have been recorded.</em></p></div>
27
  <?php else: ?>
28
- <?php $data = array_slice($d->ips24h, 0, min(10, count($d->ips24h)), true); include(dirname(__FILE__) . '/widget_content_ips.php'); ?>
 
 
 
29
  <?php endif; ?>
30
  </div>
31
  <div class="wf-ips wf-ips-7d wf-hidden">
32
  <?php if (count($d->ips7d) == 0): ?>
33
  <div class="wf-dashboard-item-list-text"><p><em>No blocks have been recorded.</em></p></div>
34
  <?php else: ?>
35
- <?php $data = array_slice($d->ips7d, 0, min(10, count($d->ips7d)), true); include(dirname(__FILE__) . '/widget_content_ips.php'); ?>
 
 
 
36
  <?php endif; ?>
37
  </div>
38
  <div class="wf-ips wf-ips-30d wf-hidden">
39
  <?php if (count($d->ips30d) == 0): ?>
40
  <div class="wf-dashboard-item-list-text"><p><em>No blocks have been recorded.</em></p></div>
41
  <?php else: ?>
42
- <?php $data = array_slice($d->ips30d, 0, min(10, count($d->ips30d)), true); include(dirname(__FILE__) . '/widget_content_ips.php'); ?>
 
 
 
43
  <?php endif; ?>
44
  </div>
45
  <script type="application/javascript">
@@ -54,6 +68,32 @@
54
  $('.wf-ips').addClass('wf-hidden');
55
  $('.wf-ips-' + $(this).data('grouping')).removeClass('wf-hidden');
56
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  })(jQuery);
58
  </script>
59
  </div>
@@ -62,4 +102,25 @@
62
  </div>
63
  </div>
64
  </div>
65
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ //$d is defined here as a wfDashboard instance
3
+
4
+ $initial = false;
5
+ if (!isset($limit)) { $limit = 10; $initial = true; }
6
+ ?>
7
  <div class="wf-row">
8
  <div class="wf-col-xs-12">
9
  <div class="wf-dashboard-item active">
30
  <?php if (count($d->ips24h) == 0): ?>
31
  <div class="wf-dashboard-item-list-text"><p><em>No blocks have been recorded.</em></p></div>
32
  <?php else: ?>
33
+ <?php $data = array_slice($d->ips24h, 0, min($limit, count($d->ips24h)), true); include(dirname(__FILE__) . '/widget_content_ips.php'); ?>
34
+ <?php if (count($d->ips24h) > $limit && $initial): ?>
35
+ <div class="wf-dashboard-item-list-text"><div class="wf-dashboard-show-more" data-grouping="ips" data-period="24h"><a href="#">Show more</a></div></div>
36
+ <?php endif; ?>
37
  <?php endif; ?>
38
  </div>
39
  <div class="wf-ips wf-ips-7d wf-hidden">
40
  <?php if (count($d->ips7d) == 0): ?>
41
  <div class="wf-dashboard-item-list-text"><p><em>No blocks have been recorded.</em></p></div>
42
  <?php else: ?>
43
+ <?php $data = array_slice($d->ips7d, 0, min($limit, count($d->ips7d)), true); include(dirname(__FILE__) . '/widget_content_ips.php'); ?>
44
+ <?php if (count($d->ips7d) > $limit && $initial): ?>
45
+ <div class="wf-dashboard-item-list-text"><div class="wf-dashboard-show-more" data-grouping="ips" data-period="7d"><a href="#">Show more</a></div></div>
46
+ <?php endif; ?>
47
  <?php endif; ?>
48
  </div>
49
  <div class="wf-ips wf-ips-30d wf-hidden">
50
  <?php if (count($d->ips30d) == 0): ?>
51
  <div class="wf-dashboard-item-list-text"><p><em>No blocks have been recorded.</em></p></div>
52
  <?php else: ?>
53
+ <?php $data = array_slice($d->ips30d, 0, min($limit, count($d->ips30d)), true); include(dirname(__FILE__) . '/widget_content_ips.php'); ?>
54
+ <?php if (count($d->ips30d) > $limit && $initial): ?>
55
+ <div class="wf-dashboard-item-list-text"><div class="wf-dashboard-show-more" data-grouping="ips" data-period="30d"><a href="#">Show more</a></div></div>
56
+ <?php endif; ?>
57
  <?php endif; ?>
58
  </div>
59
  <script type="application/javascript">
68
  $('.wf-ips').addClass('wf-hidden');
69
  $('.wf-ips-' + $(this).data('grouping')).removeClass('wf-hidden');
70
  });
71
+
72
+ $('.wf-ips .wf-dashboard-show-more a').on('click', function(e) {
73
+ e.preventDefault();
74
+ e.stopPropagation();
75
+
76
+ var grouping = $(this).parent().data('grouping');
77
+ var period = $(this).parent().data('period');
78
+
79
+ $(this).closest('.wf-dashboard-item-list-text').fadeOut();
80
+
81
+ var self = this;
82
+ WFAD.ajax('wordfence_dashboardShowMore', {
83
+ grouping: grouping,
84
+ period: period
85
+ }, function(res) {
86
+ if (res.ok) {
87
+ var table = $('#ips-data-template').tmpl(res);
88
+ $(self).closest('.wf-ips').css('overflow-y', 'auto');
89
+ $(self).closest('.wf-ips').find('table').replaceWith(table);
90
+ }
91
+ else {
92
+ WFAD.colorbox('400px', 'An error occurred', 'We encountered an error trying load more data.');
93
+ $(this).closest('.wf-dashboard-item-list-text').fadeIn();
94
+ }
95
+ });
96
+ });
97
  })(jQuery);
98
  </script>
99
  </div>
102
  </div>
103
  </div>
104
  </div>
105
+ </div>
106
+ <script type="text/x-jquery-template" id="ips-data-template">
107
+ <table class="wf-table wf-table-hover">
108
+ <thead>
109
+ <tr>
110
+ <th>IP</th>
111
+ <th colspan="2">Country</th>
112
+ <th>Block Count</th>
113
+ </tr>
114
+ </thead>
115
+ <tbody>
116
+ {{each(idx, d) data}}
117
+ <tr>
118
+ <td>${d.IP}</td>
119
+ <td>${d.countryName}</td>
120
+ <td><img src="${d.countryFlag}" class="wfFlag" height="11" width="16" alt="${d.countryName}" title="${d.countryName}"></td>
121
+ <td>${d.blockCount}</td>
122
+ </tr>
123
+ {{/each}}
124
+ </tbody>
125
+ </table>
126
+ </script>
lib/dashboard/widget_logins.php CHANGED
@@ -25,6 +25,9 @@
25
  <div class="wf-dashboard-item-list-text"><p><em>No successful logins have been recorded.</em></p></div>
26
  <?php else: ?>
27
  <?php $data = array_slice($d->loginsSuccess, 0, min(10, count($d->loginsSuccess)), true); include(dirname(__FILE__) . '/widget_content_logins.php'); ?>
 
 
 
28
  <?php endif; ?>
29
  </div>
30
  <div class="wf-recent-logins wf-recent-logins-fail wf-hidden">
@@ -32,6 +35,9 @@
32
  <div class="wf-dashboard-item-list-text"><p><em>No failed logins have been recorded.</em></p></div>
33
  <?php else: ?>
34
  <?php $data = array_slice($d->loginsFail, 0, min(10, count($d->loginsFail)), true); include(dirname(__FILE__) . '/widget_content_logins.php'); ?>
 
 
 
35
  <?php endif; ?>
36
  </div>
37
  <script type="application/javascript">
@@ -46,6 +52,32 @@
46
  $('.wf-recent-logins').addClass('wf-hidden');
47
  $('.wf-recent-logins-' + $(this).data('grouping')).removeClass('wf-hidden');
48
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  })(jQuery);
50
  </script>
51
  </div>
@@ -54,4 +86,24 @@
54
  </div>
55
  </div>
56
  </div>
57
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  <div class="wf-dashboard-item-list-text"><p><em>No successful logins have been recorded.</em></p></div>
26
  <?php else: ?>
27
  <?php $data = array_slice($d->loginsSuccess, 0, min(10, count($d->loginsSuccess)), true); include(dirname(__FILE__) . '/widget_content_logins.php'); ?>
28
+ <?php if (count($d->loginsSuccess) > 10): ?>
29
+ <div class="wf-dashboard-item-list-text"><div class="wf-dashboard-show-more" data-grouping="logins" data-period="success"><a href="#">Show more</a></div></div>
30
+ <?php endif; ?>
31
  <?php endif; ?>
32
  </div>
33
  <div class="wf-recent-logins wf-recent-logins-fail wf-hidden">
35
  <div class="wf-dashboard-item-list-text"><p><em>No failed logins have been recorded.</em></p></div>
36
  <?php else: ?>
37
  <?php $data = array_slice($d->loginsFail, 0, min(10, count($d->loginsFail)), true); include(dirname(__FILE__) . '/widget_content_logins.php'); ?>
38
+ <?php if (count($d->loginsFail) > 10): ?>
39
+ <div class="wf-dashboard-item-list-text"><div class="wf-dashboard-show-more" data-grouping="logins" data-period="fail"><a href="#">Show more</a></div></div>
40
+ <?php endif; ?>
41
  <?php endif; ?>
42
  </div>
43
  <script type="application/javascript">
52
  $('.wf-recent-logins').addClass('wf-hidden');
53
  $('.wf-recent-logins-' + $(this).data('grouping')).removeClass('wf-hidden');
54
  });
55
+
56
+ $('.wf-recent-logins .wf-dashboard-show-more a').on('click', function(e) {
57
+ e.preventDefault();
58
+ e.stopPropagation();
59
+
60
+ var grouping = $(this).parent().data('grouping');
61
+ var period = $(this).parent().data('period');
62
+
63
+ $(this).closest('.wf-dashboard-item-list-text').fadeOut();
64
+
65
+ var self = this;
66
+ WFAD.ajax('wordfence_dashboardShowMore', {
67
+ grouping: grouping,
68
+ period: period
69
+ }, function(res) {
70
+ if (res.ok) {
71
+ var table = $('#logins-data-template').tmpl(res);
72
+ $(self).closest('.wf-recent-logins').css('overflow-y', 'auto');
73
+ $(self).closest('.wf-recent-logins').find('table').replaceWith(table);
74
+ }
75
+ else {
76
+ WFAD.colorbox('400px', 'An error occurred', 'We encountered an error trying load more data.');
77
+ $(this).closest('.wf-dashboard-item-list-text').fadeIn();
78
+ }
79
+ });
80
+ });
81
  })(jQuery);
82
  </script>
83
  </div>
86
  </div>
87
  </div>
88
  </div>
89
+ </div>
90
+ <script type="text/x-jquery-template" id="logins-data-template">
91
+ <table class="wf-table wf-table-hover">
92
+ <thead>
93
+ <tr>
94
+ <th>Username</th>
95
+ <th>IP</th>
96
+ <th>Date</th>
97
+ </tr>
98
+ </thead>
99
+ <tbody>
100
+ {{each(idx, d) data}}
101
+ <tr>
102
+ <td>${d.name}</td>
103
+ <td>${d.ip}</td>
104
+ <td>${d.t}</td>
105
+ </tr>
106
+ {{/each}}
107
+ </tbody>
108
+ </table>
109
+ </script>
lib/menu_activity.php CHANGED
@@ -115,7 +115,7 @@
115
  </td>
116
  <td>
117
  <button data-bind="click: $root.removeFilter" type="button"
118
- class="button">
119
  Remove
120
  </button>
121
  </td>
@@ -125,7 +125,7 @@
125
  <tr>
126
  <td colspan="3">
127
  <div class="wf-pad-small">
128
- <button type="button" class="button" data-bind="click: addFilter">
129
  Add Filter
130
  </button>
131
  </div>
@@ -146,7 +146,7 @@
146
  data-bind="value: startDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
147
  </td>
148
  <td>
149
- <button data-bind="click: startDate('')" class="button small"
150
  type="button">
151
  Clear
152
  </button>
@@ -161,7 +161,7 @@
161
  data-bind="value: endDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
162
  </td>
163
  <td>
164
- <button data-bind="click: endDate('')" class="button small"
165
  type="button">
166
  Clear
167
  </button>
@@ -346,41 +346,41 @@
346
  <tr>
347
  <td>
348
  <span data-bind="if: blocked()">
349
- <a href="#" class="button button-small"
350
  data-bind="click: $root.unblockIP">
351
  Unblock this IP
352
  </a>
353
  </span>
354
  <span data-bind="if: rangeBlocked()">
355
- <a href="#" class="button button-small"
356
  data-bind="click: $root.unblockNetwork">Unblock this range
357
  </a>
358
  </span>
359
  <span data-bind="if: !blocked() && !rangeBlocked()">
360
- <a href="#" class="button button-small"
361
  data-bind="click: $root.blockIP">
362
  Block this IP
363
  </a>
364
  </span>
365
- <a class="button button-small"
366
  data-bind="attr: { href: 'admin.php?page=WordfenceTools&whoisval=' + IP() + '&wfnetworkblock=1#top#whois'}">
367
  Block this network
368
  </a>
369
- <a class="button button-small" data-bind="text: 'Run WHOIS on ' + IP(),
370
  attr: { href: 'admin.php?page=WordfenceTools&whoisval=' + IP() + '#top#whois' }"
371
  target="_blank"></a>
372
- <a class="button button-small"
373
  data-bind="attr: { href: WFAD.makeIPTrafLink(IP()) }" target="_blank">
374
  See recent traffic
375
  </a>
376
  <span data-bind="if: action() == 'blocked:waf'">
377
- <a href="#" class="button button-small"
378
  data-bind="click: function () { $root.whitelistWAFParamKey(actionData().path, actionData().paramKey, actionData().failedRules) }"
379
  title="If this is a false positive, you can exclude this parameter from being filtered by the firewall">
380
  Whitelist param from Firewall
381
  </a>
382
  <?php if (WFWAF_DEBUG): ?>
383
- <a href="#" class="button button-small"
384
  data-bind="attr: { href: '<?php echo esc_js(home_url()) ?>?_wfsf=debugWAF&nonce=' + WFAD.nonce + '&hitid=' + id() }" target="_blank">
385
  Debug this Request
386
  </a>
115
  </td>
116
  <td>
117
  <button data-bind="click: $root.removeFilter" type="button"
118
+ class="wf-btn wf-btn-default">
119
  Remove
120
  </button>
121
  </td>
125
  <tr>
126
  <td colspan="3">
127
  <div class="wf-pad-small">
128
+ <button type="button" class="wf-btn wf-btn-default" data-bind="click: addFilter">
129
  Add Filter
130
  </button>
131
  </div>
146
  data-bind="value: startDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
147
  </td>
148
  <td>
149
+ <button data-bind="click: startDate('')" class="wf-btn wf-btn-default wf-btn-sm"
150
  type="button">
151
  Clear
152
  </button>
161
  data-bind="value: endDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
162
  </td>
163
  <td>
164
+ <button data-bind="click: endDate('')" class="wf-btn wf-btn-default wf-btn-sm"
165
  type="button">
166
  Clear
167
  </button>
346
  <tr>
347
  <td>
348
  <span data-bind="if: blocked()">
349
+ <a href="#" class="wf-btn wf-btn-default wf-btn-sm"
350
  data-bind="click: $root.unblockIP">
351
  Unblock this IP
352
  </a>
353
  </span>
354
  <span data-bind="if: rangeBlocked()">
355
+ <a href="#" class="wf-btn wf-btn-default wf-btn-sm"
356
  data-bind="click: $root.unblockNetwork">Unblock this range
357
  </a>
358
  </span>
359
  <span data-bind="if: !blocked() && !rangeBlocked()">
360
+ <a href="#" class="wf-btn wf-btn-default wf-btn-sm"
361
  data-bind="click: $root.blockIP">
362
  Block this IP
363
  </a>
364
  </span>
365
+ <a class="wf-btn wf-btn-default wf-btn-sm"
366
  data-bind="attr: { href: 'admin.php?page=WordfenceTools&whoisval=' + IP() + '&wfnetworkblock=1#top#whois'}">
367
  Block this network
368
  </a>
369
+ <a class="wf-btn wf-btn-default wf-btn-sm" data-bind="text: 'Run WHOIS on ' + IP(),
370
  attr: { href: 'admin.php?page=WordfenceTools&whoisval=' + IP() + '#top#whois' }"
371
  target="_blank"></a>
372
+ <a class="wf-btn wf-btn-default wf-btn-sm"
373
  data-bind="attr: { href: WFAD.makeIPTrafLink(IP()) }" target="_blank">
374
  See recent traffic
375
  </a>
376
  <span data-bind="if: action() == 'blocked:waf'">
377
+ <a href="#" class="wf-btn wf-btn-default wf-btn-sm"
378
  data-bind="click: function () { $root.whitelistWAFParamKey(actionData().path, actionData().paramKey, actionData().failedRules) }"
379
  title="If this is a false positive, you can exclude this parameter from being filtered by the firewall">
380
  Whitelist param from Firewall
381
  </a>
382
  <?php if (WFWAF_DEBUG): ?>
383
+ <a href="#" class="wf-btn wf-btn-default wf-btn-sm"
384
  data-bind="attr: { href: '<?php echo esc_js(home_url()) ?>?_wfsf=debugWAF&nonce=' + WFAD.nonce + '&hitid=' + id() }" target="_blank">
385
  Debug this Request
386
  </a>
lib/menu_blocking.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="wrap wordfence">
2
+ <div class="wf-container-fluid">
3
+ <?php $pageTitle = "Wordfence Blocking"; $options = array(array('t' => 'Blocked IPs', 'a' => 'blockedips'), array('t' => 'Country Blocking', 'a' => 'countryblocking'), array('t' => 'Advanced Blocking', 'a' => 'advancedblocking')); $wantsLiveActivity = true; include('pageTitle.php'); ?>
4
+ <div class="wf-row">
5
+ <?php
6
+ $rightRail = new wfView('marketing/rightrail');
7
+ echo $rightRail;
8
+ ?>
9
+ <div class="<?php echo wfStyle::contentClasses(); ?>">
10
+ <div id="blockedips" class="wordfenceTopTab" data-title="Wordfence Blocked IPs">
11
+ <?php
12
+ $helpLink = "http://docs.wordfence.com/en/Blocked_IPs";
13
+ $helpLabel = "Learn more about Blocked IPs";
14
+ require('menu_blocking_blockedIPs.php');
15
+ ?>
16
+ </div> <!-- end blockedips block -->
17
+ <div id="countryblocking" class="wordfenceTopTab" data-title="Block Selected Countries from Accessing your Site">
18
+ <?php
19
+ $helpLink = "http://docs.wordfence.com/en/Country_blocking";
20
+ $helpLabel = "Learn more about Country Blocking";
21
+ require('menu_blocking_countryBlocking.php');
22
+ ?>
23
+ </div> <!-- end countryblocking block -->
24
+ <div id="advancedblocking" class="wordfenceTopTab" data-title="Advanced Blocking">
25
+ <?php
26
+ $helpLink = "http://docs.wordfence.com/en/Advanced_Blocking";
27
+ $helpLabel = "Learn more about Advanced Blocking";
28
+ require('menu_blocking_advancedBlocking.php');
29
+ ?>
30
+ </div> <!-- end advancedblocking block -->
31
+ </div> <!-- end content block -->
32
+ </div> <!-- end row -->
33
+ </div> <!-- end container -->
34
+ </div>
lib/{menu_firewall_advancedBlocking.php → menu_blocking_advancedBlocking.php} RENAMED
@@ -23,7 +23,7 @@
23
  <tr><th>Enter a reason you're blocking this visitor pattern:</th><td><input id="wfReason" type="text" size="30" maxlength="255"></td></tr>
24
  <tr><td></td><td style="padding-bottom: 15px;"><strong>Why a reason:</strong> The reason you specify above is for your own record keeping.</td></tr>
25
  <tr><td colspan="2" style="padding-top: 15px;">
26
- <input type="button" name="but3" class="button-primary" value="Block Visitors Matching this Pattern" onclick="WFAD.blockIPUARange(jQuery('#ipRange').val(), jQuery('#hostname').val(), jQuery('#uaRange').val(), jQuery('#wfreferer').val(), jQuery('#wfReason').val()); return false;" />
27
  </td></tr>
28
  </table>
29
  </p>
23
  <tr><th>Enter a reason you're blocking this visitor pattern:</th><td><input id="wfReason" type="text" size="30" maxlength="255"></td></tr>
24
  <tr><td></td><td style="padding-bottom: 15px;"><strong>Why a reason:</strong> The reason you specify above is for your own record keeping.</td></tr>
25
  <tr><td colspan="2" style="padding-top: 15px;">
26
+ <input type="button" name="but3" class="wf-btn wf-btn-primary" value="Block Visitors Matching this Pattern" onclick="WFAD.blockIPUARange(jQuery('#ipRange').val(), jQuery('#hostname').val(), jQuery('#uaRange').val(), jQuery('#wfreferer').val(), jQuery('#wfReason').val()); return false;" />
27
  </td></tr>
28
  </table>
29
  </p>
lib/{menu_firewall_blockedIPs.php → menu_blocking_blockedIPs.php} RENAMED
@@ -2,11 +2,15 @@
2
  <div>
3
  <div class="wordfenceModeElem" id="wordfenceMode_blockedIPs"></div>
4
  <?php if(! wfConfig::get('firewallEnabled')){ ?><div style="color: #F00; font-weight: bold;">Rate limiting rules and advanced blocking are disabled. You can enable it on the <a href="admin.php?page=WordfenceSecOpt">Wordfence Options page</a> at the top.</div><?php } ?>
5
- <p>
6
- <a href="#" onclick="WFAD.clearAllBlocked('blocked'); return false;">Clear all blocked IP addresses</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#" onclick="WFAD.clearAllBlocked('locked'); return false;">Clear all locked out IP addresses</a><br />
7
- You can manually (and permanently) block an IP by entering the address here: <input type="text" id="wfManualBlock" size="20" maxlength="40" value="" onkeydown="if(event.keyCode == 13){ WFAD.blockIPTwo(jQuery('#wfManualBlock').val(), 'Manual block by administrator', true); return false; }" />&nbsp;<input type="button" name="but1" value="Manually block IP" onclick="WFAD.blockIPTwo(jQuery('#wfManualBlock').val(), 'Manual block by administrator', true); return false;" />
8
- </p>
9
- <div>
 
 
 
 
10
  <div id="wfTabs">
11
  <a href="#" class="wfTab1 wfTabSwitch selected" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_blockedIPs', function(){ WFAD.staticTabChanged(); }); return false;">IPs blocked from accessing the site</a>
12
  <a href="#" class="wfTab1 wfTabSwitch" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_lockedOutIPs', function(){ WFAD.staticTabChanged(); }); return false;">IPs locked out from login</a>
@@ -61,12 +65,12 @@
61
 
62
  <script type="text/x-jquery-template" id="wfLockedOutIPsWrapperTmpl">
63
  <div>
64
- <p><a class="button" href="#" onclick="WFAD.permanentlyBlockAllIPs('lockedOut'); return false;">Permanently block all locked out IP addresses</a></p>
65
  <div style="border-top: 1px solid #CCC; padding-top: 10px; margin-top: 10px;">
66
  <table border="0" style="width: 100%" id="wfLockedOutIPsWrapper">
67
  </table>
68
  </div>
69
- <p><a class="button wfLoadMoreButton" href="#">Load More</a></p>
70
  </div>
71
  </script>
72
 
@@ -111,12 +115,12 @@
111
 
112
  <script type="text/x-jquery-template" id="wfBlockedIPsWrapperTmpl">
113
  <div>
114
- <p><a class="button" href="#" onclick="WFAD.permanentlyBlockAllIPs('blocked'); return false;">Permanently block all temporarily blocked IP addresses</a></p>
115
  <div style="border-top: 1px solid #CCC; padding-top: 10px; margin-top: 10px;">
116
  <table border="0" style="width: 100%" id="wfBlockedIPsWrapper">
117
  </table>
118
  </div>
119
- <p><a class="button wfLoadMoreButton" href="#">Load More</a></p>
120
  </div>
121
  </script>
122
 
2
  <div>
3
  <div class="wordfenceModeElem" id="wordfenceMode_blockedIPs"></div>
4
  <?php if(! wfConfig::get('firewallEnabled')){ ?><div style="color: #F00; font-weight: bold;">Rate limiting rules and advanced blocking are disabled. You can enable it on the <a href="admin.php?page=WordfenceSecOpt">Wordfence Options page</a> at the top.</div><?php } ?>
5
+ <p><a href="#" onclick="WFAD.clearAllBlocked('blocked'); return false;">Clear all blocked IP addresses</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#" onclick="WFAD.clearAllBlocked('locked'); return false;">Clear all locked out IP addresses</a></p>
6
+ <div class="wf-form-inline">
7
+ <div class="wf-form-group">
8
+ <label class="wf-plain" for="wfManualBlock">You can manually (and permanently) block an IP by entering the address here:</label>
9
+ <input class="wf-form-control" type="text" id="wfManualBlock" size="20" maxlength="40" value="" onkeydown="if(event.keyCode == 13){ WFAD.blockIPTwo(jQuery('#wfManualBlock').val(), 'Manual block by administrator', true); return false; }">
10
+ </div>
11
+ <input class="wf-btn wf-btn-default" type="button" name="but1" value="Manually block IP" onclick="WFAD.blockIPTwo(jQuery('#wfManualBlock').val(), 'Manual block by administrator', true); return false;">
12
+ </div>
13
+ <div class="wf-add-top">
14
  <div id="wfTabs">
15
  <a href="#" class="wfTab1 wfTabSwitch selected" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_blockedIPs', function(){ WFAD.staticTabChanged(); }); return false;">IPs blocked from accessing the site</a>
16
  <a href="#" class="wfTab1 wfTabSwitch" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_lockedOutIPs', function(){ WFAD.staticTabChanged(); }); return false;">IPs locked out from login</a>
65
 
66
  <script type="text/x-jquery-template" id="wfLockedOutIPsWrapperTmpl">
67
  <div>
68
+ <p><a class="wf-btn wf-btn-default" href="#" onclick="WFAD.permanentlyBlockAllIPs('lockedOut'); return false;">Permanently block all locked out IP addresses</a></p>
69
  <div style="border-top: 1px solid #CCC; padding-top: 10px; margin-top: 10px;">
70
  <table border="0" style="width: 100%" id="wfLockedOutIPsWrapper">
71
  </table>
72
  </div>
73
+ <p><a class="wf-btn wf-btn-sm wf-btn-default wfLoadMoreButton" href="#">Load More</a></p>
74
  </div>
75
  </script>
76
 
115
 
116
  <script type="text/x-jquery-template" id="wfBlockedIPsWrapperTmpl">
117
  <div>
118
+ <p><a class="wf-btn wf-btn-default" href="#" onclick="WFAD.permanentlyBlockAllIPs('blocked'); return false;">Permanently block all temporarily blocked IP addresses</a></p>
119
  <div style="border-top: 1px solid #CCC; padding-top: 10px; margin-top: 10px;">
120
  <table border="0" style="width: 100%" id="wfBlockedIPsWrapper">
121
  </table>
122
  </div>
123
+ <p><a class="wf-btn wf-btn-sm wf-btn-default wfLoadMoreButton" href="#">Load More</a></p>
124
  </div>
125
  </script>
126
 
lib/{menu_firewall_countryBlocking.php → menu_blocking_countryBlocking.php} RENAMED
@@ -73,7 +73,7 @@ WFAD.countryMap = <?php echo json_encode($wfBulkCountries); ?>;
73
  </table>
74
  </div>
75
  <table border="0" cellpadding="0" cellspacing="0"><tr>
76
- <td><input type="button" name="but4" class="button-primary" value="Save blocking options and country list" onclick="WFAD.saveCountryBlocking();" /></td>
77
  <td style="height: 24px;"><div class="wfAjax24"></div><span class="wfSavedMsg">&nbsp;Your changes have been saved!</span></td></tr>
78
  </table>
79
  <span style="font-size: 10px;">Note that we use an IP to country database that is 99.5% accurate to identify which country a visitor is from.</span>
73
  </table>
74
  </div>
75
  <table border="0" cellpadding="0" cellspacing="0"><tr>
76
+ <td><input type="button" name="but4" class="wf-btn wf-btn-primary" value="Save blocking options and country list" onclick="WFAD.saveCountryBlocking();" /></td>
77
  <td style="height: 24px;"><div class="wfAjax24"></div><span class="wfSavedMsg">&nbsp;Your changes have been saved!</span></td></tr>
78
  </table>
79
  <span style="font-size: 10px;">Note that we use an IP to country database that is 99.5% accurate to identify which country a visitor is from.</span>
lib/menu_firewall.php CHANGED
@@ -1,6 +1,6 @@
1
  <div class="wrap wordfence">
2
  <div class="wf-container-fluid">
3
- <?php $pageTitle = "Wordfence Firewall"; $options = array(array('t' => 'Web Application Firewall', 'a' => 'waf'), array('t' => 'Country Blocking', 'a' => 'countryblocking'), array('t' => 'Blocked IPs', 'a' => 'blockedips'), array('t' => 'Advanced Blocking', 'a' => 'advancedblocking'), array('t' => 'Brute Force Protection', 'a' => 'bruteforce'), array('t' => 'Rate Limiting', 'a' => 'ratelimiting')); $wantsLiveActivity = true; include('pageTitle.php'); ?>
4
  <div class="wf-row">
5
  <?php
6
  $rightRail = new wfView('marketing/rightrail');
@@ -14,27 +14,6 @@
14
  require('menu_firewall_waf.php');
15
  ?>
16
  </div> <!-- end waf block -->
17
- <div id="countryblocking" class="wordfenceTopTab" data-title="Block Selected Countries from Accessing your Site">
18
- <?php
19
- $helpLink = "http://docs.wordfence.com/en/Country_blocking";
20
- $helpLabel = "Learn more about Country Blocking";
21
- require('menu_firewall_countryBlocking.php');
22
- ?>
23
- </div> <!-- end countryblocking block -->
24
- <div id="blockedips" class="wordfenceTopTab" data-title="Wordfence Blocked IPs">
25
- <?php
26
- $helpLink = "http://docs.wordfence.com/en/Blocked_IPs";
27
- $helpLabel = "Learn more about Blocked IPs";
28
- require('menu_firewall_blockedIPs.php');
29
- ?>
30
- </div> <!-- end blockedips block -->
31
- <div id="advancedblocking" class="wordfenceTopTab" data-title="Advanced Blocking">
32
- <?php
33
- $helpLink = "http://docs.wordfence.com/en/Advanced_Blocking";
34
- $helpLabel = "Learn more about Advanced Blocking";
35
- require('menu_firewall_advancedBlocking.php');
36
- ?>
37
- </div> <!-- end advancedblocking block -->
38
  <div id="bruteforce" class="wordfenceTopTab" data-title="Brute Force Login Security Options">
39
  <?php
40
  $helpLink = "http://docs.wordfence.com/en/Wordfence_options#Login_Security_Options";
1
  <div class="wrap wordfence">
2
  <div class="wf-container-fluid">
3
+ <?php $pageTitle = "Wordfence Firewall"; $options = array(array('t' => 'Web Application Firewall', 'a' => 'waf'), array('t' => 'Brute Force Protection', 'a' => 'bruteforce'), array('t' => 'Rate Limiting', 'a' => 'ratelimiting')); $wantsLiveActivity = true; include('pageTitle.php'); ?>
4
  <div class="wf-row">
5
  <?php
6
  $rightRail = new wfView('marketing/rightrail');
14
  require('menu_firewall_waf.php');
15
  ?>
16
  </div> <!-- end waf block -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  <div id="bruteforce" class="wordfenceTopTab" data-title="Brute Force Login Security Options">
18
  <?php
19
  $helpLink = "http://docs.wordfence.com/en/Wordfence_options#Login_Security_Options";
lib/menu_firewall_waf.php CHANGED
@@ -133,10 +133,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
133
  </div>
134
  </div>
135
  <div class="wf-form-group">
136
- <div class="wf-col-sm-5 wf-col-md-3 wf-center">
137
- <button type="submit" class="wf-btn wf-btn-primary"<?php echo !WFWAF_ENABLED ? ' disabled' : '' ?>>Save</button>
138
- </div>
139
- <div class="wf-col-sm-7">
140
  <div class="wafStatus-description" id="wafStatus-enabled-description">
141
  In this mode, the Wordfence Web Application Firewall is actively blocking requests
142
  matching known attack patterns, and is actively protecting your site from attackers.
@@ -157,6 +154,11 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
157
  </div>
158
  </div>
159
  </div>
 
 
 
 
 
160
 
161
  <br>
162
 
@@ -183,30 +185,30 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
183
  while the firewall is in Learning Mode or by an admin who identifies a particular action/request
184
  is a false positive.</em></p>
185
 
186
- <p id="whitelist-form">
187
- <strong>Add Whitelisted URL/Param:</strong><br>
188
- <label>
189
- URL:
190
- <input type="text" name="whitelistURL">
191
- </label>
192
- &nbsp;
193
- <label>
194
- Param:
195
- <select name="whitelistParam">
196
- <option value="request.body">POST Body</option>
197
- <option value="request.cookies">Cookie</option>
198
- <option value="request.fileNames">File Name</option>
199
- <option value="request.headers">Header</option>
200
- <option value="request.queryString">Query String</option>
201
- </select>
202
- </label>
203
- &nbsp;
204
- <label>
205
- Param Name:
206
- <input type="text" name="whitelistParamName">
207
- </label>
208
- <button type="button" class="button button-small" id="waf-whitelisted-urls-add">Add</button>
209
- </p>
210
 
211
  <div id="waf-whitelisted-urls-wrapper"></div>
212
 
@@ -249,7 +251,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
249
  </div>
250
  <div class="wf-form-group">
251
  <div class="wf-col-xs-12">
252
- <a href="<?php echo $wafRemoveURL; ?>" class="button button-small" id="waf-remove-extended">Remove Extended Protection</a>
253
  </div>
254
  </div>
255
  </div>
@@ -291,14 +293,14 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
291
  </script>
292
  <script type="text/x-jquery-template" id="waf-whitelisted-urls-tmpl">
293
  <?php ob_start() ?>
294
- <form action="javascript:void(0)" class="wf-bulk-action wf-whitelist-actions">
295
- <select name="wf-bulk-action">
296
  <option value="">Bulk Actions</option>
297
  <option value="delete">Delete</option>
298
  <option value="enable">Enable</option>
299
  <option value="disable">Disable</option>
300
  </select>
301
- <button type="submit" class="button">Apply</button>
302
  </form>
303
  <?php
304
  $bulkActionForm = ob_get_clean();
@@ -398,12 +400,12 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
398
  </td>
399
  <td>
400
  <span class="whitelist-display" style="white-space: nowrap">
401
- <button type="button" class="button button-small whitelist-url-edit">Edit</button>
402
- <button type="button" class="button button-small whitelist-url-delete">Delete</button>
403
  </span>
404
  <span class="whitelist-edit" style="white-space: nowrap">
405
- <button type="button" class="button button-small whitelist-url-save">Save</button>
406
- <button type="button" class="button button-small whitelist-url-cancel">Cancel</button>
407
  </span>
408
  </td>
409
  </tr>
133
  </div>
134
  </div>
135
  <div class="wf-form-group">
136
+ <div class="wf-col-sm-7 wf-col-sm-offset-5 wf-col-md-offset-3">
 
 
 
137
  <div class="wafStatus-description" id="wafStatus-enabled-description">
138
  In this mode, the Wordfence Web Application Firewall is actively blocking requests
139
  matching known attack patterns, and is actively protecting your site from attackers.
154
  </div>
155
  </div>
156
  </div>
157
+ <div class="wf-form-group">
158
+ <div class="wf-col-sm-7 wf-col-sm-offset-5 wf-col-md-offset-3">
159
+ <button type="submit" class="wf-btn wf-btn-primary wf-btn-callout"<?php echo !WFWAF_ENABLED ? ' disabled' : '' ?>>Save</button>
160
+ </div>
161
+ </div>
162
 
163
  <br>
164
 
185
  while the firewall is in Learning Mode or by an admin who identifies a particular action/request
186
  is a false positive.</em></p>
187
 
188
+ <div id="whitelist-form">
189
+ <p><strong>Add Whitelisted URL/Param:</strong></p>
190
+ <div class="wf-form-inline">
191
+ <div class="wf-form-group">
192
+ <label for="whitelistURL">URL:</label>
193
+ <input class="wf-form-control" type="text" name="whitelistURL" id="whitelistURL">
194
+ </div>
195
+ <div class="wf-form-group">
196
+ <label for="whitelistParam">Param:</label>
197
+ <select class="wf-form-control" name="whitelistParam" id="whitelistParam">
198
+ <option value="request.body">POST Body</option>
199
+ <option value="request.cookies">Cookie</option>
200
+ <option value="request.fileNames">File Name</option>
201
+ <option value="request.headers">Header</option>
202
+ <option value="request.queryString">Query String</option>
203
+ </select>
204
+ </div>
205
+ <div class="wf-form-group">
206
+ <label for="whitelistParamName">Param Name:</label>
207
+ <input class="wf-form-control" type="text" name="whitelistParamName" id="whitelistParamName">
208
+ </div>
209
+ <button type="button" class="wf-btn wf-btn-default" id="waf-whitelisted-urls-add">Add</button>
210
+ </div>
211
+ </div>
212
 
213
  <div id="waf-whitelisted-urls-wrapper"></div>
214
 
251
  </div>
252
  <div class="wf-form-group">
253
  <div class="wf-col-xs-12">
254
+ <a href="<?php echo $wafRemoveURL; ?>" class="wf-btn wf-btn-default wf-btn-sm" id="waf-remove-extended">Remove Extended Protection</a>
255
  </div>
256
  </div>
257
  </div>
293
  </script>
294
  <script type="text/x-jquery-template" id="waf-whitelisted-urls-tmpl">
295
  <?php ob_start() ?>
296
+ <form action="javascript:void(0)" class="wf-bulk-action wf-whitelist-actions wf-form-inline">
297
+ <select class="wf-form-control" name="wf-bulk-action">
298
  <option value="">Bulk Actions</option>
299
  <option value="delete">Delete</option>
300
  <option value="enable">Enable</option>
301
  <option value="disable">Disable</option>
302
  </select>
303
+ <button type="submit" class="wf-btn wf-btn-default">Apply</button>
304
  </form>
305
  <?php
306
  $bulkActionForm = ob_get_clean();
400
  </td>
401
  <td>
402
  <span class="whitelist-display" style="white-space: nowrap">
403
+ <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-edit">Edit</button>
404
+ <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-delete">Delete</button>
405
  </span>
406
  <span class="whitelist-edit" style="white-space: nowrap">
407
+ <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-save">Save</button>
408
+ <button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-cancel">Cancel</button>
409
  </span>
410
  </td>
411
  </tr>
lib/menu_options.php CHANGED
@@ -56,11 +56,11 @@ $w = new wfConfig();
56
  <div class="wf-form-group">
57
  <?php if (wfConfig::get('hasKeyConflict')): ?>
58
  <div class="wf-col-sm-9 wf-col-sm-offset-3">
59
- <a href="https://www.wordfence.com/gnl1optMngKysReset/manage-wordfence-api-keys/" target="_blank"><input type="button" value="Reset your premium license"/></a> <input type="button" value="Downgrade to a free license" onclick="WFAD.downgradeLicense();"/>
60
  </div>
61
  <?php elseif (wfConfig::get('isPaid')): ?>
62
  <div class="wf-col-sm-9 wf-col-sm-offset-3">
63
- <a href="https://www.wordfence.com/gnl1optMngKys/manage-wordfence-api-keys/" target="_blank"><input type="button" value="Renew your premium license"/></a> <input type="button" value="Downgrade to a free license" onclick="WFAD.downgradeLicense();"/>
64
  </div>
65
  <?php else: ?>
66
  <div class="wf-col-xs-12">
@@ -83,7 +83,7 @@ $w = new wfConfig();
83
  <div class="wf-form-group">
84
  <label for="firewallEnabled" class="wf-col-sm-5 wf-control-label">Enable Rate Limiting and Advanced Blocking <a href="https://docs.wordfence.com/en/Wordfence_options#Enable_Rate_Limiting_and_Advanced_Blocking" target="_blank" class="wfhelp"></a></label>
85
  <div class="wf-col-sm-7">
86
- <div class="wf-checkbox"><input type="checkbox" id="firewallEnabled" class="wf-form-control wfConfigElem" name="firewallEnabled" value="1" <?php $w->cb( 'firewallEnabled' ); ?>></div>
87
  <span class="wf-help-block"><span style="color: #F00;">NOTE:</span> This checkbox enables ALL blocking/throttling functions including IP, country and advanced blocking, and the "Rate Limiting Rules" below.</span>
88
  </div>
89
  </div>
56
  <div class="wf-form-group">
57
  <?php if (wfConfig::get('hasKeyConflict')): ?>
58
  <div class="wf-col-sm-9 wf-col-sm-offset-3">
59
+ <a href="https://www.wordfence.com/gnl1optMngKysReset/manage-wordfence-api-keys/" target="_blank"><input type="button" class="wf-btn wf-btn-default wf-btn-sm" value="Reset your premium license"/></a> <input type="button" class="wf-btn wf-btn-default wf-btn-sm" value="Downgrade to a free license" onclick="WFAD.downgradeLicense();"/>
60
  </div>
61
  <?php elseif (wfConfig::get('isPaid')): ?>
62
  <div class="wf-col-sm-9 wf-col-sm-offset-3">
63
+ <a href="https://www.wordfence.com/gnl1optMngKys/manage-wordfence-api-keys/" target="_blank"><input type="button" class="wf-btn wf-btn-default wf-btn-sm" value="Renew your premium license"/></a> <input type="button" class="wf-btn wf-btn-default wf-btn-sm" value="Downgrade to a free license" onclick="WFAD.downgradeLicense();"/>
64
  </div>
65
  <?php else: ?>
66
  <div class="wf-col-xs-12">
83
  <div class="wf-form-group">
84
  <label for="firewallEnabled" class="wf-col-sm-5 wf-control-label">Enable Rate Limiting and Advanced Blocking <a href="https://docs.wordfence.com/en/Wordfence_options#Enable_Rate_Limiting_and_Advanced_Blocking" target="_blank" class="wfhelp"></a></label>
85
  <div class="wf-col-sm-7">
86
+ <div class="wf-checkbox"><input type="checkbox" id="firewallEnabled" class="wfConfigElem" name="firewallEnabled" value="1" <?php $w->cb( 'firewallEnabled' ); ?>></div>
87
  <span class="wf-help-block"><span style="color: #F00;">NOTE:</span> This checkbox enables ALL blocking/throttling functions including IP, country and advanced blocking, and the "Rate Limiting Rules" below.</span>
88
  </div>
89
  </div>
lib/menu_scan_scan.php CHANGED
@@ -40,9 +40,7 @@
40
  <p>As new threats emerge, the Threat Defense Feed is updated to detect these new hacks. The Premium
41
  version of the Threat Defense Feed is updated in real-time protecting you immediately. As a free
42
  user <strong>you are receiving the community version</strong> of the feed which is updated 30 days later.</p>
43
- <p class="center"><a class="wf-btn wf-btn-primary wf-btn-callout"
44
- href="https://www.wordfence.com/gnl1scanUpgrade/wordfence-signup/" target="_blank">
45
- Get Premium</a></p>
46
  </div>
47
 
48
  <?php } ?>
40
  <p>As new threats emerge, the Threat Defense Feed is updated to detect these new hacks. The Premium
41
  version of the Threat Defense Feed is updated in real-time protecting you immediately. As a free
42
  user <strong>you are receiving the community version</strong> of the feed which is updated 30 days later.</p>
43
+ <p class="center"><a class="wf-btn wf-btn-primary wf-btn-callout" href="https://www.wordfence.com/gnl1scanUpgrade/wordfence-signup/" target="_blank">Get Premium</a></p>
 
 
44
  </div>
45
 
46
  <?php } ?>
lib/menu_tools_diagnostic.php CHANGED
@@ -399,7 +399,7 @@ if (!isset($sendingDiagnosticEmail)) { $sendingDiagnosticEmail = false; }
399
  href="http://docs.wordfence.com/en/Wordfence_options#Send_a_test_email_from_this_WordPress_server_to_an_email_address"
400
  target="_blank" class="wfhelp"></a>
401
  <input type="text" id="testEmailDest" value="" size="20" maxlength="255" class="wfConfigElem"/>
402
- <input class="button" type="button" value="Send Test Email"
403
  onclick="WFAD.sendTestEmail(jQuery('#testEmailDest').val());"/>
404
  </li>
405
  </ul>
@@ -421,11 +421,11 @@ if (!isset($sendingDiagnosticEmail)) { $sendingDiagnosticEmail = false; }
421
  <td><input type="text" id="_ticketnumber" required/></td>
422
  </tr>
423
  <tr>
424
- <td colspan="2" style="text-align: right;"><input class="button" type="button" id="doSendEmail" value="Send"/></td>
425
  </tr>
426
  </table>
427
  </div>
428
- <input class="button" type="submit" id="sendByEmail" value="Send Report by Email"/>
429
  </div>
430
 
431
  <?php if (!WFWAF_SUBDIRECTORY_INSTALL): ?>
@@ -433,7 +433,7 @@ if (!isset($sendingDiagnosticEmail)) { $sendingDiagnosticEmail = false; }
433
  <h3>Firewall Rules</h3>
434
 
435
  <p>
436
- <button type="button" onclick="WFAD.wafUpdateRules()" class="wf-btn wf-btn-primary wf-btn-callout">
437
  Manually refresh firewall rules
438
  </button>
439
  <!-- <em id="waf-rules-last-updated"></em>-->
@@ -496,7 +496,7 @@ if (!isset($sendingDiagnosticEmail)) { $sendingDiagnosticEmail = false; }
496
  </tr>
497
 
498
  <tr>
499
- <th><label for="ssl_verify">Enable SSL Verification</label><a
500
  href="http://docs.wordfence.com/en/Wordfence_options#Enable_SSL_Verification"
501
  target="_blank" class="wfhelp"></a>
502
  </th>
@@ -509,7 +509,7 @@ if (!isset($sendingDiagnosticEmail)) { $sendingDiagnosticEmail = false; }
509
  </tr>
510
 
511
  <tr>
512
- <th><label for="betaThreatDefenseFeed">Enable beta threat defense feed</label></th>
513
  <td style="vertical-align: top;"><input type="checkbox" id="betaThreatDefenseFeed"
514
  class="wfConfigElem"
515
  name="betaThreatDefenseFeed"
@@ -521,7 +521,7 @@ if (!isset($sendingDiagnosticEmail)) { $sendingDiagnosticEmail = false; }
521
  <br>
522
  <table border="0" cellpadding="0" cellspacing="0">
523
  <tr>
524
- <td><input type="button" id="button1" name="button1" class="button-primary" value="Save Changes"
525
  onclick="WFAD.saveDebuggingConfig();"/></td>
526
  <td style="height: 24px;">
527
  <div class="wfAjax24"></div>
399
  href="http://docs.wordfence.com/en/Wordfence_options#Send_a_test_email_from_this_WordPress_server_to_an_email_address"
400
  target="_blank" class="wfhelp"></a>
401
  <input type="text" id="testEmailDest" value="" size="20" maxlength="255" class="wfConfigElem"/>
402
+ <input class="wf-btn wf-btn-default" type="button" value="Send Test Email"
403
  onclick="WFAD.sendTestEmail(jQuery('#testEmailDest').val());"/>
404
  </li>
405
  </ul>
421
  <td><input type="text" id="_ticketnumber" required/></td>
422
  </tr>
423
  <tr>
424
+ <td colspan="2" style="text-align: right;"><input class="wf-btn wf-btn-default" type="button" id="doSendEmail" value="Send"/></td>
425
  </tr>
426
  </table>
427
  </div>
428
+ <input class="wf-btn wf-btn-default" type="submit" id="sendByEmail" value="Send Report by Email"/>
429
  </div>
430
 
431
  <?php if (!WFWAF_SUBDIRECTORY_INSTALL): ?>
433
  <h3>Firewall Rules</h3>
434
 
435
  <p>
436
+ <button type="button" onclick="WFAD.wafUpdateRules()" class="wf-btn wf-btn-primary">
437
  Manually refresh firewall rules
438
  </button>
439
  <!-- <em id="waf-rules-last-updated"></em>-->
496
  </tr>
497
 
498
  <tr>
499
+ <th><label class="wf-plain" for="ssl_verify">Enable SSL Verification</label><a
500
  href="http://docs.wordfence.com/en/Wordfence_options#Enable_SSL_Verification"
501
  target="_blank" class="wfhelp"></a>
502
  </th>
509
  </tr>
510
 
511
  <tr>
512
+ <th><label class="wf-plain" for="betaThreatDefenseFeed">Enable beta threat defense feed</label></th>
513
  <td style="vertical-align: top;"><input type="checkbox" id="betaThreatDefenseFeed"
514
  class="wfConfigElem"
515
  name="betaThreatDefenseFeed"
521
  <br>
522
  <table border="0" cellpadding="0" cellspacing="0">
523
  <tr>
524
+ <td><input type="button" id="button1" name="button1" class="wf-btn wf-btn-primary" value="Save Changes"
525
  onclick="WFAD.saveDebuggingConfig();"/></td>
526
  <td style="height: 24px;">
527
  <div class="wfAjax24"></div>
lib/menu_tools_passwd.php CHANGED
@@ -40,7 +40,7 @@
40
  </div>
41
  <div class="wf-form-group">
42
  <div class="wf-col-sm-9 wf-col-sm-offset-3">
43
- <input type="button" name="but4" class="wf-btn wf-btn-primary wf-btn-callout" value="Start Password Audit" onclick="WFAD.startPasswdAudit(jQuery('#auditType').val(), jQuery('#emailAddr').val());">
44
  </div>
45
  </div>
46
  </div>
@@ -57,7 +57,7 @@
57
  <select id="wfPasswdFixAction">
58
  <option value="email">Action: Email selected users and ask them to change their weak password.</option>
59
  <option value="fix">Action: Change weak passwords to a strong password and email users the new password.</option>
60
- </select><input type="button" value="Fix Weak Passwords" onclick="WFAD.doFixWeakPasswords(); return false;" class="button-primary"/>
61
  </div>
62
  <table class="wf-striped-table">
63
  <thead>
40
  </div>
41
  <div class="wf-form-group">
42
  <div class="wf-col-sm-9 wf-col-sm-offset-3">
43
+ <input type="button" name="but4" class="wf-btn wf-btn-primary" value="Start Password Audit" onclick="WFAD.startPasswdAudit(jQuery('#auditType').val(), jQuery('#emailAddr').val());">
44
  </div>
45
  </div>
46
  </div>
57
  <select id="wfPasswdFixAction">
58
  <option value="email">Action: Email selected users and ask them to change their weak password.</option>
59
  <option value="fix">Action: Change weak passwords to a strong password and email users the new password.</option>
60
+ </select><input type="button" value="Fix Weak Passwords" onclick="WFAD.doFixWeakPasswords(); return false;" class="wf-btn wf-btn-primary"/>
61
  </div>
62
  <table class="wf-striped-table">
63
  <thead>
lib/menu_tools_twoFactor.php CHANGED
@@ -42,7 +42,7 @@
42
  <tr><td><input type="radio" name="wf2faMode" value="phone"></td><td>Send code to a phone number: <input type="text" id="wfPhone" value="" size="20" disabled><br><em>Format: +1-123-555-5034</em></td></tr>
43
  </table>
44
  </td></tr>
45
- <tr><td colspan="2"><input type="button" class="wf-btn wf-btn-primary wf-btn-callout" value="Enable Cellphone Sign-in" onclick="WFAD.addTwoFactor(jQuery('#wfUsername').val(), jQuery('#wfPhone').val(), jQuery('input[name=wf2faMode]:checked').val());" /></td></tr>
46
  </table>
47
  <div style="height: 20px;">
48
  <div id="wfTwoFacMsg" style="color: #F00;">
@@ -98,7 +98,7 @@
98
  <tbody>
99
  {{each(idx, user) users}}
100
  <tr id="twoFactorUser-${user.userID}">
101
- <td style="white-space: nowrap; text-align: center;"><a href="#" class="button" onclick="WFAD.delTwoFac('${user.userID}'); return false;">Delete</a></td>
102
  <td style="white-space: nowrap;">${user.username}</td>
103
  {{if user.mode == 'phone'}}
104
  <td style="white-space: nowrap;">Phone (${user.phone})</td>
@@ -109,7 +109,12 @@
109
  {{if user.status == 'activated'}}
110
  <span style="color: #0A0;">Cellphone Sign-in Enabled</span>
111
  {{else}}
112
- Enter activation code: <input type="text" id="wfActivate-${user.userID}" size="6" /><input type="button" value="Activate" onclick="WFAD.twoFacActivate('${user.userID}', jQuery('#wfActivate-${user.userID}').val());" />
 
 
 
 
 
113
  {{/if}}
114
  </td>
115
  </tr>
42
  <tr><td><input type="radio" name="wf2faMode" value="phone"></td><td>Send code to a phone number: <input type="text" id="wfPhone" value="" size="20" disabled><br><em>Format: +1-123-555-5034</em></td></tr>
43
  </table>
44
  </td></tr>
45
+ <tr><td colspan="2"><input type="button" class="wf-btn wf-btn-primary" value="Enable Cellphone Sign-in" onclick="WFAD.addTwoFactor(jQuery('#wfUsername').val(), jQuery('#wfPhone').val(), jQuery('input[name=wf2faMode]:checked').val());" /></td></tr>
46
  </table>
47
  <div style="height: 20px;">
48
  <div id="wfTwoFacMsg" style="color: #F00;">
98
  <tbody>
99
  {{each(idx, user) users}}
100
  <tr id="twoFactorUser-${user.userID}">
101
+ <td style="white-space: nowrap; text-align: center;"><a href="#" class="wf-btn wf-btn-default" onclick="WFAD.delTwoFac('${user.userID}'); return false;">Delete</a></td>
102
  <td style="white-space: nowrap;">${user.username}</td>
103
  {{if user.mode == 'phone'}}
104
  <td style="white-space: nowrap;">Phone (${user.phone})</td>
109
  {{if user.status == 'activated'}}
110
  <span style="color: #0A0;">Cellphone Sign-in Enabled</span>
111
  {{else}}
112
+ <div class="wf-form-inline">
113
+ <div class="wf-form-group">
114
+ <label class="wf-plain" style="margin: 0;" for="wfActivate-${user.userID}">Enter activation code:</label> <input class="wf-form-control" type="text" id="wfActivate-${user.userID}" size="6">
115
+ </div>
116
+ <input class="wf-btn wf-btn-default" type="button" value="Activate" onclick="WFAD.twoFacActivate('${user.userID}', jQuery('#wfActivate-${user.userID}').val());">
117
+ </div>
118
  {{/if}}
119
  </td>
120
  </tr>
lib/menu_tools_whois.php CHANGED
@@ -17,7 +17,7 @@ if (!function_exists('fsockopen')) {
17
  ?>
18
  </p>
19
  <p>
20
- <input type="text" name="whois" id="wfwhois" value="" size="60" maxlength="255" onkeydown="if(event.keyCode == 13){ WFAD.whois(jQuery('#wfwhois').val()); }" />&nbsp;<input type="button" name="whoisbutton" id="whoisbutton" class="button-primary" value="Look up IP or Domain" onclick="WFAD.whois(jQuery('#wfwhois').val());">
21
  </p>
22
  <?php if(isset($_GET['wfnetworkblock']) && $_GET['wfnetworkblock']) { ?>
23
  <h2>How to block a network</h2>
17
  ?>
18
  </p>
19
  <p>
20
+ <input type="text" name="whois" id="wfwhois" value="" size="60" maxlength="255" onkeydown="if(event.keyCode == 13){ WFAD.whois(jQuery('#wfwhois').val()); }" />&nbsp;<input type="button" name="whoisbutton" id="whoisbutton" class="wf-btn wf-btn-primary" value="Look up IP or Domain" onclick="WFAD.whois(jQuery('#wfwhois').val());">
21
  </p>
22
  <?php if(isset($_GET['wfnetworkblock']) && $_GET['wfnetworkblock']) { ?>
23
  <h2>How to block a network</h2>
lib/pageTitle.php CHANGED
@@ -5,7 +5,7 @@
5
  <?php if (isset($wantsLiveActivity) && $wantsLiveActivity): ?><div class="wf-col-xs-12"><?php include('live_activity.php'); ?></div><?php endif; ?>
6
  <div class="wf-col-xs-12">
7
  <?php if (isset($options)): ?>
8
- <h2 class="nav-tab-wrapper" id="wordfenceTopTabs">
9
  <?php foreach ($options as $info): ?>
10
  <a class="nav-tab" id="<?php echo esc_html($info['a']); ?>-tab" href="#top#<?php echo esc_html($info['a']); ?>"><?php echo esc_html($info['t']); ?></a>
11
  <?php endforeach; ?>
5
  <?php if (isset($wantsLiveActivity) && $wantsLiveActivity): ?><div class="wf-col-xs-12"><?php include('live_activity.php'); ?></div><?php endif; ?>
6
  <div class="wf-col-xs-12">
7
  <?php if (isset($options)): ?>
8
+ <h2 class="nav-tab-wrapper<?php if (count($options) <= 1 || (isset($hideBar) && $hideBar)) { echo ' wf-hidden'; } ?>" id="wordfenceTopTabs">
9
  <?php foreach ($options as $info): ?>
10
  <a class="nav-tab" id="<?php echo esc_html($info['a']); ?>-tab" href="#top#<?php echo esc_html($info['a']); ?>"><?php echo esc_html($info['t']); ?></a>
11
  <?php endforeach; ?>
lib/wfAPI.php CHANGED
@@ -48,9 +48,18 @@ class wfAPI {
48
  if (isset($dat['_hasKeyConflict'])) {
49
  $hasKeyConflict = ($dat['_hasKeyConflict'] == 1);
50
  if ($hasKeyConflict) {
51
- //new wfNotification(null, wfNotification::PRIORITY_DEFAULT, '<a href="' . network_admin_url('admin.php?page=WordfenceSecOpt') . '">The Wordfence API key you\'re using does not match this site\'s address. Premium features are disabled.</a>', 'wfplugin_keyconflict', null, array(array('link' => 'https://www.wordfence.com/manage-wordfence-api-keys/', 'label' => 'Manage Keys')));
52
  }
53
  }
 
 
 
 
 
 
 
 
 
54
  wfConfig::set('hasKeyConflict', $hasKeyConflict);
55
 
56
  if (!is_array($dat)) {
@@ -117,18 +126,10 @@ class wfAPI {
117
  }
118
 
119
  public function makeAPIQueryString() {
120
- $siteurl = '';
121
- if (function_exists('get_bloginfo')) {
122
- if (is_multisite()) {
123
- $siteurl = network_home_url();
124
- $siteurl = rtrim($siteurl, '/'); //Because previously we used get_bloginfo and it returns http://example.com without a '/' char.
125
- } else {
126
- $siteurl = home_url();
127
- }
128
- }
129
  return self::buildQuery(array(
130
  'v' => $this->wordpressVersion,
131
- 's' => $siteurl,
132
  'k' => $this->APIKey,
133
  'openssl' => function_exists('openssl_verify') && defined('OPENSSL_VERSION_NUMBER') ? OPENSSL_VERSION_NUMBER : '0.0.0',
134
  'phpv' => phpversion(),
48
  if (isset($dat['_hasKeyConflict'])) {
49
  $hasKeyConflict = ($dat['_hasKeyConflict'] == 1);
50
  if ($hasKeyConflict) {
51
+ new wfNotification(null, wfNotification::PRIORITY_DEFAULT, '<a href="' . network_admin_url('admin.php?page=WordfenceSecOpt') . '">The Wordfence API key you\'re using does not match this site\'s address. Premium features are disabled.</a>', 'wfplugin_keyconflict', null, array(array('link' => 'https://www.wordfence.com/manage-wordfence-api-keys/', 'label' => 'Manage Keys')));
52
  }
53
  }
54
+
55
+ if (!$hasKeyConflict) {
56
+ $n = wfNotification::getNotificationForCategory('wfplugin_keyconflict');
57
+ if ($n !== null) {
58
+ wordfence::status(1, 'info', 'Idle');
59
+ $n->markAsRead();
60
+ }
61
+ }
62
+
63
  wfConfig::set('hasKeyConflict', $hasKeyConflict);
64
 
65
  if (!is_array($dat)) {
126
  }
127
 
128
  public function makeAPIQueryString() {
129
+ $homeurl = wfUtils::wpHomeURL();
 
 
 
 
 
 
 
 
130
  return self::buildQuery(array(
131
  'v' => $this->wordpressVersion,
132
+ 's' => $homeurl,
133
  'k' => $this->APIKey,
134
  'openssl' => function_exists('openssl_verify') && defined('OPENSSL_VERSION_NUMBER') ? OPENSSL_VERSION_NUMBER : '0.0.0',
135
  'phpv' => phpversion(),
lib/wfActivityReport.php CHANGED
@@ -254,15 +254,21 @@ SQL
254
  * @param int $limit
255
  * @return array
256
  */
257
- public function getTopCountriesBlocked($limit = 10) {
258
- $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 7 day)) / 86400)';
259
- switch (wfConfig::get('email_summary_interval', 'weekly')) {
260
- case 'daily':
261
- $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 day)) / 86400)';
262
- break;
263
- case 'monthly':
264
- $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 month)) / 86400)';
265
- break;
 
 
 
 
 
 
266
  }
267
 
268
  $results = $this->db->get_results($this->db->prepare(<<<SQL
@@ -357,9 +363,9 @@ SQL
357
  *
358
  * @return array|bool
359
  */
360
- public function getUpdatesNeeded() {
361
  $update_check = new wfUpdateCheck();
362
- $needs_update = $update_check->checkAllUpdates()
363
  ->needsAnyUpdates();
364
  if ($needs_update) {
365
  return array(
254
  * @param int $limit
255
  * @return array
256
  */
257
+ public function getTopCountriesBlocked($limit = 10, $maxAgeDays = null) {
258
+ $maxAgeDays = (int) $maxAgeDays;
259
+ if ($maxAgeDays <= 0) {
260
+ $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 7 day)) / 86400)';
261
+ switch (wfConfig::get('email_summary_interval', 'weekly')) {
262
+ case 'daily':
263
+ $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 day)) / 86400)';
264
+ break;
265
+ case 'monthly':
266
+ $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 month)) / 86400)';
267
+ break;
268
+ }
269
+ }
270
+ else {
271
+ $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval ' . $maxAgeDays . ' day)) / 86400)';
272
  }
273
 
274
  $results = $this->db->get_results($this->db->prepare(<<<SQL
363
  *
364
  * @return array|bool
365
  */
366
+ public function getUpdatesNeeded($useCachedValued = true) {
367
  $update_check = new wfUpdateCheck();
368
+ $needs_update = $update_check->checkAllUpdates($useCachedValued)
369
  ->needsAnyUpdates();
370
  if ($needs_update) {
371
  return array(
lib/wfDashboard.php CHANGED
@@ -118,16 +118,16 @@ class wfDashboard {
118
  // Top IPs Blocked
119
  $activityReport = new wfActivityReport();
120
  $this->ips24h = (array) $activityReport->getTopIPsBlocked(100, 1);
121
- foreach ($this->ips24h as &$r) {
122
- $r = (array) $r;
123
  }
124
  $this->ips7d = (array) $activityReport->getTopIPsBlocked(100, 7);
125
- foreach ($this->ips7d as &$r) {
126
- $r = (array) $r;
127
  }
128
  $this->ips30d = (array) $activityReport->getTopIPsBlocked(100, 30);
129
- foreach ($this->ips30d as &$r) {
130
- $r = (array) $r;
131
  }
132
 
133
  // Recent Logins
@@ -156,10 +156,20 @@ class wfDashboard {
156
  }
157
 
158
  // Blocked Countries
159
- $this->countriesLocal = (array) $activityReport->getTopCountriesBlocked(10);
160
- foreach ($this->countriesLocal as &$r) {
161
- $r = (array) $r;
 
 
 
 
 
 
 
 
 
 
 
162
  }
163
- //TODO: countries network
164
  }
165
  }
118
  // Top IPs Blocked
119
  $activityReport = new wfActivityReport();
120
  $this->ips24h = (array) $activityReport->getTopIPsBlocked(100, 1);
121
+ foreach ($this->ips24h as &$r24h) {
122
+ $r24h = (array) $r24h;
123
  }
124
  $this->ips7d = (array) $activityReport->getTopIPsBlocked(100, 7);
125
+ foreach ($this->ips7d as &$r7d) {
126
+ $r7d = (array) $r7d;
127
  }
128
  $this->ips30d = (array) $activityReport->getTopIPsBlocked(100, 30);
129
+ foreach ($this->ips30d as &$r30d) {
130
+ $r30d = (array) $r30d;
131
  }
132
 
133
  // Recent Logins
156
  }
157
 
158
  // Blocked Countries
159
+ $this->countriesLocal = (array) $activityReport->getTopCountriesBlocked(10, 7);
160
+ foreach ($this->countriesLocal as &$rLocal) {
161
+ $rLocal = (array) $rLocal;
162
+ }
163
+
164
+ if (is_array($data) && isset($data['countries']) && isset($data['countries']['7d'])) {
165
+ $networkCountries = array();
166
+ foreach ($data['countries']['7d'] as $rNetwork) {
167
+ $countryCode = $rNetwork['cd'];
168
+ $countryName = $activityReport->getCountryNameByCode($countryCode);
169
+ $totalBlockCount = $rNetwork['ct'];
170
+ $networkCountries[] = array('countryCode' => $countryCode, 'countryName' => $countryName, 'totalBlockCount' => $totalBlockCount);
171
+ }
172
+ $this->countriesNetwork = $networkCountries;
173
  }
 
174
  }
175
  }
lib/wfGeoIP.php CHANGED
@@ -20,746 +20,745 @@
20
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
  */
22
  if(! class_exists('wfGeoIP')){
23
- define("GEOIP_COUNTRY_BEGIN", 16776960);
24
- define("GEOIP_STATE_BEGIN_REV0", 16700000);
25
- define("GEOIP_STATE_BEGIN_REV1", 16000000);
26
- define("GEOIP_STANDARD", 0);
27
- define("GEOIP_MEMORY_CACHE", 1);
28
- define("GEOIP_SHARED_MEMORY", 2);
29
- define("STRUCTURE_INFO_MAX_SIZE", 20);
30
- define("DATABASE_INFO_MAX_SIZE", 100);
31
- define("GEOIP_COUNTRY_EDITION", 106);
32
- define("GEOIP_PROXY_EDITION", 8);
33
- define("GEOIP_ASNUM_EDITION", 9);
34
- define("GEOIP_NETSPEED_EDITION", 10);
35
- define("GEOIP_REGION_EDITION_REV0", 112);
36
- define("GEOIP_REGION_EDITION_REV1", 3);
37
- define("GEOIP_CITY_EDITION_REV0", 111);
38
- define("GEOIP_CITY_EDITION_REV1", 2);
39
- define("GEOIP_ORG_EDITION", 110);
40
- define("GEOIP_ISP_EDITION", 4);
41
- define("SEGMENT_RECORD_LENGTH", 3);
42
- define("STANDARD_RECORD_LENGTH", 3);
43
- define("ORG_RECORD_LENGTH", 4);
44
- define("MAX_RECORD_LENGTH", 4);
45
- define("MAX_ORG_RECORD_LENGTH", 300);
46
- define("GEOIP_SHM_KEY", 0x4f415401);
47
- define("US_OFFSET", 1);
48
- define("CANADA_OFFSET", 677);
49
- define("WORLD_OFFSET", 1353);
50
- define("FIPS_RANGE", 360);
51
- define("GEOIP_UNKNOWN_SPEED", 0);
52
- define("GEOIP_DIALUP_SPEED", 1);
53
- define("GEOIP_CABLEDSL_SPEED", 2);
54
- define("GEOIP_CORPORATE_SPEED", 3);
55
- define("GEOIP_DOMAIN_EDITION", 11);
56
- define("GEOIP_COUNTRY_EDITION_V6", 12);
57
- define("GEOIP_LOCATIONA_EDITION", 13);
58
- define("GEOIP_ACCURACYRADIUS_EDITION", 14);
59
- define("GEOIP_CITYCOMBINED_EDITION", 15);
60
- define("GEOIP_CITY_EDITION_REV1_V6", 30);
61
- define("GEOIP_CITY_EDITION_REV0_V6",31);
62
- define("GEOIP_NETSPEED_EDITION_REV1",32);
63
- define("GEOIP_NETSPEED_EDITION_REV1_V6",33);
64
- define("GEOIP_USERTYPE_EDITION",28);
65
- define("GEOIP_USERTYPE_EDITION_V6",29);
66
- define("GEOIP_ASNUM_EDITION_V6",21);
67
- define("GEOIP_ISP_EDITION_V6",22);
68
- define("GEOIP_ORG_EDITION_V6",23);
69
- define("GEOIP_DOMAIN_EDITION_V6",24);
70
-
71
- define("CITYCOMBINED_FIXED_RECORD", 7 );
72
 
73
  class wfGeoIP {
74
- var $flags;
75
- var $filehandle;
76
- var $memory_buffer;
77
- var $databaseType;
78
- var $databaseSegments;
79
- var $record_length;
80
- var $shmid;
81
- var $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
82
- "" => 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5,
83
- "AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "CW" => 10, "AO" => 11,
84
- "AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17,
85
- "AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23,
86
- "BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29,
87
- "BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35,
88
- "BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41,
89
- "CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47,
90
- "CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53,
91
- "CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59,
92
- "DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65,
93
- "ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71,
94
- "FM" => 72, "FO" => 73, "FR" => 74, "SX" => 75, "GA" => 76, "GB" => 77,
95
- "GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83,
96
- "GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89,
97
- "GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95,
98
- "HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101,
99
- "IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107,
100
- "IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113,
101
- "KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119,
102
- "KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125,
103
- "LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131,
104
- "LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137,
105
- "MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143,
106
- "MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149,
107
- "MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155,
108
- "NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161,
109
- "NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167,
110
- "PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173,
111
- "PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179,
112
- "PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185,
113
- "RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191,
114
- "SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197,
115
- "SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203,
116
- "SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209,
117
- "TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215,
118
- "TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221,
119
- "UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227,
120
- "VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233,
121
- "VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239,
122
- "ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245,
123
- "O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250, "BL" => 251,
124
- "MF" => 252, "BQ" => 253,
125
- );
126
- var $GEOIP_COUNTRY_CODES = array(
127
- "","AP","EU","AD","AE","AF","AG","AI","AL","AM","CW",
128
- "AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB",
129
- "BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO",
130
- "BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD",
131
- "CF","CG","CH","CI","CK","CL","CM","CN","CO","CR",
132
- "CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO",
133
- "DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ",
134
- "FK","FM","FO","FR","SX","GA","GB","GD","GE","GF",
135
- "GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT",
136
- "GU","GW","GY","HK","HM","HN","HR","HT","HU","ID",
137
- "IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO",
138
- "JP","KE","KG","KH","KI","KM","KN","KP","KR","KW",
139
- "KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT",
140
- "LU","LV","LY","MA","MC","MD","MG","MH","MK","ML",
141
- "MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV",
142
- "MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI",
143
- "NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF",
144
- "PG","PH","PK","PL","PM","PN","PR","PS","PT","PW",
145
- "PY","QA","RE","RO","RU","RW","SA","SB","SC","SD",
146
- "SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO",
147
- "SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH",
148
- "TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW",
149
- "TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE",
150
- "VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA",
151
- "ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE",
152
- "BL","MF", "BQ");
153
- var $GEOIP_COUNTRY_CODES3 = array(
154
- "","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","CUW",
155
- "AGO","ATA","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB",
156
- "BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL",
157
- "BRA","BHS","BTN","BVT","BWA","BLR","BLZ","CAN","CCK","COD",
158
- "CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI",
159
- "CUB","CPV","CXR","CYP","CZE","DEU","DJI","DNK","DMA","DOM",
160
- "DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI",
161
- "FLK","FSM","FRO","FRA","SXM","GAB","GBR","GRD","GEO","GUF",
162
- "GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","SGS","GTM",
163
- "GUM","GNB","GUY","HKG","HMD","HND","HRV","HTI","HUN","IDN",
164
- "IRL","ISR","IND","IOT","IRQ","IRN","ISL","ITA","JAM","JOR",
165
- "JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT",
166
- "CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
167
- "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI",
168
- "MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV",
169
- "MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC",
170
- "NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF",
171
- "PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW",
172
- "PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN",
173
- "SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM",
174
- "SUR","STP","SLV","SYR","SWZ","TCA","TCD","ATF","TGO","THA",
175
- "TJK","TKL","TKM","TUN","TON","TLS","TUR","TTO","TUV","TWN",
176
- "TZA","UKR","UGA","UMI","USA","URY","UZB","VAT","VCT","VEN",
177
- "VGB","VIR","VNM","VUT","WLF","WSM","YEM","MYT","SRB","ZAF",
178
- "ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY",
179
- "BLM","MAF", "BES"
180
- );
181
- var $GEOIP_COUNTRY_NAMES = array(
182
- "","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Curacao",
183
- "Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados",
184
- "Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia",
185
- "Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the",
186
- "Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica",
187
- "Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic",
188
- "Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji",
189
- "Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","Sint Maarten (Dutch part)","Gabon","United Kingdom","Grenada","Georgia","French Guiana",
190
- "Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala",
191
- "Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia",
192
- "Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan",
193
- "Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis","Korea, Democratic People's Republic of","Korea, Republic of","Kuwait",
194
- "Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania",
195
- "Luxembourg","Latvia","Libya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali",
196
- "Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives",
197
- "Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua",
198
- "Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia",
199
- "Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau",
200
- "Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan",
201
- "Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname",
202
- "Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand",
203
- "Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago","Tuvalu","Taiwan",
204
- "Tanzania, United Republic of","Ukraine","Uganda","United States Minor Outlying Islands","United States","Uruguay","Uzbekistan","Holy See (Vatican City State)","Saint Vincent and the Grenadines","Venezuela",
205
- "Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia","South Africa",
206
- "Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey",
207
- "Saint Barthelemy","Saint Martin", "Bonaire, Saint Eustatius and Saba"
208
- );
209
-
210
- var $GEOIP_CONTINENT_CODES = array(
211
- "--", "AS","EU","EU","AS","AS","NA","NA","EU","AS","NA",
212
- "AF","AN","SA","OC","EU","OC","NA","AS","EU","NA",
213
- "AS","EU","AF","EU","AS","AF","AF","NA","AS","SA",
214
- "SA","NA","AS","AN","AF","EU","NA","NA","AS","AF",
215
- "AF","AF","EU","AF","OC","SA","AF","AS","SA","NA",
216
- "NA","AF","AS","AS","EU","EU","AF","EU","NA","NA",
217
- "AF","SA","EU","AF","AF","AF","EU","AF","EU","OC",
218
- "SA","OC","EU","EU","NA","AF","EU","NA","AS","SA",
219
- "AF","EU","NA","AF","AF","NA","AF","EU","AN","NA",
220
- "OC","AF","SA","AS","AN","NA","EU","NA","EU","AS",
221
- "EU","AS","AS","AS","AS","AS","EU","EU","NA","AS",
222
- "AS","AF","AS","AS","OC","AF","NA","AS","AS","AS",
223
- "NA","AS","AS","AS","NA","EU","AS","AF","AF","EU",
224
- "EU","EU","AF","AF","EU","EU","AF","OC","EU","AF",
225
- "AS","AS","AS","OC","NA","AF","NA","EU","AF","AS",
226
- "AF","NA","AS","AF","AF","OC","AF","OC","AF","NA",
227
- "EU","EU","AS","OC","OC","OC","AS","NA","SA","OC",
228
- "OC","AS","AS","EU","NA","OC","NA","AS","EU","OC",
229
- "SA","AS","AF","EU","EU","AF","AS","OC","AF","AF",
230
- "EU","AS","AF","EU","EU","EU","AF","EU","AF","AF",
231
- "SA","AF","NA","AS","AF","NA","AF","AN","AF","AS",
232
- "AS","OC","AS","AF","OC","AS","EU","NA","OC","AS",
233
- "AF","EU","AF","OC","NA","SA","AS","EU","NA","SA",
234
- "NA","NA","AS","OC","OC","OC","AS","AF","EU","AF",
235
- "AF","EU","AF","--","--","--","EU","EU","EU","EU",
236
- "NA","NA","NA"
237
- );
238
-
239
- }
240
- if(! function_exists('geoip_load_shared_mem')){
241
- function geoip_load_shared_mem ($file) {
242
-
243
- $fp = fopen($file, "rb");
244
- if (!$fp) {
245
- print "error opening $file: $php_errormsg\n";
246
- exit;
247
- }
248
- $s_array = fstat($fp);
249
- $size = $s_array['size'];
250
- if ($shmid = @shmop_open (GEOIP_SHM_KEY, "w", 0, 0)) {
251
- shmop_delete ($shmid);
252
- shmop_close ($shmid);
253
- }
254
- $shmid = shmop_open (GEOIP_SHM_KEY, "c", 0644, $size);
255
- shmop_write ($shmid, fread($fp, $size), 0);
256
- shmop_close ($shmid);
257
- }
258
  }
259
-
260
- if(! function_exists('')){
261
- function _setup_segments($gi){
262
- $gi->databaseType = GEOIP_COUNTRY_EDITION;
263
- $gi->record_length = STANDARD_RECORD_LENGTH;
264
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
265
- $offset = @shmop_size ($gi->shmid) - 3;
266
- for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
267
- $delim = @shmop_read ($gi->shmid, $offset, 3);
268
- $offset += 3;
269
- if ($delim == (chr(255).chr(255).chr(255))) {
270
- $gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1));
271
- $offset++;
272
-
273
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
274
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
275
- } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
276
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
277
- } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)||
278
- ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
279
- || ($gi->databaseType == GEOIP_ORG_EDITION)
280
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
281
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
282
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
283
- || ($gi->databaseType == GEOIP_ISP_EDITION)
284
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
285
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION)
286
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
287
- || ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
288
- || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
289
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
290
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
291
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
292
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
293
- || ($gi->databaseType == GEOIP_ASNUM_EDITION)
294
- || ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
295
- $gi->databaseSegments = 0;
296
- $buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH);
297
- for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
298
- $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
299
  }
300
- if (($gi->databaseType == GEOIP_ORG_EDITION)
301
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
302
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
303
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
304
- || ($gi->databaseType == GEOIP_ISP_EDITION)
305
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)) {
306
- $gi->record_length = ORG_RECORD_LENGTH;
307
  }
308
- }
309
- break;
310
- } else {
311
- $offset -= 4;
312
- }
313
- }
314
- if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
315
- ($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
316
- ($gi->databaseType == GEOIP_PROXY_EDITION)||
317
- ($gi->databaseType == GEOIP_NETSPEED_EDITION)){
318
- $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
319
- }
320
- } else {
321
- $filepos = ftell($gi->filehandle);
322
- fseek($gi->filehandle, -3, SEEK_END);
323
- for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
324
- $delim = fread($gi->filehandle,3);
325
- if ($delim == (chr(255).chr(255).chr(255))){
326
- $gi->databaseType = ord(fread($gi->filehandle,1));
327
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
328
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
329
  }
330
- else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
331
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
332
- } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)
333
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
334
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
335
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
336
- || ($gi->databaseType == GEOIP_ORG_EDITION)
337
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
338
- || ($gi->databaseType == GEOIP_ISP_EDITION)
339
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
340
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
341
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
342
- || ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
343
- || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
344
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
345
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
346
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
347
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
348
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION)
349
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
350
- || ($gi->databaseType == GEOIP_ASNUM_EDITION)
351
- || ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
352
- $gi->databaseSegments = 0;
353
- $buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH);
354
- for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
355
- $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
356
- }
357
- if ( ( $gi->databaseType == GEOIP_ORG_EDITION )
358
- || ( $gi->databaseType == GEOIP_DOMAIN_EDITION )
359
- || ( $gi->databaseType == GEOIP_ISP_EDITION )
360
- || ( $gi->databaseType == GEOIP_ORG_EDITION_V6 )
361
- || ( $gi->databaseType == GEOIP_DOMAIN_EDITION_V6 )
362
- || ( $gi->databaseType == GEOIP_ISP_EDITION_V6 )) {
363
- $gi->record_length = ORG_RECORD_LENGTH;
364
- }
365
- }
366
- break;
367
- } else {
368
- fseek($gi->filehandle, -4, SEEK_CUR);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
369
  }
370
- }
371
- if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
372
- ($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
373
- ($gi->databaseType == GEOIP_PROXY_EDITION)||
374
- ($gi->databaseType == GEOIP_NETSPEED_EDITION)){
375
- $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
376
- }
377
- fseek($gi->filehandle,$filepos,SEEK_SET);
378
- }
379
- return $gi;
380
  }
381
- }
382
-
383
- if(! function_exists('geoip_open')){
384
- function geoip_open($filename, $flags) {
385
- $gi = new wfGeoIP;
386
- $gi->flags = $flags;
387
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
388
- $gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0);
389
- } else {
390
- $gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" );
391
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
392
- $s_array = fstat($gi->filehandle);
393
- $gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
394
- }
395
- }
396
-
397
- $gi = _setup_segments($gi);
398
- return $gi;
399
  }
400
- }
401
-
402
- if(! function_exists('geoip_close')){
403
- function geoip_close($gi) {
404
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
405
- return true;
406
- }
407
-
408
- return fclose($gi->filehandle);
409
  }
410
- }
411
-
412
- if(! function_exists('geoip_country_id_by_name_v6')){
413
- function geoip_country_id_by_name_v6($gi, $name) {
414
- $rec = @dns_get_record($name, DNS_AAAA);
415
- if ( !$rec ) {
416
- return false;
417
- }
418
- $addr = $rec[0]["ipv6"];
419
- if (!$addr || $addr == $name) {
420
- return false;
421
- }
422
- return geoip_country_id_by_addr_v6($gi, $addr);
423
  }
424
- }
425
-
426
- if(! function_exists('geoip_country_id_by_name')){
427
- function geoip_country_id_by_name($gi, $name) {
428
- $addr = gethostbyname($name);
429
- if (!$addr || $addr == $name) {
430
- return false;
431
- }
432
- return geoip_country_id_by_addr($gi, $addr);
433
  }
434
- }
435
-
436
- if(! function_exists('geoip_country_id_by_name')){
437
- function geoip_country_code_by_name_v6($gi, $name) {
438
- $country_id = geoip_country_id_by_name_v6($gi,$name);
439
- if ($country_id !== false) {
440
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
441
- }
442
- return false;
443
  }
444
- }
445
-
446
- if(! function_exists('geoip_country_code_by_name')){
447
- function geoip_country_code_by_name($gi, $name) {
448
- $country_id = geoip_country_id_by_name($gi,$name);
449
- if ($country_id !== false) {
450
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
451
- }
452
- return false;
453
  }
454
- }
455
-
456
- if(! function_exists('geoip_country_name_by_name_v6')){
457
- function geoip_country_name_by_name_v6($gi, $name) {
458
- $country_id = geoip_country_id_by_name_v6($gi,$name);
459
- if ($country_id !== false) {
460
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
461
- }
462
- return false;
463
  }
464
- }
465
-
466
- if(! function_exists('geoip_country_name_by_name')){
467
- function geoip_country_name_by_name($gi, $name) {
468
- $country_id = geoip_country_id_by_name($gi,$name);
469
- if ($country_id !== false) {
470
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
471
- }
472
- return false;
473
  }
474
- }
475
-
476
- if(! function_exists('geoip_country_id_by_addr_v6')){
477
- function geoip_country_id_by_addr_v6($gi, $addr) {
478
- $ipnum = wfUtils::inet_pton($addr);
479
- return _geoip_seek_country_v6($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
480
  }
481
- }
482
-
483
- if(! function_exists('geoip_country_id_by_addr')){
484
- function geoip_country_id_by_addr($gi, $addr) {
485
- $ipnum = ip2long($addr);
486
- return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
487
  }
488
- }
489
-
490
- if(! function_exists('geoip_country_code_by_addr_v6')){
491
- function geoip_country_code_by_addr_v6($gi, $addr) {
492
- $country_id = geoip_country_id_by_addr_v6($gi,$addr);
493
- if ($country_id !== false) {
494
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
495
- }
496
- return false;
497
  }
498
- }
499
-
500
- if(! function_exists('geoip_country_code_by_addr')){
501
- function geoip_country_code_by_addr($gi, $addr) {
502
- if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
503
- $record = geoip_record_by_addr($gi,$addr);
504
- if ( $record !== false ) {
505
- return $record->country_code;
506
- }
507
- } else {
508
- $country_id = geoip_country_id_by_addr($gi,$addr);
509
- if ($country_id !== false) {
510
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
511
- }
512
- }
513
- return false;
514
  }
515
- }
516
-
517
- if(! function_exists('geoip_country_name_by_addr_v6')){
518
- function geoip_country_name_by_addr_v6($gi, $addr) {
519
- $country_id = geoip_country_id_by_addr_v6($gi,$addr);
520
- if ($country_id !== false) {
521
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
522
- }
523
- return false;
524
  }
525
- }
526
-
527
- if(! function_exists('geoip_country_name_by_addr')){
528
- function geoip_country_name_by_addr($gi, $addr) {
529
- if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
530
- $record = geoip_record_by_addr($gi,$addr);
531
- return $record->country_name;
532
- } else {
533
- $country_id = geoip_country_id_by_addr($gi,$addr);
534
- if ($country_id !== false) {
535
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
536
- }
537
- }
538
- return false;
539
  }
540
- }
541
-
542
- if(! function_exists('_geoip_seek_country_v6')){
543
- function _geoip_seek_country_v6($gi, $ipnum) {
544
-
545
- # arrays from unpack start with offset 1
546
- # yet another php mystery. array_merge work around
547
- # this broken behaviour
548
- $v6vec = array_merge(unpack( "C16", $ipnum));
549
-
550
- $offset = 0;
551
- for ($depth = 127; $depth >= 0; --$depth) {
552
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
553
- // workaround php's broken substr, strpos, etc handling with
554
- // mbstring.func_overload and mbstring.internal_encoding
555
- $enc = mb_internal_encoding();
556
- mb_internal_encoding('ISO-8859-1');
557
-
558
- $buf = substr($gi->memory_buffer,
559
- 2 * $gi->record_length * $offset,
560
- 2 * $gi->record_length);
561
-
562
- mb_internal_encoding($enc);
563
- } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
564
- $buf = @shmop_read ($gi->shmid,
565
- 2 * $gi->record_length * $offset,
566
- 2 * $gi->record_length );
567
- } else {
568
- fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
569
- or die("fseek failed");
570
- $buf = fread($gi->filehandle, 2 * $gi->record_length);
571
- }
572
- $x = array(0,0);
573
- for ($i = 0; $i < 2; ++$i) {
574
- for ($j = 0; $j < $gi->record_length; ++$j) {
575
- $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
576
- }
577
- }
578
-
579
- $bnum = 127 - $depth;
580
- $idx = $bnum >> 3;
581
- $b_mask = 1 << ( $bnum & 7 ^ 7 );
582
- if (($v6vec[$idx] & $b_mask) > 0) {
583
- if ($x[1] >= $gi->databaseSegments) {
584
- return $x[1];
585
- }
586
- $offset = $x[1];
587
- } else {
588
- if ($x[0] >= $gi->databaseSegments) {
589
- return $x[0];
590
- }
591
- $offset = $x[0];
592
- }
593
- }
594
- trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
595
- return false;
596
  }
597
- }
598
-
599
- if(! function_exists('_geoip_seek_country')){
600
- function _geoip_seek_country($gi, $ipnum) {
601
- $offset = 0;
602
- for ($depth = 31; $depth >= 0; --$depth) {
603
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
604
- // workaround php's broken substr, strpos, etc handling with
605
- // mbstring.func_overload and mbstring.internal_encoding
606
- $enc = mb_internal_encoding();
607
- mb_internal_encoding('ISO-8859-1');
608
-
609
- $buf = substr($gi->memory_buffer,
610
- 2 * $gi->record_length * $offset,
611
- 2 * $gi->record_length);
612
-
613
- mb_internal_encoding($enc);
614
- } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
615
- $buf = @shmop_read ($gi->shmid,
616
- 2 * $gi->record_length * $offset,
617
- 2 * $gi->record_length );
618
- } else {
619
- fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
620
- or die("fseek failed");
621
- $buf = fread($gi->filehandle, 2 * $gi->record_length);
622
- }
623
- $x = array(0,0);
624
- for ($i = 0; $i < 2; ++$i) {
625
- for ($j = 0; $j < $gi->record_length; ++$j) {
626
- $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
627
- }
628
- }
629
- if ($ipnum & (1 << $depth)) {
630
- if ($x[1] >= $gi->databaseSegments) {
631
- return $x[1];
632
- }
633
- $offset = $x[1];
634
- } else {
635
- if ($x[0] >= $gi->databaseSegments) {
636
- return $x[0];
637
- }
638
- $offset = $x[0];
639
- }
640
- }
641
- trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
642
- return false;
643
  }
644
- }
645
-
646
- if(! function_exists('_common_get_org')){
647
- function _common_get_org($gi, $seek_org){
648
- $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
649
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
650
- $org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH);
651
- } else {
652
- fseek($gi->filehandle, $record_pointer, SEEK_SET);
653
- $org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH);
654
- }
655
- // workaround php's broken substr, strpos, etc handling with
656
- // mbstring.func_overload and mbstring.internal_encoding
657
- $enc = mb_internal_encoding();
658
- mb_internal_encoding('ISO-8859-1');
659
- $org_buf = substr($org_buf, 0, strpos($org_buf, "\0"));
660
- mb_internal_encoding($enc);
661
- return $org_buf;
662
  }
663
- }
664
-
665
- if(! function_exists('_get_org_v6')){
666
- function _get_org_v6($gi,$ipnum){
667
- $seek_org = _geoip_seek_country_v6($gi,$ipnum);
668
- if ($seek_org == $gi->databaseSegments) {
669
- return NULL;
670
- }
671
- return _common_get_org($gi, $seek_org);
672
  }
673
- }
674
-
675
- if(! function_exists('_get_org')){
676
- function _get_org($gi,$ipnum){
677
- $seek_org = _geoip_seek_country($gi,$ipnum);
678
- if ($seek_org == $gi->databaseSegments) {
679
- return NULL;
680
- }
681
- return _common_get_org($gi, $seek_org);
682
  }
683
- }
684
-
685
- if(! function_exists('geoip_name_by_addr_v6')){
686
- function geoip_name_by_addr_v6 ($gi,$addr) {
687
- if ($addr == NULL) {
688
- return 0;
689
- }
690
- $ipnum = wfUtils::inet_pton($addr);
691
- return _get_org_v6($gi, $ipnum);
692
  }
693
- }
694
-
695
- if(! function_exists('geoip_name_by_addr')){
696
- function geoip_name_by_addr ($gi,$addr) {
697
- if ($addr == NULL) {
698
- return 0;
699
- }
700
- $ipnum = ip2long($addr);
701
- return _get_org($gi, $ipnum);
702
  }
703
- }
704
-
705
- if(! function_exists('geoip_org_by_addr')){
706
- function geoip_org_by_addr ($gi,$addr) {
707
- return geoip_name_by_addr($gi, $addr);
708
  }
709
- }
710
-
711
- if(! function_exists('_get_region')){
712
- function _get_region($gi,$ipnum){
713
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
714
- $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0;
715
- if ($seek_region >= 1000){
716
- $country_code = "US";
717
- $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);
718
- } else {
719
- $country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region];
720
- $region = "";
721
- }
722
- return array ($country_code,$region);
723
- } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
724
- $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1;
725
- //print $seek_region;
726
- if ($seek_region < US_OFFSET){
727
- $country_code = "";
728
- $region = "";
729
- } else if ($seek_region < CANADA_OFFSET) {
730
- $country_code = "US";
731
- $region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65);
732
- } else if ($seek_region < WORLD_OFFSET) {
733
- $country_code = "CA";
734
- $region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65);
735
- } else {
736
- $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE];
737
- $region = "";
738
- }
739
- return array ($country_code,$region);
740
- }
741
  }
742
- }
743
-
744
- if(! function_exists('geoip_region_by_addr')){
745
- function geoip_region_by_addr ($gi,$addr) {
746
- if ($addr == NULL) {
747
- return 0;
748
- }
749
- $ipnum = ip2long($addr);
750
- return _get_region($gi, $ipnum);
751
  }
752
- }
753
-
754
- if(! function_exists('getdnsattributes')){
755
- function getdnsattributes ($l,$ip){
756
- $r = new Net_DNS_Resolver();
757
- $r->nameservers = array("ws1.maxmind.com");
758
- $p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN");
759
- $str = is_object($p->answer[0])?$p->answer[0]->string():'';
760
- $str = substr( $str, 1, -1 );
761
- return $str;
762
  }
763
  }
764
- }
765
  ?>
20
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
  */
22
  if(! class_exists('wfGeoIP')){
23
+ if (!defined("WF_GEOIP_COUNTRY_BEGIN")) { define("WF_GEOIP_COUNTRY_BEGIN", 16776960); }
24
+ if (!defined("WF_GEOIP_STATE_BEGIN_REV0")) { define("WF_GEOIP_STATE_BEGIN_REV0", 16700000); }
25
+ if (!defined("WF_GEOIP_STATE_BEGIN_REV1")) { define("WF_GEOIP_STATE_BEGIN_REV1", 16000000); }
26
+ if (!defined("WF_GEOIP_STANDARD")) { define("WF_GEOIP_STANDARD", 0); }
27
+ if (!defined("WF_GEOIP_MEMORY_CACHE")) { define("WF_GEOIP_MEMORY_CACHE", 1); }
28
+ if (!defined("WF_GEOIP_SHARED_MEMORY")) { define("WF_GEOIP_SHARED_MEMORY", 2); }
29
+ if (!defined("WF_STRUCTURE_INFO_MAX_SIZE")) { define("WF_STRUCTURE_INFO_MAX_SIZE", 20); }
30
+ if (!defined("WF_DATABASE_INFO_MAX_SIZE")) { define("WF_DATABASE_INFO_MAX_SIZE", 100); }
31
+ if (!defined("WF_GEOIP_COUNTRY_EDITION")) { define("WF_GEOIP_COUNTRY_EDITION", 106); }
32
+ if (!defined("WF_GEOIP_PROXY_EDITION")) { define("WF_GEOIP_PROXY_EDITION", 8); }
33
+ if (!defined("WF_GEOIP_ASNUM_EDITION")) { define("WF_GEOIP_ASNUM_EDITION", 9); }
34
+ if (!defined("WF_GEOIP_NETSPEED_EDITION")) { define("WF_GEOIP_NETSPEED_EDITION", 10); }
35
+ if (!defined("WF_GEOIP_REGION_EDITION_REV0")) { define("WF_GEOIP_REGION_EDITION_REV0", 112); }
36
+ if (!defined("WF_GEOIP_REGION_EDITION_REV1")) { define("WF_GEOIP_REGION_EDITION_REV1", 3); }
37
+ if (!defined("WF_GEOIP_CITY_EDITION_REV0")) { define("WF_GEOIP_CITY_EDITION_REV0", 111); }
38
+ if (!defined("WF_GEOIP_CITY_EDITION_REV1")) { define("WF_GEOIP_CITY_EDITION_REV1", 2); }
39
+ if (!defined("WF_GEOIP_ORG_EDITION")) { define("WF_GEOIP_ORG_EDITION", 110); }
40
+ if (!defined("WF_GEOIP_ISP_EDITION")) { define("WF_GEOIP_ISP_EDITION", 4); }
41
+ if (!defined("WF_SEGMENT_RECORD_LENGTH")) { define("WF_SEGMENT_RECORD_LENGTH", 3); }
42
+ if (!defined("WF_STANDARD_RECORD_LENGTH")) { define("WF_STANDARD_RECORD_LENGTH", 3); }
43
+ if (!defined("WF_ORG_RECORD_LENGTH")) { define("WF_ORG_RECORD_LENGTH", 4); }
44
+ if (!defined("WF_MAX_RECORD_LENGTH")) { define("WF_MAX_RECORD_LENGTH", 4); }
45
+ if (!defined("WF_MAX_ORG_RECORD_LENGTH")) { define("WF_MAX_ORG_RECORD_LENGTH", 300); }
46
+ if (!defined("WF_GEOIP_SHM_KEY")) { define("WF_GEOIP_SHM_KEY", 0x4f415401); }
47
+ if (!defined("WF_US_OFFSET")) { define("WF_US_OFFSET", 1); }
48
+ if (!defined("WF_CANADA_OFFSET")) { define("WF_CANADA_OFFSET", 677); }
49
+ if (!defined("WF_WORLD_OFFSET")) { define("WF_WORLD_OFFSET", 1353); }
50
+ if (!defined("WF_FIPS_RANGE")) { define("WF_FIPS_RANGE", 360); }
51
+ if (!defined("WF_GEOIP_UNKNOWN_SPEED")) { define("WF_GEOIP_UNKNOWN_SPEED", 0); }
52
+ if (!defined("WF_GEOIP_DIALUP_SPEED")) { define("WF_GEOIP_DIALUP_SPEED", 1); }
53
+ if (!defined("WF_GEOIP_CABLEDSL_SPEED")) { define("WF_GEOIP_CABLEDSL_SPEED", 2); }
54
+ if (!defined("WF_GEOIP_CORPORATE_SPEED")) { define("WF_GEOIP_CORPORATE_SPEED", 3); }
55
+ if (!defined("WF_GEOIP_DOMAIN_EDITION")) { define("WF_GEOIP_DOMAIN_EDITION", 11); }
56
+ if (!defined("WF_GEOIP_COUNTRY_EDITION_V6")) { define("WF_GEOIP_COUNTRY_EDITION_V6", 12); }
57
+ if (!defined("WF_GEOIP_LOCATIONA_EDITION")) { define("WF_GEOIP_LOCATIONA_EDITION", 13); }
58
+ if (!defined("WF_GEOIP_ACCURACYRADIUS_EDITION")) { define("WF_GEOIP_ACCURACYRADIUS_EDITION", 14); }
59
+ if (!defined("WF_GEOIP_CITYCOMBINED_EDITION")) { define("WF_GEOIP_CITYCOMBINED_EDITION", 15); }
60
+ if (!defined("WF_GEOIP_CITY_EDITION_REV1_V6")) { define("WF_GEOIP_CITY_EDITION_REV1_V6", 30); }
61
+ if (!defined("WF_GEOIP_CITY_EDITION_REV0_V6")) { define("WF_GEOIP_CITY_EDITION_REV0_V6",31); }
62
+ if (!defined("WF_GEOIP_NETSPEED_EDITION_REV1")) { define("WF_GEOIP_NETSPEED_EDITION_REV1",32); }
63
+ if (!defined("WF_GEOIP_NETSPEED_EDITION_REV1_V6")) { define("WF_GEOIP_NETSPEED_EDITION_REV1_V6",33); }
64
+ if (!defined("WF_GEOIP_USERTYPE_EDITION")) { define("WF_GEOIP_USERTYPE_EDITION",28); }
65
+ if (!defined("WF_GEOIP_USERTYPE_EDITION_V6")) { define("WF_GEOIP_USERTYPE_EDITION_V6",29); }
66
+ if (!defined("WF_GEOIP_ASNUM_EDITION_V6")) { define("WF_GEOIP_ASNUM_EDITION_V6",21); }
67
+ if (!defined("WF_GEOIP_ISP_EDITION_V6")) { define("WF_GEOIP_ISP_EDITION_V6",22); }
68
+ if (!defined("WF_GEOIP_ORG_EDITION_V6")) { define("WF_GEOIP_ORG_EDITION_V6",23); }
69
+ if (!defined("WF_GEOIP_DOMAIN_EDITION_V6")) { define("WF_GEOIP_DOMAIN_EDITION_V6",24); }
70
+ if (!defined("WF_CITYCOMBINED_FIXED_RECORD")) { define("WF_CITYCOMBINED_FIXED_RECORD", 7); }
 
71
 
72
  class wfGeoIP {
73
+ var $flags;
74
+ var $filehandle;
75
+ var $memory_buffer;
76
+ var $databaseType;
77
+ var $databaseSegments;
78
+ var $record_length;
79
+ var $shmid;
80
+ var $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
81
+ "" => 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5,
82
+ "AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "CW" => 10, "AO" => 11,
83
+ "AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17,
84
+ "AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23,
85
+ "BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29,
86
+ "BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35,
87
+ "BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41,
88
+ "CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47,
89
+ "CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53,
90
+ "CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59,
91
+ "DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65,
92
+ "ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71,
93
+ "FM" => 72, "FO" => 73, "FR" => 74, "SX" => 75, "GA" => 76, "GB" => 77,
94
+ "GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83,
95
+ "GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89,
96
+ "GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95,
97
+ "HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101,
98
+ "IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107,
99
+ "IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113,
100
+ "KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119,
101
+ "KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125,
102
+ "LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131,
103
+ "LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137,
104
+ "MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143,
105
+ "MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149,
106
+ "MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155,
107
+ "NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161,
108
+ "NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167,
109
+ "PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173,
110
+ "PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179,
111
+ "PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185,
112
+ "RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191,
113
+ "SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197,
114
+ "SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203,
115
+ "SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209,
116
+ "TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215,
117
+ "TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221,
118
+ "UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227,
119
+ "VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233,
120
+ "VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239,
121
+ "ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245,
122
+ "O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250, "BL" => 251,
123
+ "MF" => 252, "BQ" => 253,
124
+ );
125
+ var $GEOIP_COUNTRY_CODES = array(
126
+ "","AP","EU","AD","AE","AF","AG","AI","AL","AM","CW",
127
+ "AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB",
128
+ "BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO",
129
+ "BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD",
130
+ "CF","CG","CH","CI","CK","CL","CM","CN","CO","CR",
131
+ "CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO",
132
+ "DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ",
133
+ "FK","FM","FO","FR","SX","GA","GB","GD","GE","GF",
134
+ "GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT",
135
+ "GU","GW","GY","HK","HM","HN","HR","HT","HU","ID",
136
+ "IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO",
137
+ "JP","KE","KG","KH","KI","KM","KN","KP","KR","KW",
138
+ "KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT",
139
+ "LU","LV","LY","MA","MC","MD","MG","MH","MK","ML",
140
+ "MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV",
141
+ "MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI",
142
+ "NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF",
143
+ "PG","PH","PK","PL","PM","PN","PR","PS","PT","PW",
144
+ "PY","QA","RE","RO","RU","RW","SA","SB","SC","SD",
145
+ "SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO",
146
+ "SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH",
147
+ "TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW",
148
+ "TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE",
149
+ "VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA",
150
+ "ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE",
151
+ "BL","MF", "BQ");
152
+ var $GEOIP_COUNTRY_CODES3 = array(
153
+ "","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","CUW",
154
+ "AGO","ATA","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB",
155
+ "BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL",
156
+ "BRA","BHS","BTN","BVT","BWA","BLR","BLZ","CAN","CCK","COD",
157
+ "CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI",
158
+ "CUB","CPV","CXR","CYP","CZE","DEU","DJI","DNK","DMA","DOM",
159
+ "DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI",
160
+ "FLK","FSM","FRO","FRA","SXM","GAB","GBR","GRD","GEO","GUF",
161
+ "GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","SGS","GTM",
162
+ "GUM","GNB","GUY","HKG","HMD","HND","HRV","HTI","HUN","IDN",
163
+ "IRL","ISR","IND","IOT","IRQ","IRN","ISL","ITA","JAM","JOR",
164
+ "JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT",
165
+ "CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
166
+ "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI",
167
+ "MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV",
168
+ "MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC",
169
+ "NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF",
170
+ "PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW",
171
+ "PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN",
172
+ "SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM",
173
+ "SUR","STP","SLV","SYR","SWZ","TCA","TCD","ATF","TGO","THA",
174
+ "TJK","TKL","TKM","TUN","TON","TLS","TUR","TTO","TUV","TWN",
175
+ "TZA","UKR","UGA","UMI","USA","URY","UZB","VAT","VCT","VEN",
176
+ "VGB","VIR","VNM","VUT","WLF","WSM","YEM","MYT","SRB","ZAF",
177
+ "ZMB","MNE","ZWE","A1","A2","O1","ALA","GGY","IMN","JEY",
178
+ "BLM","MAF", "BES"
179
+ );
180
+ var $GEOIP_COUNTRY_NAMES = array(
181
+ "","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Curacao",
182
+ "Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados",
183
+ "Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia",
184
+ "Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the",
185
+ "Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica",
186
+ "Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic",
187
+ "Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji",
188
+ "Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","Sint Maarten (Dutch part)","Gabon","United Kingdom","Grenada","Georgia","French Guiana",
189
+ "Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala",
190
+ "Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia",
191
+ "Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan",
192
+ "Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis","Korea, Democratic People's Republic of","Korea, Republic of","Kuwait",
193
+ "Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania",
194
+ "Luxembourg","Latvia","Libya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali",
195
+ "Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives",
196
+ "Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua",
197
+ "Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia",
198
+ "Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau",
199
+ "Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan",
200
+ "Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname",
201
+ "Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand",
202
+ "Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago","Tuvalu","Taiwan",
203
+ "Tanzania, United Republic of","Ukraine","Uganda","United States Minor Outlying Islands","United States","Uruguay","Uzbekistan","Holy See (Vatican City State)","Saint Vincent and the Grenadines","Venezuela",
204
+ "Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia","South Africa",
205
+ "Zambia","Montenegro","Zimbabwe","Anonymous Proxy","Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey",
206
+ "Saint Barthelemy","Saint Martin", "Bonaire, Saint Eustatius and Saba"
207
+ );
208
+
209
+ var $GEOIP_CONTINENT_CODES = array(
210
+ "--", "AS","EU","EU","AS","AS","NA","NA","EU","AS","NA",
211
+ "AF","AN","SA","OC","EU","OC","NA","AS","EU","NA",
212
+ "AS","EU","AF","EU","AS","AF","AF","NA","AS","SA",
213
+ "SA","NA","AS","AN","AF","EU","NA","NA","AS","AF",
214
+ "AF","AF","EU","AF","OC","SA","AF","AS","SA","NA",
215
+ "NA","AF","AS","AS","EU","EU","AF","EU","NA","NA",
216
+ "AF","SA","EU","AF","AF","AF","EU","AF","EU","OC",
217
+ "SA","OC","EU","EU","NA","AF","EU","NA","AS","SA",
218
+ "AF","EU","NA","AF","AF","NA","AF","EU","AN","NA",
219
+ "OC","AF","SA","AS","AN","NA","EU","NA","EU","AS",
220
+ "EU","AS","AS","AS","AS","AS","EU","EU","NA","AS",
221
+ "AS","AF","AS","AS","OC","AF","NA","AS","AS","AS",
222
+ "NA","AS","AS","AS","NA","EU","AS","AF","AF","EU",
223
+ "EU","EU","AF","AF","EU","EU","AF","OC","EU","AF",
224
+ "AS","AS","AS","OC","NA","AF","NA","EU","AF","AS",
225
+ "AF","NA","AS","AF","AF","OC","AF","OC","AF","NA",
226
+ "EU","EU","AS","OC","OC","OC","AS","NA","SA","OC",
227
+ "OC","AS","AS","EU","NA","OC","NA","AS","EU","OC",
228
+ "SA","AS","AF","EU","EU","AF","AS","OC","AF","AF",
229
+ "EU","AS","AF","EU","EU","EU","AF","EU","AF","AF",
230
+ "SA","AF","NA","AS","AF","NA","AF","AN","AF","AS",
231
+ "AS","OC","AS","AF","OC","AS","EU","NA","OC","AS",
232
+ "AF","EU","AF","OC","NA","SA","AS","EU","NA","SA",
233
+ "NA","NA","AS","OC","OC","OC","AS","AF","EU","AF",
234
+ "AF","EU","AF","--","--","--","EU","EU","EU","EU",
235
+ "NA","NA","NA"
236
+ );
237
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
238
  }
239
+ if(! function_exists('geoip_load_shared_mem')){
240
+ function geoip_load_shared_mem ($file) {
241
+
242
+ $fp = fopen($file, "rb");
243
+ if (!$fp) {
244
+ print "error opening $file: $php_errormsg\n";
245
+ exit;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  }
247
+ $s_array = fstat($fp);
248
+ $size = $s_array['size'];
249
+ if ($shmid = @shmop_open (WF_GEOIP_SHM_KEY, "w", 0, 0)) {
250
+ shmop_delete ($shmid);
251
+ shmop_close ($shmid);
 
 
252
  }
253
+ $shmid = shmop_open (WF_GEOIP_SHM_KEY, "c", 0644, $size);
254
+ shmop_write ($shmid, fread($fp, $size), 0);
255
+ shmop_close ($shmid);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  }
257
+ }
258
+
259
+ if(! function_exists('_setup_segments')){
260
+ function _setup_segments($gi){
261
+ $gi->databaseType = WF_GEOIP_COUNTRY_EDITION;
262
+ $gi->record_length = WF_STANDARD_RECORD_LENGTH;
263
+ if ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
264
+ $offset = @shmop_size ($gi->shmid) - 3;
265
+ for ($i = 0; $i < WF_STRUCTURE_INFO_MAX_SIZE; $i++) {
266
+ $delim = @shmop_read ($gi->shmid, $offset, 3);
267
+ $offset += 3;
268
+ if ($delim == (chr(255).chr(255).chr(255))) {
269
+ $gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1));
270
+ $offset++;
271
+
272
+ if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV0){
273
+ $gi->databaseSegments = WF_GEOIP_STATE_BEGIN_REV0;
274
+ } else if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV1){
275
+ $gi->databaseSegments = WF_GEOIP_STATE_BEGIN_REV1;
276
+ } else if (($gi->databaseType == WF_GEOIP_CITY_EDITION_REV0)||
277
+ ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1)
278
+ || ($gi->databaseType == WF_GEOIP_ORG_EDITION)
279
+ || ($gi->databaseType == WF_GEOIP_ORG_EDITION_V6)
280
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION)
281
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION_V6)
282
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION)
283
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION_V6)
284
+ || ($gi->databaseType == WF_GEOIP_USERTYPE_EDITION)
285
+ || ($gi->databaseType == WF_GEOIP_USERTYPE_EDITION_V6)
286
+ || ($gi->databaseType == WF_GEOIP_LOCATIONA_EDITION)
287
+ || ($gi->databaseType == WF_GEOIP_ACCURACYRADIUS_EDITION)
288
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV0_V6)
289
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1_V6)
290
+ || ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION_REV1)
291
+ || ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION_REV1_V6)
292
+ || ($gi->databaseType == WF_GEOIP_ASNUM_EDITION)
293
+ || ($gi->databaseType == WF_GEOIP_ASNUM_EDITION_V6)){
294
+ $gi->databaseSegments = 0;
295
+ $buf = @shmop_read ($gi->shmid, $offset, WF_SEGMENT_RECORD_LENGTH);
296
+ for ($j = 0;$j < WF_SEGMENT_RECORD_LENGTH;$j++){
297
+ $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
298
+ }
299
+ if (($gi->databaseType == WF_GEOIP_ORG_EDITION)
300
+ || ($gi->databaseType == WF_GEOIP_ORG_EDITION_V6)
301
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION)
302
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION_V6)
303
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION)
304
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION_V6)) {
305
+ $gi->record_length = WF_ORG_RECORD_LENGTH;
306
+ }
307
+ }
308
+ break;
309
+ } else {
310
+ $offset -= 4;
311
+ }
312
+ }
313
+ if (($gi->databaseType == WF_GEOIP_COUNTRY_EDITION)||
314
+ ($gi->databaseType == WF_GEOIP_COUNTRY_EDITION_V6)||
315
+ ($gi->databaseType == WF_GEOIP_PROXY_EDITION)||
316
+ ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION)){
317
+ $gi->databaseSegments = WF_GEOIP_COUNTRY_BEGIN;
318
+ }
319
+ } else {
320
+ $filepos = ftell($gi->filehandle);
321
+ fseek($gi->filehandle, -3, SEEK_END);
322
+ for ($i = 0; $i < WF_STRUCTURE_INFO_MAX_SIZE; $i++) {
323
+ $delim = fread($gi->filehandle,3);
324
+ if ($delim == (chr(255).chr(255).chr(255))){
325
+ $gi->databaseType = ord(fread($gi->filehandle,1));
326
+ if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV0){
327
+ $gi->databaseSegments = WF_GEOIP_STATE_BEGIN_REV0;
328
+ }
329
+ else if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV1){
330
+ $gi->databaseSegments = WF_GEOIP_STATE_BEGIN_REV1;
331
+ } else if (($gi->databaseType == WF_GEOIP_CITY_EDITION_REV0)
332
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1)
333
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV0_V6)
334
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1_V6)
335
+ || ($gi->databaseType == WF_GEOIP_ORG_EDITION)
336
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION)
337
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION)
338
+ || ($gi->databaseType == WF_GEOIP_ORG_EDITION_V6)
339
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION_V6)
340
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION_V6)
341
+ || ($gi->databaseType == WF_GEOIP_LOCATIONA_EDITION)
342
+ || ($gi->databaseType == WF_GEOIP_ACCURACYRADIUS_EDITION)
343
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV0_V6)
344
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1_V6)
345
+ || ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION_REV1)
346
+ || ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION_REV1_V6)
347
+ || ($gi->databaseType == WF_GEOIP_USERTYPE_EDITION)
348
+ || ($gi->databaseType == WF_GEOIP_USERTYPE_EDITION_V6)
349
+ || ($gi->databaseType == WF_GEOIP_ASNUM_EDITION)
350
+ || ($gi->databaseType == WF_GEOIP_ASNUM_EDITION_V6)){
351
+ $gi->databaseSegments = 0;
352
+ $buf = fread($gi->filehandle,WF_SEGMENT_RECORD_LENGTH);
353
+ for ($j = 0;$j < WF_SEGMENT_RECORD_LENGTH;$j++){
354
+ $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
355
+ }
356
+ if ( ( $gi->databaseType == WF_GEOIP_ORG_EDITION )
357
+ || ( $gi->databaseType == WF_GEOIP_DOMAIN_EDITION )
358
+ || ( $gi->databaseType == WF_GEOIP_ISP_EDITION )
359
+ || ( $gi->databaseType == WF_GEOIP_ORG_EDITION_V6 )
360
+ || ( $gi->databaseType == WF_GEOIP_DOMAIN_EDITION_V6 )
361
+ || ( $gi->databaseType == WF_GEOIP_ISP_EDITION_V6 )) {
362
+ $gi->record_length = WF_ORG_RECORD_LENGTH;
363
+ }
364
+ }
365
+ break;
366
+ } else {
367
+ fseek($gi->filehandle, -4, SEEK_CUR);
368
+ }
369
+ }
370
+ if (($gi->databaseType == WF_GEOIP_COUNTRY_EDITION)||
371
+ ($gi->databaseType == WF_GEOIP_COUNTRY_EDITION_V6)||
372
+ ($gi->databaseType == WF_GEOIP_PROXY_EDITION)||
373
+ ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION)){
374
+ $gi->databaseSegments = WF_GEOIP_COUNTRY_BEGIN;
375
+ }
376
+ fseek($gi->filehandle,$filepos,SEEK_SET);
377
+ }
378
+ return $gi;
379
  }
 
 
 
 
 
 
 
 
 
 
380
  }
381
+
382
+ if(! function_exists('geoip_open')){
383
+ function geoip_open($filename, $flags) {
384
+ $gi = new wfGeoIP;
385
+ $gi->flags = $flags;
386
+ if ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
387
+ $gi->shmid = @shmop_open (WF_GEOIP_SHM_KEY, "a", 0, 0);
388
+ } else {
389
+ $gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" );
390
+ if ($gi->flags & WF_GEOIP_MEMORY_CACHE) {
391
+ $s_array = fstat($gi->filehandle);
392
+ $gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
393
+ }
394
+ }
395
+
396
+ $gi = _setup_segments($gi);
397
+ return $gi;
398
+ }
399
  }
400
+
401
+ if(! function_exists('geoip_close')){
402
+ function geoip_close($gi) {
403
+ if ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
404
+ return true;
405
+ }
406
+
407
+ return fclose($gi->filehandle);
408
+ }
409
  }
410
+
411
+ if(! function_exists('geoip_country_id_by_name_v6')){
412
+ function geoip_country_id_by_name_v6($gi, $name) {
413
+ $rec = @dns_get_record($name, DNS_AAAA);
414
+ if ( !$rec ) {
415
+ return false;
416
+ }
417
+ $addr = $rec[0]["ipv6"];
418
+ if (!$addr || $addr == $name) {
419
+ return false;
420
+ }
421
+ return geoip_country_id_by_addr_v6($gi, $addr);
422
+ }
423
  }
424
+
425
+ if(! function_exists('geoip_country_id_by_name')){
426
+ function geoip_country_id_by_name($gi, $name) {
427
+ $addr = gethostbyname($name);
428
+ if (!$addr || $addr == $name) {
429
+ return false;
430
+ }
431
+ return geoip_country_id_by_addr($gi, $addr);
432
+ }
433
  }
434
+
435
+ if(! function_exists('geoip_country_id_by_name')){
436
+ function geoip_country_code_by_name_v6($gi, $name) {
437
+ $country_id = geoip_country_id_by_name_v6($gi,$name);
438
+ if ($country_id !== false) {
439
+ return $gi->GEOIP_COUNTRY_CODES[$country_id];
440
+ }
441
+ return false;
442
+ }
443
  }
444
+
445
+ if(! function_exists('geoip_country_code_by_name')){
446
+ function geoip_country_code_by_name($gi, $name) {
447
+ $country_id = geoip_country_id_by_name($gi,$name);
448
+ if ($country_id !== false) {
449
+ return $gi->GEOIP_COUNTRY_CODES[$country_id];
450
+ }
451
+ return false;
452
+ }
453
  }
454
+
455
+ if(! function_exists('geoip_country_name_by_name_v6')){
456
+ function geoip_country_name_by_name_v6($gi, $name) {
457
+ $country_id = geoip_country_id_by_name_v6($gi,$name);
458
+ if ($country_id !== false) {
459
+ return $gi->GEOIP_COUNTRY_NAMES[$country_id];
460
+ }
461
+ return false;
462
+ }
463
  }
464
+
465
+ if(! function_exists('geoip_country_name_by_name')){
466
+ function geoip_country_name_by_name($gi, $name) {
467
+ $country_id = geoip_country_id_by_name($gi,$name);
468
+ if ($country_id !== false) {
469
+ return $gi->GEOIP_COUNTRY_NAMES[$country_id];
470
+ }
471
+ return false;
472
+ }
473
  }
474
+
475
+ if(! function_exists('geoip_country_id_by_addr_v6')){
476
+ function geoip_country_id_by_addr_v6($gi, $addr) {
477
+ $ipnum = wfUtils::inet_pton($addr);
478
+ return _geoip_seek_country_v6($gi, $ipnum) - WF_GEOIP_COUNTRY_BEGIN;
479
+ }
480
  }
481
+
482
+ if(! function_exists('geoip_country_id_by_addr')){
483
+ function geoip_country_id_by_addr($gi, $addr) {
484
+ $ipnum = ip2long($addr);
485
+ return _geoip_seek_country($gi, $ipnum) - WF_GEOIP_COUNTRY_BEGIN;
486
+ }
487
  }
488
+
489
+ if(! function_exists('geoip_country_code_by_addr_v6')){
490
+ function geoip_country_code_by_addr_v6($gi, $addr) {
491
+ $country_id = geoip_country_id_by_addr_v6($gi,$addr);
492
+ if ($country_id !== false) {
493
+ return $gi->GEOIP_COUNTRY_CODES[$country_id];
494
+ }
495
+ return false;
496
+ }
497
  }
498
+
499
+ if(! function_exists('geoip_country_code_by_addr')){
500
+ function geoip_country_code_by_addr($gi, $addr) {
501
+ if ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1) {
502
+ $record = geoip_record_by_addr($gi,$addr);
503
+ if ( $record !== false ) {
504
+ return $record->country_code;
505
+ }
506
+ } else {
507
+ $country_id = geoip_country_id_by_addr($gi,$addr);
508
+ if ($country_id !== false) {
509
+ return $gi->GEOIP_COUNTRY_CODES[$country_id];
510
+ }
511
+ }
512
+ return false;
513
+ }
514
  }
515
+
516
+ if(! function_exists('geoip_country_name_by_addr_v6')){
517
+ function geoip_country_name_by_addr_v6($gi, $addr) {
518
+ $country_id = geoip_country_id_by_addr_v6($gi,$addr);
519
+ if ($country_id !== false) {
520
+ return $gi->GEOIP_COUNTRY_NAMES[$country_id];
521
+ }
522
+ return false;
523
+ }
524
  }
525
+
526
+ if(! function_exists('geoip_country_name_by_addr')){
527
+ function geoip_country_name_by_addr($gi, $addr) {
528
+ if ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1) {
529
+ $record = geoip_record_by_addr($gi,$addr);
530
+ return $record->country_name;
531
+ } else {
532
+ $country_id = geoip_country_id_by_addr($gi,$addr);
533
+ if ($country_id !== false) {
534
+ return $gi->GEOIP_COUNTRY_NAMES[$country_id];
535
+ }
536
+ }
537
+ return false;
538
+ }
539
  }
540
+
541
+ if(! function_exists('_geoip_seek_country_v6')){
542
+ function _geoip_seek_country_v6($gi, $ipnum) {
543
+
544
+ # arrays from unpack start with offset 1
545
+ # yet another php mystery. array_merge work around
546
+ # this broken behaviour
547
+ $v6vec = array_merge(unpack( "C16", $ipnum));
548
+
549
+ $offset = 0;
550
+ for ($depth = 127; $depth >= 0; --$depth) {
551
+ if ($gi->flags & WF_GEOIP_MEMORY_CACHE) {
552
+ // workaround php's broken substr, strpos, etc handling with
553
+ // mbstring.func_overload and mbstring.internal_encoding
554
+ $enc = mb_internal_encoding();
555
+ mb_internal_encoding('ISO-8859-1');
556
+
557
+ $buf = substr($gi->memory_buffer,
558
+ 2 * $gi->record_length * $offset,
559
+ 2 * $gi->record_length);
560
+
561
+ mb_internal_encoding($enc);
562
+ } elseif ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
563
+ $buf = @shmop_read ($gi->shmid,
564
+ 2 * $gi->record_length * $offset,
565
+ 2 * $gi->record_length );
566
+ } else {
567
+ fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
568
+ or die("fseek failed");
569
+ $buf = fread($gi->filehandle, 2 * $gi->record_length);
570
+ }
571
+ $x = array(0,0);
572
+ for ($i = 0; $i < 2; ++$i) {
573
+ for ($j = 0; $j < $gi->record_length; ++$j) {
574
+ $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
575
+ }
576
+ }
577
+
578
+ $bnum = 127 - $depth;
579
+ $idx = $bnum >> 3;
580
+ $b_mask = 1 << ( $bnum & 7 ^ 7 );
581
+ if (($v6vec[$idx] & $b_mask) > 0) {
582
+ if ($x[1] >= $gi->databaseSegments) {
583
+ return $x[1];
584
+ }
585
+ $offset = $x[1];
586
+ } else {
587
+ if ($x[0] >= $gi->databaseSegments) {
588
+ return $x[0];
589
+ }
590
+ $offset = $x[0];
591
+ }
592
+ }
593
+ trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
594
+ return false;
595
+ }
596
  }
597
+
598
+ if(! function_exists('_geoip_seek_country')){
599
+ function _geoip_seek_country($gi, $ipnum) {
600
+ $offset = 0;
601
+ for ($depth = 31; $depth >= 0; --$depth) {
602
+ if ($gi->flags & WF_GEOIP_MEMORY_CACHE) {
603
+ // workaround php's broken substr, strpos, etc handling with
604
+ // mbstring.func_overload and mbstring.internal_encoding
605
+ $enc = mb_internal_encoding();
606
+ mb_internal_encoding('ISO-8859-1');
607
+
608
+ $buf = substr($gi->memory_buffer,
609
+ 2 * $gi->record_length * $offset,
610
+ 2 * $gi->record_length);
611
+
612
+ mb_internal_encoding($enc);
613
+ } elseif ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
614
+ $buf = @shmop_read ($gi->shmid,
615
+ 2 * $gi->record_length * $offset,
616
+ 2 * $gi->record_length );
617
+ } else {
618
+ fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
619
+ or die("fseek failed");
620
+ $buf = fread($gi->filehandle, 2 * $gi->record_length);
621
+ }
622
+ $x = array(0,0);
623
+ for ($i = 0; $i < 2; ++$i) {
624
+ for ($j = 0; $j < $gi->record_length; ++$j) {
625
+ $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
626
+ }
627
+ }
628
+ if ($ipnum & (1 << $depth)) {
629
+ if ($x[1] >= $gi->databaseSegments) {
630
+ return $x[1];
631
+ }
632
+ $offset = $x[1];
633
+ } else {
634
+ if ($x[0] >= $gi->databaseSegments) {
635
+ return $x[0];
636
+ }
637
+ $offset = $x[0];
638
+ }
639
+ }
640
+ trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
641
+ return false;
642
+ }
643
  }
644
+
645
+ if(! function_exists('_common_get_org')){
646
+ function _common_get_org($gi, $seek_org){
647
+ $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
648
+ if ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
649
+ $org_buf = @shmop_read ($gi->shmid, $record_pointer, WF_MAX_ORG_RECORD_LENGTH);
650
+ } else {
651
+ fseek($gi->filehandle, $record_pointer, SEEK_SET);
652
+ $org_buf = fread($gi->filehandle,WF_MAX_ORG_RECORD_LENGTH);
653
+ }
654
+ // workaround php's broken substr, strpos, etc handling with
655
+ // mbstring.func_overload and mbstring.internal_encoding
656
+ $enc = mb_internal_encoding();
657
+ mb_internal_encoding('ISO-8859-1');
658
+ $org_buf = substr($org_buf, 0, strpos($org_buf, "\0"));
659
+ mb_internal_encoding($enc);
660
+ return $org_buf;
661
+ }
662
  }
663
+
664
+ if(! function_exists('_get_org_v6')){
665
+ function _get_org_v6($gi,$ipnum){
666
+ $seek_org = _geoip_seek_country_v6($gi,$ipnum);
667
+ if ($seek_org == $gi->databaseSegments) {
668
+ return NULL;
669
+ }
670
+ return _common_get_org($gi, $seek_org);
671
+ }
672
  }
673
+
674
+ if(! function_exists('_get_org')){
675
+ function _get_org($gi,$ipnum){
676
+ $seek_org = _geoip_seek_country($gi,$ipnum);
677
+ if ($seek_org == $gi->databaseSegments) {
678
+ return NULL;
679
+ }
680
+ return _common_get_org($gi, $seek_org);
681
+ }
682
  }
683
+
684
+ if(! function_exists('geoip_name_by_addr_v6')){
685
+ function geoip_name_by_addr_v6 ($gi,$addr) {
686
+ if ($addr == NULL) {
687
+ return 0;
688
+ }
689
+ $ipnum = wfUtils::inet_pton($addr);
690
+ return _get_org_v6($gi, $ipnum);
691
+ }
692
  }
693
+
694
+ if(! function_exists('geoip_name_by_addr')){
695
+ function geoip_name_by_addr ($gi,$addr) {
696
+ if ($addr == NULL) {
697
+ return 0;
698
+ }
699
+ $ipnum = ip2long($addr);
700
+ return _get_org($gi, $ipnum);
701
+ }
702
  }
703
+
704
+ if(! function_exists('geoip_org_by_addr')){
705
+ function geoip_org_by_addr ($gi,$addr) {
706
+ return geoip_name_by_addr($gi, $addr);
707
+ }
708
  }
709
+
710
+ if(! function_exists('_get_region')){
711
+ function _get_region($gi,$ipnum){
712
+ if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV0){
713
+ $seek_region = _geoip_seek_country($gi,$ipnum) - WF_GEOIP_STATE_BEGIN_REV0;
714
+ if ($seek_region >= 1000){
715
+ $country_code = "US";
716
+ $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);
717
+ } else {
718
+ $country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region];
719
+ $region = "";
720
+ }
721
+ return array ($country_code,$region);
722
+ } else if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV1) {
723
+ $seek_region = _geoip_seek_country($gi,$ipnum) - WF_GEOIP_STATE_BEGIN_REV1;
724
+ //print $seek_region;
725
+ if ($seek_region < WF_US_OFFSET){
726
+ $country_code = "";
727
+ $region = "";
728
+ } else if ($seek_region < WF_CANADA_OFFSET) {
729
+ $country_code = "US";
730
+ $region = chr(($seek_region - WF_US_OFFSET)/26 + 65) . chr(($seek_region - WF_US_OFFSET)%26 + 65);
731
+ } else if ($seek_region < WF_WORLD_OFFSET) {
732
+ $country_code = "CA";
733
+ $region = chr(($seek_region - WF_CANADA_OFFSET)/26 + 65) . chr(($seek_region - WF_CANADA_OFFSET)%26 + 65);
734
+ } else {
735
+ $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WF_WORLD_OFFSET) / WF_FIPS_RANGE];
736
+ $region = "";
737
+ }
738
+ return array ($country_code,$region);
739
+ }
740
+ }
741
  }
742
+
743
+ if(! function_exists('geoip_region_by_addr')){
744
+ function geoip_region_by_addr ($gi,$addr) {
745
+ if ($addr == NULL) {
746
+ return 0;
747
+ }
748
+ $ipnum = ip2long($addr);
749
+ return _get_region($gi, $ipnum);
750
+ }
751
  }
752
+
753
+ if(! function_exists('getdnsattributes')){
754
+ function getdnsattributes ($l,$ip){
755
+ $r = new Net_DNS_Resolver();
756
+ $r->nameservers = array("ws1.maxmind.com");
757
+ $p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN");
758
+ $str = is_object($p->answer[0])?$p->answer[0]->string():'';
759
+ $str = substr( $str, 1, -1 );
760
+ return $str;
761
+ }
762
  }
763
  }
 
764
  ?>
lib/wfScanEngine.php CHANGED
@@ -73,6 +73,36 @@ class wfScanEngine {
73
  return !is_wp_error($response) && ($responseBody = wp_remote_retrieve_body($response)) &&
74
  stripos($responseBody, '<title>Index of') !== false;
75
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
77
  public function __sleep(){ //Same order here as above for properties that are included in serialization
78
  return array('hasher', 'jobList', 'i', 'wp_version', 'apiKey', 'startTime', 'maxExecTime', 'publicScanEnabled', 'fileContentsResults', 'scanner', 'scanQueue', 'hoover', 'scanData', 'statusIDX', 'userPasswdQueue', 'passwdHasIssues', 'suspectedFiles', 'dbScanner', 'knownFilesLoader', 'metrics', 'checkHowGetIPsRequestTime');
@@ -126,6 +156,7 @@ class wfScanEngine {
126
  self::checkForKill();
127
  $this->doScan();
128
  wfConfig::set('lastScanCompleted', 'ok');
 
129
  self::checkForKill();
130
  //updating this scan ID will trigger the scan page to load/reload the results.
131
  $this->i->setScanTimeNow();
@@ -135,39 +166,30 @@ class wfScanEngine {
135
  $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0));
136
  $this->submitMetrics();
137
 
138
- $issueCount = $this->i->getIssueCount();
139
- if ($issueCount) {
140
- new wfNotification(null, wfNotification::PRIORITY_HIGH, "<a href=\"" . network_admin_url('admin.php?page=WordfenceScan') . "\">{$issueCount} issue" . ($issueCount == 1 ? '' : 's') . ' found in most recent scan</a>', 'wfplugin_scan');
141
- }
142
- else {
143
- $n = wfNotification::getNotificationForCategory('wfplugin_scan');
144
- if ($n !== null) {
145
- $n->markAsRead();
146
- }
147
- }
148
  }
149
  catch (wfScanEngineDurationLimitException $e) {
150
  wfConfig::set('lastScanCompleted', $e->getMessage());
 
151
  $this->i->setScanTimeNow();
152
 
153
  $this->emailNewIssues(true);
154
  $this->recordMetric('scan', 'duration', (time() - $this->startTime));
155
  $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0));
156
  $this->submitMetrics();
157
- new wfNotification(null, wfNotification::PRIORITY_HIGH, '<a href="' . network_admin_url('admin.php?page=WordfenceScan') . '">Scan aborted due to duration limit</a>', 'wfplugin_scan');
 
158
  throw $e;
159
  }
160
  catch(Exception $e) {
161
  wfConfig::set('lastScanCompleted', $e->getMessage());
 
162
  $this->recordMetric('scan', 'duration', (time() - $this->startTime));
163
  $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0));
164
  $this->recordMetric('scan', 'failure', $e->getMessage());
165
  $this->submitMetrics();
166
 
167
- $error = $e->getMessage();
168
- $trimmedError = substr($error, 0, 100) . (strlen($error) > 100 ? '...' : '');
169
-
170
- new wfNotification(null, wfNotification::PRIORITY_HIGH, '<a href="' . network_admin_url('admin.php?page=WordfenceScan') . '">Scan failed: ' . esc_html($trimmedError) . '</a>', 'wfplugin_scan');
171
  throw $e;
172
  }
173
  }
73
  return !is_wp_error($response) && ($responseBody = wp_remote_retrieve_body($response)) &&
74
  stripos($responseBody, '<title>Index of') !== false;
75
  }
76
+
77
+ public static function refreshScanNotification($issuesInstance = null) {
78
+ if ($issuesInstance === null) {
79
+ $issuesInstance = new wfIssues();
80
+ }
81
+
82
+ $message = wfConfig::get('lastScanCompleted', '');
83
+ if ($message == 'ok') {
84
+ $issueCount = $issuesInstance->getIssueCount();
85
+ if ($issueCount) {
86
+ new wfNotification(null, wfNotification::PRIORITY_HIGH, "<a href=\"" . network_admin_url('admin.php?page=WordfenceScan') . "\">{$issueCount} issue" . ($issueCount == 1 ? '' : 's') . ' found in most recent scan</a>', 'wfplugin_scan');
87
+ }
88
+ else {
89
+ $n = wfNotification::getNotificationForCategory('wfplugin_scan');
90
+ if ($n !== null) {
91
+ $n->markAsRead();
92
+ }
93
+ }
94
+ }
95
+ else {
96
+ $failureType = wfConfig::get('lastScanFailureType');
97
+ if ($failureType == 'duration') {
98
+ new wfNotification(null, wfNotification::PRIORITY_HIGH, '<a href="' . network_admin_url('admin.php?page=WordfenceScan') . '">Scan aborted due to duration limit</a>', 'wfplugin_scan');
99
+ }
100
+ else {
101
+ $trimmedError = substr($message, 0, 100) . (strlen($message) > 100 ? '...' : '');
102
+ new wfNotification(null, wfNotification::PRIORITY_HIGH, '<a href="' . network_admin_url('admin.php?page=WordfenceScan') . '">Scan failed: ' . esc_html($trimmedError) . '</a>', 'wfplugin_scan');
103
+ }
104
+ }
105
+ }
106
 
107
  public function __sleep(){ //Same order here as above for properties that are included in serialization
108
  return array('hasher', 'jobList', 'i', 'wp_version', 'apiKey', 'startTime', 'maxExecTime', 'publicScanEnabled', 'fileContentsResults', 'scanner', 'scanQueue', 'hoover', 'scanData', 'statusIDX', 'userPasswdQueue', 'passwdHasIssues', 'suspectedFiles', 'dbScanner', 'knownFilesLoader', 'metrics', 'checkHowGetIPsRequestTime');
156
  self::checkForKill();
157
  $this->doScan();
158
  wfConfig::set('lastScanCompleted', 'ok');
159
+ wfConfig::set('lastScanFailureType', false);
160
  self::checkForKill();
161
  //updating this scan ID will trigger the scan page to load/reload the results.
162
  $this->i->setScanTimeNow();
166
  $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0));
167
  $this->submitMetrics();
168
 
169
+ wfScanEngine::refreshScanNotification($this->i);
 
 
 
 
 
 
 
 
 
170
  }
171
  catch (wfScanEngineDurationLimitException $e) {
172
  wfConfig::set('lastScanCompleted', $e->getMessage());
173
+ wfConfig::set('lastScanFailureType', 'duration');
174
  $this->i->setScanTimeNow();
175
 
176
  $this->emailNewIssues(true);
177
  $this->recordMetric('scan', 'duration', (time() - $this->startTime));
178
  $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0));
179
  $this->submitMetrics();
180
+
181
+ wfScanEngine::refreshScanNotification($this->i);
182
  throw $e;
183
  }
184
  catch(Exception $e) {
185
  wfConfig::set('lastScanCompleted', $e->getMessage());
186
+ wfConfig::set('lastScanFailureType', 'general');
187
  $this->recordMetric('scan', 'duration', (time() - $this->startTime));
188
  $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0));
189
  $this->recordMetric('scan', 'failure', $e->getMessage());
190
  $this->submitMetrics();
191
 
192
+ wfScanEngine::refreshScanNotification($this->i);
 
 
 
193
  throw $e;
194
  }
195
  }
lib/wfUtils.php CHANGED
@@ -1087,14 +1087,13 @@ class wfUtils {
1087
  return $URL;
1088
  }
1089
  public static function IP2Country($IP){
1090
- if(! (function_exists('geoip_open') && function_exists('geoip_country_code_by_addr') && function_exists('geoip_country_code_by_addr_v6'))){
1091
- require_once('wfGeoIP.php');
1092
- }
1093
  if (filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
1094
- $gi = geoip_open(dirname(__FILE__) . "/GeoIPv6.dat", GEOIP_STANDARD);
1095
  $country = geoip_country_code_by_addr_v6($gi, $IP);
1096
  } else {
1097
- $gi = geoip_open(dirname(__FILE__) . "/GeoIP.dat", GEOIP_STANDARD);
1098
  $country = geoip_country_code_by_addr($gi, $IP);
1099
  }
1100
  geoip_close($gi);
@@ -1499,20 +1498,14 @@ class wfUtils {
1499
  'callback' => $callback,
1500
  );
1501
 
1502
- $siteurl = '';
1503
- if (function_exists('get_bloginfo')) {
1504
- if (is_multisite()) {
1505
- $siteurl = network_home_url();
1506
- $siteurl = rtrim($siteurl, '/'); //Because previously we used get_bloginfo and it returns http://example.com without a '/' char.
1507
- } else {
1508
- $siteurl = home_url();
1509
- }
1510
- }
1511
 
1512
  wp_remote_post(WFWAF_API_URL_SEC . "?" . http_build_query(array(
1513
  'action' => 'detect_proxy',
1514
  'k' => wfConfig::get('apiKey'),
1515
  's' => $siteurl,
 
1516
  't' => microtime(true),
1517
  ), null, '&'),
1518
  array(
@@ -1643,6 +1636,59 @@ class wfUtils {
1643
 
1644
  return $encodedString;
1645
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1646
  }
1647
 
1648
  // GeoIP lib uses these as well
1087
  return $URL;
1088
  }
1089
  public static function IP2Country($IP){
1090
+ require_once('wfGeoIP.php');
1091
+
 
1092
  if (filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
1093
+ $gi = geoip_open(dirname(__FILE__) . "/GeoIPv6.dat", WF_GEOIP_STANDARD);
1094
  $country = geoip_country_code_by_addr_v6($gi, $IP);
1095
  } else {
1096
+ $gi = geoip_open(dirname(__FILE__) . "/GeoIP.dat", WF_GEOIP_STANDARD);
1097
  $country = geoip_country_code_by_addr($gi, $IP);
1098
  }
1099
  geoip_close($gi);
1498
  'callback' => $callback,
1499
  );
1500
 
1501
+ $homeurl = wfUtils::wpHomeURL();
1502
+ $siteurl = wfUtils::wpSiteURL();
 
 
 
 
 
 
 
1503
 
1504
  wp_remote_post(WFWAF_API_URL_SEC . "?" . http_build_query(array(
1505
  'action' => 'detect_proxy',
1506
  'k' => wfConfig::get('apiKey'),
1507
  's' => $siteurl,
1508
+ 'h' => $homeurl,
1509
  't' => microtime(true),
1510
  ), null, '&'),
1511
  array(
1636
 
1637
  return $encodedString;
1638
  }
1639
+
1640
+ public static function wpHomeURL($path = '', $scheme = null) {
1641
+ $homeurl = wfConfig::get('wp_home_url', '');
1642
+ if (function_exists('get_bloginfo')) {
1643
+ if (is_multisite()) {
1644
+ if (empty($homeurl)) {
1645
+ $homeurl = network_home_url($path, $scheme);
1646
+ $homeurl = rtrim($homeurl, '/'); //Because previously we used get_bloginfo and it returns http://example.com without a '/' char.
1647
+ }
1648
+ }
1649
+ else {
1650
+ if (empty($homeurl)) {
1651
+ $homeurl = home_url($path, $scheme);
1652
+ }
1653
+ }
1654
+ }
1655
+ return $homeurl;
1656
+ }
1657
+
1658
+ public static function wpSiteURL($path = '', $scheme = null) {
1659
+ $siteurl = '';
1660
+ if (function_exists('get_bloginfo')) {
1661
+ if (is_multisite()) {
1662
+ $siteurl = network_site_url($path, $scheme);
1663
+ }
1664
+ else {
1665
+ $siteurl = site_url($path, $scheme);
1666
+ }
1667
+ }
1668
+ return $siteurl;
1669
+ }
1670
+
1671
+ public static function wafInstallationType() {
1672
+ try {
1673
+ $status = (defined('WFWAF_ENABLED') && !WFWAF_ENABLED) ? 'disabled' : wfWaf::getInstance()->getStorageEngine()->getConfig('wafStatus');
1674
+ if (defined('WFWAF_ENABLED') && !WFWAF_ENABLED) {
1675
+ return "{$status}|const";
1676
+ }
1677
+ else if (defined('WFWAF_SUBDIRECTORY_INSTALL') && WFWAF_SUBDIRECTORY_INSTALL) {
1678
+ return "{$status}|subdir";
1679
+ }
1680
+ else if (defined('WFWAF_AUTO_PREPEND') && WFWAF_AUTO_PREPEND) {
1681
+ return "{$status}|extended";
1682
+ }
1683
+
1684
+ return "{$status}|basic";
1685
+ }
1686
+ catch (Exception $e) {
1687
+ //Do nothing
1688
+ }
1689
+
1690
+ return 'unknown';
1691
+ }
1692
  }
1693
 
1694
  // GeoIP lib uses these as well
lib/wordfenceClass.php CHANGED
@@ -288,8 +288,28 @@ class wordfence {
288
 
289
  $report = new wfActivityReport();
290
  $report->rotateIPLog();
 
 
 
 
 
 
 
 
291
 
292
- $updatesNeeded = $report->getUpdatesNeeded();
 
 
 
 
 
 
 
 
 
 
 
 
293
  if ($updatesNeeded) {
294
  $items = array();
295
  $plural = false;
@@ -330,6 +350,18 @@ class wordfence {
330
 
331
  new wfNotification(null, wfNotification::PRIORITY_DEFAULT, '<a href="' . network_admin_url('update-core.php') . '">' . $message . '</a>', 'wfplugin_updates');
332
  }
 
 
 
 
 
 
 
 
 
 
 
 
333
  }
334
  public static function runInstall(){
335
  if(self::$runInstallCalled){ return; }
@@ -784,6 +816,9 @@ SQL
784
  }
785
 
786
  add_action('upgrader_process_complete', 'wordfence::_refreshVulnerabilityCache');
 
 
 
787
 
788
  if(is_admin()){
789
  add_action('admin_init', 'wordfence::admin_init');
@@ -1200,12 +1235,14 @@ SQL
1200
 
1201
  // Sync the WAF data with the database.
1202
  if (!WFWAF_SUBDIRECTORY_INSTALL && $waf = wfWAF::getInstance()) {
 
 
1203
  try {
1204
  $configDefaults = array(
1205
  'apiKey' => wfConfig::get('apiKey'),
1206
  'isPaid' => wfConfig::get('isPaid'),
1207
  'siteURL' => site_url(),
1208
- 'homeURL' => home_url(),
1209
  'whitelistedIPs' => (string) wfConfig::get('whitelisted'),
1210
  'howGetIPs' => (string) wfConfig::get('howGetIPs'),
1211
  'other_WFNet' => wfConfig::get('other_WFNet', true),
@@ -1846,6 +1883,7 @@ SQL
1846
  if(is_wp_error($authUser) && ($authUser->get_error_code() == 'invalid_username' || $authUser->get_error_code() == 'invalid_email' || $authUser->get_error_code() == 'incorrect_password') && wfConfig::get('loginSec_maskLoginErrors')){
1847
  return new WP_Error( 'incorrect_password', sprintf( __( '<strong>ERROR</strong>: The username or password you entered is incorrect. <a href="%2$s" title="Password Lost and Found">Lost your password</a>?' ), $username, wp_lostpassword_url() ) );
1848
  }
 
1849
  return $authUser;
1850
  }
1851
  public static function wfsnBatchReportBlockedAttempts() {
@@ -2633,6 +2671,7 @@ SQL
2633
  $issueID = intval($_POST['issueID']);
2634
  $wfIssues = new wfIssues();
2635
  $wfIssues->updateIssue($issueID, 'delete');
 
2636
  }
2637
  }
2638
  else {
@@ -3181,6 +3220,7 @@ HTACCESS;
3181
  return array('cerrorMsg' => "You don't have permission to repair .htaccess. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file.");
3182
  }
3183
  $issues->updateIssue($_POST['issueID'], 'delete');
 
3184
  return array('ok' => 1);
3185
  }
3186
  public static function ajax_clearAllBlocked_callback(){
@@ -3329,6 +3369,7 @@ HTACCESS;
3329
  $wfIssues = new wfIssues();
3330
  $issueID = $_POST['id'];
3331
  $wfIssues->deleteIssue($issueID);
 
3332
  return array('ok' => 1);
3333
  }
3334
  public static function ajax_updateAllIssues_callback(){
@@ -3343,6 +3384,7 @@ HTACCESS;
3343
  } else {
3344
  return array('errorMsg' => "An invalid operation was called.");
3345
  }
 
3346
  return array('ok' => 1);
3347
  }
3348
  public static function ajax_updateIssueStatus_callback(){
@@ -3353,6 +3395,7 @@ HTACCESS;
3353
  return array('errorMsg' => "An invalid status was specified when trying to update that issue.");
3354
  }
3355
  $wfIssues->updateIssue($issueID, $status);
 
3356
  return array('ok' => 1);
3357
  }
3358
  public static function ajax_killScan_callback(){
@@ -3522,7 +3565,8 @@ HTACCESS;
3522
  $headMsg = "Nothing done";
3523
  $bodyMsg = "We didn't $verb2 anything and no errors were found.";
3524
  }
3525
-
 
3526
  return array('ok' => 1, 'bulkHeading' => $headMsg, 'bulkBody' => $bodyMsg);
3527
  } else {
3528
  return array('errorMsg' => "Invalid bulk operation selected");
@@ -3552,8 +3596,8 @@ HTACCESS;
3552
  The <code>wp-config.php</code> file contains your database credentials which you will need to restore normal site operations.
3553
  Your site will <b>NOT</b> function once the <code>wp-config.php</code> has been deleted.
3554
  <p>
3555
- <a class='button' href='/?_wfsf=download&nonce=" . wp_create_nonce('wp-ajax') . "&file=". rawurlencode($file) ."' target='_blank' onclick=\"jQuery('#wp-config-force-delete').show();\">Download a backup copy</a>
3556
- <a style='display:none' id='wp-config-force-delete' class='button' href='#' target='_blank' onclick='WFAD.deleteFile($issueID, true); return false;'>Delete wp-config.php</a>
3557
  </p>",
3558
  );
3559
  }
@@ -3579,6 +3623,7 @@ HTACCESS;
3579
 
3580
  if($wp_filesystem->delete($localFile)){
3581
  $wfIssues->updateIssue($issueID, 'delete');
 
3582
  return array(
3583
  'ok' => 1,
3584
  'localFile' => $localFile,
@@ -3604,6 +3649,7 @@ HTACCESS;
3604
  $prefix = $wpdb->get_blog_prefix($issue['data']['site_id']);
3605
  if ($wpdb->query($wpdb->prepare("DELETE FROM {$prefix}options WHERE option_name = %s", $issue['data']['option_name']))) {
3606
  $wfIssues->updateIssue($issueID, 'delete');
 
3607
  return array(
3608
  'ok' => 1,
3609
  'option_name' => $issue['data']['option_name'],
@@ -3640,6 +3686,7 @@ HTACCESS;
3640
  );
3641
  }
3642
  $issues->updateIssue($_POST['issueID'], 'delete');
 
3643
  return array('ok' => 1);
3644
  }
3645
  public static function ajax_restoreFile_callback($issueID = null){
@@ -3686,6 +3733,7 @@ HTACCESS;
3686
  $localFile = rtrim(ABSPATH, '/') . '/' . preg_replace('/^[\.\/]+/', '', $file);
3687
  if ($wp_filesystem->put_contents($localFile, $result['fileContent'])) {
3688
  $wfIssues->updateIssue($issueID, 'delete');
 
3689
  return array(
3690
  'ok' => 1,
3691
  'file' => $localFile,
@@ -4033,6 +4081,49 @@ HTACCESS;
4033
  }
4034
  return array('ok' => 1);
4035
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4036
  public static function startScan(){
4037
  wfScanEngine::startScan();
4038
  }
@@ -4468,7 +4559,7 @@ HTML;
4468
  'disableDirectoryListing', 'fixFPD', 'deleteAdminUser', 'revokeAdminUser',
4469
  'hideFileHtaccess', 'saveDebuggingConfig', 'wafConfigureAutoPrepend',
4470
  'whitelistBulkDelete', 'whitelistBulkEnable', 'whitelistBulkDisable',
4471
- 'dismissNotification', 'utilityScanForBlacklisted',
4472
  ) as $func){
4473
  add_action('wp_ajax_wordfence_' . $func, 'wordfence::ajaxReceiver');
4474
  }
@@ -4495,6 +4586,23 @@ HTML;
4495
  wp_enqueue_script('wordfenceAdminExtjs', wfUtils::getBaseURL() . 'js/tourTip.js', array('jquery'), WORDFENCE_VERSION);
4496
  self::setupAdminVars();
4497
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4498
 
4499
  if (!WFWAF_AUTO_PREPEND || WFWAF_SUBDIRECTORY_INSTALL) {
4500
  if (empty($_GET['wafAction']) && !wfConfig::get('dismissAutoPrependNotice')) {
@@ -4616,8 +4724,8 @@ HTML;
4616
  $url = network_admin_url('admin.php?page=WordfenceSecOpt&wafAction=useMineForAdminEmailAlerts');
4617
  $dismissURL = network_admin_url('admin.php?page=WordfenceSecOpt&wafAction=dismissAdminEmailNotice&nonce=' .
4618
  rawurlencode(wp_create_nonce('wfDismissAdminEmailWarning')));
4619
- echo '<div id="wordfenceAdminEmailWarning" class="fade error inline wf-admin-notice"><p><strong>You have not set an administrator email address to receive alerts for Wordfence.</strong> Please <a href="' . self::getMyOptionsURL() . '">click here to go to the Wordfence Options Page</a> and set an email address where you will receive security alerts from this site.</p><p><a class="button button-small" href="#" onclick="wordfenceExt.adminEmailChoice(\'mine\'); return false;"">Use My Email Address</a>
4620
- <a class="button button-small wf-dismiss-link" href="#" onclick="wordfenceExt.adminEmailChoice(\'no\'); return false;">Dismiss</a></p></div>';
4621
  }
4622
  public static function misconfiguredHowGetIPsNotice() {
4623
  $url = network_admin_url('admin.php?page=WordfenceSecOpt');
@@ -4654,7 +4762,7 @@ HTML;
4654
  $recommendationMsg = 'This site appears to be behind Cloudflare, so using the Cloudflare "CF-Connecting-IP" HTTP header will resolve to the correct IPs.';
4655
  }
4656
  echo '<div id="wordfenceMisconfiguredHowGetIPsNotice" class="fade error"><p><strong>Your \'How does Wordfence get IPs\' setting is misconfigured.</strong> ' . $existingMsg . ' ' . $recommendationMsg . ' <a href="#" onclick="wordfenceExt.misconfiguredHowGetIPsChoice(\'yes\'); return false;">Click here to use the recommended setting</a> or <a href="' . $url . '">visit the options page</a> to manually update it.</p><p>
4657
- <a class="button button-small wf-dismiss-link" href="#" onclick="wordfenceExt.misconfiguredHowGetIPsChoice(\'no\'); return false;">Dismiss</a> <a class="wfhelp" target="_blank" href="https://docs.wordfence.com/en/Misconfigured_how_get_IPs_notice"></a></p></div>';
4658
  }
4659
  public static function autoUpdateNotice(){
4660
  echo '<div id="wordfenceAutoUpdateChoice" class="fade error"><p><strong>Do you want Wordfence to stay up-to-date automatically?</strong>&nbsp;&nbsp;&nbsp;<a href="#" onclick="wordfenceExt.autoUpdateChoice(\'yes\'); return false;">Yes, enable auto-update.</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#" onclick="wordfenceExt.autoUpdateChoice(\'no\'); return false;">No thanks.</a></p></div>';
@@ -4727,7 +4835,8 @@ HTML;
4727
  }
4728
 
4729
  $notificationCount = count(wfNotification::notifications());
4730
- $hidden = ($notificationCount == 0 ? ' wf-hidden' : '');
 
4731
  $formattedCount = number_format_i18n($notificationCount);
4732
  $dashboardExtra = " <span class='update-plugins wf-menu-badge wf-notification-count-container{$hidden}' title='{$notificationCount}'><span class='update-count wf-notification-count-value'>{$formattedCount}</span></span>";
4733
 
@@ -4735,6 +4844,7 @@ HTML;
4735
  add_submenu_page("Wordfence", "Dashboard", "Dashboard", "activate_plugins", "Wordfence", 'wordfence::menu_dashboard');
4736
  add_submenu_page("Wordfence", "Scan", "Scan", "activate_plugins", "WordfenceScan", 'wordfence::menu_scan');
4737
  add_submenu_page("Wordfence", "Firewall", "Firewall", "activate_plugins", "WordfenceWAF", 'wordfence::menu_firewall');
 
4738
  add_submenu_page("Wordfence", "Live Traffic", "Live Traffic", "activate_plugins", "WordfenceActivity", 'wordfence::menu_activity');
4739
 
4740
  add_submenu_page('Wordfence', 'Tools', 'Tools', 'activate_plugins', 'WordfenceTools', 'wordfence::menu_tools');
@@ -4818,6 +4928,10 @@ JQUERY;
4818
  $emailForm = true;
4819
  require 'menu_tools.php';
4820
  }
 
 
 
 
4821
 
4822
  public static function menu_firewall() {
4823
  global $wp_filesystem;
@@ -4854,6 +4968,7 @@ JQUERY;
4854
  update permissions on the parent directory so the web server can write to it.';
4855
  }
4856
 
 
4857
  if (!empty($_GET['wafAction'])) {
4858
  switch ($_GET['wafAction']) {
4859
  case 'dismissAutoPrependNotice':
@@ -4863,6 +4978,7 @@ JQUERY;
4863
  break;
4864
 
4865
  case 'updateSuPHPConfig':
 
4866
  if (!isset($_REQUEST['updateComplete']) || !$_REQUEST['updateComplete']) {
4867
  $wfnonce = wp_create_nonce('wfWAFUpdateSuPHPConfig');
4868
  $adminURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=updateSuPHPConfig');
@@ -4874,7 +4990,7 @@ JQUERY;
4874
  <p>The Wordfence Web Application Firewall for Apache suPHP servers has been improved, and your configuration needs to be updated to continue receiving the best protection. Please download a backup copy of the following files before we make the necessary changes:</p>';
4875
  $wafActionContent .= '<ul>';
4876
  foreach ($backups as $index => $backup) {
4877
- $wafActionContent .= '<li><a class="button" onclick="wfWAFConfirmBackup(' . $index . ');" href="' .
4878
  esc_url(add_query_arg(array(
4879
  'downloadBackup' => 1,
4880
  'updateReady' => 1,
@@ -4888,7 +5004,7 @@ JQUERY;
4888
  <form action='$adminURL' method='post'>
4889
  <input type='hidden' name='wfnonce' value='$wfnonce'>
4890
  <input type='hidden' value='1' name='confirmedBackup'>
4891
- <button id='confirmed-backups' disabled class='button button-primary' type='submit'>Continue</button>
4892
  </form>
4893
  <script>
4894
  var wfWAFBackups = $jsonBackups;
@@ -4982,6 +5098,7 @@ JQUERY;
4982
  if (WFWAF_AUTO_PREPEND && !WFWAF_SUBDIRECTORY_INSTALL) {
4983
  break;
4984
  }
 
4985
  $wfnonce = wp_create_nonce('wfWAFAutoPrepend');
4986
 
4987
  $currentAutoPrependFile = ini_get('auto_prepend_file');
@@ -5005,8 +5122,8 @@ WordPress support forums</a> before proceeding.</p>
5005
  which should maintain compatibility with your site, or you can opt to override the existing PHP setting.</p>
5006
 
5007
  <p>
5008
- <a class='button button-primary' href='%s'>Include this file (Recommended)</a>
5009
- <a class='button' href='%s'>Override this value</a>
5010
  </p>
5011
  ",
5012
  esc_html($currentAutoPrependFile),
@@ -5023,7 +5140,7 @@ which should maintain compatibility with your site, or you can opt to override t
5023
  $wafActionContent = '<p>Please download a backup copy of the following files before we make the necessary changes:</p>';
5024
  $wafActionContent .= '<ul>';
5025
  foreach ($backups as $index => $backup) {
5026
- $wafActionContent .= '<li><a class="button" onclick="wfWAFConfirmBackup(' . $index . ');" href="' .
5027
  esc_url(add_query_arg(array(
5028
  'downloadBackup' => 1,
5029
  'backupIndex' => $index,
@@ -5039,7 +5156,7 @@ which should maintain compatibility with your site, or you can opt to override t
5039
  <input type='hidden' name='wfnonce' value='$wfnonce'>
5040
  <input type='hidden' value='$serverConfig' name='serverConfiguration'>
5041
  <input type='hidden' value='1' name='confirmedBackup'>
5042
- <button id='confirmed-backups' disabled class='button button-primary' type='submit'>Continue</button>
5043
  </form>
5044
  <script>
5045
  var wfWAFBackups = $jsonBackups;
@@ -5156,12 +5273,14 @@ directives to put in your nginx.conf to fix this.
5156
 
5157
  $adminURL = esc_url($adminURL);
5158
  $wafActionContent .= "
5159
- <form action='$adminURL' method='post'>
 
5160
  <input type='hidden' name='wfnonce' value='$wfnonce'>
5161
- <select name='serverConfiguration' id='wf-waf-server-config'>
5162
  $wafPrependOptions
5163
  </select>
5164
- <button class='button button-primary' type='submit'>Continue</button>
 
5165
  </form>
5166
  $nginxIniWarning
5167
  </div>
@@ -5201,6 +5320,7 @@ $nginxIniWarning
5201
  break;
5202
 
5203
  case 'removeAutoPrepend':
 
5204
  $installedHere = !(!WFWAF_AUTO_PREPEND && !WFWAF_SUBDIRECTORY_INSTALL);
5205
  $wfnonce = wp_create_nonce('wfWAFRemoveAutoPrepend');
5206
 
@@ -5270,12 +5390,14 @@ you know your web server's configuration, please select it now.</p>";
5270
 
5271
  $adminURL = esc_url($adminURL);
5272
  $wafActionContent .= "
5273
- <form action='$adminURL' method='post'>
 
5274
  <input type='hidden' name='wfnonce' value='$wfnonce'>
5275
- <select name='serverConfiguration' id='wf-waf-server-config'>
5276
  $wafPrependOptions
5277
  </select>
5278
- <button class='button button-primary' type='submit'>Continue</button>
 
5279
  </form>
5280
  ";
5281
  }
@@ -5303,7 +5425,7 @@ vulnerable code runs. This PHP setting currently refers to an unknown file at:</
5303
  $wafActionContent = '<p>Please download a backup copy of the following files before we make the necessary changes:</p>';
5304
  $wafActionContent .= '<ul>';
5305
  foreach ($backups as $index => $backup) {
5306
- $wafActionContent .= '<li><a class="button" onclick="wfWAFConfirmBackup(' . $index . ');" href="' .
5307
  esc_url(add_query_arg(array(
5308
  'downloadBackup' => 1,
5309
  'backupIndex' => $index,
@@ -5318,7 +5440,7 @@ vulnerable code runs. This PHP setting currently refers to an unknown file at:</
5318
  <input type='hidden' name='wfnonce' value='$wfnonce'>
5319
  <input type='hidden' value='$serverConfig' name='serverConfiguration'>
5320
  <input type='hidden' value='1' name='confirmedBackup'>
5321
- <button id='confirmed-backups' disabled class='button button-primary' type='submit'>Continue</button>
5322
  </form>
5323
  <script>
5324
  var wfWAFBackups = $jsonBackups;
@@ -5514,7 +5636,7 @@ HTML
5514
  $result,
5515
  esc_url(network_admin_url('admin.php?page=WordfenceScan'))
5516
  );
5517
-
5518
  }
5519
 
5520
  public static function fsActionDeleteFileCallback() {
@@ -5536,6 +5658,7 @@ HTML
5536
  $result,
5537
  esc_url(network_admin_url('admin.php?page=WordfenceScan'))
5538
  );
 
5539
  }
5540
 
5541
  public static function status($level /* 1 has highest visibility */, $type /* info|error */, $msg){
@@ -5932,6 +6055,7 @@ HTML
5932
  $wpdb->delete($wpdb->users, array('ID' => $data['userID']));
5933
  }
5934
  $wfIssues->deleteIssue($issueID);
 
5935
 
5936
  return array(
5937
  'ok' => 1,
@@ -5958,6 +6082,7 @@ HTML
5958
  }
5959
 
5960
  $wfIssues->deleteIssue($issueID);
 
5961
 
5962
  return array(
5963
  'ok' => 1,
@@ -6584,13 +6709,17 @@ LIMIT %d", $lastSendTime, $limit));
6584
  $lastSendTime = $attackDataRow->attackLogTime;
6585
  }
6586
  }
6587
-
 
 
 
6588
  $response = wp_remote_post(WFWAF_API_URL_SEC . "?" . http_build_query(array(
6589
  'action' => 'send_waf_attack_data',
6590
  'k' => $waf->getStorageEngine()->getConfig('apiKey'),
6591
- 's' => $waf->getStorageEngine()->getConfig('siteURL') ? $waf->getStorageEngine()->getConfig('siteURL') :
6592
- sprintf('%s://%s/', $waf->getRequest()->getProtocol(), rawurlencode($waf->getRequest()->getHost())),
6593
  't' => microtime(true),
 
6594
  ), null, '&'),
6595
  array(
6596
  'body' => json_encode($dataToSend),
@@ -6733,7 +6862,14 @@ LIMIT %d", $lastSendTime, $limit));
6733
  if (class_exists('wfWAFIPBlocksController')) {
6734
  if ($action == wfWAFIPBlocksController::WFWAF_BLOCK_WFSN) {
6735
  $hit->action = 'blocked:wfsnrepeat';
6736
- wordfence::wfsnReportBlockedAttempt($hit->IP, 'waf');
 
 
 
 
 
 
 
6737
  }
6738
  }
6739
  $hit->actionDescription = $actionDescription;
@@ -6828,8 +6964,8 @@ LIMIT %d", $lastSendTime, $limit));
6828
  $dismissURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=dismissAutoPrependNotice&nonce=' .
6829
  rawurlencode(wp_create_nonce('wfDismissAutoPrependNotice')));
6830
  echo '<div class="update-nag" id="wf-extended-protection-notice">To make your site as secure as possible, take a moment to optimize the Wordfence Web
6831
- Application Firewall: &nbsp;<a class="button button-small" href="' . esc_url($url) . '">Click here to configure.</a>
6832
- <a class="button button-small wf-dismiss-link" href="' . esc_url($dismissURL) . '">Dismiss</a>
6833
  <br>
6834
  <em style="font-size: 85%;">If you cannot complete the setup process,
6835
  <a target="_blank" href="https://docs.wordfence.com/en/Web_Application_Firewall_Setup">click here for help</a>.</em>
@@ -6869,7 +7005,7 @@ complete this step, but wait for a few minutes before trying. You can try refres
6869
  $wafSection = $matches[1];
6870
  if (preg_match('#<IfModule\s+mod_suphp\.c>\s+suPHP_ConfigPath\s+\S+\s+</IfModule>#i', $wafSection)) {
6871
  $url= network_admin_url('admin.php?page=WordfenceWAF&wafAction=updateSuPHPConfig');
6872
- echo '<div class="notice notice-warning" id="wordfenceSuPHPUpdateWarning"><p>Your configuration for the Wordfence Firewall needs an update to continue operating optimally:&nbsp;<a class="button button-small" href="' . esc_url($url) . '">Click here to update</a> <a class="button button-small wf-dismiss-link" href="#" onclick="wordfenceExt.suPHPWAFUpdateChoice(\'no\'); return false;">Dismiss</a></p></div>';
6873
  }
6874
  }
6875
  }
288
 
289
  $report = new wfActivityReport();
290
  $report->rotateIPLog();
291
+ self::_refreshUpdateNotification($report, true);
292
+ }
293
+ public static function _scheduleRefreshUpdateNotification($upgrader, $options) {
294
+ $defer = false;
295
+ if (is_array($options) && isset($options['type']) && $options['type'] == 'core') {
296
+ $defer = true;
297
+ set_site_transient('wordfence_updating_notifications', true, 600);
298
+ }
299
 
300
+ if ($defer) {
301
+ wp_schedule_single_event(time(), 'wordfence_refreshUpdateNotification');
302
+ }
303
+ else {
304
+ self::_refreshUpdateNotification();
305
+ }
306
+ }
307
+ public static function _refreshUpdateNotification($report = null, $useCachedValued = false) {
308
+ if ($report === null) {
309
+ $report = new wfActivityReport();
310
+ }
311
+
312
+ $updatesNeeded = $report->getUpdatesNeeded($useCachedValued);
313
  if ($updatesNeeded) {
314
  $items = array();
315
  $plural = false;
350
 
351
  new wfNotification(null, wfNotification::PRIORITY_DEFAULT, '<a href="' . network_admin_url('update-core.php') . '">' . $message . '</a>', 'wfplugin_updates');
352
  }
353
+ else {
354
+ $n = wfNotification::getNotificationForCategory('wfplugin_updates');
355
+ if ($n !== null) {
356
+ $n->markAsRead();
357
+ }
358
+ }
359
+
360
+ wp_schedule_single_event(time(), 'wordfence_completeCoreUpdateNotification');
361
+ }
362
+ public static function _completeCoreUpdateNotification() {
363
+ //This approach is here because WP Core updates run in a different sequence than plugin/theme updates, so we have to defer the running of the notification update sequence by an extra page load
364
+ delete_site_transient('wordfence_updating_notifications');
365
  }
366
  public static function runInstall(){
367
  if(self::$runInstallCalled){ return; }
816
  }
817
 
818
  add_action('upgrader_process_complete', 'wordfence::_refreshVulnerabilityCache');
819
+ add_action('upgrader_process_complete', 'wordfence::_scheduleRefreshUpdateNotification', 99, 2);
820
+ add_action('wordfence_refreshUpdateNotification', 'wordfence::_refreshUpdateNotification', 99, 0);
821
+ add_action('wordfence_completeCoreUpdateNotification', 'wordfence::_completeCoreUpdateNotification', 99, 0);
822
 
823
  if(is_admin()){
824
  add_action('admin_init', 'wordfence::admin_init');
1235
 
1236
  // Sync the WAF data with the database.
1237
  if (!WFWAF_SUBDIRECTORY_INSTALL && $waf = wfWAF::getInstance()) {
1238
+ $homeurl = wfUtils::wpHomeURL();
1239
+
1240
  try {
1241
  $configDefaults = array(
1242
  'apiKey' => wfConfig::get('apiKey'),
1243
  'isPaid' => wfConfig::get('isPaid'),
1244
  'siteURL' => site_url(),
1245
+ 'homeURL' => $homeurl,
1246
  'whitelistedIPs' => (string) wfConfig::get('whitelisted'),
1247
  'howGetIPs' => (string) wfConfig::get('howGetIPs'),
1248
  'other_WFNet' => wfConfig::get('other_WFNet', true),
1883
  if(is_wp_error($authUser) && ($authUser->get_error_code() == 'invalid_username' || $authUser->get_error_code() == 'invalid_email' || $authUser->get_error_code() == 'incorrect_password') && wfConfig::get('loginSec_maskLoginErrors')){
1884
  return new WP_Error( 'incorrect_password', sprintf( __( '<strong>ERROR</strong>: The username or password you entered is incorrect. <a href="%2$s" title="Password Lost and Found">Lost your password</a>?' ), $username, wp_lostpassword_url() ) );
1885
  }
1886
+
1887
  return $authUser;
1888
  }
1889
  public static function wfsnBatchReportBlockedAttempts() {
2671
  $issueID = intval($_POST['issueID']);
2672
  $wfIssues = new wfIssues();
2673
  $wfIssues->updateIssue($issueID, 'delete');
2674
+ wfScanEngine::refreshScanNotification($wfIssues);
2675
  }
2676
  }
2677
  else {
3220
  return array('cerrorMsg' => "You don't have permission to repair .htaccess. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file.");
3221
  }
3222
  $issues->updateIssue($_POST['issueID'], 'delete');
3223
+ wfScanEngine::refreshScanNotification($issues);
3224
  return array('ok' => 1);
3225
  }
3226
  public static function ajax_clearAllBlocked_callback(){
3369
  $wfIssues = new wfIssues();
3370
  $issueID = $_POST['id'];
3371
  $wfIssues->deleteIssue($issueID);
3372
+ wfScanEngine::refreshScanNotification($wfIssues);
3373
  return array('ok' => 1);
3374
  }
3375
  public static function ajax_updateAllIssues_callback(){
3384
  } else {
3385
  return array('errorMsg' => "An invalid operation was called.");
3386
  }
3387
+ wfScanEngine::refreshScanNotification($i);
3388
  return array('ok' => 1);
3389
  }
3390
  public static function ajax_updateIssueStatus_callback(){
3395
  return array('errorMsg' => "An invalid status was specified when trying to update that issue.");
3396
  }
3397
  $wfIssues->updateIssue($issueID, $status);
3398
+ wfScanEngine::refreshScanNotification($wfIssues);
3399
  return array('ok' => 1);
3400
  }
3401
  public static function ajax_killScan_callback(){
3565
  $headMsg = "Nothing done";
3566
  $bodyMsg = "We didn't $verb2 anything and no errors were found.";
3567
  }
3568
+
3569
+ wfScanEngine::refreshScanNotification($issues);
3570
  return array('ok' => 1, 'bulkHeading' => $headMsg, 'bulkBody' => $bodyMsg);
3571
  } else {
3572
  return array('errorMsg' => "Invalid bulk operation selected");
3596
  The <code>wp-config.php</code> file contains your database credentials which you will need to restore normal site operations.
3597
  Your site will <b>NOT</b> function once the <code>wp-config.php</code> has been deleted.
3598
  <p>
3599
+ <a class='wf-btn wf-btn-default' href='/?_wfsf=download&nonce=" . wp_create_nonce('wp-ajax') . "&file=". rawurlencode($file) ."' target='_blank' onclick=\"jQuery('#wp-config-force-delete').show();\">Download a backup copy</a>
3600
+ <a style='display:none' id='wp-config-force-delete' class='wf-btn wf-btn-default' href='#' target='_blank' onclick='WFAD.deleteFile($issueID, true); return false;'>Delete wp-config.php</a>
3601
  </p>",
3602
  );
3603
  }
3623
 
3624
  if($wp_filesystem->delete($localFile)){
3625
  $wfIssues->updateIssue($issueID, 'delete');
3626
+ wfScanEngine::refreshScanNotification($wfIssues);
3627
  return array(
3628
  'ok' => 1,
3629
  'localFile' => $localFile,
3649
  $prefix = $wpdb->get_blog_prefix($issue['data']['site_id']);
3650
  if ($wpdb->query($wpdb->prepare("DELETE FROM {$prefix}options WHERE option_name = %s", $issue['data']['option_name']))) {
3651
  $wfIssues->updateIssue($issueID, 'delete');
3652
+ wfScanEngine::refreshScanNotification($wfIssues);
3653
  return array(
3654
  'ok' => 1,
3655
  'option_name' => $issue['data']['option_name'],
3686
  );
3687
  }
3688
  $issues->updateIssue($_POST['issueID'], 'delete');
3689
+ wfScanEngine::refreshScanNotification($issues);
3690
  return array('ok' => 1);
3691
  }
3692
  public static function ajax_restoreFile_callback($issueID = null){
3733
  $localFile = rtrim(ABSPATH, '/') . '/' . preg_replace('/^[\.\/]+/', '', $file);
3734
  if ($wp_filesystem->put_contents($localFile, $result['fileContent'])) {
3735
  $wfIssues->updateIssue($issueID, 'delete');
3736
+ wfScanEngine::refreshScanNotification($wfIssues);
3737
  return array(
3738
  'ok' => 1,
3739
  'file' => $localFile,
4081
  }
4082
  return array('ok' => 1);
4083
  }
4084
+ public static function ajax_dashboardShowMore_callback() {
4085
+ $grouping = $_POST['grouping'];
4086
+ $period = $_POST['period'];
4087
+
4088
+ $dashboard = new wfDashboard();
4089
+ if ($grouping == 'ips') {
4090
+ $data = null;
4091
+ if ($period == '24h') { $data = $dashboard->ips24h; }
4092
+ else if ($period == '7d') { $data = $dashboard->ips7d; }
4093
+ else if ($period == '30d') { $data = $dashboard->ips30d; }
4094
+
4095
+ if ($data !== null) {
4096
+ foreach ($data as &$d) {
4097
+ $d['IP'] = esc_html(wfUtils::inet_ntop($d['IP']));
4098
+ $d['blockCount'] = esc_html(number_format_i18n($d['blockCount']));
4099
+ $d['countryFlag'] = esc_attr(wfUtils::getBaseURL() . 'images/flags/' . esc_attr(strtolower($d['countryCode'])) . '.png');
4100
+ $d['countryName'] = esc_html($d['countryName']);
4101
+ }
4102
+ return array('ok' => 1, 'data' => $data);
4103
+ }
4104
+ }
4105
+ else if ($grouping == 'logins') {
4106
+ $data = null;
4107
+ if ($period == 'success') { $data = $dashboard->loginsSuccess; }
4108
+ else if ($period == 'fail') { $data = $dashboard->loginsFail; }
4109
+
4110
+ if ($data !== null) {
4111
+ foreach ($data as &$d) {
4112
+ $d['ip'] = esc_html($d['ip']);
4113
+ $d['name'] = esc_html($d['name']);
4114
+ if (time() - $d['t'] < 86400) {
4115
+ $d['t'] = esc_html(wfUtils::makeTimeAgo(time() - $d['t']) . ' ago');
4116
+ }
4117
+ else {
4118
+ $d['t'] = esc_html(date_i18n(get_option('date_format') . ' ' . get_option('time_format'), (int) $d['t']));
4119
+ }
4120
+ }
4121
+ return array('ok' => 1, 'data' => $data);
4122
+ }
4123
+ }
4124
+
4125
+ return array('error' => 'Unknown dashboard data set.');
4126
+ }
4127
  public static function startScan(){
4128
  wfScanEngine::startScan();
4129
  }
4559
  'disableDirectoryListing', 'fixFPD', 'deleteAdminUser', 'revokeAdminUser',
4560
  'hideFileHtaccess', 'saveDebuggingConfig', 'wafConfigureAutoPrepend',
4561
  'whitelistBulkDelete', 'whitelistBulkEnable', 'whitelistBulkDisable',
4562
+ 'dismissNotification', 'utilityScanForBlacklisted', 'dashboardShowMore',
4563
  ) as $func){
4564
  add_action('wp_ajax_wordfence_' . $func, 'wordfence::ajaxReceiver');
4565
  }
4586
  wp_enqueue_script('wordfenceAdminExtjs', wfUtils::getBaseURL() . 'js/tourTip.js', array('jquery'), WORDFENCE_VERSION);
4587
  self::setupAdminVars();
4588
  }
4589
+
4590
+ if (is_admin()) { //Back end only
4591
+ $homeurl = '';
4592
+ if (function_exists('get_bloginfo') && empty($homeurl)) {
4593
+ if (is_multisite()) {
4594
+ $homeurl = network_home_url();
4595
+ $homeurl = rtrim($homeurl, '/'); //Because previously we used get_bloginfo and it returns http://example.com without a '/' char.
4596
+ }
4597
+ else {
4598
+ $homeurl = home_url();
4599
+ }
4600
+
4601
+ if (wfConfig::get('wp_home_url') !== $homeurl) {
4602
+ wfConfig::set('wp_home_url', $homeurl);
4603
+ }
4604
+ }
4605
+ }
4606
 
4607
  if (!WFWAF_AUTO_PREPEND || WFWAF_SUBDIRECTORY_INSTALL) {
4608
  if (empty($_GET['wafAction']) && !wfConfig::get('dismissAutoPrependNotice')) {
4724
  $url = network_admin_url('admin.php?page=WordfenceSecOpt&wafAction=useMineForAdminEmailAlerts');
4725
  $dismissURL = network_admin_url('admin.php?page=WordfenceSecOpt&wafAction=dismissAdminEmailNotice&nonce=' .
4726
  rawurlencode(wp_create_nonce('wfDismissAdminEmailWarning')));
4727
+ echo '<div id="wordfenceAdminEmailWarning" class="fade error inline wf-admin-notice"><p><strong>You have not set an administrator email address to receive alerts for Wordfence.</strong> Please <a href="' . self::getMyOptionsURL() . '">click here to go to the Wordfence Options Page</a> and set an email address where you will receive security alerts from this site.</p><p><a class="wf-btn wf-btn-default wf-btn-sm" href="#" onclick="wordfenceExt.adminEmailChoice(\'mine\'); return false;"">Use My Email Address</a>
4728
+ <a class="wf-btn wf-btn-default wf-btn-sm wf-dismiss-link" href="#" onclick="wordfenceExt.adminEmailChoice(\'no\'); return false;">Dismiss</a></p></div>';
4729
  }
4730
  public static function misconfiguredHowGetIPsNotice() {
4731
  $url = network_admin_url('admin.php?page=WordfenceSecOpt');
4762
  $recommendationMsg = 'This site appears to be behind Cloudflare, so using the Cloudflare "CF-Connecting-IP" HTTP header will resolve to the correct IPs.';
4763
  }
4764
  echo '<div id="wordfenceMisconfiguredHowGetIPsNotice" class="fade error"><p><strong>Your \'How does Wordfence get IPs\' setting is misconfigured.</strong> ' . $existingMsg . ' ' . $recommendationMsg . ' <a href="#" onclick="wordfenceExt.misconfiguredHowGetIPsChoice(\'yes\'); return false;">Click here to use the recommended setting</a> or <a href="' . $url . '">visit the options page</a> to manually update it.</p><p>
4765
+ <a class="wf-btn wf-btn-default wf-btn-sm wf-dismiss-link" href="#" onclick="wordfenceExt.misconfiguredHowGetIPsChoice(\'no\'); return false;">Dismiss</a> <a class="wfhelp" target="_blank" href="https://docs.wordfence.com/en/Misconfigured_how_get_IPs_notice"></a></p></div>';
4766
  }
4767
  public static function autoUpdateNotice(){
4768
  echo '<div id="wordfenceAutoUpdateChoice" class="fade error"><p><strong>Do you want Wordfence to stay up-to-date automatically?</strong>&nbsp;&nbsp;&nbsp;<a href="#" onclick="wordfenceExt.autoUpdateChoice(\'yes\'); return false;">Yes, enable auto-update.</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#" onclick="wordfenceExt.autoUpdateChoice(\'no\'); return false;">No thanks.</a></p></div>';
4835
  }
4836
 
4837
  $notificationCount = count(wfNotification::notifications());
4838
+ $updatingNotifications = get_site_transient('wordfence_updating_notifications');
4839
+ $hidden = ($notificationCount == 0 || $updatingNotifications ? ' wf-hidden' : '');
4840
  $formattedCount = number_format_i18n($notificationCount);
4841
  $dashboardExtra = " <span class='update-plugins wf-menu-badge wf-notification-count-container{$hidden}' title='{$notificationCount}'><span class='update-count wf-notification-count-value'>{$formattedCount}</span></span>";
4842
 
4844
  add_submenu_page("Wordfence", "Dashboard", "Dashboard", "activate_plugins", "Wordfence", 'wordfence::menu_dashboard');
4845
  add_submenu_page("Wordfence", "Scan", "Scan", "activate_plugins", "WordfenceScan", 'wordfence::menu_scan');
4846
  add_submenu_page("Wordfence", "Firewall", "Firewall", "activate_plugins", "WordfenceWAF", 'wordfence::menu_firewall');
4847
+ add_submenu_page("Wordfence", "Blocking", "Blocking", "activate_plugins", "WordfenceBlocking", 'wordfence::menu_blocking');
4848
  add_submenu_page("Wordfence", "Live Traffic", "Live Traffic", "activate_plugins", "WordfenceActivity", 'wordfence::menu_activity');
4849
 
4850
  add_submenu_page('Wordfence', 'Tools', 'Tools', 'activate_plugins', 'WordfenceTools', 'wordfence::menu_tools');
4928
  $emailForm = true;
4929
  require 'menu_tools.php';
4930
  }
4931
+
4932
+ public static function menu_blocking() {
4933
+ require 'menu_blocking.php';
4934
+ }
4935
 
4936
  public static function menu_firewall() {
4937
  global $wp_filesystem;
4968
  update permissions on the parent directory so the web server can write to it.';
4969
  }
4970
 
4971
+ $hideBar = false;
4972
  if (!empty($_GET['wafAction'])) {
4973
  switch ($_GET['wafAction']) {
4974
  case 'dismissAutoPrependNotice':
4978
  break;
4979
 
4980
  case 'updateSuPHPConfig':
4981
+ $hideBar = true;
4982
  if (!isset($_REQUEST['updateComplete']) || !$_REQUEST['updateComplete']) {
4983
  $wfnonce = wp_create_nonce('wfWAFUpdateSuPHPConfig');
4984
  $adminURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=updateSuPHPConfig');
4990
  <p>The Wordfence Web Application Firewall for Apache suPHP servers has been improved, and your configuration needs to be updated to continue receiving the best protection. Please download a backup copy of the following files before we make the necessary changes:</p>';
4991
  $wafActionContent .= '<ul>';
4992
  foreach ($backups as $index => $backup) {
4993
+ $wafActionContent .= '<li><a class="wf-btn wf-btn-default" onclick="wfWAFConfirmBackup(' . $index . ');" href="' .
4994
  esc_url(add_query_arg(array(
4995
  'downloadBackup' => 1,
4996
  'updateReady' => 1,
5004
  <form action='$adminURL' method='post'>
5005
  <input type='hidden' name='wfnonce' value='$wfnonce'>
5006
  <input type='hidden' value='1' name='confirmedBackup'>
5007
+ <button id='confirmed-backups' disabled class='wf-btn wf-btn-primary' type='submit'>Continue</button>
5008
  </form>
5009
  <script>
5010
  var wfWAFBackups = $jsonBackups;
5098
  if (WFWAF_AUTO_PREPEND && !WFWAF_SUBDIRECTORY_INSTALL) {
5099
  break;
5100
  }
5101
+ $hideBar = true;
5102
  $wfnonce = wp_create_nonce('wfWAFAutoPrepend');
5103
 
5104
  $currentAutoPrependFile = ini_get('auto_prepend_file');
5122
  which should maintain compatibility with your site, or you can opt to override the existing PHP setting.</p>
5123
 
5124
  <p>
5125
+ <a class='wf-btn wf-btn-primary' href='%s'>Include this file (Recommended)</a>
5126
+ <a class='wf-btn wf-btn-default' href='%s'>Override this value</a>
5127
  </p>
5128
  ",
5129
  esc_html($currentAutoPrependFile),
5140
  $wafActionContent = '<p>Please download a backup copy of the following files before we make the necessary changes:</p>';
5141
  $wafActionContent .= '<ul>';
5142
  foreach ($backups as $index => $backup) {
5143
+ $wafActionContent .= '<li><a class="wf-btn wf-btn-default" onclick="wfWAFConfirmBackup(' . $index . ');" href="' .
5144
  esc_url(add_query_arg(array(
5145
  'downloadBackup' => 1,
5146
  'backupIndex' => $index,
5156
  <input type='hidden' name='wfnonce' value='$wfnonce'>
5157
  <input type='hidden' value='$serverConfig' name='serverConfiguration'>
5158
  <input type='hidden' value='1' name='confirmedBackup'>
5159
+ <button id='confirmed-backups' disabled class='wf-btn wf-btn-primary' type='submit'>Continue</button>
5160
  </form>
5161
  <script>
5162
  var wfWAFBackups = $jsonBackups;
5273
 
5274
  $adminURL = esc_url($adminURL);
5275
  $wafActionContent .= "
5276
+ <form action='$adminURL' method='post' class='wf-form-inline'>
5277
+ <div class='wf-form-group'>
5278
  <input type='hidden' name='wfnonce' value='$wfnonce'>
5279
+ <select class='wf-form-control' name='serverConfiguration' id='wf-waf-server-config'>
5280
  $wafPrependOptions
5281
  </select>
5282
+ </div>
5283
+ <button class='wf-btn wf-btn-primary' type='submit'>Continue</button>
5284
  </form>
5285
  $nginxIniWarning
5286
  </div>
5320
  break;
5321
 
5322
  case 'removeAutoPrepend':
5323
+ $hideBar = true;
5324
  $installedHere = !(!WFWAF_AUTO_PREPEND && !WFWAF_SUBDIRECTORY_INSTALL);
5325
  $wfnonce = wp_create_nonce('wfWAFRemoveAutoPrepend');
5326
 
5390
 
5391
  $adminURL = esc_url($adminURL);
5392
  $wafActionContent .= "
5393
+ <form action='$adminURL' method='post' class='wf-form-inline'>
5394
+ <div class='wf-form-group'>
5395
  <input type='hidden' name='wfnonce' value='$wfnonce'>
5396
+ <select class='wf-form-control' name='serverConfiguration' id='wf-waf-server-config'>
5397
  $wafPrependOptions
5398
  </select>
5399
+ </div>
5400
+ <button class='wf-btn wf-btn-primary' type='submit'>Continue</button>
5401
  </form>
5402
  ";
5403
  }
5425
  $wafActionContent = '<p>Please download a backup copy of the following files before we make the necessary changes:</p>';
5426
  $wafActionContent .= '<ul>';
5427
  foreach ($backups as $index => $backup) {
5428
+ $wafActionContent .= '<li><a class="wf-btn wf-btn-default" onclick="wfWAFConfirmBackup(' . $index . ');" href="' .
5429
  esc_url(add_query_arg(array(
5430
  'downloadBackup' => 1,
5431
  'backupIndex' => $index,
5440
  <input type='hidden' name='wfnonce' value='$wfnonce'>
5441
  <input type='hidden' value='$serverConfig' name='serverConfiguration'>
5442
  <input type='hidden' value='1' name='confirmedBackup'>
5443
+ <button id='confirmed-backups' disabled class='wf-btn wf-btn-primary' type='submit'>Continue</button>
5444
  </form>
5445
  <script>
5446
  var wfWAFBackups = $jsonBackups;
5636
  $result,
5637
  esc_url(network_admin_url('admin.php?page=WordfenceScan'))
5638
  );
5639
+ wfScanEngine::refreshScanNotification();
5640
  }
5641
 
5642
  public static function fsActionDeleteFileCallback() {
5658
  $result,
5659
  esc_url(network_admin_url('admin.php?page=WordfenceScan'))
5660
  );
5661
+ wfScanEngine::refreshScanNotification();
5662
  }
5663
 
5664
  public static function status($level /* 1 has highest visibility */, $type /* info|error */, $msg){
6055
  $wpdb->delete($wpdb->users, array('ID' => $data['userID']));
6056
  }
6057
  $wfIssues->deleteIssue($issueID);
6058
+ wfScanEngine::refreshScanNotification($wfIssues);
6059
 
6060
  return array(
6061
  'ok' => 1,
6082
  }
6083
 
6084
  $wfIssues->deleteIssue($issueID);
6085
+ wfScanEngine::refreshScanNotification($wfIssues);
6086
 
6087
  return array(
6088
  'ok' => 1,
6709
  $lastSendTime = $attackDataRow->attackLogTime;
6710
  }
6711
  }
6712
+
6713
+ $homeurl = wfUtils::wpHomeURL();
6714
+ $siteurl = wfUtils::wpSiteURL();
6715
+ $installType = wfUtils::wafInstallationType();
6716
  $response = wp_remote_post(WFWAF_API_URL_SEC . "?" . http_build_query(array(
6717
  'action' => 'send_waf_attack_data',
6718
  'k' => $waf->getStorageEngine()->getConfig('apiKey'),
6719
+ 's' => $siteurl,
6720
+ 'h' => $homeurl,
6721
  't' => microtime(true),
6722
+ 'c' => $installType,
6723
  ), null, '&'),
6724
  array(
6725
  'body' => json_encode($dataToSend),
6862
  if (class_exists('wfWAFIPBlocksController')) {
6863
  if ($action == wfWAFIPBlocksController::WFWAF_BLOCK_WFSN) {
6864
  $hit->action = 'blocked:wfsnrepeat';
6865
+ wordfence::wfsnReportBlockedAttempt($ip, 'waf');
6866
+ }
6867
+ else if (isset($metadata['finalAction']['lockout'])) {
6868
+ $wpdb->query($wpdb->prepare("UPDATE {$wpdb->base_prefix}wfLockedOut SET blockedHits = blockedHits + 1, lastAttempt = unix_timestamp() where IP=%s", wfUtils::inet_pton($ip)));
6869
+ $hit->action = 'lockedOut';
6870
+ }
6871
+ else if (isset($metadata['finalAction']['block'])) {
6872
+ //Do nothing
6873
  }
6874
  }
6875
  $hit->actionDescription = $actionDescription;
6964
  $dismissURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=dismissAutoPrependNotice&nonce=' .
6965
  rawurlencode(wp_create_nonce('wfDismissAutoPrependNotice')));
6966
  echo '<div class="update-nag" id="wf-extended-protection-notice">To make your site as secure as possible, take a moment to optimize the Wordfence Web
6967
+ Application Firewall: &nbsp;<a class="wf-btn wf-btn-default wf-btn-sm" href="' . esc_url($url) . '">Click here to configure.</a>
6968
+ <a class="wf-btn wf-btn-default wf-btn-sm wf-dismiss-link" href="' . esc_url($dismissURL) . '">Dismiss</a>
6969
  <br>
6970
  <em style="font-size: 85%;">If you cannot complete the setup process,
6971
  <a target="_blank" href="https://docs.wordfence.com/en/Web_Application_Firewall_Setup">click here for help</a>.</em>
7005
  $wafSection = $matches[1];
7006
  if (preg_match('#<IfModule\s+mod_suphp\.c>\s+suPHP_ConfigPath\s+\S+\s+</IfModule>#i', $wafSection)) {
7007
  $url= network_admin_url('admin.php?page=WordfenceWAF&wafAction=updateSuPHPConfig');
7008
+ echo '<div class="notice notice-warning" id="wordfenceSuPHPUpdateWarning"><p>Your configuration for the Wordfence Firewall needs an update to continue operating optimally:&nbsp;<a class="wf-btn wf-btn-default wf-btn-sm" href="' . esc_url($url) . '">Click here to update</a> <a class="wf-btn wf-btn-default wf-btn-sm wf-dismiss-link" href="#" onclick="wordfenceExt.suPHPWAFUpdateChoice(\'no\'); return false;">Dismiss</a></p></div>';
7009
  }
7010
  }
7011
  }
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: mmaunder
3
  Tags: security, secure, security plugin, wordpress security, login security, firewall, malware, antivirus, web application firewall, block hackers, country blocking
4
  Requires at least: 3.9
5
- Tested up to: 4.7.1
6
- Stable tag: 6.3.0
7
 
8
  Secure your website with the most comprehensive WordPress security plugin. Firewall, malware scan, blocking, live traffic, login security & more.
9
 
@@ -99,75 +99,80 @@ To install the Wordfence WordPress security plugin on WordPress Multi-Site insta
99
 
100
  Secure your website with Wordfence.
101
 
102
- [Visit our support website which contains a FAQ and knowledgebase which is more comprehensive and updated frequently.](http://support.wordfence.com/)
103
 
104
- = What does Wordfence Security do that other WordPress security plugins don't do? =
105
 
106
- * Wordfence Security actually verifies your website source code integrity against the official WordPress repository and shows you the changes. We are the only plugin to do this.
107
- * Wordfence Security fully supports IPv6 including giving you the ability to look up the location of IPv6 addresses, block IPv6 ranges, detect IPv6 country and do a whois lookup on IPv6 addresses and more.
108
- * Wordfence Security includes protection against DDoS attacks by giving you a performance boost up to 50X.
109
- * Wordfence Security scans check all your files, comments and posts for URL's in Google's Safe Browsing list. We are the only plugin to offer this very important security enhancement.
110
- * Wordfence Security scans do not consume large amounts of your precious bandwidth because all security scans happen on your web server which makes them very fast.
111
- * Wordfence Security fully supports WordPress Multi-Site which means you can security scan every blog in your Multi-Site installation with one click.
112
- * Wordfence Security includes Two-Factor authentication, the most secure way to stop brute force attackers in their tracks.
113
- * Wordfence security provides a WordPress Firewall developed specifically for WordPress and is kept up to date by our Threat Defense Feed. Premium customers receive updates in real-time.
114
-
115
- = Does Wordfence Security support Multi-Site installations? =
116
 
117
- Yes. WordPress MU or Multi-Site as it's called now is fully supported. Using Wordfence Security you can security scan every blog in your network with one click. If one of your customers posts a page or post with a known malware URL that threatens your whole domain with being blacklisted by Google, we will tell you within a maximum of one hour which is how often scans occur.
118
 
119
- = Will Wordfence Security slow my site down? =
120
-
121
- No. Wordfence is extremely fast and uses techniques like caching its own configuration data to avoid database lookups and blocking malicious attacks that would slow down your site. Older versions of Wordfence did incur a slight performance penalty, but we have not only fixed this issue but knocked it out of the park.
122
-
123
- = How often is Wordfence Security updated? =
124
-
125
- The Wordfence Security plugin is frequently updated and we update the code on our security scanning servers more frequently. Our cloud servers are continually updated with the latest known security threats and vulnerabilities so that we can blog any security threat as soon as it emerges in the wild.
126
 
127
- = What if I need support? =
128
 
129
- All our paid customers receive priority support. Excellent customer service is a key part of being a Wordfence Security member. As free or Premium member can visit [support.wordfence.com](http://support.wordfence.com/) and where you will find out knowledgebase. If you're a Premium member you can also open a support ticket.
130
 
131
- = Can I disable certain security features of Wordfence Security? =
132
 
133
- Yes! Simply visit the Options page, click on advanced options and enable or disable the security features you want.
 
 
 
 
 
 
134
 
135
- = What if my site security has already been compromised by a hacker? =
136
 
137
- Wordfence Security is the only WordPress security plugin that is able to repair core files, themes and plugins on sites where security is already compromised. However, please note that site security can not be assured unless you do a full reinstall if your site has been hacked. We recommend you only use Wordfence Security to get your site into a running state in order to recover the data you need to do a full reinstall. A full reinstall is the only way to ensure site security once you have been hacked.
138
 
139
- = How will I be alerted that my site has a security problem? =
140
 
141
- Wordfence Security sends security alerts via email. Once you install Wordfence Security, you will configure a list of email addresses where security alerts will be sent. When you receive a security alert, make sure you deal with it promptly to ensure your site stays secure.
142
 
143
- = My WordPress site is behind a firewall. Doesn't that make it secure? =
144
 
145
- If your site is accessible from the web, it means that people you don't know can execute PHP code on your site. They have to be able to execute PHP code, like the core WordPress code, in order for your site to work. Most WordPress security threats allow a hacker to execute PHP code on your website. The challenge hackers face is how to get their malicious PHP code onto your site to compromise your security. There are many upload mechanisms that WordPress itself, themes and plugins offer and the vast majority of these are secure. However, every now and then a hacker discovers an upload mechanism that is not secure or a way of fooling your site into allowing an upload. That is usually when security is compromised. Even though your site is behind a commercial firewall, it still accepts web requests that include uploads and executes PHP code and as long as it does that, it may face a security vulnerability at some point.
146
 
147
- = Will Wordfence Security protect me against the Timthumb security problem? =
148
 
149
- The timthumb security exploit occurred in 2011 and all good plugins and themes now use an updated version of timthumb (which the creator of Wordfence Security wrote and donated to the timthumb author) which closes the security hole that caused the problem. However we do scan for old version of timthumb for good measure to make sure they don't cause a security hole on your site.
150
 
151
- = Does Wordfence Security support IPv6? =
152
 
153
- Most definitely! As of Wordfence version 6.0.1 we fully support IPv6 with all security functions including country blocking, range blocking, city lookup, whois lookup and all other security functions. If you are not running IPv6 Wordfence will work great on your site too. We are fully compatible with both IPv4 and IPv6 whether you run both or only one addressing scheme.
154
 
155
  = Where can I learn more about WordPress security? =
156
 
157
- Designed for every skill level, [The WordPress Security Learning Center](https://www.wordfence.com/learn/) is dedicated to deepening user's understanding of security best practices by having access to in-depth articles, videos, industry survey results, graphics and more.
158
 
159
  == Screenshots ==
160
 
161
  Secure your website with Wordfence.
162
 
163
- 1. The home screen of Wordfence Security where you can see a summary, manage security issues and do a manual security scan.
164
- 2. The Live Traffic view of Wordfence Security where you can see real-time activity on your site.
165
- 3. The "Blocked IPs" page where you can manage blocked IP's, locked out IP's and see recently throttled IPs that violated security rules.
166
- 4. The basic view of Wordfence Security options. There is very little to configure other than your alert email address and security level.
167
- 5. If you're technically minded, this is the under-the-hood view of Wordfence Security options where you can fine-tune your security settings.
 
 
168
 
169
  == Changelog ==
170
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  = 6.3.0 =
172
  * Enhancement: Added Wordfence Dashboard for quick overview of security activity.
173
  * Improvement: Simplified the UI by revamping menu structure and styling.
@@ -1553,4 +1558,3 @@ Wordfence Security to zero (we simply reuse the WordPress DB handle), reduces th
1553
  about 1% of the previous version by removing unneeded status messages and fixes a bug that
1554
  could cause Wordfence Security to launch multiple concurrent scans that can put high load on your system.
1555
  This is a critical release. Upgrade immediately.
1556
-
2
  Contributors: mmaunder
3
  Tags: security, secure, security plugin, wordpress security, login security, firewall, malware, antivirus, web application firewall, block hackers, country blocking
4
  Requires at least: 3.9
5
+ Tested up to: 4.7.2
6
+ Stable tag: 6.3.1
7
 
8
  Secure your website with the most comprehensive WordPress security plugin. Firewall, malware scan, blocking, live traffic, login security & more.
9
 
99
 
100
  Secure your website with Wordfence.
101
 
102
+ [Visit our documentation website which includes feature descriptions, common solutions and comprehensive help.](http://support.wordfence.com/)
103
 
104
+ = How does Wordfence Security protect sites from attackers? =
105
 
106
+ The WordPress security plugin provides the best protection available for your website. Powered by the constantly updated Threat Defense Feed, WordFence Firewall stops you from getting hacked. Wordfence Scan leverages the same proprietary feed, alerting you quickly in the event your site is compromised. The Live Traffic view gives you real-time visibility into traffic and hack attempts on your website. A deep set of additional tools round out the most comprehensive WordPress security solution available.
 
 
 
 
 
 
 
 
 
107
 
108
+ = How will I be alerted if my site has a security problem? =
109
 
110
+ Wordfence Security sends security alerts via email. Once you install Wordfence Security, you will configure a list of email addresses where security alerts will be sent. When you receive a security alert, make sure you deal with it promptly to ensure your site stays secure.
 
 
 
 
 
 
111
 
112
+ = Do I need a security plugin like Wordfence if I’m using a cloud based firewall (WAF)? =
113
 
114
+ Wordfence provides true endpoint security for your WordPress website. Unlike cloud based firewalls, Wordfence executes within the WordPress environment, giving it knowledge like whether the user is signed in, their identity and what access level they have. Wordfence uses the user’s access level in more than 80% of the firewall rules it uses to protect WordPress websites. Learn more about the [Cloud WAF identity problem here](https://www.wordfence.com/blog/2016/10/endpoint-vs-cloud-security-cloud-waf-user-identity-problem/). Additionally, cloud based firewalls can be bypassed, leaving your site exposed to attackers. Because Wordfence is an integral part of the endpoint (your WordPress website), it can’t be bypassed. Learn more about the [Cloud WAF bypass problem here](https://www.wordfence.com/blog/2016/10/endpoint-vs-cloud-security-cloud-waf-bypass-problem/). To fully protect the investment you’ve made in your website you need to employ a defense in depth approach to security. Wordfence takes this approach.
115
 
116
+ = What differentiates Wordfence from other WordPress Security plugins? =
117
 
118
+ * Wordfence security provides a WordPress Firewall developed specifically for WordPress and blocks attackers looking for vulnerabilities on your site. The Firewall is powered by our Threat Defense Feed which is continually updated as new threats emerge. Premium customers receive updates in real-time.
119
+ * Wordfence Security verifies your website source code integrity against the official WordPress repository and shows you the changes.
120
+ * Wordfence Security scans check all your files, comments and posts for URLs in Google's Safe Browsing list. We are the only plugin to offer this very important security enhancement.
121
+ * Wordfence Security scans do not consume large amounts of your bandwidth because all security scans happen on your web server which makes them very fast.
122
+ * Wordfence Security fully supports WordPress Multi-Site which means you can security scan every blog in your Multi-Site installation with one click.
123
+ * Wordfence Security includes Two-Factor authentication, the most secure way to stop brute force attackers in their tracks.
124
+ * Wordfence Security fully supports IPv6 including giving you the ability to look up the location of IPv6 addresses, block IPv6 ranges, detect IPv6 country and do a whois lookup on IPv6 addresses and more.
125
 
126
+ = Will Wordfence slow down my website? =
127
 
128
+ No. Wordfence Security is extremely fast and uses techniques like caching its own configuration data to avoid database lookups and blocking malicious attacks that would slow down your site.
129
 
130
+ = What if my site has already been hacked? =
131
 
132
+ Wordfence Security is able to repair core files, themes and plugins on sites where security is already compromised. You can follow this guide on [how to clean a hacked website](https://www.wordfence.com/docs/how-to-clean-a-hacked-wordpress-site-using-wordfence/) using Wordfence. However, please note that site security can not be assured unless you do a full reinstall if your site has been hacked. We recommend you only use Wordfence Security to get your site into a running state in order to recover the data you need to do a full reinstall. If you need help repairing a hacked site, we offer an affordable, high-quality [site cleaning service](https://www.wordfence.com/wordfence-site-cleanings/) that includes a Premium key for a year.
133
 
134
+ = Does Wordfence Security support IPv6? =
135
 
136
+ Yes. We fully support IPv6 with all security functions including country blocking, range blocking, city lookup, whois lookup and all other security functions. If you are not running IPv6, Wordfence will work great on your site too. We are fully compatible with both IPv4 and IPv6 whether you run both or only one addressing scheme.
137
 
138
+ = Does Wordfence Security support Multi-Site installations? =
139
 
140
+ Yes. WordPress Multi-Site is fully supported. Using Wordfence Security you can scan every blog in your network for malware with one click. If one of your customers posts a page or post with a known malware URL that threatens your whole domain with being blacklisted by Google, we will alert you in the next scan.
141
 
142
+ = What support options are available for Wordfence users? =
143
 
144
+ Providing excellent customer service is very important to us. We offer help to all our customers whether you are using the Premium or free version of Wordfence Security. For help with the free version, you can post in our [forum](https://wordpress.org/support/plugin/wordfence) where we have dedicated staff responding to questions. If you need faster or more in-depth help, Premium customers can submit a [support ticket](https://support.wordfence.com/support/home) to our Premium support team.
145
 
146
  = Where can I learn more about WordPress security? =
147
 
148
+ Designed for every skill level, [The WordPress Security Learning Center](https://www.wordfence.com/learn/) is dedicated to deepening users’ understanding of security best practices by providing free access to entry-level articles, in-depth articles, videos, industry survey results, graphics and more.
149
 
150
  == Screenshots ==
151
 
152
  Secure your website with Wordfence.
153
 
154
+ 1. The dashboard of Wordfene Security where you can get a quick overview of any important notifications and attacks your site has been protected from.
155
+ 2. The Web Application Firewall of Wordfence Security where you can configure your protection level and view which vulnerabilities you're protected from.
156
+ 3. The scan page of Wordfence Security where you can see a summary, manage security issues and do a manual security scan.
157
+ 4. The Live Traffic view of Wordfence Security where you can see real-time activity on your site.
158
+ 5. The "Blocked IPs" page where you can manage blocked IPs, locked out IPs and see recently throttled IPs that violated security rules.
159
+ 6. The basic view of Wordfence Security options. There is very little to configure other than your alert email address and security level.
160
+ 7. If you're technically minded, this is the under-the-hood view of Wordfence Security options where you can fine-tune your security settings.
161
 
162
  == Changelog ==
163
 
164
+ = 6.3.1 =
165
+ * Improvement: Locked out IPs are now enforced at the WAF level to reduce server load.
166
+ * Improvement: Added a "Show more" link to the IP block list and login attempts list.
167
+ * Improvement: Added network data for the top countries blocked list.
168
+ * Improvement: Added a notification when a premium key is installed on one site but registered for another URL.
169
+ * Improvement: Switching tabs in the various pages now updates the page title as well.
170
+ * Improvement: Various styling consistency improvements.
171
+ * Change: Separated the various blocking-related pages out from the Firewall top-level menu into "Blocking".
172
+ * Fix: Improved compatibility with our GeoIP interface.
173
+ * Fix: The updates available notification is refreshed after updates are installed.
174
+ * Fix: The scan notification is refreshed when issues are resolved or ignored.
175
+
176
  = 6.3.0 =
177
  * Enhancement: Added Wordfence Dashboard for quick overview of security activity.
178
  * Improvement: Simplified the UI by revamping menu structure and styling.
1558
  about 1% of the previous version by removing unneeded status messages and fixes a bug that
1559
  could cause Wordfence Security to launch multiple concurrent scans that can put high load on your system.
1560
  This is a critical release. Upgrade immediately.
 
vendor/wordfence/wf-waf/src/lib/waf.php CHANGED
@@ -789,7 +789,7 @@ HTML
789
  * @param wfWAFBlockException $e
790
  * @param int $httpCode
791
  */
792
- public function blockAction($e, $httpCode = 403, $redirect = false) {
793
  $this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest(), $e->getRequest()->getMetadata());
794
  $this->getStorageEngine()->blockIP($this->getRequest()->getTimestamp(), $this->getRequest()->getIP());
795
 
@@ -802,7 +802,7 @@ HTML
802
  if ($secsToGo = $e->getRequest()->getMetadata('503Time')) {
803
  header('Retry-After: ' . $secsToGo);
804
  }
805
- exit($this->getUnavailableMessage($e->getRequest()->getMetadata('503Reason')));
806
  }
807
 
808
  header('HTTP/1.0 403 Forbidden');
@@ -854,7 +854,8 @@ HTML
854
  /**
855
  * @return string
856
  */
857
- public function getUnavailableMessage($reason = '') {
 
858
  try {
859
  $homeURL = wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL');
860
  }
@@ -862,7 +863,7 @@ HTML
862
  //Do nothing
863
  }
864
 
865
- return wfWAFView::create('503', array(
866
  'waf' => $this,
867
  'reason' => $reason,
868
  'homeURL' => $homeURL,
@@ -1005,6 +1006,8 @@ HTML
1005
  'k' => $this->getStorageEngine()->getConfig('apiKey'),
1006
  's' => $this->getStorageEngine()->getConfig('siteURL') ? $this->getStorageEngine()->getConfig('siteURL') :
1007
  sprintf('%s://%s/', $this->getRequest()->getProtocol(), rawurlencode($this->getRequest()->getHost())),
 
 
1008
  't' => microtime(true),
1009
  ), null, '&'), $this->getStorageEngine()->getAttackData(), $request);
1010
 
@@ -1559,6 +1562,7 @@ class wfWAFCronFetchIPListEvent extends wfWAFCronEvent {
1559
  'action' => 'send_waf_attack_data',
1560
  'k' => $waf->getStorageEngine()->getConfig('apiKey'),
1561
  's' => $waf->getStorageEngine()->getConfig('siteURL') ? $waf->getStorageEngine()->getConfig('siteURL') : $guessSiteURL,
 
1562
  't' => microtime(true),
1563
  ), null, '&'), '[]', $request);
1564
 
789
  * @param wfWAFBlockException $e
790
  * @param int $httpCode
791
  */
792
+ public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) {
793
  $this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest(), $e->getRequest()->getMetadata());
794
  $this->getStorageEngine()->blockIP($this->getRequest()->getTimestamp(), $this->getRequest()->getIP());
795
 
802
  if ($secsToGo = $e->getRequest()->getMetadata('503Time')) {
803
  header('Retry-After: ' . $secsToGo);
804
  }
805
+ exit($this->getUnavailableMessage($e->getRequest()->getMetadata('503Reason'), $template));
806
  }
807
 
808
  header('HTTP/1.0 403 Forbidden');
854
  /**
855
  * @return string
856
  */
857
+ public function getUnavailableMessage($reason = '', $template = null) {
858
+ if ($template === null) { $template = '503'; }
859
  try {
860
  $homeURL = wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL');
861
  }
863
  //Do nothing
864
  }
865
 
866
+ return wfWAFView::create($template, array(
867
  'waf' => $this,
868
  'reason' => $reason,
869
  'homeURL' => $homeURL,
1006
  'k' => $this->getStorageEngine()->getConfig('apiKey'),
1007
  's' => $this->getStorageEngine()->getConfig('siteURL') ? $this->getStorageEngine()->getConfig('siteURL') :
1008
  sprintf('%s://%s/', $this->getRequest()->getProtocol(), rawurlencode($this->getRequest()->getHost())),
1009
+ 'h' => $this->getStorageEngine()->getConfig('homeURL') ? $this->getStorageEngine()->getConfig('homeURL') :
1010
+ sprintf('%s://%s/', $this->getRequest()->getProtocol(), rawurlencode($this->getRequest()->getHost())),
1011
  't' => microtime(true),
1012
  ), null, '&'), $this->getStorageEngine()->getAttackData(), $request);
1013
 
1562
  'action' => 'send_waf_attack_data',
1563
  'k' => $waf->getStorageEngine()->getConfig('apiKey'),
1564
  's' => $waf->getStorageEngine()->getConfig('siteURL') ? $waf->getStorageEngine()->getConfig('siteURL') : $guessSiteURL,
1565
+ 'h' => $waf->getStorageEngine()->getConfig('homeURL') ? $waf->getStorageEngine()->getConfig('homeURL') : $guessSiteURL,
1566
  't' => microtime(true),
1567
  ), null, '&'), '[]', $request);
1568
 
vendor/wordfence/wf-waf/src/views/503-lockout.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5
+ <title>You are temporarily locked out</title>
6
+ </head>
7
+ <body>
8
+ <h1>You are temporarily locked out</h1>
9
+ <p style="width: 500px;">
10
+ You have been temporarily locked out of this system. This means
11
+ that you will not be able to sign-in or use several other features that may compromise security.
12
+ Please try back in a short while.
13
+ <?php if (!empty($homeURL)): ?>
14
+ <ul>
15
+ <li><a href="<?php echo $homeURL; ?>">Return to the site home page</a></li>
16
+ </ul>
17
+ <?php
18
+ endif;
19
+ $nonce = $waf->createNonce('wf-form');
20
+ if (!empty($homeURL) && !empty($nonce)) : ?>
21
+ <br />
22
+
23
+ If you are a site administrator and have been accidentally locked out, please enter your email in the box below and click "Send". If the email address you enter belongs to a known site administrator or someone set to receive Wordfence alerts, we will send you an email to help you regain access. <a href="https://docs.wordfence.com/en/Help!_I_locked_myself_out_and_can't_get_back_in._What_can_I_do%3F" target="_blank">Please read this FAQ entry if this does not work.</a>
24
+ <br /><br />
25
+ <form method="POST" action="<?php echo $homeURL; ?>?_wfsf=unlockEmail">
26
+ <input type="hidden" name="nonce" value="<?php echo $nonce; ?>" />
27
+ <input type="text" size="50" name="email" value="" maxlength="255" />&nbsp;<input type="submit" name="s" value="Send me an unlock email" />
28
+ </form>
29
+ <?php endif; ?>
30
+ </p>
31
+ <p style="font-style: italic;">Generated by Wordfence.</p>
32
+ </body>
33
+ </html>
34
+ <?php exit(); ?>
waf/bootstrap.php CHANGED
@@ -248,7 +248,7 @@ class wfWAFWordPress extends wfWAF {
248
  * @param wfWAFBlockException $e
249
  * @param int $httpCode
250
  */
251
- public function blockAction($e, $httpCode = 403, $redirect = false) {
252
  if ($this->isInLearningMode() && !$e->getRequest()->getMetadata('finalAction')) {
253
  register_shutdown_function(array(
254
  $this, 'whitelistFailedRulesIfNot404',
@@ -260,6 +260,7 @@ class wfWAFWordPress extends wfWAF {
260
  if (empty($failedRules)) {
261
  $finalAction = $e->getRequest()->getMetadata('finalAction');
262
  if (is_array($finalAction)) {
 
263
  $finalAction = $finalAction['action'];
264
  if ($finalAction == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY_REDIR) {
265
  $redirect = wfWAFIPBlocksController::currentController()->countryRedirURL();
@@ -278,11 +279,15 @@ class wfWAFWordPress extends wfWAF {
278
  else if (is_string($finalAction) && strlen($finalAction) > 0) {
279
  wfWAF::getInstance()->getRequest()->setMetadata(array_merge(wfWAF::getInstance()->getRequest()->getMetadata(), array('503Reason' => $finalAction, '503Time' => 3600)));
280
  $httpCode = 503;
 
 
 
 
281
  }
282
  }
283
  }
284
 
285
- parent::blockAction($e, $httpCode, $redirect);
286
  }
287
  }
288
 
248
  * @param wfWAFBlockException $e
249
  * @param int $httpCode
250
  */
251
+ public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) {
252
  if ($this->isInLearningMode() && !$e->getRequest()->getMetadata('finalAction')) {
253
  register_shutdown_function(array(
254
  $this, 'whitelistFailedRulesIfNot404',
260
  if (empty($failedRules)) {
261
  $finalAction = $e->getRequest()->getMetadata('finalAction');
262
  if (is_array($finalAction)) {
263
+ $isLockedOut = isset($finalAction['lockout']) && $finalAction['lockout'];
264
  $finalAction = $finalAction['action'];
265
  if ($finalAction == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY_REDIR) {
266
  $redirect = wfWAFIPBlocksController::currentController()->countryRedirURL();
279
  else if (is_string($finalAction) && strlen($finalAction) > 0) {
280
  wfWAF::getInstance()->getRequest()->setMetadata(array_merge(wfWAF::getInstance()->getRequest()->getMetadata(), array('503Reason' => $finalAction, '503Time' => 3600)));
281
  $httpCode = 503;
282
+
283
+ if ($isLockedOut) {
284
+ parent::blockAction($e, $httpCode, $redirect, '503-lockout'); //exits
285
+ }
286
  }
287
  }
288
  }
289
 
290
+ parent::blockAction($e, $httpCode, $redirect, $template);
291
  }
292
  }
293
 
waf/wfWAFGeoIP.php CHANGED
@@ -20,55 +20,54 @@
20
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
  */
22
  if(! class_exists('wfWAFGeoIP')){
23
- define("GEOIP_COUNTRY_BEGIN", 16776960);
24
- define("GEOIP_STATE_BEGIN_REV0", 16700000);
25
- define("GEOIP_STATE_BEGIN_REV1", 16000000);
26
- define("GEOIP_STANDARD", 0);
27
- define("GEOIP_MEMORY_CACHE", 1);
28
- define("GEOIP_SHARED_MEMORY", 2);
29
- define("STRUCTURE_INFO_MAX_SIZE", 20);
30
- define("DATABASE_INFO_MAX_SIZE", 100);
31
- define("GEOIP_COUNTRY_EDITION", 106);
32
- define("GEOIP_PROXY_EDITION", 8);
33
- define("GEOIP_ASNUM_EDITION", 9);
34
- define("GEOIP_NETSPEED_EDITION", 10);
35
- define("GEOIP_REGION_EDITION_REV0", 112);
36
- define("GEOIP_REGION_EDITION_REV1", 3);
37
- define("GEOIP_CITY_EDITION_REV0", 111);
38
- define("GEOIP_CITY_EDITION_REV1", 2);
39
- define("GEOIP_ORG_EDITION", 110);
40
- define("GEOIP_ISP_EDITION", 4);
41
- define("SEGMENT_RECORD_LENGTH", 3);
42
- define("STANDARD_RECORD_LENGTH", 3);
43
- define("ORG_RECORD_LENGTH", 4);
44
- define("MAX_RECORD_LENGTH", 4);
45
- define("MAX_ORG_RECORD_LENGTH", 300);
46
- define("GEOIP_SHM_KEY", 0x4f415401);
47
- define("US_OFFSET", 1);
48
- define("CANADA_OFFSET", 677);
49
- define("WORLD_OFFSET", 1353);
50
- define("FIPS_RANGE", 360);
51
- define("GEOIP_UNKNOWN_SPEED", 0);
52
- define("GEOIP_DIALUP_SPEED", 1);
53
- define("GEOIP_CABLEDSL_SPEED", 2);
54
- define("GEOIP_CORPORATE_SPEED", 3);
55
- define("GEOIP_DOMAIN_EDITION", 11);
56
- define("GEOIP_COUNTRY_EDITION_V6", 12);
57
- define("GEOIP_LOCATIONA_EDITION", 13);
58
- define("GEOIP_ACCURACYRADIUS_EDITION", 14);
59
- define("GEOIP_CITYCOMBINED_EDITION", 15);
60
- define("GEOIP_CITY_EDITION_REV1_V6", 30);
61
- define("GEOIP_CITY_EDITION_REV0_V6",31);
62
- define("GEOIP_NETSPEED_EDITION_REV1",32);
63
- define("GEOIP_NETSPEED_EDITION_REV1_V6",33);
64
- define("GEOIP_USERTYPE_EDITION",28);
65
- define("GEOIP_USERTYPE_EDITION_V6",29);
66
- define("GEOIP_ASNUM_EDITION_V6",21);
67
- define("GEOIP_ISP_EDITION_V6",22);
68
- define("GEOIP_ORG_EDITION_V6",23);
69
- define("GEOIP_DOMAIN_EDITION_V6",24);
70
-
71
- define("CITYCOMBINED_FIXED_RECORD", 7 );
72
 
73
  class wfWAFGeoIP {
74
  var $flags;
@@ -247,63 +246,63 @@ if(! class_exists('wfWAFGeoIP')){
247
  }
248
  $s_array = fstat($fp);
249
  $size = $s_array['size'];
250
- if ($shmid = @shmop_open (GEOIP_SHM_KEY, "w", 0, 0)) {
251
  shmop_delete ($shmid);
252
  shmop_close ($shmid);
253
  }
254
- $shmid = shmop_open (GEOIP_SHM_KEY, "c", 0644, $size);
255
  shmop_write ($shmid, fread($fp, $size), 0);
256
  shmop_close ($shmid);
257
  }
258
  }
259
 
260
- if(! function_exists('')){
261
  function _setup_segments($gi){
262
- $gi->databaseType = GEOIP_COUNTRY_EDITION;
263
- $gi->record_length = STANDARD_RECORD_LENGTH;
264
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
265
  $offset = @shmop_size ($gi->shmid) - 3;
266
- for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
267
  $delim = @shmop_read ($gi->shmid, $offset, 3);
268
  $offset += 3;
269
  if ($delim == (chr(255).chr(255).chr(255))) {
270
  $gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1));
271
  $offset++;
272
 
273
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
274
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
275
- } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
276
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
277
- } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)||
278
- ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
279
- || ($gi->databaseType == GEOIP_ORG_EDITION)
280
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
281
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
282
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
283
- || ($gi->databaseType == GEOIP_ISP_EDITION)
284
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
285
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION)
286
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
287
- || ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
288
- || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
289
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
290
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
291
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
292
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
293
- || ($gi->databaseType == GEOIP_ASNUM_EDITION)
294
- || ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
295
  $gi->databaseSegments = 0;
296
- $buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH);
297
- for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
298
  $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
299
  }
300
- if (($gi->databaseType == GEOIP_ORG_EDITION)
301
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
302
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
303
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
304
- || ($gi->databaseType == GEOIP_ISP_EDITION)
305
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)) {
306
- $gi->record_length = ORG_RECORD_LENGTH;
307
  }
308
  }
309
  break;
@@ -311,56 +310,56 @@ if(! class_exists('wfWAFGeoIP')){
311
  $offset -= 4;
312
  }
313
  }
314
- if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
315
- ($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
316
- ($gi->databaseType == GEOIP_PROXY_EDITION)||
317
- ($gi->databaseType == GEOIP_NETSPEED_EDITION)){
318
- $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
319
  }
320
  } else {
321
  $filepos = ftell($gi->filehandle);
322
  fseek($gi->filehandle, -3, SEEK_END);
323
- for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
324
  $delim = fread($gi->filehandle,3);
325
  if ($delim == (chr(255).chr(255).chr(255))){
326
  $gi->databaseType = ord(fread($gi->filehandle,1));
327
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
328
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
329
  }
330
- else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){
331
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
332
- } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)
333
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
334
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
335
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
336
- || ($gi->databaseType == GEOIP_ORG_EDITION)
337
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
338
- || ($gi->databaseType == GEOIP_ISP_EDITION)
339
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
340
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
341
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
342
- || ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
343
- || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
344
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
345
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
346
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
347
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
348
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION)
349
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
350
- || ($gi->databaseType == GEOIP_ASNUM_EDITION)
351
- || ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)){
352
  $gi->databaseSegments = 0;
353
- $buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH);
354
- for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){
355
  $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
356
  }
357
- if ( ( $gi->databaseType == GEOIP_ORG_EDITION )
358
- || ( $gi->databaseType == GEOIP_DOMAIN_EDITION )
359
- || ( $gi->databaseType == GEOIP_ISP_EDITION )
360
- || ( $gi->databaseType == GEOIP_ORG_EDITION_V6 )
361
- || ( $gi->databaseType == GEOIP_DOMAIN_EDITION_V6 )
362
- || ( $gi->databaseType == GEOIP_ISP_EDITION_V6 )) {
363
- $gi->record_length = ORG_RECORD_LENGTH;
364
  }
365
  }
366
  break;
@@ -368,11 +367,11 @@ if(! class_exists('wfWAFGeoIP')){
368
  fseek($gi->filehandle, -4, SEEK_CUR);
369
  }
370
  }
371
- if (($gi->databaseType == GEOIP_COUNTRY_EDITION)||
372
- ($gi->databaseType == GEOIP_COUNTRY_EDITION_V6)||
373
- ($gi->databaseType == GEOIP_PROXY_EDITION)||
374
- ($gi->databaseType == GEOIP_NETSPEED_EDITION)){
375
- $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
376
  }
377
  fseek($gi->filehandle,$filepos,SEEK_SET);
378
  }
@@ -384,11 +383,11 @@ if(! class_exists('wfWAFGeoIP')){
384
  function geoip_open($filename, $flags) {
385
  $gi = new wfWAFGeoIP;
386
  $gi->flags = $flags;
387
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
388
- $gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0);
389
  } else {
390
  $gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" );
391
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
392
  $s_array = fstat($gi->filehandle);
393
  $gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
394
  }
@@ -401,7 +400,7 @@ if(! class_exists('wfWAFGeoIP')){
401
 
402
  if(! function_exists('geoip_close')){
403
  function geoip_close($gi) {
404
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
405
  return true;
406
  }
407
 
@@ -476,14 +475,14 @@ if(! class_exists('wfWAFGeoIP')){
476
  if(! function_exists('geoip_country_id_by_addr_v6')){
477
  function geoip_country_id_by_addr_v6($gi, $addr) {
478
  $ipnum = wfWAFUtils::inet_pton($addr);
479
- return _geoip_seek_country_v6($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
480
  }
481
  }
482
 
483
  if(! function_exists('geoip_country_id_by_addr')){
484
  function geoip_country_id_by_addr($gi, $addr) {
485
  $ipnum = ip2long($addr);
486
- return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
487
  }
488
  }
489
 
@@ -499,7 +498,7 @@ if(! class_exists('wfWAFGeoIP')){
499
 
500
  if(! function_exists('geoip_country_code_by_addr')){
501
  function geoip_country_code_by_addr($gi, $addr) {
502
- if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
503
  $record = geoip_record_by_addr($gi,$addr);
504
  if ( $record !== false ) {
505
  return $record->country_code;
@@ -526,7 +525,7 @@ if(! class_exists('wfWAFGeoIP')){
526
 
527
  if(! function_exists('geoip_country_name_by_addr')){
528
  function geoip_country_name_by_addr($gi, $addr) {
529
- if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
530
  $record = geoip_record_by_addr($gi,$addr);
531
  return $record->country_name;
532
  } else {
@@ -549,7 +548,7 @@ if(! class_exists('wfWAFGeoIP')){
549
 
550
  $offset = 0;
551
  for ($depth = 127; $depth >= 0; --$depth) {
552
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
553
  // workaround php's broken substr, strpos, etc handling with
554
  // mbstring.func_overload and mbstring.internal_encoding
555
  $enc = mb_internal_encoding();
@@ -560,7 +559,7 @@ if(! class_exists('wfWAFGeoIP')){
560
  2 * $gi->record_length);
561
 
562
  mb_internal_encoding($enc);
563
- } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
564
  $buf = @shmop_read ($gi->shmid,
565
  2 * $gi->record_length * $offset,
566
  2 * $gi->record_length );
@@ -600,7 +599,7 @@ if(! class_exists('wfWAFGeoIP')){
600
  function _geoip_seek_country($gi, $ipnum) {
601
  $offset = 0;
602
  for ($depth = 31; $depth >= 0; --$depth) {
603
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
604
  // workaround php's broken substr, strpos, etc handling with
605
  // mbstring.func_overload and mbstring.internal_encoding
606
  $enc = mb_internal_encoding();
@@ -611,7 +610,7 @@ if(! class_exists('wfWAFGeoIP')){
611
  2 * $gi->record_length);
612
 
613
  mb_internal_encoding($enc);
614
- } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
615
  $buf = @shmop_read ($gi->shmid,
616
  2 * $gi->record_length * $offset,
617
  2 * $gi->record_length );
@@ -646,11 +645,11 @@ if(! class_exists('wfWAFGeoIP')){
646
  if(! function_exists('_common_get_org')){
647
  function _common_get_org($gi, $seek_org){
648
  $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
649
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
650
- $org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH);
651
  } else {
652
  fseek($gi->filehandle, $record_pointer, SEEK_SET);
653
- $org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH);
654
  }
655
  // workaround php's broken substr, strpos, etc handling with
656
  // mbstring.func_overload and mbstring.internal_encoding
@@ -710,8 +709,8 @@ if(! class_exists('wfWAFGeoIP')){
710
 
711
  if(! function_exists('_get_region')){
712
  function _get_region($gi,$ipnum){
713
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){
714
- $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0;
715
  if ($seek_region >= 1000){
716
  $country_code = "US";
717
  $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);
@@ -720,20 +719,20 @@ if(! class_exists('wfWAFGeoIP')){
720
  $region = "";
721
  }
722
  return array ($country_code,$region);
723
- } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
724
- $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1;
725
  //print $seek_region;
726
- if ($seek_region < US_OFFSET){
727
  $country_code = "";
728
  $region = "";
729
- } else if ($seek_region < CANADA_OFFSET) {
730
  $country_code = "US";
731
- $region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65);
732
- } else if ($seek_region < WORLD_OFFSET) {
733
  $country_code = "CA";
734
- $region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65);
735
  } else {
736
- $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE];
737
  $region = "";
738
  }
739
  return array ($country_code,$region);
20
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
  */
22
  if(! class_exists('wfWAFGeoIP')){
23
+ if (!defined("WF_GEOIP_COUNTRY_BEGIN")) { define("WF_GEOIP_COUNTRY_BEGIN", 16776960); }
24
+ if (!defined("WF_GEOIP_STATE_BEGIN_REV0")) { define("WF_GEOIP_STATE_BEGIN_REV0", 16700000); }
25
+ if (!defined("WF_GEOIP_STATE_BEGIN_REV1")) { define("WF_GEOIP_STATE_BEGIN_REV1", 16000000); }
26
+ if (!defined("WF_GEOIP_STANDARD")) { define("WF_GEOIP_STANDARD", 0); }
27
+ if (!defined("WF_GEOIP_MEMORY_CACHE")) { define("WF_GEOIP_MEMORY_CACHE", 1); }
28
+ if (!defined("WF_GEOIP_SHARED_MEMORY")) { define("WF_GEOIP_SHARED_MEMORY", 2); }
29
+ if (!defined("WF_STRUCTURE_INFO_MAX_SIZE")) { define("WF_STRUCTURE_INFO_MAX_SIZE", 20); }
30
+ if (!defined("WF_DATABASE_INFO_MAX_SIZE")) { define("WF_DATABASE_INFO_MAX_SIZE", 100); }
31
+ if (!defined("WF_GEOIP_COUNTRY_EDITION")) { define("WF_GEOIP_COUNTRY_EDITION", 106); }
32
+ if (!defined("WF_GEOIP_PROXY_EDITION")) { define("WF_GEOIP_PROXY_EDITION", 8); }
33
+ if (!defined("WF_GEOIP_ASNUM_EDITION")) { define("WF_GEOIP_ASNUM_EDITION", 9); }
34
+ if (!defined("WF_GEOIP_NETSPEED_EDITION")) { define("WF_GEOIP_NETSPEED_EDITION", 10); }
35
+ if (!defined("WF_GEOIP_REGION_EDITION_REV0")) { define("WF_GEOIP_REGION_EDITION_REV0", 112); }
36
+ if (!defined("WF_GEOIP_REGION_EDITION_REV1")) { define("WF_GEOIP_REGION_EDITION_REV1", 3); }
37
+ if (!defined("WF_GEOIP_CITY_EDITION_REV0")) { define("WF_GEOIP_CITY_EDITION_REV0", 111); }
38
+ if (!defined("WF_GEOIP_CITY_EDITION_REV1")) { define("WF_GEOIP_CITY_EDITION_REV1", 2); }
39
+ if (!defined("WF_GEOIP_ORG_EDITION")) { define("WF_GEOIP_ORG_EDITION", 110); }
40
+ if (!defined("WF_GEOIP_ISP_EDITION")) { define("WF_GEOIP_ISP_EDITION", 4); }
41
+ if (!defined("WF_SEGMENT_RECORD_LENGTH")) { define("WF_SEGMENT_RECORD_LENGTH", 3); }
42
+ if (!defined("WF_STANDARD_RECORD_LENGTH")) { define("WF_STANDARD_RECORD_LENGTH", 3); }
43
+ if (!defined("WF_ORG_RECORD_LENGTH")) { define("WF_ORG_RECORD_LENGTH", 4); }
44
+ if (!defined("WF_MAX_RECORD_LENGTH")) { define("WF_MAX_RECORD_LENGTH", 4); }
45
+ if (!defined("WF_MAX_ORG_RECORD_LENGTH")) { define("WF_MAX_ORG_RECORD_LENGTH", 300); }
46
+ if (!defined("WF_GEOIP_SHM_KEY")) { define("WF_GEOIP_SHM_KEY", 0x4f415401); }
47
+ if (!defined("WF_US_OFFSET")) { define("WF_US_OFFSET", 1); }
48
+ if (!defined("WF_CANADA_OFFSET")) { define("WF_CANADA_OFFSET", 677); }
49
+ if (!defined("WF_WORLD_OFFSET")) { define("WF_WORLD_OFFSET", 1353); }
50
+ if (!defined("WF_FIPS_RANGE")) { define("WF_FIPS_RANGE", 360); }
51
+ if (!defined("WF_GEOIP_UNKNOWN_SPEED")) { define("WF_GEOIP_UNKNOWN_SPEED", 0); }
52
+ if (!defined("WF_GEOIP_DIALUP_SPEED")) { define("WF_GEOIP_DIALUP_SPEED", 1); }
53
+ if (!defined("WF_GEOIP_CABLEDSL_SPEED")) { define("WF_GEOIP_CABLEDSL_SPEED", 2); }
54
+ if (!defined("WF_GEOIP_CORPORATE_SPEED")) { define("WF_GEOIP_CORPORATE_SPEED", 3); }
55
+ if (!defined("WF_GEOIP_DOMAIN_EDITION")) { define("WF_GEOIP_DOMAIN_EDITION", 11); }
56
+ if (!defined("WF_GEOIP_COUNTRY_EDITION_V6")) { define("WF_GEOIP_COUNTRY_EDITION_V6", 12); }
57
+ if (!defined("WF_GEOIP_LOCATIONA_EDITION")) { define("WF_GEOIP_LOCATIONA_EDITION", 13); }
58
+ if (!defined("WF_GEOIP_ACCURACYRADIUS_EDITION")) { define("WF_GEOIP_ACCURACYRADIUS_EDITION", 14); }
59
+ if (!defined("WF_GEOIP_CITYCOMBINED_EDITION")) { define("WF_GEOIP_CITYCOMBINED_EDITION", 15); }
60
+ if (!defined("WF_GEOIP_CITY_EDITION_REV1_V6")) { define("WF_GEOIP_CITY_EDITION_REV1_V6", 30); }
61
+ if (!defined("WF_GEOIP_CITY_EDITION_REV0_V6")) { define("WF_GEOIP_CITY_EDITION_REV0_V6",31); }
62
+ if (!defined("WF_GEOIP_NETSPEED_EDITION_REV1")) { define("WF_GEOIP_NETSPEED_EDITION_REV1",32); }
63
+ if (!defined("WF_GEOIP_NETSPEED_EDITION_REV1_V6")) { define("WF_GEOIP_NETSPEED_EDITION_REV1_V6",33); }
64
+ if (!defined("WF_GEOIP_USERTYPE_EDITION")) { define("WF_GEOIP_USERTYPE_EDITION",28); }
65
+ if (!defined("WF_GEOIP_USERTYPE_EDITION_V6")) { define("WF_GEOIP_USERTYPE_EDITION_V6",29); }
66
+ if (!defined("WF_GEOIP_ASNUM_EDITION_V6")) { define("WF_GEOIP_ASNUM_EDITION_V6",21); }
67
+ if (!defined("WF_GEOIP_ISP_EDITION_V6")) { define("WF_GEOIP_ISP_EDITION_V6",22); }
68
+ if (!defined("WF_GEOIP_ORG_EDITION_V6")) { define("WF_GEOIP_ORG_EDITION_V6",23); }
69
+ if (!defined("WF_GEOIP_DOMAIN_EDITION_V6")) { define("WF_GEOIP_DOMAIN_EDITION_V6",24); }
70
+ if (!defined("WF_CITYCOMBINED_FIXED_RECORD")) { define("WF_CITYCOMBINED_FIXED_RECORD", 7); }
 
71
 
72
  class wfWAFGeoIP {
73
  var $flags;
246
  }
247
  $s_array = fstat($fp);
248
  $size = $s_array['size'];
249
+ if ($shmid = @shmop_open (WF_GEOIP_SHM_KEY, "w", 0, 0)) {
250
  shmop_delete ($shmid);
251
  shmop_close ($shmid);
252
  }
253
+ $shmid = shmop_open (WF_GEOIP_SHM_KEY, "c", 0644, $size);
254
  shmop_write ($shmid, fread($fp, $size), 0);
255
  shmop_close ($shmid);
256
  }
257
  }
258
 
259
+ if(! function_exists('_setup_segments')){
260
  function _setup_segments($gi){
261
+ $gi->databaseType = WF_GEOIP_COUNTRY_EDITION;
262
+ $gi->record_length = WF_STANDARD_RECORD_LENGTH;
263
+ if ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
264
  $offset = @shmop_size ($gi->shmid) - 3;
265
+ for ($i = 0; $i < WF_STRUCTURE_INFO_MAX_SIZE; $i++) {
266
  $delim = @shmop_read ($gi->shmid, $offset, 3);
267
  $offset += 3;
268
  if ($delim == (chr(255).chr(255).chr(255))) {
269
  $gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1));
270
  $offset++;
271
 
272
+ if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV0){
273
+ $gi->databaseSegments = WF_GEOIP_STATE_BEGIN_REV0;
274
+ } else if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV1){
275
+ $gi->databaseSegments = WF_GEOIP_STATE_BEGIN_REV1;
276
+ } else if (($gi->databaseType == WF_GEOIP_CITY_EDITION_REV0)||
277
+ ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1)
278
+ || ($gi->databaseType == WF_GEOIP_ORG_EDITION)
279
+ || ($gi->databaseType == WF_GEOIP_ORG_EDITION_V6)
280
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION)
281
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION_V6)
282
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION)
283
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION_V6)
284
+ || ($gi->databaseType == WF_GEOIP_USERTYPE_EDITION)
285
+ || ($gi->databaseType == WF_GEOIP_USERTYPE_EDITION_V6)
286
+ || ($gi->databaseType == WF_GEOIP_LOCATIONA_EDITION)
287
+ || ($gi->databaseType == WF_GEOIP_ACCURACYRADIUS_EDITION)
288
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV0_V6)
289
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1_V6)
290
+ || ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION_REV1)
291
+ || ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION_REV1_V6)
292
+ || ($gi->databaseType == WF_GEOIP_ASNUM_EDITION)
293
+ || ($gi->databaseType == WF_GEOIP_ASNUM_EDITION_V6)){
294
  $gi->databaseSegments = 0;
295
+ $buf = @shmop_read ($gi->shmid, $offset, WF_SEGMENT_RECORD_LENGTH);
296
+ for ($j = 0;$j < WF_SEGMENT_RECORD_LENGTH;$j++){
297
  $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
298
  }
299
+ if (($gi->databaseType == WF_GEOIP_ORG_EDITION)
300
+ || ($gi->databaseType == WF_GEOIP_ORG_EDITION_V6)
301
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION)
302
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION_V6)
303
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION)
304
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION_V6)) {
305
+ $gi->record_length = WF_ORG_RECORD_LENGTH;
306
  }
307
  }
308
  break;
310
  $offset -= 4;
311
  }
312
  }
313
+ if (($gi->databaseType == WF_GEOIP_COUNTRY_EDITION)||
314
+ ($gi->databaseType == WF_GEOIP_COUNTRY_EDITION_V6)||
315
+ ($gi->databaseType == WF_GEOIP_PROXY_EDITION)||
316
+ ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION)){
317
+ $gi->databaseSegments = WF_GEOIP_COUNTRY_BEGIN;
318
  }
319
  } else {
320
  $filepos = ftell($gi->filehandle);
321
  fseek($gi->filehandle, -3, SEEK_END);
322
+ for ($i = 0; $i < WF_STRUCTURE_INFO_MAX_SIZE; $i++) {
323
  $delim = fread($gi->filehandle,3);
324
  if ($delim == (chr(255).chr(255).chr(255))){
325
  $gi->databaseType = ord(fread($gi->filehandle,1));
326
+ if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV0){
327
+ $gi->databaseSegments = WF_GEOIP_STATE_BEGIN_REV0;
328
  }
329
+ else if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV1){
330
+ $gi->databaseSegments = WF_GEOIP_STATE_BEGIN_REV1;
331
+ } else if (($gi->databaseType == WF_GEOIP_CITY_EDITION_REV0)
332
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1)
333
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV0_V6)
334
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1_V6)
335
+ || ($gi->databaseType == WF_GEOIP_ORG_EDITION)
336
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION)
337
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION)
338
+ || ($gi->databaseType == WF_GEOIP_ORG_EDITION_V6)
339
+ || ($gi->databaseType == WF_GEOIP_DOMAIN_EDITION_V6)
340
+ || ($gi->databaseType == WF_GEOIP_ISP_EDITION_V6)
341
+ || ($gi->databaseType == WF_GEOIP_LOCATIONA_EDITION)
342
+ || ($gi->databaseType == WF_GEOIP_ACCURACYRADIUS_EDITION)
343
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV0_V6)
344
+ || ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1_V6)
345
+ || ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION_REV1)
346
+ || ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION_REV1_V6)
347
+ || ($gi->databaseType == WF_GEOIP_USERTYPE_EDITION)
348
+ || ($gi->databaseType == WF_GEOIP_USERTYPE_EDITION_V6)
349
+ || ($gi->databaseType == WF_GEOIP_ASNUM_EDITION)
350
+ || ($gi->databaseType == WF_GEOIP_ASNUM_EDITION_V6)){
351
  $gi->databaseSegments = 0;
352
+ $buf = fread($gi->filehandle,WF_SEGMENT_RECORD_LENGTH);
353
+ for ($j = 0;$j < WF_SEGMENT_RECORD_LENGTH;$j++){
354
  $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
355
  }
356
+ if ( ( $gi->databaseType == WF_GEOIP_ORG_EDITION )
357
+ || ( $gi->databaseType == WF_GEOIP_DOMAIN_EDITION )
358
+ || ( $gi->databaseType == WF_GEOIP_ISP_EDITION )
359
+ || ( $gi->databaseType == WF_GEOIP_ORG_EDITION_V6 )
360
+ || ( $gi->databaseType == WF_GEOIP_DOMAIN_EDITION_V6 )
361
+ || ( $gi->databaseType == WF_GEOIP_ISP_EDITION_V6 )) {
362
+ $gi->record_length = WF_ORG_RECORD_LENGTH;
363
  }
364
  }
365
  break;
367
  fseek($gi->filehandle, -4, SEEK_CUR);
368
  }
369
  }
370
+ if (($gi->databaseType == WF_GEOIP_COUNTRY_EDITION)||
371
+ ($gi->databaseType == WF_GEOIP_COUNTRY_EDITION_V6)||
372
+ ($gi->databaseType == WF_GEOIP_PROXY_EDITION)||
373
+ ($gi->databaseType == WF_GEOIP_NETSPEED_EDITION)){
374
+ $gi->databaseSegments = WF_GEOIP_COUNTRY_BEGIN;
375
  }
376
  fseek($gi->filehandle,$filepos,SEEK_SET);
377
  }
383
  function geoip_open($filename, $flags) {
384
  $gi = new wfWAFGeoIP;
385
  $gi->flags = $flags;
386
+ if ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
387
+ $gi->shmid = @shmop_open (WF_GEOIP_SHM_KEY, "a", 0, 0);
388
  } else {
389
  $gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" );
390
+ if ($gi->flags & WF_GEOIP_MEMORY_CACHE) {
391
  $s_array = fstat($gi->filehandle);
392
  $gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
393
  }
400
 
401
  if(! function_exists('geoip_close')){
402
  function geoip_close($gi) {
403
+ if ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
404
  return true;
405
  }
406
 
475
  if(! function_exists('geoip_country_id_by_addr_v6')){
476
  function geoip_country_id_by_addr_v6($gi, $addr) {
477
  $ipnum = wfWAFUtils::inet_pton($addr);
478
+ return _geoip_seek_country_v6($gi, $ipnum) - WF_GEOIP_COUNTRY_BEGIN;
479
  }
480
  }
481
 
482
  if(! function_exists('geoip_country_id_by_addr')){
483
  function geoip_country_id_by_addr($gi, $addr) {
484
  $ipnum = ip2long($addr);
485
+ return _geoip_seek_country($gi, $ipnum) - WF_GEOIP_COUNTRY_BEGIN;
486
  }
487
  }
488
 
498
 
499
  if(! function_exists('geoip_country_code_by_addr')){
500
  function geoip_country_code_by_addr($gi, $addr) {
501
+ if ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1) {
502
  $record = geoip_record_by_addr($gi,$addr);
503
  if ( $record !== false ) {
504
  return $record->country_code;
525
 
526
  if(! function_exists('geoip_country_name_by_addr')){
527
  function geoip_country_name_by_addr($gi, $addr) {
528
+ if ($gi->databaseType == WF_GEOIP_CITY_EDITION_REV1) {
529
  $record = geoip_record_by_addr($gi,$addr);
530
  return $record->country_name;
531
  } else {
548
 
549
  $offset = 0;
550
  for ($depth = 127; $depth >= 0; --$depth) {
551
+ if ($gi->flags & WF_GEOIP_MEMORY_CACHE) {
552
  // workaround php's broken substr, strpos, etc handling with
553
  // mbstring.func_overload and mbstring.internal_encoding
554
  $enc = mb_internal_encoding();
559
  2 * $gi->record_length);
560
 
561
  mb_internal_encoding($enc);
562
+ } elseif ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
563
  $buf = @shmop_read ($gi->shmid,
564
  2 * $gi->record_length * $offset,
565
  2 * $gi->record_length );
599
  function _geoip_seek_country($gi, $ipnum) {
600
  $offset = 0;
601
  for ($depth = 31; $depth >= 0; --$depth) {
602
+ if ($gi->flags & WF_GEOIP_MEMORY_CACHE) {
603
  // workaround php's broken substr, strpos, etc handling with
604
  // mbstring.func_overload and mbstring.internal_encoding
605
  $enc = mb_internal_encoding();
610
  2 * $gi->record_length);
611
 
612
  mb_internal_encoding($enc);
613
+ } elseif ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
614
  $buf = @shmop_read ($gi->shmid,
615
  2 * $gi->record_length * $offset,
616
  2 * $gi->record_length );
645
  if(! function_exists('_common_get_org')){
646
  function _common_get_org($gi, $seek_org){
647
  $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
648
+ if ($gi->flags & WF_GEOIP_SHARED_MEMORY) {
649
+ $org_buf = @shmop_read ($gi->shmid, $record_pointer, WF_MAX_ORG_RECORD_LENGTH);
650
  } else {
651
  fseek($gi->filehandle, $record_pointer, SEEK_SET);
652
+ $org_buf = fread($gi->filehandle,WF_MAX_ORG_RECORD_LENGTH);
653
  }
654
  // workaround php's broken substr, strpos, etc handling with
655
  // mbstring.func_overload and mbstring.internal_encoding
709
 
710
  if(! function_exists('_get_region')){
711
  function _get_region($gi,$ipnum){
712
+ if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV0){
713
+ $seek_region = _geoip_seek_country($gi,$ipnum) - WF_GEOIP_STATE_BEGIN_REV0;
714
  if ($seek_region >= 1000){
715
  $country_code = "US";
716
  $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65);
719
  $region = "";
720
  }
721
  return array ($country_code,$region);
722
+ } else if ($gi->databaseType == WF_GEOIP_REGION_EDITION_REV1) {
723
+ $seek_region = _geoip_seek_country($gi,$ipnum) - WF_GEOIP_STATE_BEGIN_REV1;
724
  //print $seek_region;
725
+ if ($seek_region < WF_US_OFFSET){
726
  $country_code = "";
727
  $region = "";
728
+ } else if ($seek_region < WF_CANADA_OFFSET) {
729
  $country_code = "US";
730
+ $region = chr(($seek_region - WF_US_OFFSET)/26 + 65) . chr(($seek_region - WF_US_OFFSET)%26 + 65);
731
+ } else if ($seek_region < WF_WORLD_OFFSET) {
732
  $country_code = "CA";
733
+ $region = chr(($seek_region - WF_CANADA_OFFSET)/26 + 65) . chr(($seek_region - WF_CANADA_OFFSET)%26 + 65);
734
  } else {
735
+ $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WF_WORLD_OFFSET) / WF_FIPS_RANGE];
736
  $region = "";
737
  }
738
  return array ($country_code,$region);
waf/wfWAFIPBlocksController.php CHANGED
@@ -73,6 +73,15 @@ class wfWAFIPBlocksController
73
  $b['IP'] = base64_encode($b['IP']);
74
  }
75
 
 
 
 
 
 
 
 
 
 
76
  // Save it
77
  try {
78
  $patternBlocksJSON = wfWAFUtils::json_encode($patternBlocks);
@@ -81,6 +90,8 @@ class wfWAFIPBlocksController
81
  wfWAF::getInstance()->getStorageEngine()->setConfig('countryBlocks', $countryBlocksJSON);
82
  $otherBlocksJSON = wfWAFUtils::json_encode($otherBlocks);
83
  wfWAF::getInstance()->getStorageEngine()->setConfig('otherBlocks', $otherBlocksJSON);
 
 
84
 
85
  wfWAF::getInstance()->getStorageEngine()->setConfig('advancedBlockingEnabled', wfConfig::get('firewallEnabled'));
86
  wfWAF::getInstance()->getStorageEngine()->setConfig('disableWAFIPBlocking', wfConfig::get('disableWAFIPBlocking'));
@@ -130,6 +141,7 @@ class wfWAFIPBlocksController
130
  $patternBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('patternBlocks');
131
  $countryBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('countryBlocks');
132
  $otherBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('otherBlocks');
 
133
  }
134
  catch (Exception $e) {
135
  // Do nothing
@@ -264,7 +276,7 @@ class wfWAFIPBlocksController
264
  $blockedTime = $otherBlocks['blockedTime'];
265
  $blocks = $otherBlocks['blocks'];
266
  $bareRequestURI = wfWAFUtils::extractBareURI($request->getURI());
267
- $isAuthRequest = (strpos($bareRequestURI, '/wp-login.php') !== false);
268
  foreach ($blocks as $b) {
269
  if (!$b['permanent'] && ($b['blockedTime'] + $blockedTime) < time()) {
270
  continue;
@@ -274,15 +286,39 @@ class wfWAFIPBlocksController
274
  continue;
275
  }
276
 
277
- if ($isAuthRequest) {
278
  return array('action' => self::WFWAF_BLOCK_WFSN);
279
  }
280
 
281
- return array('action' => (empty($b['reason']) ? '' : $b['reason']));
282
  }
283
  }
284
  // End Other Blocks
285
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
286
  return false;
287
  }
288
 
@@ -378,14 +414,12 @@ class wfWAFIPBlocksController
378
 
379
  protected function ip2Country($ip){
380
  $wordfenceLib = realpath(dirname(__FILE__) . '/../lib');
381
- if (!(function_exists('geoip_open') && function_exists('geoip_country_code_by_addr') && function_exists('geoip_country_code_by_addr_v6'))) {
382
- require_once(dirname(__FILE__) . '/wfWAFGeoIP.php');
383
- }
384
  if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
385
- $gi = geoip_open($wordfenceLib . "/GeoIPv6.dat", GEOIP_STANDARD);
386
  $country = geoip_country_code_by_addr_v6($gi, $ip);
387
  } else {
388
- $gi = geoip_open($wordfenceLib . "/GeoIP.dat", GEOIP_STANDARD);
389
  $country = geoip_country_code_by_addr($gi, $ip);
390
  }
391
  geoip_close($gi);
73
  $b['IP'] = base64_encode($b['IP']);
74
  }
75
 
76
+ //Lockouts
77
+ $lockoutSecs = wfConfig::get('loginSec_lockoutMins') * 60;
78
+ $lockouts = array('lockedOutTime' => $lockoutSecs);
79
+ $lockoutEntries = $db->querySelect("SELECT IP, blockedTime, reason FROM {$wpdb->base_prefix}wfLockedOut WHERE (blockedTime + %d) > UNIX_TIMESTAMP() ORDER BY blockedTime DESC, IP DESC", $lockoutSecs);
80
+ $lockouts['lockouts'] = (is_array($lockoutEntries) ? $lockoutEntries : array());
81
+ foreach ($lockouts['lockouts'] as &$l) {
82
+ $l['IP'] = base64_encode($l['IP']);
83
+ }
84
+
85
  // Save it
86
  try {
87
  $patternBlocksJSON = wfWAFUtils::json_encode($patternBlocks);
90
  wfWAF::getInstance()->getStorageEngine()->setConfig('countryBlocks', $countryBlocksJSON);
91
  $otherBlocksJSON = wfWAFUtils::json_encode($otherBlocks);
92
  wfWAF::getInstance()->getStorageEngine()->setConfig('otherBlocks', $otherBlocksJSON);
93
+ $lockoutsJSON = wfWAFUtils::json_encode($lockouts);
94
+ wfWAF::getInstance()->getStorageEngine()->setConfig('lockouts', $lockoutsJSON);
95
 
96
  wfWAF::getInstance()->getStorageEngine()->setConfig('advancedBlockingEnabled', wfConfig::get('firewallEnabled'));
97
  wfWAF::getInstance()->getStorageEngine()->setConfig('disableWAFIPBlocking', wfConfig::get('disableWAFIPBlocking'));
141
  $patternBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('patternBlocks');
142
  $countryBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('countryBlocks');
143
  $otherBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('otherBlocks');
144
+ $lockoutsJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('lockouts');
145
  }
146
  catch (Exception $e) {
147
  // Do nothing
276
  $blockedTime = $otherBlocks['blockedTime'];
277
  $blocks = $otherBlocks['blocks'];
278
  $bareRequestURI = wfWAFUtils::extractBareURI($request->getURI());
279
+ $isAuthRequest = (stripos($bareRequestURI, '/wp-login.php') !== false);
280
  foreach ($blocks as $b) {
281
  if (!$b['permanent'] && ($b['blockedTime'] + $blockedTime) < time()) {
282
  continue;
286
  continue;
287
  }
288
 
289
+ if ($isAuthRequest && isset($b['wfsn']) && $b['wfsn']) {
290
  return array('action' => self::WFWAF_BLOCK_WFSN);
291
  }
292
 
293
+ return array('action' => (empty($b['reason']) ? '' : $b['reason']), 'block' => true);
294
  }
295
  }
296
  // End Other Blocks
297
 
298
+ // Lockouts
299
+ $lockouts = @wfWAFUtils::json_decode($lockoutsJSON, true);
300
+ if (is_array($lockouts)) {
301
+ $lockedOutTime = $lockouts['lockedOutTime'];
302
+ $lockouts = $lockouts['lockouts'];
303
+ foreach ($lockouts as $l) {
304
+ if ($l['blockedTime'] + $lockedOutTime < time()) {
305
+ continue;
306
+ }
307
+
308
+ if (base64_decode($l['IP']) != $ipNum) {
309
+ continue;
310
+ }
311
+
312
+ $isAuthRequest = (stripos($bareRequestURI, '/wp-login.php') !== false) || (stripos($bareRequestURI, '/xmlrpc.php') !== false);
313
+ if (!$isAuthRequest) {
314
+ continue;
315
+ }
316
+
317
+ return array('action' => (empty($l['reason']) ? '' : $l['reason']), 'lockout' => true);
318
+ }
319
+ }
320
+ // End Lockouts
321
+
322
  return false;
323
  }
324
 
414
 
415
  protected function ip2Country($ip){
416
  $wordfenceLib = realpath(dirname(__FILE__) . '/../lib');
417
+ require_once(dirname(__FILE__) . '/wfWAFGeoIP.php');
 
 
418
  if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
419
+ $gi = geoip_open($wordfenceLib . "/GeoIPv6.dat", WF_GEOIP_STANDARD);
420
  $country = geoip_country_code_by_addr_v6($gi, $ip);
421
  } else {
422
+ $gi = geoip_open($wordfenceLib . "/GeoIP.dat", WF_GEOIP_STANDARD);
423
  $country = geoip_country_code_by_addr($gi, $ip);
424
  }
425
  geoip_close($gi);
wordfence.php CHANGED
@@ -4,14 +4,14 @@ Plugin Name: Wordfence Security
4
  Plugin URI: http://www.wordfence.com/
5
  Description: Wordfence Security - Anti-virus, Firewall and Malware Scan
6
  Author: Wordfence
7
- Version: 6.3.0
8
  Author URI: http://www.wordfence.com/
9
  Network: true
10
  */
11
  if(defined('WP_INSTALLING') && WP_INSTALLING){
12
  return;
13
  }
14
- define('WORDFENCE_VERSION', '6.3.0');
15
  define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
16
  basename(dirname(__FILE__)) . '/' . basename(__FILE__));
17
 
4
  Plugin URI: http://www.wordfence.com/
5
  Description: Wordfence Security - Anti-virus, Firewall and Malware Scan
6
  Author: Wordfence
7
+ Version: 6.3.1
8
  Author URI: http://www.wordfence.com/
9
  Network: true
10
  */
11
  if(defined('WP_INSTALLING') && WP_INSTALLING){
12
  return;
13
  }
14
+ define('WORDFENCE_VERSION', '6.3.1');
15
  define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
16
  basename(dirname(__FILE__)) . '/' . basename(__FILE__));
17