Wordfence Security – Firewall & Malware Scan - Version 7.5.3

Version Description

  • May 10, 2021 =

  • Improvement: Expanded WAF capabilities including better JSON and user permission handling

  • Improvement: Switched to relative paths in WAF auto_prepend file to increase portability

  • Improvement: Eliminated unnecessary calls to Wordfence servers

  • Fix: Prevented errors on PHP 8.0 when disk_free_space and/or disk_total_space are included in disabled_functions

  • Fix: Fixed PHP notices caused by unexpected plugin version data

  • Fix: Gracefully handle unexpected responses from Wordfence servers

  • Fix: Time field now displays correctly on "See Recent Traffic" overlay

  • Fix: Corrected typo on Diagnostics page

  • Fix: Corrected IP counts on activity report

  • Fix: Added missing line break in scan result emails

  • Fix: Sending test activity report now provides success/failure response

  • Fix: Reduced SQLi false positives caused by comma-separated strings

  • Fix: Fixed JS error when resolving last scan result

Download this release

Release Info

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

Code changes from version 7.5.2 to 7.5.3

Files changed (86) hide show
  1. crypto/vendor/paragonie/sodium_compat/autoload-fast.php +1 -1
  2. crypto/vendor/paragonie/sodium_compat/autoload-pedantic.php +1 -1
  3. css/{activity-report-widget.1616621048.css → activity-report-widget.1620658454.css} +0 -0
  4. css/{diff.1616621048.css → diff.1620658454.css} +0 -0
  5. css/{dt_table.1616621048.css → dt_table.1620658454.css} +0 -0
  6. css/{fullLog.1616621048.css → fullLog.1620658454.css} +0 -0
  7. css/{iptraf.1616621048.css → iptraf.1620658454.css} +0 -0
  8. css/{jquery-ui-timepicker-addon.1616621048.css → jquery-ui-timepicker-addon.1620658454.css} +0 -0
  9. css/{jquery-ui.min.1616621048.css → jquery-ui.min.1620658454.css} +0 -0
  10. css/{jquery-ui.structure.min.1616621048.css → jquery-ui.structure.min.1620658454.css} +0 -0
  11. css/{jquery-ui.theme.min.1616621048.css → jquery-ui.theme.min.1620658454.css} +0 -0
  12. css/{main.1616621048.css → main.1620658454.css} +0 -0
  13. css/{phpinfo.1616621048.css → phpinfo.1620658454.css} +0 -0
  14. css/{wf-adminbar.1616621048.css → wf-adminbar.1620658454.css} +0 -0
  15. css/{wf-colorbox.1616621048.css → wf-colorbox.1620658454.css} +0 -0
  16. css/{wf-font-awesome.1616621048.css → wf-font-awesome.1620658454.css} +0 -0
  17. css/{wf-global.1616621048.css → wf-global.1620658454.css} +0 -0
  18. css/{wf-ionicons.1616621048.css → wf-ionicons.1620658454.css} +0 -0
  19. css/{wf-onboarding.1616621048.css → wf-onboarding.1620658454.css} +0 -0
  20. css/{wf-roboto-font.1616621048.css → wf-roboto-font.1620658454.css} +0 -0
  21. css/{wfselect2.min.1616621048.css → wfselect2.min.1620658454.css} +0 -0
  22. css/{wordfenceBox.1616621048.css → wordfenceBox.1620658454.css} +0 -0
  23. js/{Chart.bundle.min.1616621048.js → Chart.bundle.min.1620658454.js} +0 -0
  24. js/{admin.1616621048.js → admin.1620658454.js} +28 -10
  25. js/{admin.ajaxWatcher.1616621048.js → admin.ajaxWatcher.1620658454.js} +0 -0
  26. js/{admin.liveTraffic.1616621048.js → admin.liveTraffic.1620658454.js} +0 -0
  27. js/{date.1616621048.js → date.1620658454.js} +0 -0
  28. js/{jquery-ui-timepicker-addon.1616621048.js → jquery-ui-timepicker-addon.1620658454.js} +0 -0
  29. js/{jquery.colorbox-min.1616621048.js → jquery.colorbox-min.1620658454.js} +0 -0
  30. js/{jquery.colorbox.1616621048.js → jquery.colorbox.1620658454.js} +0 -0
  31. js/{jquery.dataTables.min.1616621048.js → jquery.dataTables.min.1620658454.js} +0 -0
  32. js/{jquery.qrcode.min.1616621048.js → jquery.qrcode.min.1620658454.js} +0 -0
  33. js/{jquery.tmpl.min.1616621048.js → jquery.tmpl.min.1620658454.js} +0 -0
  34. js/{jquery.tools.min.1616621048.js → jquery.tools.min.1620658454.js} +0 -0
  35. js/{knockout-3.3.0.1616621048.js → knockout-3.3.0.1620658454.js} +0 -0
  36. js/{wfdashboard.1616621048.js → wfdashboard.1620658454.js} +0 -0
  37. js/{wfdropdown.1616621048.js → wfdropdown.1620658454.js} +0 -0
  38. js/{wfglobal.1616621048.js → wfglobal.1620658454.js} +0 -0
  39. js/{wfi18n.1616621048.js → wfi18n.1620658454.js} +0 -0
  40. js/{wfpopover.1616621048.js → wfpopover.1620658454.js} +0 -0
  41. js/{wfselect2.min.1616621048.js → wfselect2.min.1620658454.js} +0 -0
  42. languages/wordfence.po +709 -700
  43. lib/IPTrafList.php +1 -1
  44. lib/email_newIssues.php +2 -0
  45. lib/menu_tools_diagnostic.php +2 -2
  46. lib/wfActivityReport.php +9 -9
  47. lib/wfDiagnostic.php +16 -1
  48. lib/wfScanEngine.php +8 -3
  49. lib/wfUpdateCheck.php +38 -18
  50. lib/wfUtils.php +39 -0
  51. lib/wordfenceClass.php +144 -74
  52. modules/login-security/css/{admin-global.1616621048.css → admin-global.1620658454.css} +0 -0
  53. modules/login-security/css/{admin.1616621048.css → admin.1620658454.css} +0 -0
  54. modules/login-security/css/{colorbox.1616621048.css → colorbox.1620658454.css} +0 -0
  55. modules/login-security/css/{font-awesome.1616621048.css → font-awesome.1620658454.css} +0 -0
  56. modules/login-security/css/{ionicons.1616621048.css → ionicons.1620658454.css} +0 -0
  57. modules/login-security/css/{jquery-ui-timepicker-addon.1616621048.css → jquery-ui-timepicker-addon.1620658454.css} +0 -0
  58. modules/login-security/css/{jquery-ui.min.1616621048.css → jquery-ui.min.1620658454.css} +0 -0
  59. modules/login-security/css/{jquery-ui.structure.min.1616621048.css → jquery-ui.structure.min.1620658454.css} +0 -0
  60. modules/login-security/css/{jquery-ui.theme.min.1616621048.css → jquery-ui.theme.min.1620658454.css} +0 -0
  61. modules/login-security/css/{login.1616621048.css → login.1620658454.css} +0 -0
  62. modules/login-security/js/{admin-global.1616621048.js → admin-global.1620658454.js} +0 -0
  63. modules/login-security/js/{admin.1616621048.js → admin.1620658454.js} +0 -0
  64. modules/login-security/js/{jquery-ui-timepicker-addon.1616621048.js → jquery-ui-timepicker-addon.1620658454.js} +0 -0
  65. modules/login-security/js/{jquery.colorbox.1616621048.js → jquery.colorbox.1620658454.js} +0 -0
  66. modules/login-security/js/{jquery.colorbox.min.1616621048.js → jquery.colorbox.min.1620658454.js} +0 -0
  67. modules/login-security/js/{jquery.qrcode.min.1616621048.js → jquery.qrcode.min.1620658454.js} +0 -0
  68. modules/login-security/js/{jquery.tmpl.min.1616621048.js → jquery.tmpl.min.1620658454.js} +0 -0
  69. modules/login-security/js/{login.1616621048.js → login.1620658454.js} +0 -0
  70. modules/login-security/wordfence-login-security.php +1 -1
  71. readme.txt +17 -1
  72. vendor/wordfence/wf-waf/src/init.php +1 -1
  73. vendor/wordfence/wf-waf/src/lib/http.php +1 -0
  74. vendor/wordfence/wf-waf/src/lib/parser/lexer.php +11 -1
  75. vendor/wordfence/wf-waf/src/lib/parser/parser.php +78 -25
  76. vendor/wordfence/wf-waf/src/lib/parser/sqli.php +81 -55
  77. vendor/wordfence/wf-waf/src/lib/request.php +24 -2
  78. vendor/wordfence/wf-waf/src/lib/rules.php +181 -24
  79. vendor/wordfence/wf-waf/src/lib/storage.php +2 -0
  80. vendor/wordfence/wf-waf/src/lib/storage/file.php +4 -0
  81. vendor/wordfence/wf-waf/src/lib/storage/mysql.php +5 -0
  82. vendor/wordfence/wf-waf/src/lib/waf.php +145 -88
  83. views/reports/activity-report-email-inline.php +1 -1
  84. views/waf/waf-uninstall.php +1 -1
  85. waf/bootstrap.php +7 -3
  86. wordfence.php +4 -4
crypto/vendor/paragonie/sodium_compat/autoload-fast.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
  // phpcs:ignoreFile -- compatibility library for PHP 5-7.1
3
 
4
- require_once dirname(__FILE__) . '/autoload.php';
5
  ParagonIE_Sodium_Compat::$fastMult = true;
1
  <?php
2
  // phpcs:ignoreFile -- compatibility library for PHP 5-7.1
3
 
4
+ require_once 'autoload.php';
5
  ParagonIE_Sodium_Compat::$fastMult = true;
crypto/vendor/paragonie/sodium_compat/autoload-pedantic.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  // phpcs:ignoreFile -- compatibility library for PHP 5-7.1
3
 
4
- require_once dirname(__FILE__) . '/autoload.php';
5
  define('DO_PEDANTIC_TEST', true);
6
 
7
  ParagonIE_Sodium_Compat::$fastMult = true;
1
  <?php
2
  // phpcs:ignoreFile -- compatibility library for PHP 5-7.1
3
 
4
+ require_once 'autoload.php';
5
  define('DO_PEDANTIC_TEST', true);
6
 
7
  ParagonIE_Sodium_Compat::$fastMult = true;
css/{activity-report-widget.1616621048.css → activity-report-widget.1620658454.css} RENAMED
File without changes
css/{diff.1616621048.css → diff.1620658454.css} RENAMED
File without changes
css/{dt_table.1616621048.css → dt_table.1620658454.css} RENAMED
File without changes
css/{fullLog.1616621048.css → fullLog.1620658454.css} RENAMED
File without changes
css/{iptraf.1616621048.css → iptraf.1620658454.css} RENAMED
File without changes
css/{jquery-ui-timepicker-addon.1616621048.css → jquery-ui-timepicker-addon.1620658454.css} RENAMED
File without changes
css/{jquery-ui.min.1616621048.css → jquery-ui.min.1620658454.css} RENAMED
File without changes
css/{jquery-ui.structure.min.1616621048.css → jquery-ui.structure.min.1620658454.css} RENAMED
File without changes
css/{jquery-ui.theme.min.1616621048.css → jquery-ui.theme.min.1620658454.css} RENAMED
File without changes
css/{main.1616621048.css → main.1620658454.css} RENAMED
File without changes
css/{phpinfo.1616621048.css → phpinfo.1620658454.css} RENAMED
File without changes
css/{wf-adminbar.1616621048.css → wf-adminbar.1620658454.css} RENAMED
File without changes
css/{wf-colorbox.1616621048.css → wf-colorbox.1620658454.css} RENAMED
File without changes
css/{wf-font-awesome.1616621048.css → wf-font-awesome.1620658454.css} RENAMED
File without changes
css/{wf-global.1616621048.css → wf-global.1620658454.css} RENAMED
File without changes
css/{wf-ionicons.1616621048.css → wf-ionicons.1620658454.css} RENAMED
File without changes
css/{wf-onboarding.1616621048.css → wf-onboarding.1620658454.css} RENAMED
File without changes
css/{wf-roboto-font.1616621048.css → wf-roboto-font.1620658454.css} RENAMED
File without changes
css/{wfselect2.min.1616621048.css → wfselect2.min.1620658454.css} RENAMED
File without changes
css/{wordfenceBox.1616621048.css → wordfenceBox.1620658454.css} RENAMED
File without changes
js/{Chart.bundle.min.1616621048.js → Chart.bundle.min.1620658454.js} RENAMED
File without changes
js/{admin.1616621048.js → admin.1620658454.js} RENAMED
@@ -768,6 +768,18 @@
768
  }
769
  });
770
  },
 
 
 
 
 
 
 
 
 
 
 
 
771
  updateSwitch: function(elemID, configItem, cb) {
772
  var setting = jQuery('#' + elemID).is(':checked');
773
  this.updateConfig(configItem, jQuery('#' + elemID).is(':checked') ? 1 : 0, cb);
@@ -1729,16 +1741,18 @@
1729
  var issuesDOM = container.find('.wf-issue');
1730
  for (var i = 0; i < issuesDOM.length; i++) {
1731
  var sourceData = $(issuesDOM[i]).data('sourceData');
1732
- if (sourceData.data.canDelete) {
1733
- hasDeleteable = true;
1734
- }
1735
-
1736
- if (sourceData.data.canFix) {
1737
- hasRepairable = true;
1738
- }
1739
-
1740
- if (hasDeleteable && hasRepairable) {
1741
- break;
 
 
1742
  }
1743
  }
1744
 
@@ -1816,6 +1830,10 @@
1816
  data['action'] = action;
1817
  data['nonce'] = this.nonce;
1818
  }
 
 
 
 
1819
  if (!cbErr) {
1820
  cbErr = function() {
1821
  };
768
  }
769
  });
770
  },
771
+ sendTestActivityReport: function(email) {
772
+ var self = this;
773
+ this.ajax(
774
+ 'wordfence_email_summary_email_address_debug',
775
+ {email: email},
776
+ function(res) {
777
+ if (res.result) {
778
+ self.colorboxModalHTML((self.isSmallScreen ? '300px' : '400px'), ("Test Activity Report"), res.result);
779
+ }
780
+ }
781
+ );
782
+ },
783
  updateSwitch: function(elemID, configItem, cb) {
784
  var setting = jQuery('#' + elemID).is(':checked');
785
  this.updateConfig(configItem, jQuery('#' + elemID).is(':checked') ? 1 : 0, cb);
1741
  var issuesDOM = container.find('.wf-issue');
1742
  for (var i = 0; i < issuesDOM.length; i++) {
1743
  var sourceData = $(issuesDOM[i]).data('sourceData');
1744
+ if (sourceData) {
1745
+ if (sourceData.data.canDelete) {
1746
+ hasDeleteable = true;
1747
+ }
1748
+
1749
+ if (sourceData.data.canFix) {
1750
+ hasRepairable = true;
1751
+ }
1752
+
1753
+ if (hasDeleteable && hasRepairable) {
1754
+ break;
1755
+ }
1756
  }
1757
  }
1758
 
1830
  data['action'] = action;
1831
  data['nonce'] = this.nonce;
1832
  }
1833
+ if (!cb) {
1834
+ cb = function() {
1835
+ };
1836
+ }
1837
  if (!cbErr) {
1838
  cbErr = function() {
1839
  };
js/{admin.ajaxWatcher.1616621048.js → admin.ajaxWatcher.1620658454.js} RENAMED
File without changes
js/{admin.liveTraffic.1616621048.js → admin.liveTraffic.1620658454.js} RENAMED
File without changes
js/{date.1616621048.js → date.1620658454.js} RENAMED
File without changes
js/{jquery-ui-timepicker-addon.1616621048.js → jquery-ui-timepicker-addon.1620658454.js} RENAMED
File without changes
js/{jquery.colorbox-min.1616621048.js → jquery.colorbox-min.1620658454.js} RENAMED
File without changes
js/{jquery.colorbox.1616621048.js → jquery.colorbox.1620658454.js} RENAMED
File without changes
js/{jquery.dataTables.min.1616621048.js → jquery.dataTables.min.1620658454.js} RENAMED
File without changes
js/{jquery.qrcode.min.1616621048.js → jquery.qrcode.min.1620658454.js} RENAMED
File without changes
js/{jquery.tmpl.min.1616621048.js → jquery.tmpl.min.1620658454.js} RENAMED
File without changes
js/{jquery.tools.min.1616621048.js → jquery.tools.min.1620658454.js} RENAMED
File without changes
js/{knockout-3.3.0.1616621048.js → knockout-3.3.0.1620658454.js} RENAMED
File without changes
js/{wfdashboard.1616621048.js → wfdashboard.1620658454.js} RENAMED
File without changes
js/{wfdropdown.1616621048.js → wfdropdown.1620658454.js} RENAMED
File without changes
js/{wfglobal.1616621048.js → wfglobal.1620658454.js} RENAMED
File without changes
js/{wfi18n.1616621048.js → wfi18n.1620658454.js} RENAMED
File without changes
js/{wfpopover.1616621048.js → wfpopover.1620658454.js} RENAMED
File without changes
js/{wfselect2.min.1616621048.js → wfselect2.min.1620658454.js} RENAMED
File without changes
languages/wordfence.po CHANGED
@@ -2,14 +2,14 @@
2
  # This file is distributed under the same license as the Wordfence Security plugin.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Wordfence Security 7.5.0\n"
6
- "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2021-03-19T15:54:58+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.4.0\n"
15
  "X-Domain: wordfence\n"
@@ -57,7 +57,7 @@ msgstr ""
57
  #: lib/dashboard/widget_content_logins.php:7
58
  #: lib/dashboard/widget_ips.php:115
59
  #: lib/dashboard/widget_logins.php:96
60
- #: lib/wordfenceClass.php:6101
61
  #: views/reports/activity-report-email-inline.php:146
62
  #: views/reports/activity-report.php:16
63
  #: views/waf/option-whitelist.php:110
@@ -68,7 +68,7 @@ msgstr ""
68
 
69
  #: lib/dashboard/widget_content_logins.php:6
70
  #: lib/dashboard/widget_logins.php:95
71
- #: lib/wordfenceClass.php:6176
72
  #: views/reports/activity-report-email-inline.php:256
73
  #: views/reports/activity-report.php:106
74
  msgid "Username"
@@ -91,7 +91,7 @@ msgstr ""
91
 
92
  #: lib/dashboard/widget_countries.php:25
93
  #: lib/dashboard/widget_networkattacks.php:8
94
- #: lib/wfDiagnostic.php:779
95
  msgid "Wordfence Network"
96
  msgstr ""
97
 
@@ -133,7 +133,7 @@ msgstr ""
133
  #. translators: WordPress username.
134
  #: lib/dashboard/widget_ips.php:96
135
  #: lib/dashboard/widget_logins.php:77
136
- #: lib/wordfenceClass.php:6047
137
  msgid "An error occurred"
138
  msgstr ""
139
 
@@ -224,7 +224,7 @@ msgid "Last Updated: %s ago"
224
  msgstr ""
225
 
226
  #: lib/dashboard/widget_notifications.php:8
227
- #: lib/wordfenceClass.php:6641
228
  msgid "Notifications"
229
  msgstr ""
230
 
@@ -299,11 +299,11 @@ msgstr ""
299
  #: lib/menu_tools_diagnostic.php:981
300
  #: lib/menu_tools_twoFactor.php:235
301
  #: lib/menu_tools_twoFactor.php:273
302
- #: lib/wordfenceClass.php:7931
303
- #: lib/wordfenceClass.php:7975
304
- #: lib/wordfenceClass.php:8039
305
- #: lib/wordfenceClass.php:8099
306
- #: lib/wordfenceClass.php:8145
307
  #: views/blocking/block-list.php:501
308
  #: views/blocking/blocking-create.php:212
309
  #: views/dashboard/options-group-license.php:150
@@ -545,62 +545,62 @@ msgstr ""
545
  msgid "Update includes security-related fixes."
546
  msgstr ""
547
 
548
- #: lib/email_newIssues.php:124
549
  msgid "The malicious URL matched"
550
  msgstr ""
551
 
552
  #. translators: Number of scan results
553
- #: lib/email_newIssues.php:133
554
  msgid "%d existing issue was found again and is not shown."
555
  msgid_plural "%d existing issues were found again and are not shown."
556
  msgstr[0] ""
557
  msgstr[1] ""
558
 
559
  #. translators: Number of scan results
560
- #: lib/email_newIssues.php:136
561
  msgid "%d issue was omitted from this email due to length limits."
562
  msgid_plural "%d issues were omitted from this email due to length limits."
563
  msgstr[0] ""
564
  msgstr[1] ""
565
 
566
  #. translators: Number of scan results
567
- #: lib/email_newIssues.php:137
568
  msgid "View every issue:"
569
  msgstr ""
570
 
571
- #: lib/email_newIssues.php:146
572
  msgid "NOTE: You are using the free version of Wordfence. Upgrade today:"
573
  msgstr ""
574
 
575
- #: lib/email_newIssues.php:149
576
  msgid "Receive real-time Firewall and Scan engine rule updates for protection as threats emerge"
577
  msgstr ""
578
 
579
- #: lib/email_newIssues.php:150
580
  msgid "Real-time IP Blocklist blocks the most malicious IPs from accessing your site"
581
  msgstr ""
582
 
583
- #: lib/email_newIssues.php:151
584
  msgid "Country blocking"
585
  msgstr ""
586
 
587
- #: lib/email_newIssues.php:152
588
  msgid "IP reputation monitoring"
589
  msgstr ""
590
 
591
- #: lib/email_newIssues.php:153
592
  msgid "Schedule scans to run more frequently and at optimal times"
593
  msgstr ""
594
 
595
- #: lib/email_newIssues.php:154
596
  msgid "Access to Premium Support"
597
  msgstr ""
598
 
599
- #: lib/email_newIssues.php:155
600
  msgid "Discounts for multi-year and multi-license purchases"
601
  msgstr ""
602
 
603
- #: lib/email_newIssues.php:158
604
  msgid "Click here to upgrade to Wordfence Premium:"
605
  msgstr ""
606
 
@@ -717,7 +717,7 @@ msgid "Wordfence Live Activity:"
717
  msgstr ""
718
 
719
  #: lib/menu_dashboard.php:24
720
- #: lib/wordfenceClass.php:6543
721
  msgid "Wordfence Dashboard"
722
  msgstr ""
723
 
@@ -729,7 +729,7 @@ msgstr ""
729
  #: lib/menu_dashboard_options.php:98
730
  #: lib/menu_firewall.php:20
731
  #: lib/menu_firewall.php:30
732
- #: lib/wordfenceClass.php:6547
733
  #: models/page/wfPage.php:105
734
  msgid "Firewall"
735
  msgstr ""
@@ -766,7 +766,7 @@ msgstr ""
766
  #: lib/menu_dashboard_options.php:115
767
  #: lib/menu_scanner.php:31
768
  #: lib/menu_scanner.php:305
769
- #: lib/wordfenceClass.php:6554
770
  #: models/page/wfPage.php:113
771
  msgid "Scan"
772
  msgstr ""
@@ -930,7 +930,7 @@ msgid "Wordfence Premium Enabled"
930
  msgstr ""
931
 
932
  #: lib/menu_dashboard.php:220
933
- #: lib/wordfenceClass.php:6558
934
  msgid "Tools"
935
  msgstr ""
936
 
@@ -942,7 +942,7 @@ msgstr ""
942
  #: lib/menu_firewall_waf.php:157
943
  #: lib/menu_scanner.php:139
944
  #: lib/menu_support.php:19
945
- #: lib/wordfenceClass.php:6571
946
  msgid "Help"
947
  msgstr ""
948
 
@@ -1160,7 +1160,7 @@ msgstr ""
1160
  #: lib/menu_firewall.php:41
1161
  #: lib/menu_firewall_blocking.php:119
1162
  #: lib/menu_firewall_waf.php:142
1163
- #: lib/wordfenceClass.php:6549
1164
  #: models/page/wfPage.php:109
1165
  msgid "Blocking"
1166
  msgstr ""
@@ -1348,7 +1348,7 @@ msgstr ""
1348
  #: lib/menu_tools_diagnostic.php:300
1349
  #: lib/menu_tools_diagnostic.php:301
1350
  #: lib/menu_tools_diagnostic.php:304
1351
- #: lib/wordfenceClass.php:6073
1352
  #: models/firewall/wfFirewall.php:41
1353
  #: views/diagnostics/text.php:154
1354
  #: views/diagnostics/text.php:159
@@ -1469,7 +1469,7 @@ msgstr ""
1469
 
1470
  #: lib/menu_options.php:24
1471
  #: lib/menu_options.php:262
1472
- #: lib/wordfenceClass.php:6566
1473
  msgid "All Options"
1474
  msgstr ""
1475
 
@@ -2108,7 +2108,7 @@ msgid "Signature updates delayed by 30 days"
2108
  msgstr ""
2109
 
2110
  #: lib/menu_scanner.php:80
2111
- #: lib/wordfenceClass.php:6582
2112
  msgid "Protect More Sites"
2113
  msgstr ""
2114
 
@@ -2191,20 +2191,20 @@ msgstr ""
2191
  #: lib/menu_tools_twoFactor.php:255
2192
  #: lib/menu_tools_twoFactor.php:264
2193
  #: lib/menu_tools_twoFactor.php:284
2194
- #: lib/wordfenceClass.php:4923
2195
- #: lib/wordfenceClass.php:4929
2196
- #: lib/wordfenceClass.php:4935
2197
- #: lib/wordfenceClass.php:4942
2198
- #: lib/wordfenceClass.php:4948
2199
- #: lib/wordfenceClass.php:4955
2200
- #: lib/wordfenceClass.php:4963
2201
- #: lib/wordfenceClass.php:6015
2202
- #: lib/wordfenceClass.php:6017
2203
- #: lib/wordfenceClass.php:6068
2204
- #: lib/wordfenceClass.php:7956
2205
- #: lib/wordfenceClass.php:7963
2206
- #: lib/wordfenceClass.php:8070
2207
- #: lib/wordfenceClass.php:8134
2208
  #: views/dashboard/options-group-import.php:147
2209
  #: views/dashboard/options-group-import.php:157
2210
  #: views/dashboard/options-group-import.php:177
@@ -2460,7 +2460,7 @@ msgstr ""
2460
  #: lib/menu_tools_diagnostic.php:318
2461
  #: lib/menu_tools_diagnostic.php:319
2462
  #: lib/menu_tools_diagnostic.php:329
2463
- #: lib/wfDiagnostic.php:363
2464
  #: views/diagnostics/text.php:86
2465
  #: views/diagnostics/text.php:127
2466
  #: views/diagnostics/text.php:128
@@ -2524,8 +2524,8 @@ msgstr ""
2524
  #: lib/menu_tools_diagnostic.php:319
2525
  #: lib/menu_tools_diagnostic.php:323
2526
  #: lib/menu_tools_livetraffic.php:152
2527
- #: lib/wfDiagnostic.php:357
2528
- #: lib/wfDiagnostic.php:375
2529
  #: views/diagnostics/text.php:124
2530
  #: views/diagnostics/text.php:135
2531
  #: views/diagnostics/text.php:137
@@ -2565,8 +2565,8 @@ msgstr ""
2565
  #: lib/menu_tools_diagnostic.php:319
2566
  #: lib/menu_tools_diagnostic.php:323
2567
  #: lib/menu_tools_livetraffic.php:153
2568
- #: lib/wfDiagnostic.php:357
2569
- #: lib/wfDiagnostic.php:375
2570
  #: views/diagnostics/text.php:124
2571
  #: views/diagnostics/text.php:151
2572
  #: views/diagnostics/text.php:164
@@ -2601,7 +2601,7 @@ msgstr ""
2601
  #: lib/menu_tools_diagnostic.php:267
2602
  #: lib/menu_tools_diagnostic.php:270
2603
  #: lib/menu_tools_diagnostic.php:271
2604
- #: lib/wfDiagnostic.php:576
2605
  #: views/diagnostics/text.php:126
2606
  #: views/diagnostics/text.php:129
2607
  #: views/diagnostics/text.php:130
@@ -2613,7 +2613,7 @@ msgstr ""
2613
  #: lib/menu_tools_diagnostic.php:267
2614
  #: lib/menu_tools_diagnostic.php:270
2615
  #: lib/menu_tools_diagnostic.php:271
2616
- #: lib/wfDiagnostic.php:576
2617
  #: views/diagnostics/text.php:126
2618
  #: views/diagnostics/text.php:129
2619
  #: views/diagnostics/text.php:130
@@ -2746,8 +2746,9 @@ msgstr ""
2746
 
2747
  #: lib/menu_tools_diagnostic.php:285
2748
  #: lib/menu_tools_diagnostic.php:312
2749
- #: lib/wfDiagnostic.php:202
2750
- #: lib/wfDiagnostic.php:411
 
2751
  #: views/diagnostics/text.php:144
2752
  #: views/diagnostics/text.php:171
2753
  #: views/scanner/issue-base.php:116
@@ -2856,7 +2857,7 @@ msgid "Interval the trash is automatically emptied at in days"
2856
  msgstr ""
2857
 
2858
  #: lib/menu_tools_diagnostic.php:303
2859
- #: lib/wordfenceClass.php:4242
2860
  #: views/diagnostics/text.php:162
2861
  msgid "Never"
2862
  msgstr ""
@@ -3143,7 +3144,7 @@ msgstr ""
3143
 
3144
  #: lib/menu_tools_diagnostic.php:731
3145
  #: lib/menu_tools_diagnostic.php:770
3146
- #: lib/wordfenceClass.php:6076
3147
  msgid "Download"
3148
  msgstr ""
3149
 
@@ -3173,7 +3174,7 @@ msgid "New Issues (%d total)"
3173
  msgstr ""
3174
 
3175
  #: lib/menu_tools_diagnostic.php:810
3176
- #: lib/wordfenceClass.php:3947
3177
  #: views/diagnostics/text.php:584
3178
  msgid "No New Issues"
3179
  msgstr ""
@@ -3243,17 +3244,17 @@ msgid "Enable beta threat defense feed"
3243
  msgstr ""
3244
 
3245
  #: lib/menu_tools_diagnostic.php:960
3246
- #: lib/wordfenceClass.php:6137
3247
  msgid "Restore Defaults"
3248
  msgstr ""
3249
 
3250
  #: lib/menu_tools_diagnostic.php:961
3251
- #: lib/wordfenceClass.php:6062
3252
  msgid "Cancel Changes"
3253
  msgstr ""
3254
 
3255
  #: lib/menu_tools_diagnostic.php:962
3256
- #: lib/wordfenceClass.php:6140
3257
  msgid "Save Changes"
3258
  msgstr ""
3259
 
@@ -3286,7 +3287,7 @@ msgstr ""
3286
  #: lib/menu_tools_livetraffic.php:41
3287
  #: lib/menu_tools_livetraffic.php:571
3288
  #: lib/menu_tools_livetraffic.php:602
3289
- #: lib/wordfenceClass.php:6560
3290
  #: models/page/wfPage.php:119
3291
  msgid "Live Traffic"
3292
  msgstr ""
@@ -3333,14 +3334,14 @@ msgstr ""
3333
  #: lib/menu_tools_livetraffic.php:100
3334
  #: lib/menu_tools_livetraffic.php:227
3335
  #: lib/menu_tools_livetraffic.php:458
3336
- #: lib/wordfenceClass.php:6099
3337
  msgid "Human"
3338
  msgstr ""
3339
 
3340
  #: lib/menu_tools_livetraffic.php:101
3341
  #: lib/menu_tools_livetraffic.php:228
3342
  #: lib/menu_tools_livetraffic.php:458
3343
- #: lib/wordfenceClass.php:6061
3344
  msgid "Bot"
3345
  msgstr ""
3346
 
@@ -3349,8 +3350,8 @@ msgid "Warning"
3349
  msgstr ""
3350
 
3351
  #: lib/menu_tools_livetraffic.php:103
3352
- #: lib/wfDiagnostic.php:746
3353
- #: lib/wordfenceClass.php:6053
3354
  msgid "Blocked"
3355
  msgstr ""
3356
 
@@ -3443,7 +3444,7 @@ msgid "%s hits"
3443
  msgstr ""
3444
 
3445
  #: lib/menu_tools_livetraffic.php:286
3446
- #: lib/wordfenceClass.php:6168
3447
  msgid "Type"
3448
  msgstr ""
3449
 
@@ -3466,7 +3467,7 @@ msgid "IP Address"
3466
  msgstr ""
3467
 
3468
  #: lib/menu_tools_livetraffic.php:291
3469
- #: lib/wordfenceClass.php:4224
3470
  #: views/blocking/blocking-create.php:193
3471
  msgid "Hostname"
3472
  msgstr ""
@@ -3833,22 +3834,22 @@ msgid "How to block a network"
3833
  msgstr ""
3834
 
3835
  #: lib/menu_tools_whois.php:95
3836
- #: lib/wordfenceClass.php:6081
3837
  msgid "Enter a valid IP or domain"
3838
  msgstr ""
3839
 
3840
  #: lib/menu_tools_whois.php:95
3841
- #: lib/wordfenceClass.php:6124
3842
  msgid "Please enter a valid IP address or domain name for your whois lookup."
3843
  msgstr ""
3844
 
3845
  #: lib/menu_tools_whois.php:99
3846
- #: lib/wordfenceClass.php:6105
3847
  msgid "Loading..."
3848
  msgstr ""
3849
 
3850
  #: lib/menu_tools_whois.php:104
3851
- #: lib/wordfenceClass.php:6111
3852
  msgid "Look up IP or Domain"
3853
  msgstr ""
3854
 
@@ -3878,7 +3879,7 @@ msgstr ""
3878
 
3879
  #: lib/menu_wordfence_central.php:44
3880
  #: lib/menu_wordfence_central.php:57
3881
- #: lib/wordfenceClass.php:6576
3882
  msgid "Wordfence Central"
3883
  msgstr ""
3884
 
@@ -3961,20 +3962,20 @@ msgstr ""
3961
  #. translators: Error message.
3962
  #: lib/rest-api/wfRESTConfigController.php:215
3963
  #: lib/rest-api/wfRESTConfigController.php:258
3964
- #: lib/wordfenceClass.php:4508
3965
  msgid "An error occurred while saving the configuration: %s"
3966
  msgstr ""
3967
 
3968
  #. translators: Error message.
3969
  #: lib/rest-api/wfRESTConfigController.php:226
3970
  #: lib/rest-api/wfRESTConfigController.php:269
3971
- #: lib/wordfenceClass.php:4517
3972
  msgid "Errors occurred while saving the configuration: %s"
3973
  msgstr ""
3974
 
3975
  #: lib/rest-api/wfRESTConfigController.php:231
3976
  #: lib/rest-api/wfRESTConfigController.php:274
3977
- #: lib/wordfenceClass.php:4522
3978
  msgid "Errors occurred while saving the configuration."
3979
  msgstr ""
3980
 
@@ -4092,50 +4093,50 @@ msgid "Wordfence activity for %1$s on %2$s"
4092
  msgstr ""
4093
 
4094
  #: lib/wfActivityReport.php:584
4095
- #: lib/wordfenceClass.php:8298
4096
  msgid "Blocked because the IP is blocklisted"
4097
  msgstr ""
4098
 
4099
  #. translators: Reason for firewall action.
4100
  #: lib/wfActivityReport.php:587
4101
- #: lib/wordfenceClass.php:8301
4102
  msgid "Blocked for %s"
4103
  msgstr ""
4104
 
4105
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4106
  #: lib/wfActivityReport.php:599
4107
- #: lib/wordfenceClass.php:8315
4108
  msgid "Blocked for %1$s in query string: %2$s = %3$s"
4109
  msgstr ""
4110
 
4111
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4112
  #: lib/wfActivityReport.php:602
4113
- #: lib/wordfenceClass.php:8320
4114
  msgid "Blocked for %1$s in POST body: %2$s = %3$s"
4115
  msgstr ""
4116
 
4117
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4118
  #: lib/wfActivityReport.php:605
4119
- #: lib/wordfenceClass.php:8325
4120
  msgid "Blocked for %1$s in cookie: %2$s = %3$s"
4121
  msgstr ""
4122
 
4123
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4124
  #: lib/wfActivityReport.php:608
4125
- #: lib/wordfenceClass.php:8330
4126
  msgid "Blocked for %1$s in file: %2$s = %3$s"
4127
  msgstr ""
4128
 
4129
  #: lib/wfActivityReport.php:752
4130
- #: lib/wfDiagnostic.php:478
4131
  #: models/block/wfBlock.php:95
4132
  msgid "Unknown"
4133
  msgstr ""
4134
 
4135
  #: lib/wfAdminNoticeQueue.php:180
4136
- #: lib/wordfenceClass.php:6074
4137
- #: lib/wordfenceClass.php:6326
4138
- #: lib/wordfenceClass.php:8819
4139
  msgid "Dismiss"
4140
  msgstr ""
4141
 
@@ -5362,7 +5363,7 @@ msgid "Unable to remove code execution protections applied to the .htaccess file
5362
  msgstr ""
5363
 
5364
  #: lib/wfConfig.php:1174
5365
- #: lib/wordfenceClass.php:7419
5366
  msgid "The grace period end time must be in the future."
5367
  msgstr ""
5368
 
@@ -5400,7 +5401,7 @@ msgid "An empty license key was entered."
5400
  msgstr ""
5401
 
5402
  #: lib/wfConfig.php:1300
5403
- #: lib/wordfenceClass.php:4393
5404
  msgid "The license key entered is not in a valid format. It must contain only numbers and the letters A-F."
5405
  msgstr ""
5406
 
@@ -5494,264 +5495,268 @@ msgid "WAF auto prepend active"
5494
  msgstr ""
5495
 
5496
  #: lib/wfDiagnostic.php:85
5497
- msgid "WAF storage engine (WFWAF_STORAGE_ENGINE)"
5498
  msgstr ""
5499
 
5500
  #: lib/wfDiagnostic.php:86
5501
- msgid "WAF log path"
5502
  msgstr ""
5503
 
5504
  #: lib/wfDiagnostic.php:87
5505
- msgid "WAF subdirectory installation"
5506
  msgstr ""
5507
 
5508
  #: lib/wfDiagnostic.php:88
5509
- msgid "wordfence-waf.php path"
5510
  msgstr ""
5511
 
5512
  #: lib/wfDiagnostic.php:89
5513
- msgid "WAF File Permissions"
5514
  msgstr ""
5515
 
5516
  #: lib/wfDiagnostic.php:90
 
 
 
 
5517
  msgid "Recently removed wflogs files"
5518
  msgstr ""
5519
 
5520
- #: lib/wfDiagnostic.php:94
5521
  msgid "Database version and privileges."
5522
  msgstr ""
5523
 
5524
- #: lib/wfDiagnostic.php:96
5525
  msgid "Database Version"
5526
  msgstr ""
5527
 
5528
- #: lib/wfDiagnostic.php:97
5529
  msgid "Checking if MySQL user has <code>DELETE</code> privilege"
5530
  msgstr ""
5531
 
5532
- #: lib/wfDiagnostic.php:98
5533
  msgid "Checking if MySQL user has <code>INSERT</code> privilege"
5534
  msgstr ""
5535
 
5536
- #: lib/wfDiagnostic.php:99
5537
  msgid "Checking if MySQL user has <code>UPDATE</code> privilege"
5538
  msgstr ""
5539
 
5540
- #: lib/wfDiagnostic.php:100
5541
  msgid "Checking if MySQL user has <code>SELECT</code> privilege"
5542
  msgstr ""
5543
 
5544
- #: lib/wfDiagnostic.php:101
5545
  msgid "Checking if MySQL user has <code>CREATE TABLE</code> privilege"
5546
  msgstr ""
5547
 
5548
- #: lib/wfDiagnostic.php:102
5549
  msgid "Checking if MySQL user has <code>ALTER TABLE</code> privilege"
5550
  msgstr ""
5551
 
5552
- #: lib/wfDiagnostic.php:103
5553
  msgid "Checking if MySQL user has <code>DROP</code> privilege"
5554
  msgstr ""
5555
 
5556
- #: lib/wfDiagnostic.php:104
5557
  msgid "Checking if MySQL user has <code>TRUNCATE</code> privilege"
5558
  msgstr ""
5559
 
5560
- #: lib/wfDiagnostic.php:108
5561
  msgid "PHP version, important PHP extensions."
5562
  msgstr ""
5563
 
5564
  #. translators: Support URL.
5565
- #: lib/wfDiagnostic.php:110
5566
  msgid "PHP version >= PHP 5.6.20<br><em> (<a href=\"https://wordpress.org/about/requirements/\" target=\"_blank\" rel=\"noopener noreferrer\">Minimum version required by WordPress</a>)</em> <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"wfhelp\"></a>"
5567
  msgstr ""
5568
 
5569
  #. translators: Support URL.
5570
- #: lib/wfDiagnostic.php:111
5571
  msgid "Process Owner"
5572
  msgstr ""
5573
 
5574
- #: lib/wfDiagnostic.php:112
5575
  msgid "Checking for OpenSSL support"
5576
  msgstr ""
5577
 
5578
- #: lib/wfDiagnostic.php:113
5579
  msgid "Checking OpenSSL version"
5580
  msgstr ""
5581
 
5582
- #: lib/wfDiagnostic.php:114
5583
  msgid "Checking for cURL support"
5584
  msgstr ""
5585
 
5586
- #: lib/wfDiagnostic.php:115
5587
  msgid "cURL Features Code"
5588
  msgstr ""
5589
 
5590
- #: lib/wfDiagnostic.php:116
5591
  msgid "cURL Host"
5592
  msgstr ""
5593
 
5594
- #: lib/wfDiagnostic.php:117
5595
  msgid "cURL Support Protocols"
5596
  msgstr ""
5597
 
5598
- #: lib/wfDiagnostic.php:118
5599
  msgid "cURL SSL Version"
5600
  msgstr ""
5601
 
5602
- #: lib/wfDiagnostic.php:119
5603
  msgid "cURL libz Version"
5604
  msgstr ""
5605
 
5606
- #: lib/wfDiagnostic.php:120
5607
  msgid "Checking <code>display_errors</code><br><em> (<a href=\"http://php.net/manual/en/errorfunc.configuration.php#ini.display-errors\" target=\"_blank\" rel=\"noopener noreferrer\">Should be disabled on production servers</a>)</em>"
5608
  msgstr ""
5609
 
5610
- #: lib/wfDiagnostic.php:124
5611
  msgid "Ability to connect to the Wordfence servers and your own site."
5612
  msgstr ""
5613
 
5614
- #: lib/wfDiagnostic.php:126
5615
  msgid "Connecting to Wordfence servers (http)"
5616
  msgstr ""
5617
 
5618
- #: lib/wfDiagnostic.php:127
5619
  msgid "Connecting to Wordfence servers (https)"
5620
  msgstr ""
5621
 
5622
- #: lib/wfDiagnostic.php:128
5623
  msgid "Connecting back to this site"
5624
  msgstr ""
5625
 
5626
- #: lib/wfDiagnostic.php:129
5627
  msgid "IP(s) used by this server"
5628
  msgstr ""
5629
 
5630
- #: lib/wfDiagnostic.php:133
5631
  msgid "Server time accuracy and applied offsets."
5632
  msgstr ""
5633
 
5634
- #: lib/wfDiagnostic.php:135
5635
  msgid "Wordfence Network Time"
5636
  msgstr ""
5637
 
5638
- #: lib/wfDiagnostic.php:136
5639
- #: lib/wfDiagnostic.php:786
5640
  msgid "Server Time"
5641
  msgstr ""
5642
 
5643
- #: lib/wfDiagnostic.php:137
5644
  msgid "Wordfence Network Time Offset"
5645
  msgstr ""
5646
 
5647
- #: lib/wfDiagnostic.php:138
5648
  msgid "NTP Time Offset"
5649
  msgstr ""
5650
 
5651
- #: lib/wfDiagnostic.php:139
5652
  msgid "TOTP Time Source"
5653
  msgstr ""
5654
 
5655
- #: lib/wfDiagnostic.php:140
5656
  msgid "WordPress Time Zone"
5657
  msgstr ""
5658
 
5659
  #. translators: Number of jobs.
5660
- #: lib/wfDiagnostic.php:197
5661
  msgid "%d Job Overdue"
5662
  msgid_plural "%d Jobs Overdue"
5663
  msgstr[0] ""
5664
  msgstr[1] ""
5665
 
5666
  #. translators: Number of jobs.
5667
- #: lib/wfDiagnostic.php:197
5668
  msgid "Normal"
5669
  msgstr ""
5670
 
5671
- #: lib/wfDiagnostic.php:216
5672
- #: lib/wfDiagnostic.php:219
5673
  msgid "No files readable"
5674
  msgstr ""
5675
 
5676
  #. translators: File name.
5677
- #: lib/wfDiagnostic.php:231
5678
- #: lib/wfDiagnostic.php:267
5679
  msgid "File \"%s\" does not exist"
5680
  msgstr ""
5681
 
5682
  #. translators: File path.
5683
- #: lib/wfDiagnostic.php:234
5684
  msgid "File \"%s\" is unreadable"
5685
  msgstr ""
5686
 
5687
- #: lib/wfDiagnostic.php:252
5688
- #: lib/wfDiagnostic.php:255
5689
  msgid "No files writable"
5690
  msgstr ""
5691
 
5692
  #. translators: File name.
5693
- #: lib/wfDiagnostic.php:270
5694
  msgid "File \"%s\" is unwritable"
5695
  msgstr ""
5696
 
5697
- #: lib/wfDiagnostic.php:340
5698
  msgid "Basic config writing"
5699
  msgstr ""
5700
 
5701
- #: lib/wfDiagnostic.php:352
5702
  msgid "Serialized config writing"
5703
  msgstr ""
5704
 
5705
- #: lib/wfDiagnostic.php:360
5706
  msgid "(default)"
5707
  msgstr ""
5708
 
5709
  #. translators: Unix file permissions in octal (example 0777).
5710
- #: lib/wfDiagnostic.php:388
5711
  msgid "%s - using constant"
5712
  msgstr ""
5713
 
5714
  #. translators: Unix file permissions in octal (example 0777).
5715
- #: lib/wfDiagnostic.php:401
5716
  msgid "%s - using template"
5717
  msgstr ""
5718
 
5719
- #: lib/wfDiagnostic.php:405
5720
  msgid "0660 - using default"
5721
  msgstr ""
5722
 
5723
- #: lib/wfDiagnostic.php:439
5724
  msgid "Unavailable"
5725
  msgstr ""
5726
 
5727
- #: lib/wfDiagnostic.php:607
5728
- #: lib/wfDiagnostic.php:610
5729
  msgid "wp_remote_post() test to noc1.wordfence.com failed! Response was: "
5730
  msgstr ""
5731
 
5732
- #: lib/wfDiagnostic.php:611
5733
  msgid "This likely means that your hosting provider is blocking requests to noc1.wordfence.com or has set up a proxy that is not behaving itself."
5734
  msgstr ""
5735
 
5736
- #: lib/wfDiagnostic.php:644
5737
- #: lib/wfDiagnostic.php:647
5738
  msgid "wp_remote_post() test back to this server failed! Response was: "
5739
  msgstr ""
5740
 
5741
- #: lib/wfDiagnostic.php:648
5742
  msgid "This additional info may help you diagnose the issue. The response headers we received were:"
5743
  msgstr ""
5744
 
5745
  #. translators: PHP super global key.
5746
- #: lib/wfDiagnostic.php:677
5747
  msgid "We cannot read $_SERVER[%s]"
5748
  msgstr ""
5749
 
5750
- #: lib/wfDiagnostic.php:689
5751
  msgid "Should be: "
5752
  msgstr ""
5753
 
5754
- #: lib/wfDiagnostic.php:772
5755
  msgid "NTP"
5756
  msgstr ""
5757
 
@@ -5866,7 +5871,7 @@ msgid "Access from your area has been temporarily limited for security reasons"
5866
  msgstr ""
5867
 
5868
  #: lib/wfLog.php:615
5869
- #: lib/wordfenceClass.php:6112
5870
  #: waf/wfWAFIPBlocksController.php:97
5871
  msgid "Manual block by administrator"
5872
  msgstr ""
@@ -6198,22 +6203,22 @@ msgid "Wordfence was unable to validate a test request to your website. This can
6198
  msgstr ""
6199
 
6200
  #: lib/wfScanEngine.php:707
6201
- #: lib/wordfenceClass.php:6303
6202
  msgid "For maximum security use PHP's built in REMOTE_ADDR."
6203
  msgstr ""
6204
 
6205
  #: lib/wfScanEngine.php:709
6206
- #: lib/wordfenceClass.php:6306
6207
  msgid "This site appears to be behind a front-end proxy, so using the X-Forwarded-For HTTP header will resolve to the correct IPs."
6208
  msgstr ""
6209
 
6210
  #: lib/wfScanEngine.php:711
6211
- #: lib/wordfenceClass.php:6309
6212
  msgid "This site appears to be behind a front-end proxy, so using the X-Real-IP HTTP header will resolve to the correct IPs."
6213
  msgstr ""
6214
 
6215
  #: lib/wfScanEngine.php:713
6216
- #: lib/wordfenceClass.php:6312
6217
  msgid "This site appears to be behind Cloudflare, so using the Cloudflare \"CF-Connecting-IP\" HTTP header will resolve to the correct IPs."
6218
  msgstr ""
6219
 
@@ -6347,8 +6352,8 @@ msgstr ""
6347
 
6348
  #. translators: Scan result description.
6349
  #: lib/wfScanEngine.php:1088
6350
- #: lib/wfScanEngine.php:2252
6351
- #: lib/wfScanEngine.php:2294
6352
  msgid "Adding issue: %s"
6353
  msgstr ""
6354
 
@@ -6393,7 +6398,7 @@ msgid "Examining URLs found in posts we scanned for dangerous websites"
6393
  msgstr ""
6394
 
6395
  #: lib/wfScanEngine.php:1233
6396
- #: lib/wfScanEngine.php:2215
6397
  msgid "Done examining URLs"
6398
  msgstr ""
6399
 
@@ -6629,202 +6634,202 @@ msgid "The Theme \"%1$s\" needs an upgrade (%2$s -> %3$s)."
6629
  msgstr ""
6630
 
6631
  #. translators: 1. Plugin name. 2. Software version. 3. Software version.
6632
- #: lib/wfScanEngine.php:1991
6633
  msgid "The Plugin \"%1$s\" appears to be abandoned (updated %2$s, tested to WP %3$s)."
6634
  msgstr ""
6635
 
6636
  #. translators: 1. Plugin name. 2. Software version.
6637
- #: lib/wfScanEngine.php:1998
6638
  msgid "It was last updated %1$s ago and tested up to WordPress %2$s."
6639
  msgstr ""
6640
 
6641
  #. translators: 1. Plugin name. 2. Software version.
6642
- #: lib/wfScanEngine.php:2005
6643
  msgid "The Plugin \"%1$s\" appears to be abandoned (updated %2$s)."
6644
  msgstr ""
6645
 
6646
  #. translators: Time duration.
6647
- #: lib/wfScanEngine.php:2011
6648
  msgid "It was last updated %s ago."
6649
  msgstr ""
6650
 
6651
- #: lib/wfScanEngine.php:2017
6652
- #: lib/wfScanEngine.php:2056
6653
  msgid "It has unpatched security issues and may have compatibility problems with the current version of WordPress."
6654
  msgstr ""
6655
 
6656
- #: lib/wfScanEngine.php:2019
6657
- #: lib/wfScanEngine.php:2058
6658
  msgid "Plugins can be removed from wordpress.org for various reasons. This can include benign issues like a plugin author discontinuing development or moving the plugin distribution to their own site, but some might also be due to security issues. In any case, future updates may or may not be available, so it is worth investigating the cause and deciding whether to temporarily or permanently replace or remove the plugin."
6659
  msgstr ""
6660
 
6661
  #. translators: Support URL.
6662
- #: lib/wfScanEngine.php:2023
6663
- #: lib/wfScanEngine.php:2062
6664
- #: lib/wfScanEngine.php:2250
6665
- #: lib/wfScanEngine.php:2292
6666
  msgid "<a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Get more information.</a>"
6667
  msgstr ""
6668
 
6669
  #. translators: Plugin name.
6670
- #: lib/wfScanEngine.php:2054
6671
  msgid "The Plugin \"%s\" has been removed from wordpress.org."
6672
  msgstr ""
6673
 
6674
- #: lib/wfScanEngine.php:2107
6675
  msgid "Scanning for admin users not created through WordPress"
6676
  msgstr ""
6677
 
6678
  #. translators: WordPress username.
6679
- #: lib/wfScanEngine.php:2129
6680
  msgid "An admin user with the username %s was created outside of WordPress."
6681
  msgstr ""
6682
 
6683
  #. translators: WordPress username.
6684
- #: lib/wfScanEngine.php:2130
6685
  msgid "An admin user with the username %s was created outside of WordPress. It's possible a plugin could have created the account, but if you do not recognize the user, we suggest you remove it."
6686
  msgstr ""
6687
 
6688
  #. translators: WordPress username.
6689
- #: lib/wfScanEngine.php:2156
6690
  msgid "An admin user with a suspicious username %s was found."
6691
  msgstr ""
6692
 
6693
  #. translators: WordPress username.
6694
- #: lib/wfScanEngine.php:2157
6695
  msgid "An admin user with a suspicious username %s was found. Administrators accounts with usernames similar to this are commonly seen created by hackers. It's possible a plugin could have created the account, but if you do not recognize the user, we suggest you remove it."
6696
  msgstr ""
6697
 
6698
- #: lib/wfScanEngine.php:2178
6699
  msgid "Scanning for suspicious site options"
6700
  msgstr ""
6701
 
6702
- #: lib/wfScanEngine.php:2213
6703
  msgid "Examining URLs found in the options we scanned for dangerous websites"
6704
  msgstr ""
6705
 
6706
  #. translators: URL.
6707
- #: lib/wfScanEngine.php:2237
6708
- #: lib/wfScanEngine.php:2243
6709
  msgid "Option contains a suspected malware URL: %s"
6710
  msgstr ""
6711
 
6712
  #. translators: URL.
6713
- #: lib/wfScanEngine.php:2238
6714
  msgid "This option contains a suspected malware URL listed on Google's list of malware sites. It may indicate your site is infected with malware. The URL is: %s"
6715
  msgstr ""
6716
 
6717
  #. translators: URL.
6718
- #: lib/wfScanEngine.php:2240
6719
  msgid "Option contains a suspected phishing site URL: %s"
6720
  msgstr ""
6721
 
6722
  #. translators: URL.
6723
- #: lib/wfScanEngine.php:2241
6724
  msgid "This option contains a URL that is a suspected phishing site that is currently listed on Google's list of known phishing sites. It may indicate your site is infected with malware. The URL is: %s"
6725
  msgstr ""
6726
 
6727
  #. translators: URL.
6728
- #: lib/wfScanEngine.php:2244
6729
  msgid "This option contains a URL that is currently listed on Wordfence's domain blocklist. It may indicate your site is infected with malware. The URL is: %s"
6730
  msgstr ""
6731
 
6732
- #: lib/wfScanEngine.php:2284
6733
  msgid "Checking for future GeoIP support"
6734
  msgstr ""
6735
 
6736
- #: lib/wfScanEngine.php:2289
6737
  msgid "PHP Update Needed for Country Blocking"
6738
  msgstr ""
6739
 
6740
  #. translators: Software version.
6741
- #: lib/wfScanEngine.php:2290
6742
  msgid "The GeoIP database that is required for country blocking has been updated to a new format. This new format requires sites to run PHP 5.4 or newer, and this site is on PHP %s. To ensure country blocking continues functioning, please update PHP."
6743
  msgstr ""
6744
 
6745
- #: lib/wfScanEngine.php:2339
6746
  msgid "Previous scan was stopped successfully."
6747
  msgstr ""
6748
 
6749
- #: lib/wfScanEngine.php:2340
6750
  msgid "Scan was stopped on administrator request."
6751
  msgstr ""
6752
 
6753
- #: lib/wfScanEngine.php:2356
6754
  msgid "Entering start scan routine"
6755
  msgstr ""
6756
 
6757
- #: lib/wfScanEngine.php:2359
6758
  msgid "A scan is already running. Use the stop scan button if you would like to terminate the current scan."
6759
  msgstr ""
6760
 
6761
  #. translators: Support URL.
6762
- #: lib/wfScanEngine.php:2377
6763
  msgid "Test result of scan start URL fetch: %s"
6764
  msgstr ""
6765
 
6766
  #. translators: WordPress admin panel URL.
6767
- #: lib/wfScanEngine.php:2386
6768
  msgid "Starting cron with normal ajax at URL %s"
6769
  msgstr ""
6770
 
6771
  #. translators: Error message.
6772
  #. translators: WordPress admin panel URL.
6773
- #: lib/wfScanEngine.php:2408
6774
- #: lib/wfScanEngine.php:2443
6775
  msgid "There was an error starting the scan: %s."
6776
  msgstr ""
6777
 
6778
- #: lib/wfScanEngine.php:2410
6779
- #: lib/wfScanEngine.php:2445
6780
  msgid "There was an unknown error starting the scan."
6781
  msgstr ""
6782
 
6783
- #: lib/wfScanEngine.php:2417
6784
- #: lib/wfScanEngine.php:2451
6785
  msgid "Scan process ended after forking."
6786
  msgstr ""
6787
 
6788
  #. translators: WordPress admin panel URL.
6789
- #: lib/wfScanEngine.php:2421
6790
  msgid "Starting cron via proxy at URL %s"
6791
  msgstr ""
6792
 
6793
  #. translators: Time in seconds.
6794
- #: lib/wfScanEngine.php:2497
6795
  msgid "Got value from wf config maxExecutionTime: %s"
6796
  msgstr ""
6797
 
6798
  #. translators: Time in seconds.
6799
- #: lib/wfScanEngine.php:2501
6800
  msgid "getMaxExecutionTime() returning config value: %s"
6801
  msgstr ""
6802
 
6803
  #. translators: PHP ini value.
6804
- #: lib/wfScanEngine.php:2508
6805
  msgid "Got max_execution_time value from ini: %s"
6806
  msgstr ""
6807
 
6808
  #. translators: 1. PHP ini setting. 2. Time in seconds.
6809
- #: lib/wfScanEngine.php:2515
6810
  msgid "ini value of %1$d is higher than value for WORDFENCE_SCAN_MAX_INI_EXECUTION_TIME (%2$d), reducing"
6811
  msgstr ""
6812
 
6813
  #. translators: PHP ini setting.
6814
- #: lib/wfScanEngine.php:2525
6815
  msgid "getMaxExecutionTime() returning half ini value: %d"
6816
  msgstr ""
6817
 
6818
- #: lib/wfScanEngine.php:2531
6819
  msgid "getMaxExecutionTime() returning default of: 15"
6820
  msgstr ""
6821
 
6822
  #. translators: 1. HTTP status code.
6823
- #: lib/wfScanEngine.php:2733
6824
  msgid "Got error response from Wordfence servers: %s"
6825
  msgstr ""
6826
 
6827
- #: lib/wfScanEngine.php:2737
6828
  msgid "Invalid response from Wordfence servers."
6829
  msgstr ""
6830
 
@@ -6987,1364 +6992,1364 @@ msgstr ""
6987
  msgid "File last modified:"
6988
  msgstr ""
6989
 
6990
- #: lib/wordfenceClass.php:177
6991
  msgid ""
6992
  "To ensure uninterrupted Premium Wordfence protection on your site,\n"
6993
  "please renew your license by visiting http://www.wordfence.com/ Sign in, go to your dashboard,\n"
6994
  "select the license about to expire and click the button to renew that license."
6995
  msgstr ""
6996
 
6997
- #: lib/wordfenceClass.php:207
6998
  msgid "Your Premium Wordfence License is set to auto-renew in 10 days."
6999
  msgstr ""
7000
 
7001
- #: lib/wordfenceClass.php:208
7002
  msgid "To update your license settings please visit http://www.wordfence.com/zz9/dashboard"
7003
  msgstr ""
7004
 
7005
- #: lib/wordfenceClass.php:220
7006
  msgid "Your Premium Wordfence License expires in less than 2 weeks."
7007
  msgstr ""
7008
 
7009
- #: lib/wordfenceClass.php:223
7010
  msgid "Your Premium Wordfence License expires in less than a week."
7011
  msgstr ""
7012
 
7013
- #: lib/wordfenceClass.php:226
7014
  msgid "Your Premium Wordfence License expires in 2 days."
7015
  msgstr ""
7016
 
7017
- #: lib/wordfenceClass.php:229
7018
  msgid "Your Premium Wordfence License expires in 1 day."
7019
  msgstr ""
7020
 
7021
- #: lib/wordfenceClass.php:233
7022
  msgid "Your Wordfence Premium License has Expired!"
7023
  msgstr ""
7024
 
7025
- #: lib/wordfenceClass.php:264
7026
  msgid "The Wordfence Premium License in use on this site has been removed from your account."
7027
  msgstr ""
7028
 
7029
- #: lib/wordfenceClass.php:264
7030
  msgid "The license you were using has been removed from your account. Please reach out to billing@wordfence.com or create a Premium support case at https://support.wordfence.com/support/tickets for more information. Our staff is happy to help."
7031
  msgstr ""
7032
 
7033
  #. translators: Wordfence license key.
7034
- #: lib/wordfenceClass.php:270
7035
  msgid "Could not verify Wordfence License: %s"
7036
  msgstr ""
7037
 
7038
  #. translators: WordPress version.
7039
- #: lib/wordfenceClass.php:352
7040
  msgid "WordPress (v%s)"
7041
  msgstr ""
7042
 
7043
  #. translators: Number of plugins.
7044
- #: lib/wordfenceClass.php:356
7045
  msgid "%d plugin"
7046
  msgid_plural "%d plugins"
7047
  msgstr[0] ""
7048
  msgstr[1] ""
7049
 
7050
  #. translators: Number of themes.
7051
- #: lib/wordfenceClass.php:361
7052
  msgid "%d theme"
7053
  msgid_plural "%d themes"
7054
  msgstr[0] ""
7055
  msgstr[1] ""
7056
 
7057
- #: lib/wordfenceClass.php:365
7058
  msgid "An update is available for "
7059
  msgid_plural "Updates are available for "
7060
  msgstr[0] ""
7061
  msgstr[1] ""
7062
 
7063
- #: lib/wordfenceClass.php:370
7064
  msgid "and "
7065
  msgstr ""
7066
 
7067
  #. translators: Wordfence version.
7068
- #: lib/wordfenceClass.php:409
7069
  msgid "`runInstall` called with previous version = %s"
7070
  msgstr ""
7071
 
7072
- #: lib/wordfenceClass.php:461
7073
- #: lib/wordfenceClass.php:4021
7074
  msgid "Could not understand the response we received from the Wordfence servers when applying for a free license key."
7075
  msgstr ""
7076
 
7077
- #: lib/wordfenceClass.php:825
7078
  msgid "Automatically generated from previous country blocking settings"
7079
  msgstr ""
7080
 
7081
- #: lib/wordfenceClass.php:1254
7082
  msgid "Application passwords have been disabled by Wordfence."
7083
  msgstr ""
7084
 
7085
- #: lib/wordfenceClass.php:1365
7086
- #: lib/wordfenceClass.php:6585
7087
  msgid "Upgrade To Premium"
7088
  msgstr ""
7089
 
7090
- #: lib/wordfenceClass.php:1384
7091
  msgid "wp_mail from address is incomplete, attempting to fix"
7092
  msgstr ""
7093
 
7094
  #. translators: Email address.
7095
- #: lib/wordfenceClass.php:1394
7096
  msgid "Fixing wp_mail from address: %s"
7097
  msgstr ""
7098
 
7099
- #: lib/wordfenceClass.php:1487
7100
  msgid "You appear to have logged out or you are not an admin. Please sign-out and sign-in again."
7101
  msgstr ""
7102
 
7103
- #: lib/wordfenceClass.php:1492
7104
  msgid "Your browser sent an invalid security token to Wordfence. Please try reloading this page or signing out and in again."
7105
  msgstr ""
7106
 
7107
- #: lib/wordfenceClass.php:1498
7108
  msgid "Wordfence encountered an internal error executing that request."
7109
  msgstr ""
7110
 
7111
  #. translators: Error message.
7112
- #: lib/wordfenceClass.php:1604
7113
  msgid "2FA Migration Error: %s"
7114
  msgstr ""
7115
 
7116
- #: lib/wordfenceClass.php:1644
7117
  msgid "Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words."
7118
  msgstr ""
7119
 
7120
- #: lib/wordfenceClass.php:1650
7121
  msgid "Passwords containing a space followed by \"wf\" without quotes are not allowed."
7122
  msgstr ""
7123
 
7124
  #. translators: Support URL.
7125
- #: lib/wordfenceClass.php:1665
7126
  msgid "Please choose a different password. The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. <a href=\"%s\">Learn More</a>"
7127
  msgstr ""
7128
 
7129
- #: lib/wordfenceClass.php:1793
7130
- #: lib/wordfenceClass.php:1976
7131
  msgid "Sorry but your browser sent an invalid security token when trying to use this form."
7132
  msgstr ""
7133
 
7134
- #: lib/wordfenceClass.php:1798
7135
  msgid "Please wait 3 minutes and try again"
7136
  msgstr ""
7137
 
7138
- #: lib/wordfenceClass.php:1799
7139
  msgid "You have used this form too much. Please wait 3 minutes and try again."
7140
  msgstr ""
7141
 
7142
- #: lib/wordfenceClass.php:1838
7143
  msgid "Unlock email requested"
7144
  msgstr ""
7145
 
7146
- #: lib/wordfenceClass.php:1840
7147
  msgid "Your request was received"
7148
  msgstr ""
7149
 
7150
  #. translators: Email address.
7151
- #: lib/wordfenceClass.php:1841
7152
  msgid "We received a request to email \"%s\" instructions to unlock their access. If that is the email address of a site administrator or someone on the Wordfence alert list, they have been emailed instructions on how to regain access to this system. The instructions we sent will expire 30 minutes from now."
7153
  msgstr ""
7154
 
7155
- #: lib/wordfenceClass.php:1847
7156
  msgid "Invalid key provided for authentication."
7157
  msgstr ""
7158
 
7159
- #: lib/wordfenceClass.php:1858
7160
  msgid "Request received via unlock email link to unblock all IPs."
7161
  msgstr ""
7162
 
7163
- #: lib/wordfenceClass.php:1867
7164
  msgid "Request received via unlock email link to unblock all IPs via disabling firewall rules."
7165
  msgstr ""
7166
 
7167
- #: lib/wordfenceClass.php:1875
7168
  msgid "Invalid function specified. Please check the link we emailed you and make sure it was not cut-off by your email reader."
7169
  msgstr ""
7170
 
7171
- #: lib/wordfenceClass.php:1920
7172
  msgid "Unsubscribe Requested"
7173
  msgstr ""
7174
 
7175
- #: lib/wordfenceClass.php:1982
7176
  msgid "An error occurred while saving the license."
7177
  msgstr ""
7178
 
7179
  #. translators: Error message.
7180
- #: lib/wordfenceClass.php:1984
7181
- #: lib/wordfenceClass.php:2004
7182
  msgid "An error occurred while saving the license: %s"
7183
  msgstr ""
7184
 
7185
- #: lib/wordfenceClass.php:2020
7186
  msgid "Rescheduled missing daily cron"
7187
  msgstr ""
7188
 
7189
- #: lib/wordfenceClass.php:2025
7190
  msgid "Rescheduled missing hourly cron"
7191
  msgstr ""
7192
 
7193
- #: lib/wordfenceClass.php:2379
7194
- #: lib/wordfenceClass.php:2383
7195
  msgid "Accessed a banned URL"
7196
  msgstr ""
7197
 
7198
- #: lib/wordfenceClass.php:2390
7199
- #: lib/wordfenceClass.php:2394
7200
  msgid "POST received with blank user-agent and referer"
7201
  msgstr ""
7202
 
7203
- #: lib/wordfenceClass.php:2528
7204
  msgid "<strong>ERROR</strong>: You can't register using that username"
7205
  msgstr ""
7206
 
7207
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
7208
- #: lib/wordfenceClass.php:2736
7209
- #: lib/wordfenceClass.php:2872
7210
  msgid "<strong>WARNING: </strong>The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please <a href=\"%1$s\">change your password</a>. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More</a>"
7211
  msgstr ""
7212
 
7213
  #. translators: 1. Reset password URL. 2. Support URL.
7214
- #: lib/wordfenceClass.php:3027
7215
- #: lib/wordfenceClass.php:3063
7216
  msgid "<strong>WARNING: </strong>Your login has been allowed because you have previously logged in from the same IP, but you will be blocked if your IP changes. The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please <a href=\"%1$s\">change your password</a>. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More</a>"
7217
  msgstr ""
7218
 
7219
  #. translators: WordPress username.
7220
- #: lib/wordfenceClass.php:3052
7221
  msgid "A user with username \"%s\" who has administrator access tried to sign in to your WordPress site. Access was denied because all administrator accounts are required to have Cellphone Sign-in enabled but this account does not."
7222
  msgstr ""
7223
 
7224
- #: lib/wordfenceClass.php:3093
7225
  msgid "Blocked by Wordfence Security Network"
7226
  msgstr ""
7227
 
7228
- #: lib/wordfenceClass.php:3123
7229
  msgid "Blocked by login security setting"
7230
  msgstr ""
7231
 
7232
  #. translators: WordPress username.
7233
- #: lib/wordfenceClass.php:3133
7234
  msgid "Used an invalid username '%s' to try to sign in"
7235
  msgstr ""
7236
 
7237
  #. translators: 1. Login attempt limit. 2. WordPress username.
7238
- #: lib/wordfenceClass.php:3152
7239
  msgid "Exceeded the maximum number of login failures which is: %1$s. The last username they tried to sign in with was: '%2$s'"
7240
  msgstr ""
7241
 
7242
- #: lib/wordfenceClass.php:3510
7243
  msgid "An invalid type was specified to get file."
7244
  msgstr ""
7245
 
7246
- #: lib/wordfenceClass.php:3526
7247
  msgid "We could not fetch a core WordPress file from the Wordfence API."
7248
  msgstr ""
7249
 
7250
- #: lib/wordfenceClass.php:3585
7251
  msgid "Wordfence Test Email"
7252
  msgstr ""
7253
 
7254
  #. translators: 1. Site URL. 2. IP address.
7255
- #: lib/wordfenceClass.php:3585
7256
  msgid ""
7257
  "This is a test email from %1$s.\n"
7258
  "The IP address that requested this was: %2$s"
7259
  msgstr ""
7260
 
7261
- #: lib/wordfenceClass.php:3592
7262
  msgid "Cellphone Sign-in is only available to paid members. <a href=\"https://www.wordfence.com/gnl1twoFac3/wordfence-signup/\" target=\"_blank\" rel=\"noopener noreferrer\">Click here to upgrade now.</a>"
7263
  msgstr ""
7264
 
7265
- #: lib/wordfenceClass.php:3599
7266
  msgid "The username you specified does not exist."
7267
  msgstr ""
7268
 
7269
- #: lib/wordfenceClass.php:3608
7270
  msgid "The username you specified is already enabled."
7271
  msgstr ""
7272
 
7273
- #: lib/wordfenceClass.php:3613
7274
  msgid "Unknown authentication mode."
7275
  msgstr ""
7276
 
7277
- #: lib/wordfenceClass.php:3618
7278
  msgid "The phone number you entered must start with a '+', then country code and then area code and number. For example, a number in the United States with country code '1' would look like this: +1-123-555-1234"
7279
  msgstr ""
7280
 
7281
  #. translators: Error message.
7282
- #: lib/wordfenceClass.php:3625
7283
- #: lib/wordfenceClass.php:3657
7284
- #: lib/wordfenceClass.php:3720
7285
  msgid "Could not contact Wordfence servers to generate a verification code: %s"
7286
  msgstr ""
7287
 
7288
  #. translators: Error message.
7289
- #: lib/wordfenceClass.php:3637
7290
- #: lib/wordfenceClass.php:3681
7291
  msgid "Could not generate verification code: %s"
7292
  msgstr ""
7293
 
7294
  #. translators: Error message.
7295
- #: lib/wordfenceClass.php:3638
7296
- #: lib/wordfenceClass.php:3682
7297
  msgid "We could not generate a verification code."
7298
  msgstr ""
7299
 
7300
- #: lib/wordfenceClass.php:3698
7301
  msgid "Unknown two-factor authentication mode."
7302
  msgstr ""
7303
 
7304
- #: lib/wordfenceClass.php:3731
7305
  msgid "The code you entered is invalid. Cellphone sign-in will not be enabled for this user until you enter a valid code."
7306
  msgstr ""
7307
 
7308
- #: lib/wordfenceClass.php:3736
7309
  msgid "We could not find the user you are trying to activate. They may have been removed from the list of Cellphone Sign-in users. Please reload this page."
7310
  msgstr ""
7311
 
7312
- #: lib/wordfenceClass.php:3818
7313
  msgid "That user has already been removed from the list."
7314
  msgstr ""
7315
 
7316
- #: lib/wordfenceClass.php:3838
7317
  msgid "No scan is scheduled"
7318
  msgstr ""
7319
 
7320
- #: lib/wordfenceClass.php:3843
7321
  msgid "Next scan is starting now"
7322
  msgstr ""
7323
 
7324
  #. translators: 1. Time until. 2. Localized date.
7325
- #: lib/wordfenceClass.php:3846
7326
  msgid "Next scan in %1$s (%2$s)"
7327
  msgstr ""
7328
 
7329
  #. translators: Localized date.
7330
- #: lib/wordfenceClass.php:3863
7331
  msgid "Scheduled Wordfence scan starting at %s"
7332
  msgstr ""
7333
 
7334
- #: lib/wordfenceClass.php:3886
7335
  msgid "Sorry but this feature is only available for paid customers."
7336
  msgstr ""
7337
 
7338
  #. translators: Site URL.
7339
- #: lib/wordfenceClass.php:3900
7340
  msgid "SITE: %s"
7341
  msgstr ""
7342
 
7343
  #. translators: Plugin version.
7344
- #: lib/wordfenceClass.php:3901
7345
  msgid "PLUGIN VERSION: %s"
7346
  msgstr ""
7347
 
7348
  #. translators: WordPress version.
7349
- #: lib/wordfenceClass.php:3902
7350
  msgid "WORDPRESS VERSION: %s"
7351
  msgstr ""
7352
 
7353
  #. translators: Wordfence license key.
7354
- #: lib/wordfenceClass.php:3903
7355
  msgid "LICENSE KEY: %s"
7356
  msgstr ""
7357
 
7358
  #. translators: Email address.
7359
- #: lib/wordfenceClass.php:3904
7360
  msgid "ADMIN EMAIL: %s"
7361
  msgstr ""
7362
 
7363
  #. translators: Email address.
7364
- #: lib/wordfenceClass.php:3905
7365
  msgid "LOG:"
7366
  msgstr ""
7367
 
7368
- #: lib/wordfenceClass.php:3921
7369
  msgid "# Scan Issues"
7370
  msgstr ""
7371
 
7372
  #. translators: Number of scan results.
7373
- #: lib/wordfenceClass.php:3926
7374
  msgid "## New Issues (%d total)"
7375
  msgstr ""
7376
 
7377
  #. translators: Number of scan results.
7378
- #: lib/wordfenceClass.php:3953
7379
  msgid "## Ignored Issues (%d total)"
7380
  msgstr ""
7381
 
7382
- #: lib/wordfenceClass.php:3974
7383
  msgid "No Ignored Issues"
7384
  msgstr ""
7385
 
7386
- #: lib/wordfenceClass.php:3996
7387
  msgid "Wordfence Activity Log"
7388
  msgstr ""
7389
 
7390
  #. translators: Error message.
7391
- #: lib/wordfenceClass.php:4024
7392
  msgid "Could not fetch free license key from Wordfence: %s"
7393
  msgstr ""
7394
 
7395
- #: lib/wordfenceClass.php:4109
7396
  msgid "We could not find your .htaccess file to modify it."
7397
  msgstr ""
7398
 
7399
  #. translators: Error message.
7400
- #: lib/wordfenceClass.php:4114
7401
  msgid "We found your .htaccess file but could not open it for writing: %s"
7402
  msgstr ""
7403
 
7404
- #: lib/wordfenceClass.php:4197
7405
  msgid "All Countries"
7406
  msgstr ""
7407
 
7408
- #: lib/wordfenceClass.php:4200
7409
  msgid "1 Country"
7410
  msgstr ""
7411
 
7412
  #. translators: Number of countries.
7413
- #: lib/wordfenceClass.php:4203
7414
  msgid "%d Countries"
7415
  msgstr ""
7416
 
7417
- #: lib/wordfenceClass.php:4207
7418
  msgid "Entire Site"
7419
  msgstr ""
7420
 
7421
- #: lib/wordfenceClass.php:4210
7422
  msgid "Login Only"
7423
  msgstr ""
7424
 
7425
- #: lib/wordfenceClass.php:4213
7426
  msgid "Site Except Login"
7427
  msgstr ""
7428
 
7429
- #: lib/wordfenceClass.php:4221
7430
  msgid "IP Range"
7431
  msgstr ""
7432
 
7433
  #. translators: 2FA backup codes.
7434
- #: lib/wordfenceClass.php:4222
7435
- #: lib/wordfenceClass.php:6174
7436
  msgid "User Agent"
7437
  msgstr ""
7438
 
7439
- #: lib/wordfenceClass.php:4223
7440
  #: views/blocking/blocking-create.php:201
7441
  msgid "Referrer"
7442
  msgstr ""
7443
 
7444
- #: lib/wordfenceClass.php:4238
7445
  msgid "Permanent"
7446
  msgstr ""
7447
 
7448
- #: lib/wordfenceClass.php:4310
7449
  msgid "An error occurred while creating the block."
7450
  msgstr ""
7451
 
7452
- #: lib/wordfenceClass.php:4316
7453
  msgid "No block parameters were provided."
7454
  msgstr ""
7455
 
7456
- #: lib/wordfenceClass.php:4353
7457
- #: lib/wordfenceClass.php:4385
7458
  msgid "No blocks were provided."
7459
  msgstr ""
7460
 
7461
- #: lib/wordfenceClass.php:4417
7462
  msgid "The license provided is already in use on another site."
7463
  msgstr ""
7464
 
7465
- #: lib/wordfenceClass.php:4422
7466
  msgid "The Wordfence activation server returned an unexpected response. Please try again."
7467
  msgstr ""
7468
 
7469
- #: lib/wordfenceClass.php:4428
7470
  msgid "We received an error while trying to activate the license with the Wordfence servers: "
7471
  msgstr ""
7472
 
7473
- #: lib/wordfenceClass.php:4441
7474
  msgid "No license was provided to install."
7475
  msgstr ""
7476
 
7477
- #: lib/wordfenceClass.php:4492
7478
  msgid "An unknown configuration section was provided."
7479
  msgstr ""
7480
 
7481
- #: lib/wordfenceClass.php:4498
7482
  msgid "No configuration section was provided."
7483
  msgstr ""
7484
 
7485
- #: lib/wordfenceClass.php:4544
7486
- #: lib/wordfenceClass.php:4549
7487
  msgid "An error occurred while saving the configuration."
7488
  msgstr ""
7489
 
7490
- #: lib/wordfenceClass.php:4560
7491
  msgid "No configuration changes were provided to save."
7492
  msgstr ""
7493
 
7494
- #: lib/wordfenceClass.php:4591
7495
- #: lib/wordfenceClass.php:5216
7496
- #: lib/wordfenceClass.php:5247
7497
- #: lib/wordfenceClass.php:7217
7498
- #: lib/wordfenceClass.php:7252
7499
- #: lib/wordfenceClass.php:7284
7500
  msgid "We could not find that issue in our database."
7501
  msgstr ""
7502
 
7503
- #: lib/wordfenceClass.php:4601
7504
  msgid "An error occurred while trying to hide the file."
7505
  msgstr ""
7506
 
7507
- #: lib/wordfenceClass.php:4614
7508
  msgid "An invalid file was requested for hiding."
7509
  msgstr ""
7510
 
7511
- #: lib/wordfenceClass.php:4641
7512
- #: lib/wordfenceClass.php:5227
7513
  msgid "You don't have permission to repair .htaccess. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file."
7514
  msgstr ""
7515
 
7516
- #: lib/wordfenceClass.php:4665
7517
  msgid "Manual permanent block by admin"
7518
  msgstr ""
7519
 
7520
- #: lib/wordfenceClass.php:4701
7521
  msgid "Please enter a valid IP address to block."
7522
  msgstr ""
7523
 
7524
- #: lib/wordfenceClass.php:4704
7525
  msgid "You can't block your own IP address."
7526
  msgstr ""
7527
 
7528
  #. translators: IP address.
7529
- #: lib/wordfenceClass.php:4708
7530
  msgid "The IP address %s is allowlisted and can't be blocked. You can remove this IP from the allowlist on the Wordfence options page."
7531
  msgstr ""
7532
 
7533
  #. translators: IP address.
7534
- #: lib/wordfenceClass.php:4710
7535
  msgid "The IP address %s is in a range of IP addresses that Wordfence does not block. The IP range may be internal or belong to a service safe to allow access for."
7536
  msgstr ""
7537
 
7538
- #: lib/wordfenceClass.php:4716
7539
  msgid "The IP address you're trying to block belongs to Google. Your options are currently set to not block these crawlers. Change this in Wordfence options if you want to manually block Google."
7540
  msgstr ""
7541
 
7542
- #: lib/wordfenceClass.php:4759
7543
  msgid "An invalid operation was called."
7544
  msgstr ""
7545
 
7546
- #: lib/wordfenceClass.php:4769
7547
  msgid "An invalid status was specified when trying to update that issue."
7548
  msgstr ""
7549
 
7550
- #: lib/wordfenceClass.php:4781
7551
  msgid "Scan stop request received."
7552
  msgstr ""
7553
 
7554
- #: lib/wordfenceClass.php:4782
7555
  msgid "A request was received to stop the previous scan."
7556
  msgstr ""
7557
 
7558
- #: lib/wordfenceClass.php:4831
7559
  msgid "Idle"
7560
  msgstr ""
7561
 
7562
  #. translators: Localized date.
7563
- #: lib/wordfenceClass.php:4840
7564
  msgid "Scan completed on %s"
7565
  msgstr ""
7566
 
7567
- #: lib/wordfenceClass.php:4847
7568
  msgid "Last scan failed"
7569
  msgstr ""
7570
 
7571
  #. translators: Time until.
7572
- #: lib/wordfenceClass.php:4910
7573
  msgid "more than %s"
7574
  msgstr ""
7575
 
7576
  #. translators: Localized date.
7577
- #: lib/wordfenceClass.php:4914
7578
  msgid "The current scan looks like it has failed. Its last status update was <span id=\"wf-scan-failed-time-ago\">%s</span> ago. You may continue to wait in case it resumes or stop and restart the scan. Some sites may need adjustments to run scans reliably."
7579
  msgstr ""
7580
 
7581
  #. translators: Localized date.
7582
- #: lib/wordfenceClass.php:4914
7583
- #: lib/wordfenceClass.php:4922
7584
- #: lib/wordfenceClass.php:4941
7585
- #: lib/wordfenceClass.php:4953
7586
- #: lib/wordfenceClass.php:4961
7587
  msgid "Click here for steps you can try."
7588
  msgstr ""
7589
 
7590
  #. translators: Localized date.
7591
- #: lib/wordfenceClass.php:4915
7592
  msgid "Cancel Scan"
7593
  msgstr ""
7594
 
7595
- #: lib/wordfenceClass.php:4922
7596
  msgid "The previous scan has failed. Some sites may need adjustments to run scans reliably."
7597
  msgstr ""
7598
 
7599
  #. translators: Time limit (number).
7600
- #: lib/wordfenceClass.php:4928
7601
  msgid "The previous scan has terminated because the time limit of %s was reached. This limit can be customized on the options page."
7602
  msgstr ""
7603
 
7604
- #: lib/wordfenceClass.php:4934
7605
  msgid "The previous scan has terminated because we detected an update occurring during the scan."
7606
  msgstr ""
7607
 
7608
- #: lib/wordfenceClass.php:4941
7609
  msgid "The scan has failed to start. This is often because the site either cannot make outbound requests or is blocked from connecting to itself."
7610
  msgstr ""
7611
 
7612
- #: lib/wordfenceClass.php:4947
7613
  msgid "Scans are not functional because SSL is unavailable."
7614
  msgstr ""
7615
 
7616
- #: lib/wordfenceClass.php:4953
7617
  msgid "The scan has failed because we were unable to contact the Wordfence servers. Some sites may need adjustments to run scans reliably."
7618
  msgstr ""
7619
 
7620
- #: lib/wordfenceClass.php:4961
7621
  msgid "The scan has failed because we received an unexpected response from the Wordfence servers. This may be a temporary error, though some sites may need adjustments to run scans reliably."
7622
  msgstr ""
7623
 
7624
- #: lib/wordfenceClass.php:4988
7625
  msgid "Invalid email address given."
7626
  msgstr ""
7627
 
7628
- #: lib/wordfenceClass.php:5013
7629
- #: lib/wordfenceClass.php:5138
7630
  msgid "Deleting an infected wp-config.php file must be done outside of Wordfence. The wp-config.php file contains your database credentials, which you will need to restore normal site operations. Your site will NOT function once the wp-config.php file has been deleted."
7631
  msgstr ""
7632
 
7633
  #. translators: 1. File path. 2. Error message.
7634
- #: lib/wordfenceClass.php:5022
7635
  msgid "Could not delete file %1$s. Error was: %2$s"
7636
  msgstr ""
7637
 
7638
  #. translators: File path.
7639
- #: lib/wordfenceClass.php:5046
7640
  msgid "We could not retrieve the original file of %s to do a repair."
7641
  msgstr ""
7642
 
7643
  #. translators: File path.
7644
- #: lib/wordfenceClass.php:5051
7645
  msgid "An invalid file %s was specified for repair."
7646
  msgstr ""
7647
 
7648
  #. translators: File path.
7649
- #: lib/wordfenceClass.php:5059
7650
  msgid "You don't have permission to repair %s. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file."
7651
  msgstr ""
7652
 
7653
  #. translators: 1. File path. 2. Error message.
7654
- #: lib/wordfenceClass.php:5062
7655
  msgid "We could not write to %1$s. The error was: %2$s"
7656
  msgstr ""
7657
 
7658
  #. translators: 1. File path. 2. Number of bytes.
7659
- #: lib/wordfenceClass.php:5073
7660
  msgid "We could not write to %1$s. (%2$d bytes written) You may not have permission to modify files on your WordPress server."
7661
  msgstr ""
7662
 
7663
- #: lib/wordfenceClass.php:5085
7664
  msgid "Deleted some files with errors"
7665
  msgstr ""
7666
 
7667
- #: lib/wordfenceClass.php:5085
7668
  msgid "Repaired some files with errors"
7669
  msgstr ""
7670
 
7671
  #. translators: 1. Number of files. 2. Error message.
7672
- #: lib/wordfenceClass.php:5088
7673
  msgid "Deleted %1$d files but we encountered the following errors with other files: %2$s"
7674
  msgstr ""
7675
 
7676
  #. translators: 1. Number of files. 2. Error message.
7677
- #: lib/wordfenceClass.php:5090
7678
  msgid "Repaired %1$d files but we encountered the following errors with other files: %2$s"
7679
  msgstr ""
7680
 
7681
  #. translators: Number of files.
7682
- #: lib/wordfenceClass.php:5094
7683
  msgid "Deleted %d files successfully"
7684
  msgstr ""
7685
 
7686
  #. translators: Number of files.
7687
- #: lib/wordfenceClass.php:5094
7688
  msgid "Repaired %d files successfully"
7689
  msgstr ""
7690
 
7691
  #. translators: Number of files.
7692
- #: lib/wordfenceClass.php:5095
7693
  msgid "Deleted %d files successfully. No errors were encountered."
7694
  msgstr ""
7695
 
7696
  #. translators: Number of files.
7697
- #: lib/wordfenceClass.php:5095
7698
  msgid "Repaired %d files successfully. No errors were encountered."
7699
  msgstr ""
7700
 
7701
- #: lib/wordfenceClass.php:5098
7702
  msgid "Could not delete files"
7703
  msgstr ""
7704
 
7705
- #: lib/wordfenceClass.php:5098
7706
  msgid "Could not repair files"
7707
  msgstr ""
7708
 
7709
  #. translators: Error message.
7710
- #: lib/wordfenceClass.php:5101
7711
  msgid "We could not delete any of the files you selected. We encountered the following errors: %s"
7712
  msgstr ""
7713
 
7714
  #. translators: Error message.
7715
- #: lib/wordfenceClass.php:5103
7716
  msgid "We could not repair any of the files you selected. We encountered the following errors: %s"
7717
  msgstr ""
7718
 
7719
- #: lib/wordfenceClass.php:5106
7720
  msgid "Nothing done"
7721
  msgstr ""
7722
 
7723
- #: lib/wordfenceClass.php:5107
7724
  msgid "We didn't delete anything and no errors were found."
7725
  msgstr ""
7726
 
7727
- #: lib/wordfenceClass.php:5107
7728
  msgid "We didn't repair anything and no errors were found."
7729
  msgstr ""
7730
 
7731
- #: lib/wordfenceClass.php:5115
7732
  msgid "Invalid bulk operation selected"
7733
  msgstr ""
7734
 
7735
- #: lib/wordfenceClass.php:5125
7736
  msgid "Could not delete file because we could not find that issue."
7737
  msgstr ""
7738
 
7739
- #: lib/wordfenceClass.php:5128
7740
  msgid "Could not delete file because that issue does not appear to be a file related issue."
7741
  msgstr ""
7742
 
7743
- #: lib/wordfenceClass.php:5134
7744
  msgid "An invalid file was requested for deletion."
7745
  msgstr ""
7746
 
7747
  #. translators: 1. File path. 2. Error message.
7748
- #: lib/wordfenceClass.php:5177
7749
  msgid "Could not delete file %1$s. The error was: %2$s"
7750
  msgstr ""
7751
 
7752
- #: lib/wordfenceClass.php:5190
7753
  msgid "Could not remove the option because we could not find that issue."
7754
  msgstr ""
7755
 
7756
- #: lib/wordfenceClass.php:5193
7757
  msgid "Could not remove the option because that issue does not appear to be a database related issue."
7758
  msgstr ""
7759
 
7760
  #. translators: 1. WordPress option. 2. Error message.
7761
- #: lib/wordfenceClass.php:5206
7762
  msgid "Could not remove the option %1$s. The error was: %2$s"
7763
  msgstr ""
7764
 
7765
- #: lib/wordfenceClass.php:5233
7766
  msgid "Modifying the .htaccess file did not resolve the issue, so the original .htaccess file was restored. You can fix this manually by setting <code>display_errors</code> to <code>Off</code> in your php.ini if your site is on a VPS or dedicated server that you control."
7767
  msgstr ""
7768
 
7769
- #: lib/wordfenceClass.php:5275
7770
  msgid "We could not get the original file to do a repair."
7771
  msgstr ""
7772
 
7773
- #: lib/wordfenceClass.php:5279
7774
  msgid "An invalid file was specified for repair."
7775
  msgstr ""
7776
 
7777
- #: lib/wordfenceClass.php:5294
7778
  msgid "We could not write to that file. You may not have permission to modify files on your WordPress server."
7779
  msgstr ""
7780
 
7781
- #: lib/wordfenceClass.php:5298
7782
  msgid "Ajax request received to start scan."
7783
  msgstr ""
7784
 
7785
  #. translators: Number of URLs.
7786
- #: lib/wordfenceClass.php:5353
7787
  msgid "Page contains %d malware URL: "
7788
  msgid_plural "Page contains %d malware URLs: "
7789
  msgstr[0] ""
7790
  msgstr[1] ""
7791
 
7792
- #: lib/wordfenceClass.php:5356
7793
  msgid "Run a Scan"
7794
  msgstr ""
7795
 
7796
- #: lib/wordfenceClass.php:5404
7797
  msgid "Unknown dashboard data set."
7798
  msgstr ""
7799
 
7800
- #: lib/wordfenceClass.php:5435
7801
  msgid "Bad security token. It may have been more than 12 hours since you reloaded the page you came from. Try reloading the page you came from. If that doesn't work, please sign out and sign-in again."
7802
  msgstr ""
7803
 
7804
- #: lib/wordfenceClass.php:5622
7805
  msgid "An invalid IP address was specified."
7806
  msgstr ""
7807
 
7808
- #: lib/wordfenceClass.php:5675
7809
- #: lib/wordfenceClass.php:5715
7810
- #: lib/wordfenceClass.php:5753
7811
  msgid "File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)"
7812
  msgstr ""
7813
 
7814
- #: lib/wordfenceClass.php:5680
7815
- #: lib/wordfenceClass.php:5758
7816
  msgid "Invalid file requested. (Relative paths not allowed)"
7817
  msgstr ""
7818
 
7819
- #: lib/wordfenceClass.php:5684
7820
- #: lib/wordfenceClass.php:5719
7821
- #: lib/wordfenceClass.php:5762
7822
  msgid "File contains illegal characters."
7823
  msgstr ""
7824
 
7825
  #. translators: Error message.
7826
- #: lib/wordfenceClass.php:5694
7827
  msgid "We could not open the requested file for reading. The error was: %s"
7828
  msgstr ""
7829
 
7830
- #: lib/wordfenceClass.php:5702
7831
  msgid "Greater than 2 Gigs"
7832
  msgstr ""
7833
 
7834
- #: lib/wordfenceClass.php:5707
7835
  msgid "Unknown file size."
7836
  msgstr ""
7837
 
7838
- #: lib/wordfenceClass.php:5728
7839
  msgid "We could not get the contents of the original file to do a comparison."
7840
  msgstr ""
7841
 
7842
- #: lib/wordfenceClass.php:5766
7843
  msgid "File does not exist."
7844
  msgstr ""
7845
 
7846
- #: lib/wordfenceClass.php:6016
7847
  #: views/dashboard/options-group-import.php:167
7848
  msgid "Reload"
7849
  msgstr ""
7850
 
7851
- #: lib/wordfenceClass.php:6033
7852
  msgid "${totalIPs} addresses in this network"
7853
  msgstr ""
7854
 
7855
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
7856
- #: lib/wordfenceClass.php:6034
7857
  msgid "%s in POST body: %s"
7858
  msgstr ""
7859
 
7860
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
7861
- #: lib/wordfenceClass.php:6035
7862
  msgid "%s in cookie: %s"
7863
  msgstr ""
7864
 
7865
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
7866
- #: lib/wordfenceClass.php:6036
7867
  msgid "%s in file: %s"
7868
  msgstr ""
7869
 
7870
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
7871
- #: lib/wordfenceClass.php:6037
7872
  msgid "%s in query string: %s"
7873
  msgstr ""
7874
 
7875
  #. translators: Domain name.
7876
- #: lib/wordfenceClass.php:6038
7877
  msgid "%s is not valid hostname"
7878
  msgstr ""
7879
 
7880
  #. translators: Domain name.
7881
- #: lib/wordfenceClass.php:6039
7882
  msgid ".htaccess Updated"
7883
  msgstr ""
7884
 
7885
- #: lib/wordfenceClass.php:6040
7886
  msgid ".htaccess change"
7887
  msgstr ""
7888
 
7889
- #: lib/wordfenceClass.php:6041
7890
  msgid "404 Not Found"
7891
  msgstr ""
7892
 
7893
- #: lib/wordfenceClass.php:6042
7894
  msgid "Activity Log Sent"
7895
  msgstr ""
7896
 
7897
- #: lib/wordfenceClass.php:6043
7898
  msgid "Add action to allowlist"
7899
  msgstr ""
7900
 
7901
- #: lib/wordfenceClass.php:6044
7902
  msgid "Add code to .htaccess"
7903
  msgstr ""
7904
 
7905
- #: lib/wordfenceClass.php:6045
7906
  msgid "All Hits"
7907
  msgstr ""
7908
 
7909
  #. translators: WordPress username.
7910
- #: lib/wordfenceClass.php:6046
7911
  msgid "All capabilties of admin user %s were successfully revoked."
7912
  msgstr ""
7913
 
7914
- #: lib/wordfenceClass.php:6048
7915
  msgid "An error occurred when adding the request to the allowlist."
7916
  msgstr ""
7917
 
7918
- #: lib/wordfenceClass.php:6049
7919
  msgid "Are you sure you want to allowlist this action?"
7920
  msgstr ""
7921
 
7922
- #: lib/wordfenceClass.php:6050
7923
  msgid "Authentication Code"
7924
  msgstr ""
7925
 
7926
- #: lib/wordfenceClass.php:6051
7927
  msgid "Background Request Blocked"
7928
  msgstr ""
7929
 
7930
- #: lib/wordfenceClass.php:6052
7931
  msgid "Block This Network"
7932
  msgstr ""
7933
 
7934
- #: lib/wordfenceClass.php:6054
7935
  msgid "Blocked By Firewall"
7936
  msgstr ""
7937
 
7938
- #: lib/wordfenceClass.php:6055
7939
  msgid "Blocked WAF"
7940
  msgstr ""
7941
 
7942
- #: lib/wordfenceClass.php:6056
7943
  msgid "Blocked by Wordfence"
7944
  msgstr ""
7945
 
7946
- #: lib/wordfenceClass.php:6057
7947
  msgid "Blocked by Wordfence plugin settings"
7948
  msgstr ""
7949
 
7950
- #: lib/wordfenceClass.php:6058
7951
  msgid "Blocked by the Wordfence Application Firewall and plugin settings"
7952
  msgstr ""
7953
 
7954
- #: lib/wordfenceClass.php:6059
7955
  msgid "Blocked by the Wordfence Security Network"
7956
  msgstr ""
7957
 
7958
- #: lib/wordfenceClass.php:6060
7959
  msgid "Blocked by the Wordfence Web Application Firewall"
7960
  msgstr ""
7961
 
7962
- #: lib/wordfenceClass.php:6063
7963
  msgid "Cellphone Sign-In Recovery Codes"
7964
  msgstr ""
7965
 
7966
- #: lib/wordfenceClass.php:6064
7967
  msgid "Cellphone Sign-in activated for user."
7968
  msgstr ""
7969
 
7970
- #: lib/wordfenceClass.php:6065
7971
  msgid "Click here to download a backup copy of this file now"
7972
  msgstr ""
7973
 
7974
- #: lib/wordfenceClass.php:6066
7975
  msgid "Click here to download a backup copy of your .htaccess file now"
7976
  msgstr ""
7977
 
7978
- #: lib/wordfenceClass.php:6067
7979
  msgid "Click to fix .htaccess"
7980
  msgstr ""
7981
 
7982
- #: lib/wordfenceClass.php:6069
7983
  msgid "Crawlers"
7984
  msgstr ""
7985
 
7986
- #: lib/wordfenceClass.php:6070
7987
  msgid "Diagnostic report has been sent successfully."
7988
  msgstr ""
7989
 
7990
- #: lib/wordfenceClass.php:6071
7991
  msgid "Directory Listing Disabled"
7992
  msgstr ""
7993
 
7994
- #: lib/wordfenceClass.php:6072
7995
  msgid "Directory listing has been disabled on your server."
7996
  msgstr ""
7997
 
7998
- #: lib/wordfenceClass.php:6075
7999
  msgid "Don't ask again"
8000
  msgstr ""
8001
 
8002
- #: lib/wordfenceClass.php:6077
8003
  msgid "Download Backup File"
8004
  msgstr ""
8005
 
8006
- #: lib/wordfenceClass.php:6078
8007
  msgid "Each line of 16 letters and numbers is a single recovery code, with optional spaces for readability. When typing your password, enter \"wf\" followed by the entire code like \"mypassword wf1234 5678 90AB CDEF\". If your site shows a separate prompt for entering a code after entering only your username and password, enter only the code like \"1234 5678 90AB CDEF\". Your recovery codes are:"
8008
  msgstr ""
8009
 
8010
- #: lib/wordfenceClass.php:6079
8011
  msgid "Email Diagnostic Report"
8012
  msgstr ""
8013
 
8014
- #: lib/wordfenceClass.php:6080
8015
  msgid "Email Wordfence Activity Log"
8016
  msgstr ""
8017
 
8018
- #: lib/wordfenceClass.php:6082
8019
  msgid "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."
8020
  msgstr ""
8021
 
8022
- #: lib/wordfenceClass.php:6083
8023
  msgid "Error"
8024
  msgstr ""
8025
 
8026
- #: lib/wordfenceClass.php:6084
8027
  msgid "Error Enabling All Options Page"
8028
  msgstr ""
8029
 
8030
- #: lib/wordfenceClass.php:6085
8031
  msgid "Error Restoring Defaults"
8032
  msgstr ""
8033
 
8034
- #: lib/wordfenceClass.php:6086
8035
  msgid "Error Saving Option"
8036
  msgstr ""
8037
 
8038
- #: lib/wordfenceClass.php:6087
8039
  msgid "Error Saving Options"
8040
  msgstr ""
8041
 
8042
- #: lib/wordfenceClass.php:6088
8043
  msgid "Failed Login"
8044
  msgstr ""
8045
 
8046
- #: lib/wordfenceClass.php:6089
8047
  msgid "Failed Login: Invalid Username"
8048
  msgstr ""
8049
 
8050
- #: lib/wordfenceClass.php:6090
8051
  msgid "Failed Login: Valid Username"
8052
  msgstr ""
8053
 
8054
- #: lib/wordfenceClass.php:6091
8055
  msgid "File hidden successfully"
8056
  msgstr ""
8057
 
8058
- #: lib/wordfenceClass.php:6092
8059
  msgid "File restored OK"
8060
  msgstr ""
8061
 
8062
- #: lib/wordfenceClass.php:6093
8063
  msgid "Filter Traffic"
8064
  msgstr ""
8065
 
8066
- #: lib/wordfenceClass.php:6094
8067
  msgid "Firewall Response"
8068
  msgstr ""
8069
 
8070
- #: lib/wordfenceClass.php:6095
8071
  #: views/scanner/issue-wpscan_fullPathDiscl.php:8
8072
  msgid "Full Path Disclosure"
8073
  msgstr ""
8074
 
8075
- #: lib/wordfenceClass.php:6096
8076
  msgid "Google Bot"
8077
  msgstr ""
8078
 
8079
- #: lib/wordfenceClass.php:6097
8080
  msgid "Google Crawlers"
8081
  msgstr ""
8082
 
8083
- #: lib/wordfenceClass.php:6098
8084
  msgid "HTTP Response Code"
8085
  msgstr ""
8086
 
8087
- #: lib/wordfenceClass.php:6100
8088
  msgid "Humans"
8089
  msgstr ""
8090
 
8091
- #: lib/wordfenceClass.php:6102
8092
  msgid "Key:"
8093
  msgstr ""
8094
 
8095
  #. translators: Localized date.
8096
- #: lib/wordfenceClass.php:6103
8097
  msgid "Last Updated: %s"
8098
  msgstr ""
8099
 
8100
  #. translators: Localized date.
8101
- #: lib/wordfenceClass.php:6104
8102
  msgid "Learn more about repairing modified files."
8103
  msgstr ""
8104
 
8105
- #: lib/wordfenceClass.php:6106
8106
  msgid "Locked Out"
8107
  msgstr ""
8108
 
8109
- #: lib/wordfenceClass.php:6107
8110
  msgid "Locked out from logging in"
8111
  msgstr ""
8112
 
8113
- #: lib/wordfenceClass.php:6108
8114
  msgid "Logged In"
8115
  msgstr ""
8116
 
8117
- #: lib/wordfenceClass.php:6109
8118
  msgid "Logins"
8119
  msgstr ""
8120
 
8121
- #: lib/wordfenceClass.php:6110
8122
  msgid "Logins and Logouts"
8123
  msgstr ""
8124
 
8125
  #. translators: Localized date.
8126
- #: lib/wordfenceClass.php:6113
8127
  msgid "Next Update Check: %s"
8128
  msgstr ""
8129
 
8130
  #. translators: Localized date.
8131
- #: lib/wordfenceClass.php:6114
8132
  msgid "No activity to report yet. Please complete your first scan."
8133
  msgstr ""
8134
 
8135
- #: lib/wordfenceClass.php:6115
8136
  msgid "No issues have been ignored."
8137
  msgstr ""
8138
 
8139
- #: lib/wordfenceClass.php:6116
8140
  msgid "No new issues have been found."
8141
  msgstr ""
8142
 
8143
- #: lib/wordfenceClass.php:6117
8144
  msgid "No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory."
8145
  msgstr ""
8146
 
8147
- #: lib/wordfenceClass.php:6118
8148
  msgid "No rules were updated. Please verify your website can reach the Wordfence servers."
8149
  msgstr ""
8150
 
8151
- #: lib/wordfenceClass.php:6119
8152
  msgid "No rules were updated. Your website has reached the maximum number of rule update requests. Please try again later."
8153
  msgstr ""
8154
 
8155
- #: lib/wordfenceClass.php:6120
8156
  msgid "Note: Status will update when changes are saved"
8157
  msgstr ""
8158
 
8159
- #: lib/wordfenceClass.php:6121
8160
  msgid "OK"
8161
  msgstr ""
8162
 
8163
- #: lib/wordfenceClass.php:6122
8164
  msgid "Pages Not Found"
8165
  msgstr ""
8166
 
8167
- #: lib/wordfenceClass.php:6123
8168
  msgid "Paid Members Only"
8169
  msgstr ""
8170
 
8171
- #: lib/wordfenceClass.php:6125
8172
  msgid "Please enter a valid email address."
8173
  msgstr ""
8174
 
8175
- #: lib/wordfenceClass.php:6126
8176
  msgid "Please include your support ticket number or forum username."
8177
  msgstr ""
8178
 
8179
- #: lib/wordfenceClass.php:6127
8180
  msgid "Please make a backup of this file before proceeding. If you need to restore this backup file, you can copy it to the following path from your site's root:"
8181
  msgstr ""
8182
 
8183
- #: lib/wordfenceClass.php:6128
8184
  msgid "Please specify a reason"
8185
  msgstr ""
8186
 
8187
- #: lib/wordfenceClass.php:6129
8188
  msgid "Please specify a valid IP address range in the form of \"1.2.3.4 - 1.2.3.5\" without quotes. Make sure the dash between the IP addresses in a normal dash (a minus sign on your keyboard) and not another character that looks like a dash."
8189
  msgstr ""
8190
 
8191
- #: lib/wordfenceClass.php:6130
8192
  msgid "Please specify either an IP address range, Hostname or a web browser pattern to match."
8193
  msgstr ""
8194
 
8195
- #: lib/wordfenceClass.php:6131
8196
  msgid "Recent Activity"
8197
  msgstr ""
8198
 
8199
- #: lib/wordfenceClass.php:6132
8200
  msgid "Recovery Codes"
8201
  msgstr ""
8202
 
8203
- #: lib/wordfenceClass.php:6133
8204
  msgid "Redirected"
8205
  msgstr ""
8206
 
8207
- #: lib/wordfenceClass.php:6134
8208
  msgid "Redirected by Country Blocking bypass URL"
8209
  msgstr ""
8210
 
8211
- #: lib/wordfenceClass.php:6135
8212
  msgid "Referer"
8213
  msgstr ""
8214
 
8215
- #: lib/wordfenceClass.php:6136
8216
  msgid "Registered Users"
8217
  msgstr ""
8218
 
8219
- #: lib/wordfenceClass.php:6138
8220
  msgid "Rule Update Failed"
8221
  msgstr ""
8222
 
8223
- #: lib/wordfenceClass.php:6139
8224
  msgid "Rules Updated"
8225
  msgstr ""
8226
 
8227
- #: lib/wordfenceClass.php:6141
8228
  msgid "Scan Complete."
8229
  msgstr ""
8230
 
8231
- #: lib/wordfenceClass.php:6142
8232
  msgid "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."
8233
  msgstr ""
8234
 
8235
- #: lib/wordfenceClass.php:6143
8236
  msgid "Security Event"
8237
  msgstr ""
8238
 
8239
- #: lib/wordfenceClass.php:6144
8240
  msgid "Send"
8241
  msgstr ""
8242
 
8243
- #: lib/wordfenceClass.php:6145
8244
  msgid "Sorry, but no data for that IP or domain was found."
8245
  msgstr ""
8246
 
8247
- #: lib/wordfenceClass.php:6146
8248
  msgid "Specify a valid IP range"
8249
  msgstr ""
8250
 
8251
- #: lib/wordfenceClass.php:6147
8252
  msgid "Specify a valid hostname"
8253
  msgstr ""
8254
 
8255
- #: lib/wordfenceClass.php:6148
8256
  msgid "Specify an IP range, Hostname or Browser pattern"
8257
  msgstr ""
8258
 
8259
- #: lib/wordfenceClass.php:6149
8260
  msgid "Success deleting file"
8261
  msgstr ""
8262
 
8263
- #: lib/wordfenceClass.php:6150
8264
  msgid "Success removing option"
8265
  msgstr ""
8266
 
8267
- #: lib/wordfenceClass.php:6151
8268
  msgid "Success restoring file"
8269
  msgstr ""
8270
 
8271
- #: lib/wordfenceClass.php:6152
8272
  msgid "Success updating option"
8273
  msgstr ""
8274
 
8275
- #: lib/wordfenceClass.php:6153
8276
  msgid "Successfully deleted admin"
8277
  msgstr ""
8278
 
8279
- #: lib/wordfenceClass.php:6154
8280
  msgid "Successfully revoked admin"
8281
  msgstr ""
8282
 
8283
- #: lib/wordfenceClass.php:6155
8284
  msgid "Test Email Sent"
8285
  msgstr ""
8286
 
8287
- #: lib/wordfenceClass.php:6156
8288
  msgid "The 'How does Wordfence get IPs' option was successfully updated to the recommended value."
8289
  msgstr ""
8290
 
8291
- #: lib/wordfenceClass.php:6157
8292
  msgid "The Full Path disclosure issue has been fixed"
8293
  msgstr ""
8294
 
8295
  #. translators: WordPress username.
8296
- #: lib/wordfenceClass.php:6158
8297
  msgid "The admin user %s was successfully deleted."
8298
  msgstr ""
8299
 
8300
  #. translators: File path.
8301
- #: lib/wordfenceClass.php:6159
8302
  msgid "The file %s was successfully deleted."
8303
  msgstr ""
8304
 
8305
  #. translators: File path.
8306
- #: lib/wordfenceClass.php:6160
8307
  msgid "The file %s was successfully hidden from public view."
8308
  msgstr ""
8309
 
8310
  #. translators: File path.
8311
- #: lib/wordfenceClass.php:6161
8312
  msgid "The file %s was successfully restored."
8313
  msgstr ""
8314
 
8315
  #. translators: WordPress option.
8316
- #: lib/wordfenceClass.php:6162
8317
  msgid "The option %s was successfully removed."
8318
  msgstr ""
8319
 
8320
  #. translators: WordPress option.
8321
- #: lib/wordfenceClass.php:6163
8322
  msgid "The request has been allowlisted. Please try it again."
8323
  msgstr ""
8324
 
8325
- #: lib/wordfenceClass.php:6164
8326
  msgid "There was an error while sending the email."
8327
  msgstr ""
8328
 
8329
- #: lib/wordfenceClass.php:6165
8330
  msgid "This will be shown only once. Keep these codes somewhere safe."
8331
  msgstr ""
8332
 
8333
- #: lib/wordfenceClass.php:6166
8334
  msgid "Throttled"
8335
  msgstr ""
8336
 
8337
- #: lib/wordfenceClass.php:6167
8338
  msgid "Two Factor Status"
8339
  msgstr ""
8340
 
8341
  #. translators: HTTP client type.
8342
- #: lib/wordfenceClass.php:6169
8343
  msgid "Type: %s"
8344
  msgstr ""
8345
 
8346
  #. translators: HTTP client type.
8347
- #: lib/wordfenceClass.php:6170
8348
  #: views/scanner/issue-checkGSB.php:8
8349
  #: views/scanner/issue-commentBadURL.php:8
8350
  #: views/scanner/issue-configReadable.php:12
@@ -8364,563 +8369,567 @@ msgstr ""
8364
  msgid "URL"
8365
  msgstr ""
8366
 
8367
- #: lib/wordfenceClass.php:6171
8368
  msgid "Unable to automatically hide file"
8369
  msgstr ""
8370
 
8371
  #. translators: 2FA backup codes.
8372
- #: lib/wordfenceClass.php:6172
8373
  msgid "Use one of these %s codes to log in if you are unable to access your phone. Codes are 16 characters long, plus optional spaces. Each one may be used only once."
8374
  msgstr ""
8375
 
8376
  #. translators: 2FA backup codes.
8377
- #: lib/wordfenceClass.php:6173
8378
  msgid "Use one of these %s 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."
8379
  msgstr ""
8380
 
8381
- #: lib/wordfenceClass.php:6175
8382
  msgid "User ID"
8383
  msgstr ""
8384
 
8385
- #: lib/wordfenceClass.php:6177
8386
  msgid "WHOIS LOOKUP"
8387
  msgstr ""
8388
 
8389
- #: lib/wordfenceClass.php:6178
8390
  msgid "We are about to change your <em>.htaccess</em> file. Please make a backup of this file before proceeding."
8391
  msgstr ""
8392
 
8393
  #. translators: Error message.
8394
- #: lib/wordfenceClass.php:6179
8395
  msgid "We can't modify your .htaccess file for you because: %s"
8396
  msgstr ""
8397
 
8398
  #. translators: Error message.
8399
- #: lib/wordfenceClass.php:6180
8400
  msgid "We encountered a problem"
8401
  msgstr ""
8402
 
8403
  #. translators: URL.
8404
- #: lib/wordfenceClass.php:6181
8405
  msgid "Wordfence Firewall blocked a background request to WordPress for the URL %s. If this occurred as a result of an intentional action, you may consider allowlisting the request to allow it in the future."
8406
  msgstr ""
8407
 
8408
  #. translators: URL.
8409
- #: lib/wordfenceClass.php:6182
8410
  msgid "Wordfence is working..."
8411
  msgstr ""
8412
 
8413
- #: lib/wordfenceClass.php:6183
8414
  msgid "You are using Nginx as your web server. You'll need to disable autoindexing in your nginx.conf. See the <a target='_blank' rel='noopener noreferrer' href='http://nginx.org/en/docs/http/ngx_http_autoindex_module.html'>Nginx docs for more info</a> on how to do this."
8415
  msgstr ""
8416
 
8417
- #: lib/wordfenceClass.php:6184
8418
  msgid "You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually delete or hide those files."
8419
  msgstr ""
8420
 
8421
- #: lib/wordfenceClass.php:6185
8422
  msgid "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>"
8423
  msgstr ""
8424
 
8425
- #: lib/wordfenceClass.php:6186
8426
  msgid "You forgot to include a reason you're blocking this IP range. We ask you to include this for your own record keeping."
8427
  msgstr ""
8428
 
8429
- #: lib/wordfenceClass.php:6187
8430
  msgid "You have unsaved changes to your options. If you leave this page, those changes will be lost."
8431
  msgstr ""
8432
 
8433
- #: lib/wordfenceClass.php:6188
8434
  msgid "Your .htaccess has been updated successfully. Please verify your site is functioning normally."
8435
  msgstr ""
8436
 
8437
  #. translators: Email address.
8438
- #: lib/wordfenceClass.php:6189
8439
  msgid "Your Wordfence activity log was sent to %s"
8440
  msgstr ""
8441
 
8442
  #. translators: Email address.
8443
- #: lib/wordfenceClass.php:6190
8444
  msgid "Your rules have been updated successfully."
8445
  msgstr ""
8446
 
8447
- #: lib/wordfenceClass.php:6191
8448
  msgid "Your rules have been updated successfully. You are currently using the free version of Wordfence. Upgrade to Wordfence premium to have your rules updated automatically as new threats emerge. <a href=\"https://www.wordfence.com/wafUpdateRules1/wordfence-signup/\">Click here to purchase a premium license</a>. <em>Note: Your rules will still update every 30 days as a free user.</em>"
8449
  msgstr ""
8450
 
8451
  #. translators: wp_mail() return value.
8452
- #: lib/wordfenceClass.php:6192
8453
  msgid "Your test email was sent to the requested email address. The result we received from the WordPress wp_mail() function was: %s<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."
8454
  msgstr ""
8455
 
8456
  #. translators: wp_mail() return value.
8457
- #: lib/wordfenceClass.php:6193
8458
  msgid "blocked by firewall"
8459
  msgstr ""
8460
 
8461
  #. translators: Reason for firewall action.
8462
- #: lib/wordfenceClass.php:6194
8463
  msgid "blocked by firewall for %s"
8464
  msgstr ""
8465
 
8466
  #. translators: Reason for firewall action.
8467
- #: lib/wordfenceClass.php:6195
8468
  msgid "blocked by real-time IP blocklist"
8469
  msgstr ""
8470
 
8471
- #: lib/wordfenceClass.php:6196
8472
  msgid "blocked by the Wordfence Security Network"
8473
  msgstr ""
8474
 
8475
  #. translators: Reason for firewall action.
8476
- #: lib/wordfenceClass.php:6197
8477
  msgid "blocked for %s"
8478
  msgstr ""
8479
 
8480
  #. translators: Reason for firewall action.
8481
- #: lib/wordfenceClass.php:6198
8482
  msgid "locked out from logging in"
8483
  msgstr ""
8484
 
8485
- #: lib/wordfenceClass.php:6211
8486
  msgid "Wordfence generated an error on activation. The output we received during activation was:"
8487
  msgstr ""
8488
 
8489
- #: lib/wordfenceClass.php:6218
8490
  msgid "Wordfence could not register with the Wordfence scanning servers when it activated."
8491
  msgstr ""
8492
 
8493
- #: lib/wordfenceClass.php:6219
8494
  msgid "You can try to fix this by deactivating Wordfence and then activating it again, so Wordfence will retry registering for you. If you keep seeing this error, it usually means your WordPress server can't connect to our scanning servers, or your wfConfig database table cannot be created to save the key. You can try asking your host to allow your server to connect to noc1.wordfence.com or check the wfConfig database table and database privileges."
8495
  msgstr ""
8496
 
8497
- #: lib/wordfenceClass.php:6233
8498
  msgid "The Wordfence Web Application Firewall cannot run."
8499
  msgstr ""
8500
 
8501
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
8502
- #: lib/wordfenceClass.php:6236
8503
  msgid "The configuration files are corrupt or inaccessible by the web server, which is preventing the WAF from functioning. Please verify the web server has permission to access the configuration files. You may also try to rebuild the configuration file by <a href=\"%1$s\">clicking here</a>. It will automatically resume normal operation when it is fixed. <a class=\"wfhelp\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"%2$s\"></a>"
8504
  msgstr ""
8505
 
8506
- #: lib/wordfenceClass.php:6252
8507
- #: lib/wordfenceClass.php:6271
 
 
 
 
8508
  msgid "The Wordfence Web Application Firewall needs a configuration update."
8509
  msgstr ""
8510
 
8511
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
8512
- #: lib/wordfenceClass.php:6255
8513
  msgid "It is currently configured to use an older version of PHP and may become deactivated if PHP is updated. You may perform the configuration update automatically by <a href=\"%1$s\">clicking here</a>. <a class=\"wfhelp\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"%2$s\"></a>"
8514
  msgstr ""
8515
 
8516
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
8517
- #: lib/wordfenceClass.php:6274
8518
  msgid "It is not currently in extended protection mode but was configured to use an older version of PHP and may have become deactivated when PHP was updated. You may perform the configuration update automatically by <a href=\"%1$s\">clicking here</a> or use the \"Optimize the Wordfence Firewall\" button on the Firewall Options page. <a class=\"wfhelp\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"%2$s\"></a>"
8519
  msgstr ""
8520
 
8521
- #: lib/wordfenceClass.php:6280
8522
  msgid "The Wordfence Web Application Firewall is in read-only mode."
8523
  msgstr ""
8524
 
8525
- #: lib/wordfenceClass.php:6289
8526
  msgid "This site is currently using PHP's built in REMOTE_ADDR."
8527
  msgstr ""
8528
 
8529
- #: lib/wordfenceClass.php:6292
8530
  msgid "This site is currently using the X-Forwarded-For HTTP header, which should only be used when the site is behind a front-end proxy that outputs this header."
8531
  msgstr ""
8532
 
8533
- #: lib/wordfenceClass.php:6295
8534
  msgid "This site is currently using the X-Real-IP HTTP header, which should only be used when the site is behind a front-end proxy that outputs this header."
8535
  msgstr ""
8536
 
8537
- #: lib/wordfenceClass.php:6298
8538
  msgid "This site is currently using the Cloudflare \"CF-Connecting-IP\" HTTP header, which should only be used when the site is behind Cloudflare."
8539
  msgstr ""
8540
 
8541
- #: lib/wordfenceClass.php:6315
8542
  msgid "Your 'How does Wordfence get IPs' setting is misconfigured."
8543
  msgstr ""
8544
 
8545
- #: lib/wordfenceClass.php:6317
8546
  msgid "Click here to use the recommended setting"
8547
  msgstr ""
8548
 
8549
- #: lib/wordfenceClass.php:6319
8550
  #: views/onboarding/fresh-install.php:39
8551
  msgid "or"
8552
  msgstr ""
8553
 
8554
- #: lib/wordfenceClass.php:6321
8555
  msgid "visit the options page"
8556
  msgstr ""
8557
 
8558
- #: lib/wordfenceClass.php:6323
8559
  msgid "to manually update it."
8560
  msgstr ""
8561
 
8562
- #: lib/wordfenceClass.php:6331
8563
  msgid "Do you want Wordfence to stay up-to-date automatically?"
8564
  msgstr ""
8565
 
8566
- #: lib/wordfenceClass.php:6333
8567
  msgid "Yes, enable auto-update."
8568
  msgstr ""
8569
 
8570
- #: lib/wordfenceClass.php:6335
8571
  msgid "No thanks."
8572
  msgstr ""
8573
 
8574
  #. translators: Localized date.
8575
- #: lib/wordfenceClass.php:6418
8576
  msgid "The last rules update for the Wordfence Web Application Firewall was unsuccessful. The last successful update check was %s, so this site may be missing new rules added since then."
8577
  msgstr ""
8578
 
8579
  #. translators: 1. Localized date. 2. WordPress admin panel URL.
8580
- #: lib/wordfenceClass.php:6426
8581
  msgid "You may wait for the next automatic attempt at %1$s or try to <a href=\"%2$s\">Manually Update</a> by clicking the \"Manually Refresh Rules\" button below the Rules list."
8582
  msgstr ""
8583
 
8584
  #. translators: WordPress admin panel URL.
8585
- #: lib/wordfenceClass.php:6432
8586
  msgid "You may wait for the next automatic attempt or try to <a href=\"%s\">Manually Update</a> by clicking the \"Manually Refresh Rules\" button below the Rules list."
8587
  msgstr ""
8588
 
8589
  #. translators: WordPress admin panel URL.
8590
- #: lib/wordfenceClass.php:6437
8591
  msgid "You may wait for the next automatic attempt at %s or log into the parent site to manually update by clicking the \"Manually Refresh Rules\" button below the Rules list."
8592
  msgstr ""
8593
 
8594
- #: lib/wordfenceClass.php:6440
8595
  msgid "You may wait for the next automatic attempt or log into the parent site to manually update by clicking the \"Manually Refresh Rules\" button below the Rules list."
8596
  msgstr ""
8597
 
8598
- #: lib/wordfenceClass.php:6543
8599
  #: models/page/wfPage.php:101
8600
  msgid "Dashboard"
8601
  msgstr ""
8602
 
8603
  #. translators: Number of notifications.
8604
- #: lib/wordfenceClass.php:6623
8605
  msgid "You have %d new Wordfence notification."
8606
  msgid_plural "You have %d new Wordfence notifications."
8607
  msgstr[0] ""
8608
  msgstr[1] ""
8609
 
8610
- #: lib/wordfenceClass.php:6647
8611
  msgid "JavaScript Errors"
8612
  msgstr ""
8613
 
8614
- #: lib/wordfenceClass.php:6653
8615
  msgid "Malware URLs"
8616
  msgstr ""
8617
 
8618
  #. translators: WordPress admin panel URL.
8619
- #: lib/wordfenceClass.php:6771
8620
- #: lib/wordfenceClass.php:6834
8621
  msgid "<a href=\"%s\">Click here</a> to rebuild the configuration file."
8622
  msgstr ""
8623
 
8624
  #. translators: File path.
8625
- #: lib/wordfenceClass.php:6782
8626
- #: lib/wordfenceClass.php:6845
8627
  msgid "We were unable to write to %s which the WAF uses for storage. Please update permissions on the parent directory so the web server can write to it."
8628
  msgstr ""
8629
 
8630
- #: lib/wordfenceClass.php:6792
8631
- #: lib/wordfenceClass.php:6855
8632
  msgid "An error occured when fetching the WAF configuration from the database."
8633
  msgstr ""
8634
 
8635
  #. translators: Plugin name.
8636
- #: lib/wordfenceClass.php:6877
8637
  msgid "The Wordfence Live Traffic feature has been disabled because you have %s active which is not compatible with Wordfence Live Traffic."
8638
  msgstr ""
8639
 
8640
  #. translators: 1. Plugin name.
8641
- #: lib/wordfenceClass.php:6879
8642
  msgid "If you want to reenable Wordfence Live Traffic, you need to deactivate %1$s and then go to the Wordfence options page and reenable Live Traffic there. Wordfence does work with %1$s, however Live Traffic will be disabled and the Wordfence firewall will also count less hits per visitor because of the %1$s caching function. All other functions should work correctly."
8643
  msgstr ""
8644
 
8645
  #. translators: File path.
8646
- #: lib/wordfenceClass.php:6940
8647
  msgid "The file <code>%s</code> was restored successfully."
8648
  msgstr ""
8649
 
8650
- #: lib/wordfenceClass.php:6945
8651
  msgid "There was an error restoring the file."
8652
  msgstr ""
8653
 
8654
- #: lib/wordfenceClass.php:6955
8655
- #: lib/wordfenceClass.php:6978
8656
  msgid "Return to scan results"
8657
  msgstr ""
8658
 
8659
  #. translators: File path.
8660
- #: lib/wordfenceClass.php:6964
8661
  msgid "The file <code>%s</code> was deleted successfully."
8662
  msgstr ""
8663
 
8664
- #: lib/wordfenceClass.php:6968
8665
  msgid "There was an error deleting the file."
8666
  msgstr ""
8667
 
8668
  #. translators: IP address.
8669
- #: lib/wordfenceClass.php:7036
8670
  msgid ""
8671
  "User IP: %s\n"
8672
  ""
8673
  msgstr ""
8674
 
8675
  #. translators: Domain name.
8676
- #: lib/wordfenceClass.php:7039
8677
  msgid ""
8678
  "User hostname: %s\n"
8679
  ""
8680
  msgstr ""
8681
 
8682
- #: lib/wordfenceClass.php:7043
8683
  msgid "User location: "
8684
  msgstr ""
8685
 
8686
  #. translators: WordPress admin panel URL.
8687
- #: lib/wordfenceClass.php:7098
8688
  msgid "No longer an administrator for this site? Click here to stop receiving security alerts: %s"
8689
  msgstr ""
8690
 
8691
- #: lib/wordfenceClass.php:7138
8692
  msgid "The IP you provided must be in dotted quad notation or use ranges with square brackets. e.g. 10.11.12.13 or 10.11.12.[1-50]"
8693
  msgstr ""
8694
 
8695
- #: lib/wordfenceClass.php:7157
8696
- msgid "Invalid email address provided."
8697
  msgstr ""
8698
 
8699
- #: lib/wordfenceClass.php:7162
8700
  msgid "Test email sent successfully"
8701
  msgstr ""
8702
 
8703
- #: lib/wordfenceClass.php:7163
8704
- msgid "Test email failed to send."
8705
  msgstr ""
8706
 
8707
  #. translators: Localized date range.
8708
- #: lib/wordfenceClass.php:7181
8709
  msgid "Wordfence activity in the past %s"
8710
  msgstr ""
8711
 
8712
- #: lib/wordfenceClass.php:7221
8713
- #: lib/wordfenceClass.php:7225
8714
- #: lib/wordfenceClass.php:7256
8715
  msgid "We could not find that user in the database."
8716
  msgstr ""
8717
 
8718
- #: lib/wordfenceClass.php:7229
8719
  msgid "This user's email is the network admin email. It will need to be changed before deleting this user."
8720
  msgstr ""
8721
 
8722
- #: lib/wordfenceClass.php:7293
8723
  msgid "Wordfence could not find your .htaccess file."
8724
  msgstr ""
8725
 
8726
- #: lib/wordfenceClass.php:7309
8727
  msgid "Updating the .htaccess did not fix the issue. You may need to add <code>Options -Indexes</code> to your httpd.conf if using Apache, or find documentation on how to disable directory listing for your web server."
8728
  msgstr ""
8729
 
8730
- #: lib/wordfenceClass.php:7315
8731
  msgid "There was an error writing to your .htaccess file."
8732
  msgstr ""
8733
 
8734
- #: lib/wordfenceClass.php:7394
8735
  msgid "Required parameters not sent."
8736
  msgstr ""
8737
 
8738
- #: lib/wordfenceClass.php:7404
8739
  msgid "The WAF is currently in read-only mode and will not save any configuration changes."
8740
  msgstr ""
8741
 
8742
- #: lib/wordfenceClass.php:7442
8743
  #: views/waf/option-whitelist.php:60
8744
  msgid "Allowlisted via Firewall Options page"
8745
  msgstr ""
8746
 
8747
- #: lib/wordfenceClass.php:7729
8748
  msgid "Allowlisted via Live Traffic"
8749
  msgstr ""
8750
 
8751
- #: lib/wordfenceClass.php:7893
8752
- #: lib/wordfenceClass.php:7990
8753
  msgid "A valid server configuration was not provided."
8754
  msgstr ""
8755
 
8756
- #: lib/wordfenceClass.php:7904
8757
- #: lib/wordfenceClass.php:8011
8758
  msgid "Filesystem Credentials Required"
8759
  msgstr ""
8760
 
8761
  #. translators: Support URL.
8762
- #: lib/wordfenceClass.php:7906
8763
- #: lib/wordfenceClass.php:7930
8764
- #: lib/wordfenceClass.php:7974
8765
  msgid "If you cannot complete the setup process, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">click here for help</a>"
8766
  msgstr ""
8767
 
8768
  #. translators: Support URL.
8769
- #: lib/wordfenceClass.php:7907
8770
  msgid "Once you have entered credentials, click Continue to complete the setup."
8771
  msgstr ""
8772
 
8773
- #: lib/wordfenceClass.php:7928
8774
- #: lib/wordfenceClass.php:8036
8775
  msgid "Filesystem Permission Error"
8776
  msgstr ""
8777
 
8778
- #: lib/wordfenceClass.php:7954
8779
  msgid "Manual Installation Instructions"
8780
  msgstr ""
8781
 
8782
- #: lib/wordfenceClass.php:7961
8783
  msgid "Installation Successful"
8784
  msgstr ""
8785
 
8786
- #: lib/wordfenceClass.php:7972
8787
  msgid "Installation Failed"
8788
  msgstr ""
8789
 
8790
  #. translators: Support URL.
8791
- #: lib/wordfenceClass.php:8013
8792
- #: lib/wordfenceClass.php:8038
8793
- #: lib/wordfenceClass.php:8069
8794
- #: lib/wordfenceClass.php:8098
8795
- #: lib/wordfenceClass.php:8144
8796
  #: views/waf/waf-uninstall.php:13
8797
  msgid "If you cannot complete the uninstall process, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">click here for help</a>"
8798
  msgstr ""
8799
 
8800
  #. translators: Support URL.
8801
- #: lib/wordfenceClass.php:8014
8802
  msgid "Once you have entered credentials, click Continue to complete uninstallation."
8803
  msgstr ""
8804
 
8805
- #: lib/wordfenceClass.php:8058
8806
  msgid "The <code>auto_prepend_file</code> setting has been successfully removed from <code>.htaccess</code> and <code>.user.ini</code>. Once this change takes effect, Extended Protection Mode will be disabled."
8807
  msgstr ""
8808
 
8809
- #: lib/wordfenceClass.php:8060
8810
  msgid "Any previous value for <code>auto_prepend_file</code> will need to be re-enabled manually if still needed."
8811
  msgstr ""
8812
 
8813
  #. translators: Time until.
8814
- #: lib/wordfenceClass.php:8064
8815
  msgid "Waiting for it to take effect. This may take up to %s."
8816
  msgstr ""
8817
 
8818
- #: lib/wordfenceClass.php:8067
8819
  msgid "Waiting for Changes"
8820
  msgstr ""
8821
 
8822
- #: lib/wordfenceClass.php:8089
8823
  msgid "Extended Protection Mode has not been disabled. This may be because <code>auto_prepend_file</code> is configured somewhere else or the value is still cached by PHP."
8824
  msgstr ""
8825
 
8826
- #: lib/wordfenceClass.php:8091
8827
  msgid "Retrying Failed."
8828
  msgstr ""
8829
 
8830
- #: lib/wordfenceClass.php:8093
8831
  msgid "Try Again"
8832
  msgstr ""
8833
 
8834
- #: lib/wordfenceClass.php:8096
8835
  msgid "Unable to Uninstall"
8836
  msgstr ""
8837
 
8838
- #: lib/wordfenceClass.php:8132
8839
  msgid "Uninstallation Complete"
8840
  msgstr ""
8841
 
8842
- #: lib/wordfenceClass.php:8142
8843
  msgid "Uninstallation Failed"
8844
  msgstr ""
8845
 
8846
  #. translators: 1. Number of attacks/blocks. 2. Time since.
8847
- #: lib/wordfenceClass.php:8285
8848
  msgid "The Wordfence Web Application Firewall has blocked %1$d attacks over the last %2$s. Below is a sample of these recent attacks:"
8849
  msgstr ""
8850
 
8851
- #: lib/wordfenceClass.php:8818
8852
  msgid "To make your site as secure as possible, take a moment to optimize the Wordfence Web Application Firewall:"
8853
  msgstr ""
8854
 
8855
- #: lib/wordfenceClass.php:8818
8856
  msgid "Click here to configure"
8857
  msgstr ""
8858
 
8859
  #. translators: Support URL.
8860
- #: lib/wordfenceClass.php:8821
8861
  msgid "If you cannot complete the setup process, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">click here for help</a>."
8862
  msgstr ""
8863
 
8864
- #: lib/wordfenceClass.php:8827
8865
  #: views/waf/waf-install-success.php:14
8866
  msgid "Nice work! The firewall is now optimized."
8867
  msgstr ""
8868
 
8869
- #: lib/wordfenceClass.php:8829
8870
- #: lib/wordfenceClass.php:8841
8871
  #: views/waf/waf-install-success.php:16
8872
  #: views/waf/waf-uninstall-success.php:19
8873
  msgid "The changes have not yet taken effect. If you are using LiteSpeed or IIS as your web server or CGI/FastCGI interface, you may need to wait a few minutes for the changes to take effect since the configuration files are sometimes cached. You also may need to select a different server configuration in order to complete this step, but wait for a few minutes before trying. You can try refreshing this page."
8874
  msgstr ""
8875
 
8876
- #: lib/wordfenceClass.php:8835
8877
  #: views/waf/waf-uninstall-success.php:15
8878
  msgid "Uninstallation was successful!"
8879
  msgstr ""
8880
 
8881
- #: lib/wordfenceClass.php:8838
8882
  #: views/waf/waf-uninstall-success.php:17
8883
  msgid "Uninstallation from this site was successful! The Wordfence Firewall is still active because it is installed in another WordPress installation."
8884
  msgstr ""
8885
 
8886
- #: lib/wordfenceClass.php:8846
8887
  msgid "The update was successful!"
8888
  msgstr ""
8889
 
8890
- #: lib/wordfenceClass.php:8982
8891
  msgid "Auth grant is invalid."
8892
  msgstr ""
8893
 
8894
- #: lib/wordfenceClass.php:9045
8895
- #: lib/wordfenceClass.php:9182
8896
  msgid "Access token not found."
8897
  msgstr ""
8898
 
8899
- #: lib/wordfenceClass.php:9090
8900
- #: lib/wordfenceClass.php:9157
8901
  msgid "Invalid response from Wordfence Central."
8902
  msgstr ""
8903
 
8904
- #: lib/wordfenceClass.php:9133
8905
  msgid "Auth grant not found."
8906
  msgstr ""
8907
 
8908
- #: lib/wordfenceClass.php:9399
8909
  msgid "We were unable to create the <code>wordfence-waf.php</code> file in the root of the WordPress installation. It's possible WordPress cannot write to the <code>wordfence-waf.php</code> file because of file permissions. Please verify the permissions are correct and retry the installation."
8910
  msgstr ""
8911
 
8912
- #: lib/wordfenceClass.php:9491
8913
- #: lib/wordfenceClass.php:9562
8914
  msgid "We were unable to make changes to the .htaccess file. It's possible WordPress cannot write to the .htaccess file because of file permissions, which may have been set by another security plugin, or you may have set them manually. Please verify the permissions allow the web server to write to the file, and retry the installation."
8915
  msgstr ""
8916
 
8917
  #. translators: File path.
8918
- #: lib/wordfenceClass.php:9532
8919
- #: lib/wordfenceClass.php:9580
8920
  msgid "We were unable to make changes to the %1$s file. It's possible WordPress cannot write to the %1$s file because of file permissions. Please verify the permissions are correct and retry the installation."
8921
  msgstr ""
8922
 
8923
- #: lib/wordfenceClass.php:9596
8924
  msgid "We were unable to remove the <code>wordfence-waf.php</code> file in the root of the WordPress installation. It's possible WordPress cannot remove the <code>wordfence-waf.php</code> file because of file permissions. Please verify the permissions are correct and retry the removal."
8925
  msgstr ""
8926
 
@@ -10400,7 +10409,7 @@ msgid "This email was sent from your website <a href=\"%1$s\">%1$s</a> and is a
10400
  msgstr ""
10401
 
10402
  #: views/reports/activity-report-email-inline.php:134
10403
- msgid "NOTE: You are using the free version of Wordfence and are missing out on features like cellphone sign-in, country blocking and detecting if your site IP is sending spam. <a href=\"http://www.wordfence.com/zz6/\">Click here to upgrade to Wordfence Premium now</a>."
10404
  msgstr ""
10405
 
10406
  #: views/reports/activity-report-email-inline.php:138
2
  # This file is distributed under the same license as the Wordfence Security plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Wordfence Security 7.5.2\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wordfence\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2021-04-05T20:09:14+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.4.0\n"
15
  "X-Domain: wordfence\n"
57
  #: lib/dashboard/widget_content_logins.php:7
58
  #: lib/dashboard/widget_ips.php:115
59
  #: lib/dashboard/widget_logins.php:96
60
+ #: lib/wordfenceClass.php:6105
61
  #: views/reports/activity-report-email-inline.php:146
62
  #: views/reports/activity-report.php:16
63
  #: views/waf/option-whitelist.php:110
68
 
69
  #: lib/dashboard/widget_content_logins.php:6
70
  #: lib/dashboard/widget_logins.php:95
71
+ #: lib/wordfenceClass.php:6180
72
  #: views/reports/activity-report-email-inline.php:256
73
  #: views/reports/activity-report.php:106
74
  msgid "Username"
91
 
92
  #: lib/dashboard/widget_countries.php:25
93
  #: lib/dashboard/widget_networkattacks.php:8
94
+ #: lib/wfDiagnostic.php:784
95
  msgid "Wordfence Network"
96
  msgstr ""
97
 
133
  #. translators: WordPress username.
134
  #: lib/dashboard/widget_ips.php:96
135
  #: lib/dashboard/widget_logins.php:77
136
+ #: lib/wordfenceClass.php:6051
137
  msgid "An error occurred"
138
  msgstr ""
139
 
224
  msgstr ""
225
 
226
  #: lib/dashboard/widget_notifications.php:8
227
+ #: lib/wordfenceClass.php:6654
228
  msgid "Notifications"
229
  msgstr ""
230
 
299
  #: lib/menu_tools_diagnostic.php:981
300
  #: lib/menu_tools_twoFactor.php:235
301
  #: lib/menu_tools_twoFactor.php:273
302
+ #: lib/wordfenceClass.php:7944
303
+ #: lib/wordfenceClass.php:7988
304
+ #: lib/wordfenceClass.php:8052
305
+ #: lib/wordfenceClass.php:8112
306
+ #: lib/wordfenceClass.php:8158
307
  #: views/blocking/block-list.php:501
308
  #: views/blocking/blocking-create.php:212
309
  #: views/dashboard/options-group-license.php:150
545
  msgid "Update includes security-related fixes."
546
  msgstr ""
547
 
548
+ #: lib/email_newIssues.php:126
549
  msgid "The malicious URL matched"
550
  msgstr ""
551
 
552
  #. translators: Number of scan results
553
+ #: lib/email_newIssues.php:135
554
  msgid "%d existing issue was found again and is not shown."
555
  msgid_plural "%d existing issues were found again and are not shown."
556
  msgstr[0] ""
557
  msgstr[1] ""
558
 
559
  #. translators: Number of scan results
560
+ #: lib/email_newIssues.php:138
561
  msgid "%d issue was omitted from this email due to length limits."
562
  msgid_plural "%d issues were omitted from this email due to length limits."
563
  msgstr[0] ""
564
  msgstr[1] ""
565
 
566
  #. translators: Number of scan results
567
+ #: lib/email_newIssues.php:139
568
  msgid "View every issue:"
569
  msgstr ""
570
 
571
+ #: lib/email_newIssues.php:148
572
  msgid "NOTE: You are using the free version of Wordfence. Upgrade today:"
573
  msgstr ""
574
 
575
+ #: lib/email_newIssues.php:151
576
  msgid "Receive real-time Firewall and Scan engine rule updates for protection as threats emerge"
577
  msgstr ""
578
 
579
+ #: lib/email_newIssues.php:152
580
  msgid "Real-time IP Blocklist blocks the most malicious IPs from accessing your site"
581
  msgstr ""
582
 
583
+ #: lib/email_newIssues.php:153
584
  msgid "Country blocking"
585
  msgstr ""
586
 
587
+ #: lib/email_newIssues.php:154
588
  msgid "IP reputation monitoring"
589
  msgstr ""
590
 
591
+ #: lib/email_newIssues.php:155
592
  msgid "Schedule scans to run more frequently and at optimal times"
593
  msgstr ""
594
 
595
+ #: lib/email_newIssues.php:156
596
  msgid "Access to Premium Support"
597
  msgstr ""
598
 
599
+ #: lib/email_newIssues.php:157
600
  msgid "Discounts for multi-year and multi-license purchases"
601
  msgstr ""
602
 
603
+ #: lib/email_newIssues.php:160
604
  msgid "Click here to upgrade to Wordfence Premium:"
605
  msgstr ""
606
 
717
  msgstr ""
718
 
719
  #: lib/menu_dashboard.php:24
720
+ #: lib/wordfenceClass.php:6556
721
  msgid "Wordfence Dashboard"
722
  msgstr ""
723
 
729
  #: lib/menu_dashboard_options.php:98
730
  #: lib/menu_firewall.php:20
731
  #: lib/menu_firewall.php:30
732
+ #: lib/wordfenceClass.php:6560
733
  #: models/page/wfPage.php:105
734
  msgid "Firewall"
735
  msgstr ""
766
  #: lib/menu_dashboard_options.php:115
767
  #: lib/menu_scanner.php:31
768
  #: lib/menu_scanner.php:305
769
+ #: lib/wordfenceClass.php:6567
770
  #: models/page/wfPage.php:113
771
  msgid "Scan"
772
  msgstr ""
930
  msgstr ""
931
 
932
  #: lib/menu_dashboard.php:220
933
+ #: lib/wordfenceClass.php:6571
934
  msgid "Tools"
935
  msgstr ""
936
 
942
  #: lib/menu_firewall_waf.php:157
943
  #: lib/menu_scanner.php:139
944
  #: lib/menu_support.php:19
945
+ #: lib/wordfenceClass.php:6584
946
  msgid "Help"
947
  msgstr ""
948
 
1160
  #: lib/menu_firewall.php:41
1161
  #: lib/menu_firewall_blocking.php:119
1162
  #: lib/menu_firewall_waf.php:142
1163
+ #: lib/wordfenceClass.php:6562
1164
  #: models/page/wfPage.php:109
1165
  msgid "Blocking"
1166
  msgstr ""
1348
  #: lib/menu_tools_diagnostic.php:300
1349
  #: lib/menu_tools_diagnostic.php:301
1350
  #: lib/menu_tools_diagnostic.php:304
1351
+ #: lib/wordfenceClass.php:6077
1352
  #: models/firewall/wfFirewall.php:41
1353
  #: views/diagnostics/text.php:154
1354
  #: views/diagnostics/text.php:159
1469
 
1470
  #: lib/menu_options.php:24
1471
  #: lib/menu_options.php:262
1472
+ #: lib/wordfenceClass.php:6579
1473
  msgid "All Options"
1474
  msgstr ""
1475
 
2108
  msgstr ""
2109
 
2110
  #: lib/menu_scanner.php:80
2111
+ #: lib/wordfenceClass.php:6595
2112
  msgid "Protect More Sites"
2113
  msgstr ""
2114
 
2191
  #: lib/menu_tools_twoFactor.php:255
2192
  #: lib/menu_tools_twoFactor.php:264
2193
  #: lib/menu_tools_twoFactor.php:284
2194
+ #: lib/wordfenceClass.php:4927
2195
+ #: lib/wordfenceClass.php:4933
2196
+ #: lib/wordfenceClass.php:4939
2197
+ #: lib/wordfenceClass.php:4946
2198
+ #: lib/wordfenceClass.php:4952
2199
+ #: lib/wordfenceClass.php:4959
2200
+ #: lib/wordfenceClass.php:4967
2201
+ #: lib/wordfenceClass.php:6019
2202
+ #: lib/wordfenceClass.php:6021
2203
+ #: lib/wordfenceClass.php:6072
2204
+ #: lib/wordfenceClass.php:7969
2205
+ #: lib/wordfenceClass.php:7976
2206
+ #: lib/wordfenceClass.php:8083
2207
+ #: lib/wordfenceClass.php:8147
2208
  #: views/dashboard/options-group-import.php:147
2209
  #: views/dashboard/options-group-import.php:157
2210
  #: views/dashboard/options-group-import.php:177
2460
  #: lib/menu_tools_diagnostic.php:318
2461
  #: lib/menu_tools_diagnostic.php:319
2462
  #: lib/menu_tools_diagnostic.php:329
2463
+ #: lib/wfDiagnostic.php:368
2464
  #: views/diagnostics/text.php:86
2465
  #: views/diagnostics/text.php:127
2466
  #: views/diagnostics/text.php:128
2524
  #: lib/menu_tools_diagnostic.php:319
2525
  #: lib/menu_tools_diagnostic.php:323
2526
  #: lib/menu_tools_livetraffic.php:152
2527
+ #: lib/wfDiagnostic.php:358
2528
+ #: lib/wfDiagnostic.php:380
2529
  #: views/diagnostics/text.php:124
2530
  #: views/diagnostics/text.php:135
2531
  #: views/diagnostics/text.php:137
2565
  #: lib/menu_tools_diagnostic.php:319
2566
  #: lib/menu_tools_diagnostic.php:323
2567
  #: lib/menu_tools_livetraffic.php:153
2568
+ #: lib/wfDiagnostic.php:358
2569
+ #: lib/wfDiagnostic.php:380
2570
  #: views/diagnostics/text.php:124
2571
  #: views/diagnostics/text.php:151
2572
  #: views/diagnostics/text.php:164
2601
  #: lib/menu_tools_diagnostic.php:267
2602
  #: lib/menu_tools_diagnostic.php:270
2603
  #: lib/menu_tools_diagnostic.php:271
2604
+ #: lib/wfDiagnostic.php:581
2605
  #: views/diagnostics/text.php:126
2606
  #: views/diagnostics/text.php:129
2607
  #: views/diagnostics/text.php:130
2613
  #: lib/menu_tools_diagnostic.php:267
2614
  #: lib/menu_tools_diagnostic.php:270
2615
  #: lib/menu_tools_diagnostic.php:271
2616
+ #: lib/wfDiagnostic.php:581
2617
  #: views/diagnostics/text.php:126
2618
  #: views/diagnostics/text.php:129
2619
  #: views/diagnostics/text.php:130
2746
 
2747
  #: lib/menu_tools_diagnostic.php:285
2748
  #: lib/menu_tools_diagnostic.php:312
2749
+ #: lib/wfDiagnostic.php:203
2750
+ #: lib/wfDiagnostic.php:365
2751
+ #: lib/wfDiagnostic.php:416
2752
  #: views/diagnostics/text.php:144
2753
  #: views/diagnostics/text.php:171
2754
  #: views/scanner/issue-base.php:116
2857
  msgstr ""
2858
 
2859
  #: lib/menu_tools_diagnostic.php:303
2860
+ #: lib/wordfenceClass.php:4246
2861
  #: views/diagnostics/text.php:162
2862
  msgid "Never"
2863
  msgstr ""
3144
 
3145
  #: lib/menu_tools_diagnostic.php:731
3146
  #: lib/menu_tools_diagnostic.php:770
3147
+ #: lib/wordfenceClass.php:6080
3148
  msgid "Download"
3149
  msgstr ""
3150
 
3174
  msgstr ""
3175
 
3176
  #: lib/menu_tools_diagnostic.php:810
3177
+ #: lib/wordfenceClass.php:3951
3178
  #: views/diagnostics/text.php:584
3179
  msgid "No New Issues"
3180
  msgstr ""
3244
  msgstr ""
3245
 
3246
  #: lib/menu_tools_diagnostic.php:960
3247
+ #: lib/wordfenceClass.php:6141
3248
  msgid "Restore Defaults"
3249
  msgstr ""
3250
 
3251
  #: lib/menu_tools_diagnostic.php:961
3252
+ #: lib/wordfenceClass.php:6066
3253
  msgid "Cancel Changes"
3254
  msgstr ""
3255
 
3256
  #: lib/menu_tools_diagnostic.php:962
3257
+ #: lib/wordfenceClass.php:6144
3258
  msgid "Save Changes"
3259
  msgstr ""
3260
 
3287
  #: lib/menu_tools_livetraffic.php:41
3288
  #: lib/menu_tools_livetraffic.php:571
3289
  #: lib/menu_tools_livetraffic.php:602
3290
+ #: lib/wordfenceClass.php:6573
3291
  #: models/page/wfPage.php:119
3292
  msgid "Live Traffic"
3293
  msgstr ""
3334
  #: lib/menu_tools_livetraffic.php:100
3335
  #: lib/menu_tools_livetraffic.php:227
3336
  #: lib/menu_tools_livetraffic.php:458
3337
+ #: lib/wordfenceClass.php:6103
3338
  msgid "Human"
3339
  msgstr ""
3340
 
3341
  #: lib/menu_tools_livetraffic.php:101
3342
  #: lib/menu_tools_livetraffic.php:228
3343
  #: lib/menu_tools_livetraffic.php:458
3344
+ #: lib/wordfenceClass.php:6065
3345
  msgid "Bot"
3346
  msgstr ""
3347
 
3350
  msgstr ""
3351
 
3352
  #: lib/menu_tools_livetraffic.php:103
3353
+ #: lib/wfDiagnostic.php:751
3354
+ #: lib/wordfenceClass.php:6057
3355
  msgid "Blocked"
3356
  msgstr ""
3357
 
3444
  msgstr ""
3445
 
3446
  #: lib/menu_tools_livetraffic.php:286
3447
+ #: lib/wordfenceClass.php:6172
3448
  msgid "Type"
3449
  msgstr ""
3450
 
3467
  msgstr ""
3468
 
3469
  #: lib/menu_tools_livetraffic.php:291
3470
+ #: lib/wordfenceClass.php:4228
3471
  #: views/blocking/blocking-create.php:193
3472
  msgid "Hostname"
3473
  msgstr ""
3834
  msgstr ""
3835
 
3836
  #: lib/menu_tools_whois.php:95
3837
+ #: lib/wordfenceClass.php:6085
3838
  msgid "Enter a valid IP or domain"
3839
  msgstr ""
3840
 
3841
  #: lib/menu_tools_whois.php:95
3842
+ #: lib/wordfenceClass.php:6128
3843
  msgid "Please enter a valid IP address or domain name for your whois lookup."
3844
  msgstr ""
3845
 
3846
  #: lib/menu_tools_whois.php:99
3847
+ #: lib/wordfenceClass.php:6109
3848
  msgid "Loading..."
3849
  msgstr ""
3850
 
3851
  #: lib/menu_tools_whois.php:104
3852
+ #: lib/wordfenceClass.php:6115
3853
  msgid "Look up IP or Domain"
3854
  msgstr ""
3855
 
3879
 
3880
  #: lib/menu_wordfence_central.php:44
3881
  #: lib/menu_wordfence_central.php:57
3882
+ #: lib/wordfenceClass.php:6589
3883
  msgid "Wordfence Central"
3884
  msgstr ""
3885
 
3962
  #. translators: Error message.
3963
  #: lib/rest-api/wfRESTConfigController.php:215
3964
  #: lib/rest-api/wfRESTConfigController.php:258
3965
+ #: lib/wordfenceClass.php:4512
3966
  msgid "An error occurred while saving the configuration: %s"
3967
  msgstr ""
3968
 
3969
  #. translators: Error message.
3970
  #: lib/rest-api/wfRESTConfigController.php:226
3971
  #: lib/rest-api/wfRESTConfigController.php:269
3972
+ #: lib/wordfenceClass.php:4521
3973
  msgid "Errors occurred while saving the configuration: %s"
3974
  msgstr ""
3975
 
3976
  #: lib/rest-api/wfRESTConfigController.php:231
3977
  #: lib/rest-api/wfRESTConfigController.php:274
3978
+ #: lib/wordfenceClass.php:4526
3979
  msgid "Errors occurred while saving the configuration."
3980
  msgstr ""
3981
 
4093
  msgstr ""
4094
 
4095
  #: lib/wfActivityReport.php:584
4096
+ #: lib/wordfenceClass.php:8322
4097
  msgid "Blocked because the IP is blocklisted"
4098
  msgstr ""
4099
 
4100
  #. translators: Reason for firewall action.
4101
  #: lib/wfActivityReport.php:587
4102
+ #: lib/wordfenceClass.php:8325
4103
  msgid "Blocked for %s"
4104
  msgstr ""
4105
 
4106
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4107
  #: lib/wfActivityReport.php:599
4108
+ #: lib/wordfenceClass.php:8339
4109
  msgid "Blocked for %1$s in query string: %2$s = %3$s"
4110
  msgstr ""
4111
 
4112
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4113
  #: lib/wfActivityReport.php:602
4114
+ #: lib/wordfenceClass.php:8344
4115
  msgid "Blocked for %1$s in POST body: %2$s = %3$s"
4116
  msgstr ""
4117
 
4118
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4119
  #: lib/wfActivityReport.php:605
4120
+ #: lib/wordfenceClass.php:8349
4121
  msgid "Blocked for %1$s in cookie: %2$s = %3$s"
4122
  msgstr ""
4123
 
4124
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4125
  #: lib/wfActivityReport.php:608
4126
+ #: lib/wordfenceClass.php:8354
4127
  msgid "Blocked for %1$s in file: %2$s = %3$s"
4128
  msgstr ""
4129
 
4130
  #: lib/wfActivityReport.php:752
4131
+ #: lib/wfDiagnostic.php:483
4132
  #: models/block/wfBlock.php:95
4133
  msgid "Unknown"
4134
  msgstr ""
4135
 
4136
  #: lib/wfAdminNoticeQueue.php:180
4137
+ #: lib/wordfenceClass.php:6078
4138
+ #: lib/wordfenceClass.php:6333
4139
+ #: lib/wordfenceClass.php:8874
4140
  msgid "Dismiss"
4141
  msgstr ""
4142
 
5363
  msgstr ""
5364
 
5365
  #: lib/wfConfig.php:1174
5366
+ #: lib/wordfenceClass.php:7432
5367
  msgid "The grace period end time must be in the future."
5368
  msgstr ""
5369
 
5401
  msgstr ""
5402
 
5403
  #: lib/wfConfig.php:1300
5404
+ #: lib/wordfenceClass.php:4397
5405
  msgid "The license key entered is not in a valid format. It must contain only numbers and the letters A-F."
5406
  msgstr ""
5407
 
5495
  msgstr ""
5496
 
5497
  #: lib/wfDiagnostic.php:85
5498
+ msgid "Configured WAF storage engine (WFWAF_STORAGE_ENGINE)"
5499
  msgstr ""
5500
 
5501
  #: lib/wfDiagnostic.php:86
5502
+ msgid "Active WAF storage engine"
5503
  msgstr ""
5504
 
5505
  #: lib/wfDiagnostic.php:87
5506
+ msgid "WAF log path"
5507
  msgstr ""
5508
 
5509
  #: lib/wfDiagnostic.php:88
5510
+ msgid "WAF subdirectory installation"
5511
  msgstr ""
5512
 
5513
  #: lib/wfDiagnostic.php:89
5514
+ msgid "wordfence-waf.php path"
5515
  msgstr ""
5516
 
5517
  #: lib/wfDiagnostic.php:90
5518
+ msgid "WAF File Permissions"
5519
+ msgstr ""
5520
+
5521
+ #: lib/wfDiagnostic.php:91
5522
  msgid "Recently removed wflogs files"
5523
  msgstr ""
5524
 
5525
+ #: lib/wfDiagnostic.php:95
5526
  msgid "Database version and privileges."
5527
  msgstr ""
5528
 
5529
+ #: lib/wfDiagnostic.php:97
5530
  msgid "Database Version"
5531
  msgstr ""
5532
 
5533
+ #: lib/wfDiagnostic.php:98
5534
  msgid "Checking if MySQL user has <code>DELETE</code> privilege"
5535
  msgstr ""
5536
 
5537
+ #: lib/wfDiagnostic.php:99
5538
  msgid "Checking if MySQL user has <code>INSERT</code> privilege"
5539
  msgstr ""
5540
 
5541
+ #: lib/wfDiagnostic.php:100
5542
  msgid "Checking if MySQL user has <code>UPDATE</code> privilege"
5543
  msgstr ""
5544
 
5545
+ #: lib/wfDiagnostic.php:101
5546
  msgid "Checking if MySQL user has <code>SELECT</code> privilege"
5547
  msgstr ""
5548
 
5549
+ #: lib/wfDiagnostic.php:102
5550
  msgid "Checking if MySQL user has <code>CREATE TABLE</code> privilege"
5551
  msgstr ""
5552
 
5553
+ #: lib/wfDiagnostic.php:103
5554
  msgid "Checking if MySQL user has <code>ALTER TABLE</code> privilege"
5555
  msgstr ""
5556
 
5557
+ #: lib/wfDiagnostic.php:104
5558
  msgid "Checking if MySQL user has <code>DROP</code> privilege"
5559
  msgstr ""
5560
 
5561
+ #: lib/wfDiagnostic.php:105
5562
  msgid "Checking if MySQL user has <code>TRUNCATE</code> privilege"
5563
  msgstr ""
5564
 
5565
+ #: lib/wfDiagnostic.php:109
5566
  msgid "PHP version, important PHP extensions."
5567
  msgstr ""
5568
 
5569
  #. translators: Support URL.
5570
+ #: lib/wfDiagnostic.php:111
5571
  msgid "PHP version >= PHP 5.6.20<br><em> (<a href=\"https://wordpress.org/about/requirements/\" target=\"_blank\" rel=\"noopener noreferrer\">Minimum version required by WordPress</a>)</em> <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"wfhelp\"></a>"
5572
  msgstr ""
5573
 
5574
  #. translators: Support URL.
5575
+ #: lib/wfDiagnostic.php:112
5576
  msgid "Process Owner"
5577
  msgstr ""
5578
 
5579
+ #: lib/wfDiagnostic.php:113
5580
  msgid "Checking for OpenSSL support"
5581
  msgstr ""
5582
 
5583
+ #: lib/wfDiagnostic.php:114
5584
  msgid "Checking OpenSSL version"
5585
  msgstr ""
5586
 
5587
+ #: lib/wfDiagnostic.php:115
5588
  msgid "Checking for cURL support"
5589
  msgstr ""
5590
 
5591
+ #: lib/wfDiagnostic.php:116
5592
  msgid "cURL Features Code"
5593
  msgstr ""
5594
 
5595
+ #: lib/wfDiagnostic.php:117
5596
  msgid "cURL Host"
5597
  msgstr ""
5598
 
5599
+ #: lib/wfDiagnostic.php:118
5600
  msgid "cURL Support Protocols"
5601
  msgstr ""
5602
 
5603
+ #: lib/wfDiagnostic.php:119
5604
  msgid "cURL SSL Version"
5605
  msgstr ""
5606
 
5607
+ #: lib/wfDiagnostic.php:120
5608
  msgid "cURL libz Version"
5609
  msgstr ""
5610
 
5611
+ #: lib/wfDiagnostic.php:121
5612
  msgid "Checking <code>display_errors</code><br><em> (<a href=\"http://php.net/manual/en/errorfunc.configuration.php#ini.display-errors\" target=\"_blank\" rel=\"noopener noreferrer\">Should be disabled on production servers</a>)</em>"
5613
  msgstr ""
5614
 
5615
+ #: lib/wfDiagnostic.php:125
5616
  msgid "Ability to connect to the Wordfence servers and your own site."
5617
  msgstr ""
5618
 
5619
+ #: lib/wfDiagnostic.php:127
5620
  msgid "Connecting to Wordfence servers (http)"
5621
  msgstr ""
5622
 
5623
+ #: lib/wfDiagnostic.php:128
5624
  msgid "Connecting to Wordfence servers (https)"
5625
  msgstr ""
5626
 
5627
+ #: lib/wfDiagnostic.php:129
5628
  msgid "Connecting back to this site"
5629
  msgstr ""
5630
 
5631
+ #: lib/wfDiagnostic.php:130
5632
  msgid "IP(s) used by this server"
5633
  msgstr ""
5634
 
5635
+ #: lib/wfDiagnostic.php:134
5636
  msgid "Server time accuracy and applied offsets."
5637
  msgstr ""
5638
 
5639
+ #: lib/wfDiagnostic.php:136
5640
  msgid "Wordfence Network Time"
5641
  msgstr ""
5642
 
5643
+ #: lib/wfDiagnostic.php:137
5644
+ #: lib/wfDiagnostic.php:791
5645
  msgid "Server Time"
5646
  msgstr ""
5647
 
5648
+ #: lib/wfDiagnostic.php:138
5649
  msgid "Wordfence Network Time Offset"
5650
  msgstr ""
5651
 
5652
+ #: lib/wfDiagnostic.php:139
5653
  msgid "NTP Time Offset"
5654
  msgstr ""
5655
 
5656
+ #: lib/wfDiagnostic.php:140
5657
  msgid "TOTP Time Source"
5658
  msgstr ""
5659
 
5660
+ #: lib/wfDiagnostic.php:141
5661
  msgid "WordPress Time Zone"
5662
  msgstr ""
5663
 
5664
  #. translators: Number of jobs.
5665
+ #: lib/wfDiagnostic.php:198
5666
  msgid "%d Job Overdue"
5667
  msgid_plural "%d Jobs Overdue"
5668
  msgstr[0] ""
5669
  msgstr[1] ""
5670
 
5671
  #. translators: Number of jobs.
5672
+ #: lib/wfDiagnostic.php:198
5673
  msgid "Normal"
5674
  msgstr ""
5675
 
5676
+ #: lib/wfDiagnostic.php:217
5677
+ #: lib/wfDiagnostic.php:220
5678
  msgid "No files readable"
5679
  msgstr ""
5680
 
5681
  #. translators: File name.
5682
+ #: lib/wfDiagnostic.php:232
5683
+ #: lib/wfDiagnostic.php:268
5684
  msgid "File \"%s\" does not exist"
5685
  msgstr ""
5686
 
5687
  #. translators: File path.
5688
+ #: lib/wfDiagnostic.php:235
5689
  msgid "File \"%s\" is unreadable"
5690
  msgstr ""
5691
 
5692
+ #: lib/wfDiagnostic.php:253
5693
+ #: lib/wfDiagnostic.php:256
5694
  msgid "No files writable"
5695
  msgstr ""
5696
 
5697
  #. translators: File name.
5698
+ #: lib/wfDiagnostic.php:271
5699
  msgid "File \"%s\" is unwritable"
5700
  msgstr ""
5701
 
5702
+ #: lib/wfDiagnostic.php:341
5703
  msgid "Basic config writing"
5704
  msgstr ""
5705
 
5706
+ #: lib/wfDiagnostic.php:353
5707
  msgid "Serialized config writing"
5708
  msgstr ""
5709
 
5710
+ #: lib/wfDiagnostic.php:361
5711
  msgid "(default)"
5712
  msgstr ""
5713
 
5714
  #. translators: Unix file permissions in octal (example 0777).
5715
+ #: lib/wfDiagnostic.php:393
5716
  msgid "%s - using constant"
5717
  msgstr ""
5718
 
5719
  #. translators: Unix file permissions in octal (example 0777).
5720
+ #: lib/wfDiagnostic.php:406
5721
  msgid "%s - using template"
5722
  msgstr ""
5723
 
5724
+ #: lib/wfDiagnostic.php:410
5725
  msgid "0660 - using default"
5726
  msgstr ""
5727
 
5728
+ #: lib/wfDiagnostic.php:444
5729
  msgid "Unavailable"
5730
  msgstr ""
5731
 
5732
+ #: lib/wfDiagnostic.php:612
5733
+ #: lib/wfDiagnostic.php:615
5734
  msgid "wp_remote_post() test to noc1.wordfence.com failed! Response was: "
5735
  msgstr ""
5736
 
5737
+ #: lib/wfDiagnostic.php:616
5738
  msgid "This likely means that your hosting provider is blocking requests to noc1.wordfence.com or has set up a proxy that is not behaving itself."
5739
  msgstr ""
5740
 
5741
+ #: lib/wfDiagnostic.php:649
5742
+ #: lib/wfDiagnostic.php:652
5743
  msgid "wp_remote_post() test back to this server failed! Response was: "
5744
  msgstr ""
5745
 
5746
+ #: lib/wfDiagnostic.php:653
5747
  msgid "This additional info may help you diagnose the issue. The response headers we received were:"
5748
  msgstr ""
5749
 
5750
  #. translators: PHP super global key.
5751
+ #: lib/wfDiagnostic.php:682
5752
  msgid "We cannot read $_SERVER[%s]"
5753
  msgstr ""
5754
 
5755
+ #: lib/wfDiagnostic.php:694
5756
  msgid "Should be: "
5757
  msgstr ""
5758
 
5759
+ #: lib/wfDiagnostic.php:777
5760
  msgid "NTP"
5761
  msgstr ""
5762
 
5871
  msgstr ""
5872
 
5873
  #: lib/wfLog.php:615
5874
+ #: lib/wordfenceClass.php:6116
5875
  #: waf/wfWAFIPBlocksController.php:97
5876
  msgid "Manual block by administrator"
5877
  msgstr ""
6203
  msgstr ""
6204
 
6205
  #: lib/wfScanEngine.php:707
6206
+ #: lib/wordfenceClass.php:6310
6207
  msgid "For maximum security use PHP's built in REMOTE_ADDR."
6208
  msgstr ""
6209
 
6210
  #: lib/wfScanEngine.php:709
6211
+ #: lib/wordfenceClass.php:6313
6212
  msgid "This site appears to be behind a front-end proxy, so using the X-Forwarded-For HTTP header will resolve to the correct IPs."
6213
  msgstr ""
6214
 
6215
  #: lib/wfScanEngine.php:711
6216
+ #: lib/wordfenceClass.php:6316
6217
  msgid "This site appears to be behind a front-end proxy, so using the X-Real-IP HTTP header will resolve to the correct IPs."
6218
  msgstr ""
6219
 
6220
  #: lib/wfScanEngine.php:713
6221
+ #: lib/wordfenceClass.php:6319
6222
  msgid "This site appears to be behind Cloudflare, so using the Cloudflare \"CF-Connecting-IP\" HTTP header will resolve to the correct IPs."
6223
  msgstr ""
6224
 
6352
 
6353
  #. translators: Scan result description.
6354
  #: lib/wfScanEngine.php:1088
6355
+ #: lib/wfScanEngine.php:2257
6356
+ #: lib/wfScanEngine.php:2299
6357
  msgid "Adding issue: %s"
6358
  msgstr ""
6359
 
6398
  msgstr ""
6399
 
6400
  #: lib/wfScanEngine.php:1233
6401
+ #: lib/wfScanEngine.php:2220
6402
  msgid "Done examining URLs"
6403
  msgstr ""
6404
 
6634
  msgstr ""
6635
 
6636
  #. translators: 1. Plugin name. 2. Software version. 3. Software version.
6637
+ #: lib/wfScanEngine.php:1996
6638
  msgid "The Plugin \"%1$s\" appears to be abandoned (updated %2$s, tested to WP %3$s)."
6639
  msgstr ""
6640
 
6641
  #. translators: 1. Plugin name. 2. Software version.
6642
+ #: lib/wfScanEngine.php:2003
6643
  msgid "It was last updated %1$s ago and tested up to WordPress %2$s."
6644
  msgstr ""
6645
 
6646
  #. translators: 1. Plugin name. 2. Software version.
6647
+ #: lib/wfScanEngine.php:2010
6648
  msgid "The Plugin \"%1$s\" appears to be abandoned (updated %2$s)."
6649
  msgstr ""
6650
 
6651
  #. translators: Time duration.
6652
+ #: lib/wfScanEngine.php:2016
6653
  msgid "It was last updated %s ago."
6654
  msgstr ""
6655
 
6656
+ #: lib/wfScanEngine.php:2022
6657
+ #: lib/wfScanEngine.php:2061
6658
  msgid "It has unpatched security issues and may have compatibility problems with the current version of WordPress."
6659
  msgstr ""
6660
 
6661
+ #: lib/wfScanEngine.php:2024
6662
+ #: lib/wfScanEngine.php:2063
6663
  msgid "Plugins can be removed from wordpress.org for various reasons. This can include benign issues like a plugin author discontinuing development or moving the plugin distribution to their own site, but some might also be due to security issues. In any case, future updates may or may not be available, so it is worth investigating the cause and deciding whether to temporarily or permanently replace or remove the plugin."
6664
  msgstr ""
6665
 
6666
  #. translators: Support URL.
6667
+ #: lib/wfScanEngine.php:2028
6668
+ #: lib/wfScanEngine.php:2067
6669
+ #: lib/wfScanEngine.php:2255
6670
+ #: lib/wfScanEngine.php:2297
6671
  msgid "<a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Get more information.</a>"
6672
  msgstr ""
6673
 
6674
  #. translators: Plugin name.
6675
+ #: lib/wfScanEngine.php:2059
6676
  msgid "The Plugin \"%s\" has been removed from wordpress.org."
6677
  msgstr ""
6678
 
6679
+ #: lib/wfScanEngine.php:2112
6680
  msgid "Scanning for admin users not created through WordPress"
6681
  msgstr ""
6682
 
6683
  #. translators: WordPress username.
6684
+ #: lib/wfScanEngine.php:2134
6685
  msgid "An admin user with the username %s was created outside of WordPress."
6686
  msgstr ""
6687
 
6688
  #. translators: WordPress username.
6689
+ #: lib/wfScanEngine.php:2135
6690
  msgid "An admin user with the username %s was created outside of WordPress. It's possible a plugin could have created the account, but if you do not recognize the user, we suggest you remove it."
6691
  msgstr ""
6692
 
6693
  #. translators: WordPress username.
6694
+ #: lib/wfScanEngine.php:2161
6695
  msgid "An admin user with a suspicious username %s was found."
6696
  msgstr ""
6697
 
6698
  #. translators: WordPress username.
6699
+ #: lib/wfScanEngine.php:2162
6700
  msgid "An admin user with a suspicious username %s was found. Administrators accounts with usernames similar to this are commonly seen created by hackers. It's possible a plugin could have created the account, but if you do not recognize the user, we suggest you remove it."
6701
  msgstr ""
6702
 
6703
+ #: lib/wfScanEngine.php:2183
6704
  msgid "Scanning for suspicious site options"
6705
  msgstr ""
6706
 
6707
+ #: lib/wfScanEngine.php:2218
6708
  msgid "Examining URLs found in the options we scanned for dangerous websites"
6709
  msgstr ""
6710
 
6711
  #. translators: URL.
6712
+ #: lib/wfScanEngine.php:2242
6713
+ #: lib/wfScanEngine.php:2248
6714
  msgid "Option contains a suspected malware URL: %s"
6715
  msgstr ""
6716
 
6717
  #. translators: URL.
6718
+ #: lib/wfScanEngine.php:2243
6719
  msgid "This option contains a suspected malware URL listed on Google's list of malware sites. It may indicate your site is infected with malware. The URL is: %s"
6720
  msgstr ""
6721
 
6722
  #. translators: URL.
6723
+ #: lib/wfScanEngine.php:2245
6724
  msgid "Option contains a suspected phishing site URL: %s"
6725
  msgstr ""
6726
 
6727
  #. translators: URL.
6728
+ #: lib/wfScanEngine.php:2246
6729
  msgid "This option contains a URL that is a suspected phishing site that is currently listed on Google's list of known phishing sites. It may indicate your site is infected with malware. The URL is: %s"
6730
  msgstr ""
6731
 
6732
  #. translators: URL.
6733
+ #: lib/wfScanEngine.php:2249
6734
  msgid "This option contains a URL that is currently listed on Wordfence's domain blocklist. It may indicate your site is infected with malware. The URL is: %s"
6735
  msgstr ""
6736
 
6737
+ #: lib/wfScanEngine.php:2289
6738
  msgid "Checking for future GeoIP support"
6739
  msgstr ""
6740
 
6741
+ #: lib/wfScanEngine.php:2294
6742
  msgid "PHP Update Needed for Country Blocking"
6743
  msgstr ""
6744
 
6745
  #. translators: Software version.
6746
+ #: lib/wfScanEngine.php:2295
6747
  msgid "The GeoIP database that is required for country blocking has been updated to a new format. This new format requires sites to run PHP 5.4 or newer, and this site is on PHP %s. To ensure country blocking continues functioning, please update PHP."
6748
  msgstr ""
6749
 
6750
+ #: lib/wfScanEngine.php:2344
6751
  msgid "Previous scan was stopped successfully."
6752
  msgstr ""
6753
 
6754
+ #: lib/wfScanEngine.php:2345
6755
  msgid "Scan was stopped on administrator request."
6756
  msgstr ""
6757
 
6758
+ #: lib/wfScanEngine.php:2361
6759
  msgid "Entering start scan routine"
6760
  msgstr ""
6761
 
6762
+ #: lib/wfScanEngine.php:2364
6763
  msgid "A scan is already running. Use the stop scan button if you would like to terminate the current scan."
6764
  msgstr ""
6765
 
6766
  #. translators: Support URL.
6767
+ #: lib/wfScanEngine.php:2382
6768
  msgid "Test result of scan start URL fetch: %s"
6769
  msgstr ""
6770
 
6771
  #. translators: WordPress admin panel URL.
6772
+ #: lib/wfScanEngine.php:2391
6773
  msgid "Starting cron with normal ajax at URL %s"
6774
  msgstr ""
6775
 
6776
  #. translators: Error message.
6777
  #. translators: WordPress admin panel URL.
6778
+ #: lib/wfScanEngine.php:2413
6779
+ #: lib/wfScanEngine.php:2448
6780
  msgid "There was an error starting the scan: %s."
6781
  msgstr ""
6782
 
6783
+ #: lib/wfScanEngine.php:2415
6784
+ #: lib/wfScanEngine.php:2450
6785
  msgid "There was an unknown error starting the scan."
6786
  msgstr ""
6787
 
6788
+ #: lib/wfScanEngine.php:2422
6789
+ #: lib/wfScanEngine.php:2456
6790
  msgid "Scan process ended after forking."
6791
  msgstr ""
6792
 
6793
  #. translators: WordPress admin panel URL.
6794
+ #: lib/wfScanEngine.php:2426
6795
  msgid "Starting cron via proxy at URL %s"
6796
  msgstr ""
6797
 
6798
  #. translators: Time in seconds.
6799
+ #: lib/wfScanEngine.php:2502
6800
  msgid "Got value from wf config maxExecutionTime: %s"
6801
  msgstr ""
6802
 
6803
  #. translators: Time in seconds.
6804
+ #: lib/wfScanEngine.php:2506
6805
  msgid "getMaxExecutionTime() returning config value: %s"
6806
  msgstr ""
6807
 
6808
  #. translators: PHP ini value.
6809
+ #: lib/wfScanEngine.php:2513
6810
  msgid "Got max_execution_time value from ini: %s"
6811
  msgstr ""
6812
 
6813
  #. translators: 1. PHP ini setting. 2. Time in seconds.
6814
+ #: lib/wfScanEngine.php:2520
6815
  msgid "ini value of %1$d is higher than value for WORDFENCE_SCAN_MAX_INI_EXECUTION_TIME (%2$d), reducing"
6816
  msgstr ""
6817
 
6818
  #. translators: PHP ini setting.
6819
+ #: lib/wfScanEngine.php:2530
6820
  msgid "getMaxExecutionTime() returning half ini value: %d"
6821
  msgstr ""
6822
 
6823
+ #: lib/wfScanEngine.php:2536
6824
  msgid "getMaxExecutionTime() returning default of: 15"
6825
  msgstr ""
6826
 
6827
  #. translators: 1. HTTP status code.
6828
+ #: lib/wfScanEngine.php:2738
6829
  msgid "Got error response from Wordfence servers: %s"
6830
  msgstr ""
6831
 
6832
+ #: lib/wfScanEngine.php:2742
6833
  msgid "Invalid response from Wordfence servers."
6834
  msgstr ""
6835
 
6992
  msgid "File last modified:"
6993
  msgstr ""
6994
 
6995
+ #: lib/wordfenceClass.php:180
6996
  msgid ""
6997
  "To ensure uninterrupted Premium Wordfence protection on your site,\n"
6998
  "please renew your license by visiting http://www.wordfence.com/ Sign in, go to your dashboard,\n"
6999
  "select the license about to expire and click the button to renew that license."
7000
  msgstr ""
7001
 
7002
+ #: lib/wordfenceClass.php:210
7003
  msgid "Your Premium Wordfence License is set to auto-renew in 10 days."
7004
  msgstr ""
7005
 
7006
+ #: lib/wordfenceClass.php:211
7007
  msgid "To update your license settings please visit http://www.wordfence.com/zz9/dashboard"
7008
  msgstr ""
7009
 
7010
+ #: lib/wordfenceClass.php:223
7011
  msgid "Your Premium Wordfence License expires in less than 2 weeks."
7012
  msgstr ""
7013
 
7014
+ #: lib/wordfenceClass.php:226
7015
  msgid "Your Premium Wordfence License expires in less than a week."
7016
  msgstr ""
7017
 
7018
+ #: lib/wordfenceClass.php:229
7019
  msgid "Your Premium Wordfence License expires in 2 days."
7020
  msgstr ""
7021
 
7022
+ #: lib/wordfenceClass.php:232
7023
  msgid "Your Premium Wordfence License expires in 1 day."
7024
  msgstr ""
7025
 
7026
+ #: lib/wordfenceClass.php:236
7027
  msgid "Your Wordfence Premium License has Expired!"
7028
  msgstr ""
7029
 
7030
+ #: lib/wordfenceClass.php:267
7031
  msgid "The Wordfence Premium License in use on this site has been removed from your account."
7032
  msgstr ""
7033
 
7034
+ #: lib/wordfenceClass.php:267
7035
  msgid "The license you were using has been removed from your account. Please reach out to billing@wordfence.com or create a Premium support case at https://support.wordfence.com/support/tickets for more information. Our staff is happy to help."
7036
  msgstr ""
7037
 
7038
  #. translators: Wordfence license key.
7039
+ #: lib/wordfenceClass.php:273
7040
  msgid "Could not verify Wordfence License: %s"
7041
  msgstr ""
7042
 
7043
  #. translators: WordPress version.
7044
+ #: lib/wordfenceClass.php:355
7045
  msgid "WordPress (v%s)"
7046
  msgstr ""
7047
 
7048
  #. translators: Number of plugins.
7049
+ #: lib/wordfenceClass.php:359
7050
  msgid "%d plugin"
7051
  msgid_plural "%d plugins"
7052
  msgstr[0] ""
7053
  msgstr[1] ""
7054
 
7055
  #. translators: Number of themes.
7056
+ #: lib/wordfenceClass.php:364
7057
  msgid "%d theme"
7058
  msgid_plural "%d themes"
7059
  msgstr[0] ""
7060
  msgstr[1] ""
7061
 
7062
+ #: lib/wordfenceClass.php:368
7063
  msgid "An update is available for "
7064
  msgid_plural "Updates are available for "
7065
  msgstr[0] ""
7066
  msgstr[1] ""
7067
 
7068
+ #: lib/wordfenceClass.php:373
7069
  msgid "and "
7070
  msgstr ""
7071
 
7072
  #. translators: Wordfence version.
7073
+ #: lib/wordfenceClass.php:412
7074
  msgid "`runInstall` called with previous version = %s"
7075
  msgstr ""
7076
 
7077
+ #: lib/wordfenceClass.php:464
7078
+ #: lib/wordfenceClass.php:4025
7079
  msgid "Could not understand the response we received from the Wordfence servers when applying for a free license key."
7080
  msgstr ""
7081
 
7082
+ #: lib/wordfenceClass.php:828
7083
  msgid "Automatically generated from previous country blocking settings"
7084
  msgstr ""
7085
 
7086
+ #: lib/wordfenceClass.php:1259
7087
  msgid "Application passwords have been disabled by Wordfence."
7088
  msgstr ""
7089
 
7090
+ #: lib/wordfenceClass.php:1370
7091
+ #: lib/wordfenceClass.php:6598
7092
  msgid "Upgrade To Premium"
7093
  msgstr ""
7094
 
7095
+ #: lib/wordfenceClass.php:1389
7096
  msgid "wp_mail from address is incomplete, attempting to fix"
7097
  msgstr ""
7098
 
7099
  #. translators: Email address.
7100
+ #: lib/wordfenceClass.php:1399
7101
  msgid "Fixing wp_mail from address: %s"
7102
  msgstr ""
7103
 
7104
+ #: lib/wordfenceClass.php:1492
7105
  msgid "You appear to have logged out or you are not an admin. Please sign-out and sign-in again."
7106
  msgstr ""
7107
 
7108
+ #: lib/wordfenceClass.php:1497
7109
  msgid "Your browser sent an invalid security token to Wordfence. Please try reloading this page or signing out and in again."
7110
  msgstr ""
7111
 
7112
+ #: lib/wordfenceClass.php:1503
7113
  msgid "Wordfence encountered an internal error executing that request."
7114
  msgstr ""
7115
 
7116
  #. translators: Error message.
7117
+ #: lib/wordfenceClass.php:1609
7118
  msgid "2FA Migration Error: %s"
7119
  msgstr ""
7120
 
7121
+ #: lib/wordfenceClass.php:1649
7122
  msgid "Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words."
7123
  msgstr ""
7124
 
7125
+ #: lib/wordfenceClass.php:1655
7126
  msgid "Passwords containing a space followed by \"wf\" without quotes are not allowed."
7127
  msgstr ""
7128
 
7129
  #. translators: Support URL.
7130
+ #: lib/wordfenceClass.php:1670
7131
  msgid "Please choose a different password. The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. <a href=\"%s\">Learn More</a>"
7132
  msgstr ""
7133
 
7134
+ #: lib/wordfenceClass.php:1798
7135
+ #: lib/wordfenceClass.php:1981
7136
  msgid "Sorry but your browser sent an invalid security token when trying to use this form."
7137
  msgstr ""
7138
 
7139
+ #: lib/wordfenceClass.php:1803
7140
  msgid "Please wait 3 minutes and try again"
7141
  msgstr ""
7142
 
7143
+ #: lib/wordfenceClass.php:1804
7144
  msgid "You have used this form too much. Please wait 3 minutes and try again."
7145
  msgstr ""
7146
 
7147
+ #: lib/wordfenceClass.php:1843
7148
  msgid "Unlock email requested"
7149
  msgstr ""
7150
 
7151
+ #: lib/wordfenceClass.php:1845
7152
  msgid "Your request was received"
7153
  msgstr ""
7154
 
7155
  #. translators: Email address.
7156
+ #: lib/wordfenceClass.php:1846
7157
  msgid "We received a request to email \"%s\" instructions to unlock their access. If that is the email address of a site administrator or someone on the Wordfence alert list, they have been emailed instructions on how to regain access to this system. The instructions we sent will expire 30 minutes from now."
7158
  msgstr ""
7159
 
7160
+ #: lib/wordfenceClass.php:1852
7161
  msgid "Invalid key provided for authentication."
7162
  msgstr ""
7163
 
7164
+ #: lib/wordfenceClass.php:1863
7165
  msgid "Request received via unlock email link to unblock all IPs."
7166
  msgstr ""
7167
 
7168
+ #: lib/wordfenceClass.php:1872
7169
  msgid "Request received via unlock email link to unblock all IPs via disabling firewall rules."
7170
  msgstr ""
7171
 
7172
+ #: lib/wordfenceClass.php:1880
7173
  msgid "Invalid function specified. Please check the link we emailed you and make sure it was not cut-off by your email reader."
7174
  msgstr ""
7175
 
7176
+ #: lib/wordfenceClass.php:1925
7177
  msgid "Unsubscribe Requested"
7178
  msgstr ""
7179
 
7180
+ #: lib/wordfenceClass.php:1987
7181
  msgid "An error occurred while saving the license."
7182
  msgstr ""
7183
 
7184
  #. translators: Error message.
7185
+ #: lib/wordfenceClass.php:1989
7186
+ #: lib/wordfenceClass.php:2009
7187
  msgid "An error occurred while saving the license: %s"
7188
  msgstr ""
7189
 
7190
+ #: lib/wordfenceClass.php:2025
7191
  msgid "Rescheduled missing daily cron"
7192
  msgstr ""
7193
 
7194
+ #: lib/wordfenceClass.php:2030
7195
  msgid "Rescheduled missing hourly cron"
7196
  msgstr ""
7197
 
7198
+ #: lib/wordfenceClass.php:2384
7199
+ #: lib/wordfenceClass.php:2388
7200
  msgid "Accessed a banned URL"
7201
  msgstr ""
7202
 
7203
+ #: lib/wordfenceClass.php:2395
7204
+ #: lib/wordfenceClass.php:2399
7205
  msgid "POST received with blank user-agent and referer"
7206
  msgstr ""
7207
 
7208
+ #: lib/wordfenceClass.php:2533
7209
  msgid "<strong>ERROR</strong>: You can't register using that username"
7210
  msgstr ""
7211
 
7212
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
7213
+ #: lib/wordfenceClass.php:2741
7214
+ #: lib/wordfenceClass.php:2877
7215
  msgid "<strong>WARNING: </strong>The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please <a href=\"%1$s\">change your password</a>. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More</a>"
7216
  msgstr ""
7217
 
7218
  #. translators: 1. Reset password URL. 2. Support URL.
7219
+ #: lib/wordfenceClass.php:3032
7220
+ #: lib/wordfenceClass.php:3068
7221
  msgid "<strong>WARNING: </strong>Your login has been allowed because you have previously logged in from the same IP, but you will be blocked if your IP changes. The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please <a href=\"%1$s\">change your password</a>. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More</a>"
7222
  msgstr ""
7223
 
7224
  #. translators: WordPress username.
7225
+ #: lib/wordfenceClass.php:3057
7226
  msgid "A user with username \"%s\" who has administrator access tried to sign in to your WordPress site. Access was denied because all administrator accounts are required to have Cellphone Sign-in enabled but this account does not."
7227
  msgstr ""
7228
 
7229
+ #: lib/wordfenceClass.php:3098
7230
  msgid "Blocked by Wordfence Security Network"
7231
  msgstr ""
7232
 
7233
+ #: lib/wordfenceClass.php:3128
7234
  msgid "Blocked by login security setting"
7235
  msgstr ""
7236
 
7237
  #. translators: WordPress username.
7238
+ #: lib/wordfenceClass.php:3138
7239
  msgid "Used an invalid username '%s' to try to sign in"
7240
  msgstr ""
7241
 
7242
  #. translators: 1. Login attempt limit. 2. WordPress username.
7243
+ #: lib/wordfenceClass.php:3157
7244
  msgid "Exceeded the maximum number of login failures which is: %1$s. The last username they tried to sign in with was: '%2$s'"
7245
  msgstr ""
7246
 
7247
+ #: lib/wordfenceClass.php:3514
7248
  msgid "An invalid type was specified to get file."
7249
  msgstr ""
7250
 
7251
+ #: lib/wordfenceClass.php:3530
7252
  msgid "We could not fetch a core WordPress file from the Wordfence API."
7253
  msgstr ""
7254
 
7255
+ #: lib/wordfenceClass.php:3589
7256
  msgid "Wordfence Test Email"
7257
  msgstr ""
7258
 
7259
  #. translators: 1. Site URL. 2. IP address.
7260
+ #: lib/wordfenceClass.php:3589
7261
  msgid ""
7262
  "This is a test email from %1$s.\n"
7263
  "The IP address that requested this was: %2$s"
7264
  msgstr ""
7265
 
7266
+ #: lib/wordfenceClass.php:3596
7267
  msgid "Cellphone Sign-in is only available to paid members. <a href=\"https://www.wordfence.com/gnl1twoFac3/wordfence-signup/\" target=\"_blank\" rel=\"noopener noreferrer\">Click here to upgrade now.</a>"
7268
  msgstr ""
7269
 
7270
+ #: lib/wordfenceClass.php:3603
7271
  msgid "The username you specified does not exist."
7272
  msgstr ""
7273
 
7274
+ #: lib/wordfenceClass.php:3612
7275
  msgid "The username you specified is already enabled."
7276
  msgstr ""
7277
 
7278
+ #: lib/wordfenceClass.php:3617
7279
  msgid "Unknown authentication mode."
7280
  msgstr ""
7281
 
7282
+ #: lib/wordfenceClass.php:3622
7283
  msgid "The phone number you entered must start with a '+', then country code and then area code and number. For example, a number in the United States with country code '1' would look like this: +1-123-555-1234"
7284
  msgstr ""
7285
 
7286
  #. translators: Error message.
7287
+ #: lib/wordfenceClass.php:3629
7288
+ #: lib/wordfenceClass.php:3661
7289
+ #: lib/wordfenceClass.php:3724
7290
  msgid "Could not contact Wordfence servers to generate a verification code: %s"
7291
  msgstr ""
7292
 
7293
  #. translators: Error message.
7294
+ #: lib/wordfenceClass.php:3641
7295
+ #: lib/wordfenceClass.php:3685
7296
  msgid "Could not generate verification code: %s"
7297
  msgstr ""
7298
 
7299
  #. translators: Error message.
7300
+ #: lib/wordfenceClass.php:3642
7301
+ #: lib/wordfenceClass.php:3686
7302
  msgid "We could not generate a verification code."
7303
  msgstr ""
7304
 
7305
+ #: lib/wordfenceClass.php:3702
7306
  msgid "Unknown two-factor authentication mode."
7307
  msgstr ""
7308
 
7309
+ #: lib/wordfenceClass.php:3735
7310
  msgid "The code you entered is invalid. Cellphone sign-in will not be enabled for this user until you enter a valid code."
7311
  msgstr ""
7312
 
7313
+ #: lib/wordfenceClass.php:3740
7314
  msgid "We could not find the user you are trying to activate. They may have been removed from the list of Cellphone Sign-in users. Please reload this page."
7315
  msgstr ""
7316
 
7317
+ #: lib/wordfenceClass.php:3822
7318
  msgid "That user has already been removed from the list."
7319
  msgstr ""
7320
 
7321
+ #: lib/wordfenceClass.php:3842
7322
  msgid "No scan is scheduled"
7323
  msgstr ""
7324
 
7325
+ #: lib/wordfenceClass.php:3847
7326
  msgid "Next scan is starting now"
7327
  msgstr ""
7328
 
7329
  #. translators: 1. Time until. 2. Localized date.
7330
+ #: lib/wordfenceClass.php:3850
7331
  msgid "Next scan in %1$s (%2$s)"
7332
  msgstr ""
7333
 
7334
  #. translators: Localized date.
7335
+ #: lib/wordfenceClass.php:3867
7336
  msgid "Scheduled Wordfence scan starting at %s"
7337
  msgstr ""
7338
 
7339
+ #: lib/wordfenceClass.php:3890
7340
  msgid "Sorry but this feature is only available for paid customers."
7341
  msgstr ""
7342
 
7343
  #. translators: Site URL.
7344
+ #: lib/wordfenceClass.php:3904
7345
  msgid "SITE: %s"
7346
  msgstr ""
7347
 
7348
  #. translators: Plugin version.
7349
+ #: lib/wordfenceClass.php:3905
7350
  msgid "PLUGIN VERSION: %s"
7351
  msgstr ""
7352
 
7353
  #. translators: WordPress version.
7354
+ #: lib/wordfenceClass.php:3906
7355
  msgid "WORDPRESS VERSION: %s"
7356
  msgstr ""
7357
 
7358
  #. translators: Wordfence license key.
7359
+ #: lib/wordfenceClass.php:3907
7360
  msgid "LICENSE KEY: %s"
7361
  msgstr ""
7362
 
7363
  #. translators: Email address.
7364
+ #: lib/wordfenceClass.php:3908
7365
  msgid "ADMIN EMAIL: %s"
7366
  msgstr ""
7367
 
7368
  #. translators: Email address.
7369
+ #: lib/wordfenceClass.php:3909
7370
  msgid "LOG:"
7371
  msgstr ""
7372
 
7373
+ #: lib/wordfenceClass.php:3925
7374
  msgid "# Scan Issues"
7375
  msgstr ""
7376
 
7377
  #. translators: Number of scan results.
7378
+ #: lib/wordfenceClass.php:3930
7379
  msgid "## New Issues (%d total)"
7380
  msgstr ""
7381
 
7382
  #. translators: Number of scan results.
7383
+ #: lib/wordfenceClass.php:3957
7384
  msgid "## Ignored Issues (%d total)"
7385
  msgstr ""
7386
 
7387
+ #: lib/wordfenceClass.php:3978
7388
  msgid "No Ignored Issues"
7389
  msgstr ""
7390
 
7391
+ #: lib/wordfenceClass.php:4000
7392
  msgid "Wordfence Activity Log"
7393
  msgstr ""
7394
 
7395
  #. translators: Error message.
7396
+ #: lib/wordfenceClass.php:4028
7397
  msgid "Could not fetch free license key from Wordfence: %s"
7398
  msgstr ""
7399
 
7400
+ #: lib/wordfenceClass.php:4113
7401
  msgid "We could not find your .htaccess file to modify it."
7402
  msgstr ""
7403
 
7404
  #. translators: Error message.
7405
+ #: lib/wordfenceClass.php:4118
7406
  msgid "We found your .htaccess file but could not open it for writing: %s"
7407
  msgstr ""
7408
 
7409
+ #: lib/wordfenceClass.php:4201
7410
  msgid "All Countries"
7411
  msgstr ""
7412
 
7413
+ #: lib/wordfenceClass.php:4204
7414
  msgid "1 Country"
7415
  msgstr ""
7416
 
7417
  #. translators: Number of countries.
7418
+ #: lib/wordfenceClass.php:4207
7419
  msgid "%d Countries"
7420
  msgstr ""
7421
 
7422
+ #: lib/wordfenceClass.php:4211
7423
  msgid "Entire Site"
7424
  msgstr ""
7425
 
7426
+ #: lib/wordfenceClass.php:4214
7427
  msgid "Login Only"
7428
  msgstr ""
7429
 
7430
+ #: lib/wordfenceClass.php:4217
7431
  msgid "Site Except Login"
7432
  msgstr ""
7433
 
7434
+ #: lib/wordfenceClass.php:4225
7435
  msgid "IP Range"
7436
  msgstr ""
7437
 
7438
  #. translators: 2FA backup codes.
7439
+ #: lib/wordfenceClass.php:4226
7440
+ #: lib/wordfenceClass.php:6178
7441
  msgid "User Agent"
7442
  msgstr ""
7443
 
7444
+ #: lib/wordfenceClass.php:4227
7445
  #: views/blocking/blocking-create.php:201
7446
  msgid "Referrer"
7447
  msgstr ""
7448
 
7449
+ #: lib/wordfenceClass.php:4242
7450
  msgid "Permanent"
7451
  msgstr ""
7452
 
7453
+ #: lib/wordfenceClass.php:4314
7454
  msgid "An error occurred while creating the block."
7455
  msgstr ""
7456
 
7457
+ #: lib/wordfenceClass.php:4320
7458
  msgid "No block parameters were provided."
7459
  msgstr ""
7460
 
7461
+ #: lib/wordfenceClass.php:4357
7462
+ #: lib/wordfenceClass.php:4389
7463
  msgid "No blocks were provided."
7464
  msgstr ""
7465
 
7466
+ #: lib/wordfenceClass.php:4421
7467
  msgid "The license provided is already in use on another site."
7468
  msgstr ""
7469
 
7470
+ #: lib/wordfenceClass.php:4426
7471
  msgid "The Wordfence activation server returned an unexpected response. Please try again."
7472
  msgstr ""
7473
 
7474
+ #: lib/wordfenceClass.php:4432
7475
  msgid "We received an error while trying to activate the license with the Wordfence servers: "
7476
  msgstr ""
7477
 
7478
+ #: lib/wordfenceClass.php:4445
7479
  msgid "No license was provided to install."
7480
  msgstr ""
7481
 
7482
+ #: lib/wordfenceClass.php:4496
7483
  msgid "An unknown configuration section was provided."
7484
  msgstr ""
7485
 
7486
+ #: lib/wordfenceClass.php:4502
7487
  msgid "No configuration section was provided."
7488
  msgstr ""
7489
 
7490
+ #: lib/wordfenceClass.php:4548
7491
+ #: lib/wordfenceClass.php:4553
7492
  msgid "An error occurred while saving the configuration."
7493
  msgstr ""
7494
 
7495
+ #: lib/wordfenceClass.php:4564
7496
  msgid "No configuration changes were provided to save."
7497
  msgstr ""
7498
 
7499
+ #: lib/wordfenceClass.php:4595
7500
+ #: lib/wordfenceClass.php:5220
7501
+ #: lib/wordfenceClass.php:5251
7502
+ #: lib/wordfenceClass.php:7230
7503
+ #: lib/wordfenceClass.php:7265
7504
+ #: lib/wordfenceClass.php:7297
7505
  msgid "We could not find that issue in our database."
7506
  msgstr ""
7507
 
7508
+ #: lib/wordfenceClass.php:4605
7509
  msgid "An error occurred while trying to hide the file."
7510
  msgstr ""
7511
 
7512
+ #: lib/wordfenceClass.php:4618
7513
  msgid "An invalid file was requested for hiding."
7514
  msgstr ""
7515
 
7516
+ #: lib/wordfenceClass.php:4645
7517
+ #: lib/wordfenceClass.php:5231
7518
  msgid "You don't have permission to repair .htaccess. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file."
7519
  msgstr ""
7520
 
7521
+ #: lib/wordfenceClass.php:4669
7522
  msgid "Manual permanent block by admin"
7523
  msgstr ""
7524
 
7525
+ #: lib/wordfenceClass.php:4705
7526
  msgid "Please enter a valid IP address to block."
7527
  msgstr ""
7528
 
7529
+ #: lib/wordfenceClass.php:4708
7530
  msgid "You can't block your own IP address."
7531
  msgstr ""
7532
 
7533
  #. translators: IP address.
7534
+ #: lib/wordfenceClass.php:4712
7535
  msgid "The IP address %s is allowlisted and can't be blocked. You can remove this IP from the allowlist on the Wordfence options page."
7536
  msgstr ""
7537
 
7538
  #. translators: IP address.
7539
+ #: lib/wordfenceClass.php:4714
7540
  msgid "The IP address %s is in a range of IP addresses that Wordfence does not block. The IP range may be internal or belong to a service safe to allow access for."
7541
  msgstr ""
7542
 
7543
+ #: lib/wordfenceClass.php:4720
7544
  msgid "The IP address you're trying to block belongs to Google. Your options are currently set to not block these crawlers. Change this in Wordfence options if you want to manually block Google."
7545
  msgstr ""
7546
 
7547
+ #: lib/wordfenceClass.php:4763
7548
  msgid "An invalid operation was called."
7549
  msgstr ""
7550
 
7551
+ #: lib/wordfenceClass.php:4773
7552
  msgid "An invalid status was specified when trying to update that issue."
7553
  msgstr ""
7554
 
7555
+ #: lib/wordfenceClass.php:4785
7556
  msgid "Scan stop request received."
7557
  msgstr ""
7558
 
7559
+ #: lib/wordfenceClass.php:4786
7560
  msgid "A request was received to stop the previous scan."
7561
  msgstr ""
7562
 
7563
+ #: lib/wordfenceClass.php:4835
7564
  msgid "Idle"
7565
  msgstr ""
7566
 
7567
  #. translators: Localized date.
7568
+ #: lib/wordfenceClass.php:4844
7569
  msgid "Scan completed on %s"
7570
  msgstr ""
7571
 
7572
+ #: lib/wordfenceClass.php:4851
7573
  msgid "Last scan failed"
7574
  msgstr ""
7575
 
7576
  #. translators: Time until.
7577
+ #: lib/wordfenceClass.php:4914
7578
  msgid "more than %s"
7579
  msgstr ""
7580
 
7581
  #. translators: Localized date.
7582
+ #: lib/wordfenceClass.php:4918
7583
  msgid "The current scan looks like it has failed. Its last status update was <span id=\"wf-scan-failed-time-ago\">%s</span> ago. You may continue to wait in case it resumes or stop and restart the scan. Some sites may need adjustments to run scans reliably."
7584
  msgstr ""
7585
 
7586
  #. translators: Localized date.
7587
+ #: lib/wordfenceClass.php:4918
7588
+ #: lib/wordfenceClass.php:4926
7589
+ #: lib/wordfenceClass.php:4945
7590
+ #: lib/wordfenceClass.php:4957
7591
+ #: lib/wordfenceClass.php:4965
7592
  msgid "Click here for steps you can try."
7593
  msgstr ""
7594
 
7595
  #. translators: Localized date.
7596
+ #: lib/wordfenceClass.php:4919
7597
  msgid "Cancel Scan"
7598
  msgstr ""
7599
 
7600
+ #: lib/wordfenceClass.php:4926
7601
  msgid "The previous scan has failed. Some sites may need adjustments to run scans reliably."
7602
  msgstr ""
7603
 
7604
  #. translators: Time limit (number).
7605
+ #: lib/wordfenceClass.php:4932
7606
  msgid "The previous scan has terminated because the time limit of %s was reached. This limit can be customized on the options page."
7607
  msgstr ""
7608
 
7609
+ #: lib/wordfenceClass.php:4938
7610
  msgid "The previous scan has terminated because we detected an update occurring during the scan."
7611
  msgstr ""
7612
 
7613
+ #: lib/wordfenceClass.php:4945
7614
  msgid "The scan has failed to start. This is often because the site either cannot make outbound requests or is blocked from connecting to itself."
7615
  msgstr ""
7616
 
7617
+ #: lib/wordfenceClass.php:4951
7618
  msgid "Scans are not functional because SSL is unavailable."
7619
  msgstr ""
7620
 
7621
+ #: lib/wordfenceClass.php:4957
7622
  msgid "The scan has failed because we were unable to contact the Wordfence servers. Some sites may need adjustments to run scans reliably."
7623
  msgstr ""
7624
 
7625
+ #: lib/wordfenceClass.php:4965
7626
  msgid "The scan has failed because we received an unexpected response from the Wordfence servers. This may be a temporary error, though some sites may need adjustments to run scans reliably."
7627
  msgstr ""
7628
 
7629
+ #: lib/wordfenceClass.php:4992
7630
  msgid "Invalid email address given."
7631
  msgstr ""
7632
 
7633
+ #: lib/wordfenceClass.php:5017
7634
+ #: lib/wordfenceClass.php:5142
7635
  msgid "Deleting an infected wp-config.php file must be done outside of Wordfence. The wp-config.php file contains your database credentials, which you will need to restore normal site operations. Your site will NOT function once the wp-config.php file has been deleted."
7636
  msgstr ""
7637
 
7638
  #. translators: 1. File path. 2. Error message.
7639
+ #: lib/wordfenceClass.php:5026
7640
  msgid "Could not delete file %1$s. Error was: %2$s"
7641
  msgstr ""
7642
 
7643
  #. translators: File path.
7644
+ #: lib/wordfenceClass.php:5050
7645
  msgid "We could not retrieve the original file of %s to do a repair."
7646
  msgstr ""
7647
 
7648
  #. translators: File path.
7649
+ #: lib/wordfenceClass.php:5055
7650
  msgid "An invalid file %s was specified for repair."
7651
  msgstr ""
7652
 
7653
  #. translators: File path.
7654
+ #: lib/wordfenceClass.php:5063
7655
  msgid "You don't have permission to repair %s. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file."
7656
  msgstr ""
7657
 
7658
  #. translators: 1. File path. 2. Error message.
7659
+ #: lib/wordfenceClass.php:5066
7660
  msgid "We could not write to %1$s. The error was: %2$s"
7661
  msgstr ""
7662
 
7663
  #. translators: 1. File path. 2. Number of bytes.
7664
+ #: lib/wordfenceClass.php:5077
7665
  msgid "We could not write to %1$s. (%2$d bytes written) You may not have permission to modify files on your WordPress server."
7666
  msgstr ""
7667
 
7668
+ #: lib/wordfenceClass.php:5089
7669
  msgid "Deleted some files with errors"
7670
  msgstr ""
7671
 
7672
+ #: lib/wordfenceClass.php:5089
7673
  msgid "Repaired some files with errors"
7674
  msgstr ""
7675
 
7676
  #. translators: 1. Number of files. 2. Error message.
7677
+ #: lib/wordfenceClass.php:5092
7678
  msgid "Deleted %1$d files but we encountered the following errors with other files: %2$s"
7679
  msgstr ""
7680
 
7681
  #. translators: 1. Number of files. 2. Error message.
7682
+ #: lib/wordfenceClass.php:5094
7683
  msgid "Repaired %1$d files but we encountered the following errors with other files: %2$s"
7684
  msgstr ""
7685
 
7686
  #. translators: Number of files.
7687
+ #: lib/wordfenceClass.php:5098
7688
  msgid "Deleted %d files successfully"
7689
  msgstr ""
7690
 
7691
  #. translators: Number of files.
7692
+ #: lib/wordfenceClass.php:5098
7693
  msgid "Repaired %d files successfully"
7694
  msgstr ""
7695
 
7696
  #. translators: Number of files.
7697
+ #: lib/wordfenceClass.php:5099
7698
  msgid "Deleted %d files successfully. No errors were encountered."
7699
  msgstr ""
7700
 
7701
  #. translators: Number of files.
7702
+ #: lib/wordfenceClass.php:5099
7703
  msgid "Repaired %d files successfully. No errors were encountered."
7704
  msgstr ""
7705
 
7706
+ #: lib/wordfenceClass.php:5102
7707
  msgid "Could not delete files"
7708
  msgstr ""
7709
 
7710
+ #: lib/wordfenceClass.php:5102
7711
  msgid "Could not repair files"
7712
  msgstr ""
7713
 
7714
  #. translators: Error message.
7715
+ #: lib/wordfenceClass.php:5105
7716
  msgid "We could not delete any of the files you selected. We encountered the following errors: %s"
7717
  msgstr ""
7718
 
7719
  #. translators: Error message.
7720
+ #: lib/wordfenceClass.php:5107
7721
  msgid "We could not repair any of the files you selected. We encountered the following errors: %s"
7722
  msgstr ""
7723
 
7724
+ #: lib/wordfenceClass.php:5110
7725
  msgid "Nothing done"
7726
  msgstr ""
7727
 
7728
+ #: lib/wordfenceClass.php:5111
7729
  msgid "We didn't delete anything and no errors were found."
7730
  msgstr ""
7731
 
7732
+ #: lib/wordfenceClass.php:5111
7733
  msgid "We didn't repair anything and no errors were found."
7734
  msgstr ""
7735
 
7736
+ #: lib/wordfenceClass.php:5119
7737
  msgid "Invalid bulk operation selected"
7738
  msgstr ""
7739
 
7740
+ #: lib/wordfenceClass.php:5129
7741
  msgid "Could not delete file because we could not find that issue."
7742
  msgstr ""
7743
 
7744
+ #: lib/wordfenceClass.php:5132
7745
  msgid "Could not delete file because that issue does not appear to be a file related issue."
7746
  msgstr ""
7747
 
7748
+ #: lib/wordfenceClass.php:5138
7749
  msgid "An invalid file was requested for deletion."
7750
  msgstr ""
7751
 
7752
  #. translators: 1. File path. 2. Error message.
7753
+ #: lib/wordfenceClass.php:5181
7754
  msgid "Could not delete file %1$s. The error was: %2$s"
7755
  msgstr ""
7756
 
7757
+ #: lib/wordfenceClass.php:5194
7758
  msgid "Could not remove the option because we could not find that issue."
7759
  msgstr ""
7760
 
7761
+ #: lib/wordfenceClass.php:5197
7762
  msgid "Could not remove the option because that issue does not appear to be a database related issue."
7763
  msgstr ""
7764
 
7765
  #. translators: 1. WordPress option. 2. Error message.
7766
+ #: lib/wordfenceClass.php:5210
7767
  msgid "Could not remove the option %1$s. The error was: %2$s"
7768
  msgstr ""
7769
 
7770
+ #: lib/wordfenceClass.php:5237
7771
  msgid "Modifying the .htaccess file did not resolve the issue, so the original .htaccess file was restored. You can fix this manually by setting <code>display_errors</code> to <code>Off</code> in your php.ini if your site is on a VPS or dedicated server that you control."
7772
  msgstr ""
7773
 
7774
+ #: lib/wordfenceClass.php:5279
7775
  msgid "We could not get the original file to do a repair."
7776
  msgstr ""
7777
 
7778
+ #: lib/wordfenceClass.php:5283
7779
  msgid "An invalid file was specified for repair."
7780
  msgstr ""
7781
 
7782
+ #: lib/wordfenceClass.php:5298
7783
  msgid "We could not write to that file. You may not have permission to modify files on your WordPress server."
7784
  msgstr ""
7785
 
7786
+ #: lib/wordfenceClass.php:5302
7787
  msgid "Ajax request received to start scan."
7788
  msgstr ""
7789
 
7790
  #. translators: Number of URLs.
7791
+ #: lib/wordfenceClass.php:5357
7792
  msgid "Page contains %d malware URL: "
7793
  msgid_plural "Page contains %d malware URLs: "
7794
  msgstr[0] ""
7795
  msgstr[1] ""
7796
 
7797
+ #: lib/wordfenceClass.php:5360
7798
  msgid "Run a Scan"
7799
  msgstr ""
7800
 
7801
+ #: lib/wordfenceClass.php:5408
7802
  msgid "Unknown dashboard data set."
7803
  msgstr ""
7804
 
7805
+ #: lib/wordfenceClass.php:5439
7806
  msgid "Bad security token. It may have been more than 12 hours since you reloaded the page you came from. Try reloading the page you came from. If that doesn't work, please sign out and sign-in again."
7807
  msgstr ""
7808
 
7809
+ #: lib/wordfenceClass.php:5626
7810
  msgid "An invalid IP address was specified."
7811
  msgstr ""
7812
 
7813
+ #: lib/wordfenceClass.php:5679
7814
+ #: lib/wordfenceClass.php:5719
7815
+ #: lib/wordfenceClass.php:5757
7816
  msgid "File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)"
7817
  msgstr ""
7818
 
7819
+ #: lib/wordfenceClass.php:5684
7820
+ #: lib/wordfenceClass.php:5762
7821
  msgid "Invalid file requested. (Relative paths not allowed)"
7822
  msgstr ""
7823
 
7824
+ #: lib/wordfenceClass.php:5688
7825
+ #: lib/wordfenceClass.php:5723
7826
+ #: lib/wordfenceClass.php:5766
7827
  msgid "File contains illegal characters."
7828
  msgstr ""
7829
 
7830
  #. translators: Error message.
7831
+ #: lib/wordfenceClass.php:5698
7832
  msgid "We could not open the requested file for reading. The error was: %s"
7833
  msgstr ""
7834
 
7835
+ #: lib/wordfenceClass.php:5706
7836
  msgid "Greater than 2 Gigs"
7837
  msgstr ""
7838
 
7839
+ #: lib/wordfenceClass.php:5711
7840
  msgid "Unknown file size."
7841
  msgstr ""
7842
 
7843
+ #: lib/wordfenceClass.php:5732
7844
  msgid "We could not get the contents of the original file to do a comparison."
7845
  msgstr ""
7846
 
7847
+ #: lib/wordfenceClass.php:5770
7848
  msgid "File does not exist."
7849
  msgstr ""
7850
 
7851
+ #: lib/wordfenceClass.php:6020
7852
  #: views/dashboard/options-group-import.php:167
7853
  msgid "Reload"
7854
  msgstr ""
7855
 
7856
+ #: lib/wordfenceClass.php:6037
7857
  msgid "${totalIPs} addresses in this network"
7858
  msgstr ""
7859
 
7860
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
7861
+ #: lib/wordfenceClass.php:6038
7862
  msgid "%s in POST body: %s"
7863
  msgstr ""
7864
 
7865
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
7866
+ #: lib/wordfenceClass.php:6039
7867
  msgid "%s in cookie: %s"
7868
  msgstr ""
7869
 
7870
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
7871
+ #: lib/wordfenceClass.php:6040
7872
  msgid "%s in file: %s"
7873
  msgstr ""
7874
 
7875
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
7876
+ #: lib/wordfenceClass.php:6041
7877
  msgid "%s in query string: %s"
7878
  msgstr ""
7879
 
7880
  #. translators: Domain name.
7881
+ #: lib/wordfenceClass.php:6042
7882
  msgid "%s is not valid hostname"
7883
  msgstr ""
7884
 
7885
  #. translators: Domain name.
7886
+ #: lib/wordfenceClass.php:6043
7887
  msgid ".htaccess Updated"
7888
  msgstr ""
7889
 
7890
+ #: lib/wordfenceClass.php:6044
7891
  msgid ".htaccess change"
7892
  msgstr ""
7893
 
7894
+ #: lib/wordfenceClass.php:6045
7895
  msgid "404 Not Found"
7896
  msgstr ""
7897
 
7898
+ #: lib/wordfenceClass.php:6046
7899
  msgid "Activity Log Sent"
7900
  msgstr ""
7901
 
7902
+ #: lib/wordfenceClass.php:6047
7903
  msgid "Add action to allowlist"
7904
  msgstr ""
7905
 
7906
+ #: lib/wordfenceClass.php:6048
7907
  msgid "Add code to .htaccess"
7908
  msgstr ""
7909
 
7910
+ #: lib/wordfenceClass.php:6049
7911
  msgid "All Hits"
7912
  msgstr ""
7913
 
7914
  #. translators: WordPress username.
7915
+ #: lib/wordfenceClass.php:6050
7916
  msgid "All capabilties of admin user %s were successfully revoked."
7917
  msgstr ""
7918
 
7919
+ #: lib/wordfenceClass.php:6052
7920
  msgid "An error occurred when adding the request to the allowlist."
7921
  msgstr ""
7922
 
7923
+ #: lib/wordfenceClass.php:6053
7924
  msgid "Are you sure you want to allowlist this action?"
7925
  msgstr ""
7926
 
7927
+ #: lib/wordfenceClass.php:6054
7928
  msgid "Authentication Code"
7929
  msgstr ""
7930
 
7931
+ #: lib/wordfenceClass.php:6055
7932
  msgid "Background Request Blocked"
7933
  msgstr ""
7934
 
7935
+ #: lib/wordfenceClass.php:6056
7936
  msgid "Block This Network"
7937
  msgstr ""
7938
 
7939
+ #: lib/wordfenceClass.php:6058
7940
  msgid "Blocked By Firewall"
7941
  msgstr ""
7942
 
7943
+ #: lib/wordfenceClass.php:6059
7944
  msgid "Blocked WAF"
7945
  msgstr ""
7946
 
7947
+ #: lib/wordfenceClass.php:6060
7948
  msgid "Blocked by Wordfence"
7949
  msgstr ""
7950
 
7951
+ #: lib/wordfenceClass.php:6061
7952
  msgid "Blocked by Wordfence plugin settings"
7953
  msgstr ""
7954
 
7955
+ #: lib/wordfenceClass.php:6062
7956
  msgid "Blocked by the Wordfence Application Firewall and plugin settings"
7957
  msgstr ""
7958
 
7959
+ #: lib/wordfenceClass.php:6063
7960
  msgid "Blocked by the Wordfence Security Network"
7961
  msgstr ""
7962
 
7963
+ #: lib/wordfenceClass.php:6064
7964
  msgid "Blocked by the Wordfence Web Application Firewall"
7965
  msgstr ""
7966
 
7967
+ #: lib/wordfenceClass.php:6067
7968
  msgid "Cellphone Sign-In Recovery Codes"
7969
  msgstr ""
7970
 
7971
+ #: lib/wordfenceClass.php:6068
7972
  msgid "Cellphone Sign-in activated for user."
7973
  msgstr ""
7974
 
7975
+ #: lib/wordfenceClass.php:6069
7976
  msgid "Click here to download a backup copy of this file now"
7977
  msgstr ""
7978
 
7979
+ #: lib/wordfenceClass.php:6070
7980
  msgid "Click here to download a backup copy of your .htaccess file now"
7981
  msgstr ""
7982
 
7983
+ #: lib/wordfenceClass.php:6071
7984
  msgid "Click to fix .htaccess"
7985
  msgstr ""
7986
 
7987
+ #: lib/wordfenceClass.php:6073
7988
  msgid "Crawlers"
7989
  msgstr ""
7990
 
7991
+ #: lib/wordfenceClass.php:6074
7992
  msgid "Diagnostic report has been sent successfully."
7993
  msgstr ""
7994
 
7995
+ #: lib/wordfenceClass.php:6075
7996
  msgid "Directory Listing Disabled"
7997
  msgstr ""
7998
 
7999
+ #: lib/wordfenceClass.php:6076
8000
  msgid "Directory listing has been disabled on your server."
8001
  msgstr ""
8002
 
8003
+ #: lib/wordfenceClass.php:6079
8004
  msgid "Don't ask again"
8005
  msgstr ""
8006
 
8007
+ #: lib/wordfenceClass.php:6081
8008
  msgid "Download Backup File"
8009
  msgstr ""
8010
 
8011
+ #: lib/wordfenceClass.php:6082
8012
  msgid "Each line of 16 letters and numbers is a single recovery code, with optional spaces for readability. When typing your password, enter \"wf\" followed by the entire code like \"mypassword wf1234 5678 90AB CDEF\". If your site shows a separate prompt for entering a code after entering only your username and password, enter only the code like \"1234 5678 90AB CDEF\". Your recovery codes are:"
8013
  msgstr ""
8014
 
8015
+ #: lib/wordfenceClass.php:6083
8016
  msgid "Email Diagnostic Report"
8017
  msgstr ""
8018
 
8019
+ #: lib/wordfenceClass.php:6084
8020
  msgid "Email Wordfence Activity Log"
8021
  msgstr ""
8022
 
8023
+ #: lib/wordfenceClass.php:6086
8024
  msgid "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."
8025
  msgstr ""
8026
 
8027
+ #: lib/wordfenceClass.php:6087
8028
  msgid "Error"
8029
  msgstr ""
8030
 
8031
+ #: lib/wordfenceClass.php:6088
8032
  msgid "Error Enabling All Options Page"
8033
  msgstr ""
8034
 
8035
+ #: lib/wordfenceClass.php:6089
8036
  msgid "Error Restoring Defaults"
8037
  msgstr ""
8038
 
8039
+ #: lib/wordfenceClass.php:6090
8040
  msgid "Error Saving Option"
8041
  msgstr ""
8042
 
8043
+ #: lib/wordfenceClass.php:6091
8044
  msgid "Error Saving Options"
8045
  msgstr ""
8046
 
8047
+ #: lib/wordfenceClass.php:6092
8048
  msgid "Failed Login"
8049
  msgstr ""
8050
 
8051
+ #: lib/wordfenceClass.php:6093
8052
  msgid "Failed Login: Invalid Username"
8053
  msgstr ""
8054
 
8055
+ #: lib/wordfenceClass.php:6094
8056
  msgid "Failed Login: Valid Username"
8057
  msgstr ""
8058
 
8059
+ #: lib/wordfenceClass.php:6095
8060
  msgid "File hidden successfully"
8061
  msgstr ""
8062
 
8063
+ #: lib/wordfenceClass.php:6096
8064
  msgid "File restored OK"
8065
  msgstr ""
8066
 
8067
+ #: lib/wordfenceClass.php:6097
8068
  msgid "Filter Traffic"
8069
  msgstr ""
8070
 
8071
+ #: lib/wordfenceClass.php:6098
8072
  msgid "Firewall Response"
8073
  msgstr ""
8074
 
8075
+ #: lib/wordfenceClass.php:6099
8076
  #: views/scanner/issue-wpscan_fullPathDiscl.php:8
8077
  msgid "Full Path Disclosure"
8078
  msgstr ""
8079
 
8080
+ #: lib/wordfenceClass.php:6100
8081
  msgid "Google Bot"
8082
  msgstr ""
8083
 
8084
+ #: lib/wordfenceClass.php:6101
8085
  msgid "Google Crawlers"
8086
  msgstr ""
8087
 
8088
+ #: lib/wordfenceClass.php:6102
8089
  msgid "HTTP Response Code"
8090
  msgstr ""
8091
 
8092
+ #: lib/wordfenceClass.php:6104
8093
  msgid "Humans"
8094
  msgstr ""
8095
 
8096
+ #: lib/wordfenceClass.php:6106
8097
  msgid "Key:"
8098
  msgstr ""
8099
 
8100
  #. translators: Localized date.
8101
+ #: lib/wordfenceClass.php:6107
8102
  msgid "Last Updated: %s"
8103
  msgstr ""
8104
 
8105
  #. translators: Localized date.
8106
+ #: lib/wordfenceClass.php:6108
8107
  msgid "Learn more about repairing modified files."
8108
  msgstr ""
8109
 
8110
+ #: lib/wordfenceClass.php:6110
8111
  msgid "Locked Out"
8112
  msgstr ""
8113
 
8114
+ #: lib/wordfenceClass.php:6111
8115
  msgid "Locked out from logging in"
8116
  msgstr ""
8117
 
8118
+ #: lib/wordfenceClass.php:6112
8119
  msgid "Logged In"
8120
  msgstr ""
8121
 
8122
+ #: lib/wordfenceClass.php:6113
8123
  msgid "Logins"
8124
  msgstr ""
8125
 
8126
+ #: lib/wordfenceClass.php:6114
8127
  msgid "Logins and Logouts"
8128
  msgstr ""
8129
 
8130
  #. translators: Localized date.
8131
+ #: lib/wordfenceClass.php:6117
8132
  msgid "Next Update Check: %s"
8133
  msgstr ""
8134
 
8135
  #. translators: Localized date.
8136
+ #: lib/wordfenceClass.php:6118
8137
  msgid "No activity to report yet. Please complete your first scan."
8138
  msgstr ""
8139
 
8140
+ #: lib/wordfenceClass.php:6119
8141
  msgid "No issues have been ignored."
8142
  msgstr ""
8143
 
8144
+ #: lib/wordfenceClass.php:6120
8145
  msgid "No new issues have been found."
8146
  msgstr ""
8147
 
8148
+ #: lib/wordfenceClass.php:6121
8149
  msgid "No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory."
8150
  msgstr ""
8151
 
8152
+ #: lib/wordfenceClass.php:6122
8153
  msgid "No rules were updated. Please verify your website can reach the Wordfence servers."
8154
  msgstr ""
8155
 
8156
+ #: lib/wordfenceClass.php:6123
8157
  msgid "No rules were updated. Your website has reached the maximum number of rule update requests. Please try again later."
8158
  msgstr ""
8159
 
8160
+ #: lib/wordfenceClass.php:6124
8161
  msgid "Note: Status will update when changes are saved"
8162
  msgstr ""
8163
 
8164
+ #: lib/wordfenceClass.php:6125
8165
  msgid "OK"
8166
  msgstr ""
8167
 
8168
+ #: lib/wordfenceClass.php:6126
8169
  msgid "Pages Not Found"
8170
  msgstr ""
8171
 
8172
+ #: lib/wordfenceClass.php:6127
8173
  msgid "Paid Members Only"
8174
  msgstr ""
8175
 
8176
+ #: lib/wordfenceClass.php:6129
8177
  msgid "Please enter a valid email address."
8178
  msgstr ""
8179
 
8180
+ #: lib/wordfenceClass.php:6130
8181
  msgid "Please include your support ticket number or forum username."
8182
  msgstr ""
8183
 
8184
+ #: lib/wordfenceClass.php:6131
8185
  msgid "Please make a backup of this file before proceeding. If you need to restore this backup file, you can copy it to the following path from your site's root:"
8186
  msgstr ""
8187
 
8188
+ #: lib/wordfenceClass.php:6132
8189
  msgid "Please specify a reason"
8190
  msgstr ""
8191
 
8192
+ #: lib/wordfenceClass.php:6133
8193
  msgid "Please specify a valid IP address range in the form of \"1.2.3.4 - 1.2.3.5\" without quotes. Make sure the dash between the IP addresses in a normal dash (a minus sign on your keyboard) and not another character that looks like a dash."
8194
  msgstr ""
8195
 
8196
+ #: lib/wordfenceClass.php:6134
8197
  msgid "Please specify either an IP address range, Hostname or a web browser pattern to match."
8198
  msgstr ""
8199
 
8200
+ #: lib/wordfenceClass.php:6135
8201
  msgid "Recent Activity"
8202
  msgstr ""
8203
 
8204
+ #: lib/wordfenceClass.php:6136
8205
  msgid "Recovery Codes"
8206
  msgstr ""
8207
 
8208
+ #: lib/wordfenceClass.php:6137
8209
  msgid "Redirected"
8210
  msgstr ""
8211
 
8212
+ #: lib/wordfenceClass.php:6138
8213
  msgid "Redirected by Country Blocking bypass URL"
8214
  msgstr ""
8215
 
8216
+ #: lib/wordfenceClass.php:6139
8217
  msgid "Referer"
8218
  msgstr ""
8219
 
8220
+ #: lib/wordfenceClass.php:6140
8221
  msgid "Registered Users"
8222
  msgstr ""
8223
 
8224
+ #: lib/wordfenceClass.php:6142
8225
  msgid "Rule Update Failed"
8226
  msgstr ""
8227
 
8228
+ #: lib/wordfenceClass.php:6143
8229
  msgid "Rules Updated"
8230
  msgstr ""
8231
 
8232
+ #: lib/wordfenceClass.php:6145
8233
  msgid "Scan Complete."
8234
  msgstr ""
8235
 
8236
+ #: lib/wordfenceClass.php:6146
8237
  msgid "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."
8238
  msgstr ""
8239
 
8240
+ #: lib/wordfenceClass.php:6147
8241
  msgid "Security Event"
8242
  msgstr ""
8243
 
8244
+ #: lib/wordfenceClass.php:6148
8245
  msgid "Send"
8246
  msgstr ""
8247
 
8248
+ #: lib/wordfenceClass.php:6149
8249
  msgid "Sorry, but no data for that IP or domain was found."
8250
  msgstr ""
8251
 
8252
+ #: lib/wordfenceClass.php:6150
8253
  msgid "Specify a valid IP range"
8254
  msgstr ""
8255
 
8256
+ #: lib/wordfenceClass.php:6151
8257
  msgid "Specify a valid hostname"
8258
  msgstr ""
8259
 
8260
+ #: lib/wordfenceClass.php:6152
8261
  msgid "Specify an IP range, Hostname or Browser pattern"
8262
  msgstr ""
8263
 
8264
+ #: lib/wordfenceClass.php:6153
8265
  msgid "Success deleting file"
8266
  msgstr ""
8267
 
8268
+ #: lib/wordfenceClass.php:6154
8269
  msgid "Success removing option"
8270
  msgstr ""
8271
 
8272
+ #: lib/wordfenceClass.php:6155
8273
  msgid "Success restoring file"
8274
  msgstr ""
8275
 
8276
+ #: lib/wordfenceClass.php:6156
8277
  msgid "Success updating option"
8278
  msgstr ""
8279
 
8280
+ #: lib/wordfenceClass.php:6157
8281
  msgid "Successfully deleted admin"
8282
  msgstr ""
8283
 
8284
+ #: lib/wordfenceClass.php:6158
8285
  msgid "Successfully revoked admin"
8286
  msgstr ""
8287
 
8288
+ #: lib/wordfenceClass.php:6159
8289
  msgid "Test Email Sent"
8290
  msgstr ""
8291
 
8292
+ #: lib/wordfenceClass.php:6160
8293
  msgid "The 'How does Wordfence get IPs' option was successfully updated to the recommended value."
8294
  msgstr ""
8295
 
8296
+ #: lib/wordfenceClass.php:6161
8297
  msgid "The Full Path disclosure issue has been fixed"
8298
  msgstr ""
8299
 
8300
  #. translators: WordPress username.
8301
+ #: lib/wordfenceClass.php:6162
8302
  msgid "The admin user %s was successfully deleted."
8303
  msgstr ""
8304
 
8305
  #. translators: File path.
8306
+ #: lib/wordfenceClass.php:6163
8307
  msgid "The file %s was successfully deleted."
8308
  msgstr ""
8309
 
8310
  #. translators: File path.
8311
+ #: lib/wordfenceClass.php:6164
8312
  msgid "The file %s was successfully hidden from public view."
8313
  msgstr ""
8314
 
8315
  #. translators: File path.
8316
+ #: lib/wordfenceClass.php:6165
8317
  msgid "The file %s was successfully restored."
8318
  msgstr ""
8319
 
8320
  #. translators: WordPress option.
8321
+ #: lib/wordfenceClass.php:6166
8322
  msgid "The option %s was successfully removed."
8323
  msgstr ""
8324
 
8325
  #. translators: WordPress option.
8326
+ #: lib/wordfenceClass.php:6167
8327
  msgid "The request has been allowlisted. Please try it again."
8328
  msgstr ""
8329
 
8330
+ #: lib/wordfenceClass.php:6168
8331
  msgid "There was an error while sending the email."
8332
  msgstr ""
8333
 
8334
+ #: lib/wordfenceClass.php:6169
8335
  msgid "This will be shown only once. Keep these codes somewhere safe."
8336
  msgstr ""
8337
 
8338
+ #: lib/wordfenceClass.php:6170
8339
  msgid "Throttled"
8340
  msgstr ""
8341
 
8342
+ #: lib/wordfenceClass.php:6171
8343
  msgid "Two Factor Status"
8344
  msgstr ""
8345
 
8346
  #. translators: HTTP client type.
8347
+ #: lib/wordfenceClass.php:6173
8348
  msgid "Type: %s"
8349
  msgstr ""
8350
 
8351
  #. translators: HTTP client type.
8352
+ #: lib/wordfenceClass.php:6174
8353
  #: views/scanner/issue-checkGSB.php:8
8354
  #: views/scanner/issue-commentBadURL.php:8
8355
  #: views/scanner/issue-configReadable.php:12
8369
  msgid "URL"
8370
  msgstr ""
8371
 
8372
+ #: lib/wordfenceClass.php:6175
8373
  msgid "Unable to automatically hide file"
8374
  msgstr ""
8375
 
8376
  #. translators: 2FA backup codes.
8377
+ #: lib/wordfenceClass.php:6176
8378
  msgid "Use one of these %s codes to log in if you are unable to access your phone. Codes are 16 characters long, plus optional spaces. Each one may be used only once."
8379
  msgstr ""
8380
 
8381
  #. translators: 2FA backup codes.
8382
+ #: lib/wordfenceClass.php:6177
8383
  msgid "Use one of these %s 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."
8384
  msgstr ""
8385
 
8386
+ #: lib/wordfenceClass.php:6179
8387
  msgid "User ID"
8388
  msgstr ""
8389
 
8390
+ #: lib/wordfenceClass.php:6181
8391
  msgid "WHOIS LOOKUP"
8392
  msgstr ""
8393
 
8394
+ #: lib/wordfenceClass.php:6182
8395
  msgid "We are about to change your <em>.htaccess</em> file. Please make a backup of this file before proceeding."
8396
  msgstr ""
8397
 
8398
  #. translators: Error message.
8399
+ #: lib/wordfenceClass.php:6183
8400
  msgid "We can't modify your .htaccess file for you because: %s"
8401
  msgstr ""
8402
 
8403
  #. translators: Error message.
8404
+ #: lib/wordfenceClass.php:6184
8405
  msgid "We encountered a problem"
8406
  msgstr ""
8407
 
8408
  #. translators: URL.
8409
+ #: lib/wordfenceClass.php:6185
8410
  msgid "Wordfence Firewall blocked a background request to WordPress for the URL %s. If this occurred as a result of an intentional action, you may consider allowlisting the request to allow it in the future."
8411
  msgstr ""
8412
 
8413
  #. translators: URL.
8414
+ #: lib/wordfenceClass.php:6186
8415
  msgid "Wordfence is working..."
8416
  msgstr ""
8417
 
8418
+ #: lib/wordfenceClass.php:6187
8419
  msgid "You are using Nginx as your web server. You'll need to disable autoindexing in your nginx.conf. See the <a target='_blank' rel='noopener noreferrer' href='http://nginx.org/en/docs/http/ngx_http_autoindex_module.html'>Nginx docs for more info</a> on how to do this."
8420
  msgstr ""
8421
 
8422
+ #: lib/wordfenceClass.php:6188
8423
  msgid "You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually delete or hide those files."
8424
  msgstr ""
8425
 
8426
+ #: lib/wordfenceClass.php:6189
8427
  msgid "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>"
8428
  msgstr ""
8429
 
8430
+ #: lib/wordfenceClass.php:6190
8431
  msgid "You forgot to include a reason you're blocking this IP range. We ask you to include this for your own record keeping."
8432
  msgstr ""
8433
 
8434
+ #: lib/wordfenceClass.php:6191
8435
  msgid "You have unsaved changes to your options. If you leave this page, those changes will be lost."
8436
  msgstr ""
8437
 
8438
+ #: lib/wordfenceClass.php:6192
8439
  msgid "Your .htaccess has been updated successfully. Please verify your site is functioning normally."
8440
  msgstr ""
8441
 
8442
  #. translators: Email address.
8443
+ #: lib/wordfenceClass.php:6193
8444
  msgid "Your Wordfence activity log was sent to %s"
8445
  msgstr ""
8446
 
8447
  #. translators: Email address.
8448
+ #: lib/wordfenceClass.php:6194
8449
  msgid "Your rules have been updated successfully."
8450
  msgstr ""
8451
 
8452
+ #: lib/wordfenceClass.php:6195
8453
  msgid "Your rules have been updated successfully. You are currently using the free version of Wordfence. Upgrade to Wordfence premium to have your rules updated automatically as new threats emerge. <a href=\"https://www.wordfence.com/wafUpdateRules1/wordfence-signup/\">Click here to purchase a premium license</a>. <em>Note: Your rules will still update every 30 days as a free user.</em>"
8454
  msgstr ""
8455
 
8456
  #. translators: wp_mail() return value.
8457
+ #: lib/wordfenceClass.php:6196
8458
  msgid "Your test email was sent to the requested email address. The result we received from the WordPress wp_mail() function was: %s<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."
8459
  msgstr ""
8460
 
8461
  #. translators: wp_mail() return value.
8462
+ #: lib/wordfenceClass.php:6197
8463
  msgid "blocked by firewall"
8464
  msgstr ""
8465
 
8466
  #. translators: Reason for firewall action.
8467
+ #: lib/wordfenceClass.php:6198
8468
  msgid "blocked by firewall for %s"
8469
  msgstr ""
8470
 
8471
  #. translators: Reason for firewall action.
8472
+ #: lib/wordfenceClass.php:6199
8473
  msgid "blocked by real-time IP blocklist"
8474
  msgstr ""
8475
 
8476
+ #: lib/wordfenceClass.php:6200
8477
  msgid "blocked by the Wordfence Security Network"
8478
  msgstr ""
8479
 
8480
  #. translators: Reason for firewall action.
8481
+ #: lib/wordfenceClass.php:6201
8482
  msgid "blocked for %s"
8483
  msgstr ""
8484
 
8485
  #. translators: Reason for firewall action.
8486
+ #: lib/wordfenceClass.php:6202
8487
  msgid "locked out from logging in"
8488
  msgstr ""
8489
 
8490
+ #: lib/wordfenceClass.php:6215
8491
  msgid "Wordfence generated an error on activation. The output we received during activation was:"
8492
  msgstr ""
8493
 
8494
+ #: lib/wordfenceClass.php:6222
8495
  msgid "Wordfence could not register with the Wordfence scanning servers when it activated."
8496
  msgstr ""
8497
 
8498
+ #: lib/wordfenceClass.php:6223
8499
  msgid "You can try to fix this by deactivating Wordfence and then activating it again, so Wordfence will retry registering for you. If you keep seeing this error, it usually means your WordPress server can't connect to our scanning servers, or your wfConfig database table cannot be created to save the key. You can try asking your host to allow your server to connect to noc1.wordfence.com or check the wfConfig database table and database privileges."
8500
  msgstr ""
8501
 
8502
+ #: lib/wordfenceClass.php:6237
8503
  msgid "The Wordfence Web Application Firewall cannot run."
8504
  msgstr ""
8505
 
8506
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
8507
+ #: lib/wordfenceClass.php:6240
8508
  msgid "The configuration files are corrupt or inaccessible by the web server, which is preventing the WAF from functioning. Please verify the web server has permission to access the configuration files. You may also try to rebuild the configuration file by <a href=\"%1$s\">clicking here</a>. It will automatically resume normal operation when it is fixed. <a class=\"wfhelp\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"%2$s\"></a>"
8509
  msgstr ""
8510
 
8511
+ #: lib/wordfenceClass.php:6246
8512
+ msgid "The WAF storage engine is currently set to mysqli, but Wordfence is unable to use the database. The WAF will fall back to using local file system storage instead."
8513
+ msgstr ""
8514
+
8515
+ #: lib/wordfenceClass.php:6259
8516
+ #: lib/wordfenceClass.php:6278
8517
  msgid "The Wordfence Web Application Firewall needs a configuration update."
8518
  msgstr ""
8519
 
8520
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
8521
+ #: lib/wordfenceClass.php:6262
8522
  msgid "It is currently configured to use an older version of PHP and may become deactivated if PHP is updated. You may perform the configuration update automatically by <a href=\"%1$s\">clicking here</a>. <a class=\"wfhelp\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"%2$s\"></a>"
8523
  msgstr ""
8524
 
8525
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
8526
+ #: lib/wordfenceClass.php:6281
8527
  msgid "It is not currently in extended protection mode but was configured to use an older version of PHP and may have become deactivated when PHP was updated. You may perform the configuration update automatically by <a href=\"%1$s\">clicking here</a> or use the \"Optimize the Wordfence Firewall\" button on the Firewall Options page. <a class=\"wfhelp\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"%2$s\"></a>"
8528
  msgstr ""
8529
 
8530
+ #: lib/wordfenceClass.php:6287
8531
  msgid "The Wordfence Web Application Firewall is in read-only mode."
8532
  msgstr ""
8533
 
8534
+ #: lib/wordfenceClass.php:6296
8535
  msgid "This site is currently using PHP's built in REMOTE_ADDR."
8536
  msgstr ""
8537
 
8538
+ #: lib/wordfenceClass.php:6299
8539
  msgid "This site is currently using the X-Forwarded-For HTTP header, which should only be used when the site is behind a front-end proxy that outputs this header."
8540
  msgstr ""
8541
 
8542
+ #: lib/wordfenceClass.php:6302
8543
  msgid "This site is currently using the X-Real-IP HTTP header, which should only be used when the site is behind a front-end proxy that outputs this header."
8544
  msgstr ""
8545
 
8546
+ #: lib/wordfenceClass.php:6305
8547
  msgid "This site is currently using the Cloudflare \"CF-Connecting-IP\" HTTP header, which should only be used when the site is behind Cloudflare."
8548
  msgstr ""
8549
 
8550
+ #: lib/wordfenceClass.php:6322
8551
  msgid "Your 'How does Wordfence get IPs' setting is misconfigured."
8552
  msgstr ""
8553
 
8554
+ #: lib/wordfenceClass.php:6324
8555
  msgid "Click here to use the recommended setting"
8556
  msgstr ""
8557
 
8558
+ #: lib/wordfenceClass.php:6326
8559
  #: views/onboarding/fresh-install.php:39
8560
  msgid "or"
8561
  msgstr ""
8562
 
8563
+ #: lib/wordfenceClass.php:6328
8564
  msgid "visit the options page"
8565
  msgstr ""
8566
 
8567
+ #: lib/wordfenceClass.php:6330
8568
  msgid "to manually update it."
8569
  msgstr ""
8570
 
8571
+ #: lib/wordfenceClass.php:6338
8572
  msgid "Do you want Wordfence to stay up-to-date automatically?"
8573
  msgstr ""
8574
 
8575
+ #: lib/wordfenceClass.php:6340
8576
  msgid "Yes, enable auto-update."
8577
  msgstr ""
8578
 
8579
+ #: lib/wordfenceClass.php:6342
8580
  msgid "No thanks."
8581
  msgstr ""
8582
 
8583
  #. translators: Localized date.
8584
+ #: lib/wordfenceClass.php:6431
8585
  msgid "The last rules update for the Wordfence Web Application Firewall was unsuccessful. The last successful update check was %s, so this site may be missing new rules added since then."
8586
  msgstr ""
8587
 
8588
  #. translators: 1. Localized date. 2. WordPress admin panel URL.
8589
+ #: lib/wordfenceClass.php:6439
8590
  msgid "You may wait for the next automatic attempt at %1$s or try to <a href=\"%2$s\">Manually Update</a> by clicking the \"Manually Refresh Rules\" button below the Rules list."
8591
  msgstr ""
8592
 
8593
  #. translators: WordPress admin panel URL.
8594
+ #: lib/wordfenceClass.php:6445
8595
  msgid "You may wait for the next automatic attempt or try to <a href=\"%s\">Manually Update</a> by clicking the \"Manually Refresh Rules\" button below the Rules list."
8596
  msgstr ""
8597
 
8598
  #. translators: WordPress admin panel URL.
8599
+ #: lib/wordfenceClass.php:6450
8600
  msgid "You may wait for the next automatic attempt at %s or log into the parent site to manually update by clicking the \"Manually Refresh Rules\" button below the Rules list."
8601
  msgstr ""
8602
 
8603
+ #: lib/wordfenceClass.php:6453
8604
  msgid "You may wait for the next automatic attempt or log into the parent site to manually update by clicking the \"Manually Refresh Rules\" button below the Rules list."
8605
  msgstr ""
8606
 
8607
+ #: lib/wordfenceClass.php:6556
8608
  #: models/page/wfPage.php:101
8609
  msgid "Dashboard"
8610
  msgstr ""
8611
 
8612
  #. translators: Number of notifications.
8613
+ #: lib/wordfenceClass.php:6636
8614
  msgid "You have %d new Wordfence notification."
8615
  msgid_plural "You have %d new Wordfence notifications."
8616
  msgstr[0] ""
8617
  msgstr[1] ""
8618
 
8619
+ #: lib/wordfenceClass.php:6660
8620
  msgid "JavaScript Errors"
8621
  msgstr ""
8622
 
8623
+ #: lib/wordfenceClass.php:6666
8624
  msgid "Malware URLs"
8625
  msgstr ""
8626
 
8627
  #. translators: WordPress admin panel URL.
8628
+ #: lib/wordfenceClass.php:6784
8629
+ #: lib/wordfenceClass.php:6847
8630
  msgid "<a href=\"%s\">Click here</a> to rebuild the configuration file."
8631
  msgstr ""
8632
 
8633
  #. translators: File path.
8634
+ #: lib/wordfenceClass.php:6795
8635
+ #: lib/wordfenceClass.php:6858
8636
  msgid "We were unable to write to %s which the WAF uses for storage. Please update permissions on the parent directory so the web server can write to it."
8637
  msgstr ""
8638
 
8639
+ #: lib/wordfenceClass.php:6805
8640
+ #: lib/wordfenceClass.php:6868
8641
  msgid "An error occured when fetching the WAF configuration from the database."
8642
  msgstr ""
8643
 
8644
  #. translators: Plugin name.
8645
+ #: lib/wordfenceClass.php:6890
8646
  msgid "The Wordfence Live Traffic feature has been disabled because you have %s active which is not compatible with Wordfence Live Traffic."
8647
  msgstr ""
8648
 
8649
  #. translators: 1. Plugin name.
8650
+ #: lib/wordfenceClass.php:6892
8651
  msgid "If you want to reenable Wordfence Live Traffic, you need to deactivate %1$s and then go to the Wordfence options page and reenable Live Traffic there. Wordfence does work with %1$s, however Live Traffic will be disabled and the Wordfence firewall will also count less hits per visitor because of the %1$s caching function. All other functions should work correctly."
8652
  msgstr ""
8653
 
8654
  #. translators: File path.
8655
+ #: lib/wordfenceClass.php:6953
8656
  msgid "The file <code>%s</code> was restored successfully."
8657
  msgstr ""
8658
 
8659
+ #: lib/wordfenceClass.php:6958
8660
  msgid "There was an error restoring the file."
8661
  msgstr ""
8662
 
8663
+ #: lib/wordfenceClass.php:6968
8664
+ #: lib/wordfenceClass.php:6991
8665
  msgid "Return to scan results"
8666
  msgstr ""
8667
 
8668
  #. translators: File path.
8669
+ #: lib/wordfenceClass.php:6977
8670
  msgid "The file <code>%s</code> was deleted successfully."
8671
  msgstr ""
8672
 
8673
+ #: lib/wordfenceClass.php:6981
8674
  msgid "There was an error deleting the file."
8675
  msgstr ""
8676
 
8677
  #. translators: IP address.
8678
+ #: lib/wordfenceClass.php:7049
8679
  msgid ""
8680
  "User IP: %s\n"
8681
  ""
8682
  msgstr ""
8683
 
8684
  #. translators: Domain name.
8685
+ #: lib/wordfenceClass.php:7052
8686
  msgid ""
8687
  "User hostname: %s\n"
8688
  ""
8689
  msgstr ""
8690
 
8691
+ #: lib/wordfenceClass.php:7056
8692
  msgid "User location: "
8693
  msgstr ""
8694
 
8695
  #. translators: WordPress admin panel URL.
8696
+ #: lib/wordfenceClass.php:7111
8697
  msgid "No longer an administrator for this site? Click here to stop receiving security alerts: %s"
8698
  msgstr ""
8699
 
8700
+ #: lib/wordfenceClass.php:7151
8701
  msgid "The IP you provided must be in dotted quad notation or use ranges with square brackets. e.g. 10.11.12.13 or 10.11.12.[1-50]"
8702
  msgstr ""
8703
 
8704
+ #: lib/wordfenceClass.php:7170
8705
+ msgid "Invalid email address provided"
8706
  msgstr ""
8707
 
8708
+ #: lib/wordfenceClass.php:7175
8709
  msgid "Test email sent successfully"
8710
  msgstr ""
8711
 
8712
+ #: lib/wordfenceClass.php:7176
8713
+ msgid "Test email failed to send"
8714
  msgstr ""
8715
 
8716
  #. translators: Localized date range.
8717
+ #: lib/wordfenceClass.php:7194
8718
  msgid "Wordfence activity in the past %s"
8719
  msgstr ""
8720
 
8721
+ #: lib/wordfenceClass.php:7234
8722
+ #: lib/wordfenceClass.php:7238
8723
+ #: lib/wordfenceClass.php:7269
8724
  msgid "We could not find that user in the database."
8725
  msgstr ""
8726
 
8727
+ #: lib/wordfenceClass.php:7242
8728
  msgid "This user's email is the network admin email. It will need to be changed before deleting this user."
8729
  msgstr ""
8730
 
8731
+ #: lib/wordfenceClass.php:7306
8732
  msgid "Wordfence could not find your .htaccess file."
8733
  msgstr ""
8734
 
8735
+ #: lib/wordfenceClass.php:7322
8736
  msgid "Updating the .htaccess did not fix the issue. You may need to add <code>Options -Indexes</code> to your httpd.conf if using Apache, or find documentation on how to disable directory listing for your web server."
8737
  msgstr ""
8738
 
8739
+ #: lib/wordfenceClass.php:7328
8740
  msgid "There was an error writing to your .htaccess file."
8741
  msgstr ""
8742
 
8743
+ #: lib/wordfenceClass.php:7407
8744
  msgid "Required parameters not sent."
8745
  msgstr ""
8746
 
8747
+ #: lib/wordfenceClass.php:7417
8748
  msgid "The WAF is currently in read-only mode and will not save any configuration changes."
8749
  msgstr ""
8750
 
8751
+ #: lib/wordfenceClass.php:7455
8752
  #: views/waf/option-whitelist.php:60
8753
  msgid "Allowlisted via Firewall Options page"
8754
  msgstr ""
8755
 
8756
+ #: lib/wordfenceClass.php:7742
8757
  msgid "Allowlisted via Live Traffic"
8758
  msgstr ""
8759
 
8760
+ #: lib/wordfenceClass.php:7906
8761
+ #: lib/wordfenceClass.php:8003
8762
  msgid "A valid server configuration was not provided."
8763
  msgstr ""
8764
 
8765
+ #: lib/wordfenceClass.php:7917
8766
+ #: lib/wordfenceClass.php:8024
8767
  msgid "Filesystem Credentials Required"
8768
  msgstr ""
8769
 
8770
  #. translators: Support URL.
8771
+ #: lib/wordfenceClass.php:7919
8772
+ #: lib/wordfenceClass.php:7943
8773
+ #: lib/wordfenceClass.php:7987
8774
  msgid "If you cannot complete the setup process, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">click here for help</a>"
8775
  msgstr ""
8776
 
8777
  #. translators: Support URL.
8778
+ #: lib/wordfenceClass.php:7920
8779
  msgid "Once you have entered credentials, click Continue to complete the setup."
8780
  msgstr ""
8781
 
8782
+ #: lib/wordfenceClass.php:7941
8783
+ #: lib/wordfenceClass.php:8049
8784
  msgid "Filesystem Permission Error"
8785
  msgstr ""
8786
 
8787
+ #: lib/wordfenceClass.php:7967
8788
  msgid "Manual Installation Instructions"
8789
  msgstr ""
8790
 
8791
+ #: lib/wordfenceClass.php:7974
8792
  msgid "Installation Successful"
8793
  msgstr ""
8794
 
8795
+ #: lib/wordfenceClass.php:7985
8796
  msgid "Installation Failed"
8797
  msgstr ""
8798
 
8799
  #. translators: Support URL.
8800
+ #: lib/wordfenceClass.php:8026
8801
+ #: lib/wordfenceClass.php:8051
8802
+ #: lib/wordfenceClass.php:8082
8803
+ #: lib/wordfenceClass.php:8111
8804
+ #: lib/wordfenceClass.php:8157
8805
  #: views/waf/waf-uninstall.php:13
8806
  msgid "If you cannot complete the uninstall process, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">click here for help</a>"
8807
  msgstr ""
8808
 
8809
  #. translators: Support URL.
8810
+ #: lib/wordfenceClass.php:8027
8811
  msgid "Once you have entered credentials, click Continue to complete uninstallation."
8812
  msgstr ""
8813
 
8814
+ #: lib/wordfenceClass.php:8071
8815
  msgid "The <code>auto_prepend_file</code> setting has been successfully removed from <code>.htaccess</code> and <code>.user.ini</code>. Once this change takes effect, Extended Protection Mode will be disabled."
8816
  msgstr ""
8817
 
8818
+ #: lib/wordfenceClass.php:8073
8819
  msgid "Any previous value for <code>auto_prepend_file</code> will need to be re-enabled manually if still needed."
8820
  msgstr ""
8821
 
8822
  #. translators: Time until.
8823
+ #: lib/wordfenceClass.php:8077
8824
  msgid "Waiting for it to take effect. This may take up to %s."
8825
  msgstr ""
8826
 
8827
+ #: lib/wordfenceClass.php:8080
8828
  msgid "Waiting for Changes"
8829
  msgstr ""
8830
 
8831
+ #: lib/wordfenceClass.php:8102
8832
  msgid "Extended Protection Mode has not been disabled. This may be because <code>auto_prepend_file</code> is configured somewhere else or the value is still cached by PHP."
8833
  msgstr ""
8834
 
8835
+ #: lib/wordfenceClass.php:8104
8836
  msgid "Retrying Failed."
8837
  msgstr ""
8838
 
8839
+ #: lib/wordfenceClass.php:8106
8840
  msgid "Try Again"
8841
  msgstr ""
8842
 
8843
+ #: lib/wordfenceClass.php:8109
8844
  msgid "Unable to Uninstall"
8845
  msgstr ""
8846
 
8847
+ #: lib/wordfenceClass.php:8145
8848
  msgid "Uninstallation Complete"
8849
  msgstr ""
8850
 
8851
+ #: lib/wordfenceClass.php:8155
8852
  msgid "Uninstallation Failed"
8853
  msgstr ""
8854
 
8855
  #. translators: 1. Number of attacks/blocks. 2. Time since.
8856
+ #: lib/wordfenceClass.php:8309
8857
  msgid "The Wordfence Web Application Firewall has blocked %1$d attacks over the last %2$s. Below is a sample of these recent attacks:"
8858
  msgstr ""
8859
 
8860
+ #: lib/wordfenceClass.php:8873
8861
  msgid "To make your site as secure as possible, take a moment to optimize the Wordfence Web Application Firewall:"
8862
  msgstr ""
8863
 
8864
+ #: lib/wordfenceClass.php:8873
8865
  msgid "Click here to configure"
8866
  msgstr ""
8867
 
8868
  #. translators: Support URL.
8869
+ #: lib/wordfenceClass.php:8876
8870
  msgid "If you cannot complete the setup process, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">click here for help</a>."
8871
  msgstr ""
8872
 
8873
+ #: lib/wordfenceClass.php:8882
8874
  #: views/waf/waf-install-success.php:14
8875
  msgid "Nice work! The firewall is now optimized."
8876
  msgstr ""
8877
 
8878
+ #: lib/wordfenceClass.php:8884
8879
+ #: lib/wordfenceClass.php:8896
8880
  #: views/waf/waf-install-success.php:16
8881
  #: views/waf/waf-uninstall-success.php:19
8882
  msgid "The changes have not yet taken effect. If you are using LiteSpeed or IIS as your web server or CGI/FastCGI interface, you may need to wait a few minutes for the changes to take effect since the configuration files are sometimes cached. You also may need to select a different server configuration in order to complete this step, but wait for a few minutes before trying. You can try refreshing this page."
8883
  msgstr ""
8884
 
8885
+ #: lib/wordfenceClass.php:8890
8886
  #: views/waf/waf-uninstall-success.php:15
8887
  msgid "Uninstallation was successful!"
8888
  msgstr ""
8889
 
8890
+ #: lib/wordfenceClass.php:8893
8891
  #: views/waf/waf-uninstall-success.php:17
8892
  msgid "Uninstallation from this site was successful! The Wordfence Firewall is still active because it is installed in another WordPress installation."
8893
  msgstr ""
8894
 
8895
+ #: lib/wordfenceClass.php:8901
8896
  msgid "The update was successful!"
8897
  msgstr ""
8898
 
8899
+ #: lib/wordfenceClass.php:9028
8900
  msgid "Auth grant is invalid."
8901
  msgstr ""
8902
 
8903
+ #: lib/wordfenceClass.php:9091
8904
+ #: lib/wordfenceClass.php:9228
8905
  msgid "Access token not found."
8906
  msgstr ""
8907
 
8908
+ #: lib/wordfenceClass.php:9136
8909
+ #: lib/wordfenceClass.php:9203
8910
  msgid "Invalid response from Wordfence Central."
8911
  msgstr ""
8912
 
8913
+ #: lib/wordfenceClass.php:9179
8914
  msgid "Auth grant not found."
8915
  msgstr ""
8916
 
8917
+ #: lib/wordfenceClass.php:9445
8918
  msgid "We were unable to create the <code>wordfence-waf.php</code> file in the root of the WordPress installation. It's possible WordPress cannot write to the <code>wordfence-waf.php</code> file because of file permissions. Please verify the permissions are correct and retry the installation."
8919
  msgstr ""
8920
 
8921
+ #: lib/wordfenceClass.php:9537
8922
+ #: lib/wordfenceClass.php:9608
8923
  msgid "We were unable to make changes to the .htaccess file. It's possible WordPress cannot write to the .htaccess file because of file permissions, which may have been set by another security plugin, or you may have set them manually. Please verify the permissions allow the web server to write to the file, and retry the installation."
8924
  msgstr ""
8925
 
8926
  #. translators: File path.
8927
+ #: lib/wordfenceClass.php:9578
8928
+ #: lib/wordfenceClass.php:9626
8929
  msgid "We were unable to make changes to the %1$s file. It's possible WordPress cannot write to the %1$s file because of file permissions. Please verify the permissions are correct and retry the installation."
8930
  msgstr ""
8931
 
8932
+ #: lib/wordfenceClass.php:9642
8933
  msgid "We were unable to remove the <code>wordfence-waf.php</code> file in the root of the WordPress installation. It's possible WordPress cannot remove the <code>wordfence-waf.php</code> file because of file permissions. Please verify the permissions are correct and retry the removal."
8934
  msgstr ""
8935
 
10409
  msgstr ""
10410
 
10411
  #: views/reports/activity-report-email-inline.php:134
10412
+ msgid "NOTE: You are using the free version of Wordfence and are missing out on features like real-time firewall rule and malware signature updates, country blocking, and detecting if your site IP is sending spam. <a href=\"http://www.wordfence.com/zz6/\">Click here to upgrade to Wordfence Premium now</a>."
10413
  msgstr ""
10414
 
10415
  #: views/reports/activity-report-email-inline.php:138
lib/IPTrafList.php CHANGED
@@ -11,7 +11,7 @@ if (!wfUtils::isAdmin()) {
11
  <?php foreach ($results as $key => $v) { ?>
12
  <tr>
13
  <th><?php esc_html_e('Time:', 'wordfence') ?></th>
14
- <td><?php esc_html(sprintf(
15
  /* translators: 1. Time ago, example: 2 hours, 40 seconds. 2. Localized date. 3. Unix timestamp. */
16
  __('%1$s ago -- %2$s -- %3$s in Unixtime', 'wordfence'), $v['timeAgo'], date(DATE_RFC822, $v['ctime']), $v['ctime'])) ?></td>
17
  </tr>
11
  <?php foreach ($results as $key => $v) { ?>
12
  <tr>
13
  <th><?php esc_html_e('Time:', 'wordfence') ?></th>
14
+ <td><?php esc_html_e(sprintf(
15
  /* translators: 1. Time ago, example: 2 hours, 40 seconds. 2. Localized date. 3. Unix timestamp. */
16
  __('%1$s ago -- %2$s -- %3$s in Unixtime', 'wordfence'), $v['timeAgo'], date(DATE_RFC822, $v['ctime']), $v['ctime'])) ?></td>
17
  </tr>
lib/email_newIssues.php CHANGED
@@ -109,6 +109,8 @@ foreach ($severitySections as $severityLevel => $severityLabel):
109
  }
110
  }
111
  if (isset($i['tmplData']['wpURL'])) {
 
 
112
  echo $i['tmplData']['wpURL'] . '/#developers';
113
  }
114
  if ($showWPParagraph) {
109
  }
110
  }
111
  if (isset($i['tmplData']['wpURL'])) {
112
+ if(!empty($i['tmplData']['vulnerable']))
113
+ echo '<br>';
114
  echo $i['tmplData']['wpURL'] . '/#developers';
115
  }
116
  if ($showWPParagraph) {
lib/menu_tools_diagnostic.php CHANGED
@@ -855,13 +855,13 @@ if (!isset($sendingDiagnosticEmail)) {
855
  <span>
856
  <?php esc_html_e('Send a test activity report email:', 'wordfence'); ?> <a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_TEST_ACTIVITY_REPORT); ?>" target="_blank" rel="noopener noreferrer" class="wfhelp wf-inline-help"></a>
857
  <input type="email" id="email_summary_email_address_debug" value="" size="20" maxlength="255" class="wfConfigElem"/>
858
- <input class="wf-btn wf-btn-default wf-btn-sm" type="button" value="<?php esc_attr_e('Send Test Activity Report', 'wordfence'); ?>" onclick="WFAD.ajax('wordfence_email_summary_email_address_debug', {email: jQuery('#email_summary_email_address_debug').val()});"/>
859
  </span>
860
  </li>
861
  <li>
862
  <span>
863
  <?php esc_html_e('Clear all Wordfence Central connection data', 'wordfence'); ?> <a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_REMOVE_CENTRAL_DATA); ?>" target="_blank" rel="noopener noreferrer" class="wfhelp wf-inline-help"></a>
864
- <input class="wf-btn wf-btn-default wf-btn-sm" type="button" value="<?php esc_attr_e('Clear Connection Data', 'wordfence'); ?>" onclick="WFAD.ajax('wordfence_wfcentral_disconnect', {}, function() { WFAD.colorboxModal((self.isSmallScreen ? '300px' : '400px'), 'Successfully romved data', 'All associated Wordfence Central data has been removed from the database.'); });"/>
865
  </span>
866
  </li>
867
  </ul>
855
  <span>
856
  <?php esc_html_e('Send a test activity report email:', 'wordfence'); ?> <a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_TEST_ACTIVITY_REPORT); ?>" target="_blank" rel="noopener noreferrer" class="wfhelp wf-inline-help"></a>
857
  <input type="email" id="email_summary_email_address_debug" value="" size="20" maxlength="255" class="wfConfigElem"/>
858
+ <input class="wf-btn wf-btn-default wf-btn-sm" type="button" value="<?php esc_attr_e('Send Test Activity Report', 'wordfence'); ?>" onclick="WFAD.sendTestActivityReport(jQuery('#email_summary_email_address_debug').val());"/>
859
  </span>
860
  </li>
861
  <li>
862
  <span>
863
  <?php esc_html_e('Clear all Wordfence Central connection data', 'wordfence'); ?> <a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_REMOVE_CENTRAL_DATA); ?>" target="_blank" rel="noopener noreferrer" class="wfhelp wf-inline-help"></a>
864
+ <input class="wf-btn wf-btn-default wf-btn-sm" type="button" value="<?php esc_attr_e('Clear Connection Data', 'wordfence'); ?>" onclick="WFAD.ajax('wordfence_wfcentral_disconnect', {}, function() { WFAD.colorboxModal((self.isSmallScreen ? '300px' : '400px'), 'Successfully removed data', 'All associated Wordfence Central data has been removed from the database.'); });"/>
865
  </span>
866
  </li>
867
  </ul>
lib/wfActivityReport.php CHANGED
@@ -259,16 +259,16 @@ SQL
259
  }
260
 
261
  $table_wfBlockedIPLog = wfDB::networkTable('wfBlockedIPLog');
262
- $results = $this->db->get_results($this->db->prepare(<<<SQL
263
- SELECT *,
264
  SUM(blockCount) as blockCount
265
  FROM {$table_wfBlockedIPLog}
266
  WHERE unixday >= {$interval}
267
  GROUP BY IP
268
  ORDER BY blockCount DESC
269
  LIMIT %d
270
- SQL
271
- , $limit));
272
  if ($results) {
273
  foreach ($results as &$row) {
274
  $row->countryName = $this->getCountryNameByCode($row->countryCode);
@@ -299,14 +299,14 @@ SQL
299
  }
300
 
301
  $table_wfBlockedIPLog = wfDB::networkTable('wfBlockedIPLog');
302
- $results = $this->db->get_results($this->db->prepare(<<<SQL
303
- SELECT *, COUNT(IP) as totalIPs, SUM(blockCount) as totalBlockCount
304
- FROM (SELECT * FROM {$table_wfBlockedIPLog} WHERE unixday >= {$interval} GROUP BY IP) t
305
  GROUP BY countryCode
306
  ORDER BY totalBlockCount DESC
307
  LIMIT %d
308
- SQL
309
- , $limit));
310
  if ($results) {
311
  foreach ($results as &$row) {
312
  $row->countryName = $this->getCountryNameByCode($row->countryCode);
259
  }
260
 
261
  $table_wfBlockedIPLog = wfDB::networkTable('wfBlockedIPLog');
262
+ $query=<<<SQL
263
+ SELECT IP, countryCode, unixday, blockType,
264
  SUM(blockCount) as blockCount
265
  FROM {$table_wfBlockedIPLog}
266
  WHERE unixday >= {$interval}
267
  GROUP BY IP
268
  ORDER BY blockCount DESC
269
  LIMIT %d
270
+ SQL;
271
+ $results = $this->db->get_results($this->db->prepare($query, $limit));
272
  if ($results) {
273
  foreach ($results as &$row) {
274
  $row->countryName = $this->getCountryNameByCode($row->countryCode);
299
  }
300
 
301
  $table_wfBlockedIPLog = wfDB::networkTable('wfBlockedIPLog');
302
+ $query=<<<SQL
303
+ SELECT *, COUNT(IP) as totalIPs, SUM(ipBlockCount) as totalBlockCount
304
+ FROM (SELECT *, SUM(blockCount) AS ipBlockCount FROM {$table_wfBlockedIPLog} WHERE unixday >= {$interval} GROUP BY IP) t
305
  GROUP BY countryCode
306
  ORDER BY totalBlockCount DESC
307
  LIMIT %d
308
+ SQL;
309
+ $results = $this->db->get_results($this->db->prepare($query, $limit));
310
  if ($results) {
311
  foreach ($results as &$row) {
312
  $row->countryName = $this->getCountryNameByCode($row->countryCode);
lib/wfDiagnostic.php CHANGED
@@ -82,7 +82,8 @@ class wfDiagnostic
82
  'description' => __('Current WAF configuration.', 'wordfence'),
83
  'tests' => array(
84
  'wafAutoPrepend' => __('WAF auto prepend active', 'wordfence'),
85
- 'wafStorageEngine' => __('WAF storage engine (WFWAF_STORAGE_ENGINE)', 'wordfence'),
 
86
  'wafLogPath' => __('WAF log path', 'wordfence'),
87
  'wafSubdirectoryInstall' => __('WAF subdirectory installation', 'wordfence'),
88
  'wafAutoPrependFilePath' => __('wordfence-waf.php path', 'wordfence'),
@@ -359,6 +360,20 @@ class wfDiagnostic
359
  public function wafStorageEngine() {
360
  return array('test' => true, 'infoOnly' => true, 'message' => (defined('WFWAF_STORAGE_ENGINE') ? WFWAF_STORAGE_ENGINE : __('(default)', 'wordfence')));
361
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
362
  public function wafLogPath() {
363
  $logPath = __('(not set)', 'wordfence');
364
  if (defined('WFWAF_LOG_PATH')) {
82
  'description' => __('Current WAF configuration.', 'wordfence'),
83
  'tests' => array(
84
  'wafAutoPrepend' => __('WAF auto prepend active', 'wordfence'),
85
+ 'wafStorageEngine' => __('Configured WAF storage engine (WFWAF_STORAGE_ENGINE)', 'wordfence'),
86
+ 'wafActiveStorageEngine' => __('Active WAF storage engine', 'wordfence'),
87
  'wafLogPath' => __('WAF log path', 'wordfence'),
88
  'wafSubdirectoryInstall' => __('WAF subdirectory installation', 'wordfence'),
89
  'wafAutoPrependFilePath' => __('wordfence-waf.php path', 'wordfence'),
360
  public function wafStorageEngine() {
361
  return array('test' => true, 'infoOnly' => true, 'message' => (defined('WFWAF_STORAGE_ENGINE') ? WFWAF_STORAGE_ENGINE : __('(default)', 'wordfence')));
362
  }
363
+ private static function getStorageEngineDescription($storageEngine) {
364
+ if ($storageEngine === null) {
365
+ return __('None', 'wordfence');
366
+ }
367
+ else if (method_exists($storageEngine, 'getDescription')) {
368
+ return $storageEngine->getDescription();
369
+ }
370
+ else {
371
+ return __('Unknown (mixed plugin version)', 'wordfence');
372
+ }
373
+ }
374
+ public function wafActiveStorageEngine() {
375
+ return array('test' => true, 'infoOnly' => true, 'message' => self::getStorageEngineDescription(wfWAF::getSharedStorageEngine()));
376
+ }
377
  public function wafLogPath() {
378
  $logPath = __('(not set)', 'wordfence');
379
  if (defined('WFWAF_LOG_PATH')) {
lib/wfScanEngine.php CHANGED
@@ -1720,8 +1720,8 @@ class wfScanEngine {
1720
  $this->statusIDX['diskSpace'] = wfIssues::statusStart(__('Scanning to check available disk space', 'wordfence'));
1721
  $this->scanController->startStage(wfScanner::STAGE_SERVER_STATE);
1722
  wfUtils::errorsOff();
1723
- $total = @disk_total_space('.');
1724
- $free = @disk_free_space('.'); //Normally false if unreadable but can return 0 on some hosts even when there's space available
1725
  wfUtils::errorsOn();
1726
  if (!$total || !$free) {
1727
  $this->status(2, 'info', __('Unable to access available disk space information', 'wordfence'));
@@ -1965,13 +1965,18 @@ class wfScanEngine {
1965
  foreach ($this->pluginRepoStatus as $slug => $status) {
1966
  if ($status !== false && !is_wp_error($status) && ((is_object($status) && property_exists($status, 'last_updated')) || (is_array($status) && array_key_exists('last_updated', $status)))) {
1967
  $statusArray = (array) $status;
 
 
 
 
 
1968
  $lastUpdateTimestamp = strtotime($statusArray['last_updated']);
1969
  if ($lastUpdateTimestamp > 0 && (time() - $lastUpdateTimestamp) > 63072000 /* ~2 years */) {
1970
  $statusArray['dateUpdated'] = wfUtils::formatLocalTime(get_option('date_format'), $lastUpdateTimestamp);
1971
  $severity = wfIssues::SEVERITY_MEDIUM;
1972
  $statusArray['abandoned'] = true;
1973
  $statusArray['vulnerable'] = false;
1974
- $vulnerable = $this->updateCheck->isPluginVulnerable($slug, $statusArray['version']);
1975
  if ($vulnerable) {
1976
  $severity = wfIssues::SEVERITY_CRITICAL;
1977
  $statusArray['vulnerable'] = true;
1720
  $this->statusIDX['diskSpace'] = wfIssues::statusStart(__('Scanning to check available disk space', 'wordfence'));
1721
  $this->scanController->startStage(wfScanner::STAGE_SERVER_STATE);
1722
  wfUtils::errorsOff();
1723
+ $total = function_exists('disk_total_space')?@disk_total_space('.'):false;
1724
+ $free = function_exists('disk_free_space')?@disk_free_space('.'):false; //Normally false if unreadable but can return 0 on some hosts even when there's space available
1725
  wfUtils::errorsOn();
1726
  if (!$total || !$free) {
1727
  $this->status(2, 'info', __('Unable to access available disk space information', 'wordfence'));
1965
  foreach ($this->pluginRepoStatus as $slug => $status) {
1966
  if ($status !== false && !is_wp_error($status) && ((is_object($status) && property_exists($status, 'last_updated')) || (is_array($status) && array_key_exists('last_updated', $status)))) {
1967
  $statusArray = (array) $status;
1968
+ $hasVersion = array_key_exists('version', $statusArray);
1969
+ if (!$hasVersion) {
1970
+ $statusArray['version'] = null;
1971
+ wordfence::status(3, 'error', "Unable to determine version for plugin $slug");
1972
+ }
1973
  $lastUpdateTimestamp = strtotime($statusArray['last_updated']);
1974
  if ($lastUpdateTimestamp > 0 && (time() - $lastUpdateTimestamp) > 63072000 /* ~2 years */) {
1975
  $statusArray['dateUpdated'] = wfUtils::formatLocalTime(get_option('date_format'), $lastUpdateTimestamp);
1976
  $severity = wfIssues::SEVERITY_MEDIUM;
1977
  $statusArray['abandoned'] = true;
1978
  $statusArray['vulnerable'] = false;
1979
+ $vulnerable = $hasVersion && $this->updateCheck->isPluginVulnerable($slug, $statusArray['version']);
1980
  if ($vulnerable) {
1981
  $severity = wfIssues::SEVERITY_CRITICAL;
1982
  $statusArray['vulnerable'] = true;
lib/wfUpdateCheck.php CHANGED
@@ -113,10 +113,13 @@ class wfUpdateCheck {
113
  /**
114
  * Check if any plugins need an update.
115
  *
 
 
116
  * @return $this
117
  */
118
- public function checkPluginUpdates($useCachedValued = true) {
119
- $this->plugin_updates = array();
 
120
 
121
  if (!function_exists('wp_update_plugins')) {
122
  require_once(ABSPATH . WPINC . '/update.php');
@@ -172,7 +175,7 @@ class wfUpdateCheck {
172
  $data['wpURL'] = (isset($valsArray['url']) ? rtrim($valsArray['url'], '/') : null);
173
 
174
  //Check the vulnerability database
175
- if ($slug !== null && isset($data['Version'])) {
176
  $status = $this->isPluginVulnerable($slug, $data['Version']);
177
  $data['vulnerable'] = !!$status;
178
  if (is_string($status)) {
@@ -188,7 +191,8 @@ class wfUpdateCheck {
188
  $this->all_plugins[$slug] = $data;
189
  }
190
 
191
- $this->plugin_updates[] = $data;
 
192
  unset($installedPlugins[$plugin]);
193
  }
194
  }
@@ -214,7 +218,7 @@ class wfUpdateCheck {
214
  $data['wpURL'] = (isset($valsArray['url']) ? rtrim($valsArray['url'], '/') : null);
215
 
216
  //Check the vulnerability database
217
- if (isset($valsArray['slug']) && isset($data['Version'])) {
218
  $status = $this->isPluginVulnerable($valsArray['slug'], $data['Version']);
219
  $data['vulnerable'] = !!$status;
220
  if (is_string($status)) {
@@ -263,10 +267,13 @@ class wfUpdateCheck {
263
  /**
264
  * Check if any themes need an update.
265
  *
 
 
266
  * @return $this
267
  */
268
- public function checkThemeUpdates($useCachedValued = true) {
269
- $this->theme_updates = array();
 
270
 
271
  if (!function_exists('wp_update_themes')) {
272
  require_once(ABSPATH . WPINC . '/update.php');
@@ -281,7 +288,7 @@ class wfUpdateCheck {
281
  $update_themes = get_site_transient('update_themes');
282
  }
283
 
284
- if ($update_themes && (!empty($update_themes->response))) {
285
  if (!function_exists('wp_get_themes')) {
286
  require_once(ABSPATH . '/wp-includes/theme.php');
287
  }
@@ -314,8 +321,11 @@ class wfUpdateCheck {
314
  $this->checkPluginVulnerabilities();
315
  $this->checkThemeVulnerabilities();
316
  }
317
-
318
- public function checkPluginVulnerabilities() {
 
 
 
319
  if (!function_exists('wp_update_plugins')) {
320
  require_once(ABSPATH . WPINC . '/update.php');
321
  }
@@ -333,7 +343,7 @@ class wfUpdateCheck {
333
  $installedPlugins = get_plugins();
334
 
335
  //Get the info for plugins on wordpress.org
336
- $this->checkPluginUpdates();
337
  $update_plugins = get_site_transient('update_plugins');
338
  if ($update_plugins) {
339
  if (!function_exists('get_plugin_data'))
@@ -455,8 +465,11 @@ class wfUpdateCheck {
455
  wfConfig::set_ser('vulnerabilities_plugin', $vulnerabilities);
456
  }
457
  }
458
-
459
- public function checkThemeVulnerabilities() {
 
 
 
460
  if (!function_exists('wp_update_themes')) {
461
  require_once(ABSPATH . WPINC . '/update.php');
462
  }
@@ -465,7 +478,7 @@ class wfUpdateCheck {
465
  require_once(ABSPATH . '/wp-admin/includes/plugin-install.php');
466
  }
467
 
468
- $this->checkThemeUpdates();
469
  $update_themes = get_site_transient('update_themes');
470
 
471
  $vulnerabilities = array();
@@ -512,15 +525,22 @@ class wfUpdateCheck {
512
  }
513
 
514
  public function isPluginVulnerable($slug, $version) {
515
- return $this->_isSlugVulnerable('vulnerabilities_plugin', $slug, $version);
516
  }
517
 
518
  public function isThemeVulnerable($slug, $version) {
519
- return $this->_isSlugVulnerable('vulnerabilities_theme', $slug, $version);
520
  }
521
 
522
- private function _isSlugVulnerable($vulnerabilitiesKey, $slug, $version) {
523
- $vulnerabilities = wfConfig::get_ser($vulnerabilitiesKey, array());
 
 
 
 
 
 
 
524
  foreach ($vulnerabilities as $v) {
525
  if ($v['slug'] == $slug) {
526
  if ($v['fromVersion'] == 'Unknown' && $v['toVersion'] == 'Unknown') {
113
  /**
114
  * Check if any plugins need an update.
115
  *
116
+ * @param bool $checkVulnerabilities whether or not to check for vulnerabilities while checking updates
117
+ *
118
  * @return $this
119
  */
120
+ public function checkPluginUpdates($useCachedValued = true, $checkVulnerabilities = true) {
121
+ if($checkVulnerabilities)
122
+ $this->plugin_updates = array();
123
 
124
  if (!function_exists('wp_update_plugins')) {
125
  require_once(ABSPATH . WPINC . '/update.php');
175
  $data['wpURL'] = (isset($valsArray['url']) ? rtrim($valsArray['url'], '/') : null);
176
 
177
  //Check the vulnerability database
178
+ if ($slug !== null && isset($data['Version']) && $checkVulnerabilities) {
179
  $status = $this->isPluginVulnerable($slug, $data['Version']);
180
  $data['vulnerable'] = !!$status;
181
  if (is_string($status)) {
191
  $this->all_plugins[$slug] = $data;
192
  }
193
 
194
+ if($checkVulnerabilities)
195
+ $this->plugin_updates[] = $data;
196
  unset($installedPlugins[$plugin]);
197
  }
198
  }
218
  $data['wpURL'] = (isset($valsArray['url']) ? rtrim($valsArray['url'], '/') : null);
219
 
220
  //Check the vulnerability database
221
+ if (isset($valsArray['slug']) && isset($data['Version']) && $checkVulnerabilities) {
222
  $status = $this->isPluginVulnerable($valsArray['slug'], $data['Version']);
223
  $data['vulnerable'] = !!$status;
224
  if (is_string($status)) {
267
  /**
268
  * Check if any themes need an update.
269
  *
270
+ * @param bool $checkVulnerabilities whether or not to check for vulnerabilities while checking for updates
271
+ *
272
  * @return $this
273
  */
274
+ public function checkThemeUpdates($useCachedValued = true, $checkVulnerabilities = true) {
275
+ if($checkVulnerabilities)
276
+ $this->theme_updates = array();
277
 
278
  if (!function_exists('wp_update_themes')) {
279
  require_once(ABSPATH . WPINC . '/update.php');
288
  $update_themes = get_site_transient('update_themes');
289
  }
290
 
291
+ if ($update_themes && (!empty($update_themes->response)) && $checkVulnerabilities) {
292
  if (!function_exists('wp_get_themes')) {
293
  require_once(ABSPATH . '/wp-includes/theme.php');
294
  }
321
  $this->checkPluginVulnerabilities();
322
  $this->checkThemeVulnerabilities();
323
  }
324
+
325
+ /**
326
+ * @param bool $initial if true, treat as the initial scan run
327
+ */
328
+ public function checkPluginVulnerabilities($initial=false) {
329
  if (!function_exists('wp_update_plugins')) {
330
  require_once(ABSPATH . WPINC . '/update.php');
331
  }
343
  $installedPlugins = get_plugins();
344
 
345
  //Get the info for plugins on wordpress.org
346
+ $this->checkPluginUpdates(!$initial, false);
347
  $update_plugins = get_site_transient('update_plugins');
348
  if ($update_plugins) {
349
  if (!function_exists('get_plugin_data'))
465
  wfConfig::set_ser('vulnerabilities_plugin', $vulnerabilities);
466
  }
467
  }
468
+
469
+ /**
470
+ * @param bool $initial whether or not this is the initial run
471
+ */
472
+ public function checkThemeVulnerabilities($initial = false) {
473
  if (!function_exists('wp_update_themes')) {
474
  require_once(ABSPATH . WPINC . '/update.php');
475
  }
478
  require_once(ABSPATH . '/wp-admin/includes/plugin-install.php');
479
  }
480
 
481
+ $this->checkThemeUpdates(!$initial, false);
482
  $update_themes = get_site_transient('update_themes');
483
 
484
  $vulnerabilities = array();
525
  }
526
 
527
  public function isPluginVulnerable($slug, $version) {
528
+ return $this->_isSlugVulnerable('vulnerabilities_plugin', $slug, $version, function(){ $this->checkPluginVulnerabilities(true); });
529
  }
530
 
531
  public function isThemeVulnerable($slug, $version) {
532
+ return $this->_isSlugVulnerable('vulnerabilities_theme', $slug, $version, function(){ $this->checkThemeVulnerabilities(true); });
533
  }
534
 
535
+ private function _isSlugVulnerable($vulnerabilitiesKey, $slug, $version, $populateVulnerabilities=null) {
536
+ $vulnerabilities = wfConfig::get_ser($vulnerabilitiesKey, null);
537
+ if($vulnerabilities===null){
538
+ if(is_callable($populateVulnerabilities)){
539
+ $populateVulnerabilities();
540
+ return $this->_isSlugVulnerable($vulnerabilitiesKey, $slug, $version);
541
+ }
542
+ return false;
543
+ }
544
  foreach ($vulnerabilities as $v) {
545
  if ($v['slug'] == $slug) {
546
  if ($v['fromVersion'] == 'Unknown' && $v['toVersion'] == 'Unknown') {
lib/wfUtils.php CHANGED
@@ -3048,6 +3048,45 @@ class wfUtils {
3048
  }
3049
  return $payload;
3050
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3051
  }
3052
 
3053
  // GeoIP lib uses these as well
3048
  }
3049
  return $payload;
3050
  }
3051
+
3052
+ /**
3053
+ * Split a path into its components
3054
+ * @param string $path
3055
+ */
3056
+ public static function splitPath($path) {
3057
+ return preg_split('/[\\/\\\\]/', $path, -1, PREG_SPLIT_NO_EMPTY);
3058
+ }
3059
+
3060
+ /**
3061
+ * Convert an absolute path to a path relative to $to
3062
+ * @param string $absolute the absolute path to convert
3063
+ * @param string $to the absolute path from which to derive the relative path
3064
+ * @param bool $leadingSlash if true, prepend the resultant URL with a slash
3065
+ */
3066
+ public static function relativePath($absolute, $to, $leadingSlash = false) {
3067
+ $trailingSlash = in_array(substr($absolute, -1), array('/', '\\'));
3068
+ $absoluteComponents = self::splitPath($absolute);
3069
+ $toComponents = self::splitPath($to);
3070
+ $relativeComponents = array();
3071
+ do {
3072
+ $currentAbsolute = array_shift($absoluteComponents);
3073
+ $currentTo = array_shift($toComponents);
3074
+ } while($currentAbsolute === $currentTo && $currentAbsolute !== null);
3075
+ while ($currentTo !== null) {
3076
+ array_push($relativeComponents, '..');
3077
+ $currentTo = array_shift($toComponents);
3078
+ }
3079
+ while ($currentAbsolute !== null) {
3080
+ array_push($relativeComponents, $currentAbsolute);
3081
+ $currentAbsolute = array_shift($absoluteComponents);
3082
+ }
3083
+ return implode(array(
3084
+ $leadingSlash ? '/' : '',
3085
+ implode('/', $relativeComponents),
3086
+ ($trailingSlash && (count($relativeComponents) > 0 || !$leadingSlash)) ? '/' : ''
3087
+ ));
3088
+ }
3089
+
3090
  }
3091
 
3092
  // GeoIP lib uses these as well
lib/wordfenceClass.php CHANGED
@@ -80,6 +80,9 @@ class wordfence {
80
  private static $hitID = 0;
81
  private static $debugOn = null;
82
  private static $runInstallCalled = false;
 
 
 
83
  public static function installPlugin(){
84
  self::runInstall();
85
 
@@ -283,7 +286,7 @@ class wordfence {
283
  $table_wfCrawlers = wfDB::networkTable('wfCrawlers');
284
  $wfdb->queryWrite("delete from {$table_wfCrawlers} where lastUpdate < unix_timestamp() - (86400 * 7)");
285
 
286
- self::trimWfHits();
287
 
288
  $maxRows = absint(wfConfig::get('liveTraf_maxRows', 2000));; //affects stuff further down too
289
 
@@ -588,7 +591,7 @@ SQL
588
  }
589
 
590
  // Call this before creating the index in cases where the wp-cron isn't running.
591
- self::trimWfHits();
592
  $hitsTable = wfDB::networkTable('wfHits');
593
  $hasAttackLogTimeIndex = $wpdb->get_var($wpdb->prepare(<<<SQL
594
  SELECT COLUMN_KEY FROM information_schema.COLUMNS
@@ -1066,9 +1069,11 @@ SQL
1066
 
1067
  //Must be the final line
1068
  }
1069
- public static function _refreshVulnerabilityCache() {
1070
- $update_check = new wfUpdateCheck();
1071
- $update_check->checkAllVulnerabilities();
 
 
1072
  }
1073
  private static function doEarlyAccessLogging(){
1074
  $wfLog = self::getLog();
@@ -1266,7 +1271,7 @@ SQL
1266
  add_action('login_errors', array('wordfence', 'fixGDLimitLoginsErrors'), 11);
1267
  }
1268
 
1269
- add_action('upgrader_process_complete', 'wordfence::_refreshVulnerabilityCache');
1270
  add_action('upgrader_process_complete', 'wfUpdateCheck::syncAllVersionInfo');
1271
  add_action('upgrader_process_complete', 'wordfence::_scheduleRefreshUpdateNotification', 99, 2);
1272
  add_action('automatic_updates_complete', 'wordfence::_scheduleRefreshUpdateNotification', 99, 0);
@@ -1327,7 +1332,7 @@ SQL
1327
  }
1328
 
1329
  add_action('wordfence_processAttackData', 'wordfence::processAttackData');
1330
- if (!empty($_GET['wordfence_syncAttackData']) && get_site_option('wordfence_syncingAttackData') <= time() - 60 && get_site_option('wordfence_lastSyncAttackData', 0) < time() - 4) {
1331
  @ignore_user_abort(true);
1332
  update_site_option('wordfence_syncingAttackData', time());
1333
  header('Content-Type: text/javascript');
@@ -2295,7 +2300,7 @@ SQL
2295
  } else {
2296
  $lastAttackMicroseconds = $wpdb->get_var("SELECT MAX(attackLogTime) FROM {$table_wfHits}");
2297
  }
2298
- if (get_site_option('wordfence_lastSyncAttackData', 0) < time() - 4) {
2299
  if ($waf->getStorageEngine()->hasNewerAttackData($lastAttackMicroseconds)) {
2300
  if (get_site_option('wordfence_syncingAttackData') <= time() - 60) {
2301
  // Could be the request to itself is not completing, add ajax to the head as a workaround
@@ -3376,7 +3381,6 @@ SQL
3376
  }
3377
  }
3378
  public static function wfsnEndpointType() {
3379
- $wploginPath = ABSPATH . 'wp-login.php';
3380
  $type = 0; //Unknown
3381
  if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) {
3382
  $type = 2;
@@ -3387,7 +3391,7 @@ SQL
3387
  $type = 301;
3388
  }
3389
  }
3390
- else if (isset($_SERVER['SCRIPT_FILENAME']) && $_SERVER['SCRIPT_FILENAME'] == $wploginPath) {
3391
  $type = 1;
3392
  }
3393
  return $type;
@@ -5818,16 +5822,18 @@ HTML;
5818
  if (!WFWAF_SUBDIRECTORY_INSTALL) {
5819
  try {
5820
  $authCookie = wfWAF::getInstance()->parseAuthCookie();
 
5821
  if (is_user_logged_in() &&
5822
  (
5823
  !$authCookie ||
5824
  (int) $currentUserID !== (int) $authCookie['userID'] ||
5825
- $role !== $authCookie['role']
 
5826
  )
5827
  ) {
5828
  wfUtils::setcookie(wfWAF::getInstance()->getAuthCookieName(),
5829
- $currentUserID . '|' . $role . '|' .
5830
- wfWAF::getInstance()->getAuthCookieValue($currentUserID, $role),
5831
  time() + 43200, COOKIEPATH, COOKIE_DOMAIN, wfUtils::isFullSSL(), true);
5832
  }
5833
  } catch (wfWAFStorageFileException $e) {
@@ -6238,6 +6244,9 @@ HTML;
6238
  wfSupportController::esc_supportURL(wfSupportController::ITEM_NOTICE_WAF_INACCESSIBLE_CONFIG)
6239
  ) . '</p></div>';
6240
  }
 
 
 
6241
  public static function wafConfigNeedsUpdate_mod_php() {
6242
  if (function_exists('network_admin_url') && is_multisite()) {
6243
  $wafMenuURL = network_admin_url('admin.php?page=WordfenceWAF&wafconfigfixmodphp=1');
@@ -6356,13 +6365,19 @@ HTML;
6356
  }
6357
 
6358
  $firewall = new wfFirewall();
6359
- if (!empty($_GET['page']) && preg_match('/^Wordfence/i', $_GET['page']) && !$firewall->testConfig()) {
6360
- $warningAdded = true;
6361
- if (wfUtils::isAdminPageMU()) {
6362
- add_action('network_admin_notices', 'wordfence::wafConfigInaccessibleNotice');
 
 
 
 
 
6363
  }
6364
- else {
6365
- add_action('admin_notices', 'wordfence::wafConfigInaccessibleNotice');
 
6366
  }
6367
  }
6368
 
@@ -7154,13 +7169,13 @@ SQL
7154
  public static function ajax_email_summary_email_address_debug_callback() {
7155
  $email = !empty($_REQUEST['email']) ? $_REQUEST['email'] : null;
7156
  if (!wfUtils::isValidEmail($email)) {
7157
- return array('err' => __('Invalid email address provided.', 'wordfence'));
7158
  }
7159
 
7160
  $report = new wfActivityReport();
7161
  return $report->sendReportViaEmail($email) ?
7162
  array('ok' => 1, 'result' => __('Test email sent successfully', 'wordfence')) :
7163
- array('err' => __("Test email failed to send.", 'wordfence'));
7164
  }
7165
 
7166
  public static function addDashboardWidget() {
@@ -7541,7 +7556,7 @@ SQL
7541
 
7542
  public static function ajax_updateWAFRules_callback() {
7543
  try {
7544
- $event = new wfWAFCronFetchRulesEvent(time() - 2);
7545
  $event->setWaf(wfWAF::getInstance());
7546
  $success = $event->fire();
7547
  $failureReason = false;
@@ -8164,7 +8179,9 @@ SQL
8164
  }
8165
  }
8166
 
8167
- public static function trimWfHits() {
 
 
8168
  $wfdb = new wfDB();
8169
  $lastAggregation = wfConfig::get('lastBlockAggregation', 0);
8170
  $table_wfHits = wfDB::networkTable('wfHits');
@@ -8216,6 +8233,15 @@ SQL
8216
  wfConfig::set('lastBlockAggregation', time());
8217
  }
8218
 
 
 
 
 
 
 
 
 
 
8219
  private static function scheduleSendAttackData($timeToSend = null) {
8220
  if ($timeToSend === null) {
8221
  $timeToSend = time() + (60 * 5);
@@ -8365,10 +8391,21 @@ SQL
8365
  //Send attack data
8366
  $limit = 500;
8367
  $lastSendTime = wfConfig::get('lastAttackDataSendTime');
8368
- $attackData = $wpdb->get_results($wpdb->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM {$table_wfHits}
 
 
8369
  WHERE action in ('blocked:waf', 'learned:waf', 'logged:waf', 'blocked:waf-always')
8370
  AND attackLogTime > %f
8371
- LIMIT %d", sprintf('%.6f', $lastSendTime), $limit));
 
 
 
 
 
 
 
 
 
8372
  $totalRows = $wpdb->get_var('SELECT FOUND_ROWS()');
8373
 
8374
  if ($attackData) { // Build JSON to send
@@ -8397,39 +8434,58 @@ SQL
8397
  $lastSendTime = $attackDataRow->attackLogTime;
8398
  }
8399
  }
8400
-
8401
- $homeurl = wfUtils::wpHomeURL();
8402
- $siteurl = wfUtils::wpSiteURL();
8403
- $installType = wfUtils::wafInstallationType();
8404
- $response = wp_remote_post(WFWAF_API_URL_SEC . "?" . http_build_query(array(
8405
- 'action' => 'send_waf_attack_data',
8406
- 'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'),
8407
- 's' => $siteurl,
8408
- 'h' => $homeurl,
8409
- 't' => microtime(true),
8410
- 'c' => $installType,
8411
- 'lang' => get_site_option('WPLANG'),
8412
- ), null, '&'),
8413
- array(
8414
- 'body' => json_encode($dataToSend),
8415
- 'headers' => array(
8416
- 'Content-Type' => 'application/json',
8417
- 'Referer' => false,
8418
- ),
8419
- 'timeout' => 30,
8420
- ));
8421
-
 
 
 
 
 
 
 
 
 
 
 
 
8422
  if (!is_wp_error($response) && ($body = wp_remote_retrieve_body($response))) {
8423
  $jsonData = json_decode($body, true);
8424
  if (is_array($jsonData) && array_key_exists('success', $jsonData)) {
8425
- // Successfully sent data, remove the full request from the table to reduce storage size
8426
- foreach ($attackDataToUpdate as $hitID => $dataToUpdate) {
8427
- $wpdb->update($table_wfHits, $dataToUpdate, array(
8428
- 'id' => $hitID,
8429
- ));
8430
- }
8431
  wfConfig::set('lastAttackDataSendTime', $lastSendTime);
8432
- if ($totalRows > $limit) {
 
 
 
 
 
 
 
 
 
 
 
 
 
8433
  self::scheduleSendAttackData();
8434
  }
8435
 
@@ -8438,6 +8494,10 @@ SQL
8438
  }
8439
  }
8440
  }
 
 
 
 
8441
  }
8442
 
8443
  //Send false positives
@@ -8523,11 +8583,11 @@ SQL
8523
  }
8524
  }
8525
  else if (is_string($okToSendBody) && preg_match('/next check in: ([0-9]+)/', $okToSendBody, $matches)) {
8526
- self::scheduleSendAttackData(time() + $matches[1]);
8527
  }
8528
  }
8529
  else { // Could be that the server is down, so hold off on sending data for a little while
8530
- self::scheduleSendAttackData(time() + 7200);
8531
  }
8532
  }
8533
  else if (!wfConfig::get('other_WFNet', true)) {
@@ -8854,6 +8914,7 @@ SQL
8854
  }
8855
 
8856
  public static function getWAFBootstrapContent($currentAutoPrependedFile = null) {
 
8857
  $currentAutoPrepend = '';
8858
  if ($currentAutoPrependedFile && is_file($currentAutoPrependedFile) && !WFWAF_SUBDIRECTORY_INSTALL) {
8859
  $currentAutoPrepend = sprintf('
@@ -8865,25 +8926,15 @@ if (file_exists(%1$s)) {
8865
  return sprintf('<?php
8866
  // Before removing this file, please verify the PHP ini setting `auto_prepend_file` does not point to this.
8867
  %3$s
8868
- if (file_exists(%1$s)) {
8869
- define("WFWAF_LOG_PATH", %2$s);
8870
- include_once %1$s;
8871
- }
8872
- ?>',
8873
- var_export(WORDFENCE_PATH . 'waf/bootstrap.php', true),
8874
- var_export(WFWAF_SUBDIRECTORY_INSTALL ? WP_CONTENT_DIR . '/wflogs/' : WFWAF_LOG_PATH, true),
8875
  $currentAutoPrepend);
8876
  }
8877
 
8878
- public static function checkAndCreateBootstrap() {
8879
- $bootstrapPath = self::getWAFBootstrapPath();
8880
- if (!file_exists($bootstrapPath) || !filesize($bootstrapPath)) {
8881
- @file_put_contents($bootstrapPath, self::getWAFBootstrapContent(), LOCK_EX);
8882
- clearstatcache();
8883
- }
8884
- return file_exists($bootstrapPath) && filesize($bootstrapPath);
8885
- }
8886
-
8887
  /**
8888
  * @return bool|string
8889
  */
@@ -8897,7 +8948,26 @@ if (file_exists(%1$s)) {
8897
  return $role;
8898
  }
8899
  }
8900
- return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8901
  }
8902
 
8903
  public static function licenseStatusChanged() {
@@ -9689,4 +9759,4 @@ auto_prepend_file = '%s'
9689
  }
9690
 
9691
  class wfWAFAutoPrependHelperException extends Exception {
9692
- }
80
  private static $hitID = 0;
81
  private static $debugOn = null;
82
  private static $runInstallCalled = false;
83
+
84
+ const ATTACK_DATA_BODY_LIMIT=41943040; //40MB
85
+
86
  public static function installPlugin(){
87
  self::runInstall();
88
 
286
  $table_wfCrawlers = wfDB::networkTable('wfCrawlers');
287
  $wfdb->queryWrite("delete from {$table_wfCrawlers} where lastUpdate < unix_timestamp() - (86400 * 7)");
288
 
289
+ self::trimWfHits(true);
290
 
291
  $maxRows = absint(wfConfig::get('liveTraf_maxRows', 2000));; //affects stuff further down too
292
 
591
  }
592
 
593
  // Call this before creating the index in cases where the wp-cron isn't running.
594
+ self::trimWfHits(true);
595
  $hitsTable = wfDB::networkTable('wfHits');
596
  $hasAttackLogTimeIndex = $wpdb->get_var($wpdb->prepare(<<<SQL
597
  SELECT COLUMN_KEY FROM information_schema.COLUMNS
1069
 
1070
  //Must be the final line
1071
  }
1072
+ public static function _refreshVulnerabilityCache($upgrader = null, $hook_extra = null) {
1073
+ if($hook_extra ===null || in_array($hook_extra['type'], array('plugin', 'theme'))){
1074
+ $update_check = new wfUpdateCheck();
1075
+ $update_check->checkAllVulnerabilities();
1076
+ }
1077
  }
1078
  private static function doEarlyAccessLogging(){
1079
  $wfLog = self::getLog();
1271
  add_action('login_errors', array('wordfence', 'fixGDLimitLoginsErrors'), 11);
1272
  }
1273
 
1274
+ add_action('upgrader_process_complete', 'wordfence::_refreshVulnerabilityCache', 10, 2);
1275
  add_action('upgrader_process_complete', 'wfUpdateCheck::syncAllVersionInfo');
1276
  add_action('upgrader_process_complete', 'wordfence::_scheduleRefreshUpdateNotification', 99, 2);
1277
  add_action('automatic_updates_complete', 'wordfence::_scheduleRefreshUpdateNotification', 99, 0);
1332
  }
1333
 
1334
  add_action('wordfence_processAttackData', 'wordfence::processAttackData');
1335
+ if (!empty($_GET['wordfence_syncAttackData']) && get_site_option('wordfence_syncingAttackData') <= time() - 60 && get_site_option('wordfence_lastSyncAttackData', 0) < time() - 8) {
1336
  @ignore_user_abort(true);
1337
  update_site_option('wordfence_syncingAttackData', time());
1338
  header('Content-Type: text/javascript');
2300
  } else {
2301
  $lastAttackMicroseconds = $wpdb->get_var("SELECT MAX(attackLogTime) FROM {$table_wfHits}");
2302
  }
2303
+ if (get_site_option('wordfence_lastSyncAttackData', 0) < time() - 8) {
2304
  if ($waf->getStorageEngine()->hasNewerAttackData($lastAttackMicroseconds)) {
2305
  if (get_site_option('wordfence_syncingAttackData') <= time() - 60) {
2306
  // Could be the request to itself is not completing, add ajax to the head as a workaround
3381
  }
3382
  }
3383
  public static function wfsnEndpointType() {
 
3384
  $type = 0; //Unknown
3385
  if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) {
3386
  $type = 2;
3391
  $type = 301;
3392
  }
3393
  }
3394
+ else if (strpos($_SERVER['REQUEST_URI'], '/wp-login.php') !== false) {
3395
  $type = 1;
3396
  }
3397
  return $type;
5822
  if (!WFWAF_SUBDIRECTORY_INSTALL) {
5823
  try {
5824
  $authCookie = wfWAF::getInstance()->parseAuthCookie();
5825
+ $capabilities = wordfence::getCurrentUserCapabilities();
5826
  if (is_user_logged_in() &&
5827
  (
5828
  !$authCookie ||
5829
  (int) $currentUserID !== (int) $authCookie['userID'] ||
5830
+ $role !== $authCookie['role'] ||
5831
+ $authCookie['capabilities'] !== $capabilities //Capability ordering is fixed so a direct equality check is valid
5832
  )
5833
  ) {
5834
  wfUtils::setcookie(wfWAF::getInstance()->getAuthCookieName(),
5835
+ $currentUserID . '|' . $role . '|' . implode(',', $capabilities) . '|' .
5836
+ wfWAF::getInstance()->getAuthCookieValue($currentUserID, $role, $capabilities),
5837
  time() + 43200, COOKIEPATH, COOKIE_DOMAIN, wfUtils::isFullSSL(), true);
5838
  }
5839
  } catch (wfWAFStorageFileException $e) {
6244
  wfSupportController::esc_supportURL(wfSupportController::ITEM_NOTICE_WAF_INACCESSIBLE_CONFIG)
6245
  ) . '</p></div>';
6246
  }
6247
+ public static function wafStorageEngineFallbackNotice() {
6248
+ echo '<div class="notice notice-warning"><p>'.__('The WAF storage engine is currently set to mysqli, but Wordfence is unable to use the database. The WAF will fall back to using local file system storage instead.', 'wordfence').'</p></div>';
6249
+ }
6250
  public static function wafConfigNeedsUpdate_mod_php() {
6251
  if (function_exists('network_admin_url') && is_multisite()) {
6252
  $wafMenuURL = network_admin_url('admin.php?page=WordfenceWAF&wafconfigfixmodphp=1');
6365
  }
6366
 
6367
  $firewall = new wfFirewall();
6368
+ if (!empty($_GET['page']) && preg_match('/^Wordfence/i', $_GET['page'])) {
6369
+ if (!$firewall->testConfig()) {
6370
+ $warningAdded = true;
6371
+ if (wfUtils::isAdminPageMU()) {
6372
+ add_action('network_admin_notices', 'wordfence::wafConfigInaccessibleNotice');
6373
+ }
6374
+ else {
6375
+ add_action('admin_notices', 'wordfence::wafConfigInaccessibleNotice');
6376
+ }
6377
  }
6378
+ else if (!$warningAdded && method_exists('wfWAF', 'hasFallbackStorageEngine') && wfWAF::hasFallbackStorageEngine()) {
6379
+ $warningAdded = true;
6380
+ add_action(wfUtils::isAdminPageMU()?'network_admin_notices':'admin_notices', 'wordfence::wafStorageEngineFallbackNotice');
6381
  }
6382
  }
6383
 
7169
  public static function ajax_email_summary_email_address_debug_callback() {
7170
  $email = !empty($_REQUEST['email']) ? $_REQUEST['email'] : null;
7171
  if (!wfUtils::isValidEmail($email)) {
7172
+ return array('result' => __('Invalid email address provided', 'wordfence'));
7173
  }
7174
 
7175
  $report = new wfActivityReport();
7176
  return $report->sendReportViaEmail($email) ?
7177
  array('ok' => 1, 'result' => __('Test email sent successfully', 'wordfence')) :
7178
+ array('result' => __("Test email failed to send", 'wordfence'));
7179
  }
7180
 
7181
  public static function addDashboardWidget() {
7556
 
7557
  public static function ajax_updateWAFRules_callback() {
7558
  try {
7559
+ $event = new wfWAFCronFetchRulesEvent(time() - 2, true);
7560
  $event->setWaf(wfWAF::getInstance());
7561
  $success = $event->fire();
7562
  $failureReason = false;
8179
  }
8180
  }
8181
 
8182
+ public static function trimWfHits($force = false) {
8183
+ if(!$force && self::isApiDelayed())
8184
+ return;
8185
  $wfdb = new wfDB();
8186
  $lastAggregation = wfConfig::get('lastBlockAggregation', 0);
8187
  $table_wfHits = wfDB::networkTable('wfHits');
8233
  wfConfig::set('lastBlockAggregation', time());
8234
  }
8235
 
8236
+ private static function isApiDelayed() {
8237
+ return wfConfig::get('apiDelayedUntil', 0) > time();
8238
+ }
8239
+
8240
+ private static function delaySendAttackData($until) {
8241
+ wfConfig::set('apiDelayedUntil', $until);
8242
+ self::scheduleSendAttackData($until);
8243
+ }
8244
+
8245
  private static function scheduleSendAttackData($timeToSend = null) {
8246
  if ($timeToSend === null) {
8247
  $timeToSend = time() + (60 * 5);
8391
  //Send attack data
8392
  $limit = 500;
8393
  $lastSendTime = wfConfig::get('lastAttackDataSendTime');
8394
+ $lastSendId = wfConfig::get('lastAttackDataSendId');
8395
+ if($lastSendId===false){
8396
+ $query=$wpdb->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM {$table_wfHits}
8397
  WHERE action in ('blocked:waf', 'learned:waf', 'logged:waf', 'blocked:waf-always')
8398
  AND attackLogTime > %f
8399
+ LIMIT %d", sprintf('%.6f', $lastSendTime), $limit);
8400
+ }
8401
+ else{
8402
+ $query=$wpdb->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM {$table_wfHits}
8403
+ WHERE action in ('blocked:waf', 'learned:waf', 'logged:waf', 'blocked:waf-always')
8404
+ AND id > %d
8405
+ ORDER BY id LIMIT %d", $lastSendId, $limit);
8406
+ }
8407
+ $params[]=$limit;
8408
+ $attackData = $wpdb->get_results($query);
8409
  $totalRows = $wpdb->get_var('SELECT FOUND_ROWS()');
8410
 
8411
  if ($attackData) { // Build JSON to send
8434
  $lastSendTime = $attackDataRow->attackLogTime;
8435
  }
8436
  }
8437
+
8438
+ $bodyLimit=self::ATTACK_DATA_BODY_LIMIT;
8439
+ $response=null;
8440
+ do {
8441
+ $bodyData=null;
8442
+ do {
8443
+ if($bodyData!==null)
8444
+ array_splice($dataToSend, floor(count($dataToSend)/2));
8445
+ $bodyData=json_encode($dataToSend);
8446
+ } while(strlen($bodyData)>$bodyLimit&&count($dataToSend)>1);
8447
+
8448
+ $homeurl = wfUtils::wpHomeURL();
8449
+ $siteurl = wfUtils::wpSiteURL();
8450
+ $installType = wfUtils::wafInstallationType();
8451
+ $response = wp_remote_post(WFWAF_API_URL_SEC . "?" . http_build_query(array(
8452
+ 'action' => 'send_waf_attack_data',
8453
+ 'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'),
8454
+ 's' => $siteurl,
8455
+ 'h' => $homeurl,
8456
+ 't' => microtime(true),
8457
+ 'c' => $installType,
8458
+ 'lang' => get_site_option('WPLANG'),
8459
+ ), null, '&'),
8460
+ array(
8461
+ 'body' => $bodyData,
8462
+ 'headers' => array(
8463
+ 'Content-Type' => 'application/json',
8464
+ 'Referer' => false,
8465
+ ),
8466
+ 'timeout' => 30,
8467
+ ));
8468
+ $bodyLimit/=2;
8469
+ } while(wp_remote_retrieve_response_code($response)===413&&count($dataToSend)>1);
8470
+
8471
  if (!is_wp_error($response) && ($body = wp_remote_retrieve_body($response))) {
8472
  $jsonData = json_decode($body, true);
8473
  if (is_array($jsonData) && array_key_exists('success', $jsonData)) {
 
 
 
 
 
 
8474
  wfConfig::set('lastAttackDataSendTime', $lastSendTime);
8475
+ $lastSendIndex=count($dataToSend)-1;
8476
+ if($lastSendIndex>=0){
8477
+ $lastSendId = $attackData[$lastSendIndex]->id;
8478
+ wfConfig::set('lastAttackDataSendId', $lastSendId);
8479
+ // Successfully sent data, remove the full request from the table to reduce storage size
8480
+ foreach ($attackDataToUpdate as $hitID => $dataToUpdate) {
8481
+ if ($hitID <= $lastSendId) {
8482
+ $wpdb->update($table_wfHits, $dataToUpdate, array(
8483
+ 'id' => $hitID,
8484
+ ));
8485
+ }
8486
+ }
8487
+ }
8488
+ if (count($dataToSend) < $totalRows) {
8489
  self::scheduleSendAttackData();
8490
  }
8491
 
8494
  }
8495
  }
8496
  }
8497
+ else{
8498
+ //Delay interactions for 30 minutes if an error occurs
8499
+ self::delaySendAttackData(time() + 30*60);
8500
+ }
8501
  }
8502
 
8503
  //Send false positives
8583
  }
8584
  }
8585
  else if (is_string($okToSendBody) && preg_match('/next check in: ([0-9]+)/', $okToSendBody, $matches)) {
8586
+ self::delaySendAttackData(time() + $matches[1]);
8587
  }
8588
  }
8589
  else { // Could be that the server is down, so hold off on sending data for a little while
8590
+ self::delaySendAttackData(time() + 7200);
8591
  }
8592
  }
8593
  else if (!wfConfig::get('other_WFNet', true)) {
8914
  }
8915
 
8916
  public static function getWAFBootstrapContent($currentAutoPrependedFile = null) {
8917
+ $bootstrapPath = dirname(self::getWAFBootstrapPath());
8918
  $currentAutoPrepend = '';
8919
  if ($currentAutoPrependedFile && is_file($currentAutoPrependedFile) && !WFWAF_SUBDIRECTORY_INSTALL) {
8920
  $currentAutoPrepend = sprintf('
8926
  return sprintf('<?php
8927
  // Before removing this file, please verify the PHP ini setting `auto_prepend_file` does not point to this.
8928
  %3$s
8929
+ if (file_exists(__DIR__.%1$s)) {
8930
+ define("WFWAF_LOG_PATH", __DIR__.%2$s);
8931
+ include_once __DIR__.%1$s;
8932
+ }',
8933
+ var_export(wfUtils::relativePath(WORDFENCE_PATH . 'waf/bootstrap.php', $bootstrapPath, true), true),
8934
+ var_export(wfUtils::relativePath((WFWAF_SUBDIRECTORY_INSTALL ? WP_CONTENT_DIR . '/wflogs/' : WFWAF_LOG_PATH), $bootstrapPath, true), true),
 
8935
  $currentAutoPrepend);
8936
  }
8937
 
 
 
 
 
 
 
 
 
 
8938
  /**
8939
  * @return bool|string
8940
  */
8948
  return $role;
8949
  }
8950
  }
8951
+ return 'other';
8952
+ }
8953
+
8954
+ private static function getCurrentUserCapabilities() {
8955
+ $capabilities = array(
8956
+ 'manage_options',
8957
+ 'unfiltered_html',
8958
+ 'edit_others_posts',
8959
+ 'upload_files',
8960
+ 'publish_posts',
8961
+ 'edit_posts',
8962
+ 'read',
8963
+ 'manage_network'
8964
+ );
8965
+ foreach ($capabilities as $index=>$capability) {
8966
+ if (!current_user_can($capability)) {
8967
+ unset($capabilities[$index]);
8968
+ }
8969
+ }
8970
+ return array_values($capabilities);
8971
  }
8972
 
8973
  public static function licenseStatusChanged() {
9759
  }
9760
 
9761
  class wfWAFAutoPrependHelperException extends Exception {
9762
+ }
modules/login-security/css/{admin-global.1616621048.css → admin-global.1620658454.css} RENAMED
File without changes
modules/login-security/css/{admin.1616621048.css → admin.1620658454.css} RENAMED
File without changes
modules/login-security/css/{colorbox.1616621048.css → colorbox.1620658454.css} RENAMED
File without changes
modules/login-security/css/{font-awesome.1616621048.css → font-awesome.1620658454.css} RENAMED
File without changes
modules/login-security/css/{ionicons.1616621048.css → ionicons.1620658454.css} RENAMED
File without changes
modules/login-security/css/{jquery-ui-timepicker-addon.1616621048.css → jquery-ui-timepicker-addon.1620658454.css} RENAMED
File without changes
modules/login-security/css/{jquery-ui.min.1616621048.css → jquery-ui.min.1620658454.css} RENAMED
File without changes
modules/login-security/css/{jquery-ui.structure.min.1616621048.css → jquery-ui.structure.min.1620658454.css} RENAMED
File without changes
modules/login-security/css/{jquery-ui.theme.min.1616621048.css → jquery-ui.theme.min.1620658454.css} RENAMED
File without changes
modules/login-security/css/{login.1616621048.css → login.1620658454.css} RENAMED
File without changes
modules/login-security/js/{admin-global.1616621048.js → admin-global.1620658454.js} RENAMED
File without changes
modules/login-security/js/{admin.1616621048.js → admin.1620658454.js} RENAMED
File without changes
modules/login-security/js/{jquery-ui-timepicker-addon.1616621048.js → jquery-ui-timepicker-addon.1620658454.js} RENAMED
File without changes
modules/login-security/js/{jquery.colorbox.1616621048.js → jquery.colorbox.1620658454.js} RENAMED
File without changes
modules/login-security/js/{jquery.colorbox.min.1616621048.js → jquery.colorbox.min.1620658454.js} RENAMED
File without changes
modules/login-security/js/{jquery.qrcode.min.1616621048.js → jquery.qrcode.min.1620658454.js} RENAMED
File without changes
modules/login-security/js/{jquery.tmpl.min.1616621048.js → jquery.tmpl.min.1620658454.js} RENAMED
File without changes
modules/login-security/js/{login.1616621048.js → login.1620658454.js} RENAMED
File without changes
modules/login-security/wordfence-login-security.php CHANGED
@@ -27,7 +27,7 @@ else {
27
  define('WORDFENCE_LS_FROM_CORE', ($wfCoreActive && isset($wfCoreLoading) && $wfCoreLoading));
28
 
29
  define('WORDFENCE_LS_VERSION', '1.0.6');
30
- define('WORDFENCE_LS_BUILD_NUMBER', '1616621048');
31
 
32
  if (!defined('WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES')) { define('WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES', 15); }
33
 
27
  define('WORDFENCE_LS_FROM_CORE', ($wfCoreActive && isset($wfCoreLoading) && $wfCoreLoading));
28
 
29
  define('WORDFENCE_LS_VERSION', '1.0.6');
30
+ define('WORDFENCE_LS_BUILD_NUMBER', '1620658454');
31
 
32
  if (!defined('WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES')) { define('WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES', 15); }
33
 
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: security, firewall, malware scanner, web application firewall, two factor
4
  Requires at least: 3.9
5
  Requires PHP: 5.3
6
  Tested up to: 5.7
7
- Stable tag: 7.5.2
8
 
9
  Secure your website with the most comprehensive WordPress security plugin. Firewall, malware scan, blocking, live traffic, login security & more.
10
 
@@ -183,6 +183,22 @@ Secure your website with Wordfence.
183
 
184
  == Changelog ==
185
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  = 7.5.2 - March 24, 2021 =
187
 
188
  * Fix: Fixed fatal error on single-sites running WordPress <4.9.
4
  Requires at least: 3.9
5
  Requires PHP: 5.3
6
  Tested up to: 5.7
7
+ Stable tag: 7.5.3
8
 
9
  Secure your website with the most comprehensive WordPress security plugin. Firewall, malware scan, blocking, live traffic, login security & more.
10
 
183
 
184
  == Changelog ==
185
 
186
+ = 7.5.3 - May 10, 2021 =
187
+
188
+ * Improvement: Expanded WAF capabilities including better JSON and user permission handling
189
+ * Improvement: Switched to relative paths in WAF auto_prepend file to increase portability
190
+ * Improvement: Eliminated unnecessary calls to Wordfence servers
191
+ * Fix: Prevented errors on PHP 8.0 when disk_free_space and/or disk_total_space are included in disabled_functions
192
+ * Fix: Fixed PHP notices caused by unexpected plugin version data
193
+ * Fix: Gracefully handle unexpected responses from Wordfence servers
194
+ * Fix: Time field now displays correctly on "See Recent Traffic" overlay
195
+ * Fix: Corrected typo on Diagnostics page
196
+ * Fix: Corrected IP counts on activity report
197
+ * Fix: Added missing line break in scan result emails
198
+ * Fix: Sending test activity report now provides success/failure response
199
+ * Fix: Reduced SQLi false positives caused by comma-separated strings
200
+ * Fix: Fixed JS error when resolving last scan result
201
+
202
  = 7.5.2 - March 24, 2021 =
203
 
204
  * Fix: Fixed fatal error on single-sites running WordPress <4.9.
vendor/wordfence/wf-waf/src/init.php CHANGED
@@ -5,7 +5,7 @@ define('WFWAF_VERSION', '1.0.4');
5
  define('WFWAF_PATH', dirname(__FILE__) . '/');
6
  define('WFWAF_LIB_PATH', WFWAF_PATH . 'lib/');
7
  define('WFWAF_VIEW_PATH', WFWAF_PATH . 'views/');
8
- define('WFWAF_API_URL_SEC', 'https://noc4.wordfence.com/v1.9/');
9
  if (!defined('WFWAF_DEBUG')) {
10
  define('WFWAF_DEBUG', false);
11
  }
5
  define('WFWAF_PATH', dirname(__FILE__) . '/');
6
  define('WFWAF_LIB_PATH', WFWAF_PATH . 'lib/');
7
  define('WFWAF_VIEW_PATH', WFWAF_PATH . 'views/');
8
+ define('WFWAF_API_URL_SEC', 'https://noc4.wordfence.com/v1.10/');
9
  if (!defined('WFWAF_DEBUG')) {
10
  define('WFWAF_DEBUG', false);
11
  }
vendor/wordfence/wf-waf/src/lib/http.php CHANGED
@@ -367,6 +367,7 @@ class wfWAFHTTPTransportCurl extends wfWAFHTTPTransport {
367
  $response = new wfWAFHTTPResponse();
368
  $response->setBody($body);
369
  $response->setHeaders($header);
 
370
  return $response;
371
  }
372
  return false;
367
  $response = new wfWAFHTTPResponse();
368
  $response->setBody($body);
369
  $response->setHeaders($header);
370
+ $response->setStatusCode(curl_getinfo($ch, CURLINFO_HTTP_CODE));
371
  return $response;
372
  }
373
  return false;
vendor/wordfence/wf-waf/src/lib/parser/lexer.php CHANGED
@@ -299,6 +299,7 @@ class wfWAFBaseParser {
299
  protected $index;
300
  /** @var wfWAFLexerInterface */
301
  protected $lexer;
 
302
 
303
  public function __construct($lexer) {
304
  $this->lexer = $lexer;
@@ -426,6 +427,15 @@ class wfWAFBaseParser {
426
  public function setTokens($tokens) {
427
  $this->tokens = $tokens;
428
  }
 
 
 
 
 
 
 
 
 
429
  }
430
 
431
  /**
@@ -687,4 +697,4 @@ class wfWAFStringScanner {
687
  $this->captures = $captures;
688
  }
689
  }
690
- }
299
  protected $index;
300
  /** @var wfWAFLexerInterface */
301
  protected $lexer;
302
+ protected $checkpoint=0;
303
 
304
  public function __construct($lexer) {
305
  $this->lexer = $lexer;
427
  public function setTokens($tokens) {
428
  $this->tokens = $tokens;
429
  }
430
+
431
+ protected function setCheckpoint() {
432
+ $this->checkpoint=$this->index;
433
+ }
434
+
435
+ protected function reset() {
436
+ $this->index=$this->checkpoint;
437
+ }
438
+
439
  }
440
 
441
  /**
697
  $this->captures = $captures;
698
  }
699
  }
700
+ }
vendor/wordfence/wf-waf/src/lib/parser/parser.php CHANGED
@@ -206,26 +206,63 @@ class wfWAFRuleParser extends wfWAFBaseParser {
206
  return $comparisonGroup;
207
  }
208
 
209
- private function parseComparison() {
210
  /**
211
  * @var wfWAFLexerToken $actionToken
212
  * @var wfWAFLexerToken $expectedToken
213
  */
 
214
  $actionToken = $this->currentToken();
215
  $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS);
216
- $value = $this->expectLiteral();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
 
218
  $subjects = array();
219
- while (true) {
220
- $commaToken = $this->nextToken();
221
- if (!($commaToken && $commaToken->getType() === wfWAFRuleLexer::T_COMMA)) {
222
- $this->index--;
223
- break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
224
  }
225
- list($filters, $subject) = $this->parseFilters();
226
- $subjects[] = new wfWAFRuleComparisonSubject($this->getWAF(), $subject, $filters);
227
  }
228
- $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_CLOSE_PARENTHESIS);
229
 
230
  $comparison = new wfWAFRuleComparison($this->getWAF(), $actionToken->getValue(), $value, $subjects);
231
  return $comparison;
@@ -284,7 +321,7 @@ class wfWAFRuleParser extends wfWAFBaseParser {
284
  break 2;
285
 
286
  case wfWAFRuleLexer::T_OPEN_PARENTHESIS:
287
- $filters[] = $globalToken->getValue();
288
  break;
289
 
290
  default:
@@ -297,7 +334,16 @@ class wfWAFRuleParser extends wfWAFBaseParser {
297
  throw new wfWAFParserSyntaxError('No subject supplied to filter');
298
  }
299
  for ($i = 0; $i < count($filters); $i++) {
300
- $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_CLOSE_PARENTHESIS);
 
 
 
 
 
 
 
 
 
301
  }
302
  return array($filters, $subject);
303
  }
@@ -305,15 +351,20 @@ class wfWAFRuleParser extends wfWAFBaseParser {
305
  /**
306
  * @throws wfWAFParserSyntaxError
307
  */
308
- private function parseSubject() {
309
- $globalToken = $this->expectNextToken();
310
- $this->expectTokenTypeEquals($globalToken, wfWAFRuleLexer::T_IDENTIFIER);
311
- $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_DOT);
312
- $globalToken2 = $this->expectNextToken();
313
- $this->expectTokenTypeEquals($globalToken2, wfWAFRuleLexer::T_IDENTIFIER);
314
- $subject = array(
315
- $globalToken->getValue() . '.' . $globalToken2->getValue(),
316
- );
 
 
 
 
 
317
  $savePoint = $this->index;
318
  while (($property = $this->parsePropertyAccessor()) !== false) {
319
  $subject[] = $property;
@@ -398,15 +449,15 @@ class wfWAFRuleParser extends wfWAFBaseParser {
398
  * @return mixed|string
399
  * @throws wfWAFRuleParserSyntaxError
400
  */
401
- private function expectLiteral() {
402
  $expectedToken = $this->expectNextToken();
403
- $this->expectTokenTypeInArray($expectedToken, array(
404
  wfWAFRuleLexer::T_SINGLE_STRING_LITERAL,
405
  wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL,
406
  wfWAFRuleLexer::T_IDENTIFIER,
407
  wfWAFRuleLexer::T_NUMBER_LITERAL,
408
  wfWAFRuleLexer::T_OPEN_BRACKET,
409
- ));
410
  if ($expectedToken->getType() === wfWAFRuleLexer::T_SINGLE_STRING_LITERAL) {
411
  // Remove quotes, strip slashes
412
  $value = wfWAFUtils::substr($expectedToken->getValue(), 1, -1);
@@ -431,6 +482,8 @@ class wfWAFRuleParser extends wfWAFBaseParser {
431
  $this->index--;
432
  $value[] = $this->expectLiteral();
433
  }
 
 
434
  } else {
435
  $value = $expectedToken->getValue();
436
  }
@@ -867,4 +920,4 @@ class wfWAFRuleVariable {
867
  $this->waf = $waf;
868
  }
869
  }
870
- }
206
  return $comparisonGroup;
207
  }
208
 
209
+ private function parseComparison($expectLiteral = true) {
210
  /**
211
  * @var wfWAFLexerToken $actionToken
212
  * @var wfWAFLexerToken $expectedToken
213
  */
214
+ $this->setCheckpoint();
215
  $actionToken = $this->currentToken();
216
  $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS);
217
+ $value=null;
218
+ if($expectLiteral) {
219
+ try {
220
+ $value = $this->expectLiteral(array(wfWAFRuleLexer::T_CLOSE_PARENTHESIS));
221
+ if ($value === null && $expectLiteral) {
222
+ $this->index--;
223
+ }
224
+ }
225
+ catch(wfWAFParserSyntaxError $e) {
226
+ if($expectLiteral) {
227
+ $this->reset();
228
+ return $this->parseComparison(false);
229
+ }
230
+ throw $e;
231
+ }
232
+ }
233
 
234
  $subjects = array();
235
+ $nextToken = $this->nextToken();
236
+ if ($value!==null||!$expectLiteral) {
237
+ while (true) {
238
+ if ($nextToken && $nextToken->getType() === wfWAFRuleLexer::T_CLOSE_PARENTHESIS) {
239
+ break;
240
+ }
241
+ if (!($nextToken && $nextToken->getType() === wfWAFRuleLexer::T_COMMA)) {
242
+ if(empty($subjects) && $expectLiteral) {
243
+ $this->reset();
244
+ return $this->parseComparison(false);
245
+ }
246
+ $this->index--;
247
+ if(!empty($subjects))
248
+ break;
249
+ }
250
+ list($filters, $subject) = $this->parseFilters();
251
+ $current = new wfWAFRuleComparisonSubject($this->getWAF(), $subject, $filters);
252
+ $nextToken = $this->expectNextToken();
253
+ if (in_array($nextToken->getType(), array(wfWAFRuleLexer::T_DOT, wfWAFRuleLexer::T_OPEN_BRACKET))) {
254
+ $this->index--;
255
+ $childSubject = $this->parseSubject(false);
256
+ if (!is_array($childSubject) )
257
+ $childSubject = array($childSubject);
258
+ array_unshift($childSubject, $current);
259
+ $current = new wfWAFRuleComparisonSubject($this->getWAF(), $childSubject, array());
260
+ $nextToken = $this->expectNextToken();
261
+ }
262
+ $subjects[] = $current;
263
  }
264
+ $this->expectTokenTypeEquals($nextToken, wfWAFRuleLexer::T_CLOSE_PARENTHESIS);
 
265
  }
 
266
 
267
  $comparison = new wfWAFRuleComparison($this->getWAF(), $actionToken->getValue(), $value, $subjects);
268
  return $comparison;
321
  break 2;
322
 
323
  case wfWAFRuleLexer::T_OPEN_PARENTHESIS:
324
+ array_unshift($filters, array($globalToken->getValue()));
325
  break;
326
 
327
  default:
334
  throw new wfWAFParserSyntaxError('No subject supplied to filter');
335
  }
336
  for ($i = 0; $i < count($filters); $i++) {
337
+ do {
338
+ $next = $this->expectNextToken();
339
+ $this->expectTokenTypeInArray($next, array(wfWAFRuleLexer::T_CLOSE_PARENTHESIS, wfWAFRuleLexer::T_COMMA));
340
+ if ($next->getType() === wfWAFRuleLexer::T_COMMA) {
341
+ $filters[$i][] = $this->expectLiteral();
342
+ }
343
+ else {
344
+ break;
345
+ }
346
+ } while(true);
347
  }
348
  return array($filters, $subject);
349
  }
351
  /**
352
  * @throws wfWAFParserSyntaxError
353
  */
354
+ private function parseSubject($global = true) {
355
+ if ($global) {
356
+ $globalToken = $this->expectNextToken();
357
+ $this->expectTokenTypeEquals($globalToken, wfWAFRuleLexer::T_IDENTIFIER);
358
+ $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_DOT);
359
+ $globalToken2 = $this->expectNextToken();
360
+ $this->expectTokenTypeEquals($globalToken2, wfWAFRuleLexer::T_IDENTIFIER);
361
+ $subject = array(
362
+ $globalToken->getValue() . '.' . $globalToken2->getValue(),
363
+ );
364
+ }
365
+ else {
366
+ $subject = array();
367
+ }
368
  $savePoint = $this->index;
369
  while (($property = $this->parsePropertyAccessor()) !== false) {
370
  $subject[] = $property;
449
  * @return mixed|string
450
  * @throws wfWAFRuleParserSyntaxError
451
  */
452
+ private function expectLiteral($allowExtra = array()) {
453
  $expectedToken = $this->expectNextToken();
454
+ $this->expectTokenTypeInArray($expectedToken, array_merge(array(
455
  wfWAFRuleLexer::T_SINGLE_STRING_LITERAL,
456
  wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL,
457
  wfWAFRuleLexer::T_IDENTIFIER,
458
  wfWAFRuleLexer::T_NUMBER_LITERAL,
459
  wfWAFRuleLexer::T_OPEN_BRACKET,
460
+ ), $allowExtra));
461
  if ($expectedToken->getType() === wfWAFRuleLexer::T_SINGLE_STRING_LITERAL) {
462
  // Remove quotes, strip slashes
463
  $value = wfWAFUtils::substr($expectedToken->getValue(), 1, -1);
482
  $this->index--;
483
  $value[] = $this->expectLiteral();
484
  }
485
+ } else if (in_array($expectedToken->getType(), $allowExtra)) {
486
+ return null;
487
  } else {
488
  $value = $expectedToken->getValue();
489
  }
920
  $this->waf = $waf;
921
  }
922
  }
923
+ }
vendor/wordfence/wf-waf/src/lib/parser/sqli.php CHANGED
@@ -21,67 +21,67 @@ class wfWAFSQLiParser extends wfWAFBaseParser {
21
  // SQL statement and token count for lexer
22
  $tests = array(
23
  array('%s', 1),
24
- array('SELECT * FROM t WHERE i = %s ', 8),
25
- array("SELECT * FROM t WHERE i = '%s' ", 8),
26
- array('SELECT * FROM t WHERE i = "%s" ', 8),
27
- array('SELECT * FROM t WHERE i = (%s) ', 10),
28
- array("SELECT * FROM t WHERE i = ('%s') ", 10),
29
- array('SELECT * FROM t WHERE i = ("%s") ', 10),
30
- array('SELECT * FROM t WHERE i = ((%s)) ', 12),
31
- array("SELECT * FROM t WHERE i = (('%s')) ", 12),
32
- array('SELECT * FROM t WHERE i = (("%s")) ', 12),
33
- array('SELECT * FROM t WHERE i = (((%s))) ', 14),
34
- array("SELECT * FROM t WHERE i = ((('%s'))) ", 14),
35
- array('SELECT * FROM t WHERE i = ((("%s"))) ', 14),
36
 
37
  array('SELECT * FROM t WHERE i = %s and j = (1
38
- ) ', 14),
39
  array("SELECT * FROM t WHERE i = '%s' and j = (1
40
- ) ", 14),
41
  array('SELECT * FROM t WHERE i = "%s" and j = (1
42
- ) ', 14),
43
 
44
- array('SELECT MATCH(t) AGAINST (%s) from t ', 11),
45
- array("SELECT MATCH(t) AGAINST ('%s') from t ", 11),
46
- array('SELECT MATCH(t) AGAINST ("%s") from t ', 11),
47
 
48
- // array('SELECT CASE WHEN %s THEN 1 ELSE 0 END from t ', 11),
49
- // array("SELECT CASE WHEN '%s' THEN 1 ELSE 0 END from t ", 11),
50
- // array('SELECT CASE WHEN "%s" THEN 1 ELSE 0 END from t ', 11),
51
  //
52
- // array('SELECT (CASE WHEN (%s) THEN 1 ELSE 0 END) from t ', 15),
53
- // array("SELECT (CASE WHEN ('%s') THEN 1 ELSE 0 END) from t ", 15),
54
- // array('SELECT (CASE WHEN ("%s") THEN 1 ELSE 0 END) from t ', 15),
55
-
56
- array('SELECT * FROM (select %s) ', 7),
57
- array("SELECT * FROM (select '%s') ", 7),
58
- array('SELECT * FROM (select "%s") ', 7),
59
- array('SELECT * FROM (select (%s)) ', 9),
60
- array("SELECT * FROM (select ('%s')) ", 9),
61
- array('SELECT * FROM (select ("%s")) ', 9),
62
- array('SELECT * FROM (select ((%s))) ', 11),
63
- array("SELECT * FROM (select (('%s'))) ", 11),
64
- array('SELECT * FROM (select (("%s"))) ', 11),
65
  //
66
- // array('SELECT * FROM t JOIN t2 on i = %s ', 10),
67
- // array("SELECT * FROM t JOIN t2 on i = '%s' ", 10),
68
- // array('SELECT * FROM t JOIN t2 on i = "%s" ', 10),
69
- // array('SELECT * FROM t JOIN t2 on i = (%s) ', 12),
70
- // array("SELECT * FROM t JOIN t2 on i = ('%s') ", 12),
71
- // array('SELECT * FROM t JOIN t2 on i = ("%s") ', 12),
72
- // array('SELECT * FROM t JOIN t2 on i = ((%s)) ', 14),
73
- // array("SELECT * FROM t JOIN t2 on i = (('%s')) ", 14),
74
- // array('SELECT * FROM t JOIN t2 on i = (("%s")) ', 14),
75
- // array('SELECT * FROM t JOIN t2 on i = (((%s))) ', 16),
76
- // array("SELECT * FROM t JOIN t2 on i = ((('%s'))) ", 16),
77
- // array('SELECT * FROM t JOIN t2 on i = ((("%s"))) ', 16),
78
-
79
- array('SELECT * FROM %s ', 4),
80
- array('INSERT INTO t (col) VALUES (%s) ', 10),
81
- array("INSERT INTO t (col) VALUES ('%s') ", 10),
82
- array('INSERT INTO t (col) VALUES ("%s") ', 10),
83
- array('UPDATE t1 SET col1 = %s ', 6),
84
- array('UPDATE t1 SET col1 = \'%s\' ', 6),
85
  );
86
  }
87
  $lexerFlags = array(0, wfWAFSQLiLexer::FLAG_TOKENIZE_MYSQL_PORTABLE_COMMENTS);
@@ -1124,8 +1124,13 @@ class wfWAFSQLiParser extends wfWAFBaseParser {
1124
  $this->_init();
1125
 
1126
  $savePoint = $this->index;
1127
- for ($i = 0; $i <= $num; $i++) {
1128
- if (!$this->nextToken()) {
 
 
 
 
 
1129
  $this->index = $savePoint;
1130
  return false;
1131
  }
@@ -3648,6 +3653,27 @@ class wfWAFSQLiLexer implements wfWAFLexerInterface {
3648
  public function setFlags($flags) {
3649
  $this->flags = $flags;
3650
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3651
  }
3652
 
3653
  class wfWAFLexerTokenMatcher {
21
  // SQL statement and token count for lexer
22
  $tests = array(
23
  array('%s', 1),
24
+ array('SELECT * FROM t WHERE i = %s ', 7),
25
+ array("SELECT * FROM t WHERE i = '%s' ", 7),
26
+ array('SELECT * FROM t WHERE i = "%s" ', 7),
27
+ array('SELECT * FROM t WHERE i = (%s) ', 9),
28
+ array("SELECT * FROM t WHERE i = ('%s') ", 9),
29
+ array('SELECT * FROM t WHERE i = ("%s") ', 9),
30
+ array('SELECT * FROM t WHERE i = ((%s)) ', 11),
31
+ array("SELECT * FROM t WHERE i = (('%s')) ", 11),
32
+ array('SELECT * FROM t WHERE i = (("%s")) ', 11),
33
+ array('SELECT * FROM t WHERE i = (((%s))) ', 13),
34
+ array("SELECT * FROM t WHERE i = ((('%s'))) ", 13),
35
+ array('SELECT * FROM t WHERE i = ((("%s"))) ', 13),
36
 
37
  array('SELECT * FROM t WHERE i = %s and j = (1
38
+ ) ', 12),
39
  array("SELECT * FROM t WHERE i = '%s' and j = (1
40
+ ) ", 12),
41
  array('SELECT * FROM t WHERE i = "%s" and j = (1
42
+ ) ', 12),
43
 
44
+ array('SELECT MATCH(t) AGAINST (%s) from t ', 10),
45
+ array("SELECT MATCH(t) AGAINST ('%s') from t ", 10),
46
+ array('SELECT MATCH(t) AGAINST ("%s") from t ', 10),
47
 
48
+ // array('SELECT CASE WHEN %s THEN 1 ELSE 0 END from t ', 8),
49
+ // array("SELECT CASE WHEN '%s' THEN 1 ELSE 0 END from t ", 8),
50
+ // array('SELECT CASE WHEN "%s" THEN 1 ELSE 0 END from t ', 8),
51
  //
52
+ // array('SELECT (CASE WHEN (%s) THEN 1 ELSE 0 END) from t ', 12),
53
+ // array("SELECT (CASE WHEN ('%s') THEN 1 ELSE 0 END) from t ", 12),
54
+ // array('SELECT (CASE WHEN ("%s") THEN 1 ELSE 0 END) from t ', 12),
55
+
56
+ array('SELECT * FROM (select %s) ', 6),
57
+ array("SELECT * FROM (select '%s') ", 6),
58
+ array('SELECT * FROM (select "%s") ', 6),
59
+ array('SELECT * FROM (select (%s)) ', 8),
60
+ array("SELECT * FROM (select ('%s')) ", 8),
61
+ array('SELECT * FROM (select ("%s")) ', 8),
62
+ array('SELECT * FROM (select ((%s))) ', 10),
63
+ array("SELECT * FROM (select (('%s'))) ", 10),
64
+ array('SELECT * FROM (select (("%s"))) ', 10),
65
  //
66
+ // array('SELECT * FROM t JOIN t2 on i = %s ', 9),
67
+ // array("SELECT * FROM t JOIN t2 on i = '%s' ", 9),
68
+ // array('SELECT * FROM t JOIN t2 on i = "%s" ', 9),
69
+ // array('SELECT * FROM t JOIN t2 on i = (%s) ', 11),
70
+ // array("SELECT * FROM t JOIN t2 on i = ('%s') ", 11),
71
+ // array('SELECT * FROM t JOIN t2 on i = ("%s") ', 11),
72
+ // array('SELECT * FROM t JOIN t2 on i = ((%s)) ', 13),
73
+ // array("SELECT * FROM t JOIN t2 on i = (('%s')) ", 13),
74
+ // array('SELECT * FROM t JOIN t2 on i = (("%s")) ', 13),
75
+ // array('SELECT * FROM t JOIN t2 on i = (((%s))) ', 15),
76
+ // array("SELECT * FROM t JOIN t2 on i = ((('%s'))) ", 15),
77
+ // array('SELECT * FROM t JOIN t2 on i = ((("%s"))) ', 15),
78
+
79
+ array('SELECT * FROM %s ', 3),
80
+ array('INSERT INTO t (col) VALUES (%s) ', 9),
81
+ array("INSERT INTO t (col) VALUES ('%s') ", 9),
82
+ array('INSERT INTO t (col) VALUES ("%s") ', 9),
83
+ array('UPDATE t1 SET col1 = %s ', 5),
84
+ array('UPDATE t1 SET col1 = \'%s\' ', 5),
85
  );
86
  }
87
  $lexerFlags = array(0, wfWAFSQLiLexer::FLAG_TOKENIZE_MYSQL_PORTABLE_COMMENTS);
1124
  $this->_init();
1125
 
1126
  $savePoint = $this->index;
1127
+ for ($i = 0; $i <= $num;) {
1128
+ $token=$this->nextToken();
1129
+ if($token){
1130
+ if(!$this->lexer->isValueLiteral($token->getType()))
1131
+ $i++;
1132
+ }
1133
+ else{
1134
  $this->index = $savePoint;
1135
  return false;
1136
  }
3653
  public function setFlags($flags) {
3654
  $this->flags = $flags;
3655
  }
3656
+
3657
+ /**
3658
+ * Check if the given token type represents a literal value
3659
+ * @param $type the token type
3660
+ * @return bool true if the provided type is a value literal, false otherwise
3661
+ */
3662
+ public function isValueLiteral($type){
3663
+ switch($type){
3664
+ case self::DOUBLE_STRING_LITERAL:
3665
+ case self::SINGLE_STRING_LITERAL:
3666
+ case self::INTEGER_LITERAL:
3667
+ case self::REAL_NUMBER_LITERAL:
3668
+ case self::BINARY_NUMBER_LITERAL:
3669
+ case self::HEX_NUMBER_LITERAL:
3670
+ case self::COMMA:
3671
+ return true;
3672
+ default:
3673
+ return false;
3674
+ }
3675
+ }
3676
+
3677
  }
3678
 
3679
  class wfWAFLexerTokenMatcher {
vendor/wordfence/wf-waf/src/lib/request.php CHANGED
@@ -9,6 +9,8 @@ interface wfWAFRequestInterface {
9
 
10
  public function getMd5Body();
11
 
 
 
12
  public function getQueryString();
13
 
14
  public function getMd5QueryString();
@@ -263,7 +265,8 @@ class wfWAFRequest implements wfWAFRequestInterface {
263
  $request->setRawBody('');
264
  }
265
  else {
266
- $request->setRawBody(wfWAFUtils::rawPOSTBody());
 
267
  }
268
 
269
  $request->setQueryString(wfWAFUtils::stripMagicQuotes($_GET));
@@ -343,6 +346,8 @@ class wfWAFRequest implements wfWAFRequestInterface {
343
  private $body;
344
  private $rawBody;
345
  private $md5Body;
 
 
346
  private $cookies;
347
  private $fileNames;
348
  private $files;
@@ -402,6 +407,18 @@ class wfWAFRequest implements wfWAFRequestInterface {
402
  return $this->md5Body;
403
  }
404
 
 
 
 
 
 
 
 
 
 
 
 
 
405
  public function getQueryString() {
406
  if (func_num_args() > 0) {
407
  $args = func_get_args();
@@ -989,6 +1006,11 @@ FORM;
989
  $this->md5Body = $md5Body;
990
  }
991
 
 
 
 
 
 
992
  /**
993
  * @param mixed $cookies
994
  */
@@ -1088,4 +1110,4 @@ FORM;
1088
  $this->metadata = $metadata;
1089
  }
1090
  }
1091
- }
9
 
10
  public function getMd5Body();
11
 
12
+ public function getJsonBody();
13
+
14
  public function getQueryString();
15
 
16
  public function getMd5QueryString();
265
  $request->setRawBody('');
266
  }
267
  else {
268
+ $rawBody=wfWAFUtils::rawPOSTBody();
269
+ $request->setRawBody($rawBody);
270
  }
271
 
272
  $request->setQueryString(wfWAFUtils::stripMagicQuotes($_GET));
346
  private $body;
347
  private $rawBody;
348
  private $md5Body;
349
+ private $jsonBody;
350
+ private $jsonParsed = false;
351
  private $cookies;
352
  private $fileNames;
353
  private $files;
407
  return $this->md5Body;
408
  }
409
 
410
+ public function getJsonBody() {
411
+ if ($this->jsonParsed === false) {
412
+ if (defined('WFWAF_DISABLE_RAW_BODY') && WFWAF_DISABLE_RAW_BODY) {
413
+ $this->setJsonBody(null);
414
+ }
415
+ else {
416
+ $this->setJsonBody(wfWAFUtils::json_decode($this->getRawBody(), true));
417
+ }
418
+ }
419
+ return $this->jsonBody;
420
+ }
421
+
422
  public function getQueryString() {
423
  if (func_num_args() > 0) {
424
  $args = func_get_args();
1006
  $this->md5Body = $md5Body;
1007
  }
1008
 
1009
+ public function setJsonBody($jsonBody) {
1010
+ $this->jsonBody = $jsonBody;
1011
+ $this->jsonParsed = true;
1012
+ }
1013
+
1014
  /**
1015
  * @param mixed $cookies
1016
  */
1110
  $this->metadata = $metadata;
1111
  }
1112
  }
1113
+ }
vendor/wordfence/wf-waf/src/lib/rules.php CHANGED
@@ -462,7 +462,7 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
462
  */
463
  private $rule;
464
 
465
- protected static $allowedActions = array(
466
  'contains',
467
  'notcontains',
468
  'match',
@@ -502,8 +502,25 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
502
  'versiongreaterthanequalto',
503
  'versionlessthan',
504
  'versionlessthanequalto',
 
505
  );
506
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
  /**
508
  * @var mixed
509
  */
@@ -554,6 +571,9 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
554
  }
555
  $return = '';
556
  $global = array_shift($subject);
 
 
 
557
  foreach ($subject as $key) {
558
  $return .= '[' . $key . ']';
559
  }
@@ -601,14 +621,43 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
601
  $subjectExport);
602
  }
603
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
604
  public function isActionValid() {
605
- return in_array(wfWAFUtils::strtolower($this->getAction()), self::$allowedActions);
 
 
 
 
 
 
 
 
 
606
  }
607
 
608
  public function evaluate() {
609
- if (!$this->isActionValid()) {
 
610
  return false;
611
  }
 
 
 
612
  $subjects = $this->getSubjects();
613
  if (!is_array($subjects)) {
614
  return false;
@@ -620,7 +669,7 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
620
  $global = $subject->getValue();
621
  $subjectKey = $subject->getKey();
622
 
623
- if ($this->_evaluate(array($this, $this->getAction()), $global, $subjectKey)) {
624
  $this->result = true;
625
  }
626
  }
@@ -631,20 +680,19 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
631
  * @param callback $callback
632
  * @param mixed $global
633
  * @param string $subjectKey
 
634
  * @return bool
635
  */
636
- private function _evaluate($callback, $global, $subjectKey) {
637
  $result = false;
638
 
639
- if ($this->getWAF() && $this->getRule() &&
640
- $this->getWAF()->isRuleParamWhitelisted($this->getRule()->getRuleID(), $this->getWAF()->getRequest()->getPath(), $subjectKey)
641
- ) {
642
  return $result;
643
  }
644
 
645
- if (is_array($global)) {
646
  foreach ($global as $key => $value) {
647
- if ($this->_evaluate($callback, $value, $subjectKey . '[' . $key . ']')) {
648
  $result = true;
649
  }
650
  }
@@ -652,7 +700,7 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
652
  $result = true;
653
  $this->failedSubjects[] = array(
654
  'subject' => $subjectKey,
655
- 'value' => $global,
656
  'multiplier' => $this->getMultiplier(),
657
  'matches' => $this->getMatches(),
658
  );
@@ -749,6 +797,22 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
749
  return !$this->currentUserIs($subject);
750
  }
751
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
752
  public function md5Equals($subject) {
753
  return md5((string) $subject) === $this->getExpected();
754
  }
@@ -1185,6 +1249,28 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
1185
  return version_compare($subject, $this->getExpected(), '<=');
1186
  }
1187
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1188
  /**
1189
  * @return mixed
1190
  */
@@ -1240,7 +1326,7 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
1240
  * @return mixed
1241
  */
1242
  public function getFailedSubjects() {
1243
- return $this->failedSubjects;
1244
  }
1245
 
1246
  /**
@@ -1368,10 +1454,18 @@ class wfWAFRuleComparisonGroup implements wfWAFRuleInterface {
1368
  }
1369
  }
1370
  if ($comparison instanceof wfWAFRuleComparison && $comparison->getResult()) {
1371
- foreach ($comparison->getFailedSubjects() as $failedSubject) {
 
 
 
 
 
 
 
 
1372
  $this->failedComparisons[] = new wfWAFRuleComparisonFailure(
1373
- $failedSubject['subject'], $failedSubject['value'], $comparison->getExpected(),
1374
- $comparison->getAction(), $failedSubject['multiplier'], $failedSubject['matches']
1375
  );
1376
  }
1377
  }
@@ -1682,17 +1776,26 @@ class wfWAFRuleComparisonSubject {
1682
  );
1683
  }
1684
 
 
 
 
 
 
 
 
 
 
1685
  /**
1686
  * @return mixed|null
1687
  */
1688
  public function getValue() {
1689
  $subject = $this->getSubject();
1690
  if (!is_array($subject)) {
1691
- return $this->runFilters($this->getWAF()->getGlobal($subject));
1692
  }
1693
- if (is_array($subject) && count($subject) > 0) {
1694
  $globalKey = array_shift($subject);
1695
- return $this->runFilters($this->_getValue($subject, $this->getWAF()->getGlobal($globalKey)));
1696
  }
1697
  return null;
1698
  }
@@ -1733,9 +1836,9 @@ class wfWAFRuleComparisonSubject {
1733
  private function runFilters($value) {
1734
  $filters = $this->getFilters();
1735
  if (is_array($filters)) {
1736
- foreach ($filters as $filter) {
1737
- if (method_exists($this, 'filter' . $filter)) {
1738
- $value = call_user_func(array($this, 'filter' . $filter), $value);
1739
  }
1740
  }
1741
  }
@@ -1753,11 +1856,65 @@ class wfWAFRuleComparisonSubject {
1753
  return $value;
1754
  }
1755
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1756
  /**
1757
  * @return string
1758
  */
1759
  public function render() {
1760
- return sprintf('%s::create($this, %s, %s)', get_class($this), var_export($this->getSubject(), true),
1761
  var_export($this->getFilters(), true));
1762
  }
1763
 
@@ -1787,7 +1944,7 @@ class wfWAFRuleComparisonSubject {
1787
  }
1788
 
1789
  foreach ($this->getFilters() as $filter) {
1790
- $rule = $filter . '(' . $rule . ')';
1791
  }
1792
  return $rule;
1793
  }
@@ -1834,4 +1991,4 @@ class wfWAFRuleComparisonSubject {
1834
  $this->waf = $waf;
1835
  }
1836
  }
1837
- }
462
  */
463
  private $rule;
464
 
465
+ private static $scalarActions = array(
466
  'contains',
467
  'notcontains',
468
  'match',
502
  'versiongreaterthanequalto',
503
  'versionlessthan',
504
  'versionlessthanequalto',
505
+ 'exists'
506
  );
507
 
508
+ private static $arrayActions = array(
509
+ 'keyexists',
510
+ 'keymatches'
511
+ );
512
+
513
+ private static $globalActions = array(
514
+ 'hasuser',
515
+ 'nothasuser',
516
+ 'currentusercan',
517
+ 'currentusercannot'
518
+ );
519
+
520
+ const ACTION_TYPE_SCALAR=0;
521
+ const ACTION_TYPE_ARRAY=1;
522
+ const ACTION_TYPE_GLOBAL=2;
523
+
524
  /**
525
  * @var mixed
526
  */
571
  }
572
  $return = '';
573
  $global = array_shift($subject);
574
+ if ($global instanceof wfWAFRuleComparisonSubject) {
575
+ $global = 'filtered';
576
+ }
577
  foreach ($subject as $key) {
578
  $return .= '[' . $key . ']';
579
  }
621
  $subjectExport);
622
  }
623
 
624
+ public function getActionType() {
625
+ $action=wfWAFUtils::strtolower($this->getAction());
626
+ if (in_array($action, self::$scalarActions)) {
627
+ return self::ACTION_TYPE_SCALAR;
628
+ }
629
+ else if(in_array($action, self::$arrayActions)) {
630
+ return self::ACTION_TYPE_ARRAY;
631
+ }
632
+ else if(in_array($action, self::$globalActions)) {
633
+ return self::ACTION_TYPE_GLOBAL;
634
+ }
635
+ else {
636
+ return null;
637
+ }
638
+ }
639
+
640
  public function isActionValid() {
641
+ return $this->getActionType() !== null;
642
+ }
643
+
644
+ public function hasSubject() {
645
+ return $this->getActionType() !== self::ACTION_TYPE_GLOBAL;
646
+ }
647
+
648
+ private function isWhitelisted($subjectKey = '') {
649
+ return $this->getWAF() && $this->getRule() &&
650
+ $this->getWAF()->isRuleParamWhitelisted($this->getRule()->getRuleID(), $this->getWAF()->getRequest()->getPath(), $subjectKey);
651
  }
652
 
653
  public function evaluate() {
654
+ $type = $this->getActionType();
655
+ if ($type===null) {
656
  return false;
657
  }
658
+ else if ($type===self::ACTION_TYPE_GLOBAL) {
659
+ return (!$this->isWhitelisted()) && ($this->result=call_user_func(array($this, $this->getAction())));
660
+ }
661
  $subjects = $this->getSubjects();
662
  if (!is_array($subjects)) {
663
  return false;
669
  $global = $subject->getValue();
670
  $subjectKey = $subject->getKey();
671
 
672
+ if ($this->_evaluate(array($this, $this->getAction()), $global, $subjectKey, $type===self::ACTION_TYPE_SCALAR)) {
673
  $this->result = true;
674
  }
675
  }
680
  * @param callback $callback
681
  * @param mixed $global
682
  * @param string $subjectKey
683
+ * @param bool $iterate
684
  * @return bool
685
  */
686
+ private function _evaluate($callback, $global, $subjectKey, $iterate) {
687
  $result = false;
688
 
689
+ if ($this->isWhitelisted($subjectKey)) {
 
 
690
  return $result;
691
  }
692
 
693
+ if (is_array($global) && $iterate) {
694
  foreach ($global as $key => $value) {
695
+ if ($this->_evaluate($callback, $value, $subjectKey . '[' . $key . ']', $iterate)) {
696
  $result = true;
697
  }
698
  }
700
  $result = true;
701
  $this->failedSubjects[] = array(
702
  'subject' => $subjectKey,
703
+ 'value' => is_string($global) ? $global : wfWAFUtils::json_encode($global),
704
  'multiplier' => $this->getMultiplier(),
705
  'matches' => $this->getMatches(),
706
  );
797
  return !$this->currentUserIs($subject);
798
  }
799
 
800
+ public function hasUser() {
801
+ return $this->getWAF()->parseAuthCookie()!==false;
802
+ }
803
+
804
+ public function notHasUser() {
805
+ return !$this->hasUser();
806
+ }
807
+
808
+ public function currentUserCan() {
809
+ return $this->getWAF()->checkCapability($this->getExpected());
810
+ }
811
+
812
+ public function currentUserCannot() {
813
+ return !$this->currentUserCan();
814
+ }
815
+
816
  public function md5Equals($subject) {
817
  return md5((string) $subject) === $this->getExpected();
818
  }
1249
  return version_compare($subject, $this->getExpected(), '<=');
1250
  }
1251
 
1252
+ public function keyExists($subject) {
1253
+ if (!is_array($subject)) {
1254
+ return false;
1255
+ }
1256
+ return array_key_exists($this->getExpected(), $subject);
1257
+ }
1258
+
1259
+ public function keyMatches($subject) {
1260
+ if (!is_array($subject)) {
1261
+ return false;
1262
+ }
1263
+ foreach($subject as $key=>$value) {
1264
+ if (preg_match($this->getExpected(), $key))
1265
+ return true;
1266
+ }
1267
+ return false;
1268
+ }
1269
+
1270
+ public function exists($subject) {
1271
+ return isset($subject);
1272
+ }
1273
+
1274
  /**
1275
  * @return mixed
1276
  */
1326
  * @return mixed
1327
  */
1328
  public function getFailedSubjects() {
1329
+ return (array)$this->failedSubjects;
1330
  }
1331
 
1332
  /**
1454
  }
1455
  }
1456
  if ($comparison instanceof wfWAFRuleComparison && $comparison->getResult()) {
1457
+ if ($comparison->hasSubject()) {
1458
+ foreach ($comparison->getFailedSubjects() as $failedSubject) {
1459
+ $this->failedComparisons[] = new wfWAFRuleComparisonFailure(
1460
+ $failedSubject['subject'], $failedSubject['value'], $comparison->getExpected(),
1461
+ $comparison->getAction(), $failedSubject['multiplier'], $failedSubject['matches']
1462
+ );
1463
+ }
1464
+ }
1465
+ else {
1466
  $this->failedComparisons[] = new wfWAFRuleComparisonFailure(
1467
+ '', '', $comparison->getExpected(),
1468
+ $comparison->getAction(), 1, array()
1469
  );
1470
  }
1471
  }
1776
  );
1777
  }
1778
 
1779
+ private function getRootValue($subject) {
1780
+ if ($subject instanceof wfWAFRuleComparisonSubject) {
1781
+ return $subject->getValue();
1782
+ }
1783
+ else {
1784
+ return $this->getWAF()->getGlobal($subject);
1785
+ }
1786
+ }
1787
+
1788
  /**
1789
  * @return mixed|null
1790
  */
1791
  public function getValue() {
1792
  $subject = $this->getSubject();
1793
  if (!is_array($subject)) {
1794
+ return $this->runFilters($this->getRootValue($subject), $subject);
1795
  }
1796
+ else if (count($subject) > 0) {
1797
  $globalKey = array_shift($subject);
1798
+ return $this->runFilters($this->_getValue($subject, $this->getRootValue($globalKey)));
1799
  }
1800
  return null;
1801
  }
1836
  private function runFilters($value) {
1837
  $filters = $this->getFilters();
1838
  if (is_array($filters)) {
1839
+ foreach ($filters as $filterArgs) {
1840
+ if (method_exists($this, 'filter' . $filterArgs[0])) {
1841
+ $value = call_user_func_array(array($this, 'filter' . $filterArgs[0]), array_merge(array($value), array_slice($filterArgs, 1)));
1842
  }
1843
  }
1844
  }
1856
  return $value;
1857
  }
1858
 
1859
+ public function filterReplace($value, $find, $replace) {
1860
+ return str_replace($find, $replace, $value);
1861
+ }
1862
+
1863
+ public function filterPregReplace($value, $pattern, $replacement, $limit=-1) {
1864
+ return preg_replace($pattern, $replacement, $value, $limit);
1865
+ }
1866
+
1867
+ private function getMatchingKeys($array, $patterns) {
1868
+ if (!is_array($array))
1869
+ return array();
1870
+ $filtered = array();
1871
+ $pattern = array_shift($patterns);
1872
+ foreach ($array as $key=>$value) {
1873
+ if (preg_match($pattern, $key)) {
1874
+ if (empty($patterns)) {
1875
+ $filtered[] = $value;
1876
+ }
1877
+ else {
1878
+ $filtered = array_merge($filtered, $this->getMatchingKeys($value, $patterns));
1879
+ }
1880
+ }
1881
+ }
1882
+ return $filtered;
1883
+ }
1884
+
1885
+ public function filterFilterKeys($values) {
1886
+ $patterns = array_slice(func_get_args(), 1);
1887
+ return $this->getMatchingKeys($values, $patterns);
1888
+ }
1889
+
1890
+ public function filterJson($value) {
1891
+ return wfWAFUtils::json_decode(@(string)$value, true);
1892
+ }
1893
+
1894
+ private function renderSubject() {
1895
+ $subjects = $this->getSubject();
1896
+ if (is_array($subjects)) {
1897
+ $rendered = array();
1898
+ foreach ($subjects as $subject) {
1899
+ if ($subject instanceof wfWAFRuleComparisonSubject) {
1900
+ array_push($rendered, $subject->render());
1901
+ }
1902
+ else {
1903
+ array_push($rendered, var_export($subject, true));
1904
+ }
1905
+ }
1906
+ return sprintf('array(%s)', implode(', ', $rendered));
1907
+ }
1908
+ else {
1909
+ return var_export($subjects, true);
1910
+ }
1911
+ }
1912
+
1913
  /**
1914
  * @return string
1915
  */
1916
  public function render() {
1917
+ return sprintf('%s::create($this, %s, %s)', get_class($this), $this->renderSubject(),
1918
  var_export($this->getFilters(), true));
1919
  }
1920
 
1944
  }
1945
 
1946
  foreach ($this->getFilters() as $filter) {
1947
+ $rule = $filter[0] . '(' . implode(',', array_merge(array($rule), array_slice($filter, 1))) . ')';
1948
  }
1949
  return $rule;
1950
  }
1991
  $this->waf = $waf;
1992
  }
1993
  }
1994
+ }
vendor/wordfence/wf-waf/src/lib/storage.php CHANGED
@@ -75,5 +75,7 @@ interface wfWAFStorageInterface {
75
  public function setRules($rules);
76
 
77
  public function needsInitialRules();
 
 
78
  }
79
  }
75
  public function setRules($rules);
76
 
77
  public function needsInitialRules();
78
+
79
+ public function getDescription();
80
  }
81
  }
vendor/wordfence/wf-waf/src/lib/storage/file.php CHANGED
@@ -922,6 +922,10 @@ class wfWAFStorageFile implements wfWAFStorageInterface {
922
  public function setRulesFile($rulesFile) {
923
  $this->rulesFile = $rulesFile;
924
  }
 
 
 
 
925
  }
926
 
927
  class wfWAFAttackDataStorageFileEngine {
922
  public function setRulesFile($rulesFile) {
923
  $this->rulesFile = $rulesFile;
924
  }
925
+
926
+ public function getDescription() {
927
+ return __('file system', 'wordfence');
928
+ }
929
  }
930
 
931
  class wfWAFAttackDataStorageFileEngine {
vendor/wordfence/wf-waf/src/lib/storage/mysql.php CHANGED
@@ -617,6 +617,11 @@ class wfWAFStorageMySQL implements wfWAFStorageInterface {
617
  }
618
  return $table;
619
  }
 
 
 
 
 
620
  }
621
 
622
  interface wfWAFStorageEngineDatabase {
617
  }
618
  return $table;
619
  }
620
+
621
+ public function getDescription() {
622
+ return __('mysqli', 'wordfence');
623
+ }
624
+
625
  }
626
 
627
  interface wfWAFStorageEngineDatabase {
vendor/wordfence/wf-waf/src/lib/waf.php CHANGED
@@ -31,6 +31,7 @@ class wfWAF {
31
  * @var wfWAFStorageInterface
32
  */
33
  private static $sharedStorageEngine;
 
34
 
35
  /**
36
  * @return wfWAFStorageInterface
@@ -42,8 +43,13 @@ class wfWAF {
42
  /**
43
  * @param wfWAFStorageInterface $instance
44
  */
45
- public static function setSharedStorageEngine($sharedStorageEngine) {
46
  self::$sharedStorageEngine = $sharedStorageEngine;
 
 
 
 
 
47
  }
48
 
49
  protected $rulesFile;
@@ -1301,8 +1307,8 @@ HTML
1301
  return false;
1302
  }
1303
 
1304
- if (is_array($this->whitelistedParams) && array_key_exists($paramKey, $this->whitelistedParams)
1305
- && is_array($this->whitelistedParams[$paramKey])
1306
  ) {
1307
  foreach ($this->whitelistedParams[$paramKey] as $urlRegex) {
1308
  if (is_array($urlRegex)) {
@@ -1477,6 +1483,17 @@ HTML
1477
  return false;
1478
  }
1479
 
 
 
 
 
 
 
 
 
 
 
 
1480
  /**
1481
  * @param string|null $cookieVal
1482
  * @return bool
@@ -1487,14 +1504,23 @@ HTML
1487
  $cookieVal = !empty($_COOKIE[$cookieName]) && is_string($_COOKIE[$cookieName]) ? $_COOKIE[$cookieName] : '';
1488
  }
1489
  $pieces = explode('|', $cookieVal);
1490
- if (count($pieces) !== 3) {
 
 
 
 
 
 
 
 
 
1491
  return false;
1492
  }
1493
- list($userID, $role, $signature) = $pieces;
1494
- if (wfWAFUtils::hash_equals($signature, $this->getAuthCookieValue($userID, $role))) {
1495
  return array(
1496
  'userID' => $userID,
1497
  'role' => $role,
 
1498
  );
1499
  }
1500
  return false;
@@ -1503,11 +1529,14 @@ HTML
1503
  /**
1504
  * @param int|string $userID
1505
  * @param string $role
 
1506
  * @return bool|string
1507
  */
1508
- public function getAuthCookieValue($userID, $role) {
 
 
1509
  $algo = function_exists('hash') ? 'sha256' : 'sha1';
1510
- return wfWAFUtils::hash_hmac($algo, $userID . $role . floor(time() / 43200), $this->getStorageEngine()->getConfig('authKey'));
1511
  }
1512
 
1513
  /**
@@ -1788,6 +1817,12 @@ class wfWAFCronFetchRulesEvent extends wfWAFCronEvent {
1788
  * @var wfWAFHTTPResponse
1789
  */
1790
  private $response;
 
 
 
 
 
 
1791
 
1792
  public function fire() {
1793
  $waf = $this->getWaf();
@@ -1807,110 +1842,132 @@ class wfWAFCronFetchRulesEvent extends wfWAFCronEvent {
1807
  'betaFeed' => (int) $waf->getStorageEngine()->getConfig('betaThreatDefenseFeed', null, 'synced'),
1808
  'lang' => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced'),
1809
  );
 
 
 
1810
  if ($waf->getStorageEngine()->getConfig('other_WFNet', true, 'synced')) {
1811
  $payload['disabled'] = implode('|', $waf->getDisabledRuleIDs());
1812
  }
1813
 
1814
  $this->response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query($payload, null, '&'), null, 10, 5);
1815
  if ($this->response) {
1816
- $jsonData = wfWAFUtils::json_decode($this->response->getBody(), true);
1817
- if (is_array($jsonData)) {
1818
-
1819
- if ($waf->hasOpenSSL() &&
1820
- isset($jsonData['data']['signature']) &&
1821
- isset($jsonData['data']['rules']) &&
1822
- $waf->verifySignedRequest(base64_decode($jsonData['data']['signature']), $jsonData['data']['rules'])
1823
- ) {
1824
- $waf->updateRuleSet(base64_decode($jsonData['data']['rules']),
1825
- isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
1826
- if (array_key_exists('premiumCount', $jsonData['data'])) {
1827
- $waf->getStorageEngine()->setConfig('premiumCount', $jsonData['data']['premiumCount'], 'transient');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1828
  }
1829
-
1830
- } else if (!$waf->hasOpenSSL() &&
1831
- isset($jsonData['data']['hash']) &&
1832
- isset($jsonData['data']['rules']) &&
1833
- $waf->verifyHashedRequest($jsonData['data']['hash'], $jsonData['data']['rules'])
1834
- ) {
1835
- $waf->updateRuleSet(base64_decode($jsonData['data']['rules']),
1836
- isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
1837
- if (array_key_exists('premiumCount', $jsonData['data'])) {
1838
- $waf->getStorageEngine()->setConfig('premiumCount', $jsonData['data']['premiumCount'], 'transient');
1839
  }
1840
  }
1841
  else {
1842
  $success = false;
1843
  }
1844
  }
1845
- else {
1846
- $success = false;
1847
- }
1848
  }
1849
  else {
1850
  $success = false;
1851
  }
1852
-
1853
- $this->response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query(array(
1854
- 'action' => 'get_malware_signatures',
1855
- 'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'),
1856
- 's' => $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL,
1857
- 'h' => $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL,
1858
- 'openssl' => $waf->hasOpenSSL() ? 1 : 0,
1859
- 'betaFeed' => (int) $waf->getStorageEngine()->getConfig('betaThreatDefenseFeed', null, 'synced'),
1860
- 'lang' => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced'),
1861
- ), null, '&'), null, 15, 5);
1862
- if ($this->response) {
1863
- $jsonData = wfWAFUtils::json_decode($this->response->getBody(), true);
1864
- if (is_array($jsonData)) {
1865
- if ($waf->hasOpenSSL() &&
1866
- isset($jsonData['data']['signature']) &&
1867
- isset($jsonData['data']['signatures']) &&
1868
- $waf->verifySignedRequest(base64_decode($jsonData['data']['signature']), $jsonData['data']['signatures'])
1869
- ) {
1870
- $waf->setMalwareSignatures(wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatures'])),
1871
- isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
1872
- if (array_key_exists('premiumCount', $jsonData['data'])) {
1873
- $waf->getStorageEngine()->setConfig('signaturePremiumCount', $jsonData['data']['premiumCount'], 'transient');
1874
- }
1875
-
1876
- if (array_key_exists('commonStringsSignature', $jsonData['data']) &&
1877
- array_key_exists('commonStrings', $jsonData['data']) &&
1878
- array_key_exists('signatureIndexes', $jsonData['data']) &&
1879
- $waf->verifySignedRequest(base64_decode($jsonData['data']['commonStringsSignature']), $jsonData['data']['commonStrings'] . $jsonData['data']['signatureIndexes'])
1880
- ) {
1881
- $waf->setMalwareSignatureCommonStrings(wfWAFUtils::json_decode(base64_decode($jsonData['data']['commonStrings'])), wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatureIndexes'])));
1882
- }
1883
-
1884
- } else if (!$waf->hasOpenSSL() &&
1885
- isset($jsonData['data']['hash']) &&
1886
- isset($jsonData['data']['signatures']) &&
1887
- $waf->verifyHashedRequest($jsonData['data']['hash'], $jsonData['data']['signatures'])
1888
- ) {
1889
- $waf->setMalwareSignatures(wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatures'])),
1890
- isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
1891
- if (array_key_exists('premiumCount', $jsonData['data'])) {
1892
- $waf->getStorageEngine()->setConfig('signaturePremiumCount', $jsonData['data']['premiumCount'], 'transient');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1893
  }
1894
-
1895
- if (array_key_exists('commonStringsHash', $jsonData['data']) &&
1896
- array_key_exists('commonStrings', $jsonData['data']) &&
1897
- array_key_exists('signatureIndexes', $jsonData['data']) &&
1898
- $waf->verifyHashedRequest($jsonData['data']['commonStringsHash'], $jsonData['data']['commonStrings'] . $jsonData['data']['signatureIndexes'])
1899
- ) {
1900
- $waf->setMalwareSignatureCommonStrings(wfWAFUtils::json_decode(base64_decode($jsonData['data']['commonStrings'])), wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatureIndexes'])));
1901
  }
1902
  }
1903
- else {
1904
- $success = false;
1905
- }
1906
  }
1907
  else {
1908
  $success = false;
1909
  }
1910
  }
1911
- else {
1912
- $success = false;
1913
- }
1914
  } catch (wfWAFHTTPTransportException $e) {
1915
  error_log($e->getMessage());
1916
  $success = false;
@@ -2285,4 +2342,4 @@ class wfWAFBuildRulesException extends wfWAFException {
2285
 
2286
  class wfWAFEventBusException extends wfWAFException {
2287
  }
2288
- }
31
  * @var wfWAFStorageInterface
32
  */
33
  private static $sharedStorageEngine;
34
+ private static $fallbackStorageEngine;
35
 
36
  /**
37
  * @return wfWAFStorageInterface
43
  /**
44
  * @param wfWAFStorageInterface $instance
45
  */
46
+ public static function setSharedStorageEngine($sharedStorageEngine, $fallback = false) {
47
  self::$sharedStorageEngine = $sharedStorageEngine;
48
+ self::$fallbackStorageEngine = $fallback;
49
+ }
50
+
51
+ public static function hasFallbackStorageEngine() {
52
+ return self::$fallbackStorageEngine;
53
  }
54
 
55
  protected $rulesFile;
1307
  return false;
1308
  }
1309
 
1310
+ if ($paramKey==='none' || (is_array($this->whitelistedParams) && array_key_exists($paramKey, $this->whitelistedParams)
1311
+ && is_array($this->whitelistedParams[$paramKey]))
1312
  ) {
1313
  foreach ($this->whitelistedParams[$paramKey] as $urlRegex) {
1314
  if (is_array($urlRegex)) {
1483
  return false;
1484
  }
1485
 
1486
+ /**
1487
+ * @param string $capability
1488
+ * @return bool
1489
+ */
1490
+ public function checkCapability($capability) {
1491
+ if ($authCookie = $this->parseAuthCookie()) {
1492
+ return $authCookie['capabilities']!==null && in_array($capability, $authCookie['capabilities']);
1493
+ }
1494
+ return false;
1495
+ }
1496
+
1497
  /**
1498
  * @param string|null $cookieVal
1499
  * @return bool
1504
  $cookieVal = !empty($_COOKIE[$cookieName]) && is_string($_COOKIE[$cookieName]) ? $_COOKIE[$cookieName] : '';
1505
  }
1506
  $pieces = explode('|', $cookieVal);
1507
+ $pieceCount = count($pieces);
1508
+ if ($pieceCount === 4) {
1509
+ list($userID, $role, $capabilityList, $signature) = $pieces;
1510
+ $capabilities = empty($capabilityList) ? array() : explode(',', $capabilityList);
1511
+ }
1512
+ else if ($pieceCount === 3) {
1513
+ list($userID, $role, $signature) = $pieces;
1514
+ $capabilities = null;
1515
+ }
1516
+ else {
1517
  return false;
1518
  }
1519
+ if (wfWAFUtils::hash_equals($signature, $this->getAuthCookieValue($userID, $role, $capabilities))) {
 
1520
  return array(
1521
  'userID' => $userID,
1522
  'role' => $role,
1523
+ 'capabilities' => $capabilities
1524
  );
1525
  }
1526
  return false;
1529
  /**
1530
  * @param int|string $userID
1531
  * @param string $role
1532
+ * @param array $capabilities
1533
  * @return bool|string
1534
  */
1535
+ public function getAuthCookieValue($userID, $role, $capabilities = array()) {
1536
+ if (!is_array($capabilities))
1537
+ $capabilities = array();
1538
  $algo = function_exists('hash') ? 'sha256' : 'sha1';
1539
+ return wfWAFUtils::hash_hmac($algo, $userID . $role . '|'. implode(',', $capabilities) . floor(time() / 43200), $this->getStorageEngine()->getConfig('authKey'));
1540
  }
1541
 
1542
  /**
1817
  * @var wfWAFHTTPResponse
1818
  */
1819
  private $response;
1820
+ private $forceUpdate;
1821
+
1822
+ public function __construct($fireTime, $forceUpdate = false) {
1823
+ parent::__construct($fireTime);
1824
+ $this->forceUpdate = $forceUpdate;
1825
+ }
1826
 
1827
  public function fire() {
1828
  $waf = $this->getWaf();
1842
  'betaFeed' => (int) $waf->getStorageEngine()->getConfig('betaThreatDefenseFeed', null, 'synced'),
1843
  'lang' => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced'),
1844
  );
1845
+ $lastRuleHash=$this->forceUpdate ? null : $waf->getStorageEngine()->getConfig('lastRuleHash', null, 'transient');
1846
+ if($lastRuleHash!==null)
1847
+ $payload['hash']=$lastRuleHash;
1848
  if ($waf->getStorageEngine()->getConfig('other_WFNet', true, 'synced')) {
1849
  $payload['disabled'] = implode('|', $waf->getDisabledRuleIDs());
1850
  }
1851
 
1852
  $this->response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query($payload, null, '&'), null, 10, 5);
1853
  if ($this->response) {
1854
+ if($this->response->getStatusCode() !== 304){
1855
+ $jsonData = wfWAFUtils::json_decode($this->response->getBody(), true);
1856
+ if (is_array($jsonData)) {
1857
+
1858
+ if ($waf->hasOpenSSL() &&
1859
+ isset($jsonData['data']['signature']) &&
1860
+ isset($jsonData['data']['rules']) &&
1861
+ $waf->verifySignedRequest(base64_decode($jsonData['data']['signature']), $jsonData['data']['rules'])
1862
+ ) {
1863
+ $waf->updateRuleSet(base64_decode($jsonData['data']['rules']),
1864
+ isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
1865
+ $waf->getStorageEngine()->setConfig('lastRuleHash', $jsonData['data']['signature'], 'transient');
1866
+ if (array_key_exists('premiumCount', $jsonData['data'])) {
1867
+ $waf->getStorageEngine()->setConfig('premiumCount', $jsonData['data']['premiumCount'], 'transient');
1868
+ }
1869
+
1870
+ } else if (!$waf->hasOpenSSL() &&
1871
+ isset($jsonData['data']['hash']) &&
1872
+ isset($jsonData['data']['rules']) &&
1873
+ $waf->verifyHashedRequest($jsonData['data']['hash'], $jsonData['data']['rules'])
1874
+ ) {
1875
+ $waf->updateRuleSet(base64_decode($jsonData['data']['rules']),
1876
+ isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
1877
+ $waf->getStorageEngine()->setConfig('lastRuleHash', $jsonData['data']['hash'], 'transient');
1878
+ if (array_key_exists('premiumCount', $jsonData['data'])) {
1879
+ $waf->getStorageEngine()->setConfig('premiumCount', $jsonData['data']['premiumCount'], 'transient');
1880
+ }
1881
  }
1882
+ else {
1883
+ $success = false;
 
 
 
 
 
 
 
 
1884
  }
1885
  }
1886
  else {
1887
  $success = false;
1888
  }
1889
  }
 
 
 
1890
  }
1891
  else {
1892
  $success = false;
1893
  }
1894
+
1895
+ $lastMalwareSignatureUpdate=$waf->getStorageEngine()->getConfig('signaturesLastUpdated', 0, 'transient');
1896
+ $isPaid=$waf->getStorageEngine()->getConfig('isPaid', false, 'synced');
1897
+ //Only update malware signatures for free sites if they are older than 3 days plus an hour
1898
+ if ($isPaid || $this->forceUpdate || $lastMalwareSignatureUpdate < (time() - (259200 + 3600))) {
1899
+ $this->response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query(array(
1900
+ 'action' => 'get_malware_signatures',
1901
+ 'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'),
1902
+ 's' => $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL,
1903
+ 'h' => $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL,
1904
+ 'openssl' => $waf->hasOpenSSL() ? 1 : 0,
1905
+ 'betaFeed' => (int) $waf->getStorageEngine()->getConfig('betaThreatDefenseFeed', null, 'synced'),
1906
+ 'hash' => $this->forceUpdate ? null : $waf->getStorageEngine()->getConfig('lastMalwareHash', null, 'transient'),
1907
+ 'cs-hash' => $this->forceUpdate ? null : $waf->getStorageEngine()->getConfig('lastMalwareHashCommonStrings', null, 'transient'),
1908
+ 'lang' => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced')
1909
+ ), null, '&'), null, 15, 5);
1910
+ if ($this->response) {
1911
+ if($this->response->getStatusCode() !== 304){
1912
+ $jsonData = wfWAFUtils::json_decode($this->response->getBody(), true);
1913
+ if (is_array($jsonData)) {
1914
+ if ($waf->hasOpenSSL() &&
1915
+ isset($jsonData['data']['signature']) &&
1916
+ isset($jsonData['data']['signatures']) &&
1917
+ $waf->verifySignedRequest(base64_decode($jsonData['data']['signature']), $jsonData['data']['signatures'])
1918
+ ) {
1919
+ $waf->setMalwareSignatures(wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatures'])),
1920
+ isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
1921
+ $waf->getStorageEngine()->setConfig('lastMalwareHash', $jsonData['data']['signature'], 'transient');
1922
+ if (array_key_exists('premiumCount', $jsonData['data'])) {
1923
+ $waf->getStorageEngine()->setConfig('signaturePremiumCount', $jsonData['data']['premiumCount'], 'transient');
1924
+ }
1925
+
1926
+ if (array_key_exists('commonStringsSignature', $jsonData['data']) &&
1927
+ array_key_exists('commonStrings', $jsonData['data']) &&
1928
+ array_key_exists('signatureIndexes', $jsonData['data']) &&
1929
+ $waf->verifySignedRequest(base64_decode($jsonData['data']['commonStringsSignature']), $jsonData['data']['commonStrings'] . $jsonData['data']['signatureIndexes'])
1930
+ ) {
1931
+ $waf->setMalwareSignatureCommonStrings(wfWAFUtils::json_decode(base64_decode($jsonData['data']['commonStrings'])), wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatureIndexes'])));
1932
+
1933
+ $waf->getStorageEngine()->setConfig('lastMalwareHashCommonStrings', $jsonData['data']['commonStringsSignature'], 'transient');
1934
+ }
1935
+
1936
+ } else if (!$waf->hasOpenSSL() &&
1937
+ isset($jsonData['data']['hash']) &&
1938
+ isset($jsonData['data']['signatures']) &&
1939
+ $waf->verifyHashedRequest($jsonData['data']['hash'], $jsonData['data']['signatures'])
1940
+ ) {
1941
+ $waf->setMalwareSignatures(wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatures'])),
1942
+
1943
+ isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true);
1944
+ $waf->getStorageEngine()->setConfig('lastMalwareHash', $jsonData['data']['hash'], 'transient');
1945
+ if (array_key_exists('premiumCount', $jsonData['data'])) {
1946
+ $waf->getStorageEngine()->setConfig('signaturePremiumCount', $jsonData['data']['premiumCount'], 'transient');
1947
+ }
1948
+
1949
+ if (array_key_exists('commonStringsHash', $jsonData['data']) &&
1950
+ array_key_exists('commonStrings', $jsonData['data']) &&
1951
+ array_key_exists('signatureIndexes', $jsonData['data']) &&
1952
+ $waf->verifyHashedRequest($jsonData['data']['commonStringsHash'], $jsonData['data']['commonStrings'] . $jsonData['data']['signatureIndexes'])
1953
+ ) {
1954
+ $waf->setMalwareSignatureCommonStrings(wfWAFUtils::json_decode(base64_decode($jsonData['data']['commonStrings'])), wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatureIndexes'])));
1955
+ $waf->getStorageEngine()->setConfig('lastMalwareHashCommonStrings', $jsonData['data']['commonStringsHash'], 'transient');
1956
+ }
1957
+ }
1958
+ else {
1959
+ $success = false;
1960
+ }
1961
  }
1962
+ else {
1963
+ $success = false;
 
 
 
 
 
1964
  }
1965
  }
 
 
 
1966
  }
1967
  else {
1968
  $success = false;
1969
  }
1970
  }
 
 
 
1971
  } catch (wfWAFHTTPTransportException $e) {
1972
  error_log($e->getMessage());
1973
  $success = false;
2342
 
2343
  class wfWAFEventBusException extends wfWAFException {
2344
  }
2345
+ }
views/reports/activity-report-email-inline.php CHANGED
@@ -131,7 +131,7 @@ h6 a:visited { color: purple !important; }
131
  network_site_url(),
132
  $report_start,
133
  $report_end
134
- ), array('a'=>array('href'=>array()))); ?> <?php if (!wfConfig::get('isPaid')): ?><?php echo wp_kses(__('NOTE: You are using the free version of Wordfence and are missing out on features like cellphone sign-in, country blocking and detecting if your site IP is sending spam. <a href="http://www.wordfence.com/zz6/">Click here to upgrade to Wordfence Premium now</a>.', 'wordfence'), array('a'=>array('href'=>array()))); ?><?php endif ?>
135
  </p>
136
 
137
  <h2 style="font-size: 20px; vertical-align: baseline; clear: both; color: #222 !important; margin: 20px 0 4px; padding: 0; border: 0;">
131
  network_site_url(),
132
  $report_start,
133
  $report_end
134
+ ), array('a'=>array('href'=>array()))); ?> <?php if (!wfConfig::get('isPaid')): ?><?php echo wp_kses(__('NOTE: You are using the free version of Wordfence and are missing out on features like real-time firewall rule and malware signature updates, country blocking, and detecting if your site IP is sending spam. <a href="http://www.wordfence.com/zz6/">Click here to upgrade to Wordfence Premium now</a>.', 'wordfence'), array('a'=>array('href'=>array()))); ?><?php endif ?>
135
  </p>
136
 
137
  <h2 style="font-size: 20px; vertical-align: baseline; clear: both; color: #222 !important; margin: 20px 0 4px; padding: 0; border: 0;">
views/waf/waf-uninstall.php CHANGED
@@ -27,7 +27,7 @@ if (!defined('WORDFENCE_VERSION')) { exit; }
27
  <pre class='wf-pre'><?php echo esc_html($currentAutoPrependFile); ?></pre>
28
  <?php
29
  $contents = file_get_contents($currentAutoPrependFile);
30
- $refersToWAF = preg_match('/define\s*\(\s*(["\'])WFWAF_LOG_PATH\1\s*,\s*(["\']).+?\2\s*\)\s*/', $contents);
31
 
32
  if (!$refersToWAF):
33
  ?>
27
  <pre class='wf-pre'><?php echo esc_html($currentAutoPrependFile); ?></pre>
28
  <?php
29
  $contents = file_get_contents($currentAutoPrependFile);
30
+ $refersToWAF = preg_match('/define\s*\(\s*(["\'])WFWAF_LOG_PATH\1\s*,\s*(__DIR__\s*\.\s*)?(["\']).+?\3\s*\)\s*/', $contents);
31
 
32
  if (!$refersToWAF):
33
  ?>
waf/bootstrap.php CHANGED
@@ -293,7 +293,7 @@ class wfWAFWordPressObserver extends wfWAFBaseObserver {
293
 
294
  if ($response instanceof wfWAFHTTPResponse && $response->getBody()) {
295
  $jsonData = wfWAFUtils::json_decode($response->getBody(), true);
296
- if (array_key_exists('data', $jsonData)) {
297
  if (preg_match('/^block:(\d+)$/i', $jsonData['data'], $matches)) {
298
  wfWAF::getInstance()->getStorageEngine()->blockIP((int)$matches[1] + time(), wfWAF::getInstance()->getRequest()->getIP(), wfWAFStorageInterface::IP_BLOCKS_BLACKLIST);
299
  $e = new wfWAFBlockException();
@@ -825,7 +825,9 @@ try {
825
  define('WFWAF_STORAGE_ENGINE', 'mysqli');
826
  }
827
 
828
- if (defined('WFWAF_STORAGE_ENGINE')) {
 
 
829
  switch (WFWAF_STORAGE_ENGINE) {
830
  case 'mysqli':
831
  // Find the wp-config.php
@@ -879,9 +881,11 @@ try {
879
  WFWAF_LOG_PATH . 'rules.php',
880
  WFWAF_LOG_PATH . 'wafRules.rules'
881
  );
 
 
882
  }
883
 
884
- wfWAF::setSharedStorageEngine($wfWAFStorageEngine);
885
  wfWAF::setInstance(new wfWAFWordPress(wfWAFWordPressRequest::createFromGlobals(), wfWAF::getSharedStorageEngine()));
886
  wfWAF::getInstance()->getEventBus()->attach(new wfWAFWordPressObserver);
887
 
293
 
294
  if ($response instanceof wfWAFHTTPResponse && $response->getBody()) {
295
  $jsonData = wfWAFUtils::json_decode($response->getBody(), true);
296
+ if (is_array($jsonData) && array_key_exists('data', $jsonData)) {
297
  if (preg_match('/^block:(\d+)$/i', $jsonData['data'], $matches)) {
298
  wfWAF::getInstance()->getStorageEngine()->blockIP((int)$matches[1] + time(), wfWAF::getInstance()->getRequest()->getIP(), wfWAFStorageInterface::IP_BLOCKS_BLACKLIST);
299
  $e = new wfWAFBlockException();
825
  define('WFWAF_STORAGE_ENGINE', 'mysqli');
826
  }
827
 
828
+ $specifiedStorageEngine = defined('WFWAF_STORAGE_ENGINE');
829
+ $fallbackStorageEngine = false;
830
+ if ($specifiedStorageEngine) {
831
  switch (WFWAF_STORAGE_ENGINE) {
832
  case 'mysqli':
833
  // Find the wp-config.php
881
  WFWAF_LOG_PATH . 'rules.php',
882
  WFWAF_LOG_PATH . 'wafRules.rules'
883
  );
884
+ if ($specifiedStorageEngine)
885
+ $fallbackStorageEngine = true;
886
  }
887
 
888
+ wfWAF::setSharedStorageEngine($wfWAFStorageEngine, $fallbackStorageEngine);
889
  wfWAF::setInstance(new wfWAFWordPress(wfWAFWordPressRequest::createFromGlobals(), wfWAF::getSharedStorageEngine()));
890
  wfWAF::getInstance()->getEventBus()->attach(new wfWAFWordPressObserver);
891
 
wordfence.php CHANGED
@@ -4,7 +4,7 @@ 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: 7.5.2
8
  Author URI: http://www.wordfence.com/
9
  Text Domain: wordfence
10
  Domain Path: /languages
@@ -17,8 +17,8 @@ if(defined('WP_INSTALLING') && WP_INSTALLING){
17
  if (!defined('ABSPATH')) {
18
  exit;
19
  }
20
- define('WORDFENCE_VERSION', '7.5.2');
21
- define('WORDFENCE_BUILD_NUMBER', '1616621048');
22
  define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
23
  basename(dirname(__FILE__)) . '/' . basename(__FILE__));
24
 
@@ -93,4 +93,4 @@ if(! defined('WORDFENCE_VERSIONONLY_MODE')){ //Used to get version from file.
93
  require_once(dirname(__FILE__) . '/lib/wordfenceConstants.php');
94
  require_once(dirname(__FILE__) . '/lib/wordfenceClass.php');
95
  wordfence::install_actions();
96
- }
4
  Plugin URI: http://www.wordfence.com/
5
  Description: Wordfence Security - Anti-virus, Firewall and Malware Scan
6
  Author: Wordfence
7
+ Version: 7.5.3
8
  Author URI: http://www.wordfence.com/
9
  Text Domain: wordfence
10
  Domain Path: /languages
17
  if (!defined('ABSPATH')) {
18
  exit;
19
  }
20
+ define('WORDFENCE_VERSION', '7.5.3');
21
+ define('WORDFENCE_BUILD_NUMBER', '1620658454');
22
  define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
23
  basename(dirname(__FILE__)) . '/' . basename(__FILE__));
24
 
93
  require_once(dirname(__FILE__) . '/lib/wordfenceConstants.php');
94
  require_once(dirname(__FILE__) . '/lib/wordfenceClass.php');
95
  wordfence::install_actions();
96
+ }