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 | 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 +1 -1
- css/wf-adminbar.css +1 -1
- js/admin.js +30 -27
- lib/dashboard/widget_countries.php +2 -2
- lib/dashboard/widget_ips.php +66 -5
- lib/dashboard/widget_logins.php +53 -1
- lib/menu_activity.php +12 -12
- lib/menu_blocking.php +34 -0
- lib/{menu_firewall_advancedBlocking.php → menu_blocking_advancedBlocking.php} +1 -1
- lib/{menu_firewall_blockedIPs.php → menu_blocking_blockedIPs.php} +13 -9
- lib/{menu_firewall_countryBlocking.php → menu_blocking_countryBlocking.php} +1 -1
- lib/menu_firewall.php +1 -22
- lib/menu_firewall_waf.php +38 -36
- lib/menu_options.php +3 -3
- lib/menu_scan_scan.php +1 -3
- lib/menu_tools_diagnostic.php +7 -7
- lib/menu_tools_passwd.php +2 -2
- lib/menu_tools_twoFactor.php +8 -3
- lib/menu_tools_whois.php +1 -1
- lib/pageTitle.php +1 -1
- lib/wfAPI.php +12 -11
- lib/wfActivityReport.php +17 -11
- lib/wfDashboard.php +20 -10
- lib/wfGeoIP.php +707 -708
- lib/wfScanEngine.php +37 -15
- lib/wfUtils.php +60 -14
- lib/wordfenceClass.php +168 -32
- readme.txt +47 -43
- vendor/wordfence/wf-waf/src/lib/waf.php +8 -4
- vendor/wordfence/wf-waf/src/views/503-lockout.php +34 -0
- waf/bootstrap.php +7 -2
- waf/wfWAFGeoIP.php +155 -156
- waf/wfWAFIPBlocksController.php +42 -8
- wordfence.php +2 -2
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('
|
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('
|
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('
|
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('
|
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="
|
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="
|
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
|
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 + "');\" /> <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 + "');\" /> <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="
|
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();" /> <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=
|
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=
|
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();" /> ' +
|
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();" /> <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=\"
|
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=\"
|
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="
|
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★ 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 + "');\" /> <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 + "');\" /> <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();" /> <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();" /> ' +
|
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();" /> <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
|
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
|
|
|
|
|
|
|
|
|
|
|
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(
|
|
|
|
|
|
|
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(
|
|
|
|
|
|
|
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(
|
|
|
|
|
|
|
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="
|
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="
|
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="
|
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="
|
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="
|
350 |
data-bind="click: $root.unblockIP">
|
351 |
Unblock this IP
|
352 |
</a>
|
353 |
</span>
|
354 |
<span data-bind="if: rangeBlocked()">
|
355 |
-
<a href="#" class="
|
356 |
data-bind="click: $root.unblockNetwork">Unblock this range
|
357 |
</a>
|
358 |
</span>
|
359 |
<span data-bind="if: !blocked() && !rangeBlocked()">
|
360 |
-
<a href="#" class="
|
361 |
data-bind="click: $root.blockIP">
|
362 |
Block this IP
|
363 |
</a>
|
364 |
</span>
|
365 |
-
<a class="
|
366 |
data-bind="attr: { href: 'admin.php?page=WordfenceTools&whoisval=' + IP() + '&wfnetworkblock=1#top#whois'}">
|
367 |
Block this network
|
368 |
</a>
|
369 |
-
<a class="
|
370 |
attr: { href: 'admin.php?page=WordfenceTools&whoisval=' + IP() + '#top#whois' }"
|
371 |
target="_blank"></a>
|
372 |
-
<a class="
|
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="
|
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="
|
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="
|
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 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
|
|
|
|
|
|
|
|
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="
|
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="
|
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="
|
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="
|
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> | <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="
|
77 |
<td style="height: 24px;"><div class="wfAjax24"></div><span class="wfSavedMsg"> 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"> 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' => '
|
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
|
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 |
-
<
|
187 |
-
<strong>Add Whitelisted URL/Param:</strong
|
188 |
-
<
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
</
|
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="
|
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="
|
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="
|
402 |
-
<button type="button" class="
|
403 |
</span>
|
404 |
<span class="whitelist-edit" style="white-space: nowrap">
|
405 |
-
<button type="button" class="
|
406 |
-
<button type="button" class="
|
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="
|
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="
|
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="
|
425 |
</tr>
|
426 |
</table>
|
427 |
</div>
|
428 |
-
<input class="
|
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
|
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="
|
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
|
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="
|
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
|
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="
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
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()); }" /> <input type="button" name="whoisbutton" id="whoisbutton" class="
|
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()); }" /> <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 |
-
|
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 |
-
$
|
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' => $
|
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 |
-
$
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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 &$
|
122 |
-
$
|
123 |
}
|
124 |
$this->ips7d = (array) $activityReport->getTopIPsBlocked(100, 7);
|
125 |
-
foreach ($this->ips7d as &$
|
126 |
-
$
|
127 |
}
|
128 |
$this->ips30d = (array) $activityReport->getTopIPsBlocked(100, 30);
|
129 |
-
foreach ($this->ips30d as &$
|
130 |
-
$
|
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 &$
|
161 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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("
|
24 |
-
define("
|
25 |
-
define("
|
26 |
-
define("
|
27 |
-
define("
|
28 |
-
define("
|
29 |
-
define("
|
30 |
-
define("
|
31 |
-
define("
|
32 |
-
define("
|
33 |
-
define("
|
34 |
-
define("
|
35 |
-
define("
|
36 |
-
define("
|
37 |
-
define("
|
38 |
-
define("
|
39 |
-
define("
|
40 |
-
define("
|
41 |
-
define("
|
42 |
-
define("
|
43 |
-
define("
|
44 |
-
define("
|
45 |
-
define("
|
46 |
-
define("
|
47 |
-
define("
|
48 |
-
define("
|
49 |
-
define("
|
50 |
-
define("
|
51 |
-
define("
|
52 |
-
define("
|
53 |
-
define("
|
54 |
-
define("
|
55 |
-
define("
|
56 |
-
define("
|
57 |
-
define("
|
58 |
-
define("
|
59 |
-
define("
|
60 |
-
define("
|
61 |
-
define("
|
62 |
-
define("
|
63 |
-
define("
|
64 |
-
define("
|
65 |
-
define("
|
66 |
-
define("
|
67 |
-
define("
|
68 |
-
define("
|
69 |
-
define("
|
70 |
-
|
71 |
-
define("CITYCOMBINED_FIXED_RECORD", 7 );
|
72 |
|
73 |
class wfGeoIP {
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
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 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
);
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
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 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
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 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|| ($gi->databaseType == GEOIP_ISP_EDITION_V6)) {
|
306 |
-
$gi->record_length = ORG_RECORD_LENGTH;
|
307 |
}
|
308 |
-
|
309 |
-
|
310 |
-
|
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 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
384 |
-
|
385 |
-
|
386 |
-
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
}
|
400 |
-
|
401 |
-
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
}
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
|
423 |
}
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
|
433 |
}
|
434 |
-
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
|
443 |
}
|
444 |
-
|
445 |
-
|
446 |
-
|
447 |
-
|
448 |
-
|
449 |
-
|
450 |
-
|
451 |
-
|
452 |
-
|
453 |
}
|
454 |
-
|
455 |
-
|
456 |
-
|
457 |
-
|
458 |
-
|
459 |
-
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
}
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
-
|
473 |
}
|
474 |
-
|
475 |
-
|
476 |
-
|
477 |
-
|
478 |
-
|
479 |
-
|
480 |
}
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
|
485 |
-
|
486 |
-
|
487 |
}
|
488 |
-
|
489 |
-
|
490 |
-
|
491 |
-
|
492 |
-
|
493 |
-
|
494 |
-
|
495 |
-
|
496 |
-
|
497 |
}
|
498 |
-
|
499 |
-
|
500 |
-
|
501 |
-
|
502 |
-
|
503 |
-
|
504 |
-
|
505 |
-
|
506 |
-
|
507 |
-
|
508 |
-
|
509 |
-
|
510 |
-
|
511 |
-
|
512 |
-
|
513 |
-
|
514 |
}
|
515 |
-
|
516 |
-
|
517 |
-
|
518 |
-
|
519 |
-
|
520 |
-
|
521 |
-
|
522 |
-
|
523 |
-
|
524 |
}
|
525 |
-
|
526 |
-
|
527 |
-
|
528 |
-
|
529 |
-
|
530 |
-
|
531 |
-
|
532 |
-
|
533 |
-
|
534 |
-
|
535 |
-
|
536 |
-
|
537 |
-
|
538 |
-
|
539 |
}
|
540 |
-
|
541 |
-
|
542 |
-
|
543 |
-
|
544 |
-
|
545 |
-
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
550 |
-
|
551 |
-
|
552 |
-
|
553 |
-
|
554 |
-
|
555 |
-
|
556 |
-
|
557 |
-
|
558 |
-
|
559 |
-
|
560 |
-
|
561 |
-
|
562 |
-
|
563 |
-
|
564 |
-
|
565 |
-
|
566 |
-
|
567 |
-
|
568 |
-
|
569 |
-
|
570 |
-
|
571 |
-
|
572 |
-
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
577 |
-
|
578 |
-
|
579 |
-
|
580 |
-
|
581 |
-
|
582 |
-
|
583 |
-
|
584 |
-
|
585 |
-
|
586 |
-
|
587 |
-
|
588 |
-
|
589 |
-
|
590 |
-
|
591 |
-
|
592 |
-
|
593 |
-
|
594 |
-
|
595 |
-
|
596 |
}
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
|
605 |
-
|
606 |
-
|
607 |
-
|
608 |
-
|
609 |
-
|
610 |
-
|
611 |
-
|
612 |
-
|
613 |
-
|
614 |
-
|
615 |
-
|
616 |
-
|
617 |
-
|
618 |
-
|
619 |
-
|
620 |
-
|
621 |
-
|
622 |
-
|
623 |
-
|
624 |
-
|
625 |
-
|
626 |
-
|
627 |
-
|
628 |
-
|
629 |
-
|
630 |
-
|
631 |
-
|
632 |
-
|
633 |
-
|
634 |
-
|
635 |
-
|
636 |
-
|
637 |
-
|
638 |
-
|
639 |
-
|
640 |
-
|
641 |
-
|
642 |
-
|
643 |
}
|
644 |
-
|
645 |
-
|
646 |
-
|
647 |
-
|
648 |
-
|
649 |
-
|
650 |
-
|
651 |
-
|
652 |
-
|
653 |
-
|
654 |
-
|
655 |
-
|
656 |
-
|
657 |
-
|
658 |
-
|
659 |
-
|
660 |
-
|
661 |
-
|
662 |
}
|
663 |
-
|
664 |
-
|
665 |
-
|
666 |
-
|
667 |
-
|
668 |
-
|
669 |
-
|
670 |
-
|
671 |
-
|
672 |
}
|
673 |
-
|
674 |
-
|
675 |
-
|
676 |
-
|
677 |
-
|
678 |
-
|
679 |
-
|
680 |
-
|
681 |
-
|
682 |
}
|
683 |
-
|
684 |
-
|
685 |
-
|
686 |
-
|
687 |
-
|
688 |
-
|
689 |
-
|
690 |
-
|
691 |
-
|
692 |
}
|
693 |
-
|
694 |
-
|
695 |
-
|
696 |
-
|
697 |
-
|
698 |
-
|
699 |
-
|
700 |
-
|
701 |
-
|
702 |
}
|
703 |
-
|
704 |
-
|
705 |
-
|
706 |
-
|
707 |
-
|
708 |
}
|
709 |
-
|
710 |
-
|
711 |
-
|
712 |
-
|
713 |
-
|
714 |
-
|
715 |
-
|
716 |
-
|
717 |
-
|
718 |
-
|
719 |
-
|
720 |
-
|
721 |
-
|
722 |
-
|
723 |
-
|
724 |
-
|
725 |
-
|
726 |
-
|
727 |
-
|
728 |
-
|
729 |
-
|
730 |
-
|
731 |
-
|
732 |
-
|
733 |
-
|
734 |
-
|
735 |
-
|
736 |
-
|
737 |
-
|
738 |
-
|
739 |
-
|
740 |
-
|
741 |
}
|
742 |
-
|
743 |
-
|
744 |
-
|
745 |
-
|
746 |
-
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
751 |
}
|
752 |
-
|
753 |
-
|
754 |
-
|
755 |
-
|
756 |
-
|
757 |
-
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
-
|
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 |
-
$
|
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 |
-
|
|
|
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 |
-
$
|
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 |
-
|
1091 |
-
|
1092 |
-
}
|
1093 |
if (filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
|
1094 |
-
$gi = geoip_open(dirname(__FILE__) . "/GeoIPv6.dat",
|
1095 |
$country = geoip_country_code_by_addr_v6($gi, $IP);
|
1096 |
} else {
|
1097 |
-
$gi = geoip_open(dirname(__FILE__) . "/GeoIP.dat",
|
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 |
-
$
|
1503 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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' =>
|
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='
|
3556 |
-
<a style='display:none' id='wp-config-force-delete' class='
|
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="
|
4620 |
-
<a class="
|
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="
|
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> <a href="#" onclick="wordfenceExt.autoUpdateChoice(\'yes\'); return false;">Yes, enable auto-update.</a> | <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 |
-
$
|
|
|
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="
|
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='
|
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='
|
5009 |
-
<a class='
|
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="
|
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='
|
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 |
-
|
|
|
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 |
-
|
|
|
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="
|
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='
|
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' => $
|
6592 |
-
|
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($
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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: <a class="
|
6832 |
-
<a class="
|
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: <a class="
|
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> <a href="#" onclick="wordfenceExt.autoUpdateChoice(\'yes\'); return false;">Yes, enable auto-update.</a> | <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: <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: <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.
|
6 |
-
Stable tag: 6.3.
|
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
|
103 |
|
104 |
-
=
|
105 |
|
106 |
-
|
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 |
-
|
118 |
|
119 |
-
|
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 |
-
=
|
128 |
|
129 |
-
|
130 |
|
131 |
-
=
|
132 |
|
133 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
134 |
|
135 |
-
=
|
136 |
|
137 |
-
Wordfence Security is
|
138 |
|
139 |
-
=
|
140 |
|
141 |
-
Wordfence Security
|
142 |
|
143 |
-
=
|
144 |
|
145 |
-
|
146 |
|
147 |
-
=
|
148 |
|
149 |
-
|
150 |
|
151 |
-
=
|
152 |
|
153 |
-
|
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
|
158 |
|
159 |
== Screenshots ==
|
160 |
|
161 |
Secure your website with Wordfence.
|
162 |
|
163 |
-
1. The
|
164 |
-
2. The
|
165 |
-
3. The
|
166 |
-
4. The
|
167 |
-
5.
|
|
|
|
|
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(
|
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" /> <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("
|
24 |
-
define("
|
25 |
-
define("
|
26 |
-
define("
|
27 |
-
define("
|
28 |
-
define("
|
29 |
-
define("
|
30 |
-
define("
|
31 |
-
define("
|
32 |
-
define("
|
33 |
-
define("
|
34 |
-
define("
|
35 |
-
define("
|
36 |
-
define("
|
37 |
-
define("
|
38 |
-
define("
|
39 |
-
define("
|
40 |
-
define("
|
41 |
-
define("
|
42 |
-
define("
|
43 |
-
define("
|
44 |
-
define("
|
45 |
-
define("
|
46 |
-
define("
|
47 |
-
define("
|
48 |
-
define("
|
49 |
-
define("
|
50 |
-
define("
|
51 |
-
define("
|
52 |
-
define("
|
53 |
-
define("
|
54 |
-
define("
|
55 |
-
define("
|
56 |
-
define("
|
57 |
-
define("
|
58 |
-
define("
|
59 |
-
define("
|
60 |
-
define("
|
61 |
-
define("
|
62 |
-
define("
|
63 |
-
define("
|
64 |
-
define("
|
65 |
-
define("
|
66 |
-
define("
|
67 |
-
define("
|
68 |
-
define("
|
69 |
-
define("
|
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 (
|
251 |
shmop_delete ($shmid);
|
252 |
shmop_close ($shmid);
|
253 |
}
|
254 |
-
$shmid = shmop_open (
|
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 =
|
263 |
-
$gi->record_length =
|
264 |
-
if ($gi->flags &
|
265 |
$offset = @shmop_size ($gi->shmid) - 3;
|
266 |
-
for ($i = 0; $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 ==
|
274 |
-
$gi->databaseSegments =
|
275 |
-
} else if ($gi->databaseType ==
|
276 |
-
$gi->databaseSegments =
|
277 |
-
} else if (($gi->databaseType ==
|
278 |
-
($gi->databaseType ==
|
279 |
-
|| ($gi->databaseType ==
|
280 |
-
|| ($gi->databaseType ==
|
281 |
-
|| ($gi->databaseType ==
|
282 |
-
|| ($gi->databaseType ==
|
283 |
-
|| ($gi->databaseType ==
|
284 |
-
|| ($gi->databaseType ==
|
285 |
-
|| ($gi->databaseType ==
|
286 |
-
|| ($gi->databaseType ==
|
287 |
-
|| ($gi->databaseType ==
|
288 |
-
|| ($gi->databaseType ==
|
289 |
-
|| ($gi->databaseType ==
|
290 |
-
|| ($gi->databaseType ==
|
291 |
-
|| ($gi->databaseType ==
|
292 |
-
|| ($gi->databaseType ==
|
293 |
-
|| ($gi->databaseType ==
|
294 |
-
|| ($gi->databaseType ==
|
295 |
$gi->databaseSegments = 0;
|
296 |
-
$buf = @shmop_read ($gi->shmid, $offset,
|
297 |
-
for ($j = 0;$j <
|
298 |
$gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
|
299 |
}
|
300 |
-
if (($gi->databaseType ==
|
301 |
-
|| ($gi->databaseType ==
|
302 |
-
|| ($gi->databaseType ==
|
303 |
-
|| ($gi->databaseType ==
|
304 |
-
|| ($gi->databaseType ==
|
305 |
-
|| ($gi->databaseType ==
|
306 |
-
$gi->record_length =
|
307 |
}
|
308 |
}
|
309 |
break;
|
@@ -311,56 +310,56 @@ if(! class_exists('wfWAFGeoIP')){
|
|
311 |
$offset -= 4;
|
312 |
}
|
313 |
}
|
314 |
-
if (($gi->databaseType ==
|
315 |
-
($gi->databaseType ==
|
316 |
-
($gi->databaseType ==
|
317 |
-
($gi->databaseType ==
|
318 |
-
$gi->databaseSegments =
|
319 |
}
|
320 |
} else {
|
321 |
$filepos = ftell($gi->filehandle);
|
322 |
fseek($gi->filehandle, -3, SEEK_END);
|
323 |
-
for ($i = 0; $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 ==
|
328 |
-
$gi->databaseSegments =
|
329 |
}
|
330 |
-
else if ($gi->databaseType ==
|
331 |
-
$gi->databaseSegments =
|
332 |
-
} else if (($gi->databaseType ==
|
333 |
-
|| ($gi->databaseType ==
|
334 |
-
|| ($gi->databaseType ==
|
335 |
-
|| ($gi->databaseType ==
|
336 |
-
|| ($gi->databaseType ==
|
337 |
-
|| ($gi->databaseType ==
|
338 |
-
|| ($gi->databaseType ==
|
339 |
-
|| ($gi->databaseType ==
|
340 |
-
|| ($gi->databaseType ==
|
341 |
-
|| ($gi->databaseType ==
|
342 |
-
|| ($gi->databaseType ==
|
343 |
-
|| ($gi->databaseType ==
|
344 |
-
|| ($gi->databaseType ==
|
345 |
-
|| ($gi->databaseType ==
|
346 |
-
|| ($gi->databaseType ==
|
347 |
-
|| ($gi->databaseType ==
|
348 |
-
|| ($gi->databaseType ==
|
349 |
-
|| ($gi->databaseType ==
|
350 |
-
|| ($gi->databaseType ==
|
351 |
-
|| ($gi->databaseType ==
|
352 |
$gi->databaseSegments = 0;
|
353 |
-
$buf = fread($gi->filehandle,
|
354 |
-
for ($j = 0;$j <
|
355 |
$gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
|
356 |
}
|
357 |
-
if ( ( $gi->databaseType ==
|
358 |
-
|| ( $gi->databaseType ==
|
359 |
-
|| ( $gi->databaseType ==
|
360 |
-
|| ( $gi->databaseType ==
|
361 |
-
|| ( $gi->databaseType ==
|
362 |
-
|| ( $gi->databaseType ==
|
363 |
-
$gi->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 ==
|
372 |
-
($gi->databaseType ==
|
373 |
-
($gi->databaseType ==
|
374 |
-
($gi->databaseType ==
|
375 |
-
$gi->databaseSegments =
|
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 &
|
388 |
-
$gi->shmid = @shmop_open (
|
389 |
} else {
|
390 |
$gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" );
|
391 |
-
if ($gi->flags &
|
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 &
|
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) -
|
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) -
|
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 ==
|
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 ==
|
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 &
|
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 &
|
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 &
|
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 &
|
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 &
|
650 |
-
$org_buf = @shmop_read ($gi->shmid, $record_pointer,
|
651 |
} else {
|
652 |
fseek($gi->filehandle, $record_pointer, SEEK_SET);
|
653 |
-
$org_buf = fread($gi->filehandle,
|
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 ==
|
714 |
-
$seek_region = _geoip_seek_country($gi,$ipnum) -
|
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 ==
|
724 |
-
$seek_region = _geoip_seek_country($gi,$ipnum) -
|
725 |
//print $seek_region;
|
726 |
-
if ($seek_region <
|
727 |
$country_code = "";
|
728 |
$region = "";
|
729 |
-
} else if ($seek_region <
|
730 |
$country_code = "US";
|
731 |
-
$region = chr(($seek_region -
|
732 |
-
} else if ($seek_region <
|
733 |
$country_code = "CA";
|
734 |
-
$region = chr(($seek_region -
|
735 |
} else {
|
736 |
-
$country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region -
|
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 = (
|
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 |
-
|
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",
|
386 |
$country = geoip_country_code_by_addr_v6($gi, $ip);
|
387 |
} else {
|
388 |
-
$gi = geoip_open($wordfenceLib . "/GeoIP.dat",
|
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.
|
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.
|
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 |
|