Version Description
- New: Malicious IPs are now preemptively blocked by a regularly-updated blacklist. [Premium Feature]
- Improvement: Better layout and display for mobile screen sizes.
- Improvement: Dashboard chart data is now updated more frequently.
- Fix: Fixed database errors on notifications page on multisite installations.
- Fix: Fixed site URL detection for multisite installations.
- Fix: Fixed tour popup positioning on multisite.
- Fix: Increased the z-index of the AJAX error watcher alert.
- Fix: Addressed an additional way to enumerate authors with the REST JSON API.
Download this release
Release Info
Developer | wfryan |
Plugin | Wordfence Security – Firewall & Malware Scan |
Version | 6.3.3 |
Comparing to | |
See all releases |
Code changes from version 6.3.2 to 6.3.3
- css/dt_table.css +1 -2
- css/main.css +1 -1
- css/wf-ionicons.css +1 -0
- css/wordfenceBox.css +1 -1
- fonts/ionicons.woff +0 -0
- js/admin.js +89 -86
- js/admin.liveTraffic.js +2 -1
- js/tourTip.js +1 -1
- js/wfdropdown.js +165 -0
- lib/dashboard/widget_ips.php +1 -1
- lib/dashboard/widget_logins.php +1 -1
- lib/dashboard/widget_networkattacks.php +22 -3
- lib/menu_activity.php +102 -159
- lib/menu_blocking_advancedBlocking.php +56 -28
- lib/menu_blocking_blockedIPs.php +6 -6
- lib/menu_blocking_countryBlocking.php +198 -52
- lib/menu_dashboard.php +10 -12
- lib/menu_firewall_waf.php +129 -120
- lib/menu_scan.php +363 -280
- lib/menu_scan_scan.php +1 -1
- lib/menu_scan_schedule.php +34 -22
- lib/menu_tools_diagnostic.php +1 -1
- lib/menu_tools_twoFactor.php +31 -16
- lib/menu_tools_whois.php +2 -2
- lib/pageTitle.php +16 -2
- lib/wfDB.php +4 -0
- lib/wfDashboard.php +26 -1
- lib/wfNotification.php +6 -3
- lib/wfScanEngine.php +2 -2
- lib/wfStyle.php +1 -1
- lib/wordfenceClass.php +33 -1
- lib/wordfenceScanner.php +2 -2
- readme.txt +12 -2
- vendor/wordfence/wf-waf/src/init.php +1 -1
- vendor/wordfence/wf-waf/src/lib/request.php +5 -2
- vendor/wordfence/wf-waf/src/lib/storage.php +6 -0
- vendor/wordfence/wf-waf/src/lib/storage/file.php +54 -14
- vendor/wordfence/wf-waf/src/lib/waf.php +61 -4
- waf/bootstrap.php +99 -5
- wordfence.php +2 -2
css/dt_table.css
CHANGED
@@ -21,7 +21,7 @@ table.display thead th div.DataTables_sort_wrapper span{position:absolute;top:50
|
|
21 |
.paginate_enabled_previous{background-image:url(../images/back_enabled.jpg)}
|
22 |
.paginate_disabled_next{background-image:url(../images/forward_disabled.jpg)}
|
23 |
.paginate_enabled_next{background-image:url(../images/forward_enabled.jpg)}
|
24 |
-
table.display{width:800px;clear:both;border-collapse:collapse;margin:0 0 24px;background:#fff;position:relative;top:12px}
|
25 |
table.display tfoot th{font-weight:400;padding:3px 8px 3px 8px}
|
26 |
table.display tr.heading2 td{border-bottom:1px solid #aaa}
|
27 |
table.display td{padding:5px 8px;border:1px solid #ccc}
|
@@ -46,7 +46,6 @@ td.details{background-color:#d1cfd0;border:2px solid #A19B9E}
|
|
46 |
.paging_full_numbers span.paginate_button_disabled:hover {background:#fff}
|
47 |
table.display tr.even.row_selected td{background-color:#B0BED9}
|
48 |
table.display tr.odd.row_selected td{background-color:#9FAFD1}
|
49 |
-
.sorting_1 {background:#f5f5f5}
|
50 |
table.display td.center,.dataTables_empty{text-align:center}
|
51 |
.dataTables_empty{background:#fff}
|
52 |
.paging_full_numbers span.paginate_button{background-color:#fff}
|
21 |
.paginate_enabled_previous{background-image:url(../images/back_enabled.jpg)}
|
22 |
.paginate_disabled_next{background-image:url(../images/forward_disabled.jpg)}
|
23 |
.paginate_enabled_next{background-image:url(../images/forward_enabled.jpg)}
|
24 |
+
table.display{max-width:800px;clear:both;border-collapse:collapse;margin:0 0 24px;background:#fff;position:relative;top:12px}
|
25 |
table.display tfoot th{font-weight:400;padding:3px 8px 3px 8px}
|
26 |
table.display tr.heading2 td{border-bottom:1px solid #aaa}
|
27 |
table.display td{padding:5px 8px;border:1px solid #ccc}
|
46 |
.paging_full_numbers span.paginate_button_disabled:hover {background:#fff}
|
47 |
table.display tr.even.row_selected td{background-color:#B0BED9}
|
48 |
table.display tr.odd.row_selected td{background-color:#9FAFD1}
|
|
|
49 |
table.display td.center,.dataTables_empty{text-align:center}
|
50 |
.dataTables_empty{background:#fff}
|
51 |
.paging_full_numbers span.paginate_button{background-color:#fff}
|
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}}.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}}
|
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}@media (min-width: 768px){.wrap.wordfence{max-width:750px}}@media (min-width: 992px){.wrap.wordfence{max-width:970px}}@media (min-width: 1200px){.wrap.wordfence{max-width:1170px}}.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: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;margin:0}.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:0.5rem;margin-top:1rem;border-top:1px solid #f3f6f8}@media (min-width: 768px){.wf-card .wf-card-extra{padding:1rem}}.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)}.wf-split-word{word-wrap:break-word;word-break:break-all}@media (max-width: 767px){.wf-split-word-xs{word-wrap:break-word;word-break:break-all;white-space:normal !important}}.select2-container{min-width:240px}@media (min-width: 768px){.select2-container{min-width:280px}}@media (min-width: 992px){.select2-container{min-width:320px}}.wf-page-title{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;margin-top:0.5rem}.wf-page-title>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wf-page-title>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:32px;-webkit-flex-basis:32px;flex-basis:32px;padding-right:0.25rem}.wf-page-title .wordfence-icon32{margin:0;margin-right:0.5rem}.wf-page-title h2{padding:0 !important}.wf-page-title .wfOnOffSwitch{-webkit-flex-basis:69px;flex-basis:69px;-webkit-flex-shrink:0;flex-shrink:0;margin-left:0.5rem}#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}#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}.wf-issues-table{table-layout:fixed;width:100%}div.wfIssue{width:100%}div.wfIssue table.wfIssue td{padding:2px;margin:0;border-width:0;text-align:left;width:100%}div.wfIssue table.wfIssue th{padding:2px;margin:0;font-weight:bold;text-align:left;color:#777;white-space:nowrap}div.wfIssue table.wfIssueLinks td{border-width:0;text-align:left;padding-right:10px}div.wfIssue h2{margin:0 0 5px 0;padding:0;font-size:0.9rem}@media (min-width: 768px){div.wfIssue h2{font-size:1.05rem}}.wfIssueOptions{border-top:1px solid #CCC;padding:10px}.wfIssueOptions h3{font-size:0.8rem;margin:0}@media (min-width: 768px){.wfIssueOptions h3{display:inline-block}}.wfIssueOptions ul{margin-bottom:0;padding-left:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wfIssueOptions ul{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}}.wfIssueOptions ul>li>a{position:relative;display:block;padding:8px 12px/2}.wfIssueOptions ul>li>a:hover,.wfIssueOptions ul>li>a:focus{text-decoration:none;background-color:#e2e2e2}.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{max-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}.wfSummaryLine{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wfSummaryLine{-webkit-flex-direction:row;flex-direction:row}}.wfSummaryLine .wfSummaryDate{padding-left:3px}.wfSummaryLine .wfSummaryMsg{padding-left:3px;-webkit-flex-grow:1;flex-grow:1;min-width:0}.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}.wf-scan-severity{position:relative;width:10px}@media (min-width: 768px){.wf-scan-severity{width:144px}}.wf-scan-severity-1,.wf-scan-severity-2{position:absolute;top:0px;right:0px;bottom:0px;left:0px}.wf-scan-severity-1{background-color:#c10000}.wf-scan-severity-2{background-color:#ffd10a}.scan-schedule{border-collapse:collapse;border-spacing:0}.scan-schedule tr:first-of-type th{padding-top:0}.scan-schedule td{padding:0}.scan-schedule th{padding:1.5rem 0.5rem 0.75rem 0;font-size:1rem;text-align:left}@media (min-width: 768px){.scan-schedule th{padding:0 0.5rem 0 0;font-size:0.8125rem;text-align:center}}.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-wrapper{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;margin-top:1rem}@media (min-width: 768px){.schedule-times-wrapper{margin-top:0.25rem}}.schedule-times-wrapper:first-of-type{margin-top:0}@media (min-width: 768px){.schedule-times-wrapper:first-of-type{margin-top:1rem}}.schedule-times-wrapper>*{-webkit-flex-grow:1;flex-grow:1;min-width:0}.schedule-times-wrapper>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:initial;padding-right:0.25rem}.schedule-times{margin-bottom:0;margin-top: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}.wfActEvent.wf-live-traffic-filter{padding-left:0;padding-right:0;display:-webkit-flex;display:flex;-webkit-align-items:baseline;align-items:baseline;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wfActEvent.wf-live-traffic-filter{-webkit-flex-direction:row;flex-direction:row}}.wfActEvent.wf-live-traffic-filter h2{margin:0;padding-bottom:0.5rem}@media (min-width: 768px){.wfActEvent.wf-live-traffic-filter h2{padding-bottom:0;padding-right:0.5rem}}#wf-lt-advanced-filters{padding-left:0;padding-right:0;overflow:hidden}.wf-live-traffic-filter-detail{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wf-live-traffic-filter-detail{-webkit-flex-direction:row;flex-direction:row}.wf-live-traffic-filter-detail *{-webkit-flex-grow:1;flex-grow:1}}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-remove{margin-left:0.5rem;font-size:1.5rem;color:#333}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters div{padding:0.25rem 0}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters select{font-size:0.75rem !important}@media (min-width: 768px){.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters div{padding:0}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters select{font-size:1rem !important}}.wf-filtered-traffic{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row}.wf-filtered-traffic .wf-filtered-traffic-hits{font-size:1.75rem;color:#999999}#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:10px;right:auto;left:10px;z-index:2000}@media (min-width: 768px){#wf-live-traffic-legend.sticky{top:42px;left:182px}}#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;font-size:11.5px}@media (min-width: 768px){#wf-live-traffic-legend ul li{font-size:13px}}#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:0.9rem}@media (min-width: 768px){#input-wafStatus,#input-wafStatus option,.select2-container--default{font-size:1.0rem}}@media (min-width: 992px){#input-wafStatus,#input-wafStatus option,.select2-container--default{font-size:1.125rem}}.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}.whitelist-table-container{overflow-x:auto}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:175px;height:175px;margin:0 auto}@media (min-width: 500px){#wfTwoFactorQRCodeTable{width:256px;height:256px}}#wfTwoFactorRecoveryCodes{list-style-type:none}#wfTwoFactorRecoveryCodes li{font-family:monospace;text-align:center}#wfTwoFactorDownload .dashicons{line-height:26px}.wf-twofactor-delete{font-size:1.5rem}.wf-twofactor-delete a{text-decoration:none;color:#333}.wf-table.wf-table-twofactor>tbody>tr>td{vertical-align:middle}.wf-form-twofactor{max-width:400px}.wf-form-twofactor .wf-radio label{padding-left:0}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-offset{padding-left:29px}@media (min-width: 768px){.wf-radio-offset{padding-left:20px}}.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;padding:1rem 0;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.wf-dashboard-item-list-horizontal{box-sizing:border-box;margin-top:-1px;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}.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:100%;flex-basis:100%;border-left:1px solid #eeeeee}@media (min-width: 768px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-basis:50%;flex-basis:50%}}@media (min-width: 992px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-basis:20%;flex-basis:20%}}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>*:first-child{border-left:0}@media (min-width: 768px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal.wf-dashboard-item-list-equal>li{max-width:50%}}@media (min-width: 992px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal.wf-dashboard-item-list-equal>li{max-width:20%}}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state{text-align:center}@media (min-width: 1200px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state{text-align:left}}.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}.wf-dashboard-last-updated{font-style:italic;font-size:0.6rem;text-align:center;padding-bottom:1rem;margin: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}}.wf-nav{margin-bottom:0;padding-left:0;list-style:none}.wf-nav:before,.wf-nav:after{content:" ";display:table}.wf-nav:after{clear:both}.wf-nav>li{position:relative;display:block}.wf-nav>li>a{position:relative;display:block;padding:8px 12px}.wf-nav>li>a:hover,.wf-nav>li>a:focus{text-decoration:none;background-color:#e2e2e2}.wf-nav>li.wf-disabled>a{color:#777}.wf-nav>li.wf-disabled>a:hover,.wf-nav>li.wf-disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.wf-nav .wf-open>a,.wf-nav .wf-open>a:hover,.wf-nav .wf-open>a:focus{background-color:#e2e2e2;border-color:#00709e}.wf-nav>li>a>img{max-width:none}.wf-nav-tabs{border-bottom:1px solid #ddd}.wf-nav-tabs>li{float:left;margin-bottom:-1px}.wf-nav-tabs>li>a{margin-right:2px;line-height:1.42857;border:1px solid transparent;border-radius:4px 4px 0 0}.wf-nav-tabs>li>a:hover{border-color:#e2e2e2 #e2e2e2 #ddd}.wf-nav-tabs>li.wf-active>a,.wf-nav-tabs>li.wf-active>a:hover,.wf-nav-tabs>li.wf-active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.wf-nav-pills>li{float:left}.wf-nav-pills>li>a{border-radius:4px}.wf-nav-pills>li+li{margin-left:2px}.wf-nav-pills>li.wf-active>a,.wf-nav-pills>li.wf-active>a:hover,.wf-nav-pills>li.wf-active>a:focus{color:#fff;background-color:#00709e}.wf-nav-stacked>li{float:none}.wf-nav-stacked>li+li{margin-top:2px;margin-left:0}.wf-nav-justified,.wf-nav-tabs.wf-nav-justified{width:100%}.wf-nav-justified>li,.wf-nav-tabs.wf-nav-justified>li{float:none}.wf-nav-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{text-align:center;margin-bottom:5px}.wf-nav-justified>.wf-dropdown .wf-dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.wf-nav-justified>li,.wf-nav-tabs.wf-nav-justified>li{display:table-cell;width:1%}.wf-nav-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{margin-bottom:0}}.wf-nav-tabs-justified,.wf-nav-tabs.wf-nav-justified{border-bottom:0}.wf-nav-tabs-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{margin-right:0;border-radius:4px}.wf-nav-tabs-justified>.wf-active>a,.wf-nav-tabs.wf-nav-justified>.wf-active>a,.wf-nav-tabs-justified>.wf-active>a:hover,.wf-nav-tabs.wf-nav-justified>.wf-active>a:hover,.wf-nav-tabs-justified>.wf-active>a:focus,.wf-nav-tabs.wf-nav-justified>.wf-active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.wf-nav-tabs-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.wf-nav-tabs-justified>.wf-active>a,.wf-nav-tabs.wf-nav-justified>.wf-active>a,.wf-nav-tabs-justified>.wf-active>a:hover,.wf-nav-tabs.wf-nav-justified>.wf-active>a:hover,.wf-nav-tabs-justified>.wf-active>a:focus,.wf-nav-tabs.wf-nav-justified>.wf-active>a:focus{border-bottom-color:#fff}}.wf-tab-content>.wf-tab-pane{display:none}.wf-tab-content>.wf-active{display:block}.wf-nav-tabs .wf-dropdown-menu{margin-top:-1px;-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-navbar-brand{float:left;padding:12px 8px;font-size:18px;line-height:20px;margin:10px 0 0 0}.wf-navbar-brand:hover,.wf-navbar-brand:focus{text-decoration:none}.wf-navbar-brand>img{display:block}@media (min-width: 768px){.navbar>.container .wf-navbar-brand,.navbar>.container-fluid .wf-navbar-brand{margin-left:-8px}}.wf-caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.wf-dropup,.wf-dropdown{position:relative}.wf-dropdown-toggle:focus{outline:0}.wf-dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.wf-dropdown-menu .wf-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.wf-dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857;color:#333;text-decoration:none;white-space:nowrap}.wf-dropdown-menu>li>a:hover,.wf-dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.wf-dropdown-menu>.wf-active>a,.wf-dropdown-menu>.wf-active>a:hover,.wf-dropdown-menu>.wf-active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#00709e}.wf-dropdown-menu>.wf-disabled>a,.wf-dropdown-menu>.wf-disabled>a:hover,.wf-dropdown-menu>.wf-disabled>a:focus{color:#777}.wf-dropdown-menu>.wf-disabled>a:hover,.wf-dropdown-menu>.wf-disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.wf-open>.wf-dropdown-menu{display:block}.wf-open>a{outline:0}.wf-dropdown-menu-right{left:auto;right:0}.wf-dropdown-menu-left{left:0;right:auto}.wf-dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857;color:#777;white-space:nowrap}.wf-dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.wf-pull-right>.wf-dropdown-menu{right:0;left:auto}.wf-dropup .wf-caret,.wf-navbar-fixed-bottom .wf-dropdown .wf-caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.wf-dropup .wf-dropdown-menu,.wf-navbar-fixed-bottom .wf-dropdown .wf-dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width: 768px){.wf-navbar-right .wf-dropdown-menu{right:0;left:auto}.wf-navbar-right .wf-dropdown-menu-left{left:0;right:auto}}.wf-mobile-dropdown{border:1px solid #ccc;margin-left:.5em;padding:5px 10px;font-size:14px;line-height:24px;margin:10px 10px 0 0;background:#f1f1f1;color:#000;font-weight:600;text-decoration:none}.wf-blocked-countries{margin-bottom:0;margin-top:0;padding-left:0;list-style:none;margin-left:-6px;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wf-blocked-countries>li{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;margin:0px 0px 2px 6px;text-align:center;border:1px solid #e2e2e2;border-radius:4px;padding:8px 12px;background-color:#ffffff;-webkit-flex-basis:38%;flex-basis:38%}@media (min-width: 768px){.wf-blocked-countries>li{-webkit-flex-basis:20%;flex-basis:20%}}@media (min-width: 992px){.wf-blocked-countries>li{-webkit-flex-basis:15%;flex-basis:15%}}@media (min-width: 1200px){.wf-blocked-countries>li{-webkit-flex-basis:10%;flex-basis:10%}}.wf-blocked-countries>li:hover,.wf-blocked-countries>li:focus{text-decoration:none;background-color:#e2e2e2}.wf-blocked-countries>li.disabled>a{color:#777}.wf-blocked-countries>li.disabled>a:hover,.wf-blocked-countries>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.wf-blocked-countries>li>a{text-decoration:none;position:relative;display:block}.wf-blocked-countries>li.active,.wf-blocked-countries>li.active:hover,.wf-blocked-countries>li.active:focus{background-color:#00709e;border-color:#00709e}.wf-blocked-countries>li.active>a,.wf-blocked-countries>li.active:hover>a,.wf-blocked-countries>li.active:focus>a{color:#fff}.wf-blocked-countries>li.text-only{position:relative;display:block;padding:8px 12px}.wf-blocked-countries>li>a>img{max-width:none}.wf-blocked-countries-section{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-blocked-countries-section-title{font-size:1.1rem;padding-right:0.5rem}.wf-blocked-countries-section-spacer{-webkit-flex-basis:30px;flex-basis:30px;height:1px;background:#aaa}.wf-blocked-countries-section-options{margin-bottom:0;margin-top:0;padding-left:0.5rem;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-blocked-countries-section-options li{padding:0;margin:0;color:#777}.wf-blocked-countries-section-options li a{padding:2px 4px;text-decoration:none;color:#777}.wf-blocked-countries-section-options li a.active-section{background-color:#777;color:#e2e2e2}
|
css/wf-ionicons.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.woff?v=2.0.0") format("woff");font-weight:normal;font-style:normal}.wf-ion,.wf-ionicons,.wf-ion-alert:before,.wf-ion-alert-circled:before,.wf-ion-android-add:before,.wf-ion-android-add-circle:before,.wf-ion-android-alarm-clock:before,.wf-ion-android-alert:before,.wf-ion-android-apps:before,.wf-ion-android-archive:before,.wf-ion-android-arrow-back:before,.wf-ion-android-arrow-down:before,.wf-ion-android-arrow-dropdown:before,.wf-ion-android-arrow-dropdown-circle:before,.wf-ion-android-arrow-dropleft:before,.wf-ion-android-arrow-dropleft-circle:before,.wf-ion-android-arrow-dropright:before,.wf-ion-android-arrow-dropright-circle:before,.wf-ion-android-arrow-dropup:before,.wf-ion-android-arrow-dropup-circle:before,.wf-ion-android-arrow-forward:before,.wf-ion-android-arrow-up:before,.wf-ion-android-attach:before,.wf-ion-android-bar:before,.wf-ion-android-bicycle:before,.wf-ion-android-boat:before,.wf-ion-android-bookmark:before,.wf-ion-android-bulb:before,.wf-ion-android-bus:before,.wf-ion-android-calendar:before,.wf-ion-android-call:before,.wf-ion-android-camera:before,.wf-ion-android-cancel:before,.wf-ion-android-car:before,.wf-ion-android-cart:before,.wf-ion-android-chat:before,.wf-ion-android-checkbox:before,.wf-ion-android-checkbox-blank:before,.wf-ion-android-checkbox-outline:before,.wf-ion-android-checkbox-outline-blank:before,.wf-ion-android-checkmark-circle:before,.wf-ion-android-clipboard:before,.wf-ion-android-close:before,.wf-ion-android-cloud:before,.wf-ion-android-cloud-circle:before,.wf-ion-android-cloud-done:before,.wf-ion-android-cloud-outline:before,.wf-ion-android-color-palette:before,.wf-ion-android-compass:before,.wf-ion-android-contact:before,.wf-ion-android-contacts:before,.wf-ion-android-contract:before,.wf-ion-android-create:before,.wf-ion-android-delete:before,.wf-ion-android-desktop:before,.wf-ion-android-document:before,.wf-ion-android-done:before,.wf-ion-android-done-all:before,.wf-ion-android-download:before,.wf-ion-android-drafts:before,.wf-ion-android-exit:before,.wf-ion-android-expand:before,.wf-ion-android-favorite:before,.wf-ion-android-favorite-outline:before,.wf-ion-android-film:before,.wf-ion-android-folder:before,.wf-ion-android-folder-open:before,.wf-ion-android-funnel:before,.wf-ion-android-globe:before,.wf-ion-android-hand:before,.wf-ion-android-hangout:before,.wf-ion-android-happy:before,.wf-ion-android-home:before,.wf-ion-android-image:before,.wf-ion-android-laptop:before,.wf-ion-android-list:before,.wf-ion-android-locate:before,.wf-ion-android-lock:before,.wf-ion-android-mail:before,.wf-ion-android-map:before,.wf-ion-android-menu:before,.wf-ion-android-microphone:before,.wf-ion-android-microphone-off:before,.wf-ion-android-more-horizontal:before,.wf-ion-android-more-vertical:before,.wf-ion-android-navigate:before,.wf-ion-android-notifications:before,.wf-ion-android-notifications-none:before,.wf-ion-android-notifications-off:before,.wf-ion-android-open:before,.wf-ion-android-options:before,.wf-ion-android-people:before,.wf-ion-android-person:before,.wf-ion-android-person-add:before,.wf-ion-android-phone-landscape:before,.wf-ion-android-phone-portrait:before,.wf-ion-android-pin:before,.wf-ion-android-plane:before,.wf-ion-android-playstore:before,.wf-ion-android-print:before,.wf-ion-android-radio-button-off:before,.wf-ion-android-radio-button-on:before,.wf-ion-android-refresh:before,.wf-ion-android-remove:before,.wf-ion-android-remove-circle:before,.wf-ion-android-restaurant:before,.wf-ion-android-sad:before,.wf-ion-android-search:before,.wf-ion-android-send:before,.wf-ion-android-settings:before,.wf-ion-android-share:before,.wf-ion-android-share-alt:before,.wf-ion-android-star:before,.wf-ion-android-star-half:before,.wf-ion-android-star-outline:before,.wf-ion-android-stopwatch:before,.wf-ion-android-subway:before,.wf-ion-android-sunny:before,.wf-ion-android-sync:before,.wf-ion-android-textsms:before,.wf-ion-android-time:before,.wf-ion-android-train:before,.wf-ion-android-unlock:before,.wf-ion-android-upload:before,.wf-ion-android-volume-down:before,.wf-ion-android-volume-mute:before,.wf-ion-android-volume-off:before,.wf-ion-android-volume-up:before,.wf-ion-android-walk:before,.wf-ion-android-warning:before,.wf-ion-android-watch:before,.wf-ion-android-wifi:before,.wf-ion-aperture:before,.wf-ion-archive:before,.wf-ion-arrow-down-a:before,.wf-ion-arrow-down-b:before,.wf-ion-arrow-down-c:before,.wf-ion-arrow-expand:before,.wf-ion-arrow-graph-down-left:before,.wf-ion-arrow-graph-down-right:before,.wf-ion-arrow-graph-up-left:before,.wf-ion-arrow-graph-up-right:before,.wf-ion-arrow-left-a:before,.wf-ion-arrow-left-b:before,.wf-ion-arrow-left-c:before,.wf-ion-arrow-move:before,.wf-ion-arrow-resize:before,.wf-ion-arrow-return-left:before,.wf-ion-arrow-return-right:before,.wf-ion-arrow-right-a:before,.wf-ion-arrow-right-b:before,.wf-ion-arrow-right-c:before,.wf-ion-arrow-shrink:before,.wf-ion-arrow-swap:before,.wf-ion-arrow-up-a:before,.wf-ion-arrow-up-b:before,.wf-ion-arrow-up-c:before,.wf-ion-asterisk:before,.wf-ion-at:before,.wf-ion-backspace:before,.wf-ion-backspace-outline:before,.wf-ion-bag:before,.wf-ion-battery-charging:before,.wf-ion-battery-empty:before,.wf-ion-battery-full:before,.wf-ion-battery-half:before,.wf-ion-battery-low:before,.wf-ion-beaker:before,.wf-ion-beer:before,.wf-ion-bluetooth:before,.wf-ion-bonfire:before,.wf-ion-bookmark:before,.wf-ion-bowtie:before,.wf-ion-briefcase:before,.wf-ion-bug:before,.wf-ion-calculator:before,.wf-ion-calendar:before,.wf-ion-camera:before,.wf-ion-card:before,.wf-ion-cash:before,.wf-ion-chatbox:before,.wf-ion-chatbox-working:before,.wf-ion-chatboxes:before,.wf-ion-chatbubble:before,.wf-ion-chatbubble-working:before,.wf-ion-chatbubbles:before,.wf-ion-checkmark:before,.wf-ion-checkmark-circled:before,.wf-ion-checkmark-round:before,.wf-ion-chevron-down:before,.wf-ion-chevron-left:before,.wf-ion-chevron-right:before,.wf-ion-chevron-up:before,.wf-ion-clipboard:before,.wf-ion-clock:before,.wf-ion-close:before,.wf-ion-close-circled:before,.wf-ion-close-round:before,.wf-ion-closed-captioning:before,.wf-ion-cloud:before,.wf-ion-code:before,.wf-ion-code-download:before,.wf-ion-code-working:before,.wf-ion-coffee:before,.wf-ion-compass:before,.wf-ion-compose:before,.wf-ion-connection-bars:before,.wf-ion-contrast:before,.wf-ion-crop:before,.wf-ion-cube:before,.wf-ion-disc:before,.wf-ion-document:before,.wf-ion-document-text:before,.wf-ion-drag:before,.wf-ion-earth:before,.wf-ion-easel:before,.wf-ion-edit:before,.wf-ion-egg:before,.wf-ion-eject:before,.wf-ion-email:before,.wf-ion-email-unread:before,.wf-ion-erlenmeyer-flask:before,.wf-ion-erlenmeyer-flask-bubbles:before,.wf-ion-eye:before,.wf-ion-eye-disabled:before,.wf-ion-female:before,.wf-ion-filing:before,.wf-ion-film-marker:before,.wf-ion-fireball:before,.wf-ion-flag:before,.wf-ion-flame:before,.wf-ion-flash:before,.wf-ion-flash-off:before,.wf-ion-folder:before,.wf-ion-fork:before,.wf-ion-fork-repo:before,.wf-ion-forward:before,.wf-ion-funnel:before,.wf-ion-gear-a:before,.wf-ion-gear-b:before,.wf-ion-grid:before,.wf-ion-hammer:before,.wf-ion-happy:before,.wf-ion-happy-outline:before,.wf-ion-headphone:before,.wf-ion-heart:before,.wf-ion-heart-broken:before,.wf-ion-help:before,.wf-ion-help-buoy:before,.wf-ion-help-circled:before,.wf-ion-home:before,.wf-ion-icecream:before,.wf-ion-image:before,.wf-ion-images:before,.wf-ion-information:before,.wf-ion-information-circled:before,.wf-ion-ionic:before,.wf-ion-ios-alarm:before,.wf-ion-ios-alarm-outline:before,.wf-ion-ios-albums:before,.wf-ion-ios-albums-outline:before,.wf-ion-ios-americanfootball:before,.wf-ion-ios-americanfootball-outline:before,.wf-ion-ios-analytics:before,.wf-ion-ios-analytics-outline:before,.wf-ion-ios-arrow-back:before,.wf-ion-ios-arrow-down:before,.wf-ion-ios-arrow-forward:before,.wf-ion-ios-arrow-left:before,.wf-ion-ios-arrow-right:before,.wf-ion-ios-arrow-thin-down:before,.wf-ion-ios-arrow-thin-left:before,.wf-ion-ios-arrow-thin-right:before,.wf-ion-ios-arrow-thin-up:before,.wf-ion-ios-arrow-up:before,.wf-ion-ios-at:before,.wf-ion-ios-at-outline:before,.wf-ion-ios-barcode:before,.wf-ion-ios-barcode-outline:before,.wf-ion-ios-baseball:before,.wf-ion-ios-baseball-outline:before,.wf-ion-ios-basketball:before,.wf-ion-ios-basketball-outline:before,.wf-ion-ios-bell:before,.wf-ion-ios-bell-outline:before,.wf-ion-ios-body:before,.wf-ion-ios-body-outline:before,.wf-ion-ios-bolt:before,.wf-ion-ios-bolt-outline:before,.wf-ion-ios-book:before,.wf-ion-ios-book-outline:before,.wf-ion-ios-bookmarks:before,.wf-ion-ios-bookmarks-outline:before,.wf-ion-ios-box:before,.wf-ion-ios-box-outline:before,.wf-ion-ios-briefcase:before,.wf-ion-ios-briefcase-outline:before,.wf-ion-ios-browsers:before,.wf-ion-ios-browsers-outline:before,.wf-ion-ios-calculator:before,.wf-ion-ios-calculator-outline:before,.wf-ion-ios-calendar:before,.wf-ion-ios-calendar-outline:before,.wf-ion-ios-camera:before,.wf-ion-ios-camera-outline:before,.wf-ion-ios-cart:before,.wf-ion-ios-cart-outline:before,.wf-ion-ios-chatboxes:before,.wf-ion-ios-chatboxes-outline:before,.wf-ion-ios-chatbubble:before,.wf-ion-ios-chatbubble-outline:before,.wf-ion-ios-checkmark:before,.wf-ion-ios-checkmark-empty:before,.wf-ion-ios-checkmark-outline:before,.wf-ion-ios-circle-filled:before,.wf-ion-ios-circle-outline:before,.wf-ion-ios-clock:before,.wf-ion-ios-clock-outline:before,.wf-ion-ios-close:before,.wf-ion-ios-close-empty:before,.wf-ion-ios-close-outline:before,.wf-ion-ios-cloud:before,.wf-ion-ios-cloud-download:before,.wf-ion-ios-cloud-download-outline:before,.wf-ion-ios-cloud-outline:before,.wf-ion-ios-cloud-upload:before,.wf-ion-ios-cloud-upload-outline:before,.wf-ion-ios-cloudy:before,.wf-ion-ios-cloudy-night:before,.wf-ion-ios-cloudy-night-outline:before,.wf-ion-ios-cloudy-outline:before,.wf-ion-ios-cog:before,.wf-ion-ios-cog-outline:before,.wf-ion-ios-color-filter:before,.wf-ion-ios-color-filter-outline:before,.wf-ion-ios-color-wand:before,.wf-ion-ios-color-wand-outline:before,.wf-ion-ios-compose:before,.wf-ion-ios-compose-outline:before,.wf-ion-ios-contact:before,.wf-ion-ios-contact-outline:before,.wf-ion-ios-copy:before,.wf-ion-ios-copy-outline:before,.wf-ion-ios-crop:before,.wf-ion-ios-crop-strong:before,.wf-ion-ios-download:before,.wf-ion-ios-download-outline:before,.wf-ion-ios-drag:before,.wf-ion-ios-email:before,.wf-ion-ios-email-outline:before,.wf-ion-ios-eye:before,.wf-ion-ios-eye-outline:before,.wf-ion-ios-fastforward:before,.wf-ion-ios-fastforward-outline:before,.wf-ion-ios-filing:before,.wf-ion-ios-filing-outline:before,.wf-ion-ios-film:before,.wf-ion-ios-film-outline:before,.wf-ion-ios-flag:before,.wf-ion-ios-flag-outline:before,.wf-ion-ios-flame:before,.wf-ion-ios-flame-outline:before,.wf-ion-ios-flask:before,.wf-ion-ios-flask-outline:before,.wf-ion-ios-flower:before,.wf-ion-ios-flower-outline:before,.wf-ion-ios-folder:before,.wf-ion-ios-folder-outline:before,.wf-ion-ios-football:before,.wf-ion-ios-football-outline:before,.wf-ion-ios-game-controller-a:before,.wf-ion-ios-game-controller-a-outline:before,.wf-ion-ios-game-controller-b:before,.wf-ion-ios-game-controller-b-outline:before,.wf-ion-ios-gear:before,.wf-ion-ios-gear-outline:before,.wf-ion-ios-glasses:before,.wf-ion-ios-glasses-outline:before,.wf-ion-ios-grid-view:before,.wf-ion-ios-grid-view-outline:before,.wf-ion-ios-heart:before,.wf-ion-ios-heart-outline:before,.wf-ion-ios-help:before,.wf-ion-ios-help-empty:before,.wf-ion-ios-help-outline:before,.wf-ion-ios-home:before,.wf-ion-ios-home-outline:before,.wf-ion-ios-infinite:before,.wf-ion-ios-infinite-outline:before,.wf-ion-ios-information:before,.wf-ion-ios-information-empty:before,.wf-ion-ios-information-outline:before,.wf-ion-ios-ionic-outline:before,.wf-ion-ios-keypad:before,.wf-ion-ios-keypad-outline:before,.wf-ion-ios-lightbulb:before,.wf-ion-ios-lightbulb-outline:before,.wf-ion-ios-list:before,.wf-ion-ios-list-outline:before,.wf-ion-ios-location:before,.wf-ion-ios-location-outline:before,.wf-ion-ios-locked:before,.wf-ion-ios-locked-outline:before,.wf-ion-ios-loop:before,.wf-ion-ios-loop-strong:before,.wf-ion-ios-medical:before,.wf-ion-ios-medical-outline:before,.wf-ion-ios-medkit:before,.wf-ion-ios-medkit-outline:before,.wf-ion-ios-mic:before,.wf-ion-ios-mic-off:before,.wf-ion-ios-mic-outline:before,.wf-ion-ios-minus:before,.wf-ion-ios-minus-empty:before,.wf-ion-ios-minus-outline:before,.wf-ion-ios-monitor:before,.wf-ion-ios-monitor-outline:before,.wf-ion-ios-moon:before,.wf-ion-ios-moon-outline:before,.wf-ion-ios-more:before,.wf-ion-ios-more-outline:before,.wf-ion-ios-musical-note:before,.wf-ion-ios-musical-notes:before,.wf-ion-ios-navigate:before,.wf-ion-ios-navigate-outline:before,.wf-ion-ios-nutrition:before,.wf-ion-ios-nutrition-outline:before,.wf-ion-ios-paper:before,.wf-ion-ios-paper-outline:before,.wf-ion-ios-paperplane:before,.wf-ion-ios-paperplane-outline:before,.wf-ion-ios-partlysunny:before,.wf-ion-ios-partlysunny-outline:before,.wf-ion-ios-pause:before,.wf-ion-ios-pause-outline:before,.wf-ion-ios-paw:before,.wf-ion-ios-paw-outline:before,.wf-ion-ios-people:before,.wf-ion-ios-people-outline:before,.wf-ion-ios-person:before,.wf-ion-ios-person-outline:before,.wf-ion-ios-personadd:before,.wf-ion-ios-personadd-outline:before,.wf-ion-ios-photos:before,.wf-ion-ios-photos-outline:before,.wf-ion-ios-pie:before,.wf-ion-ios-pie-outline:before,.wf-ion-ios-pint:before,.wf-ion-ios-pint-outline:before,.wf-ion-ios-play:before,.wf-ion-ios-play-outline:before,.wf-ion-ios-plus:before,.wf-ion-ios-plus-empty:before,.wf-ion-ios-plus-outline:before,.wf-ion-ios-pricetag:before,.wf-ion-ios-pricetag-outline:before,.wf-ion-ios-pricetags:before,.wf-ion-ios-pricetags-outline:before,.wf-ion-ios-printer:before,.wf-ion-ios-printer-outline:before,.wf-ion-ios-pulse:before,.wf-ion-ios-pulse-strong:before,.wf-ion-ios-rainy:before,.wf-ion-ios-rainy-outline:before,.wf-ion-ios-recording:before,.wf-ion-ios-recording-outline:before,.wf-ion-ios-redo:before,.wf-ion-ios-redo-outline:before,.wf-ion-ios-refresh:before,.wf-ion-ios-refresh-empty:before,.wf-ion-ios-refresh-outline:before,.wf-ion-ios-reload:before,.wf-ion-ios-reverse-camera:before,.wf-ion-ios-reverse-camera-outline:before,.wf-ion-ios-rewind:before,.wf-ion-ios-rewind-outline:before,.wf-ion-ios-rose:before,.wf-ion-ios-rose-outline:before,.wf-ion-ios-search:before,.wf-ion-ios-search-strong:before,.wf-ion-ios-settings:before,.wf-ion-ios-settings-strong:before,.wf-ion-ios-shuffle:before,.wf-ion-ios-shuffle-strong:before,.wf-ion-ios-skipbackward:before,.wf-ion-ios-skipbackward-outline:before,.wf-ion-ios-skipforward:before,.wf-ion-ios-skipforward-outline:before,.wf-ion-ios-snowy:before,.wf-ion-ios-speedometer:before,.wf-ion-ios-speedometer-outline:before,.wf-ion-ios-star:before,.wf-ion-ios-star-half:before,.wf-ion-ios-star-outline:before,.wf-ion-ios-stopwatch:before,.wf-ion-ios-stopwatch-outline:before,.wf-ion-ios-sunny:before,.wf-ion-ios-sunny-outline:before,.wf-ion-ios-telephone:before,.wf-ion-ios-telephone-outline:before,.wf-ion-ios-tennisball:before,.wf-ion-ios-tennisball-outline:before,.wf-ion-ios-thunderstorm:before,.wf-ion-ios-thunderstorm-outline:before,.wf-ion-ios-time:before,.wf-ion-ios-time-outline:before,.wf-ion-ios-timer:before,.wf-ion-ios-timer-outline:before,.wf-ion-ios-toggle:before,.wf-ion-ios-toggle-outline:before,.wf-ion-ios-trash:before,.wf-ion-ios-trash-outline:before,.wf-ion-ios-undo:before,.wf-ion-ios-undo-outline:before,.wf-ion-ios-unlocked:before,.wf-ion-ios-unlocked-outline:before,.wf-ion-ios-upload:before,.wf-ion-ios-upload-outline:before,.wf-ion-ios-videocam:before,.wf-ion-ios-videocam-outline:before,.wf-ion-ios-volume-high:before,.wf-ion-ios-volume-low:before,.wf-ion-ios-wineglass:before,.wf-ion-ios-wineglass-outline:before,.wf-ion-ios-world:before,.wf-ion-ios-world-outline:before,.wf-ion-ipad:before,.wf-ion-iphone:before,.wf-ion-ipod:before,.wf-ion-jet:before,.wf-ion-key:before,.wf-ion-knife:before,.wf-ion-laptop:before,.wf-ion-leaf:before,.wf-ion-levels:before,.wf-ion-lightbulb:before,.wf-ion-link:before,.wf-ion-load-a:before,.wf-ion-load-b:before,.wf-ion-load-c:before,.wf-ion-load-d:before,.wf-ion-location:before,.wf-ion-lock-combination:before,.wf-ion-locked:before,.wf-ion-log-in:before,.wf-ion-log-out:before,.wf-ion-loop:before,.wf-ion-magnet:before,.wf-ion-male:before,.wf-ion-man:before,.wf-ion-map:before,.wf-ion-medkit:before,.wf-ion-merge:before,.wf-ion-mic-a:before,.wf-ion-mic-b:before,.wf-ion-mic-c:before,.wf-ion-minus:before,.wf-ion-minus-circled:before,.wf-ion-minus-round:before,.wf-ion-model-s:before,.wf-ion-monitor:before,.wf-ion-more:before,.wf-ion-mouse:before,.wf-ion-music-note:before,.wf-ion-navicon:before,.wf-ion-navicon-round:before,.wf-ion-navigate:before,.wf-ion-network:before,.wf-ion-no-smoking:before,.wf-ion-nuclear:before,.wf-ion-outlet:before,.wf-ion-paintbrush:before,.wf-ion-paintbucket:before,.wf-ion-paper-airplane:before,.wf-ion-paperclip:before,.wf-ion-pause:before,.wf-ion-person:before,.wf-ion-person-add:before,.wf-ion-person-stalker:before,.wf-ion-pie-graph:before,.wf-ion-pin:before,.wf-ion-pinpoint:before,.wf-ion-pizza:before,.wf-ion-plane:before,.wf-ion-planet:before,.wf-ion-play:before,.wf-ion-playstation:before,.wf-ion-plus:before,.wf-ion-plus-circled:before,.wf-ion-plus-round:before,.wf-ion-podium:before,.wf-ion-pound:before,.wf-ion-power:before,.wf-ion-pricetag:before,.wf-ion-pricetags:before,.wf-ion-printer:before,.wf-ion-pull-request:before,.wf-ion-qr-scanner:before,.wf-ion-quote:before,.wf-ion-radio-waves:before,.wf-ion-record:before,.wf-ion-refresh:before,.wf-ion-reply:before,.wf-ion-reply-all:before,.wf-ion-ribbon-a:before,.wf-ion-ribbon-b:before,.wf-ion-sad:before,.wf-ion-sad-outline:before,.wf-ion-scissors:before,.wf-ion-search:before,.wf-ion-settings:before,.wf-ion-share:before,.wf-ion-shuffle:before,.wf-ion-skip-backward:before,.wf-ion-skip-forward:before,.wf-ion-social-android:before,.wf-ion-social-android-outline:before,.wf-ion-social-angular:before,.wf-ion-social-angular-outline:before,.wf-ion-social-apple:before,.wf-ion-social-apple-outline:before,.wf-ion-social-bitcoin:before,.wf-ion-social-bitcoin-outline:before,.wf-ion-social-buffer:before,.wf-ion-social-buffer-outline:before,.wf-ion-social-chrome:before,.wf-ion-social-chrome-outline:before,.wf-ion-social-codepen:before,.wf-ion-social-codepen-outline:before,.wf-ion-social-css3:before,.wf-ion-social-css3-outline:before,.wf-ion-social-designernews:before,.wf-ion-social-designernews-outline:before,.wf-ion-social-dribbble:before,.wf-ion-social-dribbble-outline:before,.wf-ion-social-dropbox:before,.wf-ion-social-dropbox-outline:before,.wf-ion-social-euro:before,.wf-ion-social-euro-outline:before,.wf-ion-social-facebook:before,.wf-ion-social-facebook-outline:before,.wf-ion-social-foursquare:before,.wf-ion-social-foursquare-outline:before,.wf-ion-social-freebsd-devil:before,.wf-ion-social-github:before,.wf-ion-social-github-outline:before,.wf-ion-social-google:before,.wf-ion-social-google-outline:before,.wf-ion-social-googleplus:before,.wf-ion-social-googleplus-outline:before,.wf-ion-social-hackernews:before,.wf-ion-social-hackernews-outline:before,.wf-ion-social-html5:before,.wf-ion-social-html5-outline:before,.wf-ion-social-instagram:before,.wf-ion-social-instagram-outline:before,.wf-ion-social-javascript:before,.wf-ion-social-javascript-outline:before,.wf-ion-social-linkedin:before,.wf-ion-social-linkedin-outline:before,.wf-ion-social-markdown:before,.wf-ion-social-nodejs:before,.wf-ion-social-octocat:before,.wf-ion-social-pinterest:before,.wf-ion-social-pinterest-outline:before,.wf-ion-social-python:before,.wf-ion-social-reddit:before,.wf-ion-social-reddit-outline:before,.wf-ion-social-rss:before,.wf-ion-social-rss-outline:before,.wf-ion-social-sass:before,.wf-ion-social-skype:before,.wf-ion-social-skype-outline:before,.wf-ion-social-snapchat:before,.wf-ion-social-snapchat-outline:before,.wf-ion-social-tumblr:before,.wf-ion-social-tumblr-outline:before,.wf-ion-social-tux:before,.wf-ion-social-twitch:before,.wf-ion-social-twitch-outline:before,.wf-ion-social-twitter:before,.wf-ion-social-twitter-outline:before,.wf-ion-social-usd:before,.wf-ion-social-usd-outline:before,.wf-ion-social-vimeo:before,.wf-ion-social-vimeo-outline:before,.wf-ion-social-whatsapp:before,.wf-ion-social-whatsapp-outline:before,.wf-ion-social-windows:before,.wf-ion-social-windows-outline:before,.wf-ion-social-wordpress:before,.wf-ion-social-wordpress-outline:before,.wf-ion-social-yahoo:before,.wf-ion-social-yahoo-outline:before,.wf-ion-social-yen:before,.wf-ion-social-yen-outline:before,.wf-ion-social-youtube:before,.wf-ion-social-youtube-outline:before,.wf-ion-soup-can:before,.wf-ion-soup-can-outline:before,.wf-ion-speakerphone:before,.wf-ion-speedometer:before,.wf-ion-spoon:before,.wf-ion-star:before,.wf-ion-stats-bars:before,.wf-ion-steam:before,.wf-ion-stop:before,.wf-ion-thermometer:before,.wf-ion-thumbsdown:before,.wf-ion-thumbsup:before,.wf-ion-toggle:before,.wf-ion-toggle-filled:before,.wf-ion-transgender:before,.wf-ion-trash-a:before,.wf-ion-trash-b:before,.wf-ion-trophy:before,.wf-ion-tshirt:before,.wf-ion-tshirt-outline:before,.wf-ion-umbrella:before,.wf-ion-university:before,.wf-ion-unlocked:before,.wf-ion-upload:before,.wf-ion-usb:before,.wf-ion-videocamera:before,.wf-ion-volume-high:before,.wf-ion-volume-low:before,.wf-ion-volume-medium:before,.wf-ion-volume-mute:before,.wf-ion-wand:before,.wf-ion-waterdrop:before,.wf-ion-wifi:before,.wf-ion-wineglass:before,.wf-ion-woman:before,.wf-ion-wrench:before,.wf-ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wf-ion-alert:before{content:""}.wf-ion-alert-circled:before{content:""}.wf-ion-android-add:before{content:""}.wf-ion-android-add-circle:before{content:""}.wf-ion-android-alarm-clock:before{content:""}.wf-ion-android-alert:before{content:""}.wf-ion-android-apps:before{content:""}.wf-ion-android-archive:before{content:""}.wf-ion-android-arrow-back:before{content:""}.wf-ion-android-arrow-down:before{content:""}.wf-ion-android-arrow-dropdown:before{content:""}.wf-ion-android-arrow-dropdown-circle:before{content:""}.wf-ion-android-arrow-dropleft:before{content:""}.wf-ion-android-arrow-dropleft-circle:before{content:""}.wf-ion-android-arrow-dropright:before{content:""}.wf-ion-android-arrow-dropright-circle:before{content:""}.wf-ion-android-arrow-dropup:before{content:""}.wf-ion-android-arrow-dropup-circle:before{content:""}.wf-ion-android-arrow-forward:before{content:""}.wf-ion-android-arrow-up:before{content:""}.wf-ion-android-attach:before{content:""}.wf-ion-android-bar:before{content:""}.wf-ion-android-bicycle:before{content:""}.wf-ion-android-boat:before{content:""}.wf-ion-android-bookmark:before{content:""}.wf-ion-android-bulb:before{content:""}.wf-ion-android-bus:before{content:""}.wf-ion-android-calendar:before{content:""}.wf-ion-android-call:before{content:""}.wf-ion-android-camera:before{content:""}.wf-ion-android-cancel:before{content:""}.wf-ion-android-car:before{content:""}.wf-ion-android-cart:before{content:""}.wf-ion-android-chat:before{content:""}.wf-ion-android-checkbox:before{content:""}.wf-ion-android-checkbox-blank:before{content:""}.wf-ion-android-checkbox-outline:before{content:""}.wf-ion-android-checkbox-outline-blank:before{content:""}.wf-ion-android-checkmark-circle:before{content:""}.wf-ion-android-clipboard:before{content:""}.wf-ion-android-close:before{content:""}.wf-ion-android-cloud:before{content:""}.wf-ion-android-cloud-circle:before{content:""}.wf-ion-android-cloud-done:before{content:""}.wf-ion-android-cloud-outline:before{content:""}.wf-ion-android-color-palette:before{content:""}.wf-ion-android-compass:before{content:""}.wf-ion-android-contact:before{content:""}.wf-ion-android-contacts:before{content:""}.wf-ion-android-contract:before{content:""}.wf-ion-android-create:before{content:""}.wf-ion-android-delete:before{content:""}.wf-ion-android-desktop:before{content:""}.wf-ion-android-document:before{content:""}.wf-ion-android-done:before{content:""}.wf-ion-android-done-all:before{content:""}.wf-ion-android-download:before{content:""}.wf-ion-android-drafts:before{content:""}.wf-ion-android-exit:before{content:""}.wf-ion-android-expand:before{content:""}.wf-ion-android-favorite:before{content:""}.wf-ion-android-favorite-outline:before{content:""}.wf-ion-android-film:before{content:""}.wf-ion-android-folder:before{content:""}.wf-ion-android-folder-open:before{content:""}.wf-ion-android-funnel:before{content:""}.wf-ion-android-globe:before{content:""}.wf-ion-android-hand:before{content:""}.wf-ion-android-hangout:before{content:""}.wf-ion-android-happy:before{content:""}.wf-ion-android-home:before{content:""}.wf-ion-android-image:before{content:""}.wf-ion-android-laptop:before{content:""}.wf-ion-android-list:before{content:""}.wf-ion-android-locate:before{content:""}.wf-ion-android-lock:before{content:""}.wf-ion-android-mail:before{content:""}.wf-ion-android-map:before{content:""}.wf-ion-android-menu:before{content:""}.wf-ion-android-microphone:before{content:""}.wf-ion-android-microphone-off:before{content:""}.wf-ion-android-more-horizontal:before{content:""}.wf-ion-android-more-vertical:before{content:""}.wf-ion-android-navigate:before{content:""}.wf-ion-android-notifications:before{content:""}.wf-ion-android-notifications-none:before{content:""}.wf-ion-android-notifications-off:before{content:""}.wf-ion-android-open:before{content:""}.wf-ion-android-options:before{content:""}.wf-ion-android-people:before{content:""}.wf-ion-android-person:before{content:""}.wf-ion-android-person-add:before{content:""}.wf-ion-android-phone-landscape:before{content:""}.wf-ion-android-phone-portrait:before{content:""}.wf-ion-android-pin:before{content:""}.wf-ion-android-plane:before{content:""}.wf-ion-android-playstore:before{content:""}.wf-ion-android-print:before{content:""}.wf-ion-android-radio-button-off:before{content:""}.wf-ion-android-radio-button-on:before{content:""}.wf-ion-android-refresh:before{content:""}.wf-ion-android-remove:before{content:""}.wf-ion-android-remove-circle:before{content:""}.wf-ion-android-restaurant:before{content:""}.wf-ion-android-sad:before{content:""}.wf-ion-android-search:before{content:""}.wf-ion-android-send:before{content:""}.wf-ion-android-settings:before{content:""}.wf-ion-android-share:before{content:""}.wf-ion-android-share-alt:before{content:""}.wf-ion-android-star:before{content:""}.wf-ion-android-star-half:before{content:""}.wf-ion-android-star-outline:before{content:""}.wf-ion-android-stopwatch:before{content:""}.wf-ion-android-subway:before{content:""}.wf-ion-android-sunny:before{content:""}.wf-ion-android-sync:before{content:""}.wf-ion-android-textsms:before{content:""}.wf-ion-android-time:before{content:""}.wf-ion-android-train:before{content:""}.wf-ion-android-unlock:before{content:""}.wf-ion-android-upload:before{content:""}.wf-ion-android-volume-down:before{content:""}.wf-ion-android-volume-mute:before{content:""}.wf-ion-android-volume-off:before{content:""}.wf-ion-android-volume-up:before{content:""}.wf-ion-android-walk:before{content:""}.wf-ion-android-warning:before{content:""}.wf-ion-android-watch:before{content:""}.wf-ion-android-wifi:before{content:""}.wf-ion-aperture:before{content:""}.wf-ion-archive:before{content:""}.wf-ion-arrow-down-a:before{content:""}.wf-ion-arrow-down-b:before{content:""}.wf-ion-arrow-down-c:before{content:""}.wf-ion-arrow-expand:before{content:""}.wf-ion-arrow-graph-down-left:before{content:""}.wf-ion-arrow-graph-down-right:before{content:""}.wf-ion-arrow-graph-up-left:before{content:""}.wf-ion-arrow-graph-up-right:before{content:""}.wf-ion-arrow-left-a:before{content:""}.wf-ion-arrow-left-b:before{content:""}.wf-ion-arrow-left-c:before{content:""}.wf-ion-arrow-move:before{content:""}.wf-ion-arrow-resize:before{content:""}.wf-ion-arrow-return-left:before{content:""}.wf-ion-arrow-return-right:before{content:""}.wf-ion-arrow-right-a:before{content:""}.wf-ion-arrow-right-b:before{content:""}.wf-ion-arrow-right-c:before{content:""}.wf-ion-arrow-shrink:before{content:""}.wf-ion-arrow-swap:before{content:""}.wf-ion-arrow-up-a:before{content:""}.wf-ion-arrow-up-b:before{content:""}.wf-ion-arrow-up-c:before{content:""}.wf-ion-asterisk:before{content:""}.wf-ion-at:before{content:""}.wf-ion-backspace:before{content:""}.wf-ion-backspace-outline:before{content:""}.wf-ion-bag:before{content:""}.wf-ion-battery-charging:before{content:""}.wf-ion-battery-empty:before{content:""}.wf-ion-battery-full:before{content:""}.wf-ion-battery-half:before{content:""}.wf-ion-battery-low:before{content:""}.wf-ion-beaker:before{content:""}.wf-ion-beer:before{content:""}.wf-ion-bluetooth:before{content:""}.wf-ion-bonfire:before{content:""}.wf-ion-bookmark:before{content:""}.wf-ion-bowtie:before{content:""}.wf-ion-briefcase:before{content:""}.wf-ion-bug:before{content:""}.wf-ion-calculator:before{content:""}.wf-ion-calendar:before{content:""}.wf-ion-camera:before{content:""}.wf-ion-card:before{content:""}.wf-ion-cash:before{content:""}.wf-ion-chatbox:before{content:""}.wf-ion-chatbox-working:before{content:""}.wf-ion-chatboxes:before{content:""}.wf-ion-chatbubble:before{content:""}.wf-ion-chatbubble-working:before{content:""}.wf-ion-chatbubbles:before{content:""}.wf-ion-checkmark:before{content:""}.wf-ion-checkmark-circled:before{content:""}.wf-ion-checkmark-round:before{content:""}.wf-ion-chevron-down:before{content:""}.wf-ion-chevron-left:before{content:""}.wf-ion-chevron-right:before{content:""}.wf-ion-chevron-up:before{content:""}.wf-ion-clipboard:before{content:""}.wf-ion-clock:before{content:""}.wf-ion-close:before{content:""}.wf-ion-close-circled:before{content:""}.wf-ion-close-round:before{content:""}.wf-ion-closed-captioning:before{content:""}.wf-ion-cloud:before{content:""}.wf-ion-code:before{content:""}.wf-ion-code-download:before{content:""}.wf-ion-code-working:before{content:""}.wf-ion-coffee:before{content:""}.wf-ion-compass:before{content:""}.wf-ion-compose:before{content:""}.wf-ion-connection-bars:before{content:""}.wf-ion-contrast:before{content:""}.wf-ion-crop:before{content:""}.wf-ion-cube:before{content:""}.wf-ion-disc:before{content:""}.wf-ion-document:before{content:""}.wf-ion-document-text:before{content:""}.wf-ion-drag:before{content:""}.wf-ion-earth:before{content:""}.wf-ion-easel:before{content:""}.wf-ion-edit:before{content:""}.wf-ion-egg:before{content:""}.wf-ion-eject:before{content:""}.wf-ion-email:before{content:""}.wf-ion-email-unread:before{content:""}.wf-ion-erlenmeyer-flask:before{content:""}.wf-ion-erlenmeyer-flask-bubbles:before{content:""}.wf-ion-eye:before{content:""}.wf-ion-eye-disabled:before{content:""}.wf-ion-female:before{content:""}.wf-ion-filing:before{content:""}.wf-ion-film-marker:before{content:""}.wf-ion-fireball:before{content:""}.wf-ion-flag:before{content:""}.wf-ion-flame:before{content:""}.wf-ion-flash:before{content:""}.wf-ion-flash-off:before{content:""}.wf-ion-folder:before{content:""}.wf-ion-fork:before{content:""}.wf-ion-fork-repo:before{content:""}.wf-ion-forward:before{content:""}.wf-ion-funnel:before{content:""}.wf-ion-gear-a:before{content:""}.wf-ion-gear-b:before{content:""}.wf-ion-grid:before{content:""}.wf-ion-hammer:before{content:""}.wf-ion-happy:before{content:""}.wf-ion-happy-outline:before{content:""}.wf-ion-headphone:before{content:""}.wf-ion-heart:before{content:""}.wf-ion-heart-broken:before{content:""}.wf-ion-help:before{content:""}.wf-ion-help-buoy:before{content:""}.wf-ion-help-circled:before{content:""}.wf-ion-home:before{content:""}.wf-ion-icecream:before{content:""}.wf-ion-image:before{content:""}.wf-ion-images:before{content:""}.wf-ion-information:before{content:""}.wf-ion-information-circled:before{content:""}.wf-ion-ionic:before{content:""}.wf-ion-ios-alarm:before{content:""}.wf-ion-ios-alarm-outline:before{content:""}.wf-ion-ios-albums:before{content:""}.wf-ion-ios-albums-outline:before{content:""}.wf-ion-ios-americanfootball:before{content:""}.wf-ion-ios-americanfootball-outline:before{content:""}.wf-ion-ios-analytics:before{content:""}.wf-ion-ios-analytics-outline:before{content:""}.wf-ion-ios-arrow-back:before{content:""}.wf-ion-ios-arrow-down:before{content:""}.wf-ion-ios-arrow-forward:before{content:""}.wf-ion-ios-arrow-left:before{content:""}.wf-ion-ios-arrow-right:before{content:""}.wf-ion-ios-arrow-thin-down:before{content:""}.wf-ion-ios-arrow-thin-left:before{content:""}.wf-ion-ios-arrow-thin-right:before{content:""}.wf-ion-ios-arrow-thin-up:before{content:""}.wf-ion-ios-arrow-up:before{content:""}.wf-ion-ios-at:before{content:""}.wf-ion-ios-at-outline:before{content:""}.wf-ion-ios-barcode:before{content:""}.wf-ion-ios-barcode-outline:before{content:""}.wf-ion-ios-baseball:before{content:""}.wf-ion-ios-baseball-outline:before{content:""}.wf-ion-ios-basketball:before{content:""}.wf-ion-ios-basketball-outline:before{content:""}.wf-ion-ios-bell:before{content:""}.wf-ion-ios-bell-outline:before{content:""}.wf-ion-ios-body:before{content:""}.wf-ion-ios-body-outline:before{content:""}.wf-ion-ios-bolt:before{content:""}.wf-ion-ios-bolt-outline:before{content:""}.wf-ion-ios-book:before{content:""}.wf-ion-ios-book-outline:before{content:""}.wf-ion-ios-bookmarks:before{content:""}.wf-ion-ios-bookmarks-outline:before{content:""}.wf-ion-ios-box:before{content:""}.wf-ion-ios-box-outline:before{content:""}.wf-ion-ios-briefcase:before{content:""}.wf-ion-ios-briefcase-outline:before{content:""}.wf-ion-ios-browsers:before{content:""}.wf-ion-ios-browsers-outline:before{content:""}.wf-ion-ios-calculator:before{content:""}.wf-ion-ios-calculator-outline:before{content:""}.wf-ion-ios-calendar:before{content:""}.wf-ion-ios-calendar-outline:before{content:""}.wf-ion-ios-camera:before{content:""}.wf-ion-ios-camera-outline:before{content:""}.wf-ion-ios-cart:before{content:""}.wf-ion-ios-cart-outline:before{content:""}.wf-ion-ios-chatboxes:before{content:""}.wf-ion-ios-chatboxes-outline:before{content:""}.wf-ion-ios-chatbubble:before{content:""}.wf-ion-ios-chatbubble-outline:before{content:""}.wf-ion-ios-checkmark:before{content:""}.wf-ion-ios-checkmark-empty:before{content:""}.wf-ion-ios-checkmark-outline:before{content:""}.wf-ion-ios-circle-filled:before{content:""}.wf-ion-ios-circle-outline:before{content:""}.wf-ion-ios-clock:before{content:""}.wf-ion-ios-clock-outline:before{content:""}.wf-ion-ios-close:before{content:""}.wf-ion-ios-close-empty:before{content:""}.wf-ion-ios-close-outline:before{content:""}.wf-ion-ios-cloud:before{content:""}.wf-ion-ios-cloud-download:before{content:""}.wf-ion-ios-cloud-download-outline:before{content:""}.wf-ion-ios-cloud-outline:before{content:""}.wf-ion-ios-cloud-upload:before{content:""}.wf-ion-ios-cloud-upload-outline:before{content:""}.wf-ion-ios-cloudy:before{content:""}.wf-ion-ios-cloudy-night:before{content:""}.wf-ion-ios-cloudy-night-outline:before{content:""}.wf-ion-ios-cloudy-outline:before{content:""}.wf-ion-ios-cog:before{content:""}.wf-ion-ios-cog-outline:before{content:""}.wf-ion-ios-color-filter:before{content:""}.wf-ion-ios-color-filter-outline:before{content:""}.wf-ion-ios-color-wand:before{content:""}.wf-ion-ios-color-wand-outline:before{content:""}.wf-ion-ios-compose:before{content:""}.wf-ion-ios-compose-outline:before{content:""}.wf-ion-ios-contact:before{content:""}.wf-ion-ios-contact-outline:before{content:""}.wf-ion-ios-copy:before{content:""}.wf-ion-ios-copy-outline:before{content:""}.wf-ion-ios-crop:before{content:""}.wf-ion-ios-crop-strong:before{content:""}.wf-ion-ios-download:before{content:""}.wf-ion-ios-download-outline:before{content:""}.wf-ion-ios-drag:before{content:""}.wf-ion-ios-email:before{content:""}.wf-ion-ios-email-outline:before{content:""}.wf-ion-ios-eye:before{content:""}.wf-ion-ios-eye-outline:before{content:""}.wf-ion-ios-fastforward:before{content:""}.wf-ion-ios-fastforward-outline:before{content:""}.wf-ion-ios-filing:before{content:""}.wf-ion-ios-filing-outline:before{content:""}.wf-ion-ios-film:before{content:""}.wf-ion-ios-film-outline:before{content:""}.wf-ion-ios-flag:before{content:""}.wf-ion-ios-flag-outline:before{content:""}.wf-ion-ios-flame:before{content:""}.wf-ion-ios-flame-outline:before{content:""}.wf-ion-ios-flask:before{content:""}.wf-ion-ios-flask-outline:before{content:""}.wf-ion-ios-flower:before{content:""}.wf-ion-ios-flower-outline:before{content:""}.wf-ion-ios-folder:before{content:""}.wf-ion-ios-folder-outline:before{content:""}.wf-ion-ios-football:before{content:""}.wf-ion-ios-football-outline:before{content:""}.wf-ion-ios-game-controller-a:before{content:""}.wf-ion-ios-game-controller-a-outline:before{content:""}.wf-ion-ios-game-controller-b:before{content:""}.wf-ion-ios-game-controller-b-outline:before{content:""}.wf-ion-ios-gear:before{content:""}.wf-ion-ios-gear-outline:before{content:""}.wf-ion-ios-glasses:before{content:""}.wf-ion-ios-glasses-outline:before{content:""}.wf-ion-ios-grid-view:before{content:""}.wf-ion-ios-grid-view-outline:before{content:""}.wf-ion-ios-heart:before{content:""}.wf-ion-ios-heart-outline:before{content:""}.wf-ion-ios-help:before{content:""}.wf-ion-ios-help-empty:before{content:""}.wf-ion-ios-help-outline:before{content:""}.wf-ion-ios-home:before{content:""}.wf-ion-ios-home-outline:before{content:""}.wf-ion-ios-infinite:before{content:""}.wf-ion-ios-infinite-outline:before{content:""}.wf-ion-ios-information:before{content:""}.wf-ion-ios-information-empty:before{content:""}.wf-ion-ios-information-outline:before{content:""}.wf-ion-ios-ionic-outline:before{content:""}.wf-ion-ios-keypad:before{content:""}.wf-ion-ios-keypad-outline:before{content:""}.wf-ion-ios-lightbulb:before{content:""}.wf-ion-ios-lightbulb-outline:before{content:""}.wf-ion-ios-list:before{content:""}.wf-ion-ios-list-outline:before{content:""}.wf-ion-ios-location:before{content:""}.wf-ion-ios-location-outline:before{content:""}.wf-ion-ios-locked:before{content:""}.wf-ion-ios-locked-outline:before{content:""}.wf-ion-ios-loop:before{content:""}.wf-ion-ios-loop-strong:before{content:""}.wf-ion-ios-medical:before{content:""}.wf-ion-ios-medical-outline:before{content:""}.wf-ion-ios-medkit:before{content:""}.wf-ion-ios-medkit-outline:before{content:""}.wf-ion-ios-mic:before{content:""}.wf-ion-ios-mic-off:before{content:""}.wf-ion-ios-mic-outline:before{content:""}.wf-ion-ios-minus:before{content:""}.wf-ion-ios-minus-empty:before{content:""}.wf-ion-ios-minus-outline:before{content:""}.wf-ion-ios-monitor:before{content:""}.wf-ion-ios-monitor-outline:before{content:""}.wf-ion-ios-moon:before{content:""}.wf-ion-ios-moon-outline:before{content:""}.wf-ion-ios-more:before{content:""}.wf-ion-ios-more-outline:before{content:""}.wf-ion-ios-musical-note:before{content:""}.wf-ion-ios-musical-notes:before{content:""}.wf-ion-ios-navigate:before{content:""}.wf-ion-ios-navigate-outline:before{content:""}.wf-ion-ios-nutrition:before{content:""}.wf-ion-ios-nutrition-outline:before{content:""}.wf-ion-ios-paper:before{content:""}.wf-ion-ios-paper-outline:before{content:""}.wf-ion-ios-paperplane:before{content:""}.wf-ion-ios-paperplane-outline:before{content:""}.wf-ion-ios-partlysunny:before{content:""}.wf-ion-ios-partlysunny-outline:before{content:""}.wf-ion-ios-pause:before{content:""}.wf-ion-ios-pause-outline:before{content:""}.wf-ion-ios-paw:before{content:""}.wf-ion-ios-paw-outline:before{content:""}.wf-ion-ios-people:before{content:""}.wf-ion-ios-people-outline:before{content:""}.wf-ion-ios-person:before{content:""}.wf-ion-ios-person-outline:before{content:""}.wf-ion-ios-personadd:before{content:""}.wf-ion-ios-personadd-outline:before{content:""}.wf-ion-ios-photos:before{content:""}.wf-ion-ios-photos-outline:before{content:""}.wf-ion-ios-pie:before{content:""}.wf-ion-ios-pie-outline:before{content:""}.wf-ion-ios-pint:before{content:""}.wf-ion-ios-pint-outline:before{content:""}.wf-ion-ios-play:before{content:""}.wf-ion-ios-play-outline:before{content:""}.wf-ion-ios-plus:before{content:""}.wf-ion-ios-plus-empty:before{content:""}.wf-ion-ios-plus-outline:before{content:""}.wf-ion-ios-pricetag:before{content:""}.wf-ion-ios-pricetag-outline:before{content:""}.wf-ion-ios-pricetags:before{content:""}.wf-ion-ios-pricetags-outline:before{content:""}.wf-ion-ios-printer:before{content:""}.wf-ion-ios-printer-outline:before{content:""}.wf-ion-ios-pulse:before{content:""}.wf-ion-ios-pulse-strong:before{content:""}.wf-ion-ios-rainy:before{content:""}.wf-ion-ios-rainy-outline:before{content:""}.wf-ion-ios-recording:before{content:""}.wf-ion-ios-recording-outline:before{content:""}.wf-ion-ios-redo:before{content:""}.wf-ion-ios-redo-outline:before{content:""}.wf-ion-ios-refresh:before{content:""}.wf-ion-ios-refresh-empty:before{content:""}.wf-ion-ios-refresh-outline:before{content:""}.wf-ion-ios-reload:before{content:""}.wf-ion-ios-reverse-camera:before{content:""}.wf-ion-ios-reverse-camera-outline:before{content:""}.wf-ion-ios-rewind:before{content:""}.wf-ion-ios-rewind-outline:before{content:""}.wf-ion-ios-rose:before{content:""}.wf-ion-ios-rose-outline:before{content:""}.wf-ion-ios-search:before{content:""}.wf-ion-ios-search-strong:before{content:""}.wf-ion-ios-settings:before{content:""}.wf-ion-ios-settings-strong:before{content:""}.wf-ion-ios-shuffle:before{content:""}.wf-ion-ios-shuffle-strong:before{content:""}.wf-ion-ios-skipbackward:before{content:""}.wf-ion-ios-skipbackward-outline:before{content:""}.wf-ion-ios-skipforward:before{content:""}.wf-ion-ios-skipforward-outline:before{content:""}.wf-ion-ios-snowy:before{content:""}.wf-ion-ios-speedometer:before{content:""}.wf-ion-ios-speedometer-outline:before{content:""}.wf-ion-ios-star:before{content:""}.wf-ion-ios-star-half:before{content:""}.wf-ion-ios-star-outline:before{content:""}.wf-ion-ios-stopwatch:before{content:""}.wf-ion-ios-stopwatch-outline:before{content:""}.wf-ion-ios-sunny:before{content:""}.wf-ion-ios-sunny-outline:before{content:""}.wf-ion-ios-telephone:before{content:""}.wf-ion-ios-telephone-outline:before{content:""}.wf-ion-ios-tennisball:before{content:""}.wf-ion-ios-tennisball-outline:before{content:""}.wf-ion-ios-thunderstorm:before{content:""}.wf-ion-ios-thunderstorm-outline:before{content:""}.wf-ion-ios-time:before{content:""}.wf-ion-ios-time-outline:before{content:""}.wf-ion-ios-timer:before{content:""}.wf-ion-ios-timer-outline:before{content:""}.wf-ion-ios-toggle:before{content:""}.wf-ion-ios-toggle-outline:before{content:""}.wf-ion-ios-trash:before{content:""}.wf-ion-ios-trash-outline:before{content:""}.wf-ion-ios-undo:before{content:""}.wf-ion-ios-undo-outline:before{content:""}.wf-ion-ios-unlocked:before{content:""}.wf-ion-ios-unlocked-outline:before{content:""}.wf-ion-ios-upload:before{content:""}.wf-ion-ios-upload-outline:before{content:""}.wf-ion-ios-videocam:before{content:""}.wf-ion-ios-videocam-outline:before{content:""}.wf-ion-ios-volume-high:before{content:""}.wf-ion-ios-volume-low:before{content:""}.wf-ion-ios-wineglass:before{content:""}.wf-ion-ios-wineglass-outline:before{content:""}.wf-ion-ios-world:before{content:""}.wf-ion-ios-world-outline:before{content:""}.wf-ion-ipad:before{content:""}.wf-ion-iphone:before{content:""}.wf-ion-ipod:before{content:""}.wf-ion-jet:before{content:""}.wf-ion-key:before{content:""}.wf-ion-knife:before{content:""}.wf-ion-laptop:before{content:""}.wf-ion-leaf:before{content:""}.wf-ion-levels:before{content:""}.wf-ion-lightbulb:before{content:""}.wf-ion-link:before{content:""}.wf-ion-load-a:before{content:""}.wf-ion-load-b:before{content:""}.wf-ion-load-c:before{content:""}.wf-ion-load-d:before{content:""}.wf-ion-location:before{content:""}.wf-ion-lock-combination:before{content:""}.wf-ion-locked:before{content:""}.wf-ion-log-in:before{content:""}.wf-ion-log-out:before{content:""}.wf-ion-loop:before{content:""}.wf-ion-magnet:before{content:""}.wf-ion-male:before{content:""}.wf-ion-man:before{content:""}.wf-ion-map:before{content:""}.wf-ion-medkit:before{content:""}.wf-ion-merge:before{content:""}.wf-ion-mic-a:before{content:""}.wf-ion-mic-b:before{content:""}.wf-ion-mic-c:before{content:""}.wf-ion-minus:before{content:""}.wf-ion-minus-circled:before{content:""}.wf-ion-minus-round:before{content:""}.wf-ion-model-s:before{content:""}.wf-ion-monitor:before{content:""}.wf-ion-more:before{content:""}.wf-ion-mouse:before{content:""}.wf-ion-music-note:before{content:""}.wf-ion-navicon:before{content:""}.wf-ion-navicon-round:before{content:""}.wf-ion-navigate:before{content:""}.wf-ion-network:before{content:""}.wf-ion-no-smoking:before{content:""}.wf-ion-nuclear:before{content:""}.wf-ion-outlet:before{content:""}.wf-ion-paintbrush:before{content:""}.wf-ion-paintbucket:before{content:""}.wf-ion-paper-airplane:before{content:""}.wf-ion-paperclip:before{content:""}.wf-ion-pause:before{content:""}.wf-ion-person:before{content:""}.wf-ion-person-add:before{content:""}.wf-ion-person-stalker:before{content:""}.wf-ion-pie-graph:before{content:""}.wf-ion-pin:before{content:""}.wf-ion-pinpoint:before{content:""}.wf-ion-pizza:before{content:""}.wf-ion-plane:before{content:""}.wf-ion-planet:before{content:""}.wf-ion-play:before{content:""}.wf-ion-playstation:before{content:""}.wf-ion-plus:before{content:""}.wf-ion-plus-circled:before{content:""}.wf-ion-plus-round:before{content:""}.wf-ion-podium:before{content:""}.wf-ion-pound:before{content:""}.wf-ion-power:before{content:""}.wf-ion-pricetag:before{content:""}.wf-ion-pricetags:before{content:""}.wf-ion-printer:before{content:""}.wf-ion-pull-request:before{content:""}.wf-ion-qr-scanner:before{content:""}.wf-ion-quote:before{content:""}.wf-ion-radio-waves:before{content:""}.wf-ion-record:before{content:""}.wf-ion-refresh:before{content:""}.wf-ion-reply:before{content:""}.wf-ion-reply-all:before{content:""}.wf-ion-ribbon-a:before{content:""}.wf-ion-ribbon-b:before{content:""}.wf-ion-sad:before{content:""}.wf-ion-sad-outline:before{content:""}.wf-ion-scissors:before{content:""}.wf-ion-search:before{content:""}.wf-ion-settings:before{content:""}.wf-ion-share:before{content:""}.wf-ion-shuffle:before{content:""}.wf-ion-skip-backward:before{content:""}.wf-ion-skip-forward:before{content:""}.wf-ion-social-android:before{content:""}.wf-ion-social-android-outline:before{content:""}.wf-ion-social-angular:before{content:""}.wf-ion-social-angular-outline:before{content:""}.wf-ion-social-apple:before{content:""}.wf-ion-social-apple-outline:before{content:""}.wf-ion-social-bitcoin:before{content:""}.wf-ion-social-bitcoin-outline:before{content:""}.wf-ion-social-buffer:before{content:""}.wf-ion-social-buffer-outline:before{content:""}.wf-ion-social-chrome:before{content:""}.wf-ion-social-chrome-outline:before{content:""}.wf-ion-social-codepen:before{content:""}.wf-ion-social-codepen-outline:before{content:""}.wf-ion-social-css3:before{content:""}.wf-ion-social-css3-outline:before{content:""}.wf-ion-social-designernews:before{content:""}.wf-ion-social-designernews-outline:before{content:""}.wf-ion-social-dribbble:before{content:""}.wf-ion-social-dribbble-outline:before{content:""}.wf-ion-social-dropbox:before{content:""}.wf-ion-social-dropbox-outline:before{content:""}.wf-ion-social-euro:before{content:""}.wf-ion-social-euro-outline:before{content:""}.wf-ion-social-facebook:before{content:""}.wf-ion-social-facebook-outline:before{content:""}.wf-ion-social-foursquare:before{content:""}.wf-ion-social-foursquare-outline:before{content:""}.wf-ion-social-freebsd-devil:before{content:""}.wf-ion-social-github:before{content:""}.wf-ion-social-github-outline:before{content:""}.wf-ion-social-google:before{content:""}.wf-ion-social-google-outline:before{content:""}.wf-ion-social-googleplus:before{content:""}.wf-ion-social-googleplus-outline:before{content:""}.wf-ion-social-hackernews:before{content:""}.wf-ion-social-hackernews-outline:before{content:""}.wf-ion-social-html5:before{content:""}.wf-ion-social-html5-outline:before{content:""}.wf-ion-social-instagram:before{content:""}.wf-ion-social-instagram-outline:before{content:""}.wf-ion-social-javascript:before{content:""}.wf-ion-social-javascript-outline:before{content:""}.wf-ion-social-linkedin:before{content:""}.wf-ion-social-linkedin-outline:before{content:""}.wf-ion-social-markdown:before{content:""}.wf-ion-social-nodejs:before{content:""}.wf-ion-social-octocat:before{content:""}.wf-ion-social-pinterest:before{content:""}.wf-ion-social-pinterest-outline:before{content:""}.wf-ion-social-python:before{content:""}.wf-ion-social-reddit:before{content:""}.wf-ion-social-reddit-outline:before{content:""}.wf-ion-social-rss:before{content:""}.wf-ion-social-rss-outline:before{content:""}.wf-ion-social-sass:before{content:""}.wf-ion-social-skype:before{content:""}.wf-ion-social-skype-outline:before{content:""}.wf-ion-social-snapchat:before{content:""}.wf-ion-social-snapchat-outline:before{content:""}.wf-ion-social-tumblr:before{content:""}.wf-ion-social-tumblr-outline:before{content:""}.wf-ion-social-tux:before{content:""}.wf-ion-social-twitch:before{content:""}.wf-ion-social-twitch-outline:before{content:""}.wf-ion-social-twitter:before{content:""}.wf-ion-social-twitter-outline:before{content:""}.wf-ion-social-usd:before{content:""}.wf-ion-social-usd-outline:before{content:""}.wf-ion-social-vimeo:before{content:""}.wf-ion-social-vimeo-outline:before{content:""}.wf-ion-social-whatsapp:before{content:""}.wf-ion-social-whatsapp-outline:before{content:""}.wf-ion-social-windows:before{content:""}.wf-ion-social-windows-outline:before{content:""}.wf-ion-social-wordpress:before{content:""}.wf-ion-social-wordpress-outline:before{content:""}.wf-ion-social-yahoo:before{content:""}.wf-ion-social-yahoo-outline:before{content:""}.wf-ion-social-yen:before{content:""}.wf-ion-social-yen-outline:before{content:""}.wf-ion-social-youtube:before{content:""}.wf-ion-social-youtube-outline:before{content:""}.wf-ion-soup-can:before{content:""}.wf-ion-soup-can-outline:before{content:""}.wf-ion-speakerphone:before{content:""}.wf-ion-speedometer:before{content:""}.wf-ion-spoon:before{content:""}.wf-ion-star:before{content:""}.wf-ion-stats-bars:before{content:""}.wf-ion-steam:before{content:""}.wf-ion-stop:before{content:""}.wf-ion-thermometer:before{content:""}.wf-ion-thumbsdown:before{content:""}.wf-ion-thumbsup:before{content:""}.wf-ion-toggle:before{content:""}.wf-ion-toggle-filled:before{content:""}.wf-ion-transgender:before{content:""}.wf-ion-trash-a:before{content:""}.wf-ion-trash-b:before{content:""}.wf-ion-trophy:before{content:""}.wf-ion-tshirt:before{content:""}.wf-ion-tshirt-outline:before{content:""}.wf-ion-umbrella:before{content:""}.wf-ion-university:before{content:""}.wf-ion-unlocked:before{content:""}.wf-ion-upload:before{content:""}.wf-ion-usb:before{content:""}.wf-ion-videocamera:before{content:""}.wf-ion-volume-high:before{content:""}.wf-ion-volume-low:before{content:""}.wf-ion-volume-medium:before{content:""}.wf-ion-volume-mute:before{content:""}.wf-ion-wand:before{content:""}.wf-ion-waterdrop:before{content:""}.wf-ion-wifi:before{content:""}.wf-ion-wineglass:before{content:""}.wf-ion-woman:before{content:""}.wf-ion-wrench:before{content:""}.wf-ion-xbox:before{content:""}
|
css/wordfenceBox.css
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
ColorBox Core Style:
|
3 |
The following CSS is consistent between example themes and should not be altered.
|
4 |
*/
|
5 |
-
#wordfenceBox, #wfboxOverlay, #wfboxWrapper{position:absolute; top:0; left:0; z-index:
|
6 |
#wfboxOverlay{position:fixed; width:100%; height:100%;}
|
7 |
#wfboxMiddleLeft, #wfboxBottomLeft{clear:left;}
|
8 |
#wfboxContent{position:relative;}
|
2 |
ColorBox Core Style:
|
3 |
The following CSS is consistent between example themes and should not be altered.
|
4 |
*/
|
5 |
+
#wordfenceBox, #wfboxOverlay, #wfboxWrapper{position:absolute; top:0; left:0; z-index:16777271; overflow:hidden;}
|
6 |
#wfboxOverlay{position:fixed; width:100%; height:100%;}
|
7 |
#wfboxMiddleLeft, #wfboxBottomLeft{clear:left;}
|
8 |
#wfboxContent{position:relative;}
|
fonts/ionicons.woff
ADDED
Binary file
|
js/admin.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
(function($) {
|
2 |
if (!window['wordfenceAdmin']) { //To compile for checking: java -jar /usr/local/bin/closure.jar --js=admin.js --js_output_file=test.js
|
3 |
window['wordfenceAdmin'] = {
|
|
|
4 |
loading16: '<div class="wfLoading16"></div>',
|
5 |
loadingCount: 0,
|
6 |
dbCheckTables: [],
|
@@ -46,6 +47,8 @@
|
|
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;
|
@@ -74,14 +77,14 @@
|
|
74 |
$('#doSendEmail').click(function() {
|
75 |
var ticket = $('#_ticketnumber').val();
|
76 |
if (ticket === null || typeof ticket === "undefined" || ticket.length == 0) {
|
77 |
-
self.colorbox('400px', "Error", "Please include your support ticket number or forum username.");
|
78 |
return;
|
79 |
}
|
80 |
WFAD.ajax('wordfence_sendDiagnostic', {email: $('#_email').val(), ticket: ticket}, function(res) {
|
81 |
if (res.result) {
|
82 |
-
self.colorbox('400px', "Email Diagnostic Report", "Diagnostic report has been sent successfully.");
|
83 |
} else {
|
84 |
-
self.colorbox('400px', "Error", "There was an error while sending the email.");
|
85 |
}
|
86 |
});
|
87 |
});
|
@@ -101,6 +104,7 @@
|
|
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 |
});
|
@@ -369,7 +373,7 @@
|
|
369 |
var self = this;
|
370 |
this.ajax('wordfence_sendTestEmail', {email: email}, function(res) {
|
371 |
if (res.result) {
|
372 |
-
self.colorbox('400px', "Test Email Sent", "Your test email was sent to the requested email address. The result we received from the WordPress wp_mail() function was: " +
|
373 |
res.result + "<br /><br />A 'True' result means WordPress thinks the mail was sent without errors. A 'False' result means that WordPress encountered an error sending your mail. Note that it's possible to get a 'True' response with an error elsewhere in your mail system that may cause emails to not be delivered.");
|
374 |
}
|
375 |
});
|
@@ -427,7 +431,7 @@
|
|
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();
|
@@ -860,9 +864,9 @@
|
|
860 |
var self = this;
|
861 |
this.ajax('wordfence_killScan', {}, function(res) {
|
862 |
if (res.ok) {
|
863 |
-
self.colorbox('400px', "Kill requested", "A termination request has been sent to any running scans.");
|
864 |
} else {
|
865 |
-
self.colorbox('400px', "Kill failed", "We failed to send a termination request.");
|
866 |
}
|
867 |
});
|
868 |
},
|
@@ -954,7 +958,7 @@
|
|
954 |
}
|
955 |
continue;
|
956 |
}
|
957 |
-
jQuery('#' + containerID).html('<table cellpadding="0" cellspacing="0" border="0" class="display" id="' + tableID + '"></table>');
|
958 |
|
959 |
jQuery.fn.dataTableExt.oSort['severity-asc'] = function(y, x) {
|
960 |
x = WFAD.sev2num(x);
|
@@ -988,19 +992,19 @@
|
|
988 |
//"aaData": res.issuesLists[issueStatus],
|
989 |
"aoColumns": [
|
990 |
{
|
991 |
-
"sTitle": '<div class="th_wrapp">Severity</div>',
|
992 |
-
"sWidth": '128px',
|
993 |
-
"sClass": "center",
|
994 |
"sType": 'severity',
|
995 |
"fnRender": function(obj) {
|
996 |
var cls = 'wfProbSev' + obj.aData.severity;
|
997 |
-
return '<span class="' + cls + '"></span>';
|
998 |
}
|
999 |
},
|
1000 |
{
|
1001 |
"sTitle": '<div class="th_wrapp">Issue</div>',
|
1002 |
"bSortable": false,
|
1003 |
-
"sWidth": '400px',
|
1004 |
"sType": 'html',
|
1005 |
fnRender: function(obj) {
|
1006 |
var issueType = (obj.aData.type == 'knownfile' ? 'file' : obj.aData.type);
|
@@ -1076,7 +1080,7 @@
|
|
1076 |
self.nonce = json.nonce;
|
1077 |
}
|
1078 |
if (json && json.errorMsg) {
|
1079 |
-
self.colorbox('400px', 'An error occurred', json.errorMsg);
|
1080 |
}
|
1081 |
cb(json);
|
1082 |
},
|
@@ -1122,10 +1126,10 @@
|
|
1122 |
jQuery.colorbox.close();
|
1123 |
},
|
1124 |
scanRunningMsg: function() {
|
1125 |
-
this.colorbox('400px', "A scan is running", "A scan is currently in progress. Please wait until it finishes before starting another scan.");
|
1126 |
},
|
1127 |
errorMsg: function(msg) {
|
1128 |
-
this.colorbox('400px', "An error occurred:", msg);
|
1129 |
},
|
1130 |
bulkOperation: function(op) {
|
1131 |
var self = this;
|
@@ -1134,13 +1138,13 @@
|
|
1134 |
return jQuery(this).val();
|
1135 |
}).get();
|
1136 |
if (ids.length < 1) {
|
1137 |
-
this.colorbox('400px', "No files were selected", "You need to select files to perform a bulk operation. There is a checkbox in each issue that lets you select that file. You can then select a bulk operation and hit the button to perform that bulk operation.");
|
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;
|
@@ -1162,7 +1166,7 @@
|
|
1162 |
var self = this;
|
1163 |
if (res.ok) {
|
1164 |
this.loadIssues(function() {
|
1165 |
-
self.colorbox('400px', res.bulkHeading, res.bulkBody);
|
1166 |
});
|
1167 |
} else {
|
1168 |
this.loadIssues(function() {
|
@@ -1187,11 +1191,11 @@
|
|
1187 |
var self = this;
|
1188 |
if (res.ok) {
|
1189 |
this.loadIssues(function() {
|
1190 |
-
self.colorbox('400px', "Success deleting file", "The file " + res.file + " was successfully deleted.");
|
1191 |
});
|
1192 |
} else if (res.cerrorMsg) {
|
1193 |
this.loadIssues(function() {
|
1194 |
-
self.colorbox('400px', 'An error occurred', res.cerrorMsg);
|
1195 |
});
|
1196 |
}
|
1197 |
},
|
@@ -1208,11 +1212,11 @@
|
|
1208 |
var self = this;
|
1209 |
if (res.ok) {
|
1210 |
this.loadIssues(function() {
|
1211 |
-
self.colorbox('400px', "Success removing option", "The option " + res.option_name + " was successfully removed.");
|
1212 |
});
|
1213 |
} else if (res.cerrorMsg) {
|
1214 |
this.loadIssues(function() {
|
1215 |
-
self.colorbox('400px', 'An error occurred', res.cerrorMsg);
|
1216 |
});
|
1217 |
}
|
1218 |
},
|
@@ -1226,11 +1230,11 @@
|
|
1226 |
jQuery('#wordfenceMisconfiguredHowGetIPsNotice').fadeOut();
|
1227 |
|
1228 |
self.loadIssues(function() {
|
1229 |
-
self.colorbox('400px', "Success updating option", "The 'How does Wordfence get IPs' option was successfully updated to the recommended value.");
|
1230 |
});
|
1231 |
} else if (res.cerrorMsg) {
|
1232 |
self.loadIssues(function() {
|
1233 |
-
self.colorbox('400px', 'An error occurred', res.cerrorMsg);
|
1234 |
});
|
1235 |
}
|
1236 |
});
|
@@ -1242,13 +1246,13 @@
|
|
1242 |
|
1243 |
this.ajax('wordfence_checkHtaccess', {}, function(res) {
|
1244 |
if (res.ok) {
|
1245 |
-
self.colorbox(
|
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(
|
1250 |
} else if (res.err) {
|
1251 |
-
self.colorbox('400px', "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
|
1252 |
}
|
1253 |
});
|
1254 |
},
|
@@ -1260,11 +1264,11 @@
|
|
1260 |
}, function(res) {
|
1261 |
if (res.ok) {
|
1262 |
self.loadIssues(function() {
|
1263 |
-
self.colorbox(
|
1264 |
});
|
1265 |
} else {
|
1266 |
self.loadIssues(function() {
|
1267 |
-
self.colorbox('400px', 'An error occurred', res.cerrorMsg);
|
1268 |
});
|
1269 |
}
|
1270 |
});
|
@@ -1274,7 +1278,7 @@
|
|
1274 |
var self = this;
|
1275 |
return function(res) {
|
1276 |
if (res.ok) {
|
1277 |
-
self.colorbox(
|
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" />'
|
@@ -1286,9 +1290,9 @@
|
|
1286 |
self[callback](issueID);
|
1287 |
});
|
1288 |
} else if (res.nginx) {
|
1289 |
-
self.colorbox(
|
1290 |
} else if (res.err) {
|
1291 |
-
self.colorbox('400px', "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
|
1292 |
}
|
1293 |
};
|
1294 |
},
|
@@ -1301,9 +1305,9 @@
|
|
1301 |
jQuery.colorbox.close();
|
1302 |
self.loadIssues(function() {
|
1303 |
if (res.ok) {
|
1304 |
-
self.colorbox(
|
1305 |
} else {
|
1306 |
-
self.colorbox(
|
1307 |
}
|
1308 |
});
|
1309 |
});
|
@@ -1333,11 +1337,11 @@
|
|
1333 |
var self = this;
|
1334 |
if (res.ok) {
|
1335 |
this.loadIssues(function() {
|
1336 |
-
self.colorbox(
|
1337 |
});
|
1338 |
} else if (res.cerrorMsg) {
|
1339 |
this.loadIssues(function() {
|
1340 |
-
self.colorbox('400px', 'An error occurred', res.cerrorMsg);
|
1341 |
});
|
1342 |
}
|
1343 |
},
|
@@ -1349,17 +1353,17 @@
|
|
1349 |
|
1350 |
this.ajax('wordfence_checkHtaccess', {}, function(res) {
|
1351 |
if (res.ok) {
|
1352 |
-
self.colorbox(
|
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. " +
|
1360 |
"See the <a target='_blank' href='http://nginx.org/en/docs/http/ngx_http_autoindex_module.html'>Nginx docs for more info</a> on how to do this.");
|
1361 |
} else if (res.err) {
|
1362 |
-
self.colorbox('400px', "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
|
1363 |
}
|
1364 |
});
|
1365 |
},
|
@@ -1371,7 +1375,7 @@
|
|
1371 |
}, function(res) {
|
1372 |
if (res.ok) {
|
1373 |
self.loadIssues(function() {
|
1374 |
-
self.colorbox(
|
1375 |
});
|
1376 |
} else {
|
1377 |
//self.loadIssues(function() {
|
@@ -1407,7 +1411,7 @@
|
|
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,7 +1464,7 @@
|
|
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,7 +1476,7 @@
|
|
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 |
},
|
@@ -2031,10 +2035,10 @@
|
|
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');
|
@@ -2042,7 +2046,7 @@
|
|
2042 |
} else if (res.errorMsg) {
|
2043 |
return;
|
2044 |
} else {
|
2045 |
-
self.colorbox('400px', 'An error occurred', 'We encountered an error trying to save your changes.');
|
2046 |
}
|
2047 |
});
|
2048 |
},
|
@@ -2062,7 +2066,7 @@
|
|
2062 |
} else if (res.errorMsg) {
|
2063 |
return;
|
2064 |
} else {
|
2065 |
-
self.colorbox('400px', 'An error occurred', 'We encountered an error trying to save your changes.');
|
2066 |
}
|
2067 |
});
|
2068 |
},
|
@@ -2078,7 +2082,7 @@
|
|
2078 |
} else if (res.errorMsg) {
|
2079 |
return;
|
2080 |
} else {
|
2081 |
-
self.colorbox('400px', 'An error occurred', 'We encountered an error trying to save your changes.');
|
2082 |
}
|
2083 |
});
|
2084 |
},
|
@@ -2103,7 +2107,7 @@
|
|
2103 |
} else {
|
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 |
},
|
@@ -2119,7 +2123,7 @@
|
|
2119 |
loadBlockedCountries: function(str) {
|
2120 |
var codes = str.split(',');
|
2121 |
for (var i = 0; i < codes.length; i++) {
|
2122 |
-
jQuery('#wfCountryCheckbox_' + codes[i]).
|
2123 |
}
|
2124 |
},
|
2125 |
saveCountryBlocking: function() {
|
@@ -2130,16 +2134,16 @@
|
|
2130 |
var bypassViewURL = jQuery('#wfBypassViewURL').val();
|
2131 |
|
2132 |
if (action == 'redir' && (!/^https?:\/\/[^\/]+/i.test(redirURL))) {
|
2133 |
-
this.colorbox('400px', "Please enter a URL for redirection", "You have chosen to redirect blocked countries to a specific page. You need to enter a URL in the text box provided that starts with http:// or https://");
|
2134 |
return;
|
2135 |
}
|
2136 |
if (bypassRedirURL || bypassRedirDest) {
|
2137 |
if (!(bypassRedirURL && bypassRedirDest)) {
|
2138 |
-
this.colorbox('400px', "Missing data from form", "If you want to set up a URL that will bypass country blocking, you must enter a URL that a visitor can hit and the destination they will be redirected to. You have only entered one of these components. Please enter both.");
|
2139 |
return;
|
2140 |
}
|
2141 |
if (bypassRedirURL == bypassRedirDest) {
|
2142 |
-
this.colorbox('400px', "URLs are the same", "The URL that a user hits to bypass country blocking and the URL they are redirected to are the same. This would cause a circular redirect. Please fix this.");
|
2143 |
return;
|
2144 |
}
|
2145 |
}
|
@@ -2159,9 +2163,9 @@
|
|
2159 |
var codesArr = [];
|
2160 |
var ownCountryBlocked = false;
|
2161 |
var self = this;
|
2162 |
-
jQuery('.
|
2163 |
-
if (jQuery(elem).
|
2164 |
-
var code = jQuery(elem).
|
2165 |
codesArr.push(code);
|
2166 |
if (code == self.ownCountry) {
|
2167 |
ownCountryBlocked = true;
|
@@ -2170,14 +2174,14 @@
|
|
2170 |
});
|
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 |
}
|
2178 |
},
|
2179 |
invalidCountryURLMsg: function(URL) {
|
2180 |
-
this.colorbox('400px', "Invalid URL", "URL's that you provide for bypassing country blocking must start with '/' or 'http://' without quotes. The URL that is invalid is: " + this.htmlEscape(URL));
|
2181 |
return;
|
2182 |
},
|
2183 |
confirmSaveCountryBlocking: function() {
|
@@ -2223,7 +2227,7 @@
|
|
2223 |
},
|
2224 |
sched_shortcut: function(mode) {
|
2225 |
if (jQuery('#schedMode').val() == 'auto') {
|
2226 |
-
this.colorbox('400px', 'Change the scan mode', "You need to change the scan mode to manually scheduled scans if you want to select scan times.");
|
2227 |
return;
|
2228 |
}
|
2229 |
jQuery('.wfSchedCheckbox').prop('checked', false);
|
@@ -2314,7 +2318,7 @@
|
|
2314 |
var totpURL = "otpauth://totp/" + encodeURI(res.homeurl) + encodeURI(" (" + res.username + ")") + "?" + res.uriQueryString + "&issuer=Wordfence";
|
2315 |
self.twoFacStatus('User added! Scan the QR code with your authenticator app to add it.');
|
2316 |
|
2317 |
-
var message = "Scan the code below with your authenticator app to add this account. Some authenticator apps also allow you to type in the text version instead.<br><div id=\"wfTwoFactorQRCodeTable\"></div><br><strong>Key:</strong> <input type=\"text\" size=\"45\" value=\"" + res.base32Secret + "\" onclick=\"this.select();\" readonly>";
|
2318 |
if (res.recoveryCodes.length > 0) {
|
2319 |
message = message + "<br><br><strong>Recovery Codes</strong><br><p>Use one of these " + res.recoveryCodes.length + " codes to log in if you lose access to your authenticator device. Codes are 16 characters long, plus optional spaces. Each one may be used only once.</p><ul id=\"wfTwoFactorRecoveryCodes\">";
|
2320 |
|
@@ -2335,8 +2339,8 @@
|
|
2335 |
|
2336 |
message = message + "<p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
|
2337 |
|
2338 |
-
self.colorbox('440px', "Authentication Code", message, {onComplete: function() {
|
2339 |
-
jQuery('#wfTwoFactorQRCodeTable').qrcode({text: totpURL});
|
2340 |
jQuery('#wfTwoFactorDownload').on('click', function(e) {
|
2341 |
e.preventDefault();
|
2342 |
e.stopPropagation();
|
@@ -2364,8 +2368,7 @@
|
|
2364 |
|
2365 |
message = message + "</ul><p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
|
2366 |
|
2367 |
-
self.colorbox('400px', "Recovery Codes", message, {onComplete: function() {
|
2368 |
-
jQuery('#wfTwoFactorQRCodeTable').qrcode({text: totpURL});
|
2369 |
jQuery('#wfTwoFactorDownload').on('click', function(e) {
|
2370 |
e.preventDefault();
|
2371 |
e.stopPropagation();
|
@@ -2530,11 +2533,11 @@
|
|
2530 |
var self = this;
|
2531 |
this.ajax('wordfence_exportSettings', {}, function(res) {
|
2532 |
if (res.ok && res.token) {
|
2533 |
-
self.colorbox('400px', "Export Successful", "We successfully exported your site settings. To import your site settings on another site, copy and paste the token below into the import text box on the destination site. Keep this token secret. It is like a password. If anyone else discovers the token it will allow them to import your settings excluding your API key.<br /><br />Token:<input type=\"text\" size=\"20\" value=\"" + res.token + "\" onclick=\"this.select();\" /><br />");
|
2534 |
} else if (res.err) {
|
2535 |
-
self.colorbox('400px', "Error during Export", res.err);
|
2536 |
} else {
|
2537 |
-
self.colorbox('400px', "An unknown error occurred", "An unknown error occurred during the export. We received an undefined error from your web server.");
|
2538 |
}
|
2539 |
});
|
2540 |
},
|
@@ -2542,11 +2545,11 @@
|
|
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 {
|
2549 |
-
self.colorbox('400px', "Error during Export", "An unknown error occurred during the import");
|
2550 |
}
|
2551 |
});
|
2552 |
},
|
@@ -2555,9 +2558,9 @@
|
|
2555 |
this.ajax('wordfence_startPasswdAudit', {auditType: auditType, emailAddr: emailAddr}, function(res) {
|
2556 |
self.loadPasswdAuditJobs();
|
2557 |
if (res.ok) {
|
2558 |
-
self.colorbox('400px', "Password Audit Started", "Your password audit started successfully. The results will appear here once it is complete. You will also receive an email letting you know the results are ready at: " + emailAddr);
|
2559 |
} else if (!res.errorMsg) { //error displayed
|
2560 |
-
self.colorbox('400px', "Error Starting Audit", "An unknown error occurred when trying to start your password audit.");
|
2561 |
}
|
2562 |
});
|
2563 |
},
|
@@ -2569,12 +2572,12 @@
|
|
2569 |
}, function(res) {
|
2570 |
if (res.ok) {
|
2571 |
self.loadIssues(function() {
|
2572 |
-
self.colorbox('400px', "Successfully deleted admin", "The admin user " +
|
2573 |
self.htmlEscape(res.user_login) + " was successfully deleted.");
|
2574 |
});
|
2575 |
} else if (res.errorMsg) {
|
2576 |
self.loadIssues(function() {
|
2577 |
-
self.colorbox('400px', 'An error occurred', res.errorMsg);
|
2578 |
});
|
2579 |
}
|
2580 |
});
|
@@ -2587,12 +2590,12 @@
|
|
2587 |
}, function(res) {
|
2588 |
if (res.ok) {
|
2589 |
self.loadIssues(function() {
|
2590 |
-
self.colorbox('400px', "Successfully revoked admin", "All capabilties of admin user " +
|
2591 |
self.htmlEscape(res.user_login) + " were successfully revoked.");
|
2592 |
});
|
2593 |
} else if (res.errorMsg) {
|
2594 |
self.loadIssues(function() {
|
2595 |
-
self.colorbox('400px', 'An error occurred', res.errorMsg);
|
2596 |
});
|
2597 |
}
|
2598 |
});
|
@@ -2687,7 +2690,7 @@
|
|
2687 |
this.ajax('wordfence_saveWAFConfig', data, function(res) {
|
2688 |
if (typeof res === 'object' && res.success) {
|
2689 |
if (showColorBox) {
|
2690 |
-
self.colorbox('400px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
|
2691 |
'configuration was saved successfully.');
|
2692 |
}
|
2693 |
self.wafData = res.data;
|
@@ -2696,7 +2699,7 @@
|
|
2696 |
return onSuccess.apply(this, arguments);
|
2697 |
}
|
2698 |
} else {
|
2699 |
-
self.colorbox('400px', 'Error saving Firewall configuration', 'There was an error saving the ' +
|
2700 |
'Web Application Firewall configuration settings.');
|
2701 |
}
|
2702 |
});
|
@@ -2772,17 +2775,17 @@
|
|
2772 |
self.wafConfigPageRender();
|
2773 |
if (self.wafData['updated']) {
|
2774 |
if (!self.wafData['isPaid']) {
|
2775 |
-
self.colorbox('400px', 'Rules Updated', 'Your rules have been updated successfully. You are ' +
|
2776 |
'currently using the the free version of Wordfence. ' +
|
2777 |
'Upgrade to Wordfence premium to have your rules updated automatically as new threats emerge. ' +
|
2778 |
'<a href="https://www.wordfence.com/wafUpdateRules1/wordfence-signup/">Click here to purchase a premium API key</a>. ' +
|
2779 |
'<em>Note: Your rules will still update every 30 days as a free user.</em>');
|
2780 |
} else {
|
2781 |
-
self.colorbox('400px', 'Rules Updated', 'Your rules have been updated successfully.');
|
2782 |
}
|
2783 |
}
|
2784 |
else {
|
2785 |
-
self.colorbox('400px', 'Rule Update Failed', 'No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory.');
|
2786 |
}
|
2787 |
if (typeof onSuccess === 'function') {
|
2788 |
return onSuccess.apply(this, arguments);
|
@@ -2803,13 +2806,13 @@
|
|
2803 |
wafAddBootstrap: function() {
|
2804 |
var self = this;
|
2805 |
this.ajax('wordfence_wafAddBootstrap', {}, function(res) {
|
2806 |
-
self.colorbox('400px', 'File Created', "");
|
2807 |
});
|
2808 |
},
|
2809 |
|
2810 |
wafConfigureAutoPrepend: function() {
|
2811 |
var self = this;
|
2812 |
-
self.colorbox(
|
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 />' +
|
@@ -2819,7 +2822,7 @@
|
|
2819 |
confirmWAFConfigureAutoPrepend: function() {
|
2820 |
var self = this;
|
2821 |
this.ajax('wordfence_wafConfigureAutoPrepend', {}, function(res) {
|
2822 |
-
self.colorbox('400px', '.htaccess Updated', "Your .htaccess has been updated successfully. Please " +
|
2823 |
"verify your site is functioning normally.");
|
2824 |
});
|
2825 |
},
|
1 |
(function($) {
|
2 |
if (!window['wordfenceAdmin']) { //To compile for checking: java -jar /usr/local/bin/closure.jar --js=admin.js --js_output_file=test.js
|
3 |
window['wordfenceAdmin'] = {
|
4 |
+
isSmallScreen: false,
|
5 |
loading16: '<div class="wfLoading16"></div>',
|
6 |
loadingCount: 0,
|
7 |
dbCheckTables: [],
|
47 |
basePageName: '',
|
48 |
|
49 |
init: function() {
|
50 |
+
this.isSmallScreen = window.matchMedia("only screen and (max-width: 500px)").matches;
|
51 |
+
|
52 |
this.nonce = WordfenceAdminVars.firstNonce;
|
53 |
this.debugOn = WordfenceAdminVars.debugOn == '1' ? true : false;
|
54 |
this.tourClosed = WordfenceAdminVars.tourClosed == '1' ? true : false;
|
77 |
$('#doSendEmail').click(function() {
|
78 |
var ticket = $('#_ticketnumber').val();
|
79 |
if (ticket === null || typeof ticket === "undefined" || ticket.length == 0) {
|
80 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error", "Please include your support ticket number or forum username.");
|
81 |
return;
|
82 |
}
|
83 |
WFAD.ajax('wordfence_sendDiagnostic', {email: $('#_email').val(), ticket: ticket}, function(res) {
|
84 |
if (res.result) {
|
85 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Email Diagnostic Report", "Diagnostic report has been sent successfully.");
|
86 |
} else {
|
87 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error", "There was an error while sending the email.");
|
88 |
}
|
89 |
});
|
90 |
});
|
104 |
var tab = jQuery('#' + jQuery(this).attr('id').replace('-tab', ''));
|
105 |
tab.addClass('active');
|
106 |
jQuery('#wfHeading').html(tab.data('title'));
|
107 |
+
jQuery('#wordfenceTopTabsMobileTitle').text(jQuery(this).text());
|
108 |
document.title = tab.data('title') + " \u2039 " + self.basePageName;
|
109 |
self.sectionInit();
|
110 |
});
|
373 |
var self = this;
|
374 |
this.ajax('wordfence_sendTestEmail', {email: email}, function(res) {
|
375 |
if (res.result) {
|
376 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Test Email Sent", "Your test email was sent to the requested email address. The result we received from the WordPress wp_mail() function was: " +
|
377 |
res.result + "<br /><br />A 'True' result means WordPress thinks the mail was sent without errors. A 'False' result means that WordPress encountered an error sending your mail. Note that it's possible to get a 'True' response with an error elsewhere in your mail system that may cause emails to not be delivered.");
|
378 |
}
|
379 |
});
|
431 |
});
|
432 |
},
|
433 |
downgradeLicense: function() {
|
434 |
+
this.colorbox((this.isSmallScreen ? '300px' : '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 />");
|
435 |
},
|
436 |
downgradeLicenseConfirm: function() {
|
437 |
jQuery.colorbox.close();
|
864 |
var self = this;
|
865 |
this.ajax('wordfence_killScan', {}, function(res) {
|
866 |
if (res.ok) {
|
867 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Kill requested", "A termination request has been sent to any running scans.");
|
868 |
} else {
|
869 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Kill failed", "We failed to send a termination request.");
|
870 |
}
|
871 |
});
|
872 |
},
|
958 |
}
|
959 |
continue;
|
960 |
}
|
961 |
+
jQuery('#' + containerID).html('<table cellpadding="0" cellspacing="0" border="0" class="display wf-issues-table" id="' + tableID + '"></table>');
|
962 |
|
963 |
jQuery.fn.dataTableExt.oSort['severity-asc'] = function(y, x) {
|
964 |
x = WFAD.sev2num(x);
|
992 |
//"aaData": res.issuesLists[issueStatus],
|
993 |
"aoColumns": [
|
994 |
{
|
995 |
+
"sTitle": '<div class="th_wrapp wf-hidden-xs">Severity</div>',
|
996 |
+
//"sWidth": '128px',
|
997 |
+
"sClass": "center wf-scan-severity",
|
998 |
"sType": 'severity',
|
999 |
"fnRender": function(obj) {
|
1000 |
var cls = 'wfProbSev' + obj.aData.severity;
|
1001 |
+
return '<span class="wf-hidden-xs ' + cls + '"></span><div class="wf-visible-xs wf-scan-severity-' + obj.aData.severity + '"></div>';
|
1002 |
}
|
1003 |
},
|
1004 |
{
|
1005 |
"sTitle": '<div class="th_wrapp">Issue</div>',
|
1006 |
"bSortable": false,
|
1007 |
+
//"sWidth": '400px',
|
1008 |
"sType": 'html',
|
1009 |
fnRender: function(obj) {
|
1010 |
var issueType = (obj.aData.type == 'knownfile' ? 'file' : obj.aData.type);
|
1080 |
self.nonce = json.nonce;
|
1081 |
}
|
1082 |
if (json && json.errorMsg) {
|
1083 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', json.errorMsg);
|
1084 |
}
|
1085 |
cb(json);
|
1086 |
},
|
1126 |
jQuery.colorbox.close();
|
1127 |
},
|
1128 |
scanRunningMsg: function() {
|
1129 |
+
this.colorbox((this.isSmallScreen ? '300px' : '400px'), "A scan is running", "A scan is currently in progress. Please wait until it finishes before starting another scan.");
|
1130 |
},
|
1131 |
errorMsg: function(msg) {
|
1132 |
+
this.colorbox((this.isSmallScreen ? '300px' : '400px'), "An error occurred:", msg);
|
1133 |
},
|
1134 |
bulkOperation: function(op) {
|
1135 |
var self = this;
|
1138 |
return jQuery(this).val();
|
1139 |
}).get();
|
1140 |
if (ids.length < 1) {
|
1141 |
+
this.colorbox((self.isSmallScreen ? '300px' : '400px'), "No files were selected", "You need to select files to perform a bulk operation. There is a checkbox in each issue that lets you select that file. You can then select a bulk operation and hit the button to perform that bulk operation.");
|
1142 |
return;
|
1143 |
}
|
1144 |
if (op == 'del') {
|
1145 |
+
this.colorbox((self.isSmallScreen ? '300px' : '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 />");
|
1146 |
} else if (op == 'repair') {
|
1147 |
+
this.colorbox((self.isSmallScreen ? '300px' : '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 />");
|
1148 |
}
|
1149 |
} else {
|
1150 |
return;
|
1166 |
var self = this;
|
1167 |
if (res.ok) {
|
1168 |
this.loadIssues(function() {
|
1169 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), res.bulkHeading, res.bulkBody);
|
1170 |
});
|
1171 |
} else {
|
1172 |
this.loadIssues(function() {
|
1191 |
var self = this;
|
1192 |
if (res.ok) {
|
1193 |
this.loadIssues(function() {
|
1194 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Success deleting file", "The file " + res.file + " was successfully deleted.");
|
1195 |
});
|
1196 |
} else if (res.cerrorMsg) {
|
1197 |
this.loadIssues(function() {
|
1198 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.cerrorMsg);
|
1199 |
});
|
1200 |
}
|
1201 |
},
|
1212 |
var self = this;
|
1213 |
if (res.ok) {
|
1214 |
this.loadIssues(function() {
|
1215 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Success removing option", "The option " + res.option_name + " was successfully removed.");
|
1216 |
});
|
1217 |
} else if (res.cerrorMsg) {
|
1218 |
this.loadIssues(function() {
|
1219 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.cerrorMsg);
|
1220 |
});
|
1221 |
}
|
1222 |
},
|
1230 |
jQuery('#wordfenceMisconfiguredHowGetIPsNotice').fadeOut();
|
1231 |
|
1232 |
self.loadIssues(function() {
|
1233 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Success updating option", "The 'How does Wordfence get IPs' option was successfully updated to the recommended value.");
|
1234 |
});
|
1235 |
} else if (res.cerrorMsg) {
|
1236 |
self.loadIssues(function() {
|
1237 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.cerrorMsg);
|
1238 |
});
|
1239 |
}
|
1240 |
});
|
1246 |
|
1247 |
this.ajax('wordfence_checkHtaccess', {}, function(res) {
|
1248 |
if (res.ok) {
|
1249 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
|
1250 |
+ '<br/>'
|
1251 |
+ '<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 + ');" />');
|
1252 |
} else if (res.nginx) {
|
1253 |
+
self.colorbox((self.isSmallScreen ? '300px' : '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>');
|
1254 |
} else if (res.err) {
|
1255 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
|
1256 |
}
|
1257 |
});
|
1258 |
},
|
1264 |
}, function(res) {
|
1265 |
if (res.ok) {
|
1266 |
self.loadIssues(function() {
|
1267 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "File restored OK", "The Full Path disclosure issue has been fixed");
|
1268 |
});
|
1269 |
} else {
|
1270 |
self.loadIssues(function() {
|
1271 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.cerrorMsg);
|
1272 |
});
|
1273 |
}
|
1274 |
});
|
1278 |
var self = this;
|
1279 |
return function(res) {
|
1280 |
if (res.ok) {
|
1281 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
|
1282 |
+ '<br/>'
|
1283 |
+ '<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>'
|
1284 |
+ '<br /><br /><input type="button" class="wf-btn wf-btn-default" name="but1" id="wfFPDNextBut" value="Click to fix .htaccess" disabled="disabled" />'
|
1290 |
self[callback](issueID);
|
1291 |
});
|
1292 |
} else if (res.nginx) {
|
1293 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. ' + nginx);
|
1294 |
} else if (res.err) {
|
1295 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
|
1296 |
}
|
1297 |
};
|
1298 |
},
|
1305 |
jQuery.colorbox.close();
|
1306 |
self.loadIssues(function() {
|
1307 |
if (res.ok) {
|
1308 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'Your .htaccess file has been updated successfully.');
|
1309 |
} else {
|
1310 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'We encountered a problem while trying to update your .htaccess file.');
|
1311 |
}
|
1312 |
});
|
1313 |
});
|
1337 |
var self = this;
|
1338 |
if (res.ok) {
|
1339 |
this.loadIssues(function() {
|
1340 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "File restored OK", "The file " + res.file + " was restored successfully.");
|
1341 |
});
|
1342 |
} else if (res.cerrorMsg) {
|
1343 |
this.loadIssues(function() {
|
1344 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.cerrorMsg);
|
1345 |
});
|
1346 |
}
|
1347 |
},
|
1353 |
|
1354 |
this.ajax('wordfence_checkHtaccess', {}, function(res) {
|
1355 |
if (res.ok) {
|
1356 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), title, 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file proceeding'
|
1357 |
+ '<br/>'
|
1358 |
+ '<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>' +
|
1359 |
'<br /><br />' +
|
1360 |
'<button class="wf-btn wf-btn-default" type="button" id="wf-htaccess-confirm" disabled="disabled" onclick="WFAD.confirmDisableDirectoryListing(' + issueID + ');">Add code to .htaccess</button>');
|
1361 |
} else if (res.nginx) {
|
1362 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "You are using Nginx as your web server. " +
|
1363 |
"You'll need to disable autoindexing in your nginx.conf. " +
|
1364 |
"See the <a target='_blank' href='http://nginx.org/en/docs/http/ngx_http_autoindex_module.html'>Nginx docs for more info</a> on how to do this.");
|
1365 |
} else if (res.err) {
|
1366 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "We encountered a problem", "We can't modify your .htaccess file for you because: " + res.err);
|
1367 |
}
|
1368 |
});
|
1369 |
},
|
1375 |
}, function(res) {
|
1376 |
if (res.ok) {
|
1377 |
self.loadIssues(function() {
|
1378 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Directory Listing Disabled", "Directory listing has been disabled on your server.");
|
1379 |
});
|
1380 |
} else {
|
1381 |
//self.loadIssues(function() {
|
1411 |
} else {
|
1412 |
return;
|
1413 |
}
|
1414 |
+
this.colorbox((this.isSmallScreen ? '300px' : '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 />');
|
1415 |
},
|
1416 |
confirmUpdateAllIssues: function(op) {
|
1417 |
var self = this;
|
1464 |
});
|
1465 |
},
|
1466 |
emailActivityLog: function() {
|
1467 |
+
this.colorbox((this.isSmallScreen ? '300px' : '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 />");
|
1468 |
},
|
1469 |
completeEmailActivityLog: function() {
|
1470 |
jQuery.colorbox.close();
|
1476 |
var self = this;
|
1477 |
this.ajax('wordfence_sendActivityLog', {email: jQuery('#wfALogRecip').val()}, function(res) {
|
1478 |
if (res.ok) {
|
1479 |
+
self.colorbox((self.isSmallScreen ? '300px' : '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 />");
|
1480 |
}
|
1481 |
});
|
1482 |
},
|
2035 |
jQuery('.wfAjax24').hide();
|
2036 |
if (res.ok) {
|
2037 |
if (res['paidKeyMsg']) {
|
2038 |
+
self.colorbox((self.isSmallScreen ? '300px' : '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>");
|
2039 |
return;
|
2040 |
} else if (res['reload'] == 'reload' || WFAD.reloadConfigPage) {
|
2041 |
+
self.colorbox((self.isSmallScreen ? '300px' : '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>");
|
2042 |
return;
|
2043 |
} else {
|
2044 |
self.pulse('.wfSavedMsg');
|
2046 |
} else if (res.errorMsg) {
|
2047 |
return;
|
2048 |
} else {
|
2049 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', 'We encountered an error trying to save your changes.');
|
2050 |
}
|
2051 |
});
|
2052 |
},
|
2066 |
} else if (res.errorMsg) {
|
2067 |
return;
|
2068 |
} else {
|
2069 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', 'We encountered an error trying to save your changes.');
|
2070 |
}
|
2071 |
});
|
2072 |
},
|
2082 |
} else if (res.errorMsg) {
|
2083 |
return;
|
2084 |
} else {
|
2085 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', 'We encountered an error trying to save your changes.');
|
2086 |
}
|
2087 |
});
|
2088 |
},
|
2107 |
} else {
|
2108 |
return;
|
2109 |
}
|
2110 |
+
this.colorbox((this.isSmallScreen ? '300px' : '450px'), "Please confirm", body +
|
2111 |
'<br /><br /><center><input class="wf-btn wf-btn-default" type="button" name="but1" value="Cancel" onclick="jQuery.colorbox.close();" /> ' +
|
2112 |
'<input class="wf-btn wf-btn-default" type="button" name="but2" value="Yes I\'m sure" onclick="jQuery.colorbox.close(); WFAD.confirmClearAllBlocked(\'' + op + '\');"><br />');
|
2113 |
},
|
2123 |
loadBlockedCountries: function(str) {
|
2124 |
var codes = str.split(',');
|
2125 |
for (var i = 0; i < codes.length; i++) {
|
2126 |
+
jQuery('#wfCountryCheckbox_' + codes[i]).addClass('active');
|
2127 |
}
|
2128 |
},
|
2129 |
saveCountryBlocking: function() {
|
2134 |
var bypassViewURL = jQuery('#wfBypassViewURL').val();
|
2135 |
|
2136 |
if (action == 'redir' && (!/^https?:\/\/[^\/]+/i.test(redirURL))) {
|
2137 |
+
this.colorbox((this.isSmallScreen ? '300px' : '400px'), "Please enter a URL for redirection", "You have chosen to redirect blocked countries to a specific page. You need to enter a URL in the text box provided that starts with http:// or https://");
|
2138 |
return;
|
2139 |
}
|
2140 |
if (bypassRedirURL || bypassRedirDest) {
|
2141 |
if (!(bypassRedirURL && bypassRedirDest)) {
|
2142 |
+
this.colorbox((this.isSmallScreen ? '300px' : '400px'), "Missing data from form", "If you want to set up a URL that will bypass country blocking, you must enter a URL that a visitor can hit and the destination they will be redirected to. You have only entered one of these components. Please enter both.");
|
2143 |
return;
|
2144 |
}
|
2145 |
if (bypassRedirURL == bypassRedirDest) {
|
2146 |
+
this.colorbox((this.isSmallScreen ? '300px' : '400px'), "URLs are the same", "The URL that a user hits to bypass country blocking and the URL they are redirected to are the same. This would cause a circular redirect. Please fix this.");
|
2147 |
return;
|
2148 |
}
|
2149 |
}
|
2163 |
var codesArr = [];
|
2164 |
var ownCountryBlocked = false;
|
2165 |
var self = this;
|
2166 |
+
jQuery('.wf-blocked-countries li').each(function(idx, elem) {
|
2167 |
+
if (jQuery(elem).hasClass('active')) {
|
2168 |
+
var code = jQuery(elem).data('country');
|
2169 |
codesArr.push(code);
|
2170 |
if (code == self.ownCountry) {
|
2171 |
ownCountryBlocked = true;
|
2174 |
});
|
2175 |
this.countryCodesToSave = codesArr.join(',');
|
2176 |
if (ownCountryBlocked) {
|
2177 |
+
this.colorbox((this.isSmallScreen ? '300px' : '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 />" +
|
2178 |
'<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();" />');
|
2179 |
} else {
|
2180 |
this.confirmSaveCountryBlocking();
|
2181 |
}
|
2182 |
},
|
2183 |
invalidCountryURLMsg: function(URL) {
|
2184 |
+
this.colorbox((this.isSmallScreen ? '300px' : '400px'), "Invalid URL", "URL's that you provide for bypassing country blocking must start with '/' or 'http://' without quotes. The URL that is invalid is: " + this.htmlEscape(URL));
|
2185 |
return;
|
2186 |
},
|
2187 |
confirmSaveCountryBlocking: function() {
|
2227 |
},
|
2228 |
sched_shortcut: function(mode) {
|
2229 |
if (jQuery('#schedMode').val() == 'auto') {
|
2230 |
+
this.colorbox((this.isSmallScreen ? '300px' : '400px'), 'Change the scan mode', "You need to change the scan mode to manually scheduled scans if you want to select scan times.");
|
2231 |
return;
|
2232 |
}
|
2233 |
jQuery('.wfSchedCheckbox').prop('checked', false);
|
2318 |
var totpURL = "otpauth://totp/" + encodeURI(res.homeurl) + encodeURI(" (" + res.username + ")") + "?" + res.uriQueryString + "&issuer=Wordfence";
|
2319 |
self.twoFacStatus('User added! Scan the QR code with your authenticator app to add it.');
|
2320 |
|
2321 |
+
var message = "Scan the code below with your authenticator app to add this account. Some authenticator apps also allow you to type in the text version instead.<br><div id=\"wfTwoFactorQRCodeTable\"></div><br><strong>Key:</strong> <input type=\"text\"" + (self.isSmallScreen ? "" : " size=\"45\"") + " value=\"" + res.base32Secret + "\" onclick=\"this.select();\" readonly>";
|
2322 |
if (res.recoveryCodes.length > 0) {
|
2323 |
message = message + "<br><br><strong>Recovery Codes</strong><br><p>Use one of these " + res.recoveryCodes.length + " codes to log in if you lose access to your authenticator device. Codes are 16 characters long, plus optional spaces. Each one may be used only once.</p><ul id=\"wfTwoFactorRecoveryCodes\">";
|
2324 |
|
2339 |
|
2340 |
message = message + "<p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
|
2341 |
|
2342 |
+
self.colorbox((self.isSmallScreen ? '300px' : '440px'), "Authentication Code", message, {onComplete: function() {
|
2343 |
+
jQuery('#wfTwoFactorQRCodeTable').qrcode({text: totpURL, width: (self.isSmallScreen ? 175 : 256), height: (self.isSmallScreen ? 175 : 256)});
|
2344 |
jQuery('#wfTwoFactorDownload').on('click', function(e) {
|
2345 |
e.preventDefault();
|
2346 |
e.stopPropagation();
|
2368 |
|
2369 |
message = message + "</ul><p><em>This will be shown only once. Keep these codes somewhere safe.</em></p>";
|
2370 |
|
2371 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Recovery Codes", message, {onComplete: function() {
|
|
|
2372 |
jQuery('#wfTwoFactorDownload').on('click', function(e) {
|
2373 |
e.preventDefault();
|
2374 |
e.stopPropagation();
|
2533 |
var self = this;
|
2534 |
this.ajax('wordfence_exportSettings', {}, function(res) {
|
2535 |
if (res.ok && res.token) {
|
2536 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Export Successful", "We successfully exported your site settings. To import your site settings on another site, copy and paste the token below into the import text box on the destination site. Keep this token secret. It is like a password. If anyone else discovers the token it will allow them to import your settings excluding your API key.<br /><br />Token:<input type=\"text\" size=\"20\" value=\"" + res.token + "\" onclick=\"this.select();\" /><br />");
|
2537 |
} else if (res.err) {
|
2538 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error during Export", res.err);
|
2539 |
} else {
|
2540 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "An unknown error occurred", "An unknown error occurred during the export. We received an undefined error from your web server.");
|
2541 |
}
|
2542 |
});
|
2543 |
},
|
2545 |
var self = this;
|
2546 |
this.ajax('wordfence_importSettings', {token: token}, function(res) {
|
2547 |
if (res.ok) {
|
2548 |
+
self.colorbox((self.isSmallScreen ? '300px' : '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);\" />");
|
2549 |
} else if (res.err) {
|
2550 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error during Import", res.err);
|
2551 |
} else {
|
2552 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error during Export", "An unknown error occurred during the import");
|
2553 |
}
|
2554 |
});
|
2555 |
},
|
2558 |
this.ajax('wordfence_startPasswdAudit', {auditType: auditType, emailAddr: emailAddr}, function(res) {
|
2559 |
self.loadPasswdAuditJobs();
|
2560 |
if (res.ok) {
|
2561 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Password Audit Started", "Your password audit started successfully. The results will appear here once it is complete. You will also receive an email letting you know the results are ready at: " + emailAddr);
|
2562 |
} else if (!res.errorMsg) { //error displayed
|
2563 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Error Starting Audit", "An unknown error occurred when trying to start your password audit.");
|
2564 |
}
|
2565 |
});
|
2566 |
},
|
2572 |
}, function(res) {
|
2573 |
if (res.ok) {
|
2574 |
self.loadIssues(function() {
|
2575 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Successfully deleted admin", "The admin user " +
|
2576 |
self.htmlEscape(res.user_login) + " was successfully deleted.");
|
2577 |
});
|
2578 |
} else if (res.errorMsg) {
|
2579 |
self.loadIssues(function() {
|
2580 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.errorMsg);
|
2581 |
});
|
2582 |
}
|
2583 |
});
|
2590 |
}, function(res) {
|
2591 |
if (res.ok) {
|
2592 |
self.loadIssues(function() {
|
2593 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), "Successfully revoked admin", "All capabilties of admin user " +
|
2594 |
self.htmlEscape(res.user_login) + " were successfully revoked.");
|
2595 |
});
|
2596 |
} else if (res.errorMsg) {
|
2597 |
self.loadIssues(function() {
|
2598 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'An error occurred', res.errorMsg);
|
2599 |
});
|
2600 |
}
|
2601 |
});
|
2690 |
this.ajax('wordfence_saveWAFConfig', data, function(res) {
|
2691 |
if (typeof res === 'object' && res.success) {
|
2692 |
if (showColorBox) {
|
2693 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
|
2694 |
'configuration was saved successfully.');
|
2695 |
}
|
2696 |
self.wafData = res.data;
|
2699 |
return onSuccess.apply(this, arguments);
|
2700 |
}
|
2701 |
} else {
|
2702 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Error saving Firewall configuration', 'There was an error saving the ' +
|
2703 |
'Web Application Firewall configuration settings.');
|
2704 |
}
|
2705 |
});
|
2775 |
self.wafConfigPageRender();
|
2776 |
if (self.wafData['updated']) {
|
2777 |
if (!self.wafData['isPaid']) {
|
2778 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Rules Updated', 'Your rules have been updated successfully. You are ' +
|
2779 |
'currently using the the free version of Wordfence. ' +
|
2780 |
'Upgrade to Wordfence premium to have your rules updated automatically as new threats emerge. ' +
|
2781 |
'<a href="https://www.wordfence.com/wafUpdateRules1/wordfence-signup/">Click here to purchase a premium API key</a>. ' +
|
2782 |
'<em>Note: Your rules will still update every 30 days as a free user.</em>');
|
2783 |
} else {
|
2784 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Rules Updated', 'Your rules have been updated successfully.');
|
2785 |
}
|
2786 |
}
|
2787 |
else {
|
2788 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Rule Update Failed', 'No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory.');
|
2789 |
}
|
2790 |
if (typeof onSuccess === 'function') {
|
2791 |
return onSuccess.apply(this, arguments);
|
2806 |
wafAddBootstrap: function() {
|
2807 |
var self = this;
|
2808 |
this.ajax('wordfence_wafAddBootstrap', {}, function(res) {
|
2809 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'File Created', "");
|
2810 |
});
|
2811 |
},
|
2812 |
|
2813 |
wafConfigureAutoPrepend: function() {
|
2814 |
var self = this;
|
2815 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), 'Backup .htaccess before continuing', 'We are about to change your <em>.htaccess</em> file. Please make a backup of this file before proceeding.'
|
2816 |
+ '<br/>'
|
2817 |
+ '<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>' +
|
2818 |
'<br /><br />' +
|
2822 |
confirmWAFConfigureAutoPrepend: function() {
|
2823 |
var self = this;
|
2824 |
this.ajax('wordfence_wafConfigureAutoPrepend', {}, function(res) {
|
2825 |
+
self.colorbox((self.isSmallScreen ? '300px' : '400px'), '.htaccess Updated', "Your .htaccess has been updated successfully. Please " +
|
2826 |
"verify your site is functioning normally.");
|
2827 |
});
|
2828 |
},
|
js/admin.liveTraffic.js
CHANGED
@@ -658,7 +658,8 @@
|
|
658 |
var loadingListings = false;
|
659 |
$(window).on('scroll', function() {
|
660 |
var win = $(this);
|
661 |
-
|
|
|
662 |
var legendWidth = legend.width();
|
663 |
var legendHeight = legend.height();
|
664 |
|
658 |
var loadingListings = false;
|
659 |
$(window).on('scroll', function() {
|
660 |
var win = $(this);
|
661 |
+
var needsSticky = (WFAD.isSmallScreen ? (legendWrapper.offset().top < win.scrollTop() + 10) : (legendWrapper.offset().top < win.scrollTop() + adminBar.outerHeight() + 10));
|
662 |
+
if (needsSticky) {
|
663 |
var legendWidth = legend.width();
|
664 |
var legendHeight = legend.height();
|
665 |
|
js/tourTip.js
CHANGED
@@ -151,7 +151,7 @@ if(WordfenceAdminVars.tourClosed != '1' && WordfenceAdminVars.welcomeClosed != '
|
|
151 |
formHTML +
|
152 |
"<p>Then click \"Start Tour\" to get a quick introduction to how Wordfence protects your site, keeps you off Google's SEO black-list and can even help clean a hacked site.</p>",
|
153 |
pointerWidth: 300,
|
154 |
-
position: { edge: 'bottom', align: 'left' },
|
155 |
buttons: function(event, t){
|
156 |
var buttonElem = jQuery('<a id="pointer-close" style="margin-left:5px" class="button-secondary">Close</a>');
|
157 |
buttonElem.bind('click.pointer', function(){ t.element.pointer('close');
|
151 |
formHTML +
|
152 |
"<p>Then click \"Start Tour\" to get a quick introduction to how Wordfence protects your site, keeps you off Google's SEO black-list and can even help clean a hacked site.</p>",
|
153 |
pointerWidth: 300,
|
154 |
+
position: { edge: (jQuery('body.multisite').length == 0 ? 'bottom' : 'left'), align: 'left' },
|
155 |
buttons: function(event, t){
|
156 |
var buttonElem = jQuery('<a id="pointer-close" style="margin-left:5px" class="button-secondary">Close</a>');
|
157 |
buttonElem.bind('click.pointer', function(){ t.element.pointer('close');
|
js/wfdropdown.js
ADDED
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* ========================================================================
|
2 |
+
* Bootstrap: dropdown.js v3.3.7 (adapted to WF prefix)
|
3 |
+
* http://getbootstrap.com/javascript/#dropdowns
|
4 |
+
* ========================================================================
|
5 |
+
* Copyright 2011-2016 Twitter, Inc.
|
6 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
7 |
+
* ======================================================================== */
|
8 |
+
|
9 |
+
|
10 |
+
+function ($) {
|
11 |
+
'use strict';
|
12 |
+
|
13 |
+
// DROPDOWN CLASS DEFINITION
|
14 |
+
// =========================
|
15 |
+
|
16 |
+
var backdrop = '.wf-dropdown-backdrop'
|
17 |
+
var toggle = '[data-toggle="wf-dropdown"]'
|
18 |
+
var WFDropdown = function (element) {
|
19 |
+
$(element).on('click.bs.wf-dropdown', this.toggle)
|
20 |
+
}
|
21 |
+
|
22 |
+
WFDropdown.VERSION = '3.3.7'
|
23 |
+
|
24 |
+
function getParent($this) {
|
25 |
+
var selector = $this.attr('data-target')
|
26 |
+
|
27 |
+
if (!selector) {
|
28 |
+
selector = $this.attr('href')
|
29 |
+
selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
|
30 |
+
}
|
31 |
+
|
32 |
+
var $parent = selector && $(selector)
|
33 |
+
|
34 |
+
return $parent && $parent.length ? $parent : $this.parent()
|
35 |
+
}
|
36 |
+
|
37 |
+
function clearMenus(e) {
|
38 |
+
if (e && e.which === 3) return
|
39 |
+
$(backdrop).remove()
|
40 |
+
$(toggle).each(function () {
|
41 |
+
var $this = $(this)
|
42 |
+
var $parent = getParent($this)
|
43 |
+
var relatedTarget = { relatedTarget: this }
|
44 |
+
|
45 |
+
if (!$parent.hasClass('wf-open')) return
|
46 |
+
|
47 |
+
if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
|
48 |
+
|
49 |
+
$parent.trigger(e = $.Event('hide.bs.wf-dropdown', relatedTarget))
|
50 |
+
|
51 |
+
if (e.isDefaultPrevented()) return
|
52 |
+
|
53 |
+
$this.attr('aria-expanded', 'false')
|
54 |
+
$parent.removeClass('wf-open').trigger($.Event('hidden.bs.wf-dropdown', relatedTarget))
|
55 |
+
})
|
56 |
+
}
|
57 |
+
|
58 |
+
WFDropdown.prototype.toggle = function (e) {
|
59 |
+
var $this = $(this)
|
60 |
+
|
61 |
+
if ($this.is('.wf-disabled, :disabled')) return
|
62 |
+
|
63 |
+
var $parent = getParent($this)
|
64 |
+
var isActive = $parent.hasClass('wf-open')
|
65 |
+
|
66 |
+
clearMenus()
|
67 |
+
|
68 |
+
if (!isActive) {
|
69 |
+
if ('ontouchstart' in document.documentElement && !$parent.closest('.wf-navbar-nav').length) {
|
70 |
+
// if mobile we use a backdrop because click events don't delegate
|
71 |
+
$(document.createElement('div'))
|
72 |
+
.addClass('wf-dropdown-backdrop')
|
73 |
+
.insertAfter($(this))
|
74 |
+
.on('click', clearMenus)
|
75 |
+
}
|
76 |
+
|
77 |
+
var relatedTarget = { relatedTarget: this }
|
78 |
+
$parent.trigger(e = $.Event('show.bs.wf-dropdown', relatedTarget))
|
79 |
+
|
80 |
+
if (e.isDefaultPrevented()) return
|
81 |
+
|
82 |
+
$this
|
83 |
+
.trigger('focus')
|
84 |
+
.attr('aria-expanded', 'true')
|
85 |
+
|
86 |
+
$parent
|
87 |
+
.toggleClass('wf-open')
|
88 |
+
.trigger($.Event('shown.bs.wf-dropdown', relatedTarget))
|
89 |
+
}
|
90 |
+
|
91 |
+
return false
|
92 |
+
}
|
93 |
+
|
94 |
+
WFDropdown.prototype.keydown = function (e) {
|
95 |
+
if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
|
96 |
+
|
97 |
+
var $this = $(this)
|
98 |
+
|
99 |
+
e.preventDefault()
|
100 |
+
e.stopPropagation()
|
101 |
+
|
102 |
+
if ($this.is('.wf-disabled, :disabled')) return
|
103 |
+
|
104 |
+
var $parent = getParent($this)
|
105 |
+
var isActive = $parent.hasClass('wf-open')
|
106 |
+
|
107 |
+
if (!isActive && e.which != 27 || isActive && e.which == 27) {
|
108 |
+
if (e.which == 27) $parent.find(toggle).trigger('focus')
|
109 |
+
return $this.trigger('click')
|
110 |
+
}
|
111 |
+
|
112 |
+
var desc = ' li:not(.wf-disabled):visible a'
|
113 |
+
var $items = $parent.find('.wf-dropdown-menu' + desc)
|
114 |
+
|
115 |
+
if (!$items.length) return
|
116 |
+
|
117 |
+
var index = $items.index(e.target)
|
118 |
+
|
119 |
+
if (e.which == 38 && index > 0) index-- // up
|
120 |
+
if (e.which == 40 && index < $items.length - 1) index++ // down
|
121 |
+
if (!~index) index = 0
|
122 |
+
|
123 |
+
$items.eq(index).trigger('focus')
|
124 |
+
}
|
125 |
+
|
126 |
+
|
127 |
+
// DROPDOWN PLUGIN DEFINITION
|
128 |
+
// ==========================
|
129 |
+
|
130 |
+
function Plugin(option) {
|
131 |
+
return this.each(function () {
|
132 |
+
var $this = $(this)
|
133 |
+
var data = $this.data('bs.wf-dropdown')
|
134 |
+
|
135 |
+
if (!data) $this.data('bs.wf-dropdown', (data = new WFDropdown(this)))
|
136 |
+
if (typeof option == 'string') data[option].call($this)
|
137 |
+
})
|
138 |
+
}
|
139 |
+
|
140 |
+
var old = $.fn.wfdropdown
|
141 |
+
|
142 |
+
$.fn.wfdropdown = Plugin
|
143 |
+
$.fn.wfdropdown.Constructor = WFDropdown
|
144 |
+
|
145 |
+
|
146 |
+
// DROPDOWN NO CONFLICT
|
147 |
+
// ====================
|
148 |
+
|
149 |
+
$.fn.wfdropdown.noConflict = function () {
|
150 |
+
$.fn.wfdropdown = old
|
151 |
+
return this
|
152 |
+
}
|
153 |
+
|
154 |
+
|
155 |
+
// APPLY TO STANDARD DROPDOWN ELEMENTS
|
156 |
+
// ===================================
|
157 |
+
|
158 |
+
$(document)
|
159 |
+
.on('click.bs.wf-dropdown.data-api', clearMenus)
|
160 |
+
.on('click.bs.wf-dropdown.data-api', '.wf-dropdown form', function (e) { e.stopPropagation() })
|
161 |
+
.on('click.bs.wf-dropdown.data-api', toggle, WFDropdown.prototype.toggle)
|
162 |
+
.on('keydown.bs.wf-dropdown.data-api', toggle, WFDropdown.prototype.keydown)
|
163 |
+
.on('keydown.bs.wf-dropdown.data-api', '.wf-dropdown-menu', WFDropdown.prototype.keydown)
|
164 |
+
|
165 |
+
}(jQuery);
|
lib/dashboard/widget_ips.php
CHANGED
@@ -89,7 +89,7 @@ if (!isset($limit)) { $limit = 10; $initial = true; }
|
|
89 |
$(self).closest('.wf-ips').find('table').replaceWith(table);
|
90 |
}
|
91 |
else {
|
92 |
-
WFAD.colorbox('
|
93 |
$(this).closest('.wf-dashboard-item-list-text').fadeIn();
|
94 |
}
|
95 |
});
|
89 |
$(self).closest('.wf-ips').find('table').replaceWith(table);
|
90 |
}
|
91 |
else {
|
92 |
+
WFAD.colorbox('300px', 'An error occurred', 'We encountered an error trying load more data.');
|
93 |
$(this).closest('.wf-dashboard-item-list-text').fadeIn();
|
94 |
}
|
95 |
});
|
lib/dashboard/widget_logins.php
CHANGED
@@ -73,7 +73,7 @@
|
|
73 |
$(self).closest('.wf-recent-logins').find('table').replaceWith(table);
|
74 |
}
|
75 |
else {
|
76 |
-
WFAD.colorbox('
|
77 |
$(this).closest('.wf-dashboard-item-list-text').fadeIn();
|
78 |
}
|
79 |
});
|
73 |
$(self).closest('.wf-recent-logins').find('table').replaceWith(table);
|
74 |
}
|
75 |
else {
|
76 |
+
WFAD.colorbox('300px', 'An error occurred', 'We encountered an error trying load more data.');
|
77 |
$(this).closest('.wf-dashboard-item-list-text').fadeIn();
|
78 |
}
|
79 |
});
|
lib/dashboard/widget_networkattacks.php
CHANGED
@@ -66,12 +66,18 @@ STYLING;
|
|
66 |
foreach ($blocks as $b) {
|
67 |
$values[] = $b['c'];
|
68 |
|
69 |
-
$dtStr =
|
70 |
$dt = new DateTime($dtStr, $utc);
|
71 |
$tz = get_option('timezone_string');
|
72 |
if (!empty($tz)) {
|
73 |
$dt->setTimezone(new DateTimeZone($tz));
|
74 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
$labels[] = "'" . $dt->format('g a') . "'";
|
76 |
}
|
77 |
?>
|
@@ -118,12 +124,18 @@ STYLING;
|
|
118 |
foreach ($blocks as $b) {
|
119 |
$values[] = $b['c'];
|
120 |
|
121 |
-
$dtStr =
|
122 |
$dt = new DateTime($dtStr, $utc);
|
123 |
$tz = get_option('timezone_string');
|
124 |
if (!empty($tz)) {
|
125 |
$dt->setTimezone(new DateTimeZone($tz));
|
126 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
$labels[] = "'" . $dt->format('M j') . "'";
|
128 |
}
|
129 |
?>
|
@@ -170,12 +182,18 @@ STYLING;
|
|
170 |
foreach ($blocks as $b) {
|
171 |
$values[] = $b['c'];
|
172 |
|
173 |
-
$dtStr =
|
174 |
$dt = new DateTime($dtStr, $utc);
|
175 |
$tz = get_option('timezone_string');
|
176 |
if (!empty($tz)) {
|
177 |
$dt->setTimezone(new DateTimeZone($tz));
|
178 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
179 |
$labels[] = "'" . $dt->format('M j') . "'";
|
180 |
}
|
181 |
?>
|
@@ -226,6 +244,7 @@ STYLING;
|
|
226 |
<?php endif; ?>
|
227 |
</li>
|
228 |
</ul>
|
|
|
229 |
</div>
|
230 |
</div>
|
231 |
</div>
|
66 |
foreach ($blocks as $b) {
|
67 |
$values[] = $b['c'];
|
68 |
|
69 |
+
$dtStr = gmdate("c", $b['t']); //Have to do it this way because of PHP 5.2
|
70 |
$dt = new DateTime($dtStr, $utc);
|
71 |
$tz = get_option('timezone_string');
|
72 |
if (!empty($tz)) {
|
73 |
$dt->setTimezone(new DateTimeZone($tz));
|
74 |
}
|
75 |
+
else {
|
76 |
+
$gmt = get_option('gmt_offset');
|
77 |
+
if (!empty($gmt)) {
|
78 |
+
$dt->setTimezone(new DateTimeZone('Etc/GMT' . ($gmt < 0 ? '+' : '-') . abs($gmt))); //The Etc/GMT timezones have the +- signs flipped
|
79 |
+
}
|
80 |
+
}
|
81 |
$labels[] = "'" . $dt->format('g a') . "'";
|
82 |
}
|
83 |
?>
|
124 |
foreach ($blocks as $b) {
|
125 |
$values[] = $b['c'];
|
126 |
|
127 |
+
$dtStr = gmdate("c", $b['t']); //Have to do it this way because of PHP 5.2
|
128 |
$dt = new DateTime($dtStr, $utc);
|
129 |
$tz = get_option('timezone_string');
|
130 |
if (!empty($tz)) {
|
131 |
$dt->setTimezone(new DateTimeZone($tz));
|
132 |
}
|
133 |
+
else {
|
134 |
+
$gmt = get_option('gmt_offset');
|
135 |
+
if (!empty($gmt)) {
|
136 |
+
$dt->setTimezone(new DateTimeZone('Etc/GMT' . ($gmt < 0 ? '+' : '-') . abs($gmt))); //The Etc/GMT timezones have the +- signs flipped
|
137 |
+
}
|
138 |
+
}
|
139 |
$labels[] = "'" . $dt->format('M j') . "'";
|
140 |
}
|
141 |
?>
|
182 |
foreach ($blocks as $b) {
|
183 |
$values[] = $b['c'];
|
184 |
|
185 |
+
$dtStr = gmdate("c", $b['t']); //Have to do it this way because of PHP 5.2
|
186 |
$dt = new DateTime($dtStr, $utc);
|
187 |
$tz = get_option('timezone_string');
|
188 |
if (!empty($tz)) {
|
189 |
$dt->setTimezone(new DateTimeZone($tz));
|
190 |
}
|
191 |
+
else {
|
192 |
+
$gmt = get_option('gmt_offset');
|
193 |
+
if (!empty($gmt)) {
|
194 |
+
$dt->setTimezone(new DateTimeZone('Etc/GMT' . ($gmt < 0 ? '+' : '-') . abs($gmt))); //The Etc/GMT timezones have the +- signs flipped
|
195 |
+
}
|
196 |
+
}
|
197 |
$labels[] = "'" . $dt->format('M j') . "'";
|
198 |
}
|
199 |
?>
|
244 |
<?php endif; ?>
|
245 |
</li>
|
246 |
</ul>
|
247 |
+
<p class="wf-dashboard-last-updated">Last Updated: <?php echo esc_html(wfUtils::makeTimeAgo(time() - $d->lastGenerated)); ?> ago</p>
|
248 |
</div>
|
249 |
</div>
|
250 |
</div>
|
lib/menu_activity.php
CHANGED
@@ -5,23 +5,22 @@
|
|
5 |
</div>
|
6 |
<?php endif ?>
|
7 |
<div class="wrap wordfence">
|
8 |
-
<
|
9 |
-
<div
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
</div>
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
id="wfLiveTrafficOnOff" <?php if (wfConfig::liveTrafficEnabled()) {
|
16 |
-
echo ' checked ';
|
17 |
-
} ?>>
|
18 |
-
<label class="wfOnOffSwitch-label" for="wfLiveTrafficOnOff">
|
19 |
-
<div class="wfOnOffSwitch-inner"></div>
|
20 |
-
<div class="wfOnOffSwitch-switch"></div>
|
21 |
-
</label>
|
22 |
-
</div>
|
23 |
-
</div>
|
24 |
-
</h2>
|
25 |
<a href="http://docs.wordfence.com/en/Live_traffic" target="_blank" class="wfhelp"></a><a href="http://docs.wordfence.com/en/Live_traffic" target="_blank">Learn more about Wordfence Live Traffic</a>
|
26 |
|
27 |
<div class="wordfenceModeElem" id="wordfenceMode_activity"></div>
|
@@ -61,8 +60,8 @@
|
|
61 |
<pre data-bind="text: 'DEBUG: ' + sql(), visible: sql"></pre>
|
62 |
<?php endif ?>
|
63 |
|
64 |
-
<div class="wfActEvent">
|
65 |
-
<h2
|
66 |
|
67 |
<select id="wf-lt-preset-filters" data-bind="options: presetFiltersOptions, optionsText: presetFiltersOptionsText,
|
68 |
value: selectedPresetFilter">
|
@@ -75,124 +74,79 @@
|
|
75 |
</div>
|
76 |
|
77 |
<div class="wfActEvent" data-bind="visible: showAdvancedFilters" id="wf-lt-advanced-filters">
|
78 |
-
<
|
79 |
-
<
|
80 |
-
<
|
81 |
-
<
|
82 |
-
<
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
</td>
|
93 |
-
<td data-bind="attr: {colSpan: (selectedFilterParamOptionValue() &&
|
94 |
-
selectedFilterParamOptionValue().type() == 'bool' ? 2 : 1)}"
|
95 |
-
class="wf-lt-advanced-filters-value-cell">
|
96 |
-
|
97 |
-
<span
|
98 |
-
data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'enum'">
|
99 |
-
<select
|
100 |
-
data-bind="options: selectedFilterParamOptionValue().values,
|
101 |
-
optionsText: selectedFilterParamOptionValue().optionsText,
|
102 |
-
value: value"></select>
|
103 |
</span>
|
104 |
|
105 |
-
<span
|
106 |
-
data-bind="
|
107 |
-
<input data-bind="value: value" type="text"/>
|
108 |
</span>
|
109 |
|
110 |
-
<span
|
111 |
-
data-bind="
|
112 |
-
<label>
|
113 |
-
value="1"></label>
|
114 |
-
<label>No <input data-bind="checked: value" type="radio"
|
115 |
-
value="0"></label>
|
116 |
</span>
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
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 |
-
<label for="wf-live-traffic-to">To: </label>
|
161 |
-
</td>
|
162 |
-
<td><input placeholder="End date" id="wf-live-traffic-to" type="text"
|
163 |
-
class="wf-datetime"
|
164 |
-
data-bind="value: endDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
|
165 |
-
</td>
|
166 |
-
<td>
|
167 |
-
<button data-bind="click: endDate('')" class="wf-btn wf-btn-default wf-btn-sm"
|
168 |
-
type="button">
|
169 |
-
Clear
|
170 |
-
</button>
|
171 |
-
</td>
|
172 |
-
</tr>
|
173 |
-
<tr>
|
174 |
-
<td>
|
175 |
-
<label for="wf-live-traffic-group-by">Group By: </label>
|
176 |
-
</td>
|
177 |
-
<td>
|
178 |
-
<select id="wf-live-traffic-group-by" name="groupby"
|
179 |
-
class="wf-lt-advanced-filters-groupby"
|
180 |
-
data-bind="options: filterGroupByOptions,
|
181 |
-
optionsText: filterGroupByOptionsText, value: groupBy, optionsCaption: 'None'"></select>
|
182 |
-
</td>
|
183 |
-
</tr>
|
184 |
-
</tbody>
|
185 |
-
</table>
|
186 |
-
</td>
|
187 |
-
</tr>
|
188 |
-
</table>
|
189 |
</div>
|
190 |
</form>
|
191 |
|
192 |
-
<
|
193 |
-
<
|
194 |
-
|
195 |
-
<td>
|
196 |
<div data-bind="if: loc()">
|
197 |
<img data-bind="attr: { src: '<?php echo wfUtils::getBaseURL() . 'images/flags/'; ?>' + loc().countryCode.toLowerCase() + '.png',
|
198 |
alt: loc().countryName, title: loc().countryName }" width="16" height="11"
|
@@ -228,20 +182,18 @@
|
|
228 |
data-bind="attr: { 'data-timestamp': ctime, text: 'Last hit was ' + ctime() + ' ago.' }"
|
229 |
class="wfTimeAgo wfTimeAgo-timestamp"></span>
|
230 |
</div>
|
231 |
-
</
|
232 |
-
<
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
</
|
237 |
-
</
|
238 |
|
239 |
<div data-bind="if: !groupBy()">
|
240 |
<div id="wf-lt-listings" data-bind="foreach: listings">
|
241 |
<div data-bind="attr: { id: ('wfActEvent_' + id()), 'class': cssClasses }">
|
242 |
-
<
|
243 |
-
<tr>
|
244 |
-
<td>
|
245 |
<span data-bind="if: action() != 'loginOK' && user()">
|
246 |
<span data-bind="html: user.avatar" class="wfAvatar"></span>
|
247 |
<a data-bind="attr: { href: user.editLink }, text: user().display_name"
|
@@ -267,12 +219,12 @@
|
|
267 |
<span data-bind="if: extReferer()">
|
268 |
arrived from <a data-bind="text: referer, attr: { href: referer }"
|
269 |
target="_blank"
|
270 |
-
style="color: #A00; font-weight: bold;"></a> and
|
271 |
</span>
|
272 |
<span data-bind="if: !extReferer()">
|
273 |
left <a data-bind="text: referer, attr: { href: referer }"
|
274 |
target="_blank"
|
275 |
-
style="color: #999; font-weight: normal;"></a> and
|
276 |
</span>
|
277 |
</span>
|
278 |
<span data-bind="if: statusCode() == 404">
|
@@ -305,13 +257,12 @@
|
|
305 |
<span data-bind="if: action() == 'user:passwordReset'">
|
306 |
changed their password.
|
307 |
</span>
|
308 |
-
<a class="wf-lt-url"
|
309 |
data-bind="text: displayURL, attr: { href: URL, title: URL }"
|
310 |
target="_blank"></a>
|
311 |
-
|
312 |
-
|
313 |
-
<
|
314 |
-
<td><span data-bind="text: timeAgo, attr: { 'data-timestamp': ctime }"
|
315 |
class="wfTimeAgo wfTimeAgo-timestamp"></span>
|
316 |
<strong>IP:</strong> <a
|
317 |
data-bind="attr: { href: WFAD.makeIPTrafLink(IP()) }, text: IP"
|
@@ -330,24 +281,18 @@
|
|
330 |
<span data-bind="text: IP"
|
331 |
style="display:none;"></span>
|
332 |
</span>
|
333 |
-
|
334 |
-
</tr>
|
335 |
|
336 |
-
<
|
337 |
-
<td>
|
338 |
<strong>Browser:</strong>
|
339 |
<span data-bind="text: browser().browser +
|
340 |
(browser().version ? ' version ' + browser().version : '') +
|
341 |
(browser().platform && browser().platform != 'unknown' ? ' running on ' + browser().platform : '')
|
342 |
">
|
343 |
</span>
|
344 |
-
|
345 |
-
|
346 |
-
<
|
347 |
-
<td data-bind="text: UA" style="color: #AAA;"></td>
|
348 |
-
</tr>
|
349 |
-
<tr>
|
350 |
-
<td>
|
351 |
<span data-bind="if: blocked()">
|
352 |
<a href="#" class="wf-btn wf-btn-default wf-btn-sm"
|
353 |
data-bind="click: $root.unblockIP">
|
@@ -389,9 +334,7 @@
|
|
389 |
</a>
|
390 |
<?php endif ?>
|
391 |
</span>
|
392 |
-
|
393 |
-
</tr>
|
394 |
-
</table>
|
395 |
</div>
|
396 |
</div>
|
397 |
</div>
|
5 |
</div>
|
6 |
<?php endif ?>
|
7 |
<div class="wrap wordfence">
|
8 |
+
<div class="wf-page-title">
|
9 |
+
<div class="wordfence-lock-icon wordfence-icon32"></div>
|
10 |
+
<h2 id="wfHeading">Site Activity in Real-Time</h2>
|
11 |
+
<div class="wfOnOffSwitch" id="wfOnOffSwitchID">
|
12 |
+
<input type="checkbox" name="wfOnOffSwitch" class="wfOnOffSwitch-checkbox"
|
13 |
+
id="wfLiveTrafficOnOff" <?php if (wfConfig::liveTrafficEnabled()) {
|
14 |
+
echo ' checked ';
|
15 |
+
} ?>>
|
16 |
+
<label class="wfOnOffSwitch-label" for="wfLiveTrafficOnOff">
|
17 |
+
<div class="wfOnOffSwitch-inner"></div>
|
18 |
+
<div class="wfOnOffSwitch-switch"></div>
|
19 |
+
</label>
|
20 |
</div>
|
21 |
+
</div>
|
22 |
+
<div class="wp-header-end"></div>
|
23 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
<a href="http://docs.wordfence.com/en/Live_traffic" target="_blank" class="wfhelp"></a><a href="http://docs.wordfence.com/en/Live_traffic" target="_blank">Learn more about Wordfence Live Traffic</a>
|
25 |
|
26 |
<div class="wordfenceModeElem" id="wordfenceMode_activity"></div>
|
60 |
<pre data-bind="text: 'DEBUG: ' + sql(), visible: sql"></pre>
|
61 |
<?php endif ?>
|
62 |
|
63 |
+
<div class="wfActEvent wf-live-traffic-filter">
|
64 |
+
<h2>Filter Traffic:</h2>
|
65 |
|
66 |
<select id="wf-lt-preset-filters" data-bind="options: presetFiltersOptions, optionsText: presetFiltersOptionsText,
|
67 |
value: selectedPresetFilter">
|
74 |
</div>
|
75 |
|
76 |
<div class="wfActEvent" data-bind="visible: showAdvancedFilters" id="wf-lt-advanced-filters">
|
77 |
+
<div class="wf-live-traffic-filter-detail">
|
78 |
+
<div>
|
79 |
+
<div data-bind="foreach: filters">
|
80 |
+
<div class="wf-live-traffic-filter-item">
|
81 |
+
<div class="wf-live-traffic-filter-item-parameters">
|
82 |
+
<div>
|
83 |
+
<select name="param[]" class="wf-lt-advanced-filters-param" data-bind="options: filterParamOptions, optionsText: filterParamOptionsText, value: selectedFilterParamOptionValue, optionsCaption: 'Filter...'"></select>
|
84 |
+
</div>
|
85 |
+
<div data-bind="visible: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() != 'bool'">
|
86 |
+
<select name="operator[]" class="wf-lt-advanced-filters-operator" data-bind="options: filterOperatorOptions, optionsText: filterOperatorOptionsText, value: selectedFilterOperatorOptionValue"></select>
|
87 |
+
</div>
|
88 |
+
<div data-bind="attr: {colSpan: (selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'bool' ? 2 : 1)}" class="wf-lt-advanced-filters-value-cell">
|
89 |
+
<span data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'enum'">
|
90 |
+
<select data-bind="options: selectedFilterParamOptionValue().values, optionsText: selectedFilterParamOptionValue().optionsText, value: value"></select>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
</span>
|
92 |
|
93 |
+
<span data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'text'">
|
94 |
+
<input data-bind="value: value" type="text">
|
|
|
95 |
</span>
|
96 |
|
97 |
+
<span data-bind="if: selectedFilterParamOptionValue() && selectedFilterParamOptionValue().type() == 'bool'">
|
98 |
+
<label>Yes <input data-bind="checked: value" type="radio" value="1"></label>
|
99 |
+
<label>No <input data-bind="checked: value" type="radio" value="0"></label>
|
|
|
|
|
|
|
100 |
</span>
|
101 |
+
</div>
|
102 |
+
</div>
|
103 |
+
<div>
|
104 |
+
<!--<button data-bind="click: $root.removeFilter" type="button" class="wf-btn wf-btn-default">Remove</button> -->
|
105 |
+
<a href="#" data-bind="click: $root.removeFilter" class="wf-live-traffic-filter-remove"><i class="wf-ion-trash-a"></i></a>
|
106 |
+
</div>
|
107 |
+
</div>
|
108 |
+
</div>
|
109 |
+
<div>
|
110 |
+
<tr>
|
111 |
+
<td colspan="3">
|
112 |
+
<div class="wf-pad-small">
|
113 |
+
<button type="button" class="wf-btn wf-btn-default" data-bind="click: addFilter">
|
114 |
+
Add Filter
|
115 |
+
</button>
|
116 |
+
</div>
|
117 |
+
</td>
|
118 |
+
</tr>
|
119 |
+
</div>
|
120 |
+
</div>
|
121 |
+
<div class="wf-form wf-form-horizontal">
|
122 |
+
<div class="wf-form-group">
|
123 |
+
<label for="wf-live-traffic-from" class="wf-col-sm-2">From: </label>
|
124 |
+
<div class="wf-col-sm-10">
|
125 |
+
<input placeholder="Start date" id="wf-live-traffic-from" type="text" class="wf-datetime" data-bind="value: startDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
|
126 |
+
<button data-bind="click: startDate('')" class="wf-btn wf-btn-default wf-btn-sm" type="button">Clear</button>
|
127 |
+
</div>
|
128 |
+
</div>
|
129 |
+
<div class="wf-form-group">
|
130 |
+
<label for="wf-live-traffic-to" class="wf-col-sm-2">To: </label>
|
131 |
+
<div class="wf-col-sm-10">
|
132 |
+
<input placeholder="End date" id="wf-live-traffic-to" type="text" class="wf-datetime" data-bind="value: endDate, datetimepicker: null, datepickerOptions: { timeFormat: 'hh:mm tt z' }">
|
133 |
+
<button data-bind="click: endDate('')" class="wf-btn wf-btn-default wf-btn-sm" type="button">Clear</button>
|
134 |
+
</div>
|
135 |
+
</div>
|
136 |
+
<div class="wf-form-group">
|
137 |
+
<label for="wf-live-traffic-group-by" class="wf-col-sm-2">Group By: </label>
|
138 |
+
<div class="wf-col-sm-10">
|
139 |
+
<select id="wf-live-traffic-group-by" name="groupby" class="wf-lt-advanced-filters-groupby" data-bind="options: filterGroupByOptions, optionsText: filterGroupByOptionsText, value: groupBy, optionsCaption: 'None'"></select>
|
140 |
+
</div>
|
141 |
+
</div>
|
142 |
+
</div>
|
143 |
+
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
144 |
</div>
|
145 |
</form>
|
146 |
|
147 |
+
<div data-bind="if: groupBy()" border="0" style="width: 100%">
|
148 |
+
<div class="wf-filtered-traffic" data-bind="foreach: listings">
|
149 |
+
<div>
|
|
|
150 |
<div data-bind="if: loc()">
|
151 |
<img data-bind="attr: { src: '<?php echo wfUtils::getBaseURL() . 'images/flags/'; ?>' + loc().countryCode.toLowerCase() + '.png',
|
152 |
alt: loc().countryName, title: loc().countryName }" width="16" height="11"
|
182 |
data-bind="attr: { 'data-timestamp': ctime, text: 'Last hit was ' + ctime() + ' ago.' }"
|
183 |
class="wfTimeAgo wfTimeAgo-timestamp"></span>
|
184 |
</div>
|
185 |
+
</div>
|
186 |
+
<div>
|
187 |
+
<!--<td style="font-size: 28px; color: #999;"> -->
|
188 |
+
<span class="wf-filtered-traffic-hits" data-bind="text: hitCount"></span> hits
|
189 |
+
</div>
|
190 |
+
</div>
|
191 |
+
</div>
|
192 |
|
193 |
<div data-bind="if: !groupBy()">
|
194 |
<div id="wf-lt-listings" data-bind="foreach: listings">
|
195 |
<div data-bind="attr: { id: ('wfActEvent_' + id()), 'class': cssClasses }">
|
196 |
+
<div>
|
|
|
|
|
197 |
<span data-bind="if: action() != 'loginOK' && user()">
|
198 |
<span data-bind="html: user.avatar" class="wfAvatar"></span>
|
199 |
<a data-bind="attr: { href: user.editLink }, text: user().display_name"
|
219 |
<span data-bind="if: extReferer()">
|
220 |
arrived from <a data-bind="text: referer, attr: { href: referer }"
|
221 |
target="_blank"
|
222 |
+
style="color: #A00; font-weight: bold;" class="wf-split-word-xs"></a> and
|
223 |
</span>
|
224 |
<span data-bind="if: !extReferer()">
|
225 |
left <a data-bind="text: referer, attr: { href: referer }"
|
226 |
target="_blank"
|
227 |
+
style="color: #999; font-weight: normal;" class="wf-split-word-xs"></a> and
|
228 |
</span>
|
229 |
</span>
|
230 |
<span data-bind="if: statusCode() == 404">
|
257 |
<span data-bind="if: action() == 'user:passwordReset'">
|
258 |
changed their password.
|
259 |
</span>
|
260 |
+
<a class="wf-lt-url wf-split-word-xs"
|
261 |
data-bind="text: displayURL, attr: { href: URL, title: URL }"
|
262 |
target="_blank"></a>
|
263 |
+
</div>
|
264 |
+
<div>
|
265 |
+
<span data-bind="text: timeAgo, attr: { 'data-timestamp': ctime }"
|
|
|
266 |
class="wfTimeAgo wfTimeAgo-timestamp"></span>
|
267 |
<strong>IP:</strong> <a
|
268 |
data-bind="attr: { href: WFAD.makeIPTrafLink(IP()) }, text: IP"
|
281 |
<span data-bind="text: IP"
|
282 |
style="display:none;"></span>
|
283 |
</span>
|
284 |
+
</div>
|
|
|
285 |
|
286 |
+
<div data-bind="if: browser() && browser().browser != 'Default Browser'">
|
|
|
287 |
<strong>Browser:</strong>
|
288 |
<span data-bind="text: browser().browser +
|
289 |
(browser().version ? ' version ' + browser().version : '') +
|
290 |
(browser().platform && browser().platform != 'unknown' ? ' running on ' + browser().platform : '')
|
291 |
">
|
292 |
</span>
|
293 |
+
</div>
|
294 |
+
<div data-bind="text: UA" style="color: #AAA;"></div>
|
295 |
+
<div>
|
|
|
|
|
|
|
|
|
296 |
<span data-bind="if: blocked()">
|
297 |
<a href="#" class="wf-btn wf-btn-default wf-btn-sm"
|
298 |
data-bind="click: $root.unblockIP">
|
334 |
</a>
|
335 |
<?php endif ?>
|
336 |
</span>
|
337 |
+
</div>
|
|
|
|
|
338 |
</div>
|
339 |
</div>
|
340 |
</div>
|
lib/menu_blocking_advancedBlocking.php
CHANGED
@@ -1,32 +1,60 @@
|
|
1 |
<div class="wordfenceHelpLink"><a href="<?php echo $helpLink; ?>" target="_blank" class="wfhelp"></a><a href="<?php echo $helpLink; ?>" target="_blank"><?php echo $helpLabel; ?></a></div>
|
2 |
<div>
|
3 |
<div class="wordfenceModeElem" id="wordfenceMode_rangeBlocking"></div>
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
|
|
|
|
|
|
|
|
8 |
if( isset( $_GET['wfBlockRange'] ) && preg_match('/^[\da-f\.\s\t\-:]+$/i', $_GET['wfBlockRange']) ){ echo wp_kses($_GET['wfBlockRange'], array()); }
|
9 |
-
?>" onkeyup="WFAD.calcRangeTotal();"
|
10 |
-
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
if( isset( $_GET['wfBlockHostname'] ) ){ echo esc_attr($_GET['wfBlockHostname']); }
|
13 |
-
?>"
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
<
|
20 |
-
<
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
</
|
28 |
-
|
29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
<p>
|
31 |
<h2>Current list of ranges and patterns you've blocked</h2>
|
32 |
<div id="currentBlocks"></div>
|
@@ -45,16 +73,16 @@
|
|
45 |
<div style="color: #AAA;">
|
46 |
{{/if}}
|
47 |
<div>
|
48 |
-
<strong>IP Range:</strong> 
|
49 |
</div>
|
50 |
<div>
|
51 |
-
<strong>Hostname:</strong> 
|
52 |
</div>
|
53 |
<div>
|
54 |
-
<strong>Browser Pattern:</strong> 
|
55 |
</div>
|
56 |
<div>
|
57 |
-
<strong>Source website:</strong> 
|
58 |
</div>
|
59 |
<div>
|
60 |
<strong>Reason:</strong> ${reason}
|
1 |
<div class="wordfenceHelpLink"><a href="<?php echo $helpLink; ?>" target="_blank" class="wfhelp"></a><a href="<?php echo $helpLink; ?>" target="_blank"><?php echo $helpLabel; ?></a></div>
|
2 |
<div>
|
3 |
<div class="wordfenceModeElem" id="wordfenceMode_rangeBlocking"></div>
|
4 |
+
<?php if (!wfConfig::get('firewallEnabled')) { ?>
|
5 |
+
<div class="wf-notice"><p><strong>Rate limiting rules and advanced blocking are disabled.</strong> You can enable it on the <a href="admin.php?page=WordfenceSecOpt">Wordfence Options page</a> at the top.</p></div>
|
6 |
+
<?php } ?>
|
7 |
+
<div class="wf-form wf-form-horizontal wf-add-top">
|
8 |
+
<div class="wf-form-group">
|
9 |
+
<label for="ipRange" class="wf-col-sm-2 wf-control-label">IP address range</label>
|
10 |
+
<div class="wf-col-sm-6">
|
11 |
+
<input type="text" id="ipRange" name="ipRange" class="wf-form-control" value="<?php
|
12 |
if( isset( $_GET['wfBlockRange'] ) && preg_match('/^[\da-f\.\s\t\-:]+$/i', $_GET['wfBlockRange']) ){ echo wp_kses($_GET['wfBlockRange'], array()); }
|
13 |
+
?>" onkeyup="WFAD.calcRangeTotal();">
|
14 |
+
<span class="wf-help-block" id="wfShowRangeTotal"></span>
|
15 |
+
<span class="wf-help-block">Examples: 192.168.200.200 - 192.168.200.220</span>
|
16 |
+
</div>
|
17 |
+
</div>
|
18 |
+
<div class="wf-form-group">
|
19 |
+
<label for="hostname" class="wf-col-sm-2 wf-control-label">Hostname</label>
|
20 |
+
<div class="wf-col-sm-6">
|
21 |
+
<input type="text" id="hostname" name="hostname" class="wf-form-control" value="<?php
|
22 |
if( isset( $_GET['wfBlockHostname'] ) ){ echo esc_attr($_GET['wfBlockHostname']); }
|
23 |
+
?>">
|
24 |
+
<span class="wf-help-block">Examples: *.amazonaws.com, *.linode.com</span>
|
25 |
+
<span class="wf-help-block">Using this setting will make a DNS query per unique IP address (per visitor), and can add additional load. High traffic<br> sites may not want to use this feature.</span>
|
26 |
+
</div>
|
27 |
+
</div>
|
28 |
+
<div class="wf-form-group">
|
29 |
+
<label for="uaRange" class="wf-col-sm-2 wf-control-label">User-Agent (browser) that matches</label>
|
30 |
+
<div class="wf-col-sm-6">
|
31 |
+
<input type="text" id="uaRange" name="uaRange" class="wf-form-control">
|
32 |
+
<span class="wf-help-block">(Case insensitive)</span>
|
33 |
+
<span class="wf-help-block">Examples: *badRobot*, AnotherBadRobot*, *someBrowserSuffix</span>
|
34 |
+
</div>
|
35 |
+
</div>
|
36 |
+
<div class="wf-form-group">
|
37 |
+
<label for="wfreferer" class="wf-col-sm-2 wf-control-label">Referer (website visitor arrived from) that matches</label>
|
38 |
+
<div class="wf-col-sm-6">
|
39 |
+
<input type="text" id="wfreferer" name="wfreferer" class="wf-form-control">
|
40 |
+
<span class="wf-help-block">(Case insensitive)</span>
|
41 |
+
<span class="wf-help-block">Examples: *badWebsite*, AnotherBadWebsite*, *someWebsiteSuffix</span>
|
42 |
+
</div>
|
43 |
+
</div>
|
44 |
+
<div class="wf-form-group">
|
45 |
+
<label for="wfReason" class="wf-col-sm-2 wf-control-label">Enter a reason you're blocking this visitor pattern</label>
|
46 |
+
<div class="wf-col-sm-6">
|
47 |
+
<input type="text" id="wfReason" name="wfReason" class="wf-form-control">
|
48 |
+
<span class="wf-help-block">(Case insensitive)</span>
|
49 |
+
<span class="wf-help-block">Why a reason: The reason you specify above is for your own record keeping.</span>
|
50 |
+
</div>
|
51 |
+
</div>
|
52 |
+
<div class="wf-form-group">
|
53 |
+
<div class="wf-col-sm-6 wf-col-sm-offset-2">
|
54 |
+
<a class="wf-btn wf-btn-primary" href="#" onclick="WFAD.blockIPUARange(jQuery('#ipRange').val(), jQuery('#hostname').val(), jQuery('#uaRange').val(), jQuery('#wfreferer').val(), jQuery('#wfReason').val()); return false;">Block Visitors Matching this Pattern</a>
|
55 |
+
</div>
|
56 |
+
</div>
|
57 |
+
</div>
|
58 |
<p>
|
59 |
<h2>Current list of ranges and patterns you've blocked</h2>
|
60 |
<div id="currentBlocks"></div>
|
73 |
<div style="color: #AAA;">
|
74 |
{{/if}}
|
75 |
<div>
|
76 |
+
<strong>IP Range:</strong> <span class="wf-split-word-xs">${ipPattern}</span>
|
77 |
</div>
|
78 |
<div>
|
79 |
+
<strong>Hostname:</strong> <span class="wf-split-word-xs">${hostnamePattern}</span>
|
80 |
</div>
|
81 |
<div>
|
82 |
+
<strong>Browser Pattern:</strong> <span class="wf-split-word-xs">${browserPattern}</span>
|
83 |
</div>
|
84 |
<div>
|
85 |
+
<strong>Source website:</strong> <span class="wf-split-word-xs">${refererPattern}</span>
|
86 |
</div>
|
87 |
<div>
|
88 |
<strong>Reason:</strong> ${reason}
|
lib/menu_blocking_blockedIPs.php
CHANGED
@@ -2,7 +2,7 @@
|
|
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>
|
@@ -12,9 +12,9 @@
|
|
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>
|
17 |
-
<a href="#" class="wfTab1 wfTabSwitch" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_throttledIPs', function(){ WFAD.staticTabChanged(); }); return false;">IPs throttled for accessing the site too frequently</a>
|
18 |
</div>
|
19 |
<div class="wfTabsContainer">
|
20 |
<div id="wfActivity_blockedIPs" class="wfDataPanel"><div class="wfLoadingWhite32"></div></div>
|
@@ -65,7 +65,7 @@
|
|
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>
|
@@ -115,7 +115,7 @@
|
|
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>
|
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<span class="wf-hidden-xs"> IP addresses</span></a> | <a href="#" onclick="WFAD.clearAllBlocked('locked'); return false;">Clear all locked out<span class="wf-hidden-xs"> IP addresses</span></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>
|
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;"><span class="wf-visible-xs">Blocked</span><span class="wf-hidden-xs">IPs blocked from accessing the site</span></a>
|
16 |
+
<a href="#" class="wfTab1 wfTabSwitch" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_lockedOutIPs', function(){ WFAD.staticTabChanged(); }); return false;"><span class="wf-visible-xs">Locked Out</span><span class="wf-hidden-xs">IPs locked out from login</span></a>
|
17 |
+
<a href="#" class="wfTab1 wfTabSwitch" onclick="wordfenceAdmin.switchTab(this, 'wfTab1', 'wfDataPanel', 'wfActivity_throttledIPs', function(){ WFAD.staticTabChanged(); }); return false;"><span class="wf-visible-xs">Throttled</span><span class="wf-hidden-xs">IPs throttled for accessing the site too frequently</span></a>
|
18 |
</div>
|
19 |
<div class="wfTabsContainer">
|
20 |
<div id="wfActivity_blockedIPs" class="wfDataPanel"><div class="wfLoadingWhite32"></div></div>
|
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;"><span class="wf-visible-xs">Block All Temporary</span><span class="wf-hidden-xs">Permanently block all locked out IP addresses</span></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>
|
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;"><span class="wf-visible-xs">Block All Temporary</span><span class="wf-hidden-xs">Permanently block all temporarily blocked IP addresses</span></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>
|
lib/menu_blocking_countryBlocking.php
CHANGED
@@ -23,59 +23,123 @@ WFAD.countryMap = <?php echo json_encode($wfBulkCountries); ?>;
|
|
23 |
<p class="center"><a class="wf-btn wf-btn-primary wf-btn-callout" href="https://www.wordfence.com/gnl1countryBlock1/wordfence-signup/" target="_blank">Get Premium</a></p>
|
24 |
</div>
|
25 |
<?php } ?>
|
26 |
-
|
27 |
-
|
28 |
-
<?php
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
</
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
<
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
</div>
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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>
|
80 |
</div>
|
81 |
<script type="text/javascript">
|
@@ -87,6 +151,88 @@ jQuery(function(){ WFAD.loadBlockedCountries('<?php echo wfConfig::get('cbl_coun
|
|
87 |
<?php
|
88 |
}
|
89 |
?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
</script>
|
91 |
<script type="text/x-jquery-template" id="wfWelcomeContentCntBlk">
|
92 |
<div>
|
23 |
<p class="center"><a class="wf-btn wf-btn-primary wf-btn-callout" href="https://www.wordfence.com/gnl1countryBlock1/wordfence-signup/" target="_blank">Get Premium</a></p>
|
24 |
</div>
|
25 |
<?php } ?>
|
26 |
+
<?php if (!wfConfig::get('firewallEnabled')) { ?>
|
27 |
+
<div class="wf-notice"><p><strong>Rate limiting rules and advanced blocking are disabled.</strong> You can enable it on the <a href="admin.php?page=WordfenceSecOpt">Wordfence Options page</a> at the top.</p></div>
|
28 |
+
<?php } ?>
|
29 |
+
|
30 |
+
<h3>Country Blocking Options</h3>
|
31 |
+
<div class="wf-form wf-form-horizontal wf-add-top wf-add-bottom">
|
32 |
+
<div class="wf-form-group">
|
33 |
+
<label for="wfBlockAction" class="wf-col-sm-2 wf-control-label">What to do when we block someone</label>
|
34 |
+
<div class="wf-col-sm-6">
|
35 |
+
<select id="wfBlockAction" class="wf-form-control">
|
36 |
+
<option value="block"<?php if(wfConfig::get('cbl_action') == 'block'){ echo ' selected'; } ?>>Show the standard Wordfence blocked message</option>
|
37 |
+
<option value="redir"<?php if(wfConfig::get('cbl_action') == 'redir'){ echo ' selected'; } ?>>Redirect to the URL below</option>
|
38 |
+
</select>
|
39 |
+
</div>
|
40 |
+
</div>
|
41 |
+
<div class="wf-form-group">
|
42 |
+
<label for="wfRedirURL" class="wf-col-sm-2 wf-control-label">URL to redirect blocked users to</label>
|
43 |
+
<div class="wf-col-sm-6">
|
44 |
+
<input type="text" id="wfRedirURL" name="wfRedirURL" class="wf-form-control" value="<?php if(wfConfig::get('cbl_redirURL')){ echo esc_attr(wfConfig::get('cbl_redirURL')); } ?>">
|
45 |
+
<span class="wf-help-block">Must start with http:// for example http://example.com/blocked/</span>
|
46 |
+
</div>
|
47 |
+
</div>
|
48 |
+
<div class="wf-form-group">
|
49 |
+
<label for="wfLoggedInBlocked" class="wf-col-sm-2 wf-control-label">Block countries even if they are logged in</label>
|
50 |
+
<div class="wf-col-sm-6">
|
51 |
+
<div class="wf-checkbox"><input type="checkbox" id="wfLoggedInBlocked" name="wfLoggedInBlocked" value="1" <?php if(wfConfig::get('cbl_loggedInBlocked')){ echo 'checked'; } ?>></div>
|
52 |
+
</div>
|
53 |
+
</div>
|
54 |
+
<div class="wf-form-group">
|
55 |
+
<label for="wfLoginFormBlocked" class="wf-col-sm-2 wf-control-label">Block access to the login form</label>
|
56 |
+
<div class="wf-col-sm-6">
|
57 |
+
<div class="wf-checkbox"><input type="checkbox" id="wfLoginFormBlocked" name="wfLoginFormBlocked" value="1" <?php if(wfConfig::get('cbl_loginFormBlocked')){ echo 'checked'; } ?>></div>
|
58 |
+
</div>
|
59 |
+
</div>
|
60 |
+
<div class="wf-form-group">
|
61 |
+
<label for="wfRestOfSiteBlocked" class="wf-col-sm-2 wf-control-label">Block access to the rest of the site (outside the login form)</label>
|
62 |
+
<div class="wf-col-sm-6">
|
63 |
+
<div class="wf-checkbox"><input type="checkbox" id="wfRestOfSiteBlocked" name="wfRestOfSiteBlocked" value="1" <?php if(wfConfig::get('cbl_restOfSiteBlocked')){ echo 'checked'; } ?>></div>
|
64 |
+
<span class="wf-help-block">If you use Google Adwords, this is not recommended. <a href="https://docs.wordfence.com/en/Country_blocking#Google_Adwords_says_I_can.27t_block_countries._How_do_I_work_around_that.3F" target="_blank">Learn More</a></span>
|
65 |
+
</div>
|
66 |
+
</div>
|
67 |
+
</div>
|
68 |
+
|
69 |
+
<h3>Advanced Country Blocking Options</h3>
|
70 |
+
<div class="wf-form wf-form-horizontal wf-add-top wf-add-bottom">
|
71 |
+
<div class="wf-form-group">
|
72 |
+
<label for="wfBypassRedirURL" class="wf-col-sm-2 wf-control-label">Bypass Redirect</label>
|
73 |
+
<div class="wf-col-sm-6">
|
74 |
+
<span class="wf-help-block">If user hits the URL</span>
|
75 |
+
<input type="text" id="wfBypassRedirURL" name="wfBypassRedirURL" class="wf-form-control" value="<?php echo esc_attr(wfConfig::get('cbl_bypassRedirURL'), array()); ?>">
|
76 |
+
<span class="wf-help-block">then redirect that user to</span>
|
77 |
+
<input type="text" id="wfBypassRedirDest" name="wfBypassRedirDest" class="wf-form-control" value="<?php echo esc_attr(wfConfig::get('cbl_bypassRedirDest'), array()); ?>">
|
78 |
+
<span class="wf-help-block">and set a cookie that will bypass all country blocking.</span>
|
79 |
+
</div>
|
80 |
+
</div>
|
81 |
+
<div class="wf-form-group">
|
82 |
+
<label for="wfBypassViewURL" class="wf-col-sm-2 wf-control-label">Bypass Cookie</label>
|
83 |
+
<div class="wf-col-sm-6">
|
84 |
+
<span class="wf-help-block">If user who is allowed to access the site views the URL</span>
|
85 |
+
<input type="text" id="wfBypassViewURL" name="wfBypassViewURL" class="wf-form-control" value="<?php echo esc_attr(wfConfig::get('cbl_bypassViewURL', ""), array()); ?>">
|
86 |
+
<span class="wf-help-block">then set a cookie that will bypass country blocking in future in case that user hits the site from a blocked country.</span>
|
87 |
+
</div>
|
88 |
+
</div>
|
89 |
</div>
|
90 |
+
|
91 |
+
<h3>Select which countries to block</h3>
|
92 |
+
<div class="wf-add-bottom"><button type="button" class="wf-btn wf-btn-primary wf-countries-shortcut" data-shortcut="select">Block All</button> <button type="button" class="wf-btn wf-btn-default wf-countries-shortcut" data-shortcut="deselect">Unblock All</button></div>
|
93 |
+
<?php
|
94 |
+
asort($wfBulkCountries);
|
95 |
+
$letters = '';
|
96 |
+
foreach ($wfBulkCountries as $name) {
|
97 |
+
$l = strtoupper(substr($name, 0, 1));
|
98 |
+
$test = strtoupper(substr($letters, -1));
|
99 |
+
if ($l != $test) {
|
100 |
+
$letters .= $l;
|
101 |
+
}
|
102 |
+
}
|
103 |
+
$letters = str_split($letters);
|
104 |
+
?>
|
105 |
+
<?php
|
106 |
+
$current = '';
|
107 |
+
foreach ($wfBulkCountries as $code => $name) {
|
108 |
+
$test = strtoupper(substr($name, 0, 1));
|
109 |
+
if ($test != $current) {
|
110 |
+
if ($current != '') {
|
111 |
+
echo '</ul>';
|
112 |
+
}
|
113 |
+
$current = $test;
|
114 |
+
?>
|
115 |
+
<div class="wf-blocked-countries-section wf-add-top wf-add-bottom-small">
|
116 |
+
<div class="wf-blocked-countries-section-title" data-letter="<?php echo $current; ?>"><?php echo $current; ?></div>
|
117 |
+
<div class="wf-blocked-countries-section-spacer wf-hidden-xs"></div>
|
118 |
+
<ul class="wf-blocked-countries-section-options wf-hidden-xs">
|
119 |
+
<?php
|
120 |
+
foreach ($letters as $l) {
|
121 |
+
echo "<li><a href='#' data-letter='{$l}'" . ($l == $current ? " class='active-section'" : '') . ">{$l}</a></li>";
|
122 |
+
}
|
123 |
+
?>
|
124 |
+
</ul>
|
125 |
+
</div>
|
126 |
+
<ul class="wf-blocked-countries">
|
127 |
+
<?php
|
128 |
+
}
|
129 |
+
|
130 |
+
echo '<li id="wfCountryCheckbox_' . esc_attr($code) . '" data-country="' . esc_attr($code) . '"><a href="#">' . esc_html($name) . '</a></li>';
|
131 |
+
}
|
132 |
+
|
133 |
+
if ($current != '') {
|
134 |
+
echo '</ul>';
|
135 |
+
}
|
136 |
+
?>
|
137 |
+
|
138 |
+
<p>
|
139 |
+
<input type="button" name="but4" class="wf-btn wf-btn-primary" value="Save blocking options and country list" onclick="WFAD.saveCountryBlocking();"><br>
|
140 |
+
<div class="wfAjax24"></div><span class="wfSavedMsg"> Your changes have been saved!</span>
|
141 |
+
</p>
|
142 |
+
|
143 |
<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>
|
144 |
</div>
|
145 |
<script type="text/javascript">
|
151 |
<?php
|
152 |
}
|
153 |
?>
|
154 |
+
|
155 |
+
(function($) {
|
156 |
+
function WFScanScheduleSave() {
|
157 |
+
var schedMode = $('.wf-card.active').data('mode');
|
158 |
+
|
159 |
+
var schedule = [];
|
160 |
+
$('.schedule-day').each(function() {
|
161 |
+
var hours = [];
|
162 |
+
$(this).find('.time').each(function() {
|
163 |
+
hours[$(this).data('hour')] = $(this).hasClass('active') ? '1' : '0';
|
164 |
+
});
|
165 |
+
schedule[$(this).data('day')] = hours.join(',');
|
166 |
+
});
|
167 |
+
var schedTxt = schedule.join('|');
|
168 |
+
|
169 |
+
$('.wf-card-subtitle').html('');
|
170 |
+
$('.wf-card.active .wf-card-subtitle').html('Updating scan schedule...');
|
171 |
+
|
172 |
+
WFAD.ajax('wordfence_saveScanSchedule', {
|
173 |
+
schedMode: schedMode,
|
174 |
+
schedTxt: schedTxt
|
175 |
+
}, function(res) {
|
176 |
+
if (res.ok) {
|
177 |
+
$('.wf-card.active .wf-card-subtitle').html(res.nextStart);
|
178 |
+
}
|
179 |
+
});
|
180 |
+
}
|
181 |
+
|
182 |
+
$('.wf-blocked-countries a').on('click', function(e) {
|
183 |
+
e.preventDefault();
|
184 |
+
e.stopPropagation();
|
185 |
+
|
186 |
+
var selected = $(this).closest('li').hasClass('active');
|
187 |
+
if (selected) {
|
188 |
+
$(this).closest('li').removeClass('active');
|
189 |
+
}
|
190 |
+
else {
|
191 |
+
$(this).closest('li').addClass('active');
|
192 |
+
}
|
193 |
+
|
194 |
+
//WFScanScheduleSave();
|
195 |
+
});
|
196 |
+
|
197 |
+
$('.wf-blocked-countries li').on('click', function(e) {
|
198 |
+
e.preventDefault();
|
199 |
+
e.stopPropagation();
|
200 |
+
|
201 |
+
var selected = $(this).hasClass('active');
|
202 |
+
if (selected) {
|
203 |
+
$(this).removeClass('active');
|
204 |
+
}
|
205 |
+
else {
|
206 |
+
$(this).addClass('active');
|
207 |
+
}
|
208 |
+
|
209 |
+
//WFScanScheduleSave();
|
210 |
+
});
|
211 |
+
|
212 |
+
$('.wf-countries-shortcut').on('click', function(e) {
|
213 |
+
e.preventDefault();
|
214 |
+
e.stopPropagation();
|
215 |
+
|
216 |
+
var mode = $(this).data('shortcut');
|
217 |
+
if (mode == 'select') {
|
218 |
+
$('.wf-blocked-countries li').addClass('active');
|
219 |
+
} else if (mode == 'deselect') {
|
220 |
+
$('.wf-blocked-countries li').removeClass('active');
|
221 |
+
}
|
222 |
+
|
223 |
+
//WFScanScheduleSave();
|
224 |
+
});
|
225 |
+
|
226 |
+
$('.wf-blocked-countries-section-options a').on('click', function(e) {
|
227 |
+
e.preventDefault();
|
228 |
+
e.stopPropagation();
|
229 |
+
|
230 |
+
var letter = $(this).data('letter');
|
231 |
+
$('html, body').animate({
|
232 |
+
scrollTop: $('.wf-blocked-countries-section-title[data-letter=' + letter + ']').offset().top - 100
|
233 |
+
}, 1000);
|
234 |
+
});
|
235 |
+
})(jQuery);
|
236 |
</script>
|
237 |
<script type="text/x-jquery-template" id="wfWelcomeContentCntBlk">
|
238 |
<div>
|
lib/menu_dashboard.php
CHANGED
@@ -52,24 +52,22 @@ $d = new wfDashboard();
|
|
52 |
</div>
|
53 |
<div class="wf-dashboard-item-extra">
|
54 |
<ul class="wf-dashboard-item-list">
|
55 |
-
<?php for ($g = 0; $g < ceil(count($d->features) / 5); $g++): ?>
|
56 |
<li>
|
57 |
-
<ul class="wf-dashboard-item-list wf-dashboard-item-list-horizontal">
|
58 |
-
<?php
|
59 |
<li>
|
60 |
-
<div class="wf-dashboard-item-list-title"><a href="<?php echo esc_html($
|
61 |
-
<?php if ($
|
62 |
-
<div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-enabled"><i class="fa fa-circle" aria-hidden="true"></i> Enabled</div>
|
63 |
-
<?php elseif ($
|
64 |
-
<div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-disabled"><i class="fa fa-circle" aria-hidden="true"></i> Disabled</div>
|
65 |
-
<?php elseif ($
|
66 |
-
<div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-premium"><i class="fa fa-circle" aria-hidden="true"></i> Premium</div>
|
67 |
<?php endif; ?>
|
68 |
</li>
|
69 |
-
<?php
|
70 |
</ul>
|
71 |
</li>
|
72 |
-
<?php endfor; ?>
|
73 |
</ul>
|
74 |
</div>
|
75 |
</div>
|
52 |
</div>
|
53 |
<div class="wf-dashboard-item-extra">
|
54 |
<ul class="wf-dashboard-item-list">
|
|
|
55 |
<li>
|
56 |
+
<ul class="wf-dashboard-item-list wf-dashboard-item-list-horizontal wf-dashboard-item-list-equal">
|
57 |
+
<?php foreach ($d->features as $f): ?>
|
58 |
<li>
|
59 |
+
<div class="wf-dashboard-item-list-title"><a href="<?php echo esc_html($f['link']); ?>"><?php echo esc_html($f['name']); ?></a></div>
|
60 |
+
<?php if ($f['state'] == wfDashboard::FEATURE_ENABLED): ?>
|
61 |
+
<div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-enabled"><i class="fa fa-circle" aria-hidden="true"></i><span class="wf-hidden-lg"><br></span> Enabled</div>
|
62 |
+
<?php elseif ($f['state'] == wfDashboard::FEATURE_DISABLED): ?>
|
63 |
+
<div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-disabled"><i class="fa fa-circle" aria-hidden="true"></i><span class="wf-hidden-lg"><br></span> Disabled</div>
|
64 |
+
<?php elseif ($f['state'] == wfDashboard::FEATURE_PREMIUM): ?>
|
65 |
+
<div class="wf-dashboard-item-list-state wf-dashboard-item-list-state-premium"><i class="fa fa-circle" aria-hidden="true"></i><span class="wf-hidden-lg"><br></span> Premium</div>
|
66 |
<?php endif; ?>
|
67 |
</li>
|
68 |
+
<?php endforeach; ?>
|
69 |
</ul>
|
70 |
</li>
|
|
|
71 |
</ul>
|
72 |
</div>
|
73 |
</div>
|
lib/menu_firewall_waf.php
CHANGED
@@ -93,7 +93,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
|
|
93 |
<div class="wf-col-sm-7 wf-col-md-5">
|
94 |
<?php if (!WFWAF_AUTO_PREPEND): ?>
|
95 |
<p class="wf-form-control-static wf-notice-text">Basic WordPress Protection</p>
|
96 |
-
<p class="wf-form-control-static"><a class="wf-btn wf-btn-primary
|
97 |
<?php else: ?>
|
98 |
<p class="wf-form-control-static wf-success-text">Extended Protection</p>
|
99 |
<?php endif ?>
|
@@ -224,8 +224,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
|
|
224 |
</div>
|
225 |
<br>
|
226 |
|
227 |
-
</div>
|
228 |
-
<br>
|
229 |
|
230 |
<h2>Advanced Configuration</h2>
|
231 |
<div id="waf-advanced-options" class="wf-form-horizontal">
|
@@ -236,6 +235,9 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
|
|
236 |
<div class="wf-col-xs-12">
|
237 |
<label class="wf-checkbox-inline"><input type="checkbox" id="waf-disable-ip-blocking" name="waf-disable-ip-blocking" value="1"<?php echo $config->getConfig('disableWAFIPBlocking') ? ' checked' : ''; ?>>Delay IP and Country blocking until after WordPress and plugins have loaded (only process firewall rules early) <a href="https://docs.wordfence.com/en/WAF#Advanced_Configuration" target="_blank" class="wfhelp"></a></label>
|
238 |
</div>
|
|
|
|
|
|
|
239 |
</div>
|
240 |
</div>
|
241 |
|
@@ -306,117 +308,119 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
|
|
306 |
$bulkActionForm = ob_get_clean();
|
307 |
echo $bulkActionForm;
|
308 |
?>
|
309 |
-
<
|
310 |
-
<
|
311 |
-
|
312 |
-
<
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
<
|
327 |
-
|
328 |
-
|
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 |
-
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
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 |
<?php echo $bulkActionForm ?>
|
421 |
|
422 |
</script>
|
@@ -440,7 +444,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
|
|
440 |
whitelistedPath: url,
|
441 |
whitelistedParam: param + '[' + paramName + ']'
|
442 |
}, function() {
|
443 |
-
WFAD.colorbox('
|
444 |
'whitelist was saved successfully.');
|
445 |
}, false);
|
446 |
}
|
@@ -541,12 +545,12 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
|
|
541 |
var select = $(this).find('select[name=wf-bulk-action]');
|
542 |
var bulkActionCallback = function(res) {
|
543 |
if (typeof res === 'object' && res.success) {
|
544 |
-
WFAD.colorbox('
|
545 |
'whitelist was saved successfully.');
|
546 |
WFAD.wafData = res.data;
|
547 |
WFAD.wafConfigPageRender();
|
548 |
} else {
|
549 |
-
WFAD.colorbox('
|
550 |
'Web Application Firewall whitelist.');
|
551 |
}
|
552 |
};
|
@@ -653,7 +657,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
|
|
653 |
deletedWhitelistedPath: path,
|
654 |
deletedWhitelistedParam: param
|
655 |
}, function() {
|
656 |
-
WFAD.colorbox('
|
657 |
'whitelist was saved successfully.');
|
658 |
}, false);
|
659 |
}
|
@@ -678,7 +682,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
|
|
678 |
newWhitelistedParam: newWhitelistedParam.val(),
|
679 |
newWhitelistedEnabled: newWhitelistedEnabled.val()
|
680 |
}, function() {
|
681 |
-
WFAD.colorbox('
|
682 |
'whitelist was saved successfully.');
|
683 |
}, false);
|
684 |
});
|
@@ -698,7 +702,7 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
|
|
698 |
whitelistedParam: oldWhitelistedParam.val(),
|
699 |
whitelistedEnabled: enabled
|
700 |
}, function() {
|
701 |
-
WFAD.colorbox('
|
702 |
'whitelist was saved successfully.');
|
703 |
}, false);
|
704 |
});
|
@@ -726,6 +730,11 @@ $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&wafAction=removeA
|
|
726 |
var disabled = this.checked ? 1 : 0;
|
727 |
WFAD.updateConfig('disableWAFIPBlocking', disabled);
|
728 |
})
|
|
|
|
|
|
|
|
|
|
|
729 |
})(jQuery);
|
730 |
</script>
|
731 |
|
93 |
<div class="wf-col-sm-7 wf-col-md-5">
|
94 |
<?php if (!WFWAF_AUTO_PREPEND): ?>
|
95 |
<p class="wf-form-control-static wf-notice-text">Basic WordPress Protection</p>
|
96 |
+
<p class="wf-form-control-static"><a class="wf-btn wf-btn-primary" href="<?php echo $wafConfigURL ?>">Optimize the Wordfence Firewall</a></p>
|
97 |
<?php else: ?>
|
98 |
<p class="wf-form-control-static wf-success-text">Extended Protection</p>
|
99 |
<?php endif ?>
|
224 |
</div>
|
225 |
<br>
|
226 |
|
227 |
+
</div>
|
|
|
228 |
|
229 |
<h2>Advanced Configuration</h2>
|
230 |
<div id="waf-advanced-options" class="wf-form-horizontal">
|
235 |
<div class="wf-col-xs-12">
|
236 |
<label class="wf-checkbox-inline"><input type="checkbox" id="waf-disable-ip-blocking" name="waf-disable-ip-blocking" value="1"<?php echo $config->getConfig('disableWAFIPBlocking') ? ' checked' : ''; ?>>Delay IP and Country blocking until after WordPress and plugins have loaded (only process firewall rules early) <a href="https://docs.wordfence.com/en/WAF#Advanced_Configuration" target="_blank" class="wfhelp"></a></label>
|
237 |
</div>
|
238 |
+
<div class="wf-col-xs-12">
|
239 |
+
<label class="wf-checkbox-inline"><input type="checkbox" id="waf-disable-blacklist-blocking" name="waf-disable-blacklist-blocking" value="1"<?php echo !$config->getConfig('disableWAFBlacklistBlocking') ? ' checked' : ''; ?>>Preemptively block malicious IP addresses <span style="color: #F00;">Premium Feature</span> <a href="https://docs.wordfence.com/en/WAF#Advanced_Configuration" target="_blank" class="wfhelp"></a></label>
|
240 |
+
</div>
|
241 |
</div>
|
242 |
</div>
|
243 |
|
308 |
$bulkActionForm = ob_get_clean();
|
309 |
echo $bulkActionForm;
|
310 |
?>
|
311 |
+
<div class="whitelist-table-container">
|
312 |
+
<table class="wf-striped-table whitelist-table">
|
313 |
+
<thead>
|
314 |
+
<tr>
|
315 |
+
<th style="width: 2%;text-align: center"><input type="checkbox" class="wf-whitelist-table-bulk-action"></th>
|
316 |
+
<th style="width: 5%;">Enabled</th>
|
317 |
+
<th>URL</th>
|
318 |
+
<th>Param</th>
|
319 |
+
<th>Created</th>
|
320 |
+
<th>Source</th>
|
321 |
+
<th>User</th>
|
322 |
+
<th>IP</th>
|
323 |
+
<th>Action</th>
|
324 |
+
</tr>
|
325 |
+
</thead>
|
326 |
+
{{if whitelistedURLParams.length > 5}}
|
327 |
+
<tfoot>
|
328 |
+
<tr>
|
329 |
+
<th><input type="checkbox" class="wf-whitelist-table-bulk-action"></th>
|
330 |
+
<th style="width: 5%;">Enabled</th>
|
331 |
+
<th>URL</th>
|
332 |
+
<th>Param</th>
|
333 |
+
<th>Created</th>
|
334 |
+
<th>Source</th>
|
335 |
+
<th>User</th>
|
336 |
+
<th>IP</th>
|
337 |
+
<th>Action</th>
|
338 |
+
</tr>
|
339 |
+
{{/if}}
|
340 |
+
</tfoot>
|
341 |
+
<tbody>
|
342 |
+
<tr class="wf-table-filters">
|
343 |
+
<td colspan="2"></td>
|
344 |
+
<td><input data-column-index="2" placeholder="Filter URL" type="text"></td>
|
345 |
+
<td><input data-column-index="3" placeholder="Filter Param" type="text"></td>
|
346 |
+
<td><input data-column-index="4" placeholder="Filter Created" type="text"></td>
|
347 |
+
<td><input data-column-index="5" placeholder="Filter Source" type="text"></td>
|
348 |
+
<td><input style="max-width:100px;" data-column-index="6" placeholder="Filter User" type="text"></td>
|
349 |
+
<td><input style="max-width:100px;" data-column-index="7" placeholder="Filter IP" type="text"></td>
|
350 |
+
<td></td>
|
351 |
+
</tr>
|
352 |
+
{{each(idx, whitelistedURLParam) whitelistedURLParams}}
|
353 |
+
<tr data-index="${idx}">
|
354 |
+
<td style="text-align: center;"><input type="checkbox" class="wf-whitelist-table-bulk-checkbox"></td>
|
355 |
+
<td style="text-align: center;">
|
356 |
+
<input name="replaceWhitelistedEnabled" type="hidden" value="${whitelistedURLParam.data.disabled}">
|
357 |
+
<input name="whitelistedEnabled" type="checkbox" value="1"
|
358 |
+
{{if (!whitelistedURLParam.data.disabled)}} checked{{/if}}>
|
359 |
+
</td>
|
360 |
+
<td>
|
361 |
+
<input name="replaceWhitelistedPath" type="hidden" value="${whitelistedURLParam.path}">
|
362 |
+
<span class="whitelist-display">${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.path))}</span>
|
363 |
+
<input name="whitelistedPath" class="whitelist-edit whitelist-path" type="text"
|
364 |
+
value="${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.path))}">
|
365 |
+
</td>
|
366 |
+
<td>
|
367 |
+
<input name="replaceWhitelistedParam" type="hidden" value="${whitelistedURLParam.paramKey}">
|
368 |
+
<span class="whitelist-display">${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.paramKey))}</span>
|
369 |
+
<input name="whitelistedParam" class="whitelist-edit whitelist-param-key"
|
370 |
+
type="text" value="${WFAD.htmlEscape(WFAD.base64_decode(whitelistedURLParam.paramKey))}">
|
371 |
+
</td>
|
372 |
+
<td>
|
373 |
+
{{if (whitelistedURLParam.data.timestamp)}}
|
374 |
+
${WFAD.dateFormat((new Date(whitelistedURLParam.data.timestamp * 1000)))}
|
375 |
+
{{else}}
|
376 |
+
-
|
377 |
+
{{/if}}
|
378 |
+
</td>
|
379 |
+
<td>
|
380 |
+
{{if (whitelistedURLParam.data.description)}}
|
381 |
+
${whitelistedURLParam.data.description}
|
382 |
+
{{else}}
|
383 |
+
-
|
384 |
+
{{/if}}
|
385 |
+
</td>
|
386 |
+
<td>
|
387 |
+
{{if (whitelistedURLParam.data.userID)}}
|
388 |
+
{{if (whitelistedURLParam.data.username)}}
|
389 |
+
${whitelistedURLParam.data.username}
|
390 |
+
{{else}}
|
391 |
+
${whitelistedURLParam.data.userID}
|
392 |
+
{{/if}}
|
393 |
+
{{else}}
|
394 |
+
-
|
395 |
+
{{/if}}
|
396 |
+
</td>
|
397 |
+
<td>
|
398 |
+
{{if (whitelistedURLParam.data.ip)}}
|
399 |
+
${whitelistedURLParam.data.ip}
|
400 |
+
{{else}}
|
401 |
+
-
|
402 |
+
{{/if}}
|
403 |
+
</td>
|
404 |
+
<td>
|
405 |
+
<span class="whitelist-display" style="white-space: nowrap">
|
406 |
+
<button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-edit">Edit</button>
|
407 |
+
<button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-delete">Delete</button>
|
408 |
+
</span>
|
409 |
+
<span class="whitelist-edit" style="white-space: nowrap">
|
410 |
+
<button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-save">Save</button>
|
411 |
+
<button type="button" class="wf-btn wf-btn-default wf-btn-sm whitelist-url-cancel">Cancel</button>
|
412 |
+
</span>
|
413 |
+
</td>
|
414 |
+
</tr>
|
415 |
+
{{/each}}
|
416 |
+
{{if (whitelistedURLParams.length == 0)}}
|
417 |
+
<tr>
|
418 |
+
<td colspan="9">No whitelisted URLs currently set.</td>
|
419 |
+
</tr>
|
420 |
+
{{/if}}
|
421 |
+
</tbody>
|
422 |
+
</table>
|
423 |
+
</div>
|
424 |
<?php echo $bulkActionForm ?>
|
425 |
|
426 |
</script>
|
444 |
whitelistedPath: url,
|
445 |
whitelistedParam: param + '[' + paramName + ']'
|
446 |
}, function() {
|
447 |
+
WFAD.colorbox('300px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
|
448 |
'whitelist was saved successfully.');
|
449 |
}, false);
|
450 |
}
|
545 |
var select = $(this).find('select[name=wf-bulk-action]');
|
546 |
var bulkActionCallback = function(res) {
|
547 |
if (typeof res === 'object' && res.success) {
|
548 |
+
WFAD.colorbox('300px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
|
549 |
'whitelist was saved successfully.');
|
550 |
WFAD.wafData = res.data;
|
551 |
WFAD.wafConfigPageRender();
|
552 |
} else {
|
553 |
+
WFAD.colorbox('300px', 'Error saving Firewall configuration', 'There was an error saving the ' +
|
554 |
'Web Application Firewall whitelist.');
|
555 |
}
|
556 |
};
|
657 |
deletedWhitelistedPath: path,
|
658 |
deletedWhitelistedParam: param
|
659 |
}, function() {
|
660 |
+
WFAD.colorbox('300px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
|
661 |
'whitelist was saved successfully.');
|
662 |
}, false);
|
663 |
}
|
682 |
newWhitelistedParam: newWhitelistedParam.val(),
|
683 |
newWhitelistedEnabled: newWhitelistedEnabled.val()
|
684 |
}, function() {
|
685 |
+
WFAD.colorbox('300px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
|
686 |
'whitelist was saved successfully.');
|
687 |
}, false);
|
688 |
});
|
702 |
whitelistedParam: oldWhitelistedParam.val(),
|
703 |
whitelistedEnabled: enabled
|
704 |
}, function() {
|
705 |
+
WFAD.colorbox('300px', 'Firewall Configuration', 'The Wordfence Web Application Firewall ' +
|
706 |
'whitelist was saved successfully.');
|
707 |
}, false);
|
708 |
});
|
730 |
var disabled = this.checked ? 1 : 0;
|
731 |
WFAD.updateConfig('disableWAFIPBlocking', disabled);
|
732 |
})
|
733 |
+
|
734 |
+
$('#waf-disable-blacklist-blocking').on('click', function() {
|
735 |
+
var disabled = this.checked ? 0 : 1;
|
736 |
+
WFAD.wafConfigSave('disableWAFBlacklistBlocking', {disableWAFBlacklistBlocking: disabled});
|
737 |
+
})
|
738 |
})(jQuery);
|
739 |
</script>
|
740 |
|
lib/menu_scan.php
CHANGED
@@ -76,27 +76,35 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
76 |
{{html longMsg}}
|
77 |
</p>
|
78 |
<div class="wfIssueOptions">
|
79 |
-
<
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
|
|
|
|
|
|
|
|
|
|
84 |
{{if data.canDelete}}
|
85 |
-
<a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone).</a>
|
86 |
<p>
|
87 |
<label><input type="checkbox" class="wfdelCheckbox" value="${id}" /> Select for bulk delete</label>
|
88 |
</p>
|
89 |
{{/if}}
|
90 |
</div>
|
91 |
<div class="wfIssueOptions">
|
92 |
-
|
93 |
-
<
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
|
|
|
|
|
|
|
|
100 |
</div>
|
101 |
</div>
|
102 |
</div>
|
@@ -125,13 +133,17 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
125 |
{{html longMsg}}
|
126 |
</p>
|
127 |
<div class="wfIssueOptions">
|
128 |
-
<
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
|
|
|
|
|
|
|
|
|
|
133 |
{{if data.canDelete}}
|
134 |
-
<a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone).</a>
|
135 |
<p>
|
136 |
<label><input type="checkbox" class="wfdelCheckbox" value="${id}" /> Select for bulk delete</label>
|
137 |
</p>
|
@@ -139,12 +151,16 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
139 |
</div>
|
140 |
<div class="wfIssueOptions">
|
141 |
{{if status == 'new'}}
|
142 |
-
<
|
143 |
-
|
144 |
-
|
|
|
|
|
145 |
{{/if}}
|
146 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
147 |
-
<
|
|
|
|
|
148 |
{{/if}}
|
149 |
</div>
|
150 |
</div>
|
@@ -169,25 +185,27 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
169 |
</p>
|
170 |
<div class="wfIssueOptions">
|
171 |
{{if (status == 'new')}}
|
172 |
-
|
|
|
173 |
<?php if (!wfUtils::isNginx()): ?>
|
174 |
-
<a href="#" onclick="WFAD.fixFPD('${id}'); return false;">Fix this issue</a>
|
175 |
<?php endif ?>
|
176 |
-
<a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
|
177 |
-
<a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a>
|
178 |
{{/if}}
|
179 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
180 |
-
<a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a>
|
181 |
{{/if}}
|
|
|
182 |
</div>
|
183 |
{{if (status == 'new')}}
|
184 |
<div class="wfIssueOptions">
|
185 |
-
<
|
186 |
-
|
187 |
-
|
|
|
188 |
</div>
|
189 |
{{/if}}
|
190 |
-
|
191 |
</div>
|
192 |
</div>
|
193 |
</script>
|
@@ -211,23 +229,28 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
211 |
|
212 |
<div class="wfIssueOptions">
|
213 |
{{if (status == 'new')}}
|
214 |
-
<
|
|
|
215 |
<?php if (!wfUtils::isNginx()): ?>
|
216 |
-
<a href="#" onclick="WFAD.disableDirectoryListing('${id}'); return false;">Fix this issue</a>
|
217 |
<?php endif ?>
|
218 |
-
|
219 |
-
|
|
|
220 |
{{/if}}
|
221 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
222 |
-
<
|
|
|
|
|
223 |
{{/if}}
|
224 |
</div>
|
225 |
<?php if (!wfUtils::isNginx()): ?>
|
226 |
{{if (status == 'new')}}
|
227 |
<div class="wfIssueOptions">
|
228 |
-
<
|
229 |
-
|
230 |
-
|
|
|
231 |
</div>
|
232 |
{{/if}}
|
233 |
<?php endif ?>
|
@@ -241,10 +264,10 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
241 |
<h2>${shortMsg}</h2>
|
242 |
<p>
|
243 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
244 |
-
<tr><th>Theme Name:</th><td>${data.name}</td></tr>
|
245 |
-
<tr><th>Current Theme Version:</th><td>${data.version}</td></tr>
|
246 |
-
<tr><th>New Theme Version:</th><td>${data.newVersion}</td></tr>
|
247 |
-
<tr><th>Theme URL:</th><td><a href="${data.URL}" target="_blank">${data.URL}</a></td></tr>
|
248 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
249 |
<tr><th>Status</th><td>
|
250 |
{{if status == 'new' }}New{{/if}}
|
@@ -258,13 +281,17 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
258 |
<a href="<?php echo get_admin_url() . 'update-core.php'; ?>">Click here to update now</a>.
|
259 |
</p>
|
260 |
<div class="wfIssueOptions">
|
261 |
-
{{if
|
262 |
-
|
263 |
-
<
|
264 |
-
<a href="#" onclick="WFAD.updateIssueStatus('${id}', '
|
|
|
|
|
265 |
{{/if}}
|
266 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
267 |
-
|
|
|
|
|
268 |
{{/if}}
|
269 |
</div>
|
270 |
</div>
|
@@ -277,11 +304,11 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
277 |
<h2>${shortMsg}</h2>
|
278 |
<p>
|
279 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
280 |
-
<tr><th>Plugin Name:</th><td>${data.Name}</td></tr>
|
281 |
-
{{if data.PluginURI}}<tr><th>Plugin Website:</th><td><a href="${data.PluginURI}" target="_blank">${data.PluginURI}</a></td></tr>{{/if}}
|
282 |
-
<tr><th>Changelog:</th><td><a href="${data.wpURL}/changelog" target="_blank">${data.wpURL}/changelog</a></td></tr>
|
283 |
-
<tr><th>Current Plugin Version:</th><td>${data.Version}</td></tr>
|
284 |
-
<tr><th>New Plugin Version:</th><td>${data.newVersion}</td></tr>
|
285 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
286 |
<tr><th>Status</th><td>
|
287 |
{{if status == 'new' }}New{{/if}}
|
@@ -296,12 +323,16 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
296 |
</p>
|
297 |
<div class="wfIssueOptions">
|
298 |
{{if status == 'new'}}
|
299 |
-
<
|
300 |
-
|
301 |
-
|
|
|
|
|
302 |
{{/if}}
|
303 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
304 |
-
<
|
|
|
|
|
305 |
{{/if}}
|
306 |
</div>
|
307 |
</div>
|
@@ -314,8 +345,8 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
314 |
<h2>${shortMsg}</h2>
|
315 |
<p>
|
316 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
317 |
-
<tr><th>Current WordPress Version:</th><td>${data.currentVersion}</td></tr>
|
318 |
-
<tr><th>New WordPress Version:</th><td>${data.newVersion}</td></tr>
|
319 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
320 |
<tr><th>Status</th><td>
|
321 |
{{if status == 'new' }}New{{/if}}
|
@@ -328,15 +359,19 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
328 |
<a href="<?php echo get_admin_url() . 'update-core.php'; ?>">Click here to update now</a>.
|
329 |
</p>
|
330 |
<div class="wfIssueOptions">
|
331 |
-
|
332 |
-
<
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
|
|
|
|
|
|
|
|
340 |
</div>
|
341 |
</script>
|
342 |
|
@@ -346,8 +381,8 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
346 |
<h2>${shortMsg}</h2>
|
347 |
<p>
|
348 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
349 |
-
<tr><th>Old DNS records
|
350 |
-
<tr><th>New DNS records
|
351 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
352 |
<tr><th>Status</th><td>
|
353 |
{{if status == 'new' }}New{{/if}}
|
@@ -367,40 +402,6 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
367 |
</div>
|
368 |
</div>
|
369 |
</script>
|
370 |
-
<script type="text/x-jquery-template" id="issueTmpl_badOption">
|
371 |
-
<div>
|
372 |
-
<div class="wfIssue">
|
373 |
-
<h2>${shortMsg}</h2>
|
374 |
-
<p>
|
375 |
-
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
376 |
-
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
377 |
-
{{if data.isMultisite}}
|
378 |
-
<tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
|
379 |
-
<tr><th>Multisite Blog Domain:</th><td>${data.domain}</td></tr>
|
380 |
-
<tr><th>Multisite Blog Path:</th><td>${data.path}</td></tr>
|
381 |
-
{{/if}}
|
382 |
-
<tr><th>Status</th><td>
|
383 |
-
{{if status == 'new' }}New{{/if}}
|
384 |
-
{{if status == 'ignoreP' || status == 'ignoreC' }}Ignoring all alerts related to this option{{/if}}
|
385 |
-
</td></tr>
|
386 |
-
</table>
|
387 |
-
</p>
|
388 |
-
<p>
|
389 |
-
{{html longMsg}}
|
390 |
-
</p>
|
391 |
-
<div class="wfIssueOptions">
|
392 |
-
{{if (status == 'new')}}
|
393 |
-
<a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a>
|
394 |
-
<a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore issues related to this option</a>
|
395 |
-
{{/if}}
|
396 |
-
{{if status == 'ignoreP' || status == 'ignoreC'}}
|
397 |
-
<a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring issues related to this option</a>
|
398 |
-
{{/if}}
|
399 |
-
</div>
|
400 |
-
</div>
|
401 |
-
</div>
|
402 |
-
</script>
|
403 |
-
|
404 |
|
405 |
<script type="text/x-jquery-template" id="issueTmpl_diskSpace">
|
406 |
<div>
|
@@ -420,13 +421,18 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
420 |
{{html longMsg}}
|
421 |
</p>
|
422 |
<div class="wfIssueOptions">
|
423 |
-
|
424 |
-
<
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
|
|
|
|
|
|
|
|
|
|
430 |
</div>
|
431 |
</div>
|
432 |
</div>
|
@@ -438,15 +444,15 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
438 |
<h2>${shortMsg}</h2>
|
439 |
<p>
|
440 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
441 |
-
<tr><th>Issue
|
442 |
-
<tr><th>Login
|
443 |
-
<tr><th>User
|
444 |
-
<tr><th>Full
|
445 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
446 |
<tr><th>Status</th><td>
|
447 |
{{if status == 'new' }}New{{/if}}
|
448 |
{{if status == 'ignoreC' }}Ignored until user changes password{{/if}}
|
449 |
-
{{if status == 'ignoreP' }}Ignoring this user
|
450 |
</td></tr>
|
451 |
</table>
|
452 |
</p>
|
@@ -454,19 +460,25 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
454 |
{{html longMsg}}
|
455 |
</p>
|
456 |
<div class="wfIssueOptions">
|
457 |
-
<
|
458 |
-
|
|
|
|
|
459 |
</div>
|
460 |
<div class="wfIssueOptions">
|
461 |
-
|
462 |
-
<
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
|
|
|
|
|
|
|
|
470 |
</div>
|
471 |
</div>
|
472 |
</div>
|
@@ -479,7 +491,7 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
479 |
<p>
|
480 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
481 |
<tr><th>Author</th><td>${data.author}</td></tr>
|
482 |
-
<tr><th>Bad URL:</th><td><strong class="wfWarn">${data.badURL}</strong></td></tr>
|
483 |
<tr><th>Posted on:</th><td>${data.commentDate}</td></tr>
|
484 |
{{if data.isMultisite}}
|
485 |
<tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
|
@@ -497,19 +509,25 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
497 |
{{html longMsg}}
|
498 |
</p>
|
499 |
<div class="WfIssueOptions">
|
500 |
-
<
|
501 |
-
|
|
|
|
|
502 |
</div>
|
503 |
<div class="wfIssueOptions">
|
504 |
-
|
505 |
-
<
|
506 |
-
|
507 |
-
|
508 |
-
|
509 |
-
|
510 |
-
|
511 |
-
|
512 |
-
|
|
|
|
|
|
|
|
|
513 |
</div>
|
514 |
</script>
|
515 |
<script type="text/x-jquery-template" id="issueTmpl_postBadTitle">
|
@@ -537,19 +555,25 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
537 |
{{html longMsg}}
|
538 |
</p>
|
539 |
<div class="wfIssueOptions">
|
540 |
-
<
|
541 |
-
|
|
|
|
|
542 |
</div>
|
543 |
<div class="wfIssueOptions">
|
544 |
-
|
545 |
-
<
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
550 |
-
|
551 |
-
|
552 |
-
|
|
|
|
|
|
|
|
|
553 |
</div>
|
554 |
</div>
|
555 |
</div>
|
@@ -566,7 +590,7 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
566 |
{{else}}
|
567 |
<tr><th>Title:</th><td><a href="${data.permalink}" target="_blank">${data.postTitle}</a></td></tr>
|
568 |
{{/if}}
|
569 |
-
<tr><th>Bad URL:</th><td><strong class="wfWarn">${data.badURL}</strong></td></tr>
|
570 |
<tr><th>Posted on:</th><td>${data.postDate}</td></tr>
|
571 |
{{if data.isMultisite}}
|
572 |
<tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
|
@@ -585,19 +609,25 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
585 |
{{html longMsg}}
|
586 |
</p>
|
587 |
<div class="wfIssueOptions">
|
588 |
-
<
|
589 |
-
|
|
|
|
|
590 |
</div>
|
591 |
<div class="wfIssueOptions">
|
592 |
-
|
593 |
-
<
|
594 |
-
|
595 |
-
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
|
|
|
|
|
|
|
|
601 |
</div>
|
602 |
</div>
|
603 |
</div>
|
@@ -613,10 +643,10 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
613 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
614 |
<tr><th>Filename:</th><td>${data.file}</td></tr>
|
615 |
{{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
|
616 |
-
<tr><th>Bad URL:</th><td><strong class="wfWarn">${data.badURL}</strong></td></tr>
|
617 |
{{/if}}
|
618 |
-
<tr><th>File
|
619 |
-
<tr><th>Issue
|
620 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
621 |
<tr><th>Status</th><td>
|
622 |
{{if status == 'new' }}New{{/if}}
|
@@ -629,40 +659,47 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
629 |
{{html longMsg}}
|
630 |
</p>
|
631 |
<div class="wfIssueOptions">
|
632 |
-
|
633 |
-
|
634 |
-
|
635 |
-
|
636 |
-
|
637 |
-
|
638 |
-
|
639 |
-
|
640 |
-
|
641 |
-
|
642 |
-
|
643 |
-
|
644 |
-
|
|
|
|
|
|
|
645 |
{{if data.canFix}}
|
646 |
<br /> <input type="checkbox" class="wfrepairCheckbox" value="${id}" /> Select for bulk repair
|
647 |
{{/if}}
|
648 |
{{if data.canDelete}}
|
649 |
<br /> <input type="checkbox" class="wfdelCheckbox" value="${id}" /> Select for bulk delete
|
650 |
{{/if}}
|
|
|
651 |
</div>
|
652 |
<div class="wfIssueOptions">
|
653 |
{{if status == 'new'}}
|
654 |
-
|
655 |
-
<
|
|
|
656 |
{{if data.fileExists}}
|
657 |
-
|
658 |
-
|
659 |
{{else}}
|
660 |
-
|
661 |
{{/if}}
|
662 |
-
|
663 |
{{/if}}
|
664 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
665 |
-
|
|
|
|
|
666 |
{{/if}}
|
667 |
</div>
|
668 |
</div>
|
@@ -675,7 +712,7 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
675 |
<h2>${shortMsg}</h2>
|
676 |
<p>
|
677 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
678 |
-
<tr><th>Issue
|
679 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
680 |
<tr><th>Status</th><td>
|
681 |
{{if status == 'new' }}New{{/if}}
|
@@ -689,12 +726,16 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
689 |
</p>
|
690 |
<div class="wfIssueOptions">
|
691 |
{{if status == 'new'}}
|
692 |
-
<
|
693 |
-
|
694 |
-
|
|
|
|
|
695 |
{{/if}}
|
696 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
697 |
-
<
|
|
|
|
|
698 |
{{/if}}
|
699 |
</div>
|
700 |
</div>
|
@@ -707,11 +748,11 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
707 |
<h2>${shortMsg}</h2>
|
708 |
<p>
|
709 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
710 |
-
<tr><th>Option Name
|
711 |
{{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
|
712 |
-
<tr><th>Bad URL:</th><td><strong class="wfWarn">${data.badURL}</strong></td></tr>
|
713 |
{{/if}}
|
714 |
-
<tr><th>Issue
|
715 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
716 |
<tr><th>Status</th><td>
|
717 |
{{if status == 'new' }}New{{/if}}
|
@@ -724,29 +765,35 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
724 |
{{html longMsg}}
|
725 |
</p>
|
726 |
<div class="wfIssueOptions">
|
727 |
-
<
|
728 |
-
|
729 |
-
|
730 |
-
|
|
|
|
|
|
|
|
|
|
|
731 |
{{if data.canDelete}}
|
732 |
-
<a href="#" onclick="WFAD.deleteDatabaseOption('${id}'); return false;">Delete this option from the database (can't be undone).</a>
|
733 |
<br /> <input type="checkbox" class="wfdelCheckbox" value="${id}" /> Select for bulk delete
|
734 |
{{/if}}
|
735 |
</div>
|
736 |
<div class="wfIssueOptions">
|
737 |
{{if status == 'new'}}
|
738 |
-
|
739 |
-
<
|
740 |
{{if data.optionExists}}
|
741 |
-
|
742 |
-
|
743 |
{{else}}
|
744 |
-
|
745 |
{{/if}}
|
746 |
-
|
747 |
{{/if}}
|
748 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
749 |
-
|
|
|
|
|
750 |
{{/if}}
|
751 |
</div>
|
752 |
</div>
|
@@ -770,15 +817,19 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
770 |
{{html longMsg}}
|
771 |
</p>
|
772 |
<div class="wfIssueOptions">
|
773 |
-
|
774 |
-
<
|
775 |
-
|
776 |
-
|
777 |
-
|
778 |
-
|
779 |
-
|
780 |
-
|
781 |
-
|
|
|
|
|
|
|
|
|
782 |
</div>
|
783 |
</div>
|
784 |
</div>
|
@@ -803,15 +854,19 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
803 |
{{html longMsg}}
|
804 |
</p>
|
805 |
<div class="wfIssueOptions">
|
806 |
-
|
807 |
-
<
|
808 |
-
|
809 |
-
|
810 |
-
|
811 |
-
|
812 |
-
|
813 |
-
|
814 |
-
|
|
|
|
|
|
|
|
|
815 |
</div>
|
816 |
</div>
|
817 |
</div>
|
@@ -835,14 +890,18 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
835 |
{{html longMsg}}
|
836 |
</p>
|
837 |
<div class="wfIssueOptions">
|
838 |
-
|
839 |
-
<
|
840 |
-
|
841 |
-
|
842 |
-
|
843 |
-
|
844 |
-
|
845 |
-
|
|
|
|
|
|
|
|
|
846 |
</div>
|
847 |
</div>
|
848 |
</div>
|
@@ -865,14 +924,18 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
865 |
{{html longMsg}}
|
866 |
</p>
|
867 |
<div class="wfIssueOptions">
|
868 |
-
|
869 |
-
<
|
870 |
-
|
871 |
-
|
872 |
-
|
873 |
-
|
874 |
-
|
875 |
-
|
|
|
|
|
|
|
|
|
876 |
</div>
|
877 |
</div>
|
878 |
</div>
|
@@ -884,9 +947,9 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
884 |
<p>
|
885 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
886 |
{{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
|
887 |
-
<tr><th>Bad URL:</th><td><strong class="wfWarn">${data.badURL}</strong></td></tr>
|
888 |
{{/if}}
|
889 |
-
<tr><th>Issue
|
890 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
891 |
<tr><th>Status</th><td>
|
892 |
{{if status == 'new' }}New{{/if}}
|
@@ -900,12 +963,16 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
900 |
</p>
|
901 |
<div class="wfIssueOptions">
|
902 |
{{if status == 'new'}}
|
903 |
-
<
|
904 |
-
|
905 |
-
|
|
|
|
|
906 |
{{/if}}
|
907 |
-
{{if status == '
|
908 |
-
<
|
|
|
|
|
909 |
{{/if}}
|
910 |
</div>
|
911 |
</div>
|
@@ -917,7 +984,7 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
917 |
<h2>${shortMsg}</h2>
|
918 |
<p>
|
919 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
920 |
-
<tr><th>Issue
|
921 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
922 |
<tr><th>Status</th><td>
|
923 |
{{if status == 'new' }}New{{/if}}
|
@@ -931,15 +998,19 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
931 |
</p>
|
932 |
<div class="wfIssueOptions">
|
933 |
{{if status == 'new'}}
|
934 |
-
<
|
935 |
-
|
936 |
-
|
937 |
-
|
938 |
-
|
939 |
-
|
|
|
|
|
940 |
{{/if}}
|
941 |
-
{{if status == '
|
942 |
-
<
|
|
|
|
|
943 |
{{/if}}
|
944 |
</div>
|
945 |
</div>
|
@@ -964,14 +1035,18 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
964 |
{{html longMsg}}
|
965 |
</p>
|
966 |
<div class="wfIssueOptions">
|
967 |
-
|
968 |
-
<
|
969 |
-
|
970 |
-
|
971 |
-
|
972 |
-
|
973 |
-
|
974 |
-
|
|
|
|
|
|
|
|
|
975 |
</div>
|
976 |
</div>
|
977 |
</div>
|
@@ -995,16 +1070,20 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
995 |
{{html longMsg}}
|
996 |
</p>
|
997 |
<div class="wfIssueOptions">
|
998 |
-
|
999 |
-
<
|
1000 |
-
|
1001 |
-
|
1002 |
-
|
1003 |
-
|
1004 |
-
|
1005 |
-
|
1006 |
-
|
1007 |
-
|
|
|
|
|
|
|
|
|
1008 |
</div>
|
1009 |
</div>
|
1010 |
</div>
|
@@ -1029,12 +1108,16 @@ $sigUpdateTime = wfConfig::get('signatureUpdateTime');
|
|
1029 |
</p>
|
1030 |
<div class="wfIssueOptions">
|
1031 |
{{if status == 'new'}}
|
1032 |
-
<
|
1033 |
-
|
1034 |
-
|
|
|
|
|
1035 |
{{/if}}
|
1036 |
-
{{if status == '
|
1037 |
-
<
|
|
|
|
|
1038 |
{{/if}}
|
1039 |
</div>
|
1040 |
</div>
|
76 |
{{html longMsg}}
|
77 |
</p>
|
78 |
<div class="wfIssueOptions">
|
79 |
+
<ul>
|
80 |
+
<li><h3>Tools:</h3></li>
|
81 |
+
{{if data.fileExists}}
|
82 |
+
<li><a target="_blank" href="${WFAD.makeViewFileLink(data.file)}">View the file</a></li>
|
83 |
+
{{/if}}
|
84 |
+
<li><a href="#" onclick="WFAD.hideFile('${id}', 'delete'); return false;">Hide this file in <em>.htaccess</em></a></li>
|
85 |
+
{{if data.canDelete}}
|
86 |
+
<li><a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone)</a></li>
|
87 |
+
{{/if}}
|
88 |
+
</ul>
|
89 |
{{if data.canDelete}}
|
|
|
90 |
<p>
|
91 |
<label><input type="checkbox" class="wfdelCheckbox" value="${id}" /> Select for bulk delete</label>
|
92 |
</p>
|
93 |
{{/if}}
|
94 |
</div>
|
95 |
<div class="wfIssueOptions">
|
96 |
+
{{if status == 'new'}}
|
97 |
+
<ul>
|
98 |
+
<li><h3>Resolve:</h3></li>
|
99 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
100 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
|
101 |
+
</ul>
|
102 |
+
{{/if}}
|
103 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
104 |
+
<ul>
|
105 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
106 |
+
</ul>
|
107 |
+
{{/if}}
|
108 |
</div>
|
109 |
</div>
|
110 |
</div>
|
133 |
{{html longMsg}}
|
134 |
</p>
|
135 |
<div class="wfIssueOptions">
|
136 |
+
<ul>
|
137 |
+
<li><h3>Tools:</h3></li>
|
138 |
+
{{if data.fileExists}}
|
139 |
+
<li><a target="_blank" href="${WFAD.makeViewFileLink(data.file)}">View the file</a></li>
|
140 |
+
{{/if}}
|
141 |
+
<li><a href="#" onclick="WFAD.hideFile('${id}', 'delete'); return false;">Hide this file in <em>.htaccess</em></a></li>
|
142 |
+
{{if data.canDelete}}
|
143 |
+
<li><a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone)</a></li>
|
144 |
+
{{/if}}
|
145 |
+
</ul>
|
146 |
{{if data.canDelete}}
|
|
|
147 |
<p>
|
148 |
<label><input type="checkbox" class="wfdelCheckbox" value="${id}" /> Select for bulk delete</label>
|
149 |
</p>
|
151 |
</div>
|
152 |
<div class="wfIssueOptions">
|
153 |
{{if status == 'new'}}
|
154 |
+
<ul>
|
155 |
+
<li><h3>Resolve:</h3></li>
|
156 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
157 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
|
158 |
+
</ul>
|
159 |
{{/if}}
|
160 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
161 |
+
<ul>
|
162 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
163 |
+
</ul>
|
164 |
{{/if}}
|
165 |
</div>
|
166 |
</div>
|
185 |
</p>
|
186 |
<div class="wfIssueOptions">
|
187 |
{{if (status == 'new')}}
|
188 |
+
<ul>
|
189 |
+
<li><h3>Resolve:</h3></li>
|
190 |
<?php if (!wfUtils::isNginx()): ?>
|
191 |
+
<li><a href="#" onclick="WFAD.fixFPD('${id}'); return false;">Fix this issue</a></li>
|
192 |
<?php endif ?>
|
193 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
194 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
|
195 |
{{/if}}
|
196 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
197 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
198 |
{{/if}}
|
199 |
+
</ul>
|
200 |
</div>
|
201 |
{{if (status == 'new')}}
|
202 |
<div class="wfIssueOptions">
|
203 |
+
<ul>
|
204 |
+
<li><h3>Manual Fix:</h3></li>
|
205 |
+
<li>Set <code>display_errors</code> to <code>Off</code> in your php.ini file.</li>
|
206 |
+
</ul>
|
207 |
</div>
|
208 |
{{/if}}
|
|
|
209 |
</div>
|
210 |
</div>
|
211 |
</script>
|
229 |
|
230 |
<div class="wfIssueOptions">
|
231 |
{{if (status == 'new')}}
|
232 |
+
<ul>
|
233 |
+
<li><h3>Resolve:</h3></li>
|
234 |
<?php if (!wfUtils::isNginx()): ?>
|
235 |
+
<li><a href="#" onclick="WFAD.disableDirectoryListing('${id}'); return false;">Fix this issue</a></li>
|
236 |
<?php endif ?>
|
237 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
238 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
|
239 |
+
</ul>
|
240 |
{{/if}}
|
241 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
242 |
+
<ul>
|
243 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
244 |
+
</ul>
|
245 |
{{/if}}
|
246 |
</div>
|
247 |
<?php if (!wfUtils::isNginx()): ?>
|
248 |
{{if (status == 'new')}}
|
249 |
<div class="wfIssueOptions">
|
250 |
+
<ul>
|
251 |
+
<li><h3>Manual Fix:</h3></li>
|
252 |
+
<li>Add <code>Options -Indexes</code> to your .htaccess file.</li>
|
253 |
+
</ul>
|
254 |
</div>
|
255 |
{{/if}}
|
256 |
<?php endif ?>
|
264 |
<h2>${shortMsg}</h2>
|
265 |
<p>
|
266 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
267 |
+
<tr><th><span class="wf-hidden-xs">Theme </span>Name:</th><td>${data.name}</td></tr>
|
268 |
+
<tr><th>Current <span class="wf-hidden-xs">Theme </span>Version:</th><td>${data.version}</td></tr>
|
269 |
+
<tr><th>New <span class="wf-hidden-xs">Theme </span>Version:</th><td>${data.newVersion}</td></tr>
|
270 |
+
<tr><th><span class="wf-hidden-xs">Theme </span>URL:</th><td><a href="${data.URL}" target="_blank"><span class="wf-hidden-xs wf-split-word">${data.URL}</span><span class="wf-visible-xs">View</span></a></td></tr>
|
271 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
272 |
<tr><th>Status</th><td>
|
273 |
{{if status == 'new' }}New{{/if}}
|
281 |
<a href="<?php echo get_admin_url() . 'update-core.php'; ?>">Click here to update now</a>.
|
282 |
</p>
|
283 |
<div class="wfIssueOptions">
|
284 |
+
{{if status == 'new'}}
|
285 |
+
<ul>
|
286 |
+
<li><h3>Resolve:</h3></li>
|
287 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
288 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
|
289 |
+
</ul>
|
290 |
{{/if}}
|
291 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
292 |
+
<ul>
|
293 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
294 |
+
</ul>
|
295 |
{{/if}}
|
296 |
</div>
|
297 |
</div>
|
304 |
<h2>${shortMsg}</h2>
|
305 |
<p>
|
306 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
307 |
+
<tr><th><span class="wf-hidden-xs">Plugin </span>Name:</th><td>${data.Name}</td></tr>
|
308 |
+
{{if data.PluginURI}}<tr><th><span class="wf-hidden-xs">Plugin </span>Website:</th><td><a href="${data.PluginURI}" target="_blank"><span class="wf-hidden-xs wf-split-word">${data.PluginURI}</span><span class="wf-visible-xs">View</span></a></td></tr>{{/if}}
|
309 |
+
<tr><th>Changelog:</th><td><a href="${data.wpURL}/changelog" target="_blank"><span class="wf-hidden-xs wf-split-word">${data.wpURL}/changelog</span><span class="wf-visible-xs">View</span></a></td></tr>
|
310 |
+
<tr><th>Current <span class="wf-hidden-xs">Plugin </span>Version:</th><td>${data.Version}</td></tr>
|
311 |
+
<tr><th>New <span class="wf-hidden-xs">Plugin </span>Version:</th><td>${data.newVersion}</td></tr>
|
312 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
313 |
<tr><th>Status</th><td>
|
314 |
{{if status == 'new' }}New{{/if}}
|
323 |
</p>
|
324 |
<div class="wfIssueOptions">
|
325 |
{{if status == 'new'}}
|
326 |
+
<ul>
|
327 |
+
<li><h3>Resolve:</h3></li>
|
328 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
329 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
|
330 |
+
</ul>
|
331 |
{{/if}}
|
332 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
333 |
+
<ul>
|
334 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
335 |
+
</ul>
|
336 |
{{/if}}
|
337 |
</div>
|
338 |
</div>
|
345 |
<h2>${shortMsg}</h2>
|
346 |
<p>
|
347 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
348 |
+
<tr><th>Current <span class="wf-hidden-xs">WordPress </span>Version:</th><td>${data.currentVersion}</td></tr>
|
349 |
+
<tr><th>New <span class="wf-hidden-xs">WordPress </span>Version:</th><td>${data.newVersion}</td></tr>
|
350 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
351 |
<tr><th>Status</th><td>
|
352 |
{{if status == 'new' }}New{{/if}}
|
359 |
<a href="<?php echo get_admin_url() . 'update-core.php'; ?>">Click here to update now</a>.
|
360 |
</p>
|
361 |
<div class="wfIssueOptions">
|
362 |
+
{{if status == 'new'}}
|
363 |
+
<ul>
|
364 |
+
<li><h3>Resolve:</h3></li>
|
365 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
366 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this issue</a></li>
|
367 |
+
</ul>
|
368 |
+
{{/if}}
|
369 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
370 |
+
<ul>
|
371 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
372 |
+
</ul>
|
373 |
+
{{/if}}
|
374 |
+
</div>
|
375 |
</div>
|
376 |
</script>
|
377 |
|
381 |
<h2>${shortMsg}</h2>
|
382 |
<p>
|
383 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
384 |
+
<tr><th>Old<span class="wf-hidden-xs"> DNS records</span>:</th><td>${data.oldDNS}</td></tr>
|
385 |
+
<tr><th>New<span class="wf-hidden-xs"> DNS records</span>:</th><td>${data.newDNS}</td></tr>
|
386 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
387 |
<tr><th>Status</th><td>
|
388 |
{{if status == 'new' }}New{{/if}}
|
402 |
</div>
|
403 |
</div>
|
404 |
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
405 |
|
406 |
<script type="text/x-jquery-template" id="issueTmpl_diskSpace">
|
407 |
<div>
|
421 |
{{html longMsg}}
|
422 |
</p>
|
423 |
<div class="wfIssueOptions">
|
424 |
+
{{if status == 'new'}}
|
425 |
+
<ul>
|
426 |
+
<li><h3>Resolve:</h3></li>
|
427 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
428 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore disk space alerts</a></li>
|
429 |
+
</ul>
|
430 |
+
{{/if}}
|
431 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
432 |
+
<ul>
|
433 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring disk space alerts</a></li>
|
434 |
+
</ul>
|
435 |
+
{{/if}}
|
436 |
</div>
|
437 |
</div>
|
438 |
</div>
|
444 |
<h2>${shortMsg}</h2>
|
445 |
<p>
|
446 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
447 |
+
<tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
|
448 |
+
<tr><th>Login<span class="wf-hidden-xs"> Name</span>:</th><td>${data.user_login}</td></tr>
|
449 |
+
<tr><th><span class="wf-hidden-xs">User </span>Email:</th><td>${data.user_email}</td></tr>
|
450 |
+
<tr><th><span class="wf-hidden-xs">Full </span>Name:</th><td>${data.first_name} ${data.last_name}</td></tr>
|
451 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
452 |
<tr><th>Status</th><td>
|
453 |
{{if status == 'new' }}New{{/if}}
|
454 |
{{if status == 'ignoreC' }}Ignored until user changes password{{/if}}
|
455 |
+
{{if status == 'ignoreP' }}Ignoring all for this user{{/if}}
|
456 |
</td></tr>
|
457 |
</table>
|
458 |
</p>
|
460 |
{{html longMsg}}
|
461 |
</p>
|
462 |
<div class="wfIssueOptions">
|
463 |
+
<ul>
|
464 |
+
<li><h3>Tools:</h3></li>
|
465 |
+
<li><a target="_blank" href="${data.editUserLink}">Edit this user</a></li>
|
466 |
+
</ul>
|
467 |
</div>
|
468 |
<div class="wfIssueOptions">
|
469 |
+
{{if status == 'new'}}
|
470 |
+
<ul>
|
471 |
+
<li><h3>Resolve:</h3></li>
|
472 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
473 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this weak password</a></li>
|
474 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore all for this user</a></li>
|
475 |
+
</ul>
|
476 |
+
{{/if}}
|
477 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
478 |
+
<ul>
|
479 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
480 |
+
</ul>
|
481 |
+
{{/if}}
|
482 |
</div>
|
483 |
</div>
|
484 |
</div>
|
491 |
<p>
|
492 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
493 |
<tr><th>Author</th><td>${data.author}</td></tr>
|
494 |
+
<tr><th>Bad URL:</th><td><strong class="wfWarn wf-split-word">${data.badURL}</strong></td></tr>
|
495 |
<tr><th>Posted on:</th><td>${data.commentDate}</td></tr>
|
496 |
{{if data.isMultisite}}
|
497 |
<tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
|
509 |
{{html longMsg}}
|
510 |
</p>
|
511 |
<div class="WfIssueOptions">
|
512 |
+
<ul>
|
513 |
+
<li><h3>Tools:</h3></li>
|
514 |
+
<li><a target="_blank" href="${data.editCommentLink}">Edit this ${data.type}</a></li>
|
515 |
+
</ul>
|
516 |
</div>
|
517 |
<div class="wfIssueOptions">
|
518 |
+
{{if status == 'new'}}
|
519 |
+
<ul>
|
520 |
+
<li><h3>Resolve:</h3></li>
|
521 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
522 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this ${data.type}</a></li>
|
523 |
+
</ul>
|
524 |
+
{{/if}}
|
525 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
526 |
+
<ul>
|
527 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this ${data.type}</a></li>
|
528 |
+
</ul>
|
529 |
+
{{/if}}
|
530 |
+
</div>
|
531 |
</div>
|
532 |
</script>
|
533 |
<script type="text/x-jquery-template" id="issueTmpl_postBadTitle">
|
555 |
{{html longMsg}}
|
556 |
</p>
|
557 |
<div class="wfIssueOptions">
|
558 |
+
<ul>
|
559 |
+
<li><h3>Tools:</h3></li>
|
560 |
+
<li><a target="_blank" href="${data.editPostLink}">Edit this ${data.type}</a></li>
|
561 |
+
</ul>
|
562 |
</div>
|
563 |
<div class="wfIssueOptions">
|
564 |
+
{{if status == 'new'}}
|
565 |
+
<ul>
|
566 |
+
<li><h3>Resolve:</h3></li>
|
567 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
568 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this title in this ${data.type}</a></li>
|
569 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore all dangerous titles in this ${data.type}</a></li>
|
570 |
+
</ul>
|
571 |
+
{{/if}}
|
572 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
573 |
+
<ul>
|
574 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
575 |
+
</ul>
|
576 |
+
{{/if}}
|
577 |
</div>
|
578 |
</div>
|
579 |
</div>
|
590 |
{{else}}
|
591 |
<tr><th>Title:</th><td><a href="${data.permalink}" target="_blank">${data.postTitle}</a></td></tr>
|
592 |
{{/if}}
|
593 |
+
<tr><th>Bad URL:</th><td><strong class="wfWarn wf-split-word">${data.badURL}</strong></td></tr>
|
594 |
<tr><th>Posted on:</th><td>${data.postDate}</td></tr>
|
595 |
{{if data.isMultisite}}
|
596 |
<tr><th>Multisite Blog ID:</th><td>${data.blog_id}</td></tr>
|
609 |
{{html longMsg}}
|
610 |
</p>
|
611 |
<div class="wfIssueOptions">
|
612 |
+
<ul>
|
613 |
+
<li><h3>Tools:</h3></li>
|
614 |
+
<li><a target="_blank" href="${data.editPostLink}">Edit this ${data.type}</a></li>
|
615 |
+
</ul>
|
616 |
</div>
|
617 |
<div class="wfIssueOptions">
|
618 |
+
{{if status == 'new'}}
|
619 |
+
<ul>
|
620 |
+
<li><h3>Resolve:</h3></li>
|
621 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
622 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this bad URL in this ${data.type}</a></li>
|
623 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore all bad URLs in this ${data.type}</a></li>
|
624 |
+
</ul>
|
625 |
+
{{/if}}
|
626 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
627 |
+
<ul>
|
628 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
629 |
+
</ul>
|
630 |
+
{{/if}}
|
631 |
</div>
|
632 |
</div>
|
633 |
</div>
|
643 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
644 |
<tr><th>Filename:</th><td>${data.file}</td></tr>
|
645 |
{{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
|
646 |
+
<tr><th>Bad URL:</th><td><strong class="wfWarn wf-split-word">${data.badURL}</strong></td></tr>
|
647 |
{{/if}}
|
648 |
+
<tr><th><span class="wf-hidden-xs">File </span>Type:</th><td>{{if data.cType}}${WFAD.ucfirst(data.cType)}{{else}}Not a core, theme or plugin file.{{/if}}</td></tr>
|
649 |
+
<tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
|
650 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
651 |
<tr><th>Status</th><td>
|
652 |
{{if status == 'new' }}New{{/if}}
|
659 |
{{html longMsg}}
|
660 |
</p>
|
661 |
<div class="wfIssueOptions">
|
662 |
+
{{if status == 'new'}}
|
663 |
+
<ul>
|
664 |
+
<li><h3>Tools:</h3></li>
|
665 |
+
{{if data.fileExists}}
|
666 |
+
<li><a target="_blank" href="${WFAD.makeViewFileLink(data.file)}">View the file.</a></li>
|
667 |
+
{{/if}}
|
668 |
+
{{if data.canFix}}
|
669 |
+
<li><a href="#" onclick="WFAD.restoreFile('${id}'); return false;">Restore the original version of this file.</a></li>
|
670 |
+
{{/if}}
|
671 |
+
{{if data.canDelete}}
|
672 |
+
<li><a href="#" onclick="WFAD.deleteFile('${id}'); return false;">Delete this file (can't be undone)</a></li>
|
673 |
+
{{/if}}
|
674 |
+
{{if data.canDiff}}
|
675 |
+
<li><a href="${WFAD.makeDiffLink(data)}" target="_blank">See how the file has changed.</a></li>
|
676 |
+
{{/if}}
|
677 |
+
</ul>
|
678 |
{{if data.canFix}}
|
679 |
<br /> <input type="checkbox" class="wfrepairCheckbox" value="${id}" /> Select for bulk repair
|
680 |
{{/if}}
|
681 |
{{if data.canDelete}}
|
682 |
<br /> <input type="checkbox" class="wfdelCheckbox" value="${id}" /> Select for bulk delete
|
683 |
{{/if}}
|
684 |
+
{{/if}}
|
685 |
</div>
|
686 |
<div class="wfIssueOptions">
|
687 |
{{if status == 'new'}}
|
688 |
+
<ul>
|
689 |
+
<li><h3>Resolve:</h3></li>
|
690 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
691 |
{{if data.fileExists}}
|
692 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore until the file changes.</a></li>
|
693 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Always ignore this file.</a></li>
|
694 |
{{else}}
|
695 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore missing file</a></li>
|
696 |
{{/if}}
|
697 |
+
</ul>
|
698 |
{{/if}}
|
699 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
700 |
+
<ul>
|
701 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
702 |
+
</ul>
|
703 |
{{/if}}
|
704 |
</div>
|
705 |
</div>
|
712 |
<h2>${shortMsg}</h2>
|
713 |
<p>
|
714 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
715 |
+
<tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
|
716 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
717 |
<tr><th>Status</th><td>
|
718 |
{{if status == 'new' }}New{{/if}}
|
726 |
</p>
|
727 |
<div class="wfIssueOptions">
|
728 |
{{if status == 'new'}}
|
729 |
+
<ul>
|
730 |
+
<li><h3>Resolve:</h3></li>
|
731 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore until the version changes</a></li>
|
732 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Always ignore this version</a></li>
|
733 |
+
</ul>
|
734 |
{{/if}}
|
735 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
736 |
+
<ul>
|
737 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
738 |
+
</ul>
|
739 |
{{/if}}
|
740 |
</div>
|
741 |
</div>
|
748 |
<h2>${shortMsg}</h2>
|
749 |
<p>
|
750 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
751 |
+
<tr><th>Option<span class="wf-hidden-xs"> Name</span>:</th><td>${data.option_name}</td></tr>
|
752 |
{{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
|
753 |
+
<tr><th>Bad URL:</th><td><strong class="wfWarn wf-split-word">${data.badURL}</strong></td></tr>
|
754 |
{{/if}}
|
755 |
+
<tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
|
756 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
757 |
<tr><th>Status</th><td>
|
758 |
{{if status == 'new' }}New{{/if}}
|
765 |
{{html longMsg}}
|
766 |
</p>
|
767 |
<div class="wfIssueOptions">
|
768 |
+
<ul>
|
769 |
+
<li><h3>Tools:</h3></li>
|
770 |
+
{{if data.optionExists}}
|
771 |
+
<li><a target="_blank" href="${WFAD.makeViewOptionLink(data.option_name, data.site_id)}">View this option.</a></li>
|
772 |
+
{{/if}}
|
773 |
+
{{if data.canDelete}}
|
774 |
+
<li><a href="#" onclick="WFAD.deleteDatabaseOption('${id}'); return false;">Delete this option from the database (can't be undone)</a></li>
|
775 |
+
{{/if}}
|
776 |
+
</ul>
|
777 |
{{if data.canDelete}}
|
|
|
778 |
<br /> <input type="checkbox" class="wfdelCheckbox" value="${id}" /> Select for bulk delete
|
779 |
{{/if}}
|
780 |
</div>
|
781 |
<div class="wfIssueOptions">
|
782 |
{{if status == 'new'}}
|
783 |
+
<ul>
|
784 |
+
<li><h3>Resolve:</h3></li>
|
785 |
{{if data.optionExists}}
|
786 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore until the option changes.</a></li>
|
787 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Always ignore this option.</a></li>
|
788 |
{{else}}
|
789 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore missing option.</a></li>
|
790 |
{{/if}}
|
791 |
+
</ul>
|
792 |
{{/if}}
|
793 |
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
794 |
+
<ul>
|
795 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
796 |
+
</ul>
|
797 |
{{/if}}
|
798 |
</div>
|
799 |
</div>
|
817 |
{{html longMsg}}
|
818 |
</p>
|
819 |
<div class="wfIssueOptions">
|
820 |
+
{{if status == 'new'}}
|
821 |
+
<ul>
|
822 |
+
<li><h3>Resolve:</h3></li>
|
823 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
824 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore these URLs until they change.</a></li>
|
825 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore these URLs permanently</a></li>
|
826 |
+
</ul>
|
827 |
+
{{/if}}
|
828 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
829 |
+
<ul>
|
830 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
831 |
+
</ul>
|
832 |
+
{{/if}}
|
833 |
</div>
|
834 |
</div>
|
835 |
</div>
|
854 |
{{html longMsg}}
|
855 |
</p>
|
856 |
<div class="wfIssueOptions">
|
857 |
+
{{if status == 'new'}}
|
858 |
+
<ul>
|
859 |
+
<li><h3>Resolve:</h3></li>
|
860 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
861 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreC'); return false;">Ignore this redirect until it changes.</a></li>
|
862 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore any redirect like this permanently</a></li>
|
863 |
+
</ul>
|
864 |
+
{{/if}}
|
865 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
866 |
+
<ul>
|
867 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
868 |
+
</ul>
|
869 |
+
{{/if}}
|
870 |
</div>
|
871 |
</div>
|
872 |
</div>
|
890 |
{{html longMsg}}
|
891 |
</p>
|
892 |
<div class="wfIssueOptions">
|
893 |
+
{{if status == 'new'}}
|
894 |
+
<ul>
|
895 |
+
<li><h3>Resolve:</h3></li>
|
896 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
897 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
|
898 |
+
</ul>
|
899 |
+
{{/if}}
|
900 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
901 |
+
<ul>
|
902 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
903 |
+
</ul>
|
904 |
+
{{/if}}
|
905 |
</div>
|
906 |
</div>
|
907 |
</div>
|
924 |
{{html longMsg}}
|
925 |
</p>
|
926 |
<div class="wfIssueOptions">
|
927 |
+
{{if status == 'new'}}
|
928 |
+
<ul>
|
929 |
+
<li><h3>Resolve:</h3></li>
|
930 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
931 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
|
932 |
+
</ul>
|
933 |
+
{{/if}}
|
934 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
935 |
+
<ul>
|
936 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
937 |
+
</ul>
|
938 |
+
{{/if}}
|
939 |
</div>
|
940 |
</div>
|
941 |
</div>
|
947 |
<p>
|
948 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
949 |
{{if ((typeof data.badURL !== 'undefined') && data.badURL)}}
|
950 |
+
<tr><th>Bad URL:</th><td><strong class="wfWarn wf-split-word">${data.badURL}</strong></td></tr>
|
951 |
{{/if}}
|
952 |
+
<tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
|
953 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
954 |
<tr><th>Status</th><td>
|
955 |
{{if status == 'new' }}New{{/if}}
|
963 |
</p>
|
964 |
<div class="wfIssueOptions">
|
965 |
{{if status == 'new'}}
|
966 |
+
<ul>
|
967 |
+
<li><h3>Resolve:</h3></li>
|
968 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
969 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
|
970 |
+
</ul>
|
971 |
{{/if}}
|
972 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
973 |
+
<ul>
|
974 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
975 |
+
</ul>
|
976 |
{{/if}}
|
977 |
</div>
|
978 |
</div>
|
984 |
<h2>${shortMsg}</h2>
|
985 |
<p>
|
986 |
<table border="0" class="wfIssue" cellspacing="0" cellpadding="0">
|
987 |
+
<tr><th><span class="wf-hidden-xs">Issue First </span>Detected:</th><td>${timeAgo} ago.</td></tr>
|
988 |
<tr><th>Severity:</th><td>{{if severity == '1'}}Critical{{else}}Warning{{/if}}</td></tr>
|
989 |
<tr><th>Status</th><td>
|
990 |
{{if status == 'new' }}New{{/if}}
|
998 |
</p>
|
999 |
<div class="wfIssueOptions">
|
1000 |
{{if status == 'new'}}
|
1001 |
+
<ul>
|
1002 |
+
<li><h3>Resolve:</h3></li>
|
1003 |
+
{{if ((typeof data.recommendation !== 'undefined') && data.recommendation)}}
|
1004 |
+
<li><a href="#" onclick="WFAD.useRecommendedHowGetIPs('${id}'); return false;">Use recommended value</a></li>
|
1005 |
+
{{/if}}
|
1006 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
1007 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
|
1008 |
+
</ul>
|
1009 |
{{/if}}
|
1010 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
1011 |
+
<ul>
|
1012 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
1013 |
+
</ul>
|
1014 |
{{/if}}
|
1015 |
</div>
|
1016 |
</div>
|
1035 |
{{html longMsg}}
|
1036 |
</p>
|
1037 |
<div class="wfIssueOptions">
|
1038 |
+
{{if status == 'new'}}
|
1039 |
+
<ul>
|
1040 |
+
<li><h3>Resolve:</h3></li>
|
1041 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
1042 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
|
1043 |
+
</ul>
|
1044 |
+
{{/if}}
|
1045 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
1046 |
+
<ul>
|
1047 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
1048 |
+
</ul>
|
1049 |
+
{{/if}}
|
1050 |
</div>
|
1051 |
</div>
|
1052 |
</div>
|
1070 |
{{html longMsg}}
|
1071 |
</p>
|
1072 |
<div class="wfIssueOptions">
|
1073 |
+
{{if status == 'new'}}
|
1074 |
+
<ul>
|
1075 |
+
<li><h3>Resolve:</h3></li>
|
1076 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
1077 |
+
<li><a href="#" onclick="WFAD.deleteAdminUser('${id}'); return false;">Delete this user</a></li>
|
1078 |
+
<li><a href="#" onclick="WFAD.revokeAdminUser('${id}'); return false;">Revoke all capabilities from this user</a></li>
|
1079 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
|
1080 |
+
</ul>
|
1081 |
+
{{/if}}
|
1082 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
1083 |
+
<ul>
|
1084 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
1085 |
+
</ul>
|
1086 |
+
{{/if}}
|
1087 |
</div>
|
1088 |
</div>
|
1089 |
</div>
|
1108 |
</p>
|
1109 |
<div class="wfIssueOptions">
|
1110 |
{{if status == 'new'}}
|
1111 |
+
<ul>
|
1112 |
+
<li><h3>Resolve:</h3></li>
|
1113 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">I have fixed this issue</a></li>
|
1114 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'ignoreP'); return false;">Ignore this problem</a></li>
|
1115 |
+
</ul>
|
1116 |
{{/if}}
|
1117 |
+
{{if status == 'ignoreC' || status == 'ignoreP'}}
|
1118 |
+
<ul>
|
1119 |
+
<li><a href="#" onclick="WFAD.updateIssueStatus('${id}', 'delete'); return false;">Stop ignoring this issue</a></li>
|
1120 |
+
</ul>
|
1121 |
{{/if}}
|
1122 |
</div>
|
1123 |
</div>
|
lib/menu_scan_scan.php
CHANGED
@@ -53,7 +53,7 @@
|
|
53 |
|
54 |
<div class="consoleHead" style="margin-top: 20px;">
|
55 |
<h3 class="consoleHeadText">Scan Detailed Activity</h3>
|
56 |
-
<a href="#" class="wfALogMailLink" onclick="WFAD.emailActivityLog(); return false;">Email activity log</a>
|
57 |
</div>
|
58 |
<div class="bevelDiv1 consoleOuter"><div class="bevelDiv2"><div class="bevelDiv3 consoleInner" id="consoleActivity">
|
59 |
<?php
|
53 |
|
54 |
<div class="consoleHead" style="margin-top: 20px;">
|
55 |
<h3 class="consoleHeadText">Scan Detailed Activity</h3>
|
56 |
+
<a href="#" class="wfALogMailLink" onclick="WFAD.emailActivityLog(); return false;">Email<span class="wf-hidden-xs"> activity log</span></a>
|
57 |
</div>
|
58 |
<div class="bevelDiv1 consoleOuter"><div class="bevelDiv2"><div class="bevelDiv3 consoleInner" id="consoleActivity">
|
59 |
<?php
|
lib/menu_scan_schedule.php
CHANGED
@@ -57,8 +57,11 @@
|
|
57 |
</div>
|
58 |
<div class="wf-card-extra">
|
59 |
<table class="scan-schedule">
|
60 |
-
<tr>
|
61 |
<th>Shortcuts</th>
|
|
|
|
|
|
|
62 |
<td>
|
63 |
<button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="onceDaily">Once per day</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="twiceDaily">Twice per day</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="weekends">Weekends</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="oddDaysWE">Odd days and weekends</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="every6hours">Every 6 hours</button>
|
64 |
</td>
|
@@ -77,29 +80,38 @@
|
|
77 |
foreach ($daysOfWeek as $d) :
|
78 |
list($dayNumber, $dayName) = $d;
|
79 |
?>
|
80 |
-
<tr class="
|
81 |
<th><?php echo $dayName; ?></th>
|
|
|
|
|
|
|
82 |
<td>
|
83 |
-
<
|
84 |
-
<
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
103 |
</td>
|
104 |
</tr>
|
105 |
<?php endforeach; ?>
|
57 |
</div>
|
58 |
<div class="wf-card-extra">
|
59 |
<table class="scan-schedule">
|
60 |
+
<tr class="wf-visible-xs">
|
61 |
<th>Shortcuts</th>
|
62 |
+
</tr>
|
63 |
+
<tr>
|
64 |
+
<th class="wf-hidden-xs">Shortcuts</th>
|
65 |
<td>
|
66 |
<button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="onceDaily">Once per day</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="twiceDaily">Twice per day</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="weekends">Weekends</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="oddDaysWE">Odd days and weekends</button> <button type="button" class="wf-btn wf-btn-primary scan-shortcut" data-shortcut="every6hours">Every 6 hours</button>
|
67 |
</td>
|
80 |
foreach ($daysOfWeek as $d) :
|
81 |
list($dayNumber, $dayName) = $d;
|
82 |
?>
|
83 |
+
<tr class="wf-visible-xs">
|
84 |
<th><?php echo $dayName; ?></th>
|
85 |
+
</tr>
|
86 |
+
<tr class="schedule-day" data-day="<?php echo $dayNumber; ?>">
|
87 |
+
<th class="wf-hidden-xs"><?php echo $dayName; ?></th>
|
88 |
<td>
|
89 |
+
<div class="schedule-times-wrapper">
|
90 |
+
<div class="wf-visible-xs wf-center">AM</div>
|
91 |
+
<ul class="schedule-times">
|
92 |
+
<li class="text-only wf-hidden-xs">AM</li>
|
93 |
+
<?php
|
94 |
+
for ($h = 0; $h < 12; $h++) {
|
95 |
+
$active = (isset($sched[$dayNumber]) && $sched[$dayNumber][$h] ? ' active' : '');
|
96 |
+
echo '<li class="time' . $active . '" data-hour="' . $h . '"><a href="#">' . str_pad($h, 2, '0', STR_PAD_LEFT) . '</a></li>';
|
97 |
+
}
|
98 |
+
?>
|
99 |
+
</ul>
|
100 |
+
</div>
|
101 |
+
<div class="schedule-times-wrapper">
|
102 |
+
<div class="wf-visible-xs wf-center">PM</div>
|
103 |
+
<ul class="schedule-times">
|
104 |
+
<li class="text-only wf-hidden-xs">PM</li>
|
105 |
+
<?php
|
106 |
+
for ($i = 0; $i < 12; $i++) {
|
107 |
+
$h = $i;
|
108 |
+
if ($h == 0) { $h = 12; }
|
109 |
+
$active = (isset($sched[$dayNumber]) && $sched[$dayNumber][$i + 12] ? ' active' : '');
|
110 |
+
echo '<li class="time' . $active . '" data-hour="' . ($i + 12) . '"><a href="#">' . str_pad($h, 2, '0', STR_PAD_LEFT) . '</a></li>';
|
111 |
+
}
|
112 |
+
?>
|
113 |
+
</ul>
|
114 |
+
</div>
|
115 |
</td>
|
116 |
</tr>
|
117 |
<?php endforeach; ?>
|
lib/menu_tools_diagnostic.php
CHANGED
@@ -13,7 +13,7 @@ if (!isset($sendingDiagnosticEmail)) { $sendingDiagnosticEmail = false; }
|
|
13 |
?>
|
14 |
|
15 |
<div>
|
16 |
-
<form id="wfConfigForm">
|
17 |
<table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>>
|
18 |
<?php foreach ($diagnostic->getResults() as $title => $tests): ?>
|
19 |
<tbody class="thead">
|
13 |
?>
|
14 |
|
15 |
<div>
|
16 |
+
<form id="wfConfigForm" style="overflow-x: auto;">
|
17 |
<table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>>
|
18 |
<?php foreach ($diagnostic->getResults() as $title => $tests): ?>
|
19 |
<tbody class="thead">
|
lib/menu_tools_twoFactor.php
CHANGED
@@ -34,16 +34,31 @@
|
|
34 |
|
35 |
<h2>Enable Cellphone Sign-in</h2>
|
36 |
<p><em>Our Cellphone Sign-in uses a technique called "Two Factor Authentication" which is used by banks, government agencies and military world-wide as one of the most secure forms of remote system authentication. We recommend you enable Cellphone Sign-in for all Administrator level accounts.</em></p>
|
37 |
-
<
|
38 |
-
<
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
</
|
45 |
-
<
|
46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
<div style="height: 20px;">
|
48 |
<div id="wfTwoFacMsg" style="color: #F00;">
|
49 |
|
@@ -86,19 +101,19 @@
|
|
86 |
</div>
|
87 |
|
88 |
<script type="text/x-jquery-template" id="wfTwoFacUserTmpl">
|
89 |
-
<table class="wf-striped-table">
|
90 |
<thead>
|
91 |
<tr>
|
92 |
-
<th
|
93 |
-
<th
|
94 |
-
<th
|
95 |
<th>Status</th>
|
96 |
</tr>
|
97 |
</thead>
|
98 |
<tbody>
|
99 |
{{each(idx, user) users}}
|
100 |
<tr id="twoFactorUser-${user.userID}">
|
101 |
-
<td style="white-space: nowrap; text-align: center;"><a href="#"
|
102 |
<td style="white-space: nowrap;">${user.username}</td>
|
103 |
{{if user.mode == 'phone'}}
|
104 |
<td style="white-space: nowrap;">Phone (${user.phone})</td>
|
@@ -111,7 +126,7 @@
|
|
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>
|
34 |
|
35 |
<h2>Enable Cellphone Sign-in</h2>
|
36 |
<p><em>Our Cellphone Sign-in uses a technique called "Two Factor Authentication" which is used by banks, government agencies and military world-wide as one of the most secure forms of remote system authentication. We recommend you enable Cellphone Sign-in for all Administrator level accounts.</em></p>
|
37 |
+
<div class="wf-form wf-form-twofactor">
|
38 |
+
<div class="wf-form-group">
|
39 |
+
<label for="wfUsername">Username<span class="wf-hidden-xs"> to enable Cellphone Sign-in for</span></label>
|
40 |
+
<input type="text" id="wfUsername" class="wf-form-control" value="" size="20">
|
41 |
+
</div>
|
42 |
+
<div class="wf-form-group">
|
43 |
+
<label for="wf2faMode"><span class="wf-visible-xs">Mode</span><span class="wf-hidden-xs">Code generation mode</span></label>
|
44 |
+
</div>
|
45 |
+
<div class="wf-radio">
|
46 |
+
<label>
|
47 |
+
<input type="radio" name="wf2faMode" id="wf2faMode-authenticator" value="authenticator" checked>
|
48 |
+
Use authenticator app
|
49 |
+
</label>
|
50 |
+
</div>
|
51 |
+
<div class="wf-radio">
|
52 |
+
<label>
|
53 |
+
<input type="radio" name="wf2faMode" id="wf2faMode-phone" value="phone">
|
54 |
+
Send code to a phone number:
|
55 |
+
</label>
|
56 |
+
<div class="wf-radio-offset"><input type="text" id="wfPhone" value="" size="20" disabled><br><em>Format: +1-123-555-5034</em></div>
|
57 |
+
</div>
|
58 |
+
<div class="wf-form-group">
|
59 |
+
<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());">
|
60 |
+
</div>
|
61 |
+
</div>
|
62 |
<div style="height: 20px;">
|
63 |
<div id="wfTwoFacMsg" style="color: #F00;">
|
64 |
|
101 |
</div>
|
102 |
|
103 |
<script type="text/x-jquery-template" id="wfTwoFacUserTmpl">
|
104 |
+
<table class="wf-table wf-table-striped wf-table-bordered wf-table-twofactor">
|
105 |
<thead>
|
106 |
<tr>
|
107 |
+
<th></th>
|
108 |
+
<th>User</th>
|
109 |
+
<th>Mode</th>
|
110 |
<th>Status</th>
|
111 |
</tr>
|
112 |
</thead>
|
113 |
<tbody>
|
114 |
{{each(idx, user) users}}
|
115 |
<tr id="twoFactorUser-${user.userID}">
|
116 |
+
<td style="white-space: nowrap; text-align: center;" class="wf-twofactor-delete"><a href="#" onclick="WFAD.delTwoFac('${user.userID}'); return false;"><i class="wf-ion-trash-a"></i></a></td>
|
117 |
<td style="white-space: nowrap;">${user.username}</td>
|
118 |
{{if user.mode == 'phone'}}
|
119 |
<td style="white-space: nowrap;">Phone (${user.phone})</td>
|
126 |
{{else}}
|
127 |
<div class="wf-form-inline">
|
128 |
<div class="wf-form-group">
|
129 |
+
<label class="wf-plain wf-hidden-xs" style="margin: 0;" for="wfActivate-${user.userID}">Enter activation code:</label> <input class="wf-form-control" type="text" id="wfActivate-${user.userID}" size="6" placeholder="Code">
|
130 |
</div>
|
131 |
<input class="wf-btn wf-btn-default" type="button" value="Activate" onclick="WFAD.twoFacActivate('${user.userID}', jQuery('#wfActivate-${user.userID}').val());">
|
132 |
</div>
|
lib/menu_tools_whois.php
CHANGED
@@ -16,8 +16,8 @@ if (!function_exists('fsockopen')) {
|
|
16 |
} else {
|
17 |
?>
|
18 |
</p>
|
19 |
-
<p>
|
20 |
-
<input type="text" name="whois" id="wfwhois" value=""
|
21 |
</p>
|
22 |
<?php if(isset($_GET['wfnetworkblock']) && $_GET['wfnetworkblock']) { ?>
|
23 |
<h2>How to block a network</h2>
|
16 |
} else {
|
17 |
?>
|
18 |
</p>
|
19 |
+
<p class="wf-form">
|
20 |
+
<input type="text" class="wf-form-control" name="whois" id="wfwhois" value="" 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
@@ -1,15 +1,29 @@
|
|
1 |
<div class="wf-row">
|
2 |
<div class="wf-col-xs-12">
|
3 |
-
<div class="
|
|
|
|
|
|
|
4 |
</div>
|
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; ?>
|
12 |
</h2>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
<?php endif; ?>
|
14 |
<?php if (isset($helpLink)): ?><div class="wordfenceHelpLink"><a href="<?php echo $helpLink; ?>" target="_blank" class="wfhelp"></a><a href="<?php echo $helpLink; ?>" target="_blank"><?php echo $helpLabel; ?></a></div><?php endif; ?>
|
15 |
</div>
|
1 |
<div class="wf-row">
|
2 |
<div class="wf-col-xs-12">
|
3 |
+
<div class="wf-page-title">
|
4 |
+
<div class="wordfence-lock-icon wordfence-icon32"></div><h2 id="wfHeading"><?php echo $pageTitle; ?></h2>
|
5 |
+
</div>
|
6 |
+
<div class="wp-header-end"></div>
|
7 |
</div>
|
8 |
<?php if (isset($wantsLiveActivity) && $wantsLiveActivity): ?><div class="wf-col-xs-12"><?php include('live_activity.php'); ?></div><?php endif; ?>
|
9 |
<div class="wf-col-xs-12">
|
10 |
<?php if (isset($options)): ?>
|
11 |
+
<h2 class="wf-hidden-xs nav-tab-wrapper<?php if (count($options) <= 1 || (isset($hideBar) && $hideBar)) { echo ' wf-hidden'; } ?>" id="wordfenceTopTabs">
|
12 |
<?php foreach ($options as $info): ?>
|
13 |
<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>
|
14 |
<?php endforeach; ?>
|
15 |
</h2>
|
16 |
+
<ul class="wf-nav wf-nav-pills wf-visible-xs">
|
17 |
+
<li class="wf-navbar-brand">Go:</li>
|
18 |
+
<li class="wf-dropdown">
|
19 |
+
<a href="#" id="wordfenceTopTabsMobile" class="wf-dropdown-toggle wf-mobile-dropdown" data-toggle="wf-dropdown"><span id="wordfenceTopTabsMobileTitle">Go to</span> <span class="wf-caret"></span></a>
|
20 |
+
<ul class="wf-dropdown-menu">
|
21 |
+
<?php foreach ($options as $info): ?>
|
22 |
+
<li><a id="<?php echo esc_html($info['a']); ?>-tab-mobile" href="#top#<?php echo esc_html($info['a']); ?>"><?php echo esc_html($info['t']); ?></a></li>
|
23 |
+
<?php endforeach; ?>
|
24 |
+
</ul>
|
25 |
+
</li>
|
26 |
+
</ul>
|
27 |
<?php endif; ?>
|
28 |
<?php if (isset($helpLink)): ?><div class="wordfenceHelpLink"><a href="<?php echo $helpLink; ?>" target="_blank" class="wfhelp"></a><a href="<?php echo $helpLink; ?>" target="_blank"><?php echo $helpLabel; ?></a></div><?php endif; ?>
|
29 |
</div>
|
lib/wfDB.php
CHANGED
@@ -1,6 +1,10 @@
|
|
1 |
<?php
|
2 |
class wfDB {
|
3 |
public $errorMsg = false;
|
|
|
|
|
|
|
|
|
4 |
public function __construct(){
|
5 |
}
|
6 |
public function querySingle(){
|
1 |
<?php
|
2 |
class wfDB {
|
3 |
public $errorMsg = false;
|
4 |
+
public static function networkPrefix() {
|
5 |
+
global $wpdb;
|
6 |
+
return $wpdb->get_blog_prefix(0);
|
7 |
+
}
|
8 |
public function __construct(){
|
9 |
}
|
10 |
public function querySingle(){
|
lib/wfDashboard.php
CHANGED
@@ -18,6 +18,8 @@ class wfDashboard {
|
|
18 |
|
19 |
public $features = array();
|
20 |
|
|
|
|
|
21 |
public $tdfCommunity;
|
22 |
public $tdfPremium;
|
23 |
|
@@ -108,8 +110,31 @@ class wfDashboard {
|
|
108 |
array('name' => 'Spam Blacklist Check', 'link' => network_admin_url('admin.php?page=WordfenceSecOpt#focus-checkSpamIP'), 'state' => !wfConfig::get('isPaid') ? self::FEATURE_PREMIUM : (wfConfig::get('checkSpamIP') ? self::FEATURE_ENABLED : self::FEATURE_DISABLED)),
|
109 |
);
|
110 |
|
111 |
-
// TDF
|
112 |
$data = wfConfig::get_ser('dashboardData');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
if (is_array($data) && isset($data['tdf']) && isset($data['tdf']['community'])) {
|
114 |
$this->tdfCommunity = (int) $data['tdf']['community'];
|
115 |
$this->tdfPremium = (int) $data['tdf']['premium'];
|
18 |
|
19 |
public $features = array();
|
20 |
|
21 |
+
public $lastGenerated;
|
22 |
+
|
23 |
public $tdfCommunity;
|
24 |
public $tdfPremium;
|
25 |
|
110 |
array('name' => 'Spam Blacklist Check', 'link' => network_admin_url('admin.php?page=WordfenceSecOpt#focus-checkSpamIP'), 'state' => !wfConfig::get('isPaid') ? self::FEATURE_PREMIUM : (wfConfig::get('checkSpamIP') ? self::FEATURE_ENABLED : self::FEATURE_DISABLED)),
|
111 |
);
|
112 |
|
|
|
113 |
$data = wfConfig::get_ser('dashboardData');
|
114 |
+
$lastChecked = wfConfig::get('lastDashboardCheck', 0);
|
115 |
+
if ((!is_array($data) || (isset($data['generated']) && $data['generated'] + 3600 < time())) && $lastChecked + 3600 < time()) {
|
116 |
+
$wp_version = wfUtils::getWPVersion();
|
117 |
+
$apiKey = wfConfig::get('apiKey');
|
118 |
+
$api = new wfAPI($apiKey, $wp_version);
|
119 |
+
wfConfig::set('lastDashboardCheck', time());
|
120 |
+
try {
|
121 |
+
$json = $api->getStaticURL('/stats.json');
|
122 |
+
$data = @json_decode($json, true);
|
123 |
+
if ($json && is_array($data)) {
|
124 |
+
self::processDashboardResponse($data);
|
125 |
+
}
|
126 |
+
}
|
127 |
+
catch (Exception $e) {
|
128 |
+
//Do nothing
|
129 |
+
}
|
130 |
+
}
|
131 |
+
|
132 |
+
// Last Generated
|
133 |
+
if (is_array($data) && isset($data['generated'])) {
|
134 |
+
$this->lastGenerated = $data['generated'];
|
135 |
+
}
|
136 |
+
|
137 |
+
// TDF
|
138 |
if (is_array($data) && isset($data['tdf']) && isset($data['tdf']['community'])) {
|
139 |
$this->tdfCommunity = (int) $data['tdf']['community'];
|
140 |
$this->tdfPremium = (int) $data['tdf']['premium'];
|
lib/wfNotification.php
CHANGED
@@ -13,7 +13,8 @@ class wfNotification {
|
|
13 |
|
14 |
public static function notifications($since = 0) {
|
15 |
global $wpdb;
|
16 |
-
$
|
|
|
17 |
$notifications = array();
|
18 |
foreach ($rawNotifications as $raw) {
|
19 |
$notifications[] = new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
|
@@ -23,7 +24,8 @@ class wfNotification {
|
|
23 |
|
24 |
public static function getNotificationForID($id) {
|
25 |
global $wpdb;
|
26 |
-
$
|
|
|
27 |
if (count($rawNotifications) == 1) {
|
28 |
$raw = $rawNotifications[0];
|
29 |
return new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
|
@@ -33,7 +35,8 @@ class wfNotification {
|
|
33 |
|
34 |
public static function getNotificationForCategory($category, $requireNew = true) {
|
35 |
global $wpdb;
|
36 |
-
$
|
|
|
37 |
if (count($rawNotifications) == 1) {
|
38 |
$raw = $rawNotifications[0];
|
39 |
return new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
|
13 |
|
14 |
public static function notifications($since = 0) {
|
15 |
global $wpdb;
|
16 |
+
$prefix = wfDB::networkPrefix();
|
17 |
+
$rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$prefix}wfNotifications WHERE `new` = 1 AND `ctime` > %d ORDER BY `priority` ASC, `ctime` DESC", $since), ARRAY_A);
|
18 |
$notifications = array();
|
19 |
foreach ($rawNotifications as $raw) {
|
20 |
$notifications[] = new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
|
24 |
|
25 |
public static function getNotificationForID($id) {
|
26 |
global $wpdb;
|
27 |
+
$prefix = wfDB::networkPrefix();
|
28 |
+
$rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$prefix}wfNotifications WHERE `id` = %s ORDER BY `priority` ASC, `ctime` DESC", $id), ARRAY_A);
|
29 |
if (count($rawNotifications) == 1) {
|
30 |
$raw = $rawNotifications[0];
|
31 |
return new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
|
35 |
|
36 |
public static function getNotificationForCategory($category, $requireNew = true) {
|
37 |
global $wpdb;
|
38 |
+
$prefix = wfDB::networkPrefix();
|
39 |
+
$rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$prefix}wfNotifications WHERE " . ($requireNew ? '`new` = 1 AND ' : '') . "`category` = %s ORDER BY `priority` ASC, `ctime` DESC LIMIT 1", $category), ARRAY_A);
|
40 |
if (count($rawNotifications) == 1) {
|
41 |
$raw = $rawNotifications[0];
|
42 |
return new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true);
|
lib/wfScanEngine.php
CHANGED
@@ -206,7 +206,7 @@ class wfScanEngine {
|
|
206 |
$this->status(1, 'info', '-------------------');
|
207 |
$this->status(1, 'info', "Scan interrupted. Scanned " . $summary['totalFiles'] . " files, " . $summary['totalPlugins'] . " plugins, " . $summary['totalThemes'] . " themes, " . ($summary['totalPages'] + $summary['totalPosts']) . " pages, " . $summary['totalComments'] . " comments and " . $summary['totalRows'] . " records in " . wfUtils::makeDuration(time() - $this->startTime, true) . ".");
|
208 |
if($this->i->totalIssues > 0){
|
209 |
-
$this->status(10, 'info', "SUM_FINAL:Scan interrupted. You have " . $this->i->totalIssues . " new
|
210 |
} else {
|
211 |
$this->status(10, 'info', "SUM_FINAL:Scan interrupted. No problems found prior to stopping.");
|
212 |
}
|
@@ -266,7 +266,7 @@ class wfScanEngine {
|
|
266 |
$this->status(1, 'info', '-------------------');
|
267 |
$this->status(1, 'info', "Scan Complete. Scanned " . $summary['totalFiles'] . " files, " . $summary['totalPlugins'] . " plugins, " . $summary['totalThemes'] . " themes, " . ($summary['totalPages'] + $summary['totalPosts']) . " pages, " . $summary['totalComments'] . " comments and " . $summary['totalRows'] . " records in " . wfUtils::makeDuration(time() - $this->startTime, true) . ".");
|
268 |
if($this->i->totalIssues > 0){
|
269 |
-
$this->status(10, 'info', "SUM_FINAL:Scan complete. You have " . $this->i->totalIssues . " new
|
270 |
} else {
|
271 |
$this->status(10, 'info', "SUM_FINAL:Scan complete. Congratulations, no problems found.");
|
272 |
}
|
206 |
$this->status(1, 'info', '-------------------');
|
207 |
$this->status(1, 'info', "Scan interrupted. Scanned " . $summary['totalFiles'] . " files, " . $summary['totalPlugins'] . " plugins, " . $summary['totalThemes'] . " themes, " . ($summary['totalPages'] + $summary['totalPosts']) . " pages, " . $summary['totalComments'] . " comments and " . $summary['totalRows'] . " records in " . wfUtils::makeDuration(time() - $this->startTime, true) . ".");
|
208 |
if($this->i->totalIssues > 0){
|
209 |
+
$this->status(10, 'info', "SUM_FINAL:Scan interrupted. You have " . $this->i->totalIssues . " new issue" . ($this->i->totalIssues == 1 ? "" : "s") . " to fix. See below.");
|
210 |
} else {
|
211 |
$this->status(10, 'info', "SUM_FINAL:Scan interrupted. No problems found prior to stopping.");
|
212 |
}
|
266 |
$this->status(1, 'info', '-------------------');
|
267 |
$this->status(1, 'info', "Scan Complete. Scanned " . $summary['totalFiles'] . " files, " . $summary['totalPlugins'] . " plugins, " . $summary['totalThemes'] . " themes, " . ($summary['totalPages'] + $summary['totalPosts']) . " pages, " . $summary['totalComments'] . " comments and " . $summary['totalRows'] . " records in " . wfUtils::makeDuration(time() - $this->startTime, true) . ".");
|
268 |
if($this->i->totalIssues > 0){
|
269 |
+
$this->status(10, 'info', "SUM_FINAL:Scan complete. You have " . $this->i->totalIssues . " new issue" . ($this->i->totalIssues == 1 ? "" : "s") . " to fix. See below.");
|
270 |
} else {
|
271 |
$this->status(10, 'info', "SUM_FINAL:Scan complete. Congratulations, no problems found.");
|
272 |
}
|
lib/wfStyle.php
CHANGED
@@ -7,7 +7,7 @@ class wfStyle {
|
|
7 |
*/
|
8 |
public static function contentClasses() {
|
9 |
if (wfConfig::get('isPaid')) {
|
10 |
-
return 'wf-col-xs-12
|
11 |
}
|
12 |
return 'wf-col-xs-12 wf-col-sm-9 wf-col-sm-pull-3';
|
13 |
}
|
7 |
*/
|
8 |
public static function contentClasses() {
|
9 |
if (wfConfig::get('isPaid')) {
|
10 |
+
return 'wf-col-xs-12';
|
11 |
}
|
12 |
return 'wf-col-xs-12 wf-col-sm-9 wf-col-sm-pull-3';
|
13 |
}
|
lib/wordfenceClass.php
CHANGED
@@ -216,6 +216,7 @@ class wordfence {
|
|
216 |
}
|
217 |
}
|
218 |
if (isset($keyData['dashboard'])) {
|
|
|
219 |
wfDashboard::processDashboardResponse($keyData['dashboard']);
|
220 |
}
|
221 |
}
|
@@ -808,6 +809,7 @@ SQL
|
|
808 |
if (wfConfig::get('loginSec_disableAuthorScan')) {
|
809 |
add_filter('oembed_response_data', 'wordfence::oembedAuthorFilter', 99, 4);
|
810 |
add_filter('rest_request_before_callbacks', 'wordfence::jsonAPIAuthorFilter', 99, 3);
|
|
|
811 |
}
|
812 |
|
813 |
// Change GoDaddy's limit login mu-plugin since it can interfere with the two factor auth message.
|
@@ -1236,12 +1238,13 @@ SQL
|
|
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' =>
|
1245 |
'homeURL' => $homeurl,
|
1246 |
'whitelistedIPs' => (string) wfConfig::get('whitelisted'),
|
1247 |
'howGetIPs' => (string) wfConfig::get('howGetIPs'),
|
@@ -1426,17 +1429,26 @@ SQL
|
|
1426 |
if (preg_match('~' . preg_quote($urlBase, '~') . '/*$~i', $route)) {
|
1427 |
$error = new WP_Error('rest_user_cannot_view', __('Sorry, you are not allowed to list users.'), array('status' => rest_authorization_required_code()));
|
1428 |
$response = rest_ensure_response($error);
|
|
|
1429 |
}
|
1430 |
else if (preg_match('~' . preg_quote($urlBase, '~') . '/+(\d+)/*$~i', $route, $matches)) {
|
1431 |
$id = (int) $matches[1];
|
1432 |
if (get_current_user_id() !== $id) {
|
1433 |
$error = new WP_Error('rest_user_invalid_id', __('Invalid user ID.'), array('status' => 404));
|
1434 |
$response = rest_ensure_response($error);
|
|
|
1435 |
}
|
1436 |
}
|
1437 |
}
|
1438 |
return $response;
|
1439 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1440 |
public static function showTwoFactorField() {
|
1441 |
$existingContents = ob_get_contents();
|
1442 |
if (!preg_match('/wftwofactornonce:([0-9]+)\/(.+?)\s/', $existingContents, $matches)) {
|
@@ -2622,6 +2634,9 @@ SQL
|
|
2622 |
//When downgrading we must disable all two factor authentication because it can lock an admin out if we don't.
|
2623 |
wfConfig::set_ser('twoFactorUsers', array());
|
2624 |
self::licenseStatusChanged();
|
|
|
|
|
|
|
2625 |
} else {
|
2626 |
throw new Exception("Could not understand the response we received from the Wordfence servers when applying for a free API key.");
|
2627 |
}
|
@@ -2935,6 +2950,7 @@ SQL
|
|
2935 |
try {
|
2936 |
$keyData = $api->call('ping_api_key', array(), array());
|
2937 |
if (isset($keyData['dashboard'])) {
|
|
|
2938 |
wfDashboard::processDashboardResponse($keyData['dashboard']);
|
2939 |
}
|
2940 |
}
|
@@ -4584,6 +4600,7 @@ HTML;
|
|
4584 |
wp_enqueue_style('wp-pointer');
|
4585 |
wp_enqueue_script('wp-pointer');
|
4586 |
wp_enqueue_style('wordfence-main-style', wfUtils::getBaseURL() . 'css/main.css', '', WORDFENCE_VERSION);
|
|
|
4587 |
wp_enqueue_style('wordfence-colorbox-style', wfUtils::getBaseURL() . 'css/colorbox.css', '', WORDFENCE_VERSION);
|
4588 |
wp_enqueue_style('wordfence-dttable-style', wfUtils::getBaseURL() . 'css/dt_table.css', '', WORDFENCE_VERSION);
|
4589 |
|
@@ -4595,6 +4612,7 @@ HTML;
|
|
4595 |
//wp_enqueue_script('jquery.tools', wfUtils::getBaseURL() . 'js/jquery.tools.min.js', array('jquery'));
|
4596 |
wp_enqueue_script('wordfenceAdminjs', wfUtils::getBaseURL() . 'js/admin.js', array('jquery'), WORDFENCE_VERSION);
|
4597 |
wp_enqueue_script('wordfenceAdminExtjs', wfUtils::getBaseURL() . 'js/tourTip.js', array('jquery'), WORDFENCE_VERSION);
|
|
|
4598 |
self::setupAdminVars();
|
4599 |
} else {
|
4600 |
wp_enqueue_style('wp-pointer');
|
@@ -6305,6 +6323,15 @@ to your httpd.conf if using Apache, or find documentation on how to disable dire
|
|
6305 |
wfWAF::getInstance()->getStorageEngine()->setConfig('disabledRules', $disabledRules);
|
6306 |
}
|
6307 |
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6308 |
}
|
6309 |
}
|
6310 |
|
@@ -6931,6 +6958,11 @@ LIMIT %d", $lastSendTime, $limit));
|
|
6931 |
$actionData['ssl'] = $ssl;
|
6932 |
$actionData['fullRequest'] = base64_encode($requestString);
|
6933 |
}
|
|
|
|
|
|
|
|
|
|
|
6934 |
}
|
6935 |
|
6936 |
$hit->actionData = wfRequestModel::serializeActionData($actionData);
|
216 |
}
|
217 |
}
|
218 |
if (isset($keyData['dashboard'])) {
|
219 |
+
wfConfig::set('lastDashboardCheck', time());
|
220 |
wfDashboard::processDashboardResponse($keyData['dashboard']);
|
221 |
}
|
222 |
}
|
809 |
if (wfConfig::get('loginSec_disableAuthorScan')) {
|
810 |
add_filter('oembed_response_data', 'wordfence::oembedAuthorFilter', 99, 4);
|
811 |
add_filter('rest_request_before_callbacks', 'wordfence::jsonAPIAuthorFilter', 99, 3);
|
812 |
+
add_filter('rest_post_dispatch', 'wordfence::jsonAPIAdjustHeaders', 99, 3);
|
813 |
}
|
814 |
|
815 |
// Change GoDaddy's limit login mu-plugin since it can interfere with the two factor auth message.
|
1238 |
// Sync the WAF data with the database.
|
1239 |
if (!WFWAF_SUBDIRECTORY_INSTALL && $waf = wfWAF::getInstance()) {
|
1240 |
$homeurl = wfUtils::wpHomeURL();
|
1241 |
+
$siteurl = wfUtils::wpSiteURL();
|
1242 |
|
1243 |
try {
|
1244 |
$configDefaults = array(
|
1245 |
'apiKey' => wfConfig::get('apiKey'),
|
1246 |
'isPaid' => wfConfig::get('isPaid'),
|
1247 |
+
'siteURL' => $siteurl,
|
1248 |
'homeURL' => $homeurl,
|
1249 |
'whitelistedIPs' => (string) wfConfig::get('whitelisted'),
|
1250 |
'howGetIPs' => (string) wfConfig::get('howGetIPs'),
|
1429 |
if (preg_match('~' . preg_quote($urlBase, '~') . '/*$~i', $route)) {
|
1430 |
$error = new WP_Error('rest_user_cannot_view', __('Sorry, you are not allowed to list users.'), array('status' => rest_authorization_required_code()));
|
1431 |
$response = rest_ensure_response($error);
|
1432 |
+
define('WORDFENCE_REST_API_SUPPRESSED', true);
|
1433 |
}
|
1434 |
else if (preg_match('~' . preg_quote($urlBase, '~') . '/+(\d+)/*$~i', $route, $matches)) {
|
1435 |
$id = (int) $matches[1];
|
1436 |
if (get_current_user_id() !== $id) {
|
1437 |
$error = new WP_Error('rest_user_invalid_id', __('Invalid user ID.'), array('status' => 404));
|
1438 |
$response = rest_ensure_response($error);
|
1439 |
+
define('WORDFENCE_REST_API_SUPPRESSED', true);
|
1440 |
}
|
1441 |
}
|
1442 |
}
|
1443 |
return $response;
|
1444 |
}
|
1445 |
+
public static function jsonAPIAdjustHeaders($response, $server, $request) {
|
1446 |
+
if (defined('WORDFENCE_REST_API_SUPPRESSED')) {
|
1447 |
+
$response->header('Allow', 'GET');
|
1448 |
+
}
|
1449 |
+
|
1450 |
+
return $response;
|
1451 |
+
}
|
1452 |
public static function showTwoFactorField() {
|
1453 |
$existingContents = ob_get_contents();
|
1454 |
if (!preg_match('/wftwofactornonce:([0-9]+)\/(.+?)\s/', $existingContents, $matches)) {
|
2634 |
//When downgrading we must disable all two factor authentication because it can lock an admin out if we don't.
|
2635 |
wfConfig::set_ser('twoFactorUsers', array());
|
2636 |
self::licenseStatusChanged();
|
2637 |
+
if (method_exists(wfWAF::getInstance()->getStorageEngine(), 'purgeIPBlocks')) {
|
2638 |
+
wfWAF::getInstance()->getStorageEngine()->purgeIPBlocks(wfWAFStorageInterface::IP_BLOCKS_BLACKLIST);
|
2639 |
+
}
|
2640 |
} else {
|
2641 |
throw new Exception("Could not understand the response we received from the Wordfence servers when applying for a free API key.");
|
2642 |
}
|
2950 |
try {
|
2951 |
$keyData = $api->call('ping_api_key', array(), array());
|
2952 |
if (isset($keyData['dashboard'])) {
|
2953 |
+
wfConfig::set('lastDashboardCheck', time());
|
2954 |
wfDashboard::processDashboardResponse($keyData['dashboard']);
|
2955 |
}
|
2956 |
}
|
4600 |
wp_enqueue_style('wp-pointer');
|
4601 |
wp_enqueue_script('wp-pointer');
|
4602 |
wp_enqueue_style('wordfence-main-style', wfUtils::getBaseURL() . 'css/main.css', '', WORDFENCE_VERSION);
|
4603 |
+
wp_enqueue_style('wordfence-ionicons-style', wfUtils::getBaseURL() . 'css/wf-ionicons.css', '', WORDFENCE_VERSION);
|
4604 |
wp_enqueue_style('wordfence-colorbox-style', wfUtils::getBaseURL() . 'css/colorbox.css', '', WORDFENCE_VERSION);
|
4605 |
wp_enqueue_style('wordfence-dttable-style', wfUtils::getBaseURL() . 'css/dt_table.css', '', WORDFENCE_VERSION);
|
4606 |
|
4612 |
//wp_enqueue_script('jquery.tools', wfUtils::getBaseURL() . 'js/jquery.tools.min.js', array('jquery'));
|
4613 |
wp_enqueue_script('wordfenceAdminjs', wfUtils::getBaseURL() . 'js/admin.js', array('jquery'), WORDFENCE_VERSION);
|
4614 |
wp_enqueue_script('wordfenceAdminExtjs', wfUtils::getBaseURL() . 'js/tourTip.js', array('jquery'), WORDFENCE_VERSION);
|
4615 |
+
wp_enqueue_script('wordfenceDropdownjs', wfUtils::getBaseURL() . 'js/wfdropdown.js', array('jquery'), WORDFENCE_VERSION);
|
4616 |
self::setupAdminVars();
|
4617 |
} else {
|
4618 |
wp_enqueue_style('wp-pointer');
|
6323 |
wfWAF::getInstance()->getStorageEngine()->setConfig('disabledRules', $disabledRules);
|
6324 |
}
|
6325 |
break;
|
6326 |
+
case 'disableWAFBlacklistBlocking':
|
6327 |
+
if (isset($_POST['disableWAFBlacklistBlocking'])) {
|
6328 |
+
$disableWAFBlacklistBlocking = (int) $_POST['disableWAFBlacklistBlocking'];
|
6329 |
+
wfWAF::getInstance()->getStorageEngine()->setConfig('disableWAFBlacklistBlocking', $disableWAFBlacklistBlocking);
|
6330 |
+
if (method_exists(wfWAF::getInstance()->getStorageEngine(), 'purgeIPBlocks')) {
|
6331 |
+
wfWAF::getInstance()->getStorageEngine()->purgeIPBlocks(wfWAFStorageInterface::IP_BLOCKS_BLACKLIST);
|
6332 |
+
}
|
6333 |
+
}
|
6334 |
+
break;
|
6335 |
}
|
6336 |
}
|
6337 |
|
6958 |
$actionData['ssl'] = $ssl;
|
6959 |
$actionData['fullRequest'] = base64_encode($requestString);
|
6960 |
}
|
6961 |
+
else if ($ruleIDs[0] == 'blocked') {
|
6962 |
+
$actionData['category'] = 'blocked';
|
6963 |
+
$actionData['ssl'] = $ssl;
|
6964 |
+
$actionData['fullRequest'] = base64_encode($requestString);
|
6965 |
+
}
|
6966 |
}
|
6967 |
|
6968 |
$hit->actionData = wfRequestModel::serializeActionData($actionData);
|
lib/wordfenceScanner.php
CHANGED
@@ -322,7 +322,7 @@ class wordfenceScanner {
|
|
322 |
'ignoreP' => $this->path . $file,
|
323 |
'ignoreC' => $fileSum,
|
324 |
'shortMsg' => "File appears to be malicious: " . esc_html($file),
|
325 |
-
'longMsg' => "This file appears to be installed by a hacker to perform malicious activity. If you know about this file you can choose to ignore it to exclude it from future scans. The text we found in this file that matches a known malicious file is: <strong style=\"color: #F00;\">\"" . wfUtils::potentialBinaryStringToHTML((strlen($matchString) > 200 ? substr($matchString, 0, 200) . '...' : $matchString)) . "\"</strong>. The infection type is: <strong>" . esc_html($rule[3]) . '</strong>.' . $extraMsg,
|
326 |
'data' => array_merge(array(
|
327 |
'file' => $file,
|
328 |
), $dataForFile),
|
@@ -354,7 +354,7 @@ class wordfenceScanner {
|
|
354 |
'ignoreP' => $this->path . $file,
|
355 |
'ignoreC' => $fileSum,
|
356 |
'shortMsg' => "This file may contain malicious executable code: " . esc_html($this->path . $file),
|
357 |
-
'longMsg' => "This file is a PHP executable file and contains the word 'eval' (without quotes) and the word '" . esc_html($badStringFound) . "' (without quotes). The eval() function along with an encoding function like the one mentioned are commonly used by hackers to hide their code. If you know about this file you can choose to ignore it to exclude it from future scans. This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives.",
|
358 |
'data' => array_merge(array(
|
359 |
'file' => $file,
|
360 |
), $dataForFile),
|
322 |
'ignoreP' => $this->path . $file,
|
323 |
'ignoreC' => $fileSum,
|
324 |
'shortMsg' => "File appears to be malicious: " . esc_html($file),
|
325 |
+
'longMsg' => "This file appears to be installed by a hacker to perform malicious activity. If you know about this file you can choose to ignore it to exclude it from future scans. The text we found in this file that matches a known malicious file is: <strong style=\"color: #F00;\" class=\"wf-split-word\">\"" . wfUtils::potentialBinaryStringToHTML((strlen($matchString) > 200 ? substr($matchString, 0, 200) . '...' : $matchString)) . "\"</strong>. The infection type is: <strong>" . esc_html($rule[3]) . '</strong>.' . $extraMsg,
|
326 |
'data' => array_merge(array(
|
327 |
'file' => $file,
|
328 |
), $dataForFile),
|
354 |
'ignoreP' => $this->path . $file,
|
355 |
'ignoreC' => $fileSum,
|
356 |
'shortMsg' => "This file may contain malicious executable code: " . esc_html($this->path . $file),
|
357 |
+
'longMsg' => "This file is a PHP executable file and contains the word 'eval' (without quotes) and the word '<span class=\"wf-split-word\">" . esc_html($badStringFound) . "</span>' (without quotes). The eval() function along with an encoding function like the one mentioned are commonly used by hackers to hide their code. If you know about this file you can choose to ignore it to exclude it from future scans. This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives.",
|
358 |
'data' => array_merge(array(
|
359 |
'file' => $file,
|
360 |
), $dataForFile),
|
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 |
|
@@ -161,6 +161,16 @@ Secure your website with Wordfence.
|
|
161 |
|
162 |
== Changelog ==
|
163 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
= 6.3.2 =
|
165 |
* Improvement: Improved the WAF's ability to inspect POST bodies.
|
166 |
* Improvement: Dashboard now shows up to 100 each of failed/successful logins.
|
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.3
|
6 |
+
Stable tag: 6.3.3
|
7 |
|
8 |
Secure your website with the most comprehensive WordPress security plugin. Firewall, malware scan, blocking, live traffic, login security & more.
|
9 |
|
161 |
|
162 |
== Changelog ==
|
163 |
|
164 |
+
= 6.3.3 =
|
165 |
+
* New: Malicious IPs are now preemptively blocked by a regularly-updated blacklist. [Premium Feature]
|
166 |
+
* Improvement: Better layout and display for mobile screen sizes.
|
167 |
+
* Improvement: Dashboard chart data is now updated more frequently.
|
168 |
+
* Fix: Fixed database errors on notifications page on multisite installations.
|
169 |
+
* Fix: Fixed site URL detection for multisite installations.
|
170 |
+
* Fix: Fixed tour popup positioning on multisite.
|
171 |
+
* Fix: Increased the z-index of the AJAX error watcher alert.
|
172 |
+
* Fix: Addressed an additional way to enumerate authors with the REST JSON API.
|
173 |
+
|
174 |
= 6.3.2 =
|
175 |
* Improvement: Improved the WAF's ability to inspect POST bodies.
|
176 |
* Improvement: Dashboard now shows up to 100 each of failed/successful logins.
|
vendor/wordfence/wf-waf/src/init.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
define('WFWAF_VERSION', '1.0.
|
4 |
define('WFWAF_PATH', dirname(__FILE__) . '/');
|
5 |
define('WFWAF_LIB_PATH', WFWAF_PATH . 'lib/');
|
6 |
define('WFWAF_VIEW_PATH', WFWAF_PATH . 'views/');
|
1 |
<?php
|
2 |
|
3 |
+
define('WFWAF_VERSION', '1.0.3');
|
4 |
define('WFWAF_PATH', dirname(__FILE__) . '/');
|
5 |
define('WFWAF_LIB_PATH', WFWAF_PATH . 'lib/');
|
6 |
define('WFWAF_VIEW_PATH', WFWAF_PATH . 'views/');
|
vendor/wordfence/wf-waf/src/lib/request.php
CHANGED
@@ -464,8 +464,11 @@ class wfWAFRequest implements wfWAFRequestInterface {
|
|
464 |
$nestedCookies = $this->getCookieString($cookieValue, $resolvedName);
|
465 |
$cookieString .= $nestedCookies;
|
466 |
}
|
467 |
-
else
|
468 |
-
|
|
|
|
|
|
|
469 |
$cookieString .= $resolvedName . '=' . urlencode($cookieValue) . '; ';
|
470 |
}
|
471 |
}
|
464 |
$nestedCookies = $this->getCookieString($cookieValue, $resolvedName);
|
465 |
$cookieString .= $nestedCookies;
|
466 |
}
|
467 |
+
else {
|
468 |
+
if (strpos($resolvedName, 'wordpress_') === 0) {
|
469 |
+
$cookieValue = '<redacted>';
|
470 |
+
}
|
471 |
+
|
472 |
$cookieString .= $resolvedName . '=' . urlencode($cookieValue) . '; ';
|
473 |
}
|
474 |
}
|
vendor/wordfence/wf-waf/src/lib/storage.php
CHANGED
@@ -1,6 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
interface wfWAFStorageInterface {
|
|
|
|
|
|
|
|
|
4 |
public function hasPreviousAttackData($olderThan);
|
5 |
|
6 |
public function hasNewerAttackData($newerThan);
|
@@ -42,6 +46,8 @@ interface wfWAFStorageInterface {
|
|
42 |
public function blockIP($timestamp, $ip);
|
43 |
|
44 |
public function isIPBlocked($ip);
|
|
|
|
|
45 |
|
46 |
public function getConfig($key, $default = null);
|
47 |
|
1 |
<?php
|
2 |
|
3 |
interface wfWAFStorageInterface {
|
4 |
+
const IP_BLOCKS_ALL = PHP_INT_MAX;
|
5 |
+
const IP_BLOCKS_SINGLE = 1; //1 << 0
|
6 |
+
const IP_BLOCKS_BLACKLIST = 2; //1 << 1
|
7 |
+
|
8 |
public function hasPreviousAttackData($olderThan);
|
9 |
|
10 |
public function hasNewerAttackData($newerThan);
|
46 |
public function blockIP($timestamp, $ip);
|
47 |
|
48 |
public function isIPBlocked($ip);
|
49 |
+
|
50 |
+
public function purgeIPBlocks($types = wfWAFStorageInterface::IP_BLOCKS_ALL);
|
51 |
|
52 |
public function getConfig($key, $default = null);
|
53 |
|
vendor/wordfence/wf-waf/src/lib/storage/file.php
CHANGED
@@ -3,6 +3,7 @@
|
|
3 |
class wfWAFStorageFile implements wfWAFStorageInterface {
|
4 |
|
5 |
const LOG_FILE_HEADER = "<?php exit('Access denied'); __halt_compiler(); ?>\n";
|
|
|
6 |
|
7 |
public static function atomicFilePutContents($file, $content, $prefix = 'config') {
|
8 |
$tmpFile = @tempnam(dirname($file), $prefix . '.tmp.');
|
@@ -291,12 +292,12 @@ class wfWAFStorageFile implements wfWAFStorageInterface {
|
|
291 |
* @return mixed|void
|
292 |
* @throws wfWAFStorageFileException
|
293 |
*/
|
294 |
-
public function blockIP($timestamp, $ip) {
|
295 |
$this->open();
|
296 |
if (!$this->isIPBlocked($ip)) {
|
297 |
self::lock($this->ipCacheFileHandle, LOCK_EX);
|
298 |
fseek($this->ipCacheFileHandle, 0, SEEK_END);
|
299 |
-
fwrite($this->ipCacheFileHandle, wfWAFUtils::inet_pton($ip) . pack('V', $timestamp));
|
300 |
fflush($this->ipCacheFileHandle);
|
301 |
self::lock($this->ipCacheFileHandle, LOCK_UN);
|
302 |
}
|
@@ -312,11 +313,15 @@ class wfWAFStorageFile implements wfWAFStorageInterface {
|
|
312 |
fseek($this->ipCacheFileHandle, wfWAFUtils::strlen(self::LOG_FILE_HEADER), SEEK_SET);
|
313 |
self::lock($this->ipCacheFileHandle, LOCK_SH);
|
314 |
while (!feof($this->ipCacheFileHandle)) {
|
315 |
-
$ipStr = fread($this->ipCacheFileHandle,
|
316 |
$ip2 = wfWAFUtils::substr($ipStr, 0, 16);
|
317 |
-
|
318 |
-
|
319 |
-
|
|
|
|
|
|
|
|
|
320 |
}
|
321 |
}
|
322 |
self::lock($this->ipCacheFileHandle, LOCK_UN);
|
@@ -384,19 +389,54 @@ class wfWAFStorageFile implements wfWAFStorageInterface {
|
|
384 |
$writePointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
|
385 |
fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
|
386 |
self::lock($this->ipCacheFileHandle, LOCK_EX);
|
|
|
387 |
while (!feof($this->ipCacheFileHandle)) {
|
388 |
-
$
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
|
|
395 |
}
|
396 |
-
$readPointer +=
|
397 |
fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
398 |
}
|
399 |
ftruncate($this->ipCacheFileHandle, $writePointer);
|
|
|
400 |
self::lock($this->ipCacheFileHandle, LOCK_UN);
|
401 |
}
|
402 |
|
3 |
class wfWAFStorageFile implements wfWAFStorageInterface {
|
4 |
|
5 |
const LOG_FILE_HEADER = "<?php exit('Access denied'); __halt_compiler(); ?>\n";
|
6 |
+
const IP_BLOCK_RECORD_SIZE = 24;
|
7 |
|
8 |
public static function atomicFilePutContents($file, $content, $prefix = 'config') {
|
9 |
$tmpFile = @tempnam(dirname($file), $prefix . '.tmp.');
|
292 |
* @return mixed|void
|
293 |
* @throws wfWAFStorageFileException
|
294 |
*/
|
295 |
+
public function blockIP($timestamp, $ip, $type = wfWAFStorageInterface::IP_BLOCKS_SINGLE) {
|
296 |
$this->open();
|
297 |
if (!$this->isIPBlocked($ip)) {
|
298 |
self::lock($this->ipCacheFileHandle, LOCK_EX);
|
299 |
fseek($this->ipCacheFileHandle, 0, SEEK_END);
|
300 |
+
fwrite($this->ipCacheFileHandle, wfWAFUtils::inet_pton($ip) . pack('V', $timestamp) . pack('V', $type));
|
301 |
fflush($this->ipCacheFileHandle);
|
302 |
self::lock($this->ipCacheFileHandle, LOCK_UN);
|
303 |
}
|
313 |
fseek($this->ipCacheFileHandle, wfWAFUtils::strlen(self::LOG_FILE_HEADER), SEEK_SET);
|
314 |
self::lock($this->ipCacheFileHandle, LOCK_SH);
|
315 |
while (!feof($this->ipCacheFileHandle)) {
|
316 |
+
$ipStr = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
|
317 |
$ip2 = wfWAFUtils::substr($ipStr, 0, 16);
|
318 |
+
$unpacked = @unpack('V', wfWAFUtils::substr($ipStr, 16, 4));
|
319 |
+
if (is_array($unpacked)) {
|
320 |
+
$t = array_shift($unpacked);
|
321 |
+
if ($ipBin === $ip2 && $t >= time()) {
|
322 |
+
self::lock($this->ipCacheFileHandle, LOCK_UN);
|
323 |
+
return true;
|
324 |
+
}
|
325 |
}
|
326 |
}
|
327 |
self::lock($this->ipCacheFileHandle, LOCK_UN);
|
389 |
$writePointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
|
390 |
fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
|
391 |
self::lock($this->ipCacheFileHandle, LOCK_EX);
|
392 |
+
$ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
|
393 |
while (!feof($this->ipCacheFileHandle)) {
|
394 |
+
$unpacked = @unpack('V', wfWAFUtils::substr($ipCacheRow, 16, 4));
|
395 |
+
if (is_array($unpacked)) {
|
396 |
+
$expires = array_shift($unpacked);
|
397 |
+
if ($expires >= time()) {
|
398 |
+
fseek($this->ipCacheFileHandle, $writePointer, SEEK_SET);
|
399 |
+
fwrite($this->ipCacheFileHandle, $ipCacheRow);
|
400 |
+
$writePointer += self::IP_BLOCK_RECORD_SIZE;
|
401 |
+
}
|
402 |
}
|
403 |
+
$readPointer += self::IP_BLOCK_RECORD_SIZE;
|
404 |
fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
|
405 |
+
$ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
|
406 |
+
}
|
407 |
+
ftruncate($this->ipCacheFileHandle, $writePointer);
|
408 |
+
fflush($this->ipCacheFileHandle);
|
409 |
+
self::lock($this->ipCacheFileHandle, LOCK_UN);
|
410 |
+
}
|
411 |
+
|
412 |
+
/**
|
413 |
+
* Remove all existing IP blocks.
|
414 |
+
*/
|
415 |
+
public function purgeIPBlocks($types = wfWAFStorageInterface::IP_BLOCKS_ALL) {
|
416 |
+
$this->open();
|
417 |
+
$readPointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
|
418 |
+
$writePointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER);
|
419 |
+
fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
|
420 |
+
self::lock($this->ipCacheFileHandle, LOCK_EX);
|
421 |
+
if ($types !== wfWAFStorageInterface::IP_BLOCKS_ALL) {
|
422 |
+
$ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
|
423 |
+
while (!feof($this->ipCacheFileHandle)) {
|
424 |
+
$unpacked = @unpack('Vexpires/Vtype', wfWAFUtils::substr($ipCacheRow, 16, 8));
|
425 |
+
if (is_array($unpacked)) {
|
426 |
+
$type = $unpacked['type'];
|
427 |
+
if (($type & $types) == 0) {
|
428 |
+
fseek($this->ipCacheFileHandle, $writePointer, SEEK_SET);
|
429 |
+
fwrite($this->ipCacheFileHandle, $ipCacheRow);
|
430 |
+
$writePointer += self::IP_BLOCK_RECORD_SIZE;
|
431 |
+
}
|
432 |
+
}
|
433 |
+
$readPointer += self::IP_BLOCK_RECORD_SIZE;
|
434 |
+
fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET);
|
435 |
+
$ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE);
|
436 |
+
}
|
437 |
}
|
438 |
ftruncate($this->ipCacheFileHandle, $writePointer);
|
439 |
+
fflush($this->ipCacheFileHandle);
|
440 |
self::lock($this->ipCacheFileHandle, LOCK_UN);
|
441 |
}
|
442 |
|
vendor/wordfence/wf-waf/src/lib/waf.php
CHANGED
@@ -165,6 +165,8 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
|
|
165 |
if ($this->isIPBlocked($ip)) {
|
166 |
$this->eventBus->prevBlocked($ip);
|
167 |
$e = new wfWAFBlockException();
|
|
|
|
|
168 |
$this->blockAction($e);
|
169 |
}
|
170 |
|
@@ -311,6 +313,7 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
|
|
311 |
new wfWAFCronFetchRulesEvent(time() +
|
312 |
(86400 * ($this->getStorageEngine()->getConfig('isPaid') ? .5 : 7))),
|
313 |
new wfWAFCronFetchIPListEvent(time() + 86400),
|
|
|
314 |
);
|
315 |
$this->getStorageEngine()->setConfig('cron', $cron);
|
316 |
}
|
@@ -330,6 +333,20 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
|
|
330 |
$event->fire();
|
331 |
}
|
332 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
333 |
$this->getStorageEngine()->setConfig('version', WFWAF_VERSION);
|
334 |
}
|
335 |
}
|
@@ -436,7 +453,7 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
|
|
436 |
|
437 |
$authKey = $this->getStorageEngine()->getConfig('authKey');
|
438 |
$encoded = base64_decode($encoded);
|
439 |
-
$paddedKey = substr(str_repeat($authKey, ceil(strlen($encoded) / strlen($authKey))), 0, strlen($encoded));
|
440 |
$json = $encoded ^ $paddedKey;
|
441 |
$signatures = wfWAFUtils::json_decode($json, true);
|
442 |
if (!is_array($signatures)) {
|
@@ -462,7 +479,7 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
|
|
462 |
|
463 |
$authKey = $this->getStorageEngine()->getConfig('authKey');
|
464 |
$json = wfWAFUtils::json_encode($signatures);
|
465 |
-
$paddedKey = substr(str_repeat($authKey, ceil(strlen($json) / strlen($authKey))), 0, strlen($json));
|
466 |
$payload = $json ^ $paddedKey;
|
467 |
$this->getStorageEngine()->setConfig('filePatterns', base64_encode($payload));
|
468 |
|
@@ -791,7 +808,6 @@ HTML
|
|
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 |
|
796 |
if ($redirect) {
|
797 |
wfWAFUtils::redirect($redirect); // exits
|
@@ -1553,7 +1569,7 @@ class wfWAFCronFetchIPListEvent extends wfWAFCronEvent {
|
|
1553 |
}
|
1554 |
$guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost());
|
1555 |
try {
|
1556 |
-
|
1557 |
$request = new wfWAFHTTP();
|
1558 |
$request->setHeaders(array(
|
1559 |
'Content-Type' => 'application/json',
|
@@ -1590,6 +1606,47 @@ class wfWAFCronFetchIPListEvent extends wfWAFCronEvent {
|
|
1590 |
}
|
1591 |
}
|
1592 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1593 |
class wfWAFEventBus implements wfWAFObserver {
|
1594 |
|
1595 |
private $observers = array();
|
165 |
if ($this->isIPBlocked($ip)) {
|
166 |
$this->eventBus->prevBlocked($ip);
|
167 |
$e = new wfWAFBlockException();
|
168 |
+
$e->setRequest($this->getRequest());
|
169 |
+
$e->setFailedRules(array('blocked'));
|
170 |
$this->blockAction($e);
|
171 |
}
|
172 |
|
313 |
new wfWAFCronFetchRulesEvent(time() +
|
314 |
(86400 * ($this->getStorageEngine()->getConfig('isPaid') ? .5 : 7))),
|
315 |
new wfWAFCronFetchIPListEvent(time() + 86400),
|
316 |
+
new wfWAFCronFetchBlacklistPrefixesEvent(time() + 7200),
|
317 |
);
|
318 |
$this->getStorageEngine()->setConfig('cron', $cron);
|
319 |
}
|
333 |
$event->fire();
|
334 |
}
|
335 |
|
336 |
+
if (version_compare($currentVersion, '1.0.3') === -1) {
|
337 |
+
$this->getStorageEngine()->purgeIPBlocks();
|
338 |
+
|
339 |
+
$cron = $this->getStorageEngine()->getConfig('cron');
|
340 |
+
if (is_array($cron)) {
|
341 |
+
$cron[] = new wfWAFCronFetchBlacklistPrefixesEvent(time() + 7200);
|
342 |
+
}
|
343 |
+
$this->getStorageEngine()->setConfig('cron', $cron);
|
344 |
+
|
345 |
+
$event = new wfWAFCronFetchBlacklistPrefixesEvent(time() - 2);
|
346 |
+
$event->setWaf($this);
|
347 |
+
$event->fire();
|
348 |
+
}
|
349 |
+
|
350 |
$this->getStorageEngine()->setConfig('version', WFWAF_VERSION);
|
351 |
}
|
352 |
}
|
453 |
|
454 |
$authKey = $this->getStorageEngine()->getConfig('authKey');
|
455 |
$encoded = base64_decode($encoded);
|
456 |
+
$paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($encoded) / strlen($authKey))), 0, strlen($encoded));
|
457 |
$json = $encoded ^ $paddedKey;
|
458 |
$signatures = wfWAFUtils::json_decode($json, true);
|
459 |
if (!is_array($signatures)) {
|
479 |
|
480 |
$authKey = $this->getStorageEngine()->getConfig('authKey');
|
481 |
$json = wfWAFUtils::json_encode($signatures);
|
482 |
+
$paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($json) / strlen($authKey))), 0, strlen($json));
|
483 |
$payload = $json ^ $paddedKey;
|
484 |
$this->getStorageEngine()->setConfig('filePatterns', base64_encode($payload));
|
485 |
|
808 |
*/
|
809 |
public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) {
|
810 |
$this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest(), $e->getRequest()->getMetadata());
|
|
|
811 |
|
812 |
if ($redirect) {
|
813 |
wfWAFUtils::redirect($redirect); // exits
|
1569 |
}
|
1570 |
$guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost());
|
1571 |
try {
|
1572 |
+
//Watch List
|
1573 |
$request = new wfWAFHTTP();
|
1574 |
$request->setHeaders(array(
|
1575 |
'Content-Type' => 'application/json',
|
1606 |
}
|
1607 |
}
|
1608 |
|
1609 |
+
class wfWAFCronFetchBlacklistPrefixesEvent extends wfWAFCronEvent {
|
1610 |
+
|
1611 |
+
public function fire() {
|
1612 |
+
$waf = $this->getWaf();
|
1613 |
+
if (!$waf) {
|
1614 |
+
return;
|
1615 |
+
}
|
1616 |
+
$guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost());
|
1617 |
+
try {
|
1618 |
+
if ($waf->getStorageEngine()->getConfig('isPaid')) {
|
1619 |
+
$request = new wfWAFHTTP();
|
1620 |
+
$response = wfWAFHTTP::get(WFWAF_API_URL_SEC . 'blacklist-prefixes.bin' . "?" . http_build_query(array(
|
1621 |
+
'k' => $waf->getStorageEngine()->getConfig('apiKey'),
|
1622 |
+
's' => $waf->getStorageEngine()->getConfig('siteURL') ? $waf->getStorageEngine()->getConfig('siteURL') : $guessSiteURL,
|
1623 |
+
'h' => $waf->getStorageEngine()->getConfig('homeURL') ? $waf->getStorageEngine()->getConfig('homeURL') : $guessSiteURL,
|
1624 |
+
't' => microtime(true),
|
1625 |
+
), null, '&'), $request);
|
1626 |
+
|
1627 |
+
if ($response instanceof wfWAFHTTPResponse && $response->getBody()) {
|
1628 |
+
$waf->getStorageEngine()->setConfig('blockedPrefixes', base64_encode($response->getBody()));
|
1629 |
+
$waf->getStorageEngine()->setConfig('blacklistAllowedCache', '');
|
1630 |
+
}
|
1631 |
+
}
|
1632 |
+
} catch (wfWAFHTTPTransportException $e) {
|
1633 |
+
error_log($e->getMessage());
|
1634 |
+
}
|
1635 |
+
}
|
1636 |
+
|
1637 |
+
/**
|
1638 |
+
* @return wfWAFCronEvent|bool
|
1639 |
+
*/
|
1640 |
+
public function reschedule() {
|
1641 |
+
$waf = $this->getWaf();
|
1642 |
+
if (!$waf) {
|
1643 |
+
return false;
|
1644 |
+
}
|
1645 |
+
$newEvent = new self(time() + 7200);
|
1646 |
+
return $newEvent;
|
1647 |
+
}
|
1648 |
+
}
|
1649 |
+
|
1650 |
class wfWAFEventBus implements wfWAFObserver {
|
1651 |
|
1652 |
private $observers = array();
|
waf/bootstrap.php
CHANGED
@@ -180,7 +180,7 @@ class wfWAFWordPressObserver extends wfWAFBaseObserver {
|
|
180 |
foreach ($whitelistedURLs as $whitelistedURL) {
|
181 |
$whitelistPattern .= preg_replace('/\\\\\*/', '.*?', preg_quote($whitelistedURL, '/')) . '|';
|
182 |
}
|
183 |
-
$whitelistPattern = '/^(?:' . substr($whitelistPattern, 0, -1) . ')$/i';
|
184 |
|
185 |
wfWAFRule::create(wfWAF::getInstance(), 0x8000000, 'rule', 'whitelist', 0, 'User Supplied Whitelisted URL', 'allow',
|
186 |
new wfWAFRuleComparisonGroup(
|
@@ -214,6 +214,56 @@ class wfWAFWordPressObserver extends wfWAFBaseObserver {
|
|
214 |
|
215 |
public function afterRunRules()
|
216 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
217 |
//wfWAFLogException
|
218 |
$watchedIPs = wfWAF::getInstance()->getStorageEngine()->getConfig('watchedIPs');
|
219 |
if ($watchedIPs) {
|
@@ -234,6 +284,34 @@ class wfWAFWordPressObserver extends wfWAFBaseObserver {
|
|
234 |
throw $e;
|
235 |
}
|
236 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
237 |
}
|
238 |
|
239 |
/**
|
@@ -249,14 +327,18 @@ class wfWAFWordPress extends wfWAF {
|
|
249 |
* @param int $httpCode
|
250 |
*/
|
251 |
public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) {
|
252 |
-
|
|
|
|
|
|
|
|
|
|
|
253 |
register_shutdown_function(array(
|
254 |
$this, 'whitelistFailedRulesIfNot404',
|
255 |
));
|
256 |
$this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest());
|
257 |
$this->setLearningModeAttackException($e);
|
258 |
} else {
|
259 |
-
$failedRules = $e->getFailedRules();
|
260 |
if (empty($failedRules)) {
|
261 |
$finalAction = $e->getRequest()->getMetadata('finalAction');
|
262 |
if (is_array($finalAction)) {
|
@@ -343,17 +425,29 @@ class wfWAFWordPress extends wfWAF {
|
|
343 |
$cron = $this->getStorageEngine()->getConfig('cron');
|
344 |
if (is_array($cron)) {
|
345 |
/** @var wfWAFCronEvent $event */
|
|
|
346 |
foreach ($cron as $index => $event) {
|
347 |
$event->setWaf($this);
|
348 |
if ($event->isInPast()) {
|
349 |
$event->fire();
|
350 |
$newEvent = $event->reschedule();
|
351 |
-
|
|
|
352 |
$cron[$index] = $newEvent;
|
|
|
353 |
} else {
|
354 |
unset($cron[$index]);
|
355 |
}
|
356 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
357 |
}
|
358 |
}
|
359 |
$this->getStorageEngine()->setConfig('cron', $cron);
|
@@ -379,7 +473,7 @@ class wfWAFWordPress extends wfWAF {
|
|
379 |
* @return mixed
|
380 |
*/
|
381 |
public function isIPBlocked($ip) {
|
382 |
-
return
|
383 |
}
|
384 |
|
385 |
/**
|
180 |
foreach ($whitelistedURLs as $whitelistedURL) {
|
181 |
$whitelistPattern .= preg_replace('/\\\\\*/', '.*?', preg_quote($whitelistedURL, '/')) . '|';
|
182 |
}
|
183 |
+
$whitelistPattern = '/^(?:' . wfWAFUtils::substr($whitelistPattern, 0, -1) . ')$/i';
|
184 |
|
185 |
wfWAFRule::create(wfWAF::getInstance(), 0x8000000, 'rule', 'whitelist', 0, 'User Supplied Whitelisted URL', 'allow',
|
186 |
new wfWAFRuleComparisonGroup(
|
214 |
|
215 |
public function afterRunRules()
|
216 |
{
|
217 |
+
//Blacklist
|
218 |
+
if (!wfWAF::getInstance()->getStorageEngine()->getConfig('disableWAFBlacklistBlocking')) {
|
219 |
+
$blockedPrefixes = wfWAF::getInstance()->getStorageEngine()->getConfig('blockedPrefixes');
|
220 |
+
if ($blockedPrefixes && wfWAF::getInstance()->getStorageEngine()->getConfig('isPaid')) {
|
221 |
+
$blockedPrefixes = base64_decode($blockedPrefixes);
|
222 |
+
if ($this->_prefixListContainsIP($blockedPrefixes, wfWAF::getInstance()->getRequest()->getIP()) !== false) {
|
223 |
+
$allowedCacheJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('blacklistAllowedCache', '');
|
224 |
+
$allowedCache = @json_decode($allowedCacheJSON, true);
|
225 |
+
if (!is_array($allowedCache)) {
|
226 |
+
$allowedCache = array();
|
227 |
+
}
|
228 |
+
|
229 |
+
$cacheTest = base64_encode(wfWAFUtils::inet_pton(wfWAF::getInstance()->getRequest()->getIP()));
|
230 |
+
if (!in_array($cacheTest, $allowedCache)) {
|
231 |
+
$guessSiteURL = sprintf('%s://%s/', wfWAF::getInstance()->getRequest()->getProtocol(), wfWAF::getInstance()->getRequest()->getHost());
|
232 |
+
try {
|
233 |
+
$request = new wfWAFHTTP();
|
234 |
+
$response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query(array(
|
235 |
+
'action' => 'is_ip_blacklisted',
|
236 |
+
'ip' => wfWAF::getInstance()->getRequest()->getIP(),
|
237 |
+
'k' => wfWAF::getInstance()->getStorageEngine()->getConfig('apiKey'),
|
238 |
+
's' => wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL') ? wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL') : $guessSiteURL,
|
239 |
+
'h' => wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL') ? wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL') : $guessSiteURL,
|
240 |
+
't' => microtime(true),
|
241 |
+
), null, '&'), $request);
|
242 |
+
|
243 |
+
if ($response instanceof wfWAFHTTPResponse && $response->getBody()) {
|
244 |
+
$jsonData = wfWAFUtils::json_decode($response->getBody(), true);
|
245 |
+
if (array_key_exists('data', $jsonData)) {
|
246 |
+
if (preg_match('/^block:(\d+)$/i', $jsonData['data'], $matches)) {
|
247 |
+
wfWAF::getInstance()->getStorageEngine()->blockIP((int)$matches[1] + time(), wfWAF::getInstance()->getRequest()->getIP(), wfWAFStorageInterface::IP_BLOCKS_BLACKLIST);
|
248 |
+
$e = new wfWAFBlockException();
|
249 |
+
$e->setFailedRules(array('blocked'));
|
250 |
+
$e->setRequest(wfWAF::getInstance()->getRequest());
|
251 |
+
throw $e;
|
252 |
+
}
|
253 |
+
else { //Allowed, cache until the next prefix list refresh
|
254 |
+
$allowedCache[] = $cacheTest;
|
255 |
+
wfWAF::getInstance()->getStorageEngine()->setConfig('blacklistAllowedCache', json_encode($allowedCache));
|
256 |
+
}
|
257 |
+
}
|
258 |
+
}
|
259 |
+
} catch (wfWAFHTTPTransportException $e) {
|
260 |
+
error_log($e->getMessage());
|
261 |
+
}
|
262 |
+
}
|
263 |
+
}
|
264 |
+
}
|
265 |
+
}
|
266 |
+
|
267 |
//wfWAFLogException
|
268 |
$watchedIPs = wfWAF::getInstance()->getStorageEngine()->getConfig('watchedIPs');
|
269 |
if ($watchedIPs) {
|
284 |
throw $e;
|
285 |
}
|
286 |
}
|
287 |
+
|
288 |
+
private function _prefixListContainsIP($prefixList, $ip) {
|
289 |
+
$size = ord(wfWAFUtils::substr($prefixList, 0, 1));
|
290 |
+
|
291 |
+
$sha256 = hash('sha256', wfWAFUtils::inet_pton($ip), true);
|
292 |
+
$p = wfWAFUtils::substr($sha256, 0, $size);
|
293 |
+
|
294 |
+
$count = ceil((wfWAFUtils::strlen($prefixList) - 1) / $size);
|
295 |
+
$low = 0;
|
296 |
+
$high = $count - 1;
|
297 |
+
|
298 |
+
while ($low <= $high) {
|
299 |
+
$mid = (int) (($high + $low) / 2);
|
300 |
+
$val = wfWAFUtils::substr($prefixList, 1 + $mid * $size, $size);
|
301 |
+
$cmp = strcmp($val, $p);
|
302 |
+
if ($cmp < 0) {
|
303 |
+
$low = $mid + 1;
|
304 |
+
}
|
305 |
+
else if ($cmp > 0) {
|
306 |
+
$high = $mid - 1;
|
307 |
+
}
|
308 |
+
else {
|
309 |
+
return $mid;
|
310 |
+
}
|
311 |
+
}
|
312 |
+
|
313 |
+
return false;
|
314 |
+
}
|
315 |
}
|
316 |
|
317 |
/**
|
327 |
* @param int $httpCode
|
328 |
*/
|
329 |
public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) {
|
330 |
+
$failedRules = $e->getFailedRules();
|
331 |
+
if (!is_array($failedRules)) {
|
332 |
+
$failedRules = array();
|
333 |
+
}
|
334 |
+
|
335 |
+
if ($this->isInLearningMode() && !$e->getRequest()->getMetadata('finalAction') && !in_array('blocked', $failedRules)) {
|
336 |
register_shutdown_function(array(
|
337 |
$this, 'whitelistFailedRulesIfNot404',
|
338 |
));
|
339 |
$this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest());
|
340 |
$this->setLearningModeAttackException($e);
|
341 |
} else {
|
|
|
342 |
if (empty($failedRules)) {
|
343 |
$finalAction = $e->getRequest()->getMetadata('finalAction');
|
344 |
if (is_array($finalAction)) {
|
425 |
$cron = $this->getStorageEngine()->getConfig('cron');
|
426 |
if (is_array($cron)) {
|
427 |
/** @var wfWAFCronEvent $event */
|
428 |
+
$cronDeduplication = array();
|
429 |
foreach ($cron as $index => $event) {
|
430 |
$event->setWaf($this);
|
431 |
if ($event->isInPast()) {
|
432 |
$event->fire();
|
433 |
$newEvent = $event->reschedule();
|
434 |
+
$className = get_class($newEvent);
|
435 |
+
if ($newEvent instanceof wfWAFCronEvent && $newEvent !== $event && !in_array($className, $cronDeduplication)) {
|
436 |
$cron[$index] = $newEvent;
|
437 |
+
$cronDeduplication[] = $className;
|
438 |
} else {
|
439 |
unset($cron[$index]);
|
440 |
}
|
441 |
}
|
442 |
+
else {
|
443 |
+
$className = get_class($event);
|
444 |
+
if (in_array($className, $cronDeduplication)) {
|
445 |
+
unset($cron[$index]);
|
446 |
+
}
|
447 |
+
else {
|
448 |
+
$cronDeduplication[] = $className;
|
449 |
+
}
|
450 |
+
}
|
451 |
}
|
452 |
}
|
453 |
$this->getStorageEngine()->setConfig('cron', $cron);
|
473 |
* @return mixed
|
474 |
*/
|
475 |
public function isIPBlocked($ip) {
|
476 |
+
return parent::isIPBlocked($ip);
|
477 |
}
|
478 |
|
479 |
/**
|
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.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.3');
|
15 |
define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
|
16 |
basename(dirname(__FILE__)) . '/' . basename(__FILE__));
|
17 |
|