Wordfence Security – Firewall & Malware Scan - Version 7.5.10

Version Description

  • May 17, 2022 =
  • Improvement: Improved scan support for sites with non-standard directory structures
  • Improvement: Increased accuracy of executable PHP upload detection
  • Improvement: Addressed various deprecation notices with PHP 8.1
  • Improvement: Improved handling of invalidated license keys
  • Fix: Corrected lost password redirect URL when used with WooCommerce
  • Fix: Prevented errors when live traffic data exceeds database column length
  • Fix: Prevented bulk password resets from locking out admins
  • Fix: Corrected issue that prevented saving country blocking settings in certain cases
  • Change: Updated copyright information
Download this release

Release Info

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

Code changes from version 7.5.9 to 7.5.10

Files changed (93) hide show
  1. css/{activity-report-widget.1647958122.css → activity-report-widget.1652811581.css} +0 -0
  2. css/{diff.1647958122.css → diff.1652811581.css} +0 -0
  3. css/{dt_table.1647958122.css → dt_table.1652811581.css} +0 -0
  4. css/{fullLog.1647958122.css → fullLog.1652811581.css} +0 -0
  5. css/{iptraf.1647958122.css → iptraf.1652811581.css} +0 -0
  6. css/{jquery-ui-timepicker-addon.1647958122.css → jquery-ui-timepicker-addon.1652811581.css} +0 -0
  7. css/{jquery-ui.min.1647958122.css → jquery-ui.min.1652811581.css} +0 -0
  8. css/{jquery-ui.structure.min.1647958122.css → jquery-ui.structure.min.1652811581.css} +0 -0
  9. css/{jquery-ui.theme.min.1647958122.css → jquery-ui.theme.min.1652811581.css} +0 -0
  10. css/license/{care-global.1647958122.css → care-global.1652811581.css} +0 -0
  11. css/license/{care.1647958122.css → care.1652811581.css} +0 -0
  12. css/license/{free-global.1647958122.css → free-global.1652811581.css} +0 -0
  13. css/license/{free.1647958122.css → free.1652811581.css} +0 -0
  14. css/license/{premium-global.1647958122.css → premium-global.1652811581.css} +0 -0
  15. css/license/{premium.1647958122.css → premium.1652811581.css} +0 -0
  16. css/license/{response-global.1647958122.css → response-global.1652811581.css} +0 -0
  17. css/license/{response-variables.1647958122.css → response-variables.1652811581.css} +0 -0
  18. css/license/{response.1647958122.css → response.1652811581.css} +0 -0
  19. css/{main.1647958122.css → main.1652811581.css} +0 -0
  20. css/{phpinfo.1647958122.css → phpinfo.1652811581.css} +0 -0
  21. css/{wf-adminbar.1647958122.css → wf-adminbar.1652811581.css} +0 -0
  22. css/{wf-colorbox.1647958122.css → wf-colorbox.1652811581.css} +0 -0
  23. css/{wf-font-awesome.1647958122.css → wf-font-awesome.1652811581.css} +0 -0
  24. css/{wf-global.1647958122.css → wf-global.1652811581.css} +0 -0
  25. css/{wf-ionicons.1647958122.css → wf-ionicons.1652811581.css} +0 -0
  26. css/{wf-onboarding.1647958122.css → wf-onboarding.1652811581.css} +0 -0
  27. css/{wf-roboto-font.1647958122.css → wf-roboto-font.1652811581.css} +0 -0
  28. css/{wfselect2.min.1647958122.css → wfselect2.min.1652811581.css} +0 -0
  29. css/{wordfenceBox.1647958122.css → wordfenceBox.1652811581.css} +0 -0
  30. js/{Chart.bundle.min.1647958122.js → Chart.bundle.min.1652811581.js} +0 -0
  31. js/{admin.1647958122.js → admin.1652811581.js} +17 -8
  32. js/{admin.ajaxWatcher.1647958122.js → admin.ajaxWatcher.1652811581.js} +0 -0
  33. js/{admin.liveTraffic.1647958122.js → admin.liveTraffic.1652811581.js} +0 -0
  34. js/{date.1647958122.js → date.1652811581.js} +0 -0
  35. js/{jquery-ui-timepicker-addon.1647958122.js → jquery-ui-timepicker-addon.1652811581.js} +0 -0
  36. js/{jquery.colorbox-min.1647958122.js → jquery.colorbox-min.1652811581.js} +0 -0
  37. js/{jquery.colorbox.1647958122.js → jquery.colorbox.1652811581.js} +0 -0
  38. js/{jquery.dataTables.min.1647958122.js → jquery.dataTables.min.1652811581.js} +0 -0
  39. js/{jquery.qrcode.min.1647958122.js → jquery.qrcode.min.1652811581.js} +0 -0
  40. js/{jquery.tmpl.min.1647958122.js → jquery.tmpl.min.1652811581.js} +0 -0
  41. js/{jquery.tools.min.1647958122.js → jquery.tools.min.1652811581.js} +0 -0
  42. js/{knockout-3.5.1.1647958122.js → knockout-3.5.1.1652811581.js} +0 -0
  43. js/{wfdashboard.1647958122.js → wfdashboard.1652811581.js} +0 -0
  44. js/{wfdropdown.1647958122.js → wfdropdown.1652811581.js} +0 -0
  45. js/{wfglobal.1647958122.js → wfglobal.1652811581.js} +0 -0
  46. js/{wfi18n.1647958122.js → wfi18n.1652811581.js} +0 -0
  47. js/{wfpopover.1647958122.js → wfpopover.1652811581.js} +0 -0
  48. js/{wfselect2.min.1647958122.js → wfselect2.min.1652811581.js} +0 -0
  49. languages/wordfence.po +928 -912
  50. lib/wfFileUtils.php +77 -0
  51. lib/wfIssues.php +24 -4
  52. lib/wfLog.php +5 -0
  53. lib/wfScanEngine.php +64 -49
  54. lib/wfScanFile.php +41 -0
  55. lib/wfScanPath.php +65 -0
  56. lib/wordfenceClass.php +109 -28
  57. lib/wordfenceHash.php +140 -153
  58. lib/wordfenceScanner.php +13 -6
  59. modules/login-security/css/{admin-global.1647958122.css → admin-global.1652811581.css} +0 -0
  60. modules/login-security/css/{admin.1647958122.css → admin.1652811581.css} +0 -0
  61. modules/login-security/css/{colorbox.1647958122.css → colorbox.1652811581.css} +0 -0
  62. modules/login-security/css/{font-awesome.1647958122.css → font-awesome.1652811581.css} +0 -0
  63. modules/login-security/css/{ionicons.1647958122.css → ionicons.1652811581.css} +0 -0
  64. modules/login-security/css/{jquery-ui.min.1647958122.css → jquery-ui.min.1652811581.css} +0 -0
  65. modules/login-security/css/{jquery-ui.structure.min.1647958122.css → jquery-ui.structure.min.1652811581.css} +0 -0
  66. modules/login-security/css/{jquery-ui.theme.min.1647958122.css → jquery-ui.theme.min.1652811581.css} +0 -0
  67. modules/login-security/css/{login.1647958122.css → login.1652811581.css} +0 -0
  68. modules/login-security/js/{admin-global.1647958122.js → admin-global.1652811581.js} +0 -0
  69. modules/login-security/js/{admin.1647958122.js → admin.1652811581.js} +0 -0
  70. modules/login-security/js/{jquery.colorbox.1647958122.js → jquery.colorbox.1652811581.js} +0 -0
  71. modules/login-security/js/{jquery.colorbox.min.1647958122.js → jquery.colorbox.min.1652811581.js} +0 -0
  72. modules/login-security/js/{jquery.qrcode.min.1647958122.js → jquery.qrcode.min.1652811581.js} +0 -0
  73. modules/login-security/js/{jquery.tmpl.min.1647958122.js → jquery.tmpl.min.1652811581.js} +0 -0
  74. modules/login-security/js/{login.1647958122.js → login.1652811581.js} +0 -0
  75. modules/login-security/wordfence-login-security.php +1 -1
  76. readme.txt +13 -2
  77. vendor/wordfence/wf-waf/src/init.php +2 -1
  78. vendor/wordfence/wf-waf/src/lib/rules.php +190 -165
  79. vendor/wordfence/wf-waf/src/lib/shutdown.php +68 -0
  80. vendor/wordfence/wf-waf/src/lib/storage/mysql.php +21 -12
  81. vendor/wordfence/wf-waf/src/lib/utils.php +40 -1
  82. vendor/wordfence/wf-waf/src/lib/waf.php +8 -5
  83. views/dashboard/options-group-license.php +11 -0
  84. views/scanner/issue-configReadable.php +1 -1
  85. views/scanner/issue-coreUnknown.php +1 -1
  86. views/scanner/issue-file.php +1 -1
  87. views/scanner/issue-knownfile.php +1 -1
  88. views/scanner/issue-publiclyAccessible.php +1 -1
  89. views/scanner/issue-wpscan_directoryList.php +1 -1
  90. views/scanner/issue-wpscan_fullPathDiscl.php +1 -1
  91. waf/bootstrap.php +3 -2
  92. waf/wfWAFIPBlocksController.php +4 -2
  93. wordfence.php +4 -4
css/{activity-report-widget.1647958122.css → activity-report-widget.1652811581.css} RENAMED
File without changes
css/{diff.1647958122.css → diff.1652811581.css} RENAMED
File without changes
css/{dt_table.1647958122.css → dt_table.1652811581.css} RENAMED
File without changes
css/{fullLog.1647958122.css → fullLog.1652811581.css} RENAMED
File without changes
css/{iptraf.1647958122.css → iptraf.1652811581.css} RENAMED
File without changes
css/{jquery-ui-timepicker-addon.1647958122.css → jquery-ui-timepicker-addon.1652811581.css} RENAMED
File without changes
css/{jquery-ui.min.1647958122.css → jquery-ui.min.1652811581.css} RENAMED
File without changes
css/{jquery-ui.structure.min.1647958122.css → jquery-ui.structure.min.1652811581.css} RENAMED
File without changes
css/{jquery-ui.theme.min.1647958122.css → jquery-ui.theme.min.1652811581.css} RENAMED
File without changes
css/license/{care-global.1647958122.css → care-global.1652811581.css} RENAMED
File without changes
css/license/{care.1647958122.css → care.1652811581.css} RENAMED
File without changes
css/license/{free-global.1647958122.css → free-global.1652811581.css} RENAMED
File without changes
css/license/{free.1647958122.css → free.1652811581.css} RENAMED
File without changes
css/license/{premium-global.1647958122.css → premium-global.1652811581.css} RENAMED
File without changes
css/license/{premium.1647958122.css → premium.1652811581.css} RENAMED
File without changes
css/license/{response-global.1647958122.css → response-global.1652811581.css} RENAMED
File without changes
css/license/{response-variables.1647958122.css → response-variables.1652811581.css} RENAMED
File without changes
css/license/{response.1647958122.css → response.1652811581.css} RENAMED
File without changes
css/{main.1647958122.css → main.1652811581.css} RENAMED
File without changes
css/{phpinfo.1647958122.css → phpinfo.1652811581.css} RENAMED
File without changes
css/{wf-adminbar.1647958122.css → wf-adminbar.1652811581.css} RENAMED
File without changes
css/{wf-colorbox.1647958122.css → wf-colorbox.1652811581.css} RENAMED
File without changes
css/{wf-font-awesome.1647958122.css → wf-font-awesome.1652811581.css} RENAMED
File without changes
css/{wf-global.1647958122.css → wf-global.1652811581.css} RENAMED
File without changes
css/{wf-ionicons.1647958122.css → wf-ionicons.1652811581.css} RENAMED
File without changes
css/{wf-onboarding.1647958122.css → wf-onboarding.1652811581.css} RENAMED
File without changes
css/{wf-roboto-font.1647958122.css → wf-roboto-font.1652811581.css} RENAMED
File without changes
css/{wfselect2.min.1647958122.css → wfselect2.min.1652811581.css} RENAMED
File without changes
css/{wordfenceBox.1647958122.css → wordfenceBox.1652811581.css} RENAMED
File without changes
js/{Chart.bundle.min.1647958122.js → Chart.bundle.min.1652811581.js} RENAMED
File without changes
js/{admin.1647958122.js → admin.1652811581.js} RENAMED
@@ -1620,7 +1620,7 @@
1620
  e.preventDefault();
1621
  e.stopPropagation();
1622
 
1623
- WFAD.promptToRepairFile(issueID, $(this).attr('data-file'));
1624
  });
1625
  });
1626
 
@@ -2022,7 +2022,7 @@
2022
  }
2023
  });
2024
  },
2025
- promptToRepairFile: function(issueID, file) {
2026
  if (window.localStorage) {
2027
  var sudoExpiration = window.localStorage.getItem('wf-repair-file-sudo');
2028
  if (sudoExpiration && parseInt(sudoExpiration, 10) > new Date().getTime()) {
@@ -2030,8 +2030,8 @@
2030
  return;
2031
  }
2032
  }
2033
- WFAD.colorboxModalHTML((WFAD.isSmallScreen ? '300px' : '400px'), __("Download Backup File"), __('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:') + '<p class="wf-padding-add-top-medium"><code>' + file + '</code></p>'
2034
- + '<a href="' + WFAD.makeDownloadFileLink(file) + '" onclick="jQuery(\'#wfRepairFileNextBtn\').prop(\'disabled\', false); return true;">' + __('Click here to download a backup copy of this file now') + '</a><p class="wf-flex-horizontal">' +
2035
  '<input type="button" class="wf-btn wf-btn-primary" name="but1" id="wfRepairFileNextBtn" value="Repair File" disabled="disabled" onclick="WFAD.promptToRepairFileDone(' + parseInt(issueID, 10) + ', jQuery(\'#forceRepairFileCheckbox\').prop(\'checked\'));this.disabled=true;" />' +
2036
  '<label class="wf-padding-add-left"><input type="checkbox" id="forceRepairFileCheckbox" onclick="jQuery(\'#wfRepairFileNextBtn\').prop(\'disabled\', !this.checked); return true;"> ' + __('Don\'t ask again') + '</label>' +
2037
  '</p>' +
@@ -2333,19 +2333,28 @@
2333
  makeIPTrafLink: function(IP) {
2334
  return WordfenceAdminVars.siteBaseURL + '?_wfsf=IPTraf&nonce=' + this.nonce + '&IP=' + encodeURIComponent(IP);
2335
  },
 
 
 
 
 
 
 
 
2336
  makeDiffLink: function(dat) {
2337
  return WordfenceAdminVars.siteBaseURL + '?_wfsf=diff&nonce=' + this.nonce +
2338
  '&file=' + encodeURIComponent(this.es(dat['file'])) +
 
2339
  '&cType=' + encodeURIComponent(this.es(dat['cType'])) +
2340
  '&cKey=' + encodeURIComponent(this.es(dat['cKey'])) +
2341
  '&cName=' + encodeURIComponent(this.es(dat['cName'])) +
2342
  '&cVersion=' + encodeURIComponent(this.es(dat['cVersion']));
2343
  },
2344
- makeViewFileLink: function(file) {
2345
- return WordfenceAdminVars.siteBaseURL + '?_wfsf=view&nonce=' + this.nonce + '&file=' + encodeURIComponent(file);
2346
  },
2347
- makeDownloadFileLink: function(file) {
2348
- return WordfenceAdminVars.siteBaseURL + '?_wfsf=download&nonce=' + this.nonce + '&file=' + encodeURIComponent(file);
2349
  },
2350
  makeViewOptionLink: function(option, siteID) {
2351
  return WordfenceAdminVars.siteBaseURL + '?_wfsf=viewOption&nonce=' + this.nonce + '&option=' + encodeURIComponent(option) + '&site_id=' + encodeURIComponent(siteID);
1620
  e.preventDefault();
1621
  e.stopPropagation();
1622
 
1623
+ WFAD.promptToRepairFile(issueID, issueObject.data);
1624
  });
1625
  });
1626
 
2022
  }
2023
  });
2024
  },
2025
+ promptToRepairFile: function(issueID, data) {
2026
  if (window.localStorage) {
2027
  var sudoExpiration = window.localStorage.getItem('wf-repair-file-sudo');
2028
  if (sudoExpiration && parseInt(sudoExpiration, 10) > new Date().getTime()) {
2030
  return;
2031
  }
2032
  }
2033
+ WFAD.colorboxModalHTML((WFAD.isSmallScreen ? '300px' : '400px'), __("Download Backup File"), __('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:') + '<p class="wf-padding-add-top-medium"><code>' + data.file + '</code></p>'
2034
+ + '<a href="' + WFAD.makeDownloadFileLink(data) + '" onclick="jQuery(\'#wfRepairFileNextBtn\').prop(\'disabled\', false); return true;">' + __('Click here to download a backup copy of this file now') + '</a><p class="wf-flex-horizontal">' +
2035
  '<input type="button" class="wf-btn wf-btn-primary" name="but1" id="wfRepairFileNextBtn" value="Repair File" disabled="disabled" onclick="WFAD.promptToRepairFileDone(' + parseInt(issueID, 10) + ', jQuery(\'#forceRepairFileCheckbox\').prop(\'checked\'));this.disabled=true;" />' +
2036
  '<label class="wf-padding-add-left"><input type="checkbox" id="forceRepairFileCheckbox" onclick="jQuery(\'#wfRepairFileNextBtn\').prop(\'disabled\', !this.checked); return true;"> ' + __('Don\'t ask again') + '</label>' +
2037
  '</p>' +
2333
  makeIPTrafLink: function(IP) {
2334
  return WordfenceAdminVars.siteBaseURL + '?_wfsf=IPTraf&nonce=' + this.nonce + '&IP=' + encodeURIComponent(IP);
2335
  },
2336
+ getRealFileParameters: function(data) {
2337
+ if ('realFile' in data) {
2338
+ return '&realFile=' + encodeURIComponent(this.es(data['realFile'])) + '&realFileToken=' + encodeURIComponent(this.es(data['realFileToken']));
2339
+ }
2340
+ else {
2341
+ return '';
2342
+ }
2343
+ },
2344
  makeDiffLink: function(dat) {
2345
  return WordfenceAdminVars.siteBaseURL + '?_wfsf=diff&nonce=' + this.nonce +
2346
  '&file=' + encodeURIComponent(this.es(dat['file'])) +
2347
+ this.getRealFileParameters(dat) +
2348
  '&cType=' + encodeURIComponent(this.es(dat['cType'])) +
2349
  '&cKey=' + encodeURIComponent(this.es(dat['cKey'])) +
2350
  '&cName=' + encodeURIComponent(this.es(dat['cName'])) +
2351
  '&cVersion=' + encodeURIComponent(this.es(dat['cVersion']));
2352
  },
2353
+ makeViewFileLink: function(data) {
2354
+ return WordfenceAdminVars.siteBaseURL + '?_wfsf=view&nonce=' + this.nonce + '&file=' + encodeURIComponent(data.file) + this.getRealFileParameters(data);
2355
  },
2356
+ makeDownloadFileLink: function(data) {
2357
+ return WordfenceAdminVars.siteBaseURL + '?_wfsf=download&nonce=' + this.nonce + '&file=' + encodeURIComponent(data.file) + this.getRealFileParameters(data);
2358
  },
2359
  makeViewOptionLink: function(option, siteID) {
2360
  return WordfenceAdminVars.siteBaseURL + '?_wfsf=viewOption&nonce=' + this.nonce + '&option=' + encodeURIComponent(option) + '&site_id=' + encodeURIComponent(siteID);
js/{admin.ajaxWatcher.1647958122.js → admin.ajaxWatcher.1652811581.js} RENAMED
File without changes
js/{admin.liveTraffic.1647958122.js → admin.liveTraffic.1652811581.js} RENAMED
File without changes
js/{date.1647958122.js → date.1652811581.js} RENAMED
File without changes
js/{jquery-ui-timepicker-addon.1647958122.js → jquery-ui-timepicker-addon.1652811581.js} RENAMED
File without changes
js/{jquery.colorbox-min.1647958122.js → jquery.colorbox-min.1652811581.js} RENAMED
File without changes
js/{jquery.colorbox.1647958122.js → jquery.colorbox.1652811581.js} RENAMED
File without changes
js/{jquery.dataTables.min.1647958122.js → jquery.dataTables.min.1652811581.js} RENAMED
File without changes
js/{jquery.qrcode.min.1647958122.js → jquery.qrcode.min.1652811581.js} RENAMED
File without changes
js/{jquery.tmpl.min.1647958122.js → jquery.tmpl.min.1652811581.js} RENAMED
File without changes
js/{jquery.tools.min.1647958122.js → jquery.tools.min.1652811581.js} RENAMED
File without changes
js/{knockout-3.5.1.1647958122.js → knockout-3.5.1.1652811581.js} RENAMED
File without changes
js/{wfdashboard.1647958122.js → wfdashboard.1652811581.js} RENAMED
File without changes
js/{wfdropdown.1647958122.js → wfdropdown.1652811581.js} RENAMED
File without changes
js/{wfglobal.1647958122.js → wfglobal.1652811581.js} RENAMED
File without changes
js/{wfi18n.1647958122.js → wfi18n.1652811581.js} RENAMED
File without changes
js/{wfpopover.1647958122.js → wfpopover.1652811581.js} RENAMED
File without changes
js/{wfselect2.min.1647958122.js → wfselect2.min.1652811581.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.9\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: 2022-03-22T09:38:02-04: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:6092
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:6167
72
  #: views/reports/activity-report-email-inline.php:256
73
  #: views/reports/activity-report.php:106
74
  msgid "Username"
@@ -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:6038
137
  msgid "An error occurred"
138
  msgstr ""
139
 
@@ -234,56 +234,56 @@ msgstr ""
234
  #: lib/menu_tools_twoFactor.php:51
235
  #: lib/menu_wordfence_central.php:59
236
  #: lib/wf503.php:390
237
- #: lib/wfScanEngine.php:278
238
- #: lib/wfScanEngine.php:611
239
- #: lib/wfScanEngine.php:624
240
- #: lib/wfScanEngine.php:696
241
- #: lib/wfScanEngine.php:719
242
- #: lib/wfScanEngine.php:794
243
- #: lib/wfScanEngine.php:995
244
- #: lib/wfScanEngine.php:996
245
- #: lib/wfScanEngine.php:1137
246
- #: lib/wfScanEngine.php:1274
247
- #: lib/wfScanEngine.php:1417
248
- #: lib/wfScanEngine.php:1781
249
- #: lib/wfScanEngine.php:2027
250
- #: lib/wfScanEngine.php:2066
251
- #: lib/wfScanEngine.php:2254
252
- #: lib/wfScanEngine.php:2296
253
  #: lib/wfVersionCheckController.php:68
254
  #: lib/wfVersionCheckController.php:91
255
  #: lib/wfVersionCheckController.php:167
256
  #: lib/wfVersionCheckController.php:186
257
- #: lib/wordfenceClass.php:1378
258
- #: lib/wordfenceClass.php:2720
259
- #: lib/wordfenceClass.php:2856
260
- #: lib/wordfenceClass.php:3011
261
- #: lib/wordfenceClass.php:3047
262
- #: lib/wordfenceClass.php:3575
263
- #: lib/wordfenceClass.php:4901
264
- #: lib/wordfenceClass.php:4909
265
- #: lib/wordfenceClass.php:4915
266
- #: lib/wordfenceClass.php:4928
267
- #: lib/wordfenceClass.php:4940
268
- #: lib/wordfenceClass.php:4948
269
- #: lib/wordfenceClass.php:6227
270
- #: lib/wordfenceClass.php:6249
271
- #: lib/wordfenceClass.php:6268
272
- #: lib/wordfenceClass.php:6274
273
  #: lib/wordfenceClass.php:6321
274
- #: lib/wordfenceClass.php:7968
275
- #: lib/wordfenceClass.php:7992
276
- #: lib/wordfenceClass.php:8036
277
- #: lib/wordfenceClass.php:8075
278
- #: lib/wordfenceClass.php:8100
279
- #: lib/wordfenceClass.php:8131
280
- #: lib/wordfenceClass.php:8160
281
- #: lib/wordfenceClass.php:8206
282
- #: lib/wordfenceClass.php:8928
283
- #: lib/wordfenceHash.php:533
284
- #: lib/wordfenceHash.php:579
285
- #: lib/wordfenceHash.php:650
286
- #: lib/wordfenceHash.php:763
 
 
 
287
  #: views/blocking/block-list.php:35
288
  #: views/blocking/blocking-create.php:179
289
  #: views/blocking/blocking-status.php:27
@@ -305,9 +305,9 @@ msgstr ""
305
  #: views/dashboard/options-group-import.php:31
306
  #: views/dashboard/options-group-import.php:44
307
  #: views/dashboard/options-group-license.php:35
308
- #: views/dashboard/options-group-license.php:62
309
- #: views/dashboard/options-group-license.php:64
310
- #: views/dashboard/options-group-license.php:66
311
  #: views/dashboard/status-payment-expiring.php:31
312
  #: views/dashboard/status-renewing.php:17
313
  #: views/gdpr/banner.php:55
@@ -426,7 +426,7 @@ msgid "Last Updated: %s ago"
426
  msgstr ""
427
 
428
  #: lib/dashboard/widget_notifications.php:8
429
- #: lib/wordfenceClass.php:6703
430
  msgid "Notifications"
431
  msgstr ""
432
 
@@ -501,15 +501,15 @@ msgstr ""
501
  #: lib/menu_tools_diagnostic.php:982
502
  #: lib/menu_tools_twoFactor.php:235
503
  #: lib/menu_tools_twoFactor.php:273
504
- #: lib/wordfenceClass.php:7993
505
- #: lib/wordfenceClass.php:8037
506
- #: lib/wordfenceClass.php:8101
507
- #: lib/wordfenceClass.php:8161
508
- #: lib/wordfenceClass.php:8207
509
  #: views/blocking/block-list.php:501
510
  #: views/blocking/blocking-create.php:212
511
  #: views/blocking/blocking-create.php:529
512
- #: views/dashboard/options-group-license.php:154
513
  #: views/options/block-all-options-controls.php:164
514
  #: views/options/block-controls.php:79
515
  msgid "Cancel"
@@ -723,7 +723,7 @@ msgstr ""
723
  #: lib/wfVersionCheckController.php:91
724
  #: lib/wfVersionCheckController.php:167
725
  #: lib/wfVersionCheckController.php:186
726
- #: lib/wordfenceClass.php:6354
727
  #: views/blocking/blocking-create.php:528
728
  #: views/blocking/blocking-status.php:27
729
  #: views/dashboard/options-group-dashboard.php:107
@@ -926,7 +926,7 @@ msgid "Live Updates Paused &mdash; Click inside window to resume"
926
  msgstr ""
927
 
928
  #: lib/menu_dashboard.php:24
929
- #: lib/wordfenceClass.php:6592
930
  msgid "Wordfence Dashboard"
931
  msgstr ""
932
 
@@ -938,7 +938,7 @@ msgstr ""
938
  #: lib/menu_dashboard_options.php:98
939
  #: lib/menu_firewall.php:20
940
  #: lib/menu_firewall.php:30
941
- #: lib/wordfenceClass.php:6596
942
  #: models/page/wfPage.php:105
943
  msgid "Firewall"
944
  msgstr ""
@@ -975,7 +975,7 @@ msgstr ""
975
  #: lib/menu_dashboard_options.php:115
976
  #: lib/menu_scanner.php:31
977
  #: lib/menu_scanner.php:305
978
- #: lib/wordfenceClass.php:6603
979
  #: models/page/wfPage.php:113
980
  msgid "Scan"
981
  msgstr ""
@@ -1013,7 +1013,7 @@ msgstr ""
1013
 
1014
  #: lib/menu_dashboard.php:89
1015
  #: lib/menu_dashboard_options.php:133
1016
- #: views/dashboard/options-group-license.php:62
1017
  msgid "Reset License"
1018
  msgstr ""
1019
 
@@ -1058,13 +1058,13 @@ msgstr ""
1058
  #: lib/menu_scanner.php:80
1059
  #: lib/menu_support.php:55
1060
  #: lib/menu_tools_twoFactor.php:51
1061
- #: lib/wordfenceClass.php:6632
1062
  #: views/blocking/blocking-create.php:179
1063
  #: views/blocking/blocking-status.php:23
1064
  #: views/blocking/blocking-status.php:27
1065
  #: views/blocking/options-group-advanced-country.php:85
1066
  #: views/dashboard/options-group-dashboard.php:107
1067
- #: views/dashboard/options-group-license.php:66
1068
  #: views/onboarding/fresh-install.php:42
1069
  #: views/onboarding/modal-final-attempt.php:41
1070
  #: views/onboarding/plugin-header.php:64
@@ -1152,7 +1152,7 @@ msgid "Learn about Wordfence Response"
1152
  msgstr ""
1153
 
1154
  #: lib/menu_dashboard.php:229
1155
- #: lib/wordfenceClass.php:6607
1156
  msgid "Tools"
1157
  msgstr ""
1158
 
@@ -1164,7 +1164,7 @@ msgstr ""
1164
  #: lib/menu_firewall_waf.php:157
1165
  #: lib/menu_scanner.php:139
1166
  #: lib/menu_support.php:19
1167
- #: lib/wordfenceClass.php:6620
1168
  msgid "Help"
1169
  msgstr ""
1170
 
@@ -1383,7 +1383,7 @@ msgstr ""
1383
  #: lib/menu_firewall.php:41
1384
  #: lib/menu_firewall_blocking.php:119
1385
  #: lib/menu_firewall_waf.php:142
1386
- #: lib/wordfenceClass.php:6598
1387
  #: models/page/wfPage.php:109
1388
  msgid "Blocking"
1389
  msgstr ""
@@ -1572,7 +1572,7 @@ msgstr ""
1572
  #: lib/menu_tools_diagnostic.php:301
1573
  #: lib/menu_tools_diagnostic.php:302
1574
  #: lib/menu_tools_diagnostic.php:305
1575
- #: lib/wordfenceClass.php:6064
1576
  #: models/firewall/wfFirewall.php:41
1577
  #: views/diagnostics/text.php:154
1578
  #: views/diagnostics/text.php:159
@@ -1694,7 +1694,7 @@ msgstr ""
1694
 
1695
  #: lib/menu_options.php:24
1696
  #: lib/menu_options.php:262
1697
- #: lib/wordfenceClass.php:6615
1698
  msgid "All Options"
1699
  msgstr ""
1700
 
@@ -2333,7 +2333,7 @@ msgid "Signature updates delayed by 30 days"
2333
  msgstr ""
2334
 
2335
  #: lib/menu_scanner.php:80
2336
- #: lib/wordfenceClass.php:6644
2337
  msgid "Protect More Sites"
2338
  msgstr ""
2339
 
@@ -2416,20 +2416,20 @@ msgstr ""
2416
  #: lib/menu_tools_twoFactor.php:255
2417
  #: lib/menu_tools_twoFactor.php:264
2418
  #: lib/menu_tools_twoFactor.php:284
2419
- #: lib/wordfenceClass.php:4910
2420
- #: lib/wordfenceClass.php:4916
2421
- #: lib/wordfenceClass.php:4922
2422
- #: lib/wordfenceClass.php:4929
2423
- #: lib/wordfenceClass.php:4935
2424
- #: lib/wordfenceClass.php:4942
2425
- #: lib/wordfenceClass.php:4950
2426
- #: lib/wordfenceClass.php:6006
2427
- #: lib/wordfenceClass.php:6008
2428
- #: lib/wordfenceClass.php:6059
2429
- #: lib/wordfenceClass.php:8018
2430
- #: lib/wordfenceClass.php:8025
2431
- #: lib/wordfenceClass.php:8132
2432
- #: lib/wordfenceClass.php:8196
2433
  #: views/dashboard/options-group-import.php:147
2434
  #: views/dashboard/options-group-import.php:157
2435
  #: views/dashboard/options-group-import.php:177
@@ -2632,7 +2632,7 @@ msgstr ""
2632
  #: lib/menu_tools_livetraffic.php:41
2633
  #: lib/menu_tools_livetraffic.php:571
2634
  #: lib/menu_tools_livetraffic.php:602
2635
- #: lib/wordfenceClass.php:6609
2636
  #: models/page/wfPage.php:119
2637
  msgid "Live Traffic"
2638
  msgstr ""
@@ -3123,7 +3123,7 @@ msgid "Interval the trash is automatically emptied at in days"
3123
  msgstr ""
3124
 
3125
  #: lib/menu_tools_diagnostic.php:304
3126
- #: lib/wordfenceClass.php:4229
3127
  #: views/diagnostics/text.php:162
3128
  msgid "Never"
3129
  msgstr ""
@@ -3470,7 +3470,7 @@ msgstr ""
3470
 
3471
  #: lib/menu_tools_diagnostic.php:732
3472
  #: lib/menu_tools_diagnostic.php:771
3473
- #: lib/wordfenceClass.php:6067
3474
  msgid "Download"
3475
  msgstr ""
3476
 
@@ -3500,7 +3500,7 @@ msgid "New Issues (%d total)"
3500
  msgstr ""
3501
 
3502
  #: lib/menu_tools_diagnostic.php:811
3503
- #: lib/wordfenceClass.php:3930
3504
  #: views/diagnostics/text.php:584
3505
  msgid "No New Issues"
3506
  msgstr ""
@@ -3570,17 +3570,17 @@ msgid "Enable beta threat defense feed"
3570
  msgstr ""
3571
 
3572
  #: lib/menu_tools_diagnostic.php:961
3573
- #: lib/wordfenceClass.php:6128
3574
  msgid "Restore Defaults"
3575
  msgstr ""
3576
 
3577
  #: lib/menu_tools_diagnostic.php:962
3578
- #: lib/wordfenceClass.php:6053
3579
  msgid "Cancel Changes"
3580
  msgstr ""
3581
 
3582
  #: lib/menu_tools_diagnostic.php:963
3583
- #: lib/wordfenceClass.php:6131
3584
  msgid "Save Changes"
3585
  msgstr ""
3586
 
@@ -3651,14 +3651,14 @@ msgstr ""
3651
  #: lib/menu_tools_livetraffic.php:100
3652
  #: lib/menu_tools_livetraffic.php:227
3653
  #: lib/menu_tools_livetraffic.php:458
3654
- #: lib/wordfenceClass.php:6090
3655
  msgid "Human"
3656
  msgstr ""
3657
 
3658
  #: lib/menu_tools_livetraffic.php:101
3659
  #: lib/menu_tools_livetraffic.php:228
3660
  #: lib/menu_tools_livetraffic.php:458
3661
- #: lib/wordfenceClass.php:6052
3662
  msgid "Bot"
3663
  msgstr ""
3664
 
@@ -3668,7 +3668,7 @@ msgstr ""
3668
 
3669
  #: lib/menu_tools_livetraffic.php:103
3670
  #: lib/wfDiagnostic.php:762
3671
- #: lib/wordfenceClass.php:6044
3672
  msgid "Blocked"
3673
  msgstr ""
3674
 
@@ -3761,7 +3761,7 @@ msgid "%s hits"
3761
  msgstr ""
3762
 
3763
  #: lib/menu_tools_livetraffic.php:286
3764
- #: lib/wordfenceClass.php:6159
3765
  msgid "Type"
3766
  msgstr ""
3767
 
@@ -3784,7 +3784,7 @@ msgid "IP Address"
3784
  msgstr ""
3785
 
3786
  #: lib/menu_tools_livetraffic.php:291
3787
- #: lib/wordfenceClass.php:4211
3788
  #: views/blocking/blocking-create.php:193
3789
  msgid "Hostname"
3790
  msgstr ""
@@ -4144,22 +4144,22 @@ msgid "You've chosen to block the network that <span style=\"color: #F00;\">%s</
4144
  msgstr ""
4145
 
4146
  #: lib/menu_tools_whois.php:95
4147
- #: lib/wordfenceClass.php:6072
4148
  msgid "Enter a valid IP or domain"
4149
  msgstr ""
4150
 
4151
  #: lib/menu_tools_whois.php:95
4152
- #: lib/wordfenceClass.php:6115
4153
  msgid "Please enter a valid IP address or domain name for your whois lookup."
4154
  msgstr ""
4155
 
4156
  #: lib/menu_tools_whois.php:99
4157
- #: lib/wordfenceClass.php:6096
4158
  msgid "Loading..."
4159
  msgstr ""
4160
 
4161
  #: lib/menu_tools_whois.php:104
4162
- #: lib/wordfenceClass.php:6102
4163
  msgid "Look up IP or Domain"
4164
  msgstr ""
4165
 
@@ -4189,7 +4189,7 @@ msgstr ""
4189
 
4190
  #: lib/menu_wordfence_central.php:44
4191
  #: lib/menu_wordfence_central.php:57
4192
- #: lib/wordfenceClass.php:6625
4193
  msgid "Wordfence Central"
4194
  msgstr ""
4195
 
@@ -4272,20 +4272,20 @@ msgstr ""
4272
  #. translators: Error message.
4273
  #: lib/rest-api/wfRESTConfigController.php:215
4274
  #: lib/rest-api/wfRESTConfigController.php:258
4275
- #: lib/wordfenceClass.php:4495
4276
  msgid "An error occurred while saving the configuration: %s"
4277
  msgstr ""
4278
 
4279
  #. translators: Error message.
4280
  #: lib/rest-api/wfRESTConfigController.php:226
4281
  #: lib/rest-api/wfRESTConfigController.php:269
4282
- #: lib/wordfenceClass.php:4504
4283
  msgid "Errors occurred while saving the configuration: %s"
4284
  msgstr ""
4285
 
4286
  #: lib/rest-api/wfRESTConfigController.php:231
4287
  #: lib/rest-api/wfRESTConfigController.php:274
4288
- #: lib/wordfenceClass.php:4509
4289
  msgid "Errors occurred while saving the configuration."
4290
  msgstr ""
4291
 
@@ -4402,37 +4402,37 @@ msgid "Wordfence activity for %1$s on %2$s"
4402
  msgstr ""
4403
 
4404
  #: lib/wfActivityReport.php:584
4405
- #: lib/wordfenceClass.php:8371
4406
  msgid "Blocked because the IP is blocklisted"
4407
  msgstr ""
4408
 
4409
  #. translators: Reason for firewall action.
4410
  #: lib/wfActivityReport.php:587
4411
- #: lib/wordfenceClass.php:8374
4412
  msgid "Blocked for %s"
4413
  msgstr ""
4414
 
4415
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4416
  #: lib/wfActivityReport.php:599
4417
- #: lib/wordfenceClass.php:8388
4418
  msgid "Blocked for %1$s in query string: %2$s = %3$s"
4419
  msgstr ""
4420
 
4421
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4422
  #: lib/wfActivityReport.php:602
4423
- #: lib/wordfenceClass.php:8393
4424
  msgid "Blocked for %1$s in POST body: %2$s = %3$s"
4425
  msgstr ""
4426
 
4427
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4428
  #: lib/wfActivityReport.php:605
4429
- #: lib/wordfenceClass.php:8398
4430
  msgid "Blocked for %1$s in cookie: %2$s = %3$s"
4431
  msgstr ""
4432
 
4433
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4434
  #: lib/wfActivityReport.php:608
4435
- #: lib/wordfenceClass.php:8403
4436
  msgid "Blocked for %1$s in file: %2$s = %3$s"
4437
  msgstr ""
4438
 
@@ -4443,10 +4443,10 @@ msgid "Unknown"
4443
  msgstr ""
4444
 
4445
  #: lib/wfAdminNoticeQueue.php:193
4446
- #: lib/wordfenceClass.php:6065
4447
- #: lib/wordfenceClass.php:6320
4448
- #: lib/wordfenceClass.php:6355
4449
- #: lib/wordfenceClass.php:8926
4450
  msgid "Dismiss"
4451
  msgstr ""
4452
 
@@ -5678,7 +5678,7 @@ msgid "Unable to remove code execution protections applied to the .htaccess file
5678
  msgstr ""
5679
 
5680
  #: lib/wfConfig.php:1186
5681
- #: lib/wordfenceClass.php:7481
5682
  msgid "The grace period end time must be in the future."
5683
  msgstr ""
5684
 
@@ -5716,7 +5716,7 @@ msgid "An empty license key was entered."
5716
  msgstr ""
5717
 
5718
  #: lib/wfConfig.php:1312
5719
- #: lib/wordfenceClass.php:4380
5720
  msgid "The license key entered is not in a valid format. It must contain only numbers and the letters A-F."
5721
  msgstr ""
5722
 
@@ -6237,13 +6237,13 @@ msgstr ""
6237
 
6238
  #: lib/wfLog.php:600
6239
  #: models/block/wfBlock.php:1442
6240
- #: waf/wfWAFIPBlocksController.php:71
6241
  msgid "Access from your area has been temporarily limited for security reasons"
6242
  msgstr ""
6243
 
6244
  #: lib/wfLog.php:615
6245
- #: lib/wordfenceClass.php:6103
6246
- #: waf/wfWAFIPBlocksController.php:97
6247
  msgid "Manual block by administrator"
6248
  msgstr ""
6249
 
@@ -6388,7 +6388,7 @@ msgstr ""
6388
  #: lib/wfScan.php:263
6389
  #: lib/wfScan.php:278
6390
  #: lib/wfScan.php:293
6391
- #: lib/wfScanEngine.php:441
6392
  msgid "Wordfence used %1$s of memory for scan. Server peak memory usage was: %2$s"
6393
  msgstr ""
6394
 
@@ -6413,801 +6413,801 @@ msgid "Scan Engine Error: %s"
6413
  msgstr ""
6414
 
6415
  #. translators: Number of scan results.
6416
- #: lib/wfScanEngine.php:113
6417
  msgid "%d issue found in most recent scan"
6418
  msgid_plural "%d issues found in most recent scan"
6419
  msgstr[0] ""
6420
  msgstr[1] ""
6421
 
6422
  #. translators: 1. Time duration. 2. Support URL.
6423
- #: lib/wfScanEngine.php:278
6424
  msgid "The scan time limit of %1$s has been exceeded and the scan will be terminated. This limit can be customized on the options page. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Get More Information<span class=\"screen-reader-text\"> ("
6425
  msgstr ""
6426
 
6427
- #: lib/wfScanEngine.php:282
6428
  msgid "Scan Time Limit Exceeded"
6429
  msgstr ""
6430
 
6431
  #. translators: 1. Number of files. 2. Number of plugins. 3. Number of themes. 4. Number of posts. 5. Number of comments. 6. Number of URLs. 7. Time duration.
6432
- #: lib/wfScanEngine.php:287
6433
  msgid "Scan interrupted. Scanned %1$d files, %2$d plugins, %3$d themes, %4$d posts, %5$d comments and %6$d URLs in %7$s."
6434
  msgstr ""
6435
 
6436
  #. translators: Number of scan results.
6437
- #: lib/wfScanEngine.php:299
6438
  msgid "Scan interrupted. You have %d new issue to fix. See below."
6439
  msgid_plural "Scan interrupted. You have %d new issues to fix. See below."
6440
  msgstr[0] ""
6441
  msgstr[1] ""
6442
 
6443
- #: lib/wfScanEngine.php:308
6444
  msgid "Scan interrupted. No problems found prior to stopping."
6445
  msgstr ""
6446
 
6447
  #. translators: 1. Software version. 2. Software version.
6448
- #: lib/wfScanEngine.php:320
6449
  msgid "Aborting scan because WordPress updated from version %1$s to %2$s. The scan will be reattempted later."
6450
  msgstr ""
6451
 
6452
- #: lib/wfScanEngine.php:350
6453
  msgid "Forking during hash scan to ensure continuity."
6454
  msgstr ""
6455
 
6456
- #: lib/wfScanEngine.php:356
6457
  msgid "Entered fork()"
6458
  msgstr ""
6459
 
6460
- #: lib/wfScanEngine.php:359
6461
  msgid "Calling startScan(true)"
6462
  msgstr ""
6463
 
6464
  #. translators: 1. Number of files. 2. Number of plugins. 3. Number of themes. 4. Number of posts. 5. Number of comments. 6. Number of URLs. 7. Time duration.
6465
- #: lib/wfScanEngine.php:449
6466
  msgid "Scan Complete. Scanned %1$d files, %2$d plugins, %3$d themes, %4$d posts, %5$d comments and %6$d URLs in %7$s."
6467
  msgstr ""
6468
 
6469
  #. translators: 1. Time duration.
6470
- #: lib/wfScanEngine.php:461
6471
  msgid "Quick Scan Complete. Scanned in %s."
6472
  msgstr ""
6473
 
6474
  #. translators: Number of scan results.
6475
- #: lib/wfScanEngine.php:470
6476
  msgid "%d ignored issue was also detected."
6477
  msgid_plural "%d ignored issues were also detected."
6478
  msgstr[0] ""
6479
  msgstr[1] ""
6480
 
6481
  #. translators: Number of scan results.
6482
- #: lib/wfScanEngine.php:481
6483
  msgid "Scan complete. You have %d new issue to fix."
6484
  msgid_plural "Scan complete. You have %d new issues to fix."
6485
  msgstr[0] ""
6486
  msgstr[1] ""
6487
 
6488
- #: lib/wfScanEngine.php:489
6489
  msgid "See below."
6490
  msgstr ""
6491
 
6492
- #: lib/wfScanEngine.php:492
6493
  msgid "Scan complete. Congratulations, no new problems found."
6494
  msgstr ""
6495
 
6496
- #: lib/wfScanEngine.php:503
6497
  msgid "Checking if your site IP is generating spam"
6498
  msgstr ""
6499
 
6500
- #: lib/wfScanEngine.php:522
6501
  msgid "Checking if your IP is generating spam is for paid members only"
6502
  msgstr ""
6503
 
6504
- #: lib/wfScanEngine.php:529
6505
  msgid "Checking if your site is on a domain blocklist"
6506
  msgstr ""
6507
 
6508
- #: lib/wfScanEngine.php:534
6509
  msgid "Checking if your site is on a domain blocklist is for paid members only"
6510
  msgstr ""
6511
 
6512
  #. translators: Error message.
6513
- #: lib/wfScanEngine.php:570
6514
  msgid "Error checking domain blocklists: %s"
6515
  msgstr ""
6516
 
6517
  #. translators: WordPress site ID.
6518
- #: lib/wfScanEngine.php:604
6519
  msgid "The multisite blog with ID %d is listed on Google's Safe Browsing malware list."
6520
  msgstr ""
6521
 
6522
- #: lib/wfScanEngine.php:607
6523
  msgid "Your site is listed on Google's Safe Browsing malware list."
6524
  msgstr ""
6525
 
6526
  #. translators: 1. URL. 2. URL.
6527
- #: lib/wfScanEngine.php:611
6528
  msgid "The URL %1$s is on the malware list. More info available at <a href=\"http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%2$s&client=googlechrome&hl=en-US\" target=\"_blank\" rel=\"noopener noreferrer\">Google Safe Browsing diagnostic page<span class=\"screen-reader-text\"> ("
6529
  msgstr ""
6530
 
6531
  #. translators: WordPress site ID.
6532
- #: lib/wfScanEngine.php:617
6533
  msgid "The multisite blog with ID %d is listed on Google's Safe Browsing phishing list."
6534
  msgstr ""
6535
 
6536
- #: lib/wfScanEngine.php:620
6537
  msgid "Your site is listed on Google's Safe Browsing phishing list."
6538
  msgstr ""
6539
 
6540
  #. translators: 1. URL. 2. URL.
6541
- #: lib/wfScanEngine.php:624
6542
  msgid "The URL %1$s is on the phishing list. More info available at <a href=\"http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%2$s&client=googlechrome&hl=en-US\" target=\"_blank\" rel=\"noopener noreferrer\">Google Safe Browsing diagnostic page<span class=\"screen-reader-text\"> ("
6543
  msgstr ""
6544
 
6545
  #. translators: WordPress site ID.
6546
- #: lib/wfScanEngine.php:630
6547
  msgid "The multisite blog with ID %d is listed on the Wordfence domain blocklist."
6548
  msgstr ""
6549
 
6550
- #: lib/wfScanEngine.php:633
6551
  msgid "Your site is listed on the Wordfence domain blocklist."
6552
  msgstr ""
6553
 
6554
  #. translators: URL.
6555
- #: lib/wfScanEngine.php:637
6556
  msgid "The URL %s is on the blocklist."
6557
  msgstr ""
6558
 
6559
  #. translators: WordPress site ID.
6560
- #: lib/wfScanEngine.php:643
6561
  msgid "The multisite blog with ID %d is listed on a domain blocklist."
6562
  msgstr ""
6563
 
6564
- #: lib/wfScanEngine.php:646
6565
  msgid "Your site is listed on a domain blocklist."
6566
  msgstr ""
6567
 
6568
  #. translators: URL.
6569
- #: lib/wfScanEngine.php:648
6570
  msgid "The URL is: %s"
6571
  msgstr ""
6572
 
6573
- #: lib/wfScanEngine.php:668
6574
  msgid "Checking for the most secure way to get IPs"
6575
  msgstr ""
6576
 
6577
- #: lib/wfScanEngine.php:695
6578
  msgid "Unable to accurately detect IPs"
6579
  msgstr ""
6580
 
6581
  #. translators: Support URL.
6582
- #: lib/wfScanEngine.php:696
6583
  msgid "Wordfence was unable to validate a test request to your website. This can happen if your website is behind a proxy that does not use one of the standard ways to convey the IP of the request or it is unreachable publicly. IP blocking and live traffic information may not be accurate. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Get More Information<span class=\"screen-reader-text\"> ("
6584
  msgstr ""
6585
 
6586
- #: lib/wfScanEngine.php:706
6587
- #: lib/wordfenceClass.php:6297
6588
  msgid "For maximum security use PHP's built in REMOTE_ADDR."
6589
  msgstr ""
6590
 
6591
- #: lib/wfScanEngine.php:708
6592
- #: lib/wordfenceClass.php:6300
6593
  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."
6594
  msgstr ""
6595
 
6596
- #: lib/wfScanEngine.php:710
6597
- #: lib/wordfenceClass.php:6303
6598
  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."
6599
  msgstr ""
6600
 
6601
- #: lib/wfScanEngine.php:712
6602
- #: lib/wordfenceClass.php:6306
6603
  msgid "This site appears to be behind Cloudflare, so using the Cloudflare \"CF-Connecting-IP\" HTTP header will resolve to the correct IPs."
6604
  msgstr ""
6605
 
6606
- #: lib/wfScanEngine.php:716
6607
  msgid "'How does Wordfence get IPs' is misconfigured"
6608
  msgstr ""
6609
 
6610
  #. translators: Support URL.
6611
- #: lib/wfScanEngine.php:719
6612
  msgid "A test request to this website was detected on a different value for this setting. IP blocking and live traffic information may not be accurate. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Get More Information<span class=\"screen-reader-text\"> ("
6613
  msgstr ""
6614
 
6615
- #: lib/wfScanEngine.php:740
6616
  msgid "Check for publicly accessible configuration files, backup files and logs"
6617
  msgstr ""
6618
 
6619
  #. translators: File path.
6620
- #: lib/wfScanEngine.php:791
6621
  msgid "Publicly accessible config, backup, or log file found: %s"
6622
  msgstr ""
6623
 
6624
  #. translators: 1. URL to publicly accessible file. 2. Support URL.
6625
- #: lib/wfScanEngine.php:794
6626
  msgid "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%1$s</a> is publicly accessible and may expose source code or sensitive information about your site. Files such as this one are commonly checked for by scanners and should be made inaccessible. Alternately, some can be removed if you are certain your site does not need them. Sites using the nginx web server may need manual configuration changes to protect such files. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn more<span class=\"screen-reader-text\"> ("
6627
  msgstr ""
6628
 
6629
- #: lib/wfScanEngine.php:823
6630
  msgid "Checking if your server discloses the path to the document root"
6631
  msgstr ""
6632
 
6633
- #: lib/wfScanEngine.php:833
6634
  msgid "Web server exposes the document root"
6635
  msgstr ""
6636
 
6637
- #: lib/wfScanEngine.php:834
6638
  msgid "Full Path Disclosure (FPD) vulnerabilities enable the attacker to see the path to the webroot/file. e.g.: /home/user/htdocs/file/. Certain vulnerabilities, such as using the load_file() (within a SQL Injection) query to view the page source, require the attacker to have the full path to the file they wish to view."
6639
  msgstr ""
6640
 
6641
- #: lib/wfScanEngine.php:860
6642
  msgid "Directory listing is enabled"
6643
  msgstr ""
6644
 
6645
- #: lib/wfScanEngine.php:861
6646
  msgid "Directory listing provides an attacker with the complete index of all the resources located inside of the directory. The specific risks and consequences vary depending on which files are listed and accessible, but it is recommended that you disable it unless it is needed."
6647
  msgstr ""
6648
 
6649
- #: lib/wfScanEngine.php:877
6650
  msgid "Checking if your site is being Spamvertised"
6651
  msgstr ""
6652
 
6653
- #: lib/wfScanEngine.php:896
6654
  msgid "Check if your site is being Spamvertized is for paid members only"
6655
  msgstr ""
6656
 
6657
- #: lib/wfScanEngine.php:917
6658
- msgid "Wordfence could not read the contents of your base WordPress directory. This usually indicates your permissions are so strict that your web server can't read your WordPress directory."
6659
  msgstr ""
6660
 
6661
- #: lib/wfScanEngine.php:954
6662
  msgid "Checking for paths skipped due to scan settings"
6663
  msgstr ""
6664
 
6665
  #. translators: Number of paths skipped in scan.
6666
- #: lib/wfScanEngine.php:967
6667
  msgid ", and %d more."
6668
  msgstr ""
6669
 
6670
  #. translators: Number of paths skipped in scan.
6671
- #: lib/wfScanEngine.php:991
6672
  msgid "%d path was skipped for the malware scan due to scan settings"
6673
  msgid_plural "%d paths were skipped for the malware scan due to scan settings"
6674
  msgstr[0] ""
6675
  msgstr[1] ""
6676
 
6677
  #. translators: 1. Number of paths skipped in scan. 2. Support URL. 3. List of skipped paths.
6678
- #: lib/wfScanEngine.php:994
6679
  msgid "The option \"Scan files outside your WordPress installation\" is off by default, which means %1$d path and its file(s) will not be scanned for malware or unauthorized changes. To continue skipping this path, you may ignore this issue. Or to start scanning it, enable the option and subsequent scans will include it. Some paths may not be necessary to scan, so this is optional. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
6680
  msgid_plural "The option \"Scan files outside your WordPress installation\" is off by default, which means %1$d paths and their file(s) will not be scanned for malware or unauthorized changes. To continue skipping these paths, you may ignore this issue. Or to start scanning them, enable the option and subsequent scans will include them. Some paths may not be necessary to scan, so this is optional. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
6681
  msgstr[0] ""
6682
  msgstr[1] ""
6683
 
6684
- #: lib/wfScanEngine.php:1022
6685
  msgid "Including files that are outside the WordPress installation in the scan."
6686
  msgstr ""
6687
 
6688
- #: lib/wfScanEngine.php:1025
6689
  msgid "Getting plugin list from WordPress"
6690
  msgstr ""
6691
 
6692
  #. translators: Number of plugins.
6693
- #: lib/wfScanEngine.php:1027
6694
  msgid "Found %d plugin"
6695
  msgid_plural "Found %d plugins"
6696
  msgstr[0] ""
6697
  msgstr[1] ""
6698
 
6699
- #: lib/wfScanEngine.php:1029
6700
  msgid "Getting theme list from WordPress"
6701
  msgstr ""
6702
 
6703
  #. translators: Number of themes.
6704
- #: lib/wfScanEngine.php:1031
6705
  msgid "Found %d theme"
6706
  msgid_plural "Found %d themes"
6707
  msgstr[0] ""
6708
  msgstr[1] ""
6709
 
6710
- #: lib/wfScanEngine.php:1048
6711
  msgid "Scanning file contents for infections and vulnerabilities"
6712
  msgstr ""
6713
 
6714
- #: lib/wfScanEngine.php:1051
6715
  msgid "Skipping scan of file contents for infections and vulnerabilities"
6716
  msgstr ""
6717
 
6718
- #: lib/wfScanEngine.php:1055
6719
  msgid "Scanning file contents for URLs on a domain blocklist"
6720
  msgstr ""
6721
 
6722
- #: lib/wfScanEngine.php:1058
6723
  msgid "Skipping scan of file contents for URLs on a domain blocklist"
6724
  msgstr ""
6725
 
6726
- #: lib/wfScanEngine.php:1063
6727
  msgid "Starting scan of file contents"
6728
  msgstr ""
6729
 
6730
- #: lib/wfScanEngine.php:1079
6731
  msgid "Done file contents scan"
6732
  msgstr ""
6733
 
6734
  #. translators: Scan result description.
6735
- #: lib/wfScanEngine.php:1087
6736
- #: lib/wfScanEngine.php:2256
6737
- #: lib/wfScanEngine.php:2298
6738
  msgid "Adding issue: %s"
6739
  msgstr ""
6740
 
6741
- #: lib/wfScanEngine.php:1120
6742
  msgid "Scanning for publicly accessible quarantined files"
6743
  msgstr ""
6744
 
6745
  #. translators: File path.
6746
- #: lib/wfScanEngine.php:1125
6747
  msgid "Testing accessibility of: %s"
6748
  msgstr ""
6749
 
6750
  #. translators: File path.
6751
- #: lib/wfScanEngine.php:1134
6752
  msgid "Publicly accessible quarantined file found: %s"
6753
  msgstr ""
6754
 
6755
  #. translators: URL to publicly accessible file.
6756
- #: lib/wfScanEngine.php:1137
6757
  msgid "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%1$s<span class=\"screen-reader-text\"> ("
6758
  msgstr ""
6759
 
6760
- #: lib/wfScanEngine.php:1161
6761
  msgid "Scanning posts for URLs on a domain blocklist"
6762
  msgstr ""
6763
 
6764
  #. translators: Number of posts left to scan.
6765
- #: lib/wfScanEngine.php:1184
6766
  msgid "Scanning posts with %d left to scan."
6767
  msgstr ""
6768
 
6769
- #: lib/wfScanEngine.php:1206
6770
  msgid "Post title contains suspicious code"
6771
  msgstr ""
6772
 
6773
- #: lib/wfScanEngine.php:1207
6774
  msgid "This post contains code that is suspicious. Please check the title of the post and confirm that the code in the title is not malicious."
6775
  msgstr ""
6776
 
6777
- #: lib/wfScanEngine.php:1230
6778
  msgid "Examining URLs found in posts we scanned for dangerous websites"
6779
  msgstr ""
6780
 
6781
- #: lib/wfScanEngine.php:1232
6782
- #: lib/wfScanEngine.php:2219
6783
  msgid "Done examining URLs"
6784
  msgstr ""
6785
 
6786
  #. translators: 1. WordPress Post type. 2. URL.
6787
- #: lib/wfScanEngine.php:1268
6788
- #: lib/wfScanEngine.php:1288
6789
  msgid "%1$s contains a suspected malware URL: %2$s"
6790
  msgstr ""
6791
 
6792
  #. translators: 1. WordPress Post type. 2. URL. 3. URL.
6793
  #. translators: 1. WordPress post type. 2. URL. 3. URL.
6794
- #: lib/wfScanEngine.php:1274
6795
- #: lib/wfScanEngine.php:1417
6796
  msgid "This %1$s contains a suspected malware URL listed on Google's list of malware sites. The URL is: %2$s - More info available at <a href=\"http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%3$s&client=googlechrome&hl=en-US\" target=\"_blank\" rel=\"noopener noreferrer\">Google Safe Browsing diagnostic page<span class=\"screen-reader-text\"> ("
6797
  msgstr ""
6798
 
6799
  #. translators: 1. WordPress Post type. 2. URL.
6800
- #: lib/wfScanEngine.php:1280
6801
  msgid "%1$s contains a suspected phishing site URL: %2$s"
6802
  msgstr ""
6803
 
6804
  #. translators: 1. WordPress Post type. 2. URL.
6805
  #. translators: 1. WordPress post type. 2. URL.
6806
- #: lib/wfScanEngine.php:1283
6807
- #: lib/wfScanEngine.php:1426
6808
  msgid "This %1$s contains a URL that is a suspected phishing site that is currently listed on Google's list of known phishing sites. The URL is: %2$s"
6809
  msgstr ""
6810
 
6811
  #. translators: 1. WordPress Post type. 2. URL.
6812
  #. translators: 1. WordPress post type. 2. URL.
6813
- #: lib/wfScanEngine.php:1291
6814
- #: lib/wfScanEngine.php:1434
6815
  msgid "This %1$s contains a URL that is currently listed on Wordfence's domain blocklist. The URL is: %2$s"
6816
  msgstr ""
6817
 
6818
  #. translators: Scan result description.
6819
- #: lib/wfScanEngine.php:1300
6820
  msgid "Adding issue: %1$s"
6821
  msgstr ""
6822
 
6823
- #: lib/wfScanEngine.php:1336
6824
  msgid "Scanning comments for URLs on a domain blocklist"
6825
  msgstr ""
6826
 
6827
  #. translators: Number of comments left to scan.
6828
- #: lib/wfScanEngine.php:1360
6829
  msgid "Scanning comments with %d left to scan."
6830
  msgstr ""
6831
 
6832
  #. translators: 1. WordPress post type. 2. WordPress author username.
6833
- #: lib/wfScanEngine.php:1414
6834
  msgid "%1$s with author %2$s contains a suspected malware URL."
6835
  msgstr ""
6836
 
6837
  #. translators: WordPress post type.
6838
- #: lib/wfScanEngine.php:1423
6839
  msgid "%s contains a suspected phishing site URL."
6840
  msgstr ""
6841
 
6842
  #. translators: URL.
6843
- #: lib/wfScanEngine.php:1431
6844
  msgid "%s contains a suspected malware URL."
6845
  msgstr ""
6846
 
6847
  #. translators: WordPress username.
6848
- #: lib/wfScanEngine.php:1479
6849
  msgid "Author: %s"
6850
  msgstr ""
6851
 
6852
  #. translators: Email address.
6853
- #: lib/wfScanEngine.php:1482
6854
  msgid "Email: %s"
6855
  msgstr ""
6856
 
6857
  #. translators: IP address.
6858
- #: lib/wfScanEngine.php:1484
6859
  msgid "Source IP: %s"
6860
  msgstr ""
6861
 
6862
  #. translators: Comment description.
6863
- #: lib/wfScanEngine.php:1485
6864
  msgid "Scanning comment with %s"
6865
  msgstr ""
6866
 
6867
  #. translators: Comment description.
6868
- #: lib/wfScanEngine.php:1498
6869
- #: lib/wfScanEngine.php:1504
6870
  msgid "Marking comment as spam for containing a malware URL. Comment has %s"
6871
  msgstr ""
6872
 
6873
  #. translators: Comment description.
6874
- #: lib/wfScanEngine.php:1501
6875
  msgid "Marking comment as spam for containing a phishing URL. Comment has %s"
6876
  msgstr ""
6877
 
6878
  #. translators: Comment description.
6879
- #: lib/wfScanEngine.php:1511
6880
  msgid "Scanned comment with %s"
6881
  msgstr ""
6882
 
6883
- #: lib/wfScanEngine.php:1562
6884
  msgid "Scanning for weak passwords"
6885
  msgstr ""
6886
 
6887
- #: lib/wfScanEngine.php:1573
6888
  msgid "We were unable to generate the user list for your password check."
6889
  msgstr ""
6890
 
6891
  #. translators: Number of users.
6892
- #: lib/wfScanEngine.php:1589
6893
  msgid "Starting password strength check on %d user."
6894
  msgid_plural "Starting password strength check on %d users."
6895
  msgstr[0] ""
6896
  msgstr[1] ""
6897
 
6898
  #. translators: Number of users.
6899
- #: lib/wfScanEngine.php:1598
6900
  msgid "Total of %d users left to process in password strength check."
6901
  msgid_plural "Total of %d users left to process in password strength check."
6902
  msgstr[0] ""
6903
  msgstr[1] ""
6904
 
6905
  #. translators: WordPress user ID.
6906
- #: lib/wfScanEngine.php:1633
6907
  msgid "Could not get username for user with ID %d when checking password strength."
6908
  msgstr ""
6909
 
6910
  #. translators: 1. WordPress username. 2. WordPress user ID.
6911
- #: lib/wfScanEngine.php:1639
6912
  msgid "Checking password strength of user '%1$s' with ID %2$d"
6913
  msgstr ""
6914
 
6915
  #. translators: 1. WordPress username. 2. WordPress capability.
6916
- #: lib/wfScanEngine.php:1647
6917
  msgid "User \"%1$s\" with \"%2$s\" access has an easy password."
6918
  msgstr ""
6919
 
6920
  #. translators: WordPress capability.
6921
- #: lib/wfScanEngine.php:1653
6922
  msgid "A user with the a role of '%s' has a password that is easy to guess. Please change this password yourself or ask the user to change it."
6923
  msgstr ""
6924
 
6925
  #. translators: WordPress username.
6926
- #: lib/wfScanEngine.php:1661
6927
  msgid "User \"%s\" with 'subscriber' access has a very easy password."
6928
  msgstr ""
6929
 
6930
- #: lib/wfScanEngine.php:1662
6931
  msgid "A user with 'subscriber' access has a password that is very easy to guess. Please either change it or ask the user to change their password."
6932
  msgstr ""
6933
 
6934
  #. translators: Scan result description.
6935
- #: lib/wfScanEngine.php:1669
6936
  msgid "Adding issue %s"
6937
  msgstr ""
6938
 
6939
  #. translators: WordPress username.
6940
- #: lib/wfScanEngine.php:1686
6941
  msgid "Completed checking password strength of user '%s'"
6942
  msgstr ""
6943
 
6944
- #: lib/wfScanEngine.php:1719
6945
  msgid "Scanning to check available disk space"
6946
  msgstr ""
6947
 
6948
- #: lib/wfScanEngine.php:1726
6949
  msgid "Unable to access available disk space information"
6950
  msgstr ""
6951
 
6952
  #. translators: 1. Number of bytes. 2. Number of bytes.
6953
- #: lib/wfScanEngine.php:1735
6954
  msgid "Total disk space: %1$s -- Free disk space: %2$s"
6955
  msgstr ""
6956
 
6957
  #. translators: Number of bytes.
6958
- #: lib/wfScanEngine.php:1740
6959
  msgid "The disk has %s MB available"
6960
  msgstr ""
6961
 
6962
  #. translators: Number of bytes.
6963
- #: lib/wfScanEngine.php:1755
6964
  msgid "You have %s disk space remaining"
6965
  msgstr ""
6966
 
6967
  #. translators: Number of bytes.
6968
- #: lib/wfScanEngine.php:1756
6969
  msgid "You only have %s of your disk space remaining. Please free up disk space or your website may stop serving requests."
6970
  msgstr ""
6971
 
6972
- #: lib/wfScanEngine.php:1769
6973
  msgid "Checking Web Application Firewall status"
6974
  msgstr ""
6975
 
6976
- #: lib/wfScanEngine.php:1780
6977
  msgid "Web Application Firewall is disabled"
6978
  msgstr ""
6979
 
6980
  #. translators: Support URL.
6981
- #: lib/wfScanEngine.php:1781
6982
  msgid "Wordfence's Web Application Firewall has been unexpectedly disabled. If you see a notice at the top of the Wordfence admin pages that says \"The Wordfence Web Application Firewall cannot run,\" click the link in that message to rebuild the configuration. If this does not work, you may need to fix file permissions. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">More Details<span class=\"screen-reader-text\"> ("
6983
  msgstr ""
6984
 
6985
- #: lib/wfScanEngine.php:1796
6986
  msgid "Scanning for old themes, plugins and core files"
6987
  msgstr ""
6988
 
6989
- #: lib/wfScanEngine.php:1882
6990
  msgid "Your WordPress version is out of date"
6991
  msgstr ""
6992
 
6993
  #. translators: Software version.
6994
- #: lib/wfScanEngine.php:1883
6995
  msgid "WordPress version %s is now available. Please upgrade immediately to get the latest security updates from WordPress."
6996
  msgstr ""
6997
 
6998
  #. translators: 1. Plugin name. 2. Software version. 3. Software version.
6999
- #: lib/wfScanEngine.php:1910
7000
  msgid "The Plugin \"%1$s\" needs an upgrade (%2$s -> %3$s)."
7001
  msgstr ""
7002
 
7003
  #. translators: Theme name.
7004
- #: lib/wfScanEngine.php:1917
7005
- #: lib/wfScanEngine.php:1951
7006
  msgid "You need to upgrade \"%s\" to the newest version to ensure you have any security fixes the developer has released."
7007
  msgstr ""
7008
 
7009
  #. translators: 1. Theme name. 2. Software version. 3. Software version.
7010
- #: lib/wfScanEngine.php:1944
7011
  msgid "The Theme \"%1$s\" needs an upgrade (%2$s -> %3$s)."
7012
  msgstr ""
7013
 
7014
  #. translators: 1. Plugin name. 2. Software version. 3. Software version.
7015
- #: lib/wfScanEngine.php:1995
7016
  msgid "The Plugin \"%1$s\" appears to be abandoned (updated %2$s, tested to WP %3$s)."
7017
  msgstr ""
7018
 
7019
  #. translators: 1. Plugin name. 2. Software version.
7020
- #: lib/wfScanEngine.php:2002
7021
  msgid "It was last updated %1$s ago and tested up to WordPress %2$s."
7022
  msgstr ""
7023
 
7024
  #. translators: 1. Plugin name. 2. Software version.
7025
- #: lib/wfScanEngine.php:2009
7026
  msgid "The Plugin \"%1$s\" appears to be abandoned (updated %2$s)."
7027
  msgstr ""
7028
 
7029
  #. translators: Time duration.
7030
- #: lib/wfScanEngine.php:2015
7031
  msgid "It was last updated %s ago."
7032
  msgstr ""
7033
 
7034
- #: lib/wfScanEngine.php:2021
7035
- #: lib/wfScanEngine.php:2060
7036
  msgid "It has unpatched security issues and may have compatibility problems with the current version of WordPress."
7037
  msgstr ""
7038
 
7039
- #: lib/wfScanEngine.php:2023
7040
- #: lib/wfScanEngine.php:2062
7041
  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."
7042
  msgstr ""
7043
 
7044
  #. translators: Support URL.
7045
- #: lib/wfScanEngine.php:2027
7046
- #: lib/wfScanEngine.php:2066
7047
- #: lib/wfScanEngine.php:2254
7048
- #: lib/wfScanEngine.php:2296
7049
  msgid "<a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Get more information.<span class=\"screen-reader-text\"> ("
7050
  msgstr ""
7051
 
7052
  #. translators: Plugin name.
7053
- #: lib/wfScanEngine.php:2058
7054
  msgid "The Plugin \"%s\" has been removed from wordpress.org."
7055
  msgstr ""
7056
 
7057
- #: lib/wfScanEngine.php:2111
7058
  msgid "Scanning for admin users not created through WordPress"
7059
  msgstr ""
7060
 
7061
  #. translators: WordPress username.
7062
- #: lib/wfScanEngine.php:2133
7063
  msgid "An admin user with the username %s was created outside of WordPress."
7064
  msgstr ""
7065
 
7066
  #. translators: WordPress username.
7067
- #: lib/wfScanEngine.php:2134
7068
  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."
7069
  msgstr ""
7070
 
7071
  #. translators: WordPress username.
7072
- #: lib/wfScanEngine.php:2160
7073
  msgid "An admin user with a suspicious username %s was found."
7074
  msgstr ""
7075
 
7076
  #. translators: WordPress username.
7077
- #: lib/wfScanEngine.php:2161
7078
  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."
7079
  msgstr ""
7080
 
7081
- #: lib/wfScanEngine.php:2182
7082
  msgid "Scanning for suspicious site options"
7083
  msgstr ""
7084
 
7085
- #: lib/wfScanEngine.php:2217
7086
  msgid "Examining URLs found in the options we scanned for dangerous websites"
7087
  msgstr ""
7088
 
7089
  #. translators: URL.
7090
- #: lib/wfScanEngine.php:2241
7091
- #: lib/wfScanEngine.php:2247
7092
  msgid "Option contains a suspected malware URL: %s"
7093
  msgstr ""
7094
 
7095
  #. translators: URL.
7096
- #: lib/wfScanEngine.php:2242
7097
  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"
7098
  msgstr ""
7099
 
7100
  #. translators: URL.
7101
- #: lib/wfScanEngine.php:2244
7102
  msgid "Option contains a suspected phishing site URL: %s"
7103
  msgstr ""
7104
 
7105
  #. translators: URL.
7106
- #: lib/wfScanEngine.php:2245
7107
  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"
7108
  msgstr ""
7109
 
7110
  #. translators: URL.
7111
- #: lib/wfScanEngine.php:2248
7112
  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"
7113
  msgstr ""
7114
 
7115
- #: lib/wfScanEngine.php:2288
7116
  msgid "Checking for future GeoIP support"
7117
  msgstr ""
7118
 
7119
- #: lib/wfScanEngine.php:2293
7120
  msgid "PHP Update Needed for Country Blocking"
7121
  msgstr ""
7122
 
7123
  #. translators: Software version.
7124
- #: lib/wfScanEngine.php:2294
7125
  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."
7126
  msgstr ""
7127
 
7128
- #: lib/wfScanEngine.php:2343
7129
  msgid "Previous scan was stopped successfully."
7130
  msgstr ""
7131
 
7132
- #: lib/wfScanEngine.php:2344
7133
  msgid "Scan was stopped on administrator request."
7134
  msgstr ""
7135
 
7136
- #: lib/wfScanEngine.php:2360
7137
  msgid "Entering start scan routine"
7138
  msgstr ""
7139
 
7140
- #: lib/wfScanEngine.php:2363
7141
  msgid "A scan is already running. Use the stop scan button if you would like to terminate the current scan."
7142
  msgstr ""
7143
 
7144
  #. translators: Support URL.
7145
- #: lib/wfScanEngine.php:2381
7146
  msgid "Test result of scan start URL fetch: %s"
7147
  msgstr ""
7148
 
7149
  #. translators: WordPress admin panel URL.
7150
- #: lib/wfScanEngine.php:2390
7151
  msgid "Starting cron with normal ajax at URL %s"
7152
  msgstr ""
7153
 
7154
  #. translators: Error message.
7155
  #. translators: WordPress admin panel URL.
7156
- #: lib/wfScanEngine.php:2412
7157
- #: lib/wfScanEngine.php:2447
7158
  msgid "There was an error starting the scan: %s."
7159
  msgstr ""
7160
 
7161
- #: lib/wfScanEngine.php:2414
7162
- #: lib/wfScanEngine.php:2449
7163
  msgid "There was an unknown error starting the scan."
7164
  msgstr ""
7165
 
7166
- #: lib/wfScanEngine.php:2421
7167
- #: lib/wfScanEngine.php:2455
7168
  msgid "Scan process ended after forking."
7169
  msgstr ""
7170
 
7171
  #. translators: WordPress admin panel URL.
7172
- #: lib/wfScanEngine.php:2425
7173
  msgid "Starting cron via proxy at URL %s"
7174
  msgstr ""
7175
 
7176
  #. translators: Time in seconds.
7177
- #: lib/wfScanEngine.php:2501
7178
  msgid "Got value from wf config maxExecutionTime: %s"
7179
  msgstr ""
7180
 
7181
  #. translators: Time in seconds.
7182
- #: lib/wfScanEngine.php:2505
7183
  msgid "getMaxExecutionTime() returning config value: %s"
7184
  msgstr ""
7185
 
7186
  #. translators: PHP ini value.
7187
- #: lib/wfScanEngine.php:2512
7188
  msgid "Got max_execution_time value from ini: %s"
7189
  msgstr ""
7190
 
7191
  #. translators: 1. PHP ini setting. 2. Time in seconds.
7192
- #: lib/wfScanEngine.php:2519
7193
  msgid "ini value of %1$d is higher than value for WORDFENCE_SCAN_MAX_INI_EXECUTION_TIME (%2$d), reducing"
7194
  msgstr ""
7195
 
7196
  #. translators: PHP ini setting.
7197
- #: lib/wfScanEngine.php:2529
7198
  msgid "getMaxExecutionTime() returning half ini value: %d"
7199
  msgstr ""
7200
 
7201
- #: lib/wfScanEngine.php:2535
7202
  msgid "getMaxExecutionTime() returning default of: 15"
7203
  msgstr ""
7204
 
7205
  #. translators: 1. HTTP status code.
7206
- #: lib/wfScanEngine.php:2737
7207
  msgid "Got error response from Wordfence servers: %s"
7208
  msgstr ""
7209
 
7210
- #: lib/wfScanEngine.php:2741
7211
  msgid "Invalid response from Wordfence servers."
7212
  msgstr ""
7213
 
@@ -7377,1447 +7377,1459 @@ msgid ""
7377
  "select the license about to expire and click the button to renew that license."
7378
  msgstr ""
7379
 
7380
- #: lib/wordfenceClass.php:211
7381
  msgid "Your Premium Wordfence License is set to auto-renew in 10 days."
7382
  msgstr ""
7383
 
7384
- #: lib/wordfenceClass.php:212
7385
  msgid "To update your license settings please visit http://www.wordfence.com/zz9/dashboard"
7386
  msgstr ""
7387
 
7388
- #: lib/wordfenceClass.php:224
7389
  msgid "Your Premium Wordfence License expires in less than 2 weeks."
7390
  msgstr ""
7391
 
7392
- #: lib/wordfenceClass.php:227
7393
  msgid "Your Premium Wordfence License expires in less than a week."
7394
  msgstr ""
7395
 
7396
- #: lib/wordfenceClass.php:230
7397
  msgid "Your Premium Wordfence License expires in 2 days."
7398
  msgstr ""
7399
 
7400
- #: lib/wordfenceClass.php:233
7401
  msgid "Your Premium Wordfence License expires in 1 day."
7402
  msgstr ""
7403
 
7404
- #: lib/wordfenceClass.php:237
7405
  msgid "Your Wordfence Premium License has Expired!"
7406
  msgstr ""
7407
 
7408
- #: lib/wordfenceClass.php:268
7409
  msgid "The Wordfence Premium License in use on this site has been removed from your account."
7410
  msgstr ""
7411
 
7412
- #: lib/wordfenceClass.php:268
7413
  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."
7414
  msgstr ""
7415
 
7416
  #. translators: Wordfence license key.
7417
- #: lib/wordfenceClass.php:274
7418
  msgid "Could not verify Wordfence License: %s"
7419
  msgstr ""
7420
 
7421
  #. translators: WordPress version.
7422
- #: lib/wordfenceClass.php:356
7423
  msgid "WordPress (v%s)"
7424
  msgstr ""
7425
 
7426
  #. translators: Number of plugins.
7427
- #: lib/wordfenceClass.php:360
7428
  msgid "%d plugin"
7429
  msgid_plural "%d plugins"
7430
  msgstr[0] ""
7431
  msgstr[1] ""
7432
 
7433
  #. translators: Number of themes.
7434
- #: lib/wordfenceClass.php:365
7435
  msgid "%d theme"
7436
  msgid_plural "%d themes"
7437
  msgstr[0] ""
7438
  msgstr[1] ""
7439
 
7440
- #: lib/wordfenceClass.php:369
7441
  msgid "An update is available for "
7442
  msgid_plural "Updates are available for "
7443
  msgstr[0] ""
7444
  msgstr[1] ""
7445
 
7446
- #: lib/wordfenceClass.php:374
7447
  msgid "and "
7448
  msgstr ""
7449
 
7450
  #. translators: Wordfence version.
7451
- #: lib/wordfenceClass.php:413
7452
  msgid "`runInstall` called with previous version = %s"
7453
  msgstr ""
7454
 
7455
- #: lib/wordfenceClass.php:465
7456
- #: lib/wordfenceClass.php:4002
7457
  msgid "Could not understand the response we received from the Wordfence servers when applying for a free license key."
7458
  msgstr ""
7459
 
7460
- #: lib/wordfenceClass.php:829
7461
  msgid "Automatically generated from previous country blocking settings"
7462
  msgstr ""
7463
 
7464
- #: lib/wordfenceClass.php:1262
7465
  #: views/user/disabled-application-passwords.php:15
7466
  msgid "Application passwords have been disabled by Wordfence."
7467
  msgstr ""
7468
 
7469
- #: lib/wordfenceClass.php:1378
7470
  msgid "Upgrade To Premium"
7471
  msgstr ""
7472
 
7473
- #: lib/wordfenceClass.php:1397
7474
  msgid "wp_mail from address is incomplete, attempting to fix"
7475
  msgstr ""
7476
 
7477
  #. translators: Email address.
7478
- #: lib/wordfenceClass.php:1407
7479
  msgid "Fixing wp_mail from address: %s"
7480
  msgstr ""
7481
 
7482
- #: lib/wordfenceClass.php:1506
7483
  msgid "You appear to have logged out or you are not an admin. Please sign-out and sign-in again."
7484
  msgstr ""
7485
 
7486
- #: lib/wordfenceClass.php:1511
7487
  msgid "Your browser sent an invalid security token to Wordfence. Please try reloading this page or signing out and in again."
7488
  msgstr ""
7489
 
7490
- #: lib/wordfenceClass.php:1517
7491
  msgid "Wordfence encountered an internal error executing that request."
7492
  msgstr ""
7493
 
7494
  #. translators: Error message.
7495
- #: lib/wordfenceClass.php:1623
7496
  msgid "2FA Migration Error: %s"
7497
  msgstr ""
7498
 
7499
- #: lib/wordfenceClass.php:1663
7500
  msgid "Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words."
7501
  msgstr ""
7502
 
7503
- #: lib/wordfenceClass.php:1669
7504
  msgid "Passwords containing a space followed by \"wf\" without quotes are not allowed."
7505
  msgstr ""
7506
 
7507
  #. translators: Support URL.
7508
- #: lib/wordfenceClass.php:1684
7509
  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>"
7510
  msgstr ""
7511
 
7512
  #. translators: 1. Password reset limit (number). 2. WordPress username.
7513
- #: lib/wordfenceClass.php:1771
7514
  msgid "Exceeded the maximum number of tries to recover their password which is set at: %1$s. The last username or email they entered before getting locked out was: '%2$s'"
7515
  msgstr ""
7516
 
7517
- #: lib/wordfenceClass.php:1819
7518
- #: lib/wordfenceClass.php:2002
7519
  msgid "Sorry but your browser sent an invalid security token when trying to use this form."
7520
  msgstr ""
7521
 
7522
- #: lib/wordfenceClass.php:1824
7523
  msgid "Please wait 3 minutes and try again"
7524
  msgstr ""
7525
 
7526
- #: lib/wordfenceClass.php:1825
7527
  msgid "You have used this form too much. Please wait 3 minutes and try again."
7528
  msgstr ""
7529
 
7530
- #: lib/wordfenceClass.php:1864
7531
  msgid "Unlock email requested"
7532
  msgstr ""
7533
 
7534
- #: lib/wordfenceClass.php:1866
7535
  msgid "Your request was received"
7536
  msgstr ""
7537
 
7538
  #. translators: Email address.
7539
- #: lib/wordfenceClass.php:1867
7540
  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."
7541
  msgstr ""
7542
 
7543
- #: lib/wordfenceClass.php:1873
7544
  msgid "Invalid key provided for authentication."
7545
  msgstr ""
7546
 
7547
- #: lib/wordfenceClass.php:1884
7548
  msgid "Request received via unlock email link to unblock all IPs."
7549
  msgstr ""
7550
 
7551
- #: lib/wordfenceClass.php:1893
7552
  msgid "Request received via unlock email link to unblock all IPs via disabling firewall rules."
7553
  msgstr ""
7554
 
7555
- #: lib/wordfenceClass.php:1901
7556
  msgid "Invalid function specified. Please check the link we emailed you and make sure it was not cut-off by your email reader."
7557
  msgstr ""
7558
 
7559
- #: lib/wordfenceClass.php:1946
7560
  msgid "Unsubscribe Requested"
7561
  msgstr ""
7562
 
7563
- #: lib/wordfenceClass.php:2008
7564
  msgid "An error occurred while saving the license."
7565
  msgstr ""
7566
 
7567
  #. translators: Error message.
7568
- #: lib/wordfenceClass.php:2010
7569
- #: lib/wordfenceClass.php:2030
7570
  msgid "An error occurred while saving the license: %s"
7571
  msgstr ""
7572
 
7573
- #: lib/wordfenceClass.php:2046
7574
  msgid "Rescheduled missing daily cron"
7575
  msgstr ""
7576
 
7577
- #: lib/wordfenceClass.php:2051
7578
  msgid "Rescheduled missing hourly cron"
7579
  msgstr ""
7580
 
7581
- #: lib/wordfenceClass.php:2363
7582
- #: lib/wordfenceClass.php:2367
7583
  msgid "Accessed a banned URL"
7584
  msgstr ""
7585
 
7586
- #: lib/wordfenceClass.php:2374
7587
- #: lib/wordfenceClass.php:2378
7588
  msgid "POST received with blank user-agent and referer"
7589
  msgstr ""
7590
 
7591
- #: lib/wordfenceClass.php:2512
7592
  msgid "<strong>ERROR</strong>: You can't register using that username"
7593
  msgstr ""
7594
 
7595
- #: lib/wordfenceClass.php:2552
7596
  msgid "Sorry, you are not allowed to list users."
7597
  msgstr ""
7598
 
7599
- #: lib/wordfenceClass.php:2559
7600
  msgid "Invalid user ID."
7601
  msgstr ""
7602
 
7603
- #: lib/wordfenceClass.php:2703
7604
  msgid "<strong>VERIFICATION FAILED</strong>: Two-factor authentication verification failed. Please try again."
7605
  msgstr ""
7606
 
7607
  #. translators: 1. WordPress username. 2. Password reset URL.
7608
  #. translators: 1. WordPress username. 2. Reset password URL.
7609
- #: lib/wordfenceClass.php:2710
7610
- #: lib/wordfenceClass.php:3160
7611
  msgid "<strong>ERROR</strong>: The username or password you entered is incorrect. <a href=\"%2$s\" title=\"Password Lost and Found\">Lost your password</a>?"
7612
  msgstr ""
7613
 
7614
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
7615
- #: lib/wordfenceClass.php:2720
7616
- #: lib/wordfenceClass.php:2856
7617
  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<span class=\"screen-reader-text\"> ("
7618
  msgstr ""
7619
 
7620
- #: lib/wordfenceClass.php:2744
7621
  msgid "<strong>INVALID CODE</strong>: Please sign in again and add a space, the letters <code>wf</code>, and the code from your authenticator app to the end of your password (e.g., <code>wf123456</code>)."
7622
  msgstr ""
7623
 
7624
- #: lib/wordfenceClass.php:2748
7625
  msgid "<strong>INVALID CODE</strong>: Please sign in again and add a space, the letters <code>wf</code>, and the code sent to your phone to the end of your password (e.g., <code>wf123456</code>)."
7626
  msgstr ""
7627
 
7628
- #: lib/wordfenceClass.php:2755
7629
- #: lib/wordfenceClass.php:2806
7630
- #: lib/wordfenceClass.php:2829
7631
  msgid "<strong>AUTHENTICATION FAILURE</strong>: A temporary failure was encountered while trying to log in. Please try again."
7632
  msgstr ""
7633
 
7634
- #: lib/wordfenceClass.php:2765
7635
  msgid "<strong>INVALID CODE</strong>: You need to enter the code generated by your authenticator app. The code should be a six digit number (e.g., 123456)."
7636
  msgstr ""
7637
 
7638
- #: lib/wordfenceClass.php:2769
7639
  msgid "<strong>INVALID CODE</strong>: You need to enter the code generated sent to your phone. The code should be a six digit number (e.g., 123456)."
7640
  msgstr ""
7641
 
7642
- #: lib/wordfenceClass.php:2815
7643
  msgid "<strong>CODE EXPIRED. CHECK YOUR PHONE:</strong> The code you entered has expired. Codes are only valid for 30 minutes for security reasons. We have sent you a new code. Please sign in using your username, password, and the new code we sent you."
7644
  msgstr ""
7645
 
7646
- #: lib/wordfenceClass.php:2838
7647
  msgid "<strong>INVALID CODE</strong>: You need to enter your password and the code we sent to your phone. The code should start with 'wf' and should be four characters (e.g., wfAB12)."
7648
  msgstr ""
7649
 
7650
- #: lib/wordfenceClass.php:2889
7651
  msgid "<strong>CODE REQUIRED</strong>: Please check your authenticator app for the current code. Enter it below to sign in."
7652
  msgstr ""
7653
 
7654
- #: lib/wordfenceClass.php:2894
7655
  msgid "<strong>CODE REQUIRED</strong>: Please check your authenticator app for the current code. Please sign in again and add a space, the letters <code>wf</code>, and the code to the end of your password (e.g., <code>wf123456</code>)."
7656
  msgstr ""
7657
 
7658
- #: lib/wordfenceClass.php:2928
7659
- #: lib/wordfenceClass.php:2985
7660
  msgid "<strong>CHECK YOUR PHONE</strong>: A code has been sent to your phone and will arrive within 30 seconds. Enter it below to sign in."
7661
  msgstr ""
7662
 
7663
- #: lib/wordfenceClass.php:2933
7664
  msgid "<strong>CHECK YOUR PHONE</strong>: A code has been sent to your phone and will arrive within 30 seconds. Please sign in again and add a space, the letters <code>wf</code>, and the code to the end of your password (e.g., <code>wf123456</code>)."
7665
  msgstr ""
7666
 
7667
- #: lib/wordfenceClass.php:2990
7668
  msgid "<strong>CHECK YOUR PHONE</strong>: A code has been sent to your phone and will arrive within 30 seconds. Please sign in again and add a space and the code to the end of your password (e.g., <code>wfABCD</code>)."
7669
  msgstr ""
7670
 
7671
  #. translators: 1. Reset password URL. 2. Support URL.
7672
- #: lib/wordfenceClass.php:3011
7673
- #: lib/wordfenceClass.php:3047
7674
  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<span class=\"screen-reader-text\"> ("
7675
  msgstr ""
7676
 
7677
  #. translators: 1. Reset password URL. 2. Support URL.
7678
- #: lib/wordfenceClass.php:3028
7679
- #: lib/wordfenceClass.php:3064
7680
  msgid "<strong>INSECURE PASSWORD:</strong> Your login attempt has been blocked because 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\">reset your password</a> to reactivate your account. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span style=\"font-size:0;\"> (opens in new tab)</span></a>"
7681
  msgstr ""
7682
 
7683
- #: lib/wordfenceClass.php:3036
7684
  msgid "Admin Login Blocked"
7685
  msgstr ""
7686
 
7687
  #. translators: WordPress username.
7688
- #: lib/wordfenceClass.php:3036
7689
  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."
7690
  msgstr ""
7691
 
7692
  #. translators: WordPress username.
7693
- #: lib/wordfenceClass.php:3037
7694
  msgid "<strong>Cellphone Sign-in Required</strong>: Cellphone Sign-in is required for all administrator accounts. Please contact the site administrator to enable it for your account."
7695
  msgstr ""
7696
 
7697
- #: lib/wordfenceClass.php:3077
7698
  msgid "Blocked by Wordfence Security Network"
7699
  msgstr ""
7700
 
7701
- #: lib/wordfenceClass.php:3107
7702
  msgid "Blocked by login security setting"
7703
  msgstr ""
7704
 
7705
  #. translators: WordPress username.
7706
- #: lib/wordfenceClass.php:3117
7707
  msgid "Used an invalid username '%s' to try to sign in"
7708
  msgstr ""
7709
 
7710
  #. translators: 1. Login attempt limit. 2. WordPress username.
7711
- #: lib/wordfenceClass.php:3136
7712
  msgid "Exceeded the maximum number of login failures which is: %1$s. The last username they tried to sign in with was: '%2$s'"
7713
  msgstr ""
7714
 
7715
- #: lib/wordfenceClass.php:3493
7716
  msgid "An invalid type was specified to get file."
7717
  msgstr ""
7718
 
7719
- #: lib/wordfenceClass.php:3509
7720
  msgid "We could not fetch a core WordPress file from the Wordfence API."
7721
  msgstr ""
7722
 
7723
- #: lib/wordfenceClass.php:3568
7724
  msgid "Wordfence Test Email"
7725
  msgstr ""
7726
 
7727
  #. translators: 1. Site URL. 2. IP address.
7728
- #: lib/wordfenceClass.php:3568
7729
  msgid ""
7730
  "This is a test email from %1$s.\n"
7731
  "The IP address that requested this was: %2$s"
7732
  msgstr ""
7733
 
7734
- #: lib/wordfenceClass.php:3575
7735
  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.<span class=\"screen-reader-text\"> ("
7736
  msgstr ""
7737
 
7738
- #: lib/wordfenceClass.php:3582
7739
  msgid "The username you specified does not exist."
7740
  msgstr ""
7741
 
7742
- #: lib/wordfenceClass.php:3591
7743
  msgid "The username you specified is already enabled."
7744
  msgstr ""
7745
 
7746
- #: lib/wordfenceClass.php:3596
7747
  msgid "Unknown authentication mode."
7748
  msgstr ""
7749
 
7750
- #: lib/wordfenceClass.php:3601
7751
  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"
7752
  msgstr ""
7753
 
7754
  #. translators: Error message.
7755
- #: lib/wordfenceClass.php:3608
7756
- #: lib/wordfenceClass.php:3640
7757
- #: lib/wordfenceClass.php:3703
7758
  msgid "Could not contact Wordfence servers to generate a verification code: %s"
7759
  msgstr ""
7760
 
7761
  #. translators: Error message.
7762
- #: lib/wordfenceClass.php:3620
7763
- #: lib/wordfenceClass.php:3664
7764
  msgid "Could not generate verification code: %s"
7765
  msgstr ""
7766
 
7767
  #. translators: Error message.
7768
- #: lib/wordfenceClass.php:3621
7769
- #: lib/wordfenceClass.php:3665
7770
  msgid "We could not generate a verification code."
7771
  msgstr ""
7772
 
7773
- #: lib/wordfenceClass.php:3681
7774
  msgid "Unknown two-factor authentication mode."
7775
  msgstr ""
7776
 
7777
- #: lib/wordfenceClass.php:3714
7778
  msgid "The code you entered is invalid. Cellphone sign-in will not be enabled for this user until you enter a valid code."
7779
  msgstr ""
7780
 
7781
- #: lib/wordfenceClass.php:3719
7782
  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."
7783
  msgstr ""
7784
 
7785
- #: lib/wordfenceClass.php:3801
7786
  msgid "That user has already been removed from the list."
7787
  msgstr ""
7788
 
7789
- #: lib/wordfenceClass.php:3821
7790
  msgid "No scan is scheduled"
7791
  msgstr ""
7792
 
7793
- #: lib/wordfenceClass.php:3826
7794
  msgid "Next scan is starting now"
7795
  msgstr ""
7796
 
7797
  #. translators: 1. Time until. 2. Localized date.
7798
- #: lib/wordfenceClass.php:3829
7799
  msgid "Next scan in %1$s (%2$s)"
7800
  msgstr ""
7801
 
7802
  #. translators: Localized date.
7803
- #: lib/wordfenceClass.php:3846
7804
  msgid "Scheduled Wordfence scan starting at %s"
7805
  msgstr ""
7806
 
7807
- #: lib/wordfenceClass.php:3869
7808
  msgid "Sorry but this feature is only available for paid customers."
7809
  msgstr ""
7810
 
7811
  #. translators: Site URL.
7812
- #: lib/wordfenceClass.php:3883
7813
  msgid "SITE: %s"
7814
  msgstr ""
7815
 
7816
  #. translators: Plugin version.
7817
- #: lib/wordfenceClass.php:3884
7818
  msgid "PLUGIN VERSION: %s"
7819
  msgstr ""
7820
 
7821
  #. translators: WordPress version.
7822
- #: lib/wordfenceClass.php:3885
7823
  msgid "WORDPRESS VERSION: %s"
7824
  msgstr ""
7825
 
7826
  #. translators: Wordfence license key.
7827
- #: lib/wordfenceClass.php:3886
7828
  msgid "LICENSE KEY: %s"
7829
  msgstr ""
7830
 
7831
  #. translators: Email address.
7832
- #: lib/wordfenceClass.php:3887
7833
  msgid "ADMIN EMAIL: %s"
7834
  msgstr ""
7835
 
7836
  #. translators: Email address.
7837
- #: lib/wordfenceClass.php:3888
7838
  msgid "LOG:"
7839
  msgstr ""
7840
 
7841
- #: lib/wordfenceClass.php:3904
7842
  msgid "# Scan Issues"
7843
  msgstr ""
7844
 
7845
  #. translators: Number of scan results.
7846
- #: lib/wordfenceClass.php:3909
7847
  msgid "## New Issues (%d total)"
7848
  msgstr ""
7849
 
7850
  #. translators: Number of scan results.
7851
- #: lib/wordfenceClass.php:3936
7852
  msgid "## Ignored Issues (%d total)"
7853
  msgstr ""
7854
 
7855
- #: lib/wordfenceClass.php:3957
7856
  msgid "No Ignored Issues"
7857
  msgstr ""
7858
 
7859
- #: lib/wordfenceClass.php:3979
7860
  msgid "Wordfence Activity Log"
7861
  msgstr ""
7862
 
7863
  #. translators: Error message.
7864
- #: lib/wordfenceClass.php:4005
7865
  msgid "Could not fetch free license key from Wordfence: %s"
7866
  msgstr ""
7867
 
7868
- #: lib/wordfenceClass.php:4096
7869
  msgid "We could not find your .htaccess file to modify it."
7870
  msgstr ""
7871
 
7872
  #. translators: Error message.
7873
- #: lib/wordfenceClass.php:4101
7874
  msgid "We found your .htaccess file but could not open it for writing: %s"
7875
  msgstr ""
7876
 
7877
- #: lib/wordfenceClass.php:4184
7878
  msgid "All Countries"
7879
  msgstr ""
7880
 
7881
- #: lib/wordfenceClass.php:4187
7882
  msgid "1 Country"
7883
  msgstr ""
7884
 
7885
  #. translators: Number of countries.
7886
- #: lib/wordfenceClass.php:4190
7887
  msgid "%d Countries"
7888
  msgstr ""
7889
 
7890
- #: lib/wordfenceClass.php:4194
7891
  msgid "Entire Site"
7892
  msgstr ""
7893
 
7894
- #: lib/wordfenceClass.php:4197
7895
  msgid "Login Only"
7896
  msgstr ""
7897
 
7898
- #: lib/wordfenceClass.php:4200
7899
  msgid "Site Except Login"
7900
  msgstr ""
7901
 
7902
- #: lib/wordfenceClass.php:4208
7903
  msgid "IP Range"
7904
  msgstr ""
7905
 
7906
  #. translators: 2FA backup codes.
7907
- #: lib/wordfenceClass.php:4209
7908
- #: lib/wordfenceClass.php:6165
7909
  msgid "User Agent"
7910
  msgstr ""
7911
 
7912
- #: lib/wordfenceClass.php:4210
7913
  #: views/blocking/blocking-create.php:201
7914
  msgid "Referrer"
7915
  msgstr ""
7916
 
7917
- #: lib/wordfenceClass.php:4225
7918
  msgid "Permanent"
7919
  msgstr ""
7920
 
7921
- #: lib/wordfenceClass.php:4297
7922
  msgid "An error occurred while creating the block."
7923
  msgstr ""
7924
 
7925
- #: lib/wordfenceClass.php:4303
7926
  msgid "No block parameters were provided."
7927
  msgstr ""
7928
 
7929
- #: lib/wordfenceClass.php:4340
7930
- #: lib/wordfenceClass.php:4372
7931
  msgid "No blocks were provided."
7932
  msgstr ""
7933
 
7934
- #: lib/wordfenceClass.php:4404
7935
  msgid "The license provided is already in use on another site."
7936
  msgstr ""
7937
 
7938
- #: lib/wordfenceClass.php:4409
7939
  msgid "The Wordfence activation server returned an unexpected response. Please try again."
7940
  msgstr ""
7941
 
7942
- #: lib/wordfenceClass.php:4415
7943
  msgid "We received an error while trying to activate the license with the Wordfence servers: "
7944
  msgstr ""
7945
 
7946
- #: lib/wordfenceClass.php:4428
7947
  msgid "No license was provided to install."
7948
  msgstr ""
7949
 
7950
- #: lib/wordfenceClass.php:4479
7951
  msgid "An unknown configuration section was provided."
7952
  msgstr ""
7953
 
7954
- #: lib/wordfenceClass.php:4485
7955
  msgid "No configuration section was provided."
7956
  msgstr ""
7957
 
7958
- #: lib/wordfenceClass.php:4531
7959
- #: lib/wordfenceClass.php:4536
7960
  msgid "An error occurred while saving the configuration."
7961
  msgstr ""
7962
 
7963
- #: lib/wordfenceClass.php:4547
7964
  msgid "No configuration changes were provided to save."
7965
  msgstr ""
7966
 
7967
- #: lib/wordfenceClass.php:4578
7968
- #: lib/wordfenceClass.php:5203
7969
- #: lib/wordfenceClass.php:5234
7970
- #: lib/wordfenceClass.php:7279
7971
- #: lib/wordfenceClass.php:7314
7972
- #: lib/wordfenceClass.php:7346
7973
  msgid "We could not find that issue in our database."
7974
  msgstr ""
7975
 
7976
- #: lib/wordfenceClass.php:4588
7977
  msgid "An error occurred while trying to hide the file."
7978
  msgstr ""
7979
 
7980
- #: lib/wordfenceClass.php:4601
7981
  msgid "An invalid file was requested for hiding."
7982
  msgstr ""
7983
 
7984
- #: lib/wordfenceClass.php:4628
7985
- #: lib/wordfenceClass.php:5214
7986
  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."
7987
  msgstr ""
7988
 
7989
- #: lib/wordfenceClass.php:4652
7990
  msgid "Manual permanent block by admin"
7991
  msgstr ""
7992
 
7993
- #: lib/wordfenceClass.php:4688
7994
  msgid "Please enter a valid IP address to block."
7995
  msgstr ""
7996
 
7997
- #: lib/wordfenceClass.php:4691
7998
  msgid "You can't block your own IP address."
7999
  msgstr ""
8000
 
8001
  #. translators: IP address.
8002
- #: lib/wordfenceClass.php:4695
8003
  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."
8004
  msgstr ""
8005
 
8006
  #. translators: IP address.
8007
- #: lib/wordfenceClass.php:4697
8008
  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."
8009
  msgstr ""
8010
 
8011
- #: lib/wordfenceClass.php:4703
8012
  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."
8013
  msgstr ""
8014
 
8015
- #: lib/wordfenceClass.php:4746
8016
  msgid "An invalid operation was called."
8017
  msgstr ""
8018
 
8019
- #: lib/wordfenceClass.php:4756
8020
  msgid "An invalid status was specified when trying to update that issue."
8021
  msgstr ""
8022
 
8023
- #: lib/wordfenceClass.php:4768
8024
  msgid "Scan stop request received."
8025
  msgstr ""
8026
 
8027
- #: lib/wordfenceClass.php:4769
8028
  msgid "A request was received to stop the previous scan."
8029
  msgstr ""
8030
 
8031
- #: lib/wordfenceClass.php:4818
8032
  msgid "Idle"
8033
  msgstr ""
8034
 
8035
  #. translators: Localized date.
8036
- #: lib/wordfenceClass.php:4827
8037
  msgid "Scan completed on %s"
8038
  msgstr ""
8039
 
8040
- #: lib/wordfenceClass.php:4834
8041
  msgid "Last scan failed"
8042
  msgstr ""
8043
 
8044
  #. translators: Time until.
8045
- #: lib/wordfenceClass.php:4897
8046
  msgid "more than %s"
8047
  msgstr ""
8048
 
8049
  #. translators: Localized date.
8050
- #: lib/wordfenceClass.php:4901
8051
  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."
8052
  msgstr ""
8053
 
8054
  #. translators: Localized date.
8055
- #: lib/wordfenceClass.php:4901
8056
- #: lib/wordfenceClass.php:4909
8057
- #: lib/wordfenceClass.php:4928
8058
- #: lib/wordfenceClass.php:4940
8059
- #: lib/wordfenceClass.php:4948
8060
  msgid "Click here for steps you can try."
8061
  msgstr ""
8062
 
8063
  #. translators: Localized date.
8064
- #: lib/wordfenceClass.php:4902
8065
  msgid "Cancel Scan"
8066
  msgstr ""
8067
 
8068
- #: lib/wordfenceClass.php:4909
8069
  msgid "The previous scan has failed. Some sites may need adjustments to run scans reliably."
8070
  msgstr ""
8071
 
8072
  #. translators: Time limit (number).
8073
- #: lib/wordfenceClass.php:4915
8074
  msgid "The previous scan has terminated because the time limit of %s was reached. This limit can be customized on the options page."
8075
  msgstr ""
8076
 
8077
- #: lib/wordfenceClass.php:4921
8078
  msgid "The previous scan has terminated because we detected an update occurring during the scan."
8079
  msgstr ""
8080
 
8081
- #: lib/wordfenceClass.php:4928
8082
  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."
8083
  msgstr ""
8084
 
8085
- #: lib/wordfenceClass.php:4934
8086
  msgid "Scans are not functional because SSL is unavailable."
8087
  msgstr ""
8088
 
8089
- #: lib/wordfenceClass.php:4940
8090
  msgid "The scan has failed because we were unable to contact the Wordfence servers. Some sites may need adjustments to run scans reliably."
8091
  msgstr ""
8092
 
8093
- #: lib/wordfenceClass.php:4948
8094
  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."
8095
  msgstr ""
8096
 
8097
- #: lib/wordfenceClass.php:4975
8098
  msgid "Invalid email address given."
8099
  msgstr ""
8100
 
8101
- #: lib/wordfenceClass.php:5000
8102
- #: lib/wordfenceClass.php:5125
8103
  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."
8104
  msgstr ""
8105
 
8106
  #. translators: 1. File path. 2. Error message.
8107
- #: lib/wordfenceClass.php:5009
8108
  msgid "Could not delete file %1$s. Error was: %2$s"
8109
  msgstr ""
8110
 
8111
  #. translators: File path.
8112
- #: lib/wordfenceClass.php:5033
8113
  msgid "We could not retrieve the original file of %s to do a repair."
8114
  msgstr ""
8115
 
8116
  #. translators: File path.
8117
- #: lib/wordfenceClass.php:5038
8118
  msgid "An invalid file %s was specified for repair."
8119
  msgstr ""
8120
 
8121
  #. translators: File path.
8122
- #: lib/wordfenceClass.php:5046
8123
  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."
8124
  msgstr ""
8125
 
8126
  #. translators: 1. File path. 2. Error message.
8127
- #: lib/wordfenceClass.php:5049
8128
  msgid "We could not write to %1$s. The error was: %2$s"
8129
  msgstr ""
8130
 
8131
  #. translators: 1. File path. 2. Number of bytes.
8132
- #: lib/wordfenceClass.php:5060
8133
  msgid "We could not write to %1$s. (%2$d bytes written) You may not have permission to modify files on your WordPress server."
8134
  msgstr ""
8135
 
8136
- #: lib/wordfenceClass.php:5072
8137
  msgid "Deleted some files with errors"
8138
  msgstr ""
8139
 
8140
- #: lib/wordfenceClass.php:5072
8141
  msgid "Repaired some files with errors"
8142
  msgstr ""
8143
 
8144
  #. translators: 1. Number of files. 2. Error message.
8145
- #: lib/wordfenceClass.php:5075
8146
  msgid "Deleted %1$d files but we encountered the following errors with other files: %2$s"
8147
  msgstr ""
8148
 
8149
  #. translators: 1. Number of files. 2. Error message.
8150
- #: lib/wordfenceClass.php:5077
8151
  msgid "Repaired %1$d files but we encountered the following errors with other files: %2$s"
8152
  msgstr ""
8153
 
8154
  #. translators: Number of files.
8155
- #: lib/wordfenceClass.php:5081
8156
  msgid "Deleted %d files successfully"
8157
  msgstr ""
8158
 
8159
  #. translators: Number of files.
8160
- #: lib/wordfenceClass.php:5081
8161
  msgid "Repaired %d files successfully"
8162
  msgstr ""
8163
 
8164
  #. translators: Number of files.
8165
- #: lib/wordfenceClass.php:5082
8166
  msgid "Deleted %d files successfully. No errors were encountered."
8167
  msgstr ""
8168
 
8169
  #. translators: Number of files.
8170
- #: lib/wordfenceClass.php:5082
8171
  msgid "Repaired %d files successfully. No errors were encountered."
8172
  msgstr ""
8173
 
8174
- #: lib/wordfenceClass.php:5085
8175
  msgid "Could not delete files"
8176
  msgstr ""
8177
 
8178
- #: lib/wordfenceClass.php:5085
8179
  msgid "Could not repair files"
8180
  msgstr ""
8181
 
8182
  #. translators: Error message.
8183
- #: lib/wordfenceClass.php:5088
8184
  msgid "We could not delete any of the files you selected. We encountered the following errors: %s"
8185
  msgstr ""
8186
 
8187
  #. translators: Error message.
8188
- #: lib/wordfenceClass.php:5090
8189
  msgid "We could not repair any of the files you selected. We encountered the following errors: %s"
8190
  msgstr ""
8191
 
8192
- #: lib/wordfenceClass.php:5093
8193
  msgid "Nothing done"
8194
  msgstr ""
8195
 
8196
- #: lib/wordfenceClass.php:5094
8197
  msgid "We didn't delete anything and no errors were found."
8198
  msgstr ""
8199
 
8200
- #: lib/wordfenceClass.php:5094
8201
  msgid "We didn't repair anything and no errors were found."
8202
  msgstr ""
8203
 
8204
- #: lib/wordfenceClass.php:5102
8205
  msgid "Invalid bulk operation selected"
8206
  msgstr ""
8207
 
8208
- #: lib/wordfenceClass.php:5112
8209
  msgid "Could not delete file because we could not find that issue."
8210
  msgstr ""
8211
 
8212
- #: lib/wordfenceClass.php:5115
8213
  msgid "Could not delete file because that issue does not appear to be a file related issue."
8214
  msgstr ""
8215
 
8216
- #: lib/wordfenceClass.php:5121
8217
  msgid "An invalid file was requested for deletion."
8218
  msgstr ""
8219
 
8220
  #. translators: 1. File path. 2. Error message.
8221
- #: lib/wordfenceClass.php:5164
8222
  msgid "Could not delete file %1$s. The error was: %2$s"
8223
  msgstr ""
8224
 
8225
- #: lib/wordfenceClass.php:5177
8226
  msgid "Could not remove the option because we could not find that issue."
8227
  msgstr ""
8228
 
8229
- #: lib/wordfenceClass.php:5180
8230
  msgid "Could not remove the option because that issue does not appear to be a database related issue."
8231
  msgstr ""
8232
 
8233
  #. translators: 1. WordPress option. 2. Error message.
8234
- #: lib/wordfenceClass.php:5193
8235
  msgid "Could not remove the option %1$s. The error was: %2$s"
8236
  msgstr ""
8237
 
8238
- #: lib/wordfenceClass.php:5220
8239
  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."
8240
  msgstr ""
8241
 
8242
- #: lib/wordfenceClass.php:5262
8243
  msgid "We could not get the original file to do a repair."
8244
  msgstr ""
8245
 
8246
- #: lib/wordfenceClass.php:5266
8247
  msgid "An invalid file was specified for repair."
8248
  msgstr ""
8249
 
8250
- #: lib/wordfenceClass.php:5281
8251
  msgid "We could not write to that file. You may not have permission to modify files on your WordPress server."
8252
  msgstr ""
8253
 
8254
- #: lib/wordfenceClass.php:5285
8255
  msgid "Ajax request received to start scan."
8256
  msgstr ""
8257
 
8258
  #. translators: Number of URLs.
8259
- #: lib/wordfenceClass.php:5340
8260
  msgid "Page contains %d malware URL: "
8261
  msgid_plural "Page contains %d malware URLs: "
8262
  msgstr[0] ""
8263
  msgstr[1] ""
8264
 
8265
- #: lib/wordfenceClass.php:5343
8266
  msgid "Run a Scan"
8267
  msgstr ""
8268
 
8269
- #: lib/wordfenceClass.php:5391
8270
  msgid "Unknown dashboard data set."
8271
  msgstr ""
8272
 
8273
- #: lib/wordfenceClass.php:5422
8274
  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."
8275
  msgstr ""
8276
 
8277
- #: lib/wordfenceClass.php:5609
8278
  msgid "An invalid IP address was specified."
8279
  msgstr ""
8280
 
8281
- #: lib/wordfenceClass.php:5662
8282
- #: lib/wordfenceClass.php:5702
8283
- #: lib/wordfenceClass.php:5740
 
 
 
 
8284
  msgid "File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)"
8285
  msgstr ""
8286
 
8287
- #: lib/wordfenceClass.php:5667
8288
- #: lib/wordfenceClass.php:5745
8289
  msgid "Invalid file requested. (Relative paths not allowed)"
8290
  msgstr ""
8291
 
8292
- #: lib/wordfenceClass.php:5671
8293
- #: lib/wordfenceClass.php:5706
8294
- #: lib/wordfenceClass.php:5749
8295
  msgid "File contains illegal characters."
8296
  msgstr ""
8297
 
8298
  #. translators: Error message.
8299
- #: lib/wordfenceClass.php:5681
8300
  msgid "We could not open the requested file for reading. The error was: %s"
8301
  msgstr ""
8302
 
8303
- #: lib/wordfenceClass.php:5689
8304
  msgid "Greater than 2 Gigs"
8305
  msgstr ""
8306
 
8307
- #: lib/wordfenceClass.php:5694
8308
  msgid "Unknown file size."
8309
  msgstr ""
8310
 
8311
- #: lib/wordfenceClass.php:5715
8312
  msgid "We could not get the contents of the original file to do a comparison."
8313
  msgstr ""
8314
 
8315
- #: lib/wordfenceClass.php:5753
 
 
 
 
 
 
 
 
8316
  msgid "File does not exist."
8317
  msgstr ""
8318
 
8319
- #: lib/wordfenceClass.php:6007
8320
  #: views/dashboard/options-group-import.php:167
8321
  msgid "Reload"
8322
  msgstr ""
8323
 
8324
- #: lib/wordfenceClass.php:6024
8325
  msgid "${totalIPs} addresses in this network"
8326
  msgstr ""
8327
 
8328
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
8329
- #: lib/wordfenceClass.php:6025
8330
  msgid "%s in POST body: %s"
8331
  msgstr ""
8332
 
8333
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
8334
- #: lib/wordfenceClass.php:6026
8335
  msgid "%s in cookie: %s"
8336
  msgstr ""
8337
 
8338
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
8339
- #: lib/wordfenceClass.php:6027
8340
  msgid "%s in file: %s"
8341
  msgstr ""
8342
 
8343
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
8344
- #: lib/wordfenceClass.php:6028
8345
  msgid "%s in query string: %s"
8346
  msgstr ""
8347
 
8348
  #. translators: Domain name.
8349
- #: lib/wordfenceClass.php:6029
8350
  msgid "%s is not valid hostname"
8351
  msgstr ""
8352
 
8353
  #. translators: Domain name.
8354
- #: lib/wordfenceClass.php:6030
8355
  msgid ".htaccess Updated"
8356
  msgstr ""
8357
 
8358
- #: lib/wordfenceClass.php:6031
8359
  msgid ".htaccess change"
8360
  msgstr ""
8361
 
8362
- #: lib/wordfenceClass.php:6032
8363
  msgid "404 Not Found"
8364
  msgstr ""
8365
 
8366
- #: lib/wordfenceClass.php:6033
8367
  msgid "Activity Log Sent"
8368
  msgstr ""
8369
 
8370
- #: lib/wordfenceClass.php:6034
8371
  msgid "Add action to allowlist"
8372
  msgstr ""
8373
 
8374
- #: lib/wordfenceClass.php:6035
8375
  msgid "Add code to .htaccess"
8376
  msgstr ""
8377
 
8378
- #: lib/wordfenceClass.php:6036
8379
  msgid "All Hits"
8380
  msgstr ""
8381
 
8382
  #. translators: WordPress username.
8383
- #: lib/wordfenceClass.php:6037
8384
  msgid "All capabilties of admin user %s were successfully revoked."
8385
  msgstr ""
8386
 
8387
- #: lib/wordfenceClass.php:6039
8388
  msgid "An error occurred when adding the request to the allowlist."
8389
  msgstr ""
8390
 
8391
- #: lib/wordfenceClass.php:6040
8392
  msgid "Are you sure you want to allowlist this action?"
8393
  msgstr ""
8394
 
8395
- #: lib/wordfenceClass.php:6041
8396
  msgid "Authentication Code"
8397
  msgstr ""
8398
 
8399
- #: lib/wordfenceClass.php:6042
8400
  msgid "Background Request Blocked"
8401
  msgstr ""
8402
 
8403
- #: lib/wordfenceClass.php:6043
8404
  msgid "Block This Network"
8405
  msgstr ""
8406
 
8407
- #: lib/wordfenceClass.php:6045
8408
  msgid "Blocked By Firewall"
8409
  msgstr ""
8410
 
8411
- #: lib/wordfenceClass.php:6046
8412
  msgid "Blocked WAF"
8413
  msgstr ""
8414
 
8415
- #: lib/wordfenceClass.php:6047
8416
  msgid "Blocked by Wordfence"
8417
  msgstr ""
8418
 
8419
- #: lib/wordfenceClass.php:6048
8420
  msgid "Blocked by Wordfence plugin settings"
8421
  msgstr ""
8422
 
8423
- #: lib/wordfenceClass.php:6049
8424
  msgid "Blocked by the Wordfence Application Firewall and plugin settings"
8425
  msgstr ""
8426
 
8427
- #: lib/wordfenceClass.php:6050
8428
  msgid "Blocked by the Wordfence Security Network"
8429
  msgstr ""
8430
 
8431
- #: lib/wordfenceClass.php:6051
8432
  msgid "Blocked by the Wordfence Web Application Firewall"
8433
  msgstr ""
8434
 
8435
- #: lib/wordfenceClass.php:6054
8436
  msgid "Cellphone Sign-In Recovery Codes"
8437
  msgstr ""
8438
 
8439
- #: lib/wordfenceClass.php:6055
8440
  msgid "Cellphone Sign-in activated for user."
8441
  msgstr ""
8442
 
8443
- #: lib/wordfenceClass.php:6056
8444
  msgid "Click here to download a backup copy of this file now"
8445
  msgstr ""
8446
 
8447
- #: lib/wordfenceClass.php:6057
8448
  msgid "Click here to download a backup copy of your .htaccess file now"
8449
  msgstr ""
8450
 
8451
- #: lib/wordfenceClass.php:6058
8452
  msgid "Click to fix .htaccess"
8453
  msgstr ""
8454
 
8455
- #: lib/wordfenceClass.php:6060
8456
  msgid "Crawlers"
8457
  msgstr ""
8458
 
8459
- #: lib/wordfenceClass.php:6061
8460
  msgid "Diagnostic report has been sent successfully."
8461
  msgstr ""
8462
 
8463
- #: lib/wordfenceClass.php:6062
8464
  msgid "Directory Listing Disabled"
8465
  msgstr ""
8466
 
8467
- #: lib/wordfenceClass.php:6063
8468
  msgid "Directory listing has been disabled on your server."
8469
  msgstr ""
8470
 
8471
- #: lib/wordfenceClass.php:6066
8472
  msgid "Don't ask again"
8473
  msgstr ""
8474
 
8475
- #: lib/wordfenceClass.php:6068
8476
  msgid "Download Backup File"
8477
  msgstr ""
8478
 
8479
- #: lib/wordfenceClass.php:6069
8480
  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:"
8481
  msgstr ""
8482
 
8483
- #: lib/wordfenceClass.php:6070
8484
  msgid "Email Diagnostic Report"
8485
  msgstr ""
8486
 
8487
- #: lib/wordfenceClass.php:6071
8488
  msgid "Email Wordfence Activity Log"
8489
  msgstr ""
8490
 
8491
- #: lib/wordfenceClass.php:6073
8492
  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."
8493
  msgstr ""
8494
 
8495
- #: lib/wordfenceClass.php:6074
8496
  msgid "Error"
8497
  msgstr ""
8498
 
8499
- #: lib/wordfenceClass.php:6075
8500
  msgid "Error Enabling All Options Page"
8501
  msgstr ""
8502
 
8503
- #: lib/wordfenceClass.php:6076
8504
  msgid "Error Restoring Defaults"
8505
  msgstr ""
8506
 
8507
- #: lib/wordfenceClass.php:6077
8508
  msgid "Error Saving Option"
8509
  msgstr ""
8510
 
8511
- #: lib/wordfenceClass.php:6078
8512
  msgid "Error Saving Options"
8513
  msgstr ""
8514
 
8515
- #: lib/wordfenceClass.php:6079
8516
  msgid "Failed Login"
8517
  msgstr ""
8518
 
8519
- #: lib/wordfenceClass.php:6080
8520
  msgid "Failed Login: Invalid Username"
8521
  msgstr ""
8522
 
8523
- #: lib/wordfenceClass.php:6081
8524
  msgid "Failed Login: Valid Username"
8525
  msgstr ""
8526
 
8527
- #: lib/wordfenceClass.php:6082
8528
  msgid "File hidden successfully"
8529
  msgstr ""
8530
 
8531
- #: lib/wordfenceClass.php:6083
8532
  msgid "File restored OK"
8533
  msgstr ""
8534
 
8535
- #: lib/wordfenceClass.php:6084
8536
  msgid "Filter Traffic"
8537
  msgstr ""
8538
 
8539
- #: lib/wordfenceClass.php:6085
8540
  msgid "Firewall Response"
8541
  msgstr ""
8542
 
8543
- #: lib/wordfenceClass.php:6086
8544
  #: views/scanner/issue-wpscan_fullPathDiscl.php:8
8545
  msgid "Full Path Disclosure"
8546
  msgstr ""
8547
 
8548
- #: lib/wordfenceClass.php:6087
8549
  msgid "Google Bot"
8550
  msgstr ""
8551
 
8552
- #: lib/wordfenceClass.php:6088
8553
  msgid "Google Crawlers"
8554
  msgstr ""
8555
 
8556
- #: lib/wordfenceClass.php:6089
8557
  msgid "HTTP Response Code"
8558
  msgstr ""
8559
 
8560
- #: lib/wordfenceClass.php:6091
8561
  msgid "Humans"
8562
  msgstr ""
8563
 
8564
- #: lib/wordfenceClass.php:6093
8565
  msgid "Key:"
8566
  msgstr ""
8567
 
8568
  #. translators: Localized date.
8569
- #: lib/wordfenceClass.php:6094
8570
  msgid "Last Updated: %s"
8571
  msgstr ""
8572
 
8573
  #. translators: Localized date.
8574
- #: lib/wordfenceClass.php:6095
8575
  msgid "Learn more about repairing modified files."
8576
  msgstr ""
8577
 
8578
- #: lib/wordfenceClass.php:6097
8579
  msgid "Locked Out"
8580
  msgstr ""
8581
 
8582
- #: lib/wordfenceClass.php:6098
8583
  msgid "Locked out from logging in"
8584
  msgstr ""
8585
 
8586
- #: lib/wordfenceClass.php:6099
8587
  msgid "Logged In"
8588
  msgstr ""
8589
 
8590
- #: lib/wordfenceClass.php:6100
8591
  msgid "Logins"
8592
  msgstr ""
8593
 
8594
- #: lib/wordfenceClass.php:6101
8595
  msgid "Logins and Logouts"
8596
  msgstr ""
8597
 
8598
  #. translators: Localized date.
8599
- #: lib/wordfenceClass.php:6104
8600
  msgid "Next Update Check: %s"
8601
  msgstr ""
8602
 
8603
  #. translators: Localized date.
8604
- #: lib/wordfenceClass.php:6105
8605
  msgid "No activity to report yet. Please complete your first scan."
8606
  msgstr ""
8607
 
8608
- #: lib/wordfenceClass.php:6106
8609
  msgid "No issues have been ignored."
8610
  msgstr ""
8611
 
8612
- #: lib/wordfenceClass.php:6107
8613
  msgid "No new issues have been found."
8614
  msgstr ""
8615
 
8616
- #: lib/wordfenceClass.php:6108
8617
  msgid "No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory."
8618
  msgstr ""
8619
 
8620
- #: lib/wordfenceClass.php:6109
8621
  msgid "No rules were updated. Please verify your website can reach the Wordfence servers."
8622
  msgstr ""
8623
 
8624
- #: lib/wordfenceClass.php:6110
8625
  msgid "No rules were updated. Your website has reached the maximum number of rule update requests. Please try again later."
8626
  msgstr ""
8627
 
8628
- #: lib/wordfenceClass.php:6111
8629
  msgid "Note: Status will update when changes are saved"
8630
  msgstr ""
8631
 
8632
- #: lib/wordfenceClass.php:6112
8633
  msgid "OK"
8634
  msgstr ""
8635
 
8636
- #: lib/wordfenceClass.php:6113
8637
  msgid "Pages Not Found"
8638
  msgstr ""
8639
 
8640
- #: lib/wordfenceClass.php:6114
8641
  msgid "Paid Members Only"
8642
  msgstr ""
8643
 
8644
- #: lib/wordfenceClass.php:6116
8645
  msgid "Please enter a valid email address."
8646
  msgstr ""
8647
 
8648
- #: lib/wordfenceClass.php:6117
8649
  msgid "Please include your support ticket number or forum username."
8650
  msgstr ""
8651
 
8652
- #: lib/wordfenceClass.php:6118
8653
  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:"
8654
  msgstr ""
8655
 
8656
- #: lib/wordfenceClass.php:6119
8657
  msgid "Please specify a reason"
8658
  msgstr ""
8659
 
8660
- #: lib/wordfenceClass.php:6120
8661
  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."
8662
  msgstr ""
8663
 
8664
- #: lib/wordfenceClass.php:6121
8665
  msgid "Please specify either an IP address range, Hostname or a web browser pattern to match."
8666
  msgstr ""
8667
 
8668
- #: lib/wordfenceClass.php:6122
8669
  msgid "Recent Activity"
8670
  msgstr ""
8671
 
8672
- #: lib/wordfenceClass.php:6123
8673
  msgid "Recovery Codes"
8674
  msgstr ""
8675
 
8676
- #: lib/wordfenceClass.php:6124
8677
  msgid "Redirected"
8678
  msgstr ""
8679
 
8680
- #: lib/wordfenceClass.php:6125
8681
  msgid "Redirected by Country Blocking bypass URL"
8682
  msgstr ""
8683
 
8684
- #: lib/wordfenceClass.php:6126
8685
  msgid "Referer"
8686
  msgstr ""
8687
 
8688
- #: lib/wordfenceClass.php:6127
8689
  msgid "Registered Users"
8690
  msgstr ""
8691
 
8692
- #: lib/wordfenceClass.php:6129
8693
  msgid "Rule Update Failed"
8694
  msgstr ""
8695
 
8696
- #: lib/wordfenceClass.php:6130
8697
  msgid "Rules Updated"
8698
  msgstr ""
8699
 
8700
- #: lib/wordfenceClass.php:6132
8701
  msgid "Scan Complete."
8702
  msgstr ""
8703
 
8704
- #: lib/wordfenceClass.php:6133
8705
  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."
8706
  msgstr ""
8707
 
8708
- #: lib/wordfenceClass.php:6134
8709
  msgid "Security Event"
8710
  msgstr ""
8711
 
8712
- #: lib/wordfenceClass.php:6135
8713
  msgid "Send"
8714
  msgstr ""
8715
 
8716
- #: lib/wordfenceClass.php:6136
8717
  msgid "Sorry, but no data for that IP or domain was found."
8718
  msgstr ""
8719
 
8720
- #: lib/wordfenceClass.php:6137
8721
  msgid "Specify a valid IP range"
8722
  msgstr ""
8723
 
8724
- #: lib/wordfenceClass.php:6138
8725
  msgid "Specify a valid hostname"
8726
  msgstr ""
8727
 
8728
- #: lib/wordfenceClass.php:6139
8729
  msgid "Specify an IP range, Hostname or Browser pattern"
8730
  msgstr ""
8731
 
8732
- #: lib/wordfenceClass.php:6140
8733
  msgid "Success deleting file"
8734
  msgstr ""
8735
 
8736
- #: lib/wordfenceClass.php:6141
8737
  msgid "Success removing option"
8738
  msgstr ""
8739
 
8740
- #: lib/wordfenceClass.php:6142
8741
  msgid "Success restoring file"
8742
  msgstr ""
8743
 
8744
- #: lib/wordfenceClass.php:6143
8745
  msgid "Success updating option"
8746
  msgstr ""
8747
 
8748
- #: lib/wordfenceClass.php:6144
8749
  msgid "Successfully deleted admin"
8750
  msgstr ""
8751
 
8752
- #: lib/wordfenceClass.php:6145
8753
  msgid "Successfully revoked admin"
8754
  msgstr ""
8755
 
8756
- #: lib/wordfenceClass.php:6146
8757
  msgid "Test Email Sent"
8758
  msgstr ""
8759
 
8760
- #: lib/wordfenceClass.php:6147
8761
  msgid "The 'How does Wordfence get IPs' option was successfully updated to the recommended value."
8762
  msgstr ""
8763
 
8764
- #: lib/wordfenceClass.php:6148
8765
  msgid "The Full Path disclosure issue has been fixed"
8766
  msgstr ""
8767
 
8768
  #. translators: WordPress username.
8769
- #: lib/wordfenceClass.php:6149
8770
  msgid "The admin user %s was successfully deleted."
8771
  msgstr ""
8772
 
8773
  #. translators: File path.
8774
- #: lib/wordfenceClass.php:6150
8775
  msgid "The file %s was successfully deleted."
8776
  msgstr ""
8777
 
8778
  #. translators: File path.
8779
- #: lib/wordfenceClass.php:6151
8780
  msgid "The file %s was successfully hidden from public view."
8781
  msgstr ""
8782
 
8783
  #. translators: File path.
8784
- #: lib/wordfenceClass.php:6152
8785
  msgid "The file %s was successfully restored."
8786
  msgstr ""
8787
 
8788
  #. translators: WordPress option.
8789
- #: lib/wordfenceClass.php:6153
8790
  msgid "The option %s was successfully removed."
8791
  msgstr ""
8792
 
8793
  #. translators: WordPress option.
8794
- #: lib/wordfenceClass.php:6154
8795
  msgid "The request has been allowlisted. Please try it again."
8796
  msgstr ""
8797
 
8798
- #: lib/wordfenceClass.php:6155
8799
  msgid "There was an error while sending the email."
8800
  msgstr ""
8801
 
8802
- #: lib/wordfenceClass.php:6156
8803
  msgid "This will be shown only once. Keep these codes somewhere safe."
8804
  msgstr ""
8805
 
8806
- #: lib/wordfenceClass.php:6157
8807
  msgid "Throttled"
8808
  msgstr ""
8809
 
8810
- #: lib/wordfenceClass.php:6158
8811
  msgid "Two Factor Status"
8812
  msgstr ""
8813
 
8814
  #. translators: HTTP client type.
8815
- #: lib/wordfenceClass.php:6160
8816
  msgid "Type: %s"
8817
  msgstr ""
8818
 
8819
  #. translators: HTTP client type.
8820
- #: lib/wordfenceClass.php:6161
8821
  #: views/scanner/issue-checkGSB.php:8
8822
  #: views/scanner/issue-commentBadURL.php:8
8823
  #: views/scanner/issue-configReadable.php:12
@@ -8837,847 +8849,839 @@ msgstr ""
8837
  msgid "URL"
8838
  msgstr ""
8839
 
8840
- #: lib/wordfenceClass.php:6162
8841
  msgid "Unable to automatically hide file"
8842
  msgstr ""
8843
 
8844
  #. translators: 2FA backup codes.
8845
- #: lib/wordfenceClass.php:6163
8846
  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."
8847
  msgstr ""
8848
 
8849
  #. translators: 2FA backup codes.
8850
- #: lib/wordfenceClass.php:6164
8851
  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."
8852
  msgstr ""
8853
 
8854
- #: lib/wordfenceClass.php:6166
8855
  msgid "User ID"
8856
  msgstr ""
8857
 
8858
- #: lib/wordfenceClass.php:6168
8859
  msgid "WHOIS LOOKUP"
8860
  msgstr ""
8861
 
8862
- #: lib/wordfenceClass.php:6169
8863
  msgid "We are about to change your <em>.htaccess</em> file. Please make a backup of this file before proceeding."
8864
  msgstr ""
8865
 
8866
  #. translators: Error message.
8867
- #: lib/wordfenceClass.php:6170
8868
  msgid "We can't modify your .htaccess file for you because: %s"
8869
  msgstr ""
8870
 
8871
  #. translators: Error message.
8872
- #: lib/wordfenceClass.php:6171
8873
  msgid "We encountered a problem"
8874
  msgstr ""
8875
 
8876
  #. translators: URL.
8877
- #: lib/wordfenceClass.php:6172
8878
  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."
8879
  msgstr ""
8880
 
8881
  #. translators: URL.
8882
- #: lib/wordfenceClass.php:6173
8883
  msgid "Wordfence is working..."
8884
  msgstr ""
8885
 
8886
- #: lib/wordfenceClass.php:6174
8887
  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='https://nginx.org/en/docs/http/ngx_http_autoindex_module.html'>Nginx docs for more info</a> on how to do this."
8888
  msgstr ""
8889
 
8890
- #: lib/wordfenceClass.php:6175
8891
  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."
8892
  msgstr ""
8893
 
8894
- #: lib/wordfenceClass.php:6176
8895
  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>"
8896
  msgstr ""
8897
 
8898
- #: lib/wordfenceClass.php:6177
8899
  msgid "You forgot to include a reason you're blocking this IP range. We ask you to include this for your own record keeping."
8900
  msgstr ""
8901
 
8902
- #: lib/wordfenceClass.php:6178
8903
  msgid "You have unsaved changes to your options. If you leave this page, those changes will be lost."
8904
  msgstr ""
8905
 
8906
- #: lib/wordfenceClass.php:6179
8907
  msgid "Your .htaccess has been updated successfully. Please verify your site is functioning normally."
8908
  msgstr ""
8909
 
8910
  #. translators: Email address.
8911
- #: lib/wordfenceClass.php:6180
8912
  msgid "Your Wordfence activity log was sent to %s"
8913
  msgstr ""
8914
 
8915
  #. translators: Email address.
8916
- #: lib/wordfenceClass.php:6181
8917
  msgid "Your rules have been updated successfully."
8918
  msgstr ""
8919
 
8920
- #: lib/wordfenceClass.php:6182
8921
  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>"
8922
  msgstr ""
8923
 
8924
  #. translators: wp_mail() return value.
8925
- #: lib/wordfenceClass.php:6183
8926
  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."
8927
  msgstr ""
8928
 
8929
  #. translators: wp_mail() return value.
8930
- #: lib/wordfenceClass.php:6184
8931
  msgid "blocked by firewall"
8932
  msgstr ""
8933
 
8934
  #. translators: Reason for firewall action.
8935
- #: lib/wordfenceClass.php:6185
8936
  msgid "blocked by firewall for %s"
8937
  msgstr ""
8938
 
8939
  #. translators: Reason for firewall action.
8940
- #: lib/wordfenceClass.php:6186
8941
  msgid "blocked by real-time IP blocklist"
8942
  msgstr ""
8943
 
8944
- #: lib/wordfenceClass.php:6187
8945
  msgid "blocked by the Wordfence Security Network"
8946
  msgstr ""
8947
 
8948
  #. translators: Reason for firewall action.
8949
- #: lib/wordfenceClass.php:6188
8950
  msgid "blocked for %s"
8951
  msgstr ""
8952
 
8953
  #. translators: Reason for firewall action.
8954
- #: lib/wordfenceClass.php:6189
8955
  msgid "locked out from logging in"
8956
  msgstr ""
8957
 
8958
- #: lib/wordfenceClass.php:6202
8959
  msgid "Wordfence generated an error on activation. The output we received during activation was:"
8960
  msgstr ""
8961
 
8962
- #: lib/wordfenceClass.php:6209
8963
  msgid "Wordfence could not register with the Wordfence scanning servers when it activated."
8964
  msgstr ""
8965
 
8966
- #: lib/wordfenceClass.php:6210
8967
  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."
8968
  msgstr ""
8969
 
8970
- #: lib/wordfenceClass.php:6224
8971
  msgid "The Wordfence Web Application Firewall cannot run."
8972
  msgstr ""
8973
 
8974
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
8975
- #: lib/wordfenceClass.php:6227
8976
  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\"><span class=\"screen-reader-text\"> ("
8977
  msgstr ""
8978
 
8979
- #: lib/wordfenceClass.php:6233
8980
  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."
8981
  msgstr ""
8982
 
8983
- #: lib/wordfenceClass.php:6246
8984
- #: lib/wordfenceClass.php:6265
8985
  msgid "The Wordfence Web Application Firewall needs a configuration update."
8986
  msgstr ""
8987
 
8988
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
8989
- #: lib/wordfenceClass.php:6249
8990
  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\"><span class=\"screen-reader-text\"> ("
8991
  msgstr ""
8992
 
8993
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
8994
- #: lib/wordfenceClass.php:6268
8995
  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\"><span class=\"screen-reader-text\"> ("
8996
  msgstr ""
8997
 
8998
- #: lib/wordfenceClass.php:6274
8999
  msgid "The Wordfence Web Application Firewall is in read-only mode."
9000
  msgstr ""
9001
 
9002
- #: lib/wordfenceClass.php:6283
9003
  msgid "This site is currently using PHP's built in REMOTE_ADDR."
9004
  msgstr ""
9005
 
9006
- #: lib/wordfenceClass.php:6286
9007
  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."
9008
  msgstr ""
9009
 
9010
- #: lib/wordfenceClass.php:6289
9011
  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."
9012
  msgstr ""
9013
 
9014
- #: lib/wordfenceClass.php:6292
9015
  msgid "This site is currently using the Cloudflare \"CF-Connecting-IP\" HTTP header, which should only be used when the site is behind Cloudflare."
9016
  msgstr ""
9017
 
9018
- #: lib/wordfenceClass.php:6309
9019
  msgid "Your 'How does Wordfence get IPs' setting is misconfigured."
9020
  msgstr ""
9021
 
9022
- #: lib/wordfenceClass.php:6311
9023
  msgid "Click here to use the recommended setting"
9024
  msgstr ""
9025
 
9026
- #: lib/wordfenceClass.php:6313
9027
  #: views/onboarding/fresh-install.php:38
9028
  msgid "or"
9029
  msgstr ""
9030
 
9031
- #: lib/wordfenceClass.php:6315
9032
  msgid "visit the options page"
9033
  msgstr ""
9034
 
9035
- #: lib/wordfenceClass.php:6317
9036
  msgid "to manually update it."
9037
  msgstr ""
9038
 
9039
- #: lib/wordfenceClass.php:6325
9040
  msgid "Do you want Wordfence to stay up-to-date automatically?"
9041
  msgstr ""
9042
 
9043
- #: lib/wordfenceClass.php:6327
9044
  msgid "Yes, enable auto-update."
9045
  msgstr ""
9046
 
9047
- #: lib/wordfenceClass.php:6329
9048
  msgid "No thanks."
9049
  msgstr ""
9050
 
9051
- #: lib/wordfenceClass.php:6353
9052
  msgid "Wordfence country blocking is currently set to block the United States. We recommend allowing access from the United States for Google and other benign crawlers, unless you choose to only block the login page."
9053
  msgstr ""
9054
 
9055
  #. translators: Localized date.
9056
- #: lib/wordfenceClass.php:6462
9057
  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."
9058
  msgstr ""
9059
 
9060
  #. translators: 1. Localized date. 2. WordPress admin panel URL.
9061
- #: lib/wordfenceClass.php:6470
9062
  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."
9063
  msgstr ""
9064
 
9065
  #. translators: WordPress admin panel URL.
9066
- #: lib/wordfenceClass.php:6476
9067
  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."
9068
  msgstr ""
9069
 
9070
  #. translators: WordPress admin panel URL.
9071
- #: lib/wordfenceClass.php:6481
9072
  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."
9073
  msgstr ""
9074
 
9075
- #: lib/wordfenceClass.php:6484
9076
  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."
9077
  msgstr ""
9078
 
9079
- #: lib/wordfenceClass.php:6592
9080
  #: models/page/wfPage.php:101
9081
  msgid "Dashboard"
9082
  msgstr ""
9083
 
9084
- #: lib/wordfenceClass.php:6636
9085
  msgid "Upgrade to Care"
9086
  msgstr ""
9087
 
9088
- #: lib/wordfenceClass.php:6640
9089
  msgid "Upgrade to Response"
9090
  msgstr ""
9091
 
9092
  #. translators: Number of notifications.
9093
- #: lib/wordfenceClass.php:6685
9094
  msgid "You have %d new Wordfence notification."
9095
  msgid_plural "You have %d new Wordfence notifications."
9096
  msgstr[0] ""
9097
  msgstr[1] ""
9098
 
9099
- #: lib/wordfenceClass.php:6709
9100
  msgid "JavaScript Errors"
9101
  msgstr ""
9102
 
9103
- #: lib/wordfenceClass.php:6715
9104
  msgid "Malware URLs"
9105
  msgstr ""
9106
 
9107
  #. translators: WordPress admin panel URL.
9108
- #: lib/wordfenceClass.php:6833
9109
- #: lib/wordfenceClass.php:6896
9110
  msgid "<a href=\"%s\">Click here</a> to rebuild the configuration file."
9111
  msgstr ""
9112
 
9113
  #. translators: File path.
9114
- #: lib/wordfenceClass.php:6844
9115
- #: lib/wordfenceClass.php:6907
9116
  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."
9117
  msgstr ""
9118
 
9119
- #: lib/wordfenceClass.php:6854
9120
- #: lib/wordfenceClass.php:6917
9121
  msgid "An error occured when fetching the WAF configuration from the database."
9122
  msgstr ""
9123
 
9124
  #. translators: Plugin name.
9125
- #: lib/wordfenceClass.php:6939
9126
  msgid "The Wordfence Live Traffic feature has been disabled because you have %s active which is not compatible with Wordfence Live Traffic."
9127
  msgstr ""
9128
 
9129
  #. translators: 1. Plugin name.
9130
- #: lib/wordfenceClass.php:6941
9131
  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."
9132
  msgstr ""
9133
 
9134
  #. translators: File path.
9135
- #: lib/wordfenceClass.php:7002
9136
  msgid "The file <code>%s</code> was restored successfully."
9137
  msgstr ""
9138
 
9139
- #: lib/wordfenceClass.php:7007
9140
  msgid "There was an error restoring the file."
9141
  msgstr ""
9142
 
9143
- #: lib/wordfenceClass.php:7017
9144
- #: lib/wordfenceClass.php:7040
9145
  msgid "Return to scan results"
9146
  msgstr ""
9147
 
9148
  #. translators: File path.
9149
- #: lib/wordfenceClass.php:7026
9150
  msgid "The file <code>%s</code> was deleted successfully."
9151
  msgstr ""
9152
 
9153
- #: lib/wordfenceClass.php:7030
9154
  msgid "There was an error deleting the file."
9155
  msgstr ""
9156
 
9157
  #. translators: IP address.
9158
- #: lib/wordfenceClass.php:7098
9159
  msgid ""
9160
  "User IP: %s\n"
9161
  ""
9162
  msgstr ""
9163
 
9164
  #. translators: Domain name.
9165
- #: lib/wordfenceClass.php:7101
9166
  msgid ""
9167
  "User hostname: %s\n"
9168
  ""
9169
  msgstr ""
9170
 
9171
- #: lib/wordfenceClass.php:7105
9172
  msgid "User location: "
9173
  msgstr ""
9174
 
9175
  #. translators: WordPress admin panel URL.
9176
- #: lib/wordfenceClass.php:7160
9177
  msgid "No longer an administrator for this site? Click here to stop receiving security alerts: %s"
9178
  msgstr ""
9179
 
9180
- #: lib/wordfenceClass.php:7200
9181
  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]"
9182
  msgstr ""
9183
 
9184
- #: lib/wordfenceClass.php:7219
9185
  msgid "Invalid email address provided"
9186
  msgstr ""
9187
 
9188
- #: lib/wordfenceClass.php:7224
9189
  msgid "Test email sent successfully"
9190
  msgstr ""
9191
 
9192
- #: lib/wordfenceClass.php:7225
9193
  msgid "Test email failed to send"
9194
  msgstr ""
9195
 
9196
  #. translators: Localized date range.
9197
- #: lib/wordfenceClass.php:7243
9198
  msgid "Wordfence activity in the past %s"
9199
  msgstr ""
9200
 
9201
- #: lib/wordfenceClass.php:7283
9202
- #: lib/wordfenceClass.php:7287
9203
- #: lib/wordfenceClass.php:7318
9204
  msgid "We could not find that user in the database."
9205
  msgstr ""
9206
 
9207
- #: lib/wordfenceClass.php:7291
9208
  msgid "This user's email is the network admin email. It will need to be changed before deleting this user."
9209
  msgstr ""
9210
 
9211
- #: lib/wordfenceClass.php:7355
9212
  msgid "Wordfence could not find your .htaccess file."
9213
  msgstr ""
9214
 
9215
- #: lib/wordfenceClass.php:7371
9216
  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."
9217
  msgstr ""
9218
 
9219
- #: lib/wordfenceClass.php:7377
9220
  msgid "There was an error writing to your .htaccess file."
9221
  msgstr ""
9222
 
9223
- #: lib/wordfenceClass.php:7456
9224
  msgid "Required parameters not sent."
9225
  msgstr ""
9226
 
9227
- #: lib/wordfenceClass.php:7466
9228
  msgid "The WAF is currently in read-only mode and will not save any configuration changes."
9229
  msgstr ""
9230
 
9231
- #: lib/wordfenceClass.php:7504
9232
  #: views/waf/option-whitelist.php:60
9233
  msgid "Allowlisted via Firewall Options page"
9234
  msgstr ""
9235
 
9236
- #: lib/wordfenceClass.php:7791
9237
  msgid "Allowlisted via Live Traffic"
9238
  msgstr ""
9239
 
9240
- #: lib/wordfenceClass.php:7955
9241
- #: lib/wordfenceClass.php:8052
9242
  msgid "A valid server configuration was not provided."
9243
  msgstr ""
9244
 
9245
- #: lib/wordfenceClass.php:7966
9246
- #: lib/wordfenceClass.php:8073
9247
  msgid "Filesystem Credentials Required"
9248
  msgstr ""
9249
 
9250
  #. translators: Support URL.
9251
- #: lib/wordfenceClass.php:7968
9252
- #: lib/wordfenceClass.php:7992
9253
- #: lib/wordfenceClass.php:8036
9254
- #: lib/wordfenceClass.php:8928
9255
  msgid "If you cannot complete the setup process, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">click here for help<span class=\"screen-reader-text\"> ("
9256
  msgstr ""
9257
 
9258
  #. translators: Support URL.
9259
- #: lib/wordfenceClass.php:7969
9260
  msgid "Once you have entered credentials, click Continue to complete the setup."
9261
  msgstr ""
9262
 
9263
- #: lib/wordfenceClass.php:7990
9264
- #: lib/wordfenceClass.php:8098
9265
  msgid "Filesystem Permission Error"
9266
  msgstr ""
9267
 
9268
- #: lib/wordfenceClass.php:8016
9269
  msgid "Manual Installation Instructions"
9270
  msgstr ""
9271
 
9272
- #: lib/wordfenceClass.php:8023
9273
  msgid "Installation Successful"
9274
  msgstr ""
9275
 
9276
- #: lib/wordfenceClass.php:8034
9277
  msgid "Installation Failed"
9278
  msgstr ""
9279
 
9280
  #. translators: Support URL.
9281
- #: lib/wordfenceClass.php:8075
9282
- #: lib/wordfenceClass.php:8100
9283
- #: lib/wordfenceClass.php:8131
9284
- #: lib/wordfenceClass.php:8160
9285
- #: lib/wordfenceClass.php:8206
9286
  msgid "If you cannot complete the uninstall process, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">click here for help<span class=\"screen-reader-text\"> ("
9287
  msgstr ""
9288
 
9289
  #. translators: Support URL.
9290
- #: lib/wordfenceClass.php:8076
9291
  msgid "Once you have entered credentials, click Continue to complete uninstallation."
9292
  msgstr ""
9293
 
9294
- #: lib/wordfenceClass.php:8120
9295
  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."
9296
  msgstr ""
9297
 
9298
- #: lib/wordfenceClass.php:8122
9299
  msgid "Any previous value for <code>auto_prepend_file</code> will need to be re-enabled manually if still needed."
9300
  msgstr ""
9301
 
9302
  #. translators: Time until.
9303
- #: lib/wordfenceClass.php:8126
9304
  msgid "Waiting for it to take effect. This may take up to %s."
9305
  msgstr ""
9306
 
9307
- #: lib/wordfenceClass.php:8129
9308
  msgid "Waiting for Changes"
9309
  msgstr ""
9310
 
9311
- #: lib/wordfenceClass.php:8151
9312
  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."
9313
  msgstr ""
9314
 
9315
- #: lib/wordfenceClass.php:8153
9316
  msgid "Retrying Failed."
9317
  msgstr ""
9318
 
9319
- #: lib/wordfenceClass.php:8155
9320
  msgid "Try Again"
9321
  msgstr ""
9322
 
9323
- #: lib/wordfenceClass.php:8158
9324
  msgid "Unable to Uninstall"
9325
  msgstr ""
9326
 
9327
- #: lib/wordfenceClass.php:8194
9328
  msgid "Uninstallation Complete"
9329
  msgstr ""
9330
 
9331
- #: lib/wordfenceClass.php:8204
9332
  msgid "Uninstallation Failed"
9333
  msgstr ""
9334
 
9335
  #. translators: 1. Number of attacks/blocks. 2. Time since.
9336
- #: lib/wordfenceClass.php:8358
9337
  msgid "The Wordfence Web Application Firewall has blocked %1$d attacks over the last %2$s. Below is a sample of these recent attacks:"
9338
  msgstr ""
9339
 
9340
- #: lib/wordfenceClass.php:8925
9341
  msgid "To make your site as secure as possible, take a moment to optimize the Wordfence Web Application Firewall:"
9342
  msgstr ""
9343
 
9344
- #: lib/wordfenceClass.php:8925
9345
  msgid "Click here to configure"
9346
  msgstr ""
9347
 
9348
- #: lib/wordfenceClass.php:8934
9349
  #: views/waf/waf-install-success.php:14
9350
  msgid "Nice work! The firewall is now optimized."
9351
  msgstr ""
9352
 
9353
- #: lib/wordfenceClass.php:8936
9354
- #: lib/wordfenceClass.php:8948
9355
  #: views/waf/waf-install-success.php:16
9356
  #: views/waf/waf-uninstall-success.php:19
9357
  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."
9358
  msgstr ""
9359
 
9360
- #: lib/wordfenceClass.php:8942
9361
  #: views/waf/waf-uninstall-success.php:15
9362
  msgid "Uninstallation was successful!"
9363
  msgstr ""
9364
 
9365
- #: lib/wordfenceClass.php:8945
9366
  #: views/waf/waf-uninstall-success.php:17
9367
  msgid "Uninstallation from this site was successful! The Wordfence Firewall is still active because it is installed in another WordPress installation."
9368
  msgstr ""
9369
 
9370
- #: lib/wordfenceClass.php:8953
9371
  msgid "The update was successful!"
9372
  msgstr ""
9373
 
9374
- #: lib/wordfenceClass.php:9103
9375
  msgid "Auth grant is invalid."
9376
  msgstr ""
9377
 
9378
  #. translators: Error message.
9379
- #: lib/wordfenceClass.php:9118
9380
  msgid "Invalid response from Wordfence Central: %s"
9381
  msgstr ""
9382
 
9383
  #. translators: JSON property.
9384
- #: lib/wordfenceClass.php:9124
9385
- #: lib/wordfenceClass.php:9137
9386
  msgid "Invalid response from Wordfence Central. Parameter %s not found in response."
9387
  msgstr ""
9388
 
9389
- #: lib/wordfenceClass.php:9166
9390
- #: lib/wordfenceClass.php:9303
9391
  msgid "Access token not found."
9392
  msgstr ""
9393
 
9394
- #: lib/wordfenceClass.php:9211
9395
- #: lib/wordfenceClass.php:9278
9396
  msgid "Invalid response from Wordfence Central."
9397
  msgstr ""
9398
 
9399
- #: lib/wordfenceClass.php:9254
9400
  msgid "Auth grant not found."
9401
  msgstr ""
9402
 
9403
- #: lib/wordfenceClass.php:9520
9404
  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."
9405
  msgstr ""
9406
 
9407
- #: lib/wordfenceClass.php:9612
9408
- #: lib/wordfenceClass.php:9683
9409
  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."
9410
  msgstr ""
9411
 
9412
  #. translators: File path.
9413
- #: lib/wordfenceClass.php:9653
9414
- #: lib/wordfenceClass.php:9701
9415
  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."
9416
  msgstr ""
9417
 
9418
- #: lib/wordfenceClass.php:9717
9419
  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."
9420
  msgstr ""
9421
 
9422
- #: lib/wordfenceHash.php:68
9423
  msgid "Fetching core, theme and plugin file signatures from Wordfence"
9424
  msgstr ""
9425
 
9426
- #: lib/wordfenceHash.php:77
9427
  msgid "Fetching list of known malware files from Wordfence"
9428
  msgstr ""
9429
 
9430
- #: lib/wordfenceHash.php:81
9431
  msgid "Using cached malware prefixes"
9432
  msgstr ""
9433
 
9434
- #: lib/wordfenceHash.php:84
9435
  msgid "Fetching fresh malware prefixes"
9436
  msgstr ""
9437
 
9438
- #: lib/wordfenceHash.php:89
9439
  msgid "Could not fetch malware signatures from Wordfence servers."
9440
  msgstr ""
9441
 
9442
- #: lib/wordfenceHash.php:94
9443
  msgid "Malware data received from Wordfence servers was not valid."
9444
  msgstr ""
9445
 
9446
- #: lib/wordfenceHash.php:106
9447
  msgid "Fetching list of known core files from Wordfence"
9448
  msgstr ""
9449
 
9450
- #: lib/wordfenceHash.php:110
9451
  msgid "Using cached core hashes"
9452
  msgstr ""
9453
 
9454
- #: lib/wordfenceHash.php:113
9455
  msgid "Fetching fresh core hashes"
9456
  msgstr ""
9457
 
9458
- #: lib/wordfenceHash.php:118
9459
  msgid "Could not fetch core hashes from Wordfence servers."
9460
  msgstr ""
9461
 
9462
- #: lib/wordfenceHash.php:123
9463
  msgid "Core hashes data received from Wordfence servers was not valid."
9464
  msgstr ""
9465
 
9466
- #: lib/wordfenceHash.php:138
9467
- msgid "Could not read directory %s to do scan."
9468
- msgstr ""
9469
-
9470
- #: lib/wordfenceHash.php:147
9471
  msgid "Comparing core WordPress files against originals in repository"
9472
  msgstr ""
9473
 
9474
- #: lib/wordfenceHash.php:147
9475
  msgid "Skipping core scan"
9476
  msgstr ""
9477
 
9478
- #: lib/wordfenceHash.php:148
9479
  msgid "Comparing open source themes against WordPress.org originals"
9480
  msgstr ""
9481
 
9482
- #: lib/wordfenceHash.php:148
9483
  msgid "Skipping theme scan"
9484
  msgstr ""
9485
 
9486
- #: lib/wordfenceHash.php:149
9487
  msgid "Comparing plugins against WordPress.org originals"
9488
  msgstr ""
9489
 
9490
- #: lib/wordfenceHash.php:149
9491
  msgid "Skipping plugin scan"
9492
  msgstr ""
9493
 
9494
- #: lib/wordfenceHash.php:150
9495
  msgid "Scanning for known malware files"
9496
  msgstr ""
9497
 
9498
- #: lib/wordfenceHash.php:150
9499
  msgid "Skipping malware scan"
9500
  msgstr ""
9501
 
9502
- #: lib/wordfenceHash.php:151
9503
  msgid "Scanning for unknown files in wp-admin and wp-includes"
9504
  msgstr ""
9505
 
9506
- #: lib/wordfenceHash.php:151
9507
  msgid "Skipping unknown core file scan"
9508
  msgstr ""
9509
 
9510
  #. translators: WordPress version.
9511
- #: lib/wordfenceHash.php:164
9512
  msgid "Unknown WordPress core version: %s"
9513
  msgstr ""
9514
 
9515
  #. translators: WordPress version.
9516
- #: lib/wordfenceHash.php:165
9517
  msgid "The core files scan will not be run because this version of WordPress is not currently indexed by Wordfence. This may be due to using a prerelease version or because the servers are still indexing a new release. If you are using an official WordPress release, this issue will automatically dismiss once the version is indexed and another scan is run."
9518
  msgstr ""
9519
 
9520
  #. translators: File path.
9521
- #: lib/wordfenceHash.php:198
9522
  msgid "Wordfence file scanner detected a possible infinite loop. Exiting on file: %s"
9523
  msgstr ""
9524
 
9525
- #: lib/wordfenceHash.php:201
9526
- msgid "Indexing files for scanning"
9527
- msgstr ""
9528
-
9529
  #. translators: Time in seconds.
9530
- #: lib/wordfenceHash.php:227
9531
  msgid "Index time: %s"
9532
  msgstr ""
9533
 
9534
- #: lib/wordfenceHash.php:232
9535
  msgid "Beginning file hashing"
9536
  msgstr ""
9537
 
9538
- #: lib/wordfenceHash.php:238
9539
  msgid "Processing pending issues"
9540
  msgstr ""
9541
 
9542
  #. translators: 1. Number of files. 2. Data in bytes.
9543
- #: lib/wordfenceHash.php:241
9544
  msgid "Analyzed %1$d files containing %2$s of data."
9545
  msgstr ""
9546
 
9547
- #: lib/wordfenceHash.php:250
9548
  msgid "Invalid response from Wordfence API during check_possible_malware"
9549
  msgstr ""
9550
 
9551
  #. translators: File path.
9552
- #: lib/wordfenceHash.php:263
9553
  msgid "This file is suspected malware: %s"
9554
  msgstr ""
9555
 
9556
  #. translators: Malware name/title.
9557
- #: lib/wordfenceHash.php:264
9558
  msgid "This file's signature matches a known malware file. The title of the malware is '%s'. Immediately inspect this file using the 'View' option below and consider deleting it from your server."
9559
  msgstr ""
9560
 
9561
  #. translators: File path.
9562
- #: lib/wordfenceHash.php:311
9563
- #: lib/wordfenceHash.php:342
9564
  msgid "Found .suspected file: %s"
9565
  msgstr ""
9566
 
9567
  #. translators: File path.
 
9568
  #: lib/wordfenceHash.php:323
9569
- #: lib/wordfenceHash.php:351
9570
  msgid "Skipping unneeded hash: %s"
9571
  msgstr ""
9572
 
9573
  #. translators: Number of files.
9574
- #: lib/wordfenceHash.php:375
9575
  msgid "%d files indexed"
9576
  msgstr ""
9577
 
9578
  #. translators: File path.
9579
- #: lib/wordfenceHash.php:406
9580
  msgid "Forking during indexing: %s"
9581
  msgstr ""
9582
 
9583
  #. translators: PHP max execution time.
9584
- #: lib/wordfenceHash.php:409
9585
  msgid "Calling fork() from wordfenceHash with maxExecTime: %s"
9586
  msgstr ""
9587
 
9588
  #. translators: File path.
9589
- #: lib/wordfenceHash.php:447
9590
  msgid "Skipping file larger than max size: %s"
9591
  msgstr ""
9592
 
9593
  #. translators: 1. File path. 2. Memory in bytes.
9594
- #: lib/wordfenceHash.php:452
9595
  msgid "Scanning: %1$s (Mem:%2$s)"
9596
  msgstr ""
9597
 
9598
  #. translators: File path.
9599
- #: lib/wordfenceHash.php:455
9600
  msgid "Scanning: %s"
9601
  msgstr ""
9602
 
9603
  #. translators: File path.
9604
- #: lib/wordfenceHash.php:494
9605
  msgid "WordPress core file modified: %s"
9606
  msgstr ""
9607
 
9608
  #. translators: File path.
9609
- #: lib/wordfenceHash.php:495
9610
  msgid "This WordPress core file has been modified and differs from the original file distributed with this version of WordPress."
9611
  msgstr ""
9612
 
9613
  #. translators: File path.
9614
- #: lib/wordfenceHash.php:530
9615
  msgid "Modified plugin file: %s"
9616
  msgstr ""
9617
 
9618
  #. translators: 1. Plugin name. 2. Plugin version. 3. Support URL.
9619
- #: lib/wordfenceHash.php:533
9620
  msgid "This file belongs to plugin \"%1$s\" version \"%2$s\" and has been modified from the file that is distributed by WordPress.org for this version. Please use the link to see how the file has changed. If you have modified this file yourself, you can safely ignore this warning. If you see a lot of changed files in a plugin that have been made by the author, then try uninstalling and reinstalling the plugin to force an upgrade. Doing this is a workaround for plugin authors who don't manage their code correctly. <a href=\"%3$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
9621
  msgstr ""
9622
 
9623
  #. translators: File path.
9624
- #: lib/wordfenceHash.php:576
9625
  msgid "Modified theme file: %s"
9626
  msgstr ""
9627
 
9628
  #. translators: 1. Plugin name. 2. Plugin version. 3. Support URL.
9629
- #: lib/wordfenceHash.php:579
9630
  msgid "This file belongs to theme \"%1$s\" version \"%2$s\" and has been modified from the original distribution. It is common for site owners to modify their theme files, so if you have modified this file yourself you can safely ignore this warning. <a href=\"%3$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
9631
  msgstr ""
9632
 
9633
  #. translators: File path.
9634
- #: lib/wordfenceHash.php:612
9635
  msgid "Old WordPress core file not removed during update: %s"
9636
  msgstr ""
9637
 
9638
  #. translators: File path.
9639
- #: lib/wordfenceHash.php:613
9640
  msgid "This file is in a WordPress core location but is from an older version of WordPress and not used with your current version. Hosting or permissions issues can cause these files to get left behind when WordPress is updated and they should be removed if possible."
9641
  msgstr ""
9642
 
9643
  #. translators: File path.
9644
- #: lib/wordfenceHash.php:629
9645
- #: lib/wordfenceHash.php:649
9646
  msgid "Unknown file in WordPress core: %s"
9647
  msgstr ""
9648
 
9649
  #. translators: File path.
9650
- #: lib/wordfenceHash.php:630
9651
  msgid "This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker."
9652
  msgstr ""
9653
 
9654
  #. translators: Support URL.
9655
- #: lib/wordfenceHash.php:650
9656
  msgid "This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
9657
  msgstr ""
9658
 
9659
  #. translators: 1. Number of files. 2. Data in bytes.
9660
- #: lib/wordfenceHash.php:678
9661
  msgid "Analyzed %1$d files containing %2$s of data so far"
9662
  msgstr ""
9663
 
9664
  #. translators: Number of scan results.
9665
- #: lib/wordfenceHash.php:762
9666
  msgid "(+ %d more)"
9667
  msgstr ""
9668
 
9669
  #. translators: Number of files.
9670
- #: lib/wordfenceHash.php:763
9671
  msgid "%d more similar files were found."
9672
  msgstr ""
9673
 
9674
  #. translators: Number of files.
9675
- #: lib/wordfenceHash.php:763
9676
  msgid "1 more similar file was found."
9677
  msgstr ""
9678
 
9679
  #. translators: Number of files.
9680
- #: lib/wordfenceHash.php:763
9681
  msgid "<a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
9682
  msgstr ""
9683
 
@@ -9738,78 +9742,78 @@ msgid "This file appears to be an old version of the TimThumb script which makes
9738
  msgstr ""
9739
 
9740
  #. translators: Malware signature rule ID.
9741
- #: lib/wordfenceScanner.php:371
9742
  msgid "Resuming malware scan at rule %s."
9743
  msgstr ""
9744
 
9745
- #: lib/wordfenceScanner.php:405
9746
  msgid "This file appears to be installed or modified by a hacker to perform malicious activity. If you know about this file you can choose to ignore it to exclude it from future scans."
9747
  msgstr ""
9748
 
9749
- #: lib/wordfenceScanner.php:416
9750
  msgid "File appears to be malicious or unsafe: %s"
9751
  msgstr ""
9752
 
9753
- #: lib/wordfenceScanner.php:417
9754
  msgid "The matched text in this file is: %s"
9755
  msgstr ""
9756
 
9757
  #. translators: Scan result type.
9758
- #: lib/wordfenceScanner.php:417
9759
  msgid "The issue type is: %s"
9760
  msgstr ""
9761
 
9762
  #. translators: Scan result description.
9763
- #: lib/wordfenceScanner.php:417
9764
  msgid "Description: %s"
9765
  msgstr ""
9766
 
9767
  #. translators: Malware signature rule ID.
9768
- #: lib/wordfenceScanner.php:435
9769
  msgid "Forking during malware scan (%s) to ensure continuity."
9770
  msgstr ""
9771
 
9772
- #: lib/wordfenceScanner.php:457
9773
  msgid "This file may contain malicious executable code: "
9774
  msgstr ""
9775
 
9776
  #. translators: Malware signature matched text.
9777
- #: lib/wordfenceScanner.php:458
9778
  msgid "This file is a PHP executable file and contains the word \"eval\" (without quotes) and the word \"%s\" (without quotes). The eval() function along with an encoding function like the one mentioned are commonly used by hackers to hide their code. If you know about this file you can choose to ignore it to exclude it from future scans. This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives."
9779
  msgstr ""
9780
 
9781
- #: lib/wordfenceScanner.php:495
9782
  msgid "Asking Wordfence to check URLs against malware list."
9783
  msgstr ""
9784
 
9785
- #: lib/wordfenceScanner.php:523
9786
- #: lib/wordfenceScanner.php:565
9787
  msgid "File contains suspected malware URL: "
9788
  msgstr ""
9789
 
9790
  #. translators: 1. Malware signature matched text. 2. Malicious URL. 3. Malicious URL.
9791
- #: lib/wordfenceScanner.php:526
9792
  msgid "This file contains a suspected malware URL listed on Google's list of malware sites. Wordfence decodes %1$s when scanning files so the URL may not be visible if you view this file. The URL is: %2$s - More info available at <a href=\"http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%3$s&client=googlechrome&hl=en-US\" target=\"_blank\" rel=\"noopener noreferrer\">Google Safe Browsing diagnostic page<span class=\"screen-reader-text\"> (opens in new tab)</span></a>."
9793
  msgstr ""
9794
 
9795
- #: lib/wordfenceScanner.php:547
9796
  msgid "File contains suspected phishing URL: "
9797
  msgstr ""
9798
 
9799
- #: lib/wordfenceScanner.php:548
9800
  msgid "This file contains a URL that is a suspected phishing site that is currently listed on Google's list of known phishing sites. The URL is: "
9801
  msgstr ""
9802
 
9803
- #: lib/wordfenceScanner.php:566
9804
  msgid "This file contains a URL that is currently listed on Wordfence's domain blocklist. The URL is: "
9805
  msgstr ""
9806
 
9807
- #: lib/wordfenceScanner.php:582
9808
  msgid "Finalizing malware scan results"
9809
  msgstr ""
9810
 
9811
  #. translators: 1. Number of fils. 2. Seconds in millisecond precision.
9812
- #: lib/wordfenceScanner.php:604
9813
  msgid "Scanned contents of %1$d additional files at %2$.2f per second"
9814
  msgstr ""
9815
 
@@ -10637,30 +10641,42 @@ msgid "%s License Expired"
10637
  msgstr ""
10638
 
10639
  #: views/dashboard/options-group-license.php:53
 
 
 
 
10640
  msgid "%s License Active"
10641
  msgstr ""
10642
 
10643
- #: views/dashboard/options-group-license.php:59
10644
  msgid "Reset site to a free license"
10645
  msgstr ""
10646
 
10647
- #: views/dashboard/options-group-license.php:64
10648
  msgid "Click here to manage your Wordfence licenses"
10649
  msgstr ""
10650
 
10651
- #: views/dashboard/options-group-license.php:68
 
 
 
 
10652
  msgid "Install License"
10653
  msgstr ""
10654
 
10655
- #: views/dashboard/options-group-license.php:152
 
 
 
 
10656
  msgid "Confirm Reset"
10657
  msgstr ""
10658
 
10659
- #: views/dashboard/options-group-license.php:153
10660
  msgid "<p>Are you sure you want to reset this site's Wordfence License? This will disable Premium features and return the site to the free version of Wordfence. Your settings will still be retained when reinstalling a license.</p><p>If autorenew is enabled for the current license, the license will renew at the next expiration date. If you would like to turn renewal off or assign the license to another site, log into wordfence.com to change it.</p>"
10661
  msgstr ""
10662
 
10663
- #: views/dashboard/options-group-license.php:155
10664
  msgid "Reset"
10665
  msgstr ""
10666
 
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.10\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: 2022-05-17T14:17:20-04: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:6164
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:6239
72
  #: views/reports/activity-report-email-inline.php:256
73
  #: views/reports/activity-report.php:106
74
  msgid "Username"
133
  #. translators: WordPress username.
134
  #: lib/dashboard/widget_ips.php:96
135
  #: lib/dashboard/widget_logins.php:77
136
+ #: lib/wordfenceClass.php:6110
137
  msgid "An error occurred"
138
  msgstr ""
139
 
234
  #: lib/menu_tools_twoFactor.php:51
235
  #: lib/menu_wordfence_central.php:59
236
  #: lib/wf503.php:390
237
+ #: lib/wfScanEngine.php:281
238
+ #: lib/wfScanEngine.php:614
239
+ #: lib/wfScanEngine.php:627
240
+ #: lib/wfScanEngine.php:699
241
+ #: lib/wfScanEngine.php:722
242
+ #: lib/wfScanEngine.php:797
243
+ #: lib/wfScanEngine.php:1010
244
+ #: lib/wfScanEngine.php:1011
245
+ #: lib/wfScanEngine.php:1152
246
+ #: lib/wfScanEngine.php:1289
247
+ #: lib/wfScanEngine.php:1432
248
+ #: lib/wfScanEngine.php:1796
249
+ #: lib/wfScanEngine.php:2042
250
+ #: lib/wfScanEngine.php:2081
251
+ #: lib/wfScanEngine.php:2269
252
+ #: lib/wfScanEngine.php:2311
253
  #: lib/wfVersionCheckController.php:68
254
  #: lib/wfVersionCheckController.php:91
255
  #: lib/wfVersionCheckController.php:167
256
  #: lib/wfVersionCheckController.php:186
257
+ #: lib/wordfenceClass.php:1398
258
+ #: lib/wordfenceClass.php:2750
259
+ #: lib/wordfenceClass.php:2886
260
+ #: lib/wordfenceClass.php:3041
261
+ #: lib/wordfenceClass.php:3077
262
+ #: lib/wordfenceClass.php:3605
263
+ #: lib/wordfenceClass.php:4931
264
+ #: lib/wordfenceClass.php:4939
265
+ #: lib/wordfenceClass.php:4945
266
+ #: lib/wordfenceClass.php:4958
267
+ #: lib/wordfenceClass.php:4970
268
+ #: lib/wordfenceClass.php:4978
269
+ #: lib/wordfenceClass.php:6299
 
 
 
270
  #: lib/wordfenceClass.php:6321
271
+ #: lib/wordfenceClass.php:6340
272
+ #: lib/wordfenceClass.php:6346
273
+ #: lib/wordfenceClass.php:6393
274
+ #: lib/wordfenceClass.php:8045
275
+ #: lib/wordfenceClass.php:8069
276
+ #: lib/wordfenceClass.php:8113
277
+ #: lib/wordfenceClass.php:8152
278
+ #: lib/wordfenceClass.php:8177
279
+ #: lib/wordfenceClass.php:8208
280
+ #: lib/wordfenceClass.php:8237
281
+ #: lib/wordfenceClass.php:8283
282
+ #: lib/wordfenceClass.php:9005
283
+ #: lib/wordfenceHash.php:515
284
+ #: lib/wordfenceHash.php:562
285
+ #: lib/wordfenceHash.php:636
286
+ #: lib/wordfenceHash.php:750
287
  #: views/blocking/block-list.php:35
288
  #: views/blocking/blocking-create.php:179
289
  #: views/blocking/blocking-status.php:27
305
  #: views/dashboard/options-group-import.php:31
306
  #: views/dashboard/options-group-import.php:44
307
  #: views/dashboard/options-group-license.php:35
308
+ #: views/dashboard/options-group-license.php:65
309
+ #: views/dashboard/options-group-license.php:67
310
+ #: views/dashboard/options-group-license.php:72
311
  #: views/dashboard/status-payment-expiring.php:31
312
  #: views/dashboard/status-renewing.php:17
313
  #: views/gdpr/banner.php:55
426
  msgstr ""
427
 
428
  #: lib/dashboard/widget_notifications.php:8
429
+ #: lib/wordfenceClass.php:6779
430
  msgid "Notifications"
431
  msgstr ""
432
 
501
  #: lib/menu_tools_diagnostic.php:982
502
  #: lib/menu_tools_twoFactor.php:235
503
  #: lib/menu_tools_twoFactor.php:273
504
+ #: lib/wordfenceClass.php:8070
505
+ #: lib/wordfenceClass.php:8114
506
+ #: lib/wordfenceClass.php:8178
507
+ #: lib/wordfenceClass.php:8238
508
+ #: lib/wordfenceClass.php:8284
509
  #: views/blocking/block-list.php:501
510
  #: views/blocking/blocking-create.php:212
511
  #: views/blocking/blocking-create.php:529
512
+ #: views/dashboard/options-group-license.php:165
513
  #: views/options/block-all-options-controls.php:164
514
  #: views/options/block-controls.php:79
515
  msgid "Cancel"
723
  #: lib/wfVersionCheckController.php:91
724
  #: lib/wfVersionCheckController.php:167
725
  #: lib/wfVersionCheckController.php:186
726
+ #: lib/wordfenceClass.php:6426
727
  #: views/blocking/blocking-create.php:528
728
  #: views/blocking/blocking-status.php:27
729
  #: views/dashboard/options-group-dashboard.php:107
926
  msgstr ""
927
 
928
  #: lib/menu_dashboard.php:24
929
+ #: lib/wordfenceClass.php:6664
930
  msgid "Wordfence Dashboard"
931
  msgstr ""
932
 
938
  #: lib/menu_dashboard_options.php:98
939
  #: lib/menu_firewall.php:20
940
  #: lib/menu_firewall.php:30
941
+ #: lib/wordfenceClass.php:6668
942
  #: models/page/wfPage.php:105
943
  msgid "Firewall"
944
  msgstr ""
975
  #: lib/menu_dashboard_options.php:115
976
  #: lib/menu_scanner.php:31
977
  #: lib/menu_scanner.php:305
978
+ #: lib/wordfenceClass.php:6675
979
  #: models/page/wfPage.php:113
980
  msgid "Scan"
981
  msgstr ""
1013
 
1014
  #: lib/menu_dashboard.php:89
1015
  #: lib/menu_dashboard_options.php:133
1016
+ #: views/dashboard/options-group-license.php:65
1017
  msgid "Reset License"
1018
  msgstr ""
1019
 
1058
  #: lib/menu_scanner.php:80
1059
  #: lib/menu_support.php:55
1060
  #: lib/menu_tools_twoFactor.php:51
1061
+ #: lib/wordfenceClass.php:6704
1062
  #: views/blocking/blocking-create.php:179
1063
  #: views/blocking/blocking-status.php:23
1064
  #: views/blocking/blocking-status.php:27
1065
  #: views/blocking/options-group-advanced-country.php:85
1066
  #: views/dashboard/options-group-dashboard.php:107
1067
+ #: views/dashboard/options-group-license.php:72
1068
  #: views/onboarding/fresh-install.php:42
1069
  #: views/onboarding/modal-final-attempt.php:41
1070
  #: views/onboarding/plugin-header.php:64
1152
  msgstr ""
1153
 
1154
  #: lib/menu_dashboard.php:229
1155
+ #: lib/wordfenceClass.php:6679
1156
  msgid "Tools"
1157
  msgstr ""
1158
 
1164
  #: lib/menu_firewall_waf.php:157
1165
  #: lib/menu_scanner.php:139
1166
  #: lib/menu_support.php:19
1167
+ #: lib/wordfenceClass.php:6692
1168
  msgid "Help"
1169
  msgstr ""
1170
 
1383
  #: lib/menu_firewall.php:41
1384
  #: lib/menu_firewall_blocking.php:119
1385
  #: lib/menu_firewall_waf.php:142
1386
+ #: lib/wordfenceClass.php:6670
1387
  #: models/page/wfPage.php:109
1388
  msgid "Blocking"
1389
  msgstr ""
1572
  #: lib/menu_tools_diagnostic.php:301
1573
  #: lib/menu_tools_diagnostic.php:302
1574
  #: lib/menu_tools_diagnostic.php:305
1575
+ #: lib/wordfenceClass.php:6136
1576
  #: models/firewall/wfFirewall.php:41
1577
  #: views/diagnostics/text.php:154
1578
  #: views/diagnostics/text.php:159
1694
 
1695
  #: lib/menu_options.php:24
1696
  #: lib/menu_options.php:262
1697
+ #: lib/wordfenceClass.php:6687
1698
  msgid "All Options"
1699
  msgstr ""
1700
 
2333
  msgstr ""
2334
 
2335
  #: lib/menu_scanner.php:80
2336
+ #: lib/wordfenceClass.php:6716
2337
  msgid "Protect More Sites"
2338
  msgstr ""
2339
 
2416
  #: lib/menu_tools_twoFactor.php:255
2417
  #: lib/menu_tools_twoFactor.php:264
2418
  #: lib/menu_tools_twoFactor.php:284
2419
+ #: lib/wordfenceClass.php:4940
2420
+ #: lib/wordfenceClass.php:4946
2421
+ #: lib/wordfenceClass.php:4952
2422
+ #: lib/wordfenceClass.php:4959
2423
+ #: lib/wordfenceClass.php:4965
2424
+ #: lib/wordfenceClass.php:4972
2425
+ #: lib/wordfenceClass.php:4980
2426
+ #: lib/wordfenceClass.php:6078
2427
+ #: lib/wordfenceClass.php:6080
2428
+ #: lib/wordfenceClass.php:6131
2429
+ #: lib/wordfenceClass.php:8095
2430
+ #: lib/wordfenceClass.php:8102
2431
+ #: lib/wordfenceClass.php:8209
2432
+ #: lib/wordfenceClass.php:8273
2433
  #: views/dashboard/options-group-import.php:147
2434
  #: views/dashboard/options-group-import.php:157
2435
  #: views/dashboard/options-group-import.php:177
2632
  #: lib/menu_tools_livetraffic.php:41
2633
  #: lib/menu_tools_livetraffic.php:571
2634
  #: lib/menu_tools_livetraffic.php:602
2635
+ #: lib/wordfenceClass.php:6681
2636
  #: models/page/wfPage.php:119
2637
  msgid "Live Traffic"
2638
  msgstr ""
3123
  msgstr ""
3124
 
3125
  #: lib/menu_tools_diagnostic.php:304
3126
+ #: lib/wordfenceClass.php:4259
3127
  #: views/diagnostics/text.php:162
3128
  msgid "Never"
3129
  msgstr ""
3470
 
3471
  #: lib/menu_tools_diagnostic.php:732
3472
  #: lib/menu_tools_diagnostic.php:771
3473
+ #: lib/wordfenceClass.php:6139
3474
  msgid "Download"
3475
  msgstr ""
3476
 
3500
  msgstr ""
3501
 
3502
  #: lib/menu_tools_diagnostic.php:811
3503
+ #: lib/wordfenceClass.php:3960
3504
  #: views/diagnostics/text.php:584
3505
  msgid "No New Issues"
3506
  msgstr ""
3570
  msgstr ""
3571
 
3572
  #: lib/menu_tools_diagnostic.php:961
3573
+ #: lib/wordfenceClass.php:6200
3574
  msgid "Restore Defaults"
3575
  msgstr ""
3576
 
3577
  #: lib/menu_tools_diagnostic.php:962
3578
+ #: lib/wordfenceClass.php:6125
3579
  msgid "Cancel Changes"
3580
  msgstr ""
3581
 
3582
  #: lib/menu_tools_diagnostic.php:963
3583
+ #: lib/wordfenceClass.php:6203
3584
  msgid "Save Changes"
3585
  msgstr ""
3586
 
3651
  #: lib/menu_tools_livetraffic.php:100
3652
  #: lib/menu_tools_livetraffic.php:227
3653
  #: lib/menu_tools_livetraffic.php:458
3654
+ #: lib/wordfenceClass.php:6162
3655
  msgid "Human"
3656
  msgstr ""
3657
 
3658
  #: lib/menu_tools_livetraffic.php:101
3659
  #: lib/menu_tools_livetraffic.php:228
3660
  #: lib/menu_tools_livetraffic.php:458
3661
+ #: lib/wordfenceClass.php:6124
3662
  msgid "Bot"
3663
  msgstr ""
3664
 
3668
 
3669
  #: lib/menu_tools_livetraffic.php:103
3670
  #: lib/wfDiagnostic.php:762
3671
+ #: lib/wordfenceClass.php:6116
3672
  msgid "Blocked"
3673
  msgstr ""
3674
 
3761
  msgstr ""
3762
 
3763
  #: lib/menu_tools_livetraffic.php:286
3764
+ #: lib/wordfenceClass.php:6231
3765
  msgid "Type"
3766
  msgstr ""
3767
 
3784
  msgstr ""
3785
 
3786
  #: lib/menu_tools_livetraffic.php:291
3787
+ #: lib/wordfenceClass.php:4241
3788
  #: views/blocking/blocking-create.php:193
3789
  msgid "Hostname"
3790
  msgstr ""
4144
  msgstr ""
4145
 
4146
  #: lib/menu_tools_whois.php:95
4147
+ #: lib/wordfenceClass.php:6144
4148
  msgid "Enter a valid IP or domain"
4149
  msgstr ""
4150
 
4151
  #: lib/menu_tools_whois.php:95
4152
+ #: lib/wordfenceClass.php:6187
4153
  msgid "Please enter a valid IP address or domain name for your whois lookup."
4154
  msgstr ""
4155
 
4156
  #: lib/menu_tools_whois.php:99
4157
+ #: lib/wordfenceClass.php:6168
4158
  msgid "Loading..."
4159
  msgstr ""
4160
 
4161
  #: lib/menu_tools_whois.php:104
4162
+ #: lib/wordfenceClass.php:6174
4163
  msgid "Look up IP or Domain"
4164
  msgstr ""
4165
 
4189
 
4190
  #: lib/menu_wordfence_central.php:44
4191
  #: lib/menu_wordfence_central.php:57
4192
+ #: lib/wordfenceClass.php:6697
4193
  msgid "Wordfence Central"
4194
  msgstr ""
4195
 
4272
  #. translators: Error message.
4273
  #: lib/rest-api/wfRESTConfigController.php:215
4274
  #: lib/rest-api/wfRESTConfigController.php:258
4275
+ #: lib/wordfenceClass.php:4525
4276
  msgid "An error occurred while saving the configuration: %s"
4277
  msgstr ""
4278
 
4279
  #. translators: Error message.
4280
  #: lib/rest-api/wfRESTConfigController.php:226
4281
  #: lib/rest-api/wfRESTConfigController.php:269
4282
+ #: lib/wordfenceClass.php:4534
4283
  msgid "Errors occurred while saving the configuration: %s"
4284
  msgstr ""
4285
 
4286
  #: lib/rest-api/wfRESTConfigController.php:231
4287
  #: lib/rest-api/wfRESTConfigController.php:274
4288
+ #: lib/wordfenceClass.php:4539
4289
  msgid "Errors occurred while saving the configuration."
4290
  msgstr ""
4291
 
4402
  msgstr ""
4403
 
4404
  #: lib/wfActivityReport.php:584
4405
+ #: lib/wordfenceClass.php:8448
4406
  msgid "Blocked because the IP is blocklisted"
4407
  msgstr ""
4408
 
4409
  #. translators: Reason for firewall action.
4410
  #: lib/wfActivityReport.php:587
4411
+ #: lib/wordfenceClass.php:8451
4412
  msgid "Blocked for %s"
4413
  msgstr ""
4414
 
4415
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4416
  #: lib/wfActivityReport.php:599
4417
+ #: lib/wordfenceClass.php:8465
4418
  msgid "Blocked for %1$s in query string: %2$s = %3$s"
4419
  msgstr ""
4420
 
4421
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4422
  #: lib/wfActivityReport.php:602
4423
+ #: lib/wordfenceClass.php:8470
4424
  msgid "Blocked for %1$s in POST body: %2$s = %3$s"
4425
  msgstr ""
4426
 
4427
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4428
  #: lib/wfActivityReport.php:605
4429
+ #: lib/wordfenceClass.php:8475
4430
  msgid "Blocked for %1$s in cookie: %2$s = %3$s"
4431
  msgstr ""
4432
 
4433
  #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value.
4434
  #: lib/wfActivityReport.php:608
4435
+ #: lib/wordfenceClass.php:8480
4436
  msgid "Blocked for %1$s in file: %2$s = %3$s"
4437
  msgstr ""
4438
 
4443
  msgstr ""
4444
 
4445
  #: lib/wfAdminNoticeQueue.php:193
4446
+ #: lib/wordfenceClass.php:6137
4447
+ #: lib/wordfenceClass.php:6392
4448
+ #: lib/wordfenceClass.php:6427
4449
+ #: lib/wordfenceClass.php:9003
4450
  msgid "Dismiss"
4451
  msgstr ""
4452
 
5678
  msgstr ""
5679
 
5680
  #: lib/wfConfig.php:1186
5681
+ #: lib/wordfenceClass.php:7558
5682
  msgid "The grace period end time must be in the future."
5683
  msgstr ""
5684
 
5716
  msgstr ""
5717
 
5718
  #: lib/wfConfig.php:1312
5719
+ #: lib/wordfenceClass.php:4410
5720
  msgid "The license key entered is not in a valid format. It must contain only numbers and the letters A-F."
5721
  msgstr ""
5722
 
6237
 
6238
  #: lib/wfLog.php:600
6239
  #: models/block/wfBlock.php:1442
6240
+ #: waf/wfWAFIPBlocksController.php:73
6241
  msgid "Access from your area has been temporarily limited for security reasons"
6242
  msgstr ""
6243
 
6244
  #: lib/wfLog.php:615
6245
+ #: lib/wordfenceClass.php:6175
6246
+ #: waf/wfWAFIPBlocksController.php:99
6247
  msgid "Manual block by administrator"
6248
  msgstr ""
6249
 
6388
  #: lib/wfScan.php:263
6389
  #: lib/wfScan.php:278
6390
  #: lib/wfScan.php:293
6391
+ #: lib/wfScanEngine.php:444
6392
  msgid "Wordfence used %1$s of memory for scan. Server peak memory usage was: %2$s"
6393
  msgstr ""
6394
 
6413
  msgstr ""
6414
 
6415
  #. translators: Number of scan results.
6416
+ #: lib/wfScanEngine.php:116
6417
  msgid "%d issue found in most recent scan"
6418
  msgid_plural "%d issues found in most recent scan"
6419
  msgstr[0] ""
6420
  msgstr[1] ""
6421
 
6422
  #. translators: 1. Time duration. 2. Support URL.
6423
+ #: lib/wfScanEngine.php:281
6424
  msgid "The scan time limit of %1$s has been exceeded and the scan will be terminated. This limit can be customized on the options page. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Get More Information<span class=\"screen-reader-text\"> ("
6425
  msgstr ""
6426
 
6427
+ #: lib/wfScanEngine.php:285
6428
  msgid "Scan Time Limit Exceeded"
6429
  msgstr ""
6430
 
6431
  #. translators: 1. Number of files. 2. Number of plugins. 3. Number of themes. 4. Number of posts. 5. Number of comments. 6. Number of URLs. 7. Time duration.
6432
+ #: lib/wfScanEngine.php:290
6433
  msgid "Scan interrupted. Scanned %1$d files, %2$d plugins, %3$d themes, %4$d posts, %5$d comments and %6$d URLs in %7$s."
6434
  msgstr ""
6435
 
6436
  #. translators: Number of scan results.
6437
+ #: lib/wfScanEngine.php:302
6438
  msgid "Scan interrupted. You have %d new issue to fix. See below."
6439
  msgid_plural "Scan interrupted. You have %d new issues to fix. See below."
6440
  msgstr[0] ""
6441
  msgstr[1] ""
6442
 
6443
+ #: lib/wfScanEngine.php:311
6444
  msgid "Scan interrupted. No problems found prior to stopping."
6445
  msgstr ""
6446
 
6447
  #. translators: 1. Software version. 2. Software version.
6448
+ #: lib/wfScanEngine.php:323
6449
  msgid "Aborting scan because WordPress updated from version %1$s to %2$s. The scan will be reattempted later."
6450
  msgstr ""
6451
 
6452
+ #: lib/wfScanEngine.php:353
6453
  msgid "Forking during hash scan to ensure continuity."
6454
  msgstr ""
6455
 
6456
+ #: lib/wfScanEngine.php:359
6457
  msgid "Entered fork()"
6458
  msgstr ""
6459
 
6460
+ #: lib/wfScanEngine.php:362
6461
  msgid "Calling startScan(true)"
6462
  msgstr ""
6463
 
6464
  #. translators: 1. Number of files. 2. Number of plugins. 3. Number of themes. 4. Number of posts. 5. Number of comments. 6. Number of URLs. 7. Time duration.
6465
+ #: lib/wfScanEngine.php:452
6466
  msgid "Scan Complete. Scanned %1$d files, %2$d plugins, %3$d themes, %4$d posts, %5$d comments and %6$d URLs in %7$s."
6467
  msgstr ""
6468
 
6469
  #. translators: 1. Time duration.
6470
+ #: lib/wfScanEngine.php:464
6471
  msgid "Quick Scan Complete. Scanned in %s."
6472
  msgstr ""
6473
 
6474
  #. translators: Number of scan results.
6475
+ #: lib/wfScanEngine.php:473
6476
  msgid "%d ignored issue was also detected."
6477
  msgid_plural "%d ignored issues were also detected."
6478
  msgstr[0] ""
6479
  msgstr[1] ""
6480
 
6481
  #. translators: Number of scan results.
6482
+ #: lib/wfScanEngine.php:484
6483
  msgid "Scan complete. You have %d new issue to fix."
6484
  msgid_plural "Scan complete. You have %d new issues to fix."
6485
  msgstr[0] ""
6486
  msgstr[1] ""
6487
 
6488
+ #: lib/wfScanEngine.php:492
6489
  msgid "See below."
6490
  msgstr ""
6491
 
6492
+ #: lib/wfScanEngine.php:495
6493
  msgid "Scan complete. Congratulations, no new problems found."
6494
  msgstr ""
6495
 
6496
+ #: lib/wfScanEngine.php:506
6497
  msgid "Checking if your site IP is generating spam"
6498
  msgstr ""
6499
 
6500
+ #: lib/wfScanEngine.php:525
6501
  msgid "Checking if your IP is generating spam is for paid members only"
6502
  msgstr ""
6503
 
6504
+ #: lib/wfScanEngine.php:532
6505
  msgid "Checking if your site is on a domain blocklist"
6506
  msgstr ""
6507
 
6508
+ #: lib/wfScanEngine.php:537
6509
  msgid "Checking if your site is on a domain blocklist is for paid members only"
6510
  msgstr ""
6511
 
6512
  #. translators: Error message.
6513
+ #: lib/wfScanEngine.php:573
6514
  msgid "Error checking domain blocklists: %s"
6515
  msgstr ""
6516
 
6517
  #. translators: WordPress site ID.
6518
+ #: lib/wfScanEngine.php:607
6519
  msgid "The multisite blog with ID %d is listed on Google's Safe Browsing malware list."
6520
  msgstr ""
6521
 
6522
+ #: lib/wfScanEngine.php:610
6523
  msgid "Your site is listed on Google's Safe Browsing malware list."
6524
  msgstr ""
6525
 
6526
  #. translators: 1. URL. 2. URL.
6527
+ #: lib/wfScanEngine.php:614
6528
  msgid "The URL %1$s is on the malware list. More info available at <a href=\"http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%2$s&client=googlechrome&hl=en-US\" target=\"_blank\" rel=\"noopener noreferrer\">Google Safe Browsing diagnostic page<span class=\"screen-reader-text\"> ("
6529
  msgstr ""
6530
 
6531
  #. translators: WordPress site ID.
6532
+ #: lib/wfScanEngine.php:620
6533
  msgid "The multisite blog with ID %d is listed on Google's Safe Browsing phishing list."
6534
  msgstr ""
6535
 
6536
+ #: lib/wfScanEngine.php:623
6537
  msgid "Your site is listed on Google's Safe Browsing phishing list."
6538
  msgstr ""
6539
 
6540
  #. translators: 1. URL. 2. URL.
6541
+ #: lib/wfScanEngine.php:627
6542
  msgid "The URL %1$s is on the phishing list. More info available at <a href=\"http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%2$s&client=googlechrome&hl=en-US\" target=\"_blank\" rel=\"noopener noreferrer\">Google Safe Browsing diagnostic page<span class=\"screen-reader-text\"> ("
6543
  msgstr ""
6544
 
6545
  #. translators: WordPress site ID.
6546
+ #: lib/wfScanEngine.php:633
6547
  msgid "The multisite blog with ID %d is listed on the Wordfence domain blocklist."
6548
  msgstr ""
6549
 
6550
+ #: lib/wfScanEngine.php:636
6551
  msgid "Your site is listed on the Wordfence domain blocklist."
6552
  msgstr ""
6553
 
6554
  #. translators: URL.
6555
+ #: lib/wfScanEngine.php:640
6556
  msgid "The URL %s is on the blocklist."
6557
  msgstr ""
6558
 
6559
  #. translators: WordPress site ID.
6560
+ #: lib/wfScanEngine.php:646
6561
  msgid "The multisite blog with ID %d is listed on a domain blocklist."
6562
  msgstr ""
6563
 
6564
+ #: lib/wfScanEngine.php:649
6565
  msgid "Your site is listed on a domain blocklist."
6566
  msgstr ""
6567
 
6568
  #. translators: URL.
6569
+ #: lib/wfScanEngine.php:651
6570
  msgid "The URL is: %s"
6571
  msgstr ""
6572
 
6573
+ #: lib/wfScanEngine.php:671
6574
  msgid "Checking for the most secure way to get IPs"
6575
  msgstr ""
6576
 
6577
+ #: lib/wfScanEngine.php:698
6578
  msgid "Unable to accurately detect IPs"
6579
  msgstr ""
6580
 
6581
  #. translators: Support URL.
6582
+ #: lib/wfScanEngine.php:699
6583
  msgid "Wordfence was unable to validate a test request to your website. This can happen if your website is behind a proxy that does not use one of the standard ways to convey the IP of the request or it is unreachable publicly. IP blocking and live traffic information may not be accurate. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Get More Information<span class=\"screen-reader-text\"> ("
6584
  msgstr ""
6585
 
6586
+ #: lib/wfScanEngine.php:709
6587
+ #: lib/wordfenceClass.php:6369
6588
  msgid "For maximum security use PHP's built in REMOTE_ADDR."
6589
  msgstr ""
6590
 
6591
+ #: lib/wfScanEngine.php:711
6592
+ #: lib/wordfenceClass.php:6372
6593
  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."
6594
  msgstr ""
6595
 
6596
+ #: lib/wfScanEngine.php:713
6597
+ #: lib/wordfenceClass.php:6375
6598
  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."
6599
  msgstr ""
6600
 
6601
+ #: lib/wfScanEngine.php:715
6602
+ #: lib/wordfenceClass.php:6378
6603
  msgid "This site appears to be behind Cloudflare, so using the Cloudflare \"CF-Connecting-IP\" HTTP header will resolve to the correct IPs."
6604
  msgstr ""
6605
 
6606
+ #: lib/wfScanEngine.php:719
6607
  msgid "'How does Wordfence get IPs' is misconfigured"
6608
  msgstr ""
6609
 
6610
  #. translators: Support URL.
6611
+ #: lib/wfScanEngine.php:722
6612
  msgid "A test request to this website was detected on a different value for this setting. IP blocking and live traffic information may not be accurate. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Get More Information<span class=\"screen-reader-text\"> ("
6613
  msgstr ""
6614
 
6615
+ #: lib/wfScanEngine.php:743
6616
  msgid "Check for publicly accessible configuration files, backup files and logs"
6617
  msgstr ""
6618
 
6619
  #. translators: File path.
6620
+ #: lib/wfScanEngine.php:794
6621
  msgid "Publicly accessible config, backup, or log file found: %s"
6622
  msgstr ""
6623
 
6624
  #. translators: 1. URL to publicly accessible file. 2. Support URL.
6625
+ #: lib/wfScanEngine.php:797
6626
  msgid "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%1$s</a> is publicly accessible and may expose source code or sensitive information about your site. Files such as this one are commonly checked for by scanners and should be made inaccessible. Alternately, some can be removed if you are certain your site does not need them. Sites using the nginx web server may need manual configuration changes to protect such files. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn more<span class=\"screen-reader-text\"> ("
6627
  msgstr ""
6628
 
6629
+ #: lib/wfScanEngine.php:827
6630
  msgid "Checking if your server discloses the path to the document root"
6631
  msgstr ""
6632
 
6633
+ #: lib/wfScanEngine.php:837
6634
  msgid "Web server exposes the document root"
6635
  msgstr ""
6636
 
6637
+ #: lib/wfScanEngine.php:838
6638
  msgid "Full Path Disclosure (FPD) vulnerabilities enable the attacker to see the path to the webroot/file. e.g.: /home/user/htdocs/file/. Certain vulnerabilities, such as using the load_file() (within a SQL Injection) query to view the page source, require the attacker to have the full path to the file they wish to view."
6639
  msgstr ""
6640
 
6641
+ #: lib/wfScanEngine.php:864
6642
  msgid "Directory listing is enabled"
6643
  msgstr ""
6644
 
6645
+ #: lib/wfScanEngine.php:865
6646
  msgid "Directory listing provides an attacker with the complete index of all the resources located inside of the directory. The specific risks and consequences vary depending on which files are listed and accessible, but it is recommended that you disable it unless it is needed."
6647
  msgstr ""
6648
 
6649
+ #: lib/wfScanEngine.php:881
6650
  msgid "Checking if your site is being Spamvertised"
6651
  msgstr ""
6652
 
6653
+ #: lib/wfScanEngine.php:900
6654
  msgid "Check if your site is being Spamvertized is for paid members only"
6655
  msgstr ""
6656
 
6657
+ #: lib/wfScanEngine.php:954
6658
+ msgid "Wordfence could not read the content of your WordPress directory. This usually indicates your permissions are so strict that your web server can't read your WordPress directory."
6659
  msgstr ""
6660
 
6661
+ #: lib/wfScanEngine.php:972
6662
  msgid "Checking for paths skipped due to scan settings"
6663
  msgstr ""
6664
 
6665
  #. translators: Number of paths skipped in scan.
6666
+ #: lib/wfScanEngine.php:982
6667
  msgid ", and %d more."
6668
  msgstr ""
6669
 
6670
  #. translators: Number of paths skipped in scan.
6671
+ #: lib/wfScanEngine.php:1006
6672
  msgid "%d path was skipped for the malware scan due to scan settings"
6673
  msgid_plural "%d paths were skipped for the malware scan due to scan settings"
6674
  msgstr[0] ""
6675
  msgstr[1] ""
6676
 
6677
  #. translators: 1. Number of paths skipped in scan. 2. Support URL. 3. List of skipped paths.
6678
+ #: lib/wfScanEngine.php:1009
6679
  msgid "The option \"Scan files outside your WordPress installation\" is off by default, which means %1$d path and its file(s) will not be scanned for malware or unauthorized changes. To continue skipping this path, you may ignore this issue. Or to start scanning it, enable the option and subsequent scans will include it. Some paths may not be necessary to scan, so this is optional. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
6680
  msgid_plural "The option \"Scan files outside your WordPress installation\" is off by default, which means %1$d paths and their file(s) will not be scanned for malware or unauthorized changes. To continue skipping these paths, you may ignore this issue. Or to start scanning them, enable the option and subsequent scans will include them. Some paths may not be necessary to scan, so this is optional. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
6681
  msgstr[0] ""
6682
  msgstr[1] ""
6683
 
6684
+ #: lib/wfScanEngine.php:1037
6685
  msgid "Including files that are outside the WordPress installation in the scan."
6686
  msgstr ""
6687
 
6688
+ #: lib/wfScanEngine.php:1040
6689
  msgid "Getting plugin list from WordPress"
6690
  msgstr ""
6691
 
6692
  #. translators: Number of plugins.
6693
+ #: lib/wfScanEngine.php:1042
6694
  msgid "Found %d plugin"
6695
  msgid_plural "Found %d plugins"
6696
  msgstr[0] ""
6697
  msgstr[1] ""
6698
 
6699
+ #: lib/wfScanEngine.php:1044
6700
  msgid "Getting theme list from WordPress"
6701
  msgstr ""
6702
 
6703
  #. translators: Number of themes.
6704
+ #: lib/wfScanEngine.php:1046
6705
  msgid "Found %d theme"
6706
  msgid_plural "Found %d themes"
6707
  msgstr[0] ""
6708
  msgstr[1] ""
6709
 
6710
+ #: lib/wfScanEngine.php:1063
6711
  msgid "Scanning file contents for infections and vulnerabilities"
6712
  msgstr ""
6713
 
6714
+ #: lib/wfScanEngine.php:1066
6715
  msgid "Skipping scan of file contents for infections and vulnerabilities"
6716
  msgstr ""
6717
 
6718
+ #: lib/wfScanEngine.php:1070
6719
  msgid "Scanning file contents for URLs on a domain blocklist"
6720
  msgstr ""
6721
 
6722
+ #: lib/wfScanEngine.php:1073
6723
  msgid "Skipping scan of file contents for URLs on a domain blocklist"
6724
  msgstr ""
6725
 
6726
+ #: lib/wfScanEngine.php:1078
6727
  msgid "Starting scan of file contents"
6728
  msgstr ""
6729
 
6730
+ #: lib/wfScanEngine.php:1094
6731
  msgid "Done file contents scan"
6732
  msgstr ""
6733
 
6734
  #. translators: Scan result description.
6735
+ #: lib/wfScanEngine.php:1102
6736
+ #: lib/wfScanEngine.php:2271
6737
+ #: lib/wfScanEngine.php:2313
6738
  msgid "Adding issue: %s"
6739
  msgstr ""
6740
 
6741
+ #: lib/wfScanEngine.php:1135
6742
  msgid "Scanning for publicly accessible quarantined files"
6743
  msgstr ""
6744
 
6745
  #. translators: File path.
6746
+ #: lib/wfScanEngine.php:1140
6747
  msgid "Testing accessibility of: %s"
6748
  msgstr ""
6749
 
6750
  #. translators: File path.
6751
+ #: lib/wfScanEngine.php:1149
6752
  msgid "Publicly accessible quarantined file found: %s"
6753
  msgstr ""
6754
 
6755
  #. translators: URL to publicly accessible file.
6756
+ #: lib/wfScanEngine.php:1152
6757
  msgid "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%1$s<span class=\"screen-reader-text\"> ("
6758
  msgstr ""
6759
 
6760
+ #: lib/wfScanEngine.php:1176
6761
  msgid "Scanning posts for URLs on a domain blocklist"
6762
  msgstr ""
6763
 
6764
  #. translators: Number of posts left to scan.
6765
+ #: lib/wfScanEngine.php:1199
6766
  msgid "Scanning posts with %d left to scan."
6767
  msgstr ""
6768
 
6769
+ #: lib/wfScanEngine.php:1221
6770
  msgid "Post title contains suspicious code"
6771
  msgstr ""
6772
 
6773
+ #: lib/wfScanEngine.php:1222
6774
  msgid "This post contains code that is suspicious. Please check the title of the post and confirm that the code in the title is not malicious."
6775
  msgstr ""
6776
 
6777
+ #: lib/wfScanEngine.php:1245
6778
  msgid "Examining URLs found in posts we scanned for dangerous websites"
6779
  msgstr ""
6780
 
6781
+ #: lib/wfScanEngine.php:1247
6782
+ #: lib/wfScanEngine.php:2234
6783
  msgid "Done examining URLs"
6784
  msgstr ""
6785
 
6786
  #. translators: 1. WordPress Post type. 2. URL.
6787
+ #: lib/wfScanEngine.php:1283
6788
+ #: lib/wfScanEngine.php:1303
6789
  msgid "%1$s contains a suspected malware URL: %2$s"
6790
  msgstr ""
6791
 
6792
  #. translators: 1. WordPress Post type. 2. URL. 3. URL.
6793
  #. translators: 1. WordPress post type. 2. URL. 3. URL.
6794
+ #: lib/wfScanEngine.php:1289
6795
+ #: lib/wfScanEngine.php:1432
6796
  msgid "This %1$s contains a suspected malware URL listed on Google's list of malware sites. The URL is: %2$s - More info available at <a href=\"http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%3$s&client=googlechrome&hl=en-US\" target=\"_blank\" rel=\"noopener noreferrer\">Google Safe Browsing diagnostic page<span class=\"screen-reader-text\"> ("
6797
  msgstr ""
6798
 
6799
  #. translators: 1. WordPress Post type. 2. URL.
6800
+ #: lib/wfScanEngine.php:1295
6801
  msgid "%1$s contains a suspected phishing site URL: %2$s"
6802
  msgstr ""
6803
 
6804
  #. translators: 1. WordPress Post type. 2. URL.
6805
  #. translators: 1. WordPress post type. 2. URL.
6806
+ #: lib/wfScanEngine.php:1298
6807
+ #: lib/wfScanEngine.php:1441
6808
  msgid "This %1$s contains a URL that is a suspected phishing site that is currently listed on Google's list of known phishing sites. The URL is: %2$s"
6809
  msgstr ""
6810
 
6811
  #. translators: 1. WordPress Post type. 2. URL.
6812
  #. translators: 1. WordPress post type. 2. URL.
6813
+ #: lib/wfScanEngine.php:1306
6814
+ #: lib/wfScanEngine.php:1449
6815
  msgid "This %1$s contains a URL that is currently listed on Wordfence's domain blocklist. The URL is: %2$s"
6816
  msgstr ""
6817
 
6818
  #. translators: Scan result description.
6819
+ #: lib/wfScanEngine.php:1315
6820
  msgid "Adding issue: %1$s"
6821
  msgstr ""
6822
 
6823
+ #: lib/wfScanEngine.php:1351
6824
  msgid "Scanning comments for URLs on a domain blocklist"
6825
  msgstr ""
6826
 
6827
  #. translators: Number of comments left to scan.
6828
+ #: lib/wfScanEngine.php:1375
6829
  msgid "Scanning comments with %d left to scan."
6830
  msgstr ""
6831
 
6832
  #. translators: 1. WordPress post type. 2. WordPress author username.
6833
+ #: lib/wfScanEngine.php:1429
6834
  msgid "%1$s with author %2$s contains a suspected malware URL."
6835
  msgstr ""
6836
 
6837
  #. translators: WordPress post type.
6838
+ #: lib/wfScanEngine.php:1438
6839
  msgid "%s contains a suspected phishing site URL."
6840
  msgstr ""
6841
 
6842
  #. translators: URL.
6843
+ #: lib/wfScanEngine.php:1446
6844
  msgid "%s contains a suspected malware URL."
6845
  msgstr ""
6846
 
6847
  #. translators: WordPress username.
6848
+ #: lib/wfScanEngine.php:1494
6849
  msgid "Author: %s"
6850
  msgstr ""
6851
 
6852
  #. translators: Email address.
6853
+ #: lib/wfScanEngine.php:1497
6854
  msgid "Email: %s"
6855
  msgstr ""
6856
 
6857
  #. translators: IP address.
6858
+ #: lib/wfScanEngine.php:1499
6859
  msgid "Source IP: %s"
6860
  msgstr ""
6861
 
6862
  #. translators: Comment description.
6863
+ #: lib/wfScanEngine.php:1500
6864
  msgid "Scanning comment with %s"
6865
  msgstr ""
6866
 
6867
  #. translators: Comment description.
6868
+ #: lib/wfScanEngine.php:1513
6869
+ #: lib/wfScanEngine.php:1519
6870
  msgid "Marking comment as spam for containing a malware URL. Comment has %s"
6871
  msgstr ""
6872
 
6873
  #. translators: Comment description.
6874
+ #: lib/wfScanEngine.php:1516
6875
  msgid "Marking comment as spam for containing a phishing URL. Comment has %s"
6876
  msgstr ""
6877
 
6878
  #. translators: Comment description.
6879
+ #: lib/wfScanEngine.php:1526
6880
  msgid "Scanned comment with %s"
6881
  msgstr ""
6882
 
6883
+ #: lib/wfScanEngine.php:1577
6884
  msgid "Scanning for weak passwords"
6885
  msgstr ""
6886
 
6887
+ #: lib/wfScanEngine.php:1588
6888
  msgid "We were unable to generate the user list for your password check."
6889
  msgstr ""
6890
 
6891
  #. translators: Number of users.
6892
+ #: lib/wfScanEngine.php:1604
6893
  msgid "Starting password strength check on %d user."
6894
  msgid_plural "Starting password strength check on %d users."
6895
  msgstr[0] ""
6896
  msgstr[1] ""
6897
 
6898
  #. translators: Number of users.
6899
+ #: lib/wfScanEngine.php:1613
6900
  msgid "Total of %d users left to process in password strength check."
6901
  msgid_plural "Total of %d users left to process in password strength check."
6902
  msgstr[0] ""
6903
  msgstr[1] ""
6904
 
6905
  #. translators: WordPress user ID.
6906
+ #: lib/wfScanEngine.php:1648
6907
  msgid "Could not get username for user with ID %d when checking password strength."
6908
  msgstr ""
6909
 
6910
  #. translators: 1. WordPress username. 2. WordPress user ID.
6911
+ #: lib/wfScanEngine.php:1654
6912
  msgid "Checking password strength of user '%1$s' with ID %2$d"
6913
  msgstr ""
6914
 
6915
  #. translators: 1. WordPress username. 2. WordPress capability.
6916
+ #: lib/wfScanEngine.php:1662
6917
  msgid "User \"%1$s\" with \"%2$s\" access has an easy password."
6918
  msgstr ""
6919
 
6920
  #. translators: WordPress capability.
6921
+ #: lib/wfScanEngine.php:1668
6922
  msgid "A user with the a role of '%s' has a password that is easy to guess. Please change this password yourself or ask the user to change it."
6923
  msgstr ""
6924
 
6925
  #. translators: WordPress username.
6926
+ #: lib/wfScanEngine.php:1676
6927
  msgid "User \"%s\" with 'subscriber' access has a very easy password."
6928
  msgstr ""
6929
 
6930
+ #: lib/wfScanEngine.php:1677
6931
  msgid "A user with 'subscriber' access has a password that is very easy to guess. Please either change it or ask the user to change their password."
6932
  msgstr ""
6933
 
6934
  #. translators: Scan result description.
6935
+ #: lib/wfScanEngine.php:1684
6936
  msgid "Adding issue %s"
6937
  msgstr ""
6938
 
6939
  #. translators: WordPress username.
6940
+ #: lib/wfScanEngine.php:1701
6941
  msgid "Completed checking password strength of user '%s'"
6942
  msgstr ""
6943
 
6944
+ #: lib/wfScanEngine.php:1734
6945
  msgid "Scanning to check available disk space"
6946
  msgstr ""
6947
 
6948
+ #: lib/wfScanEngine.php:1741
6949
  msgid "Unable to access available disk space information"
6950
  msgstr ""
6951
 
6952
  #. translators: 1. Number of bytes. 2. Number of bytes.
6953
+ #: lib/wfScanEngine.php:1750
6954
  msgid "Total disk space: %1$s -- Free disk space: %2$s"
6955
  msgstr ""
6956
 
6957
  #. translators: Number of bytes.
6958
+ #: lib/wfScanEngine.php:1755
6959
  msgid "The disk has %s MB available"
6960
  msgstr ""
6961
 
6962
  #. translators: Number of bytes.
6963
+ #: lib/wfScanEngine.php:1770
6964
  msgid "You have %s disk space remaining"
6965
  msgstr ""
6966
 
6967
  #. translators: Number of bytes.
6968
+ #: lib/wfScanEngine.php:1771
6969
  msgid "You only have %s of your disk space remaining. Please free up disk space or your website may stop serving requests."
6970
  msgstr ""
6971
 
6972
+ #: lib/wfScanEngine.php:1784
6973
  msgid "Checking Web Application Firewall status"
6974
  msgstr ""
6975
 
6976
+ #: lib/wfScanEngine.php:1795
6977
  msgid "Web Application Firewall is disabled"
6978
  msgstr ""
6979
 
6980
  #. translators: Support URL.
6981
+ #: lib/wfScanEngine.php:1796
6982
  msgid "Wordfence's Web Application Firewall has been unexpectedly disabled. If you see a notice at the top of the Wordfence admin pages that says \"The Wordfence Web Application Firewall cannot run,\" click the link in that message to rebuild the configuration. If this does not work, you may need to fix file permissions. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">More Details<span class=\"screen-reader-text\"> ("
6983
  msgstr ""
6984
 
6985
+ #: lib/wfScanEngine.php:1811
6986
  msgid "Scanning for old themes, plugins and core files"
6987
  msgstr ""
6988
 
6989
+ #: lib/wfScanEngine.php:1897
6990
  msgid "Your WordPress version is out of date"
6991
  msgstr ""
6992
 
6993
  #. translators: Software version.
6994
+ #: lib/wfScanEngine.php:1898
6995
  msgid "WordPress version %s is now available. Please upgrade immediately to get the latest security updates from WordPress."
6996
  msgstr ""
6997
 
6998
  #. translators: 1. Plugin name. 2. Software version. 3. Software version.
6999
+ #: lib/wfScanEngine.php:1925
7000
  msgid "The Plugin \"%1$s\" needs an upgrade (%2$s -> %3$s)."
7001
  msgstr ""
7002
 
7003
  #. translators: Theme name.
7004
+ #: lib/wfScanEngine.php:1932
7005
+ #: lib/wfScanEngine.php:1966
7006
  msgid "You need to upgrade \"%s\" to the newest version to ensure you have any security fixes the developer has released."
7007
  msgstr ""
7008
 
7009
  #. translators: 1. Theme name. 2. Software version. 3. Software version.
7010
+ #: lib/wfScanEngine.php:1959
7011
  msgid "The Theme \"%1$s\" needs an upgrade (%2$s -> %3$s)."
7012
  msgstr ""
7013
 
7014
  #. translators: 1. Plugin name. 2. Software version. 3. Software version.
7015
+ #: lib/wfScanEngine.php:2010
7016
  msgid "The Plugin \"%1$s\" appears to be abandoned (updated %2$s, tested to WP %3$s)."
7017
  msgstr ""
7018
 
7019
  #. translators: 1. Plugin name. 2. Software version.
7020
+ #: lib/wfScanEngine.php:2017
7021
  msgid "It was last updated %1$s ago and tested up to WordPress %2$s."
7022
  msgstr ""
7023
 
7024
  #. translators: 1. Plugin name. 2. Software version.
7025
+ #: lib/wfScanEngine.php:2024
7026
  msgid "The Plugin \"%1$s\" appears to be abandoned (updated %2$s)."
7027
  msgstr ""
7028
 
7029
  #. translators: Time duration.
7030
+ #: lib/wfScanEngine.php:2030
7031
  msgid "It was last updated %s ago."
7032
  msgstr ""
7033
 
7034
+ #: lib/wfScanEngine.php:2036
7035
+ #: lib/wfScanEngine.php:2075
7036
  msgid "It has unpatched security issues and may have compatibility problems with the current version of WordPress."
7037
  msgstr ""
7038
 
7039
+ #: lib/wfScanEngine.php:2038
7040
+ #: lib/wfScanEngine.php:2077
7041
  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."
7042
  msgstr ""
7043
 
7044
  #. translators: Support URL.
7045
+ #: lib/wfScanEngine.php:2042
7046
+ #: lib/wfScanEngine.php:2081
7047
+ #: lib/wfScanEngine.php:2269
7048
+ #: lib/wfScanEngine.php:2311
7049
  msgid "<a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Get more information.<span class=\"screen-reader-text\"> ("
7050
  msgstr ""
7051
 
7052
  #. translators: Plugin name.
7053
+ #: lib/wfScanEngine.php:2073
7054
  msgid "The Plugin \"%s\" has been removed from wordpress.org."
7055
  msgstr ""
7056
 
7057
+ #: lib/wfScanEngine.php:2126
7058
  msgid "Scanning for admin users not created through WordPress"
7059
  msgstr ""
7060
 
7061
  #. translators: WordPress username.
7062
+ #: lib/wfScanEngine.php:2148
7063
  msgid "An admin user with the username %s was created outside of WordPress."
7064
  msgstr ""
7065
 
7066
  #. translators: WordPress username.
7067
+ #: lib/wfScanEngine.php:2149
7068
  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."
7069
  msgstr ""
7070
 
7071
  #. translators: WordPress username.
7072
+ #: lib/wfScanEngine.php:2175
7073
  msgid "An admin user with a suspicious username %s was found."
7074
  msgstr ""
7075
 
7076
  #. translators: WordPress username.
7077
+ #: lib/wfScanEngine.php:2176
7078
  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."
7079
  msgstr ""
7080
 
7081
+ #: lib/wfScanEngine.php:2197
7082
  msgid "Scanning for suspicious site options"
7083
  msgstr ""
7084
 
7085
+ #: lib/wfScanEngine.php:2232
7086
  msgid "Examining URLs found in the options we scanned for dangerous websites"
7087
  msgstr ""
7088
 
7089
  #. translators: URL.
7090
+ #: lib/wfScanEngine.php:2256
7091
+ #: lib/wfScanEngine.php:2262
7092
  msgid "Option contains a suspected malware URL: %s"
7093
  msgstr ""
7094
 
7095
  #. translators: URL.
7096
+ #: lib/wfScanEngine.php:2257
7097
  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"
7098
  msgstr ""
7099
 
7100
  #. translators: URL.
7101
+ #: lib/wfScanEngine.php:2259
7102
  msgid "Option contains a suspected phishing site URL: %s"
7103
  msgstr ""
7104
 
7105
  #. translators: URL.
7106
+ #: lib/wfScanEngine.php:2260
7107
  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"
7108
  msgstr ""
7109
 
7110
  #. translators: URL.
7111
+ #: lib/wfScanEngine.php:2263
7112
  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"
7113
  msgstr ""
7114
 
7115
+ #: lib/wfScanEngine.php:2303
7116
  msgid "Checking for future GeoIP support"
7117
  msgstr ""
7118
 
7119
+ #: lib/wfScanEngine.php:2308
7120
  msgid "PHP Update Needed for Country Blocking"
7121
  msgstr ""
7122
 
7123
  #. translators: Software version.
7124
+ #: lib/wfScanEngine.php:2309
7125
  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."
7126
  msgstr ""
7127
 
7128
+ #: lib/wfScanEngine.php:2358
7129
  msgid "Previous scan was stopped successfully."
7130
  msgstr ""
7131
 
7132
+ #: lib/wfScanEngine.php:2359
7133
  msgid "Scan was stopped on administrator request."
7134
  msgstr ""
7135
 
7136
+ #: lib/wfScanEngine.php:2375
7137
  msgid "Entering start scan routine"
7138
  msgstr ""
7139
 
7140
+ #: lib/wfScanEngine.php:2378
7141
  msgid "A scan is already running. Use the stop scan button if you would like to terminate the current scan."
7142
  msgstr ""
7143
 
7144
  #. translators: Support URL.
7145
+ #: lib/wfScanEngine.php:2396
7146
  msgid "Test result of scan start URL fetch: %s"
7147
  msgstr ""
7148
 
7149
  #. translators: WordPress admin panel URL.
7150
+ #: lib/wfScanEngine.php:2405
7151
  msgid "Starting cron with normal ajax at URL %s"
7152
  msgstr ""
7153
 
7154
  #. translators: Error message.
7155
  #. translators: WordPress admin panel URL.
7156
+ #: lib/wfScanEngine.php:2427
7157
+ #: lib/wfScanEngine.php:2462
7158
  msgid "There was an error starting the scan: %s."
7159
  msgstr ""
7160
 
7161
+ #: lib/wfScanEngine.php:2429
7162
+ #: lib/wfScanEngine.php:2464
7163
  msgid "There was an unknown error starting the scan."
7164
  msgstr ""
7165
 
7166
+ #: lib/wfScanEngine.php:2436
7167
+ #: lib/wfScanEngine.php:2470
7168
  msgid "Scan process ended after forking."
7169
  msgstr ""
7170
 
7171
  #. translators: WordPress admin panel URL.
7172
+ #: lib/wfScanEngine.php:2440
7173
  msgid "Starting cron via proxy at URL %s"
7174
  msgstr ""
7175
 
7176
  #. translators: Time in seconds.
7177
+ #: lib/wfScanEngine.php:2516
7178
  msgid "Got value from wf config maxExecutionTime: %s"
7179
  msgstr ""
7180
 
7181
  #. translators: Time in seconds.
7182
+ #: lib/wfScanEngine.php:2520
7183
  msgid "getMaxExecutionTime() returning config value: %s"
7184
  msgstr ""
7185
 
7186
  #. translators: PHP ini value.
7187
+ #: lib/wfScanEngine.php:2527
7188
  msgid "Got max_execution_time value from ini: %s"
7189
  msgstr ""
7190
 
7191
  #. translators: 1. PHP ini setting. 2. Time in seconds.
7192
+ #: lib/wfScanEngine.php:2534
7193
  msgid "ini value of %1$d is higher than value for WORDFENCE_SCAN_MAX_INI_EXECUTION_TIME (%2$d), reducing"
7194
  msgstr ""
7195
 
7196
  #. translators: PHP ini setting.
7197
+ #: lib/wfScanEngine.php:2544
7198
  msgid "getMaxExecutionTime() returning half ini value: %d"
7199
  msgstr ""
7200
 
7201
+ #: lib/wfScanEngine.php:2550
7202
  msgid "getMaxExecutionTime() returning default of: 15"
7203
  msgstr ""
7204
 
7205
  #. translators: 1. HTTP status code.
7206
+ #: lib/wfScanEngine.php:2752
7207
  msgid "Got error response from Wordfence servers: %s"
7208
  msgstr ""
7209
 
7210
+ #: lib/wfScanEngine.php:2756
7211
  msgid "Invalid response from Wordfence servers."
7212
  msgstr ""
7213
 
7377
  "select the license about to expire and click the button to renew that license."
7378
  msgstr ""
7379
 
7380
+ #: lib/wordfenceClass.php:212
7381
  msgid "Your Premium Wordfence License is set to auto-renew in 10 days."
7382
  msgstr ""
7383
 
7384
+ #: lib/wordfenceClass.php:213
7385
  msgid "To update your license settings please visit http://www.wordfence.com/zz9/dashboard"
7386
  msgstr ""
7387
 
7388
+ #: lib/wordfenceClass.php:225
7389
  msgid "Your Premium Wordfence License expires in less than 2 weeks."
7390
  msgstr ""
7391
 
7392
+ #: lib/wordfenceClass.php:228
7393
  msgid "Your Premium Wordfence License expires in less than a week."
7394
  msgstr ""
7395
 
7396
+ #: lib/wordfenceClass.php:231
7397
  msgid "Your Premium Wordfence License expires in 2 days."
7398
  msgstr ""
7399
 
7400
+ #: lib/wordfenceClass.php:234
7401
  msgid "Your Premium Wordfence License expires in 1 day."
7402
  msgstr ""
7403
 
7404
+ #: lib/wordfenceClass.php:238
7405
  msgid "Your Wordfence Premium License has Expired!"
7406
  msgstr ""
7407
 
7408
+ #: lib/wordfenceClass.php:270
7409
  msgid "The Wordfence Premium License in use on this site has been removed from your account."
7410
  msgstr ""
7411
 
7412
+ #: lib/wordfenceClass.php:270
7413
  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."
7414
  msgstr ""
7415
 
7416
  #. translators: Wordfence license key.
7417
+ #: lib/wordfenceClass.php:280
7418
  msgid "Could not verify Wordfence License: %s"
7419
  msgstr ""
7420
 
7421
  #. translators: WordPress version.
7422
+ #: lib/wordfenceClass.php:362
7423
  msgid "WordPress (v%s)"
7424
  msgstr ""
7425
 
7426
  #. translators: Number of plugins.
7427
+ #: lib/wordfenceClass.php:366
7428
  msgid "%d plugin"
7429
  msgid_plural "%d plugins"
7430
  msgstr[0] ""
7431
  msgstr[1] ""
7432
 
7433
  #. translators: Number of themes.
7434
+ #: lib/wordfenceClass.php:371
7435
  msgid "%d theme"
7436
  msgid_plural "%d themes"
7437
  msgstr[0] ""
7438
  msgstr[1] ""
7439
 
7440
+ #: lib/wordfenceClass.php:375
7441
  msgid "An update is available for "
7442
  msgid_plural "Updates are available for "
7443
  msgstr[0] ""
7444
  msgstr[1] ""
7445
 
7446
+ #: lib/wordfenceClass.php:380
7447
  msgid "and "
7448
  msgstr ""
7449
 
7450
  #. translators: Wordfence version.
7451
+ #: lib/wordfenceClass.php:419
7452
  msgid "`runInstall` called with previous version = %s"
7453
  msgstr ""
7454
 
7455
+ #: lib/wordfenceClass.php:471
7456
+ #: lib/wordfenceClass.php:4032
7457
  msgid "Could not understand the response we received from the Wordfence servers when applying for a free license key."
7458
  msgstr ""
7459
 
7460
+ #: lib/wordfenceClass.php:835
7461
  msgid "Automatically generated from previous country blocking settings"
7462
  msgstr ""
7463
 
7464
+ #: lib/wordfenceClass.php:1282
7465
  #: views/user/disabled-application-passwords.php:15
7466
  msgid "Application passwords have been disabled by Wordfence."
7467
  msgstr ""
7468
 
7469
+ #: lib/wordfenceClass.php:1398
7470
  msgid "Upgrade To Premium"
7471
  msgstr ""
7472
 
7473
+ #: lib/wordfenceClass.php:1417
7474
  msgid "wp_mail from address is incomplete, attempting to fix"
7475
  msgstr ""
7476
 
7477
  #. translators: Email address.
7478
+ #: lib/wordfenceClass.php:1427
7479
  msgid "Fixing wp_mail from address: %s"
7480
  msgstr ""
7481
 
7482
+ #: lib/wordfenceClass.php:1526
7483
  msgid "You appear to have logged out or you are not an admin. Please sign-out and sign-in again."
7484
  msgstr ""
7485
 
7486
+ #: lib/wordfenceClass.php:1531
7487
  msgid "Your browser sent an invalid security token to Wordfence. Please try reloading this page or signing out and in again."
7488
  msgstr ""
7489
 
7490
+ #: lib/wordfenceClass.php:1537
7491
  msgid "Wordfence encountered an internal error executing that request."
7492
  msgstr ""
7493
 
7494
  #. translators: Error message.
7495
+ #: lib/wordfenceClass.php:1643
7496
  msgid "2FA Migration Error: %s"
7497
  msgstr ""
7498
 
7499
+ #: lib/wordfenceClass.php:1683
7500
  msgid "Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words."
7501
  msgstr ""
7502
 
7503
+ #: lib/wordfenceClass.php:1689
7504
  msgid "Passwords containing a space followed by \"wf\" without quotes are not allowed."
7505
  msgstr ""
7506
 
7507
  #. translators: Support URL.
7508
+ #: lib/wordfenceClass.php:1704
7509
  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>"
7510
  msgstr ""
7511
 
7512
  #. translators: 1. Password reset limit (number). 2. WordPress username.
7513
+ #: lib/wordfenceClass.php:1801
7514
  msgid "Exceeded the maximum number of tries to recover their password which is set at: %1$s. The last username or email they entered before getting locked out was: '%2$s'"
7515
  msgstr ""
7516
 
7517
+ #: lib/wordfenceClass.php:1849
7518
+ #: lib/wordfenceClass.php:2032
7519
  msgid "Sorry but your browser sent an invalid security token when trying to use this form."
7520
  msgstr ""
7521
 
7522
+ #: lib/wordfenceClass.php:1854
7523
  msgid "Please wait 3 minutes and try again"
7524
  msgstr ""
7525
 
7526
+ #: lib/wordfenceClass.php:1855
7527
  msgid "You have used this form too much. Please wait 3 minutes and try again."
7528
  msgstr ""
7529
 
7530
+ #: lib/wordfenceClass.php:1894
7531
  msgid "Unlock email requested"
7532
  msgstr ""
7533
 
7534
+ #: lib/wordfenceClass.php:1896
7535
  msgid "Your request was received"
7536
  msgstr ""
7537
 
7538
  #. translators: Email address.
7539
+ #: lib/wordfenceClass.php:1897
7540
  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."
7541
  msgstr ""
7542
 
7543
+ #: lib/wordfenceClass.php:1903
7544
  msgid "Invalid key provided for authentication."
7545
  msgstr ""
7546
 
7547
+ #: lib/wordfenceClass.php:1914
7548
  msgid "Request received via unlock email link to unblock all IPs."
7549
  msgstr ""
7550
 
7551
+ #: lib/wordfenceClass.php:1923
7552
  msgid "Request received via unlock email link to unblock all IPs via disabling firewall rules."
7553
  msgstr ""
7554
 
7555
+ #: lib/wordfenceClass.php:1931
7556
  msgid "Invalid function specified. Please check the link we emailed you and make sure it was not cut-off by your email reader."
7557
  msgstr ""
7558
 
7559
+ #: lib/wordfenceClass.php:1976
7560
  msgid "Unsubscribe Requested"
7561
  msgstr ""
7562
 
7563
+ #: lib/wordfenceClass.php:2038
7564
  msgid "An error occurred while saving the license."
7565
  msgstr ""
7566
 
7567
  #. translators: Error message.
7568
+ #: lib/wordfenceClass.php:2040
7569
+ #: lib/wordfenceClass.php:2060
7570
  msgid "An error occurred while saving the license: %s"
7571
  msgstr ""
7572
 
7573
+ #: lib/wordfenceClass.php:2076
7574
  msgid "Rescheduled missing daily cron"
7575
  msgstr ""
7576
 
7577
+ #: lib/wordfenceClass.php:2081
7578
  msgid "Rescheduled missing hourly cron"
7579
  msgstr ""
7580
 
7581
+ #: lib/wordfenceClass.php:2393
7582
+ #: lib/wordfenceClass.php:2397
7583
  msgid "Accessed a banned URL"
7584
  msgstr ""
7585
 
7586
+ #: lib/wordfenceClass.php:2404
7587
+ #: lib/wordfenceClass.php:2408
7588
  msgid "POST received with blank user-agent and referer"
7589
  msgstr ""
7590
 
7591
+ #: lib/wordfenceClass.php:2542
7592
  msgid "<strong>ERROR</strong>: You can't register using that username"
7593
  msgstr ""
7594
 
7595
+ #: lib/wordfenceClass.php:2582
7596
  msgid "Sorry, you are not allowed to list users."
7597
  msgstr ""
7598
 
7599
+ #: lib/wordfenceClass.php:2589
7600
  msgid "Invalid user ID."
7601
  msgstr ""
7602
 
7603
+ #: lib/wordfenceClass.php:2733
7604
  msgid "<strong>VERIFICATION FAILED</strong>: Two-factor authentication verification failed. Please try again."
7605
  msgstr ""
7606
 
7607
  #. translators: 1. WordPress username. 2. Password reset URL.
7608
  #. translators: 1. WordPress username. 2. Reset password URL.
7609
+ #: lib/wordfenceClass.php:2740
7610
+ #: lib/wordfenceClass.php:3190
7611
  msgid "<strong>ERROR</strong>: The username or password you entered is incorrect. <a href=\"%2$s\" title=\"Password Lost and Found\">Lost your password</a>?"
7612
  msgstr ""
7613
 
7614
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
7615
+ #: lib/wordfenceClass.php:2750
7616
+ #: lib/wordfenceClass.php:2886
7617
  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<span class=\"screen-reader-text\"> ("
7618
  msgstr ""
7619
 
7620
+ #: lib/wordfenceClass.php:2774
7621
  msgid "<strong>INVALID CODE</strong>: Please sign in again and add a space, the letters <code>wf</code>, and the code from your authenticator app to the end of your password (e.g., <code>wf123456</code>)."
7622
  msgstr ""
7623
 
7624
+ #: lib/wordfenceClass.php:2778
7625
  msgid "<strong>INVALID CODE</strong>: Please sign in again and add a space, the letters <code>wf</code>, and the code sent to your phone to the end of your password (e.g., <code>wf123456</code>)."
7626
  msgstr ""
7627
 
7628
+ #: lib/wordfenceClass.php:2785
7629
+ #: lib/wordfenceClass.php:2836
7630
+ #: lib/wordfenceClass.php:2859
7631
  msgid "<strong>AUTHENTICATION FAILURE</strong>: A temporary failure was encountered while trying to log in. Please try again."
7632
  msgstr ""
7633
 
7634
+ #: lib/wordfenceClass.php:2795
7635
  msgid "<strong>INVALID CODE</strong>: You need to enter the code generated by your authenticator app. The code should be a six digit number (e.g., 123456)."
7636
  msgstr ""
7637
 
7638
+ #: lib/wordfenceClass.php:2799
7639
  msgid "<strong>INVALID CODE</strong>: You need to enter the code generated sent to your phone. The code should be a six digit number (e.g., 123456)."
7640
  msgstr ""
7641
 
7642
+ #: lib/wordfenceClass.php:2845
7643
  msgid "<strong>CODE EXPIRED. CHECK YOUR PHONE:</strong> The code you entered has expired. Codes are only valid for 30 minutes for security reasons. We have sent you a new code. Please sign in using your username, password, and the new code we sent you."
7644
  msgstr ""
7645
 
7646
+ #: lib/wordfenceClass.php:2868
7647
  msgid "<strong>INVALID CODE</strong>: You need to enter your password and the code we sent to your phone. The code should start with 'wf' and should be four characters (e.g., wfAB12)."
7648
  msgstr ""
7649
 
7650
+ #: lib/wordfenceClass.php:2919
7651
  msgid "<strong>CODE REQUIRED</strong>: Please check your authenticator app for the current code. Enter it below to sign in."
7652
  msgstr ""
7653
 
7654
+ #: lib/wordfenceClass.php:2924
7655
  msgid "<strong>CODE REQUIRED</strong>: Please check your authenticator app for the current code. Please sign in again and add a space, the letters <code>wf</code>, and the code to the end of your password (e.g., <code>wf123456</code>)."
7656
  msgstr ""
7657
 
7658
+ #: lib/wordfenceClass.php:2958
7659
+ #: lib/wordfenceClass.php:3015
7660
  msgid "<strong>CHECK YOUR PHONE</strong>: A code has been sent to your phone and will arrive within 30 seconds. Enter it below to sign in."
7661
  msgstr ""
7662
 
7663
+ #: lib/wordfenceClass.php:2963
7664
  msgid "<strong>CHECK YOUR PHONE</strong>: A code has been sent to your phone and will arrive within 30 seconds. Please sign in again and add a space, the letters <code>wf</code>, and the code to the end of your password (e.g., <code>wf123456</code>)."
7665
  msgstr ""
7666
 
7667
+ #: lib/wordfenceClass.php:3020
7668
  msgid "<strong>CHECK YOUR PHONE</strong>: A code has been sent to your phone and will arrive within 30 seconds. Please sign in again and add a space and the code to the end of your password (e.g., <code>wfABCD</code>)."
7669
  msgstr ""
7670
 
7671
  #. translators: 1. Reset password URL. 2. Support URL.
7672
+ #: lib/wordfenceClass.php:3041
7673
+ #: lib/wordfenceClass.php:3077
7674
  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<span class=\"screen-reader-text\"> ("
7675
  msgstr ""
7676
 
7677
  #. translators: 1. Reset password URL. 2. Support URL.
7678
+ #: lib/wordfenceClass.php:3058
7679
+ #: lib/wordfenceClass.php:3094
7680
  msgid "<strong>INSECURE PASSWORD:</strong> Your login attempt has been blocked because 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\">reset your password</a> to reactivate your account. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span style=\"font-size:0;\"> (opens in new tab)</span></a>"
7681
  msgstr ""
7682
 
7683
+ #: lib/wordfenceClass.php:3066
7684
  msgid "Admin Login Blocked"
7685
  msgstr ""
7686
 
7687
  #. translators: WordPress username.
7688
+ #: lib/wordfenceClass.php:3066
7689
  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."
7690
  msgstr ""
7691
 
7692
  #. translators: WordPress username.
7693
+ #: lib/wordfenceClass.php:3067
7694
  msgid "<strong>Cellphone Sign-in Required</strong>: Cellphone Sign-in is required for all administrator accounts. Please contact the site administrator to enable it for your account."
7695
  msgstr ""
7696
 
7697
+ #: lib/wordfenceClass.php:3107
7698
  msgid "Blocked by Wordfence Security Network"
7699
  msgstr ""
7700
 
7701
+ #: lib/wordfenceClass.php:3137
7702
  msgid "Blocked by login security setting"
7703
  msgstr ""
7704
 
7705
  #. translators: WordPress username.
7706
+ #: lib/wordfenceClass.php:3147
7707
  msgid "Used an invalid username '%s' to try to sign in"
7708
  msgstr ""
7709
 
7710
  #. translators: 1. Login attempt limit. 2. WordPress username.
7711
+ #: lib/wordfenceClass.php:3166
7712
  msgid "Exceeded the maximum number of login failures which is: %1$s. The last username they tried to sign in with was: '%2$s'"
7713
  msgstr ""
7714
 
7715
+ #: lib/wordfenceClass.php:3523
7716
  msgid "An invalid type was specified to get file."
7717
  msgstr ""
7718
 
7719
+ #: lib/wordfenceClass.php:3539
7720
  msgid "We could not fetch a core WordPress file from the Wordfence API."
7721
  msgstr ""
7722
 
7723
+ #: lib/wordfenceClass.php:3598
7724
  msgid "Wordfence Test Email"
7725
  msgstr ""
7726
 
7727
  #. translators: 1. Site URL. 2. IP address.
7728
+ #: lib/wordfenceClass.php:3598
7729
  msgid ""
7730
  "This is a test email from %1$s.\n"
7731
  "The IP address that requested this was: %2$s"
7732
  msgstr ""
7733
 
7734
+ #: lib/wordfenceClass.php:3605
7735
  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.<span class=\"screen-reader-text\"> ("
7736
  msgstr ""
7737
 
7738
+ #: lib/wordfenceClass.php:3612
7739
  msgid "The username you specified does not exist."
7740
  msgstr ""
7741
 
7742
+ #: lib/wordfenceClass.php:3621
7743
  msgid "The username you specified is already enabled."
7744
  msgstr ""
7745
 
7746
+ #: lib/wordfenceClass.php:3626
7747
  msgid "Unknown authentication mode."
7748
  msgstr ""
7749
 
7750
+ #: lib/wordfenceClass.php:3631
7751
  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"
7752
  msgstr ""
7753
 
7754
  #. translators: Error message.
7755
+ #: lib/wordfenceClass.php:3638
7756
+ #: lib/wordfenceClass.php:3670
7757
+ #: lib/wordfenceClass.php:3733
7758
  msgid "Could not contact Wordfence servers to generate a verification code: %s"
7759
  msgstr ""
7760
 
7761
  #. translators: Error message.
7762
+ #: lib/wordfenceClass.php:3650
7763
+ #: lib/wordfenceClass.php:3694
7764
  msgid "Could not generate verification code: %s"
7765
  msgstr ""
7766
 
7767
  #. translators: Error message.
7768
+ #: lib/wordfenceClass.php:3651
7769
+ #: lib/wordfenceClass.php:3695
7770
  msgid "We could not generate a verification code."
7771
  msgstr ""
7772
 
7773
+ #: lib/wordfenceClass.php:3711
7774
  msgid "Unknown two-factor authentication mode."
7775
  msgstr ""
7776
 
7777
+ #: lib/wordfenceClass.php:3744
7778
  msgid "The code you entered is invalid. Cellphone sign-in will not be enabled for this user until you enter a valid code."
7779
  msgstr ""
7780
 
7781
+ #: lib/wordfenceClass.php:3749
7782
  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."
7783
  msgstr ""
7784
 
7785
+ #: lib/wordfenceClass.php:3831
7786
  msgid "That user has already been removed from the list."
7787
  msgstr ""
7788
 
7789
+ #: lib/wordfenceClass.php:3851
7790
  msgid "No scan is scheduled"
7791
  msgstr ""
7792
 
7793
+ #: lib/wordfenceClass.php:3856
7794
  msgid "Next scan is starting now"
7795
  msgstr ""
7796
 
7797
  #. translators: 1. Time until. 2. Localized date.
7798
+ #: lib/wordfenceClass.php:3859
7799
  msgid "Next scan in %1$s (%2$s)"
7800
  msgstr ""
7801
 
7802
  #. translators: Localized date.
7803
+ #: lib/wordfenceClass.php:3876
7804
  msgid "Scheduled Wordfence scan starting at %s"
7805
  msgstr ""
7806
 
7807
+ #: lib/wordfenceClass.php:3899
7808
  msgid "Sorry but this feature is only available for paid customers."
7809
  msgstr ""
7810
 
7811
  #. translators: Site URL.
7812
+ #: lib/wordfenceClass.php:3913
7813
  msgid "SITE: %s"
7814
  msgstr ""
7815
 
7816
  #. translators: Plugin version.
7817
+ #: lib/wordfenceClass.php:3914
7818
  msgid "PLUGIN VERSION: %s"
7819
  msgstr ""
7820
 
7821
  #. translators: WordPress version.
7822
+ #: lib/wordfenceClass.php:3915
7823
  msgid "WORDPRESS VERSION: %s"
7824
  msgstr ""
7825
 
7826
  #. translators: Wordfence license key.
7827
+ #: lib/wordfenceClass.php:3916
7828
  msgid "LICENSE KEY: %s"
7829
  msgstr ""
7830
 
7831
  #. translators: Email address.
7832
+ #: lib/wordfenceClass.php:3917
7833
  msgid "ADMIN EMAIL: %s"
7834
  msgstr ""
7835
 
7836
  #. translators: Email address.
7837
+ #: lib/wordfenceClass.php:3918
7838
  msgid "LOG:"
7839
  msgstr ""
7840
 
7841
+ #: lib/wordfenceClass.php:3934
7842
  msgid "# Scan Issues"
7843
  msgstr ""
7844
 
7845
  #. translators: Number of scan results.
7846
+ #: lib/wordfenceClass.php:3939
7847
  msgid "## New Issues (%d total)"
7848
  msgstr ""
7849
 
7850
  #. translators: Number of scan results.
7851
+ #: lib/wordfenceClass.php:3966
7852
  msgid "## Ignored Issues (%d total)"
7853
  msgstr ""
7854
 
7855
+ #: lib/wordfenceClass.php:3987
7856
  msgid "No Ignored Issues"
7857
  msgstr ""
7858
 
7859
+ #: lib/wordfenceClass.php:4009
7860
  msgid "Wordfence Activity Log"
7861
  msgstr ""
7862
 
7863
  #. translators: Error message.
7864
+ #: lib/wordfenceClass.php:4035
7865
  msgid "Could not fetch free license key from Wordfence: %s"
7866
  msgstr ""
7867
 
7868
+ #: lib/wordfenceClass.php:4126
7869
  msgid "We could not find your .htaccess file to modify it."
7870
  msgstr ""
7871
 
7872
  #. translators: Error message.
7873
+ #: lib/wordfenceClass.php:4131
7874
  msgid "We found your .htaccess file but could not open it for writing: %s"
7875
  msgstr ""
7876
 
7877
+ #: lib/wordfenceClass.php:4214
7878
  msgid "All Countries"
7879
  msgstr ""
7880
 
7881
+ #: lib/wordfenceClass.php:4217
7882
  msgid "1 Country"
7883
  msgstr ""
7884
 
7885
  #. translators: Number of countries.
7886
+ #: lib/wordfenceClass.php:4220
7887
  msgid "%d Countries"
7888
  msgstr ""
7889
 
7890
+ #: lib/wordfenceClass.php:4224
7891
  msgid "Entire Site"
7892
  msgstr ""
7893
 
7894
+ #: lib/wordfenceClass.php:4227
7895
  msgid "Login Only"
7896
  msgstr ""
7897
 
7898
+ #: lib/wordfenceClass.php:4230
7899
  msgid "Site Except Login"
7900
  msgstr ""
7901
 
7902
+ #: lib/wordfenceClass.php:4238
7903
  msgid "IP Range"
7904
  msgstr ""
7905
 
7906
  #. translators: 2FA backup codes.
7907
+ #: lib/wordfenceClass.php:4239
7908
+ #: lib/wordfenceClass.php:6237
7909
  msgid "User Agent"
7910
  msgstr ""
7911
 
7912
+ #: lib/wordfenceClass.php:4240
7913
  #: views/blocking/blocking-create.php:201
7914
  msgid "Referrer"
7915
  msgstr ""
7916
 
7917
+ #: lib/wordfenceClass.php:4255
7918
  msgid "Permanent"
7919
  msgstr ""
7920
 
7921
+ #: lib/wordfenceClass.php:4327
7922
  msgid "An error occurred while creating the block."
7923
  msgstr ""
7924
 
7925
+ #: lib/wordfenceClass.php:4333
7926
  msgid "No block parameters were provided."
7927
  msgstr ""
7928
 
7929
+ #: lib/wordfenceClass.php:4370
7930
+ #: lib/wordfenceClass.php:4402
7931
  msgid "No blocks were provided."
7932
  msgstr ""
7933
 
7934
+ #: lib/wordfenceClass.php:4434
7935
  msgid "The license provided is already in use on another site."
7936
  msgstr ""
7937
 
7938
+ #: lib/wordfenceClass.php:4439
7939
  msgid "The Wordfence activation server returned an unexpected response. Please try again."
7940
  msgstr ""
7941
 
7942
+ #: lib/wordfenceClass.php:4445
7943
  msgid "We received an error while trying to activate the license with the Wordfence servers: "
7944
  msgstr ""
7945
 
7946
+ #: lib/wordfenceClass.php:4458
7947
  msgid "No license was provided to install."
7948
  msgstr ""
7949
 
7950
+ #: lib/wordfenceClass.php:4509
7951
  msgid "An unknown configuration section was provided."
7952
  msgstr ""
7953
 
7954
+ #: lib/wordfenceClass.php:4515
7955
  msgid "No configuration section was provided."
7956
  msgstr ""
7957
 
7958
+ #: lib/wordfenceClass.php:4561
7959
+ #: lib/wordfenceClass.php:4566
7960
  msgid "An error occurred while saving the configuration."
7961
  msgstr ""
7962
 
7963
+ #: lib/wordfenceClass.php:4577
7964
  msgid "No configuration changes were provided to save."
7965
  msgstr ""
7966
 
7967
+ #: lib/wordfenceClass.php:4608
7968
+ #: lib/wordfenceClass.php:5241
7969
+ #: lib/wordfenceClass.php:5272
7970
+ #: lib/wordfenceClass.php:7356
7971
+ #: lib/wordfenceClass.php:7391
7972
+ #: lib/wordfenceClass.php:7423
7973
  msgid "We could not find that issue in our database."
7974
  msgstr ""
7975
 
7976
+ #: lib/wordfenceClass.php:4618
7977
  msgid "An error occurred while trying to hide the file."
7978
  msgstr ""
7979
 
7980
+ #: lib/wordfenceClass.php:4631
7981
  msgid "An invalid file was requested for hiding."
7982
  msgstr ""
7983
 
7984
+ #: lib/wordfenceClass.php:4658
7985
+ #: lib/wordfenceClass.php:5252
7986
  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."
7987
  msgstr ""
7988
 
7989
+ #: lib/wordfenceClass.php:4682
7990
  msgid "Manual permanent block by admin"
7991
  msgstr ""
7992
 
7993
+ #: lib/wordfenceClass.php:4718
7994
  msgid "Please enter a valid IP address to block."
7995
  msgstr ""
7996
 
7997
+ #: lib/wordfenceClass.php:4721
7998
  msgid "You can't block your own IP address."
7999
  msgstr ""
8000
 
8001
  #. translators: IP address.
8002
+ #: lib/wordfenceClass.php:4725
8003
  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."
8004
  msgstr ""
8005
 
8006
  #. translators: IP address.
8007
+ #: lib/wordfenceClass.php:4727
8008
  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."
8009
  msgstr ""
8010
 
8011
+ #: lib/wordfenceClass.php:4733
8012
  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."
8013
  msgstr ""
8014
 
8015
+ #: lib/wordfenceClass.php:4776
8016
  msgid "An invalid operation was called."
8017
  msgstr ""
8018
 
8019
+ #: lib/wordfenceClass.php:4786
8020
  msgid "An invalid status was specified when trying to update that issue."
8021
  msgstr ""
8022
 
8023
+ #: lib/wordfenceClass.php:4798
8024
  msgid "Scan stop request received."
8025
  msgstr ""
8026
 
8027
+ #: lib/wordfenceClass.php:4799
8028
  msgid "A request was received to stop the previous scan."
8029
  msgstr ""
8030
 
8031
+ #: lib/wordfenceClass.php:4848
8032
  msgid "Idle"
8033
  msgstr ""
8034
 
8035
  #. translators: Localized date.
8036
+ #: lib/wordfenceClass.php:4857
8037
  msgid "Scan completed on %s"
8038
  msgstr ""
8039
 
8040
+ #: lib/wordfenceClass.php:4864
8041
  msgid "Last scan failed"
8042
  msgstr ""
8043
 
8044
  #. translators: Time until.
8045
+ #: lib/wordfenceClass.php:4927
8046
  msgid "more than %s"
8047
  msgstr ""
8048
 
8049
  #. translators: Localized date.
8050
+ #: lib/wordfenceClass.php:4931
8051
  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."
8052
  msgstr ""
8053
 
8054
  #. translators: Localized date.
8055
+ #: lib/wordfenceClass.php:4931
8056
+ #: lib/wordfenceClass.php:4939
8057
+ #: lib/wordfenceClass.php:4958
8058
+ #: lib/wordfenceClass.php:4970
8059
+ #: lib/wordfenceClass.php:4978
8060
  msgid "Click here for steps you can try."
8061
  msgstr ""
8062
 
8063
  #. translators: Localized date.
8064
+ #: lib/wordfenceClass.php:4932
8065
  msgid "Cancel Scan"
8066
  msgstr ""
8067
 
8068
+ #: lib/wordfenceClass.php:4939
8069
  msgid "The previous scan has failed. Some sites may need adjustments to run scans reliably."
8070
  msgstr ""
8071
 
8072
  #. translators: Time limit (number).
8073
+ #: lib/wordfenceClass.php:4945
8074
  msgid "The previous scan has terminated because the time limit of %s was reached. This limit can be customized on the options page."
8075
  msgstr ""
8076
 
8077
+ #: lib/wordfenceClass.php:4951
8078
  msgid "The previous scan has terminated because we detected an update occurring during the scan."
8079
  msgstr ""
8080
 
8081
+ #: lib/wordfenceClass.php:4958
8082
  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."
8083
  msgstr ""
8084
 
8085
+ #: lib/wordfenceClass.php:4964
8086
  msgid "Scans are not functional because SSL is unavailable."
8087
  msgstr ""
8088
 
8089
+ #: lib/wordfenceClass.php:4970
8090
  msgid "The scan has failed because we were unable to contact the Wordfence servers. Some sites may need adjustments to run scans reliably."
8091
  msgstr ""
8092
 
8093
+ #: lib/wordfenceClass.php:4978
8094
  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."
8095
  msgstr ""
8096
 
8097
+ #: lib/wordfenceClass.php:5005
8098
  msgid "Invalid email address given."
8099
  msgstr ""
8100
 
8101
+ #: lib/wordfenceClass.php:5042
8102
+ #: lib/wordfenceClass.php:5163
8103
  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."
8104
  msgstr ""
8105
 
8106
  #. translators: 1. File path. 2. Error message.
8107
+ #: lib/wordfenceClass.php:5051
8108
  msgid "Could not delete file %1$s. Error was: %2$s"
8109
  msgstr ""
8110
 
8111
  #. translators: File path.
8112
+ #: lib/wordfenceClass.php:5072
8113
  msgid "We could not retrieve the original file of %s to do a repair."
8114
  msgstr ""
8115
 
8116
  #. translators: File path.
8117
+ #: lib/wordfenceClass.php:5077
8118
  msgid "An invalid file %s was specified for repair."
8119
  msgstr ""
8120
 
8121
  #. translators: File path.
8122
+ #: lib/wordfenceClass.php:5085
8123
  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."
8124
  msgstr ""
8125
 
8126
  #. translators: 1. File path. 2. Error message.
8127
+ #: lib/wordfenceClass.php:5088
8128
  msgid "We could not write to %1$s. The error was: %2$s"
8129
  msgstr ""
8130
 
8131
  #. translators: 1. File path. 2. Number of bytes.
8132
+ #: lib/wordfenceClass.php:5099
8133
  msgid "We could not write to %1$s. (%2$d bytes written) You may not have permission to modify files on your WordPress server."
8134
  msgstr ""
8135
 
8136
+ #: lib/wordfenceClass.php:5111
8137
  msgid "Deleted some files with errors"
8138
  msgstr ""
8139
 
8140
+ #: lib/wordfenceClass.php:5111
8141
  msgid "Repaired some files with errors"
8142
  msgstr ""
8143
 
8144
  #. translators: 1. Number of files. 2. Error message.
8145
+ #: lib/wordfenceClass.php:5114
8146
  msgid "Deleted %1$d files but we encountered the following errors with other files: %2$s"
8147
  msgstr ""
8148
 
8149
  #. translators: 1. Number of files. 2. Error message.
8150
+ #: lib/wordfenceClass.php:5116
8151
  msgid "Repaired %1$d files but we encountered the following errors with other files: %2$s"
8152
  msgstr ""
8153
 
8154
  #. translators: Number of files.
8155
+ #: lib/wordfenceClass.php:5120
8156
  msgid "Deleted %d files successfully"
8157
  msgstr ""
8158
 
8159
  #. translators: Number of files.
8160
+ #: lib/wordfenceClass.php:5120
8161
  msgid "Repaired %d files successfully"
8162
  msgstr ""
8163
 
8164
  #. translators: Number of files.
8165
+ #: lib/wordfenceClass.php:5121
8166
  msgid "Deleted %d files successfully. No errors were encountered."
8167
  msgstr ""
8168
 
8169
  #. translators: Number of files.
8170
+ #: lib/wordfenceClass.php:5121
8171
  msgid "Repaired %d files successfully. No errors were encountered."
8172
  msgstr ""
8173
 
8174
+ #: lib/wordfenceClass.php:5124
8175
  msgid "Could not delete files"
8176
  msgstr ""
8177
 
8178
+ #: lib/wordfenceClass.php:5124
8179
  msgid "Could not repair files"
8180
  msgstr ""
8181
 
8182
  #. translators: Error message.
8183
+ #: lib/wordfenceClass.php:5127
8184
  msgid "We could not delete any of the files you selected. We encountered the following errors: %s"
8185
  msgstr ""
8186
 
8187
  #. translators: Error message.
8188
+ #: lib/wordfenceClass.php:5129
8189
  msgid "We could not repair any of the files you selected. We encountered the following errors: %s"
8190
  msgstr ""
8191
 
8192
+ #: lib/wordfenceClass.php:5132
8193
  msgid "Nothing done"
8194
  msgstr ""
8195
 
8196
+ #: lib/wordfenceClass.php:5133
8197
  msgid "We didn't delete anything and no errors were found."
8198
  msgstr ""
8199
 
8200
+ #: lib/wordfenceClass.php:5133
8201
  msgid "We didn't repair anything and no errors were found."
8202
  msgstr ""
8203
 
8204
+ #: lib/wordfenceClass.php:5141
8205
  msgid "Invalid bulk operation selected"
8206
  msgstr ""
8207
 
8208
+ #: lib/wordfenceClass.php:5151
8209
  msgid "Could not delete file because we could not find that issue."
8210
  msgstr ""
8211
 
8212
+ #: lib/wordfenceClass.php:5154
8213
  msgid "Could not delete file because that issue does not appear to be a file related issue."
8214
  msgstr ""
8215
 
8216
+ #: lib/wordfenceClass.php:5159
8217
  msgid "An invalid file was requested for deletion."
8218
  msgstr ""
8219
 
8220
  #. translators: 1. File path. 2. Error message.
8221
+ #: lib/wordfenceClass.php:5202
8222
  msgid "Could not delete file %1$s. The error was: %2$s"
8223
  msgstr ""
8224
 
8225
+ #: lib/wordfenceClass.php:5215
8226
  msgid "Could not remove the option because we could not find that issue."
8227
  msgstr ""
8228
 
8229
+ #: lib/wordfenceClass.php:5218
8230
  msgid "Could not remove the option because that issue does not appear to be a database related issue."
8231
  msgstr ""
8232
 
8233
  #. translators: 1. WordPress option. 2. Error message.
8234
+ #: lib/wordfenceClass.php:5231
8235
  msgid "Could not remove the option %1$s. The error was: %2$s"
8236
  msgstr ""
8237
 
8238
+ #: lib/wordfenceClass.php:5258
8239
  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."
8240
  msgstr ""
8241
 
8242
+ #: lib/wordfenceClass.php:5300
8243
  msgid "We could not get the original file to do a repair."
8244
  msgstr ""
8245
 
8246
+ #: lib/wordfenceClass.php:5304
8247
  msgid "An invalid file was specified for repair."
8248
  msgstr ""
8249
 
8250
+ #: lib/wordfenceClass.php:5324
8251
  msgid "We could not write to that file. You may not have permission to modify files on your WordPress server."
8252
  msgstr ""
8253
 
8254
+ #: lib/wordfenceClass.php:5328
8255
  msgid "Ajax request received to start scan."
8256
  msgstr ""
8257
 
8258
  #. translators: Number of URLs.
8259
+ #: lib/wordfenceClass.php:5383
8260
  msgid "Page contains %d malware URL: "
8261
  msgid_plural "Page contains %d malware URLs: "
8262
  msgstr[0] ""
8263
  msgstr[1] ""
8264
 
8265
+ #: lib/wordfenceClass.php:5386
8266
  msgid "Run a Scan"
8267
  msgstr ""
8268
 
8269
+ #: lib/wordfenceClass.php:5434
8270
  msgid "Unknown dashboard data set."
8271
  msgstr ""
8272
 
8273
+ #: lib/wordfenceClass.php:5465
8274
  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."
8275
  msgstr ""
8276
 
8277
+ #: lib/wordfenceClass.php:5652
8278
  msgid "An invalid IP address was specified."
8279
  msgstr ""
8280
 
8281
+ #: lib/wordfenceClass.php:5694
8282
+ msgid "This link has expired. Refresh the scan results page and try again."
8283
+ msgstr ""
8284
+
8285
+ #: lib/wordfenceClass.php:5718
8286
+ #: lib/wordfenceClass.php:5761
8287
+ #: lib/wordfenceClass.php:5810
8288
  msgid "File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)"
8289
  msgstr ""
8290
 
8291
+ #: lib/wordfenceClass.php:5725
8292
+ #: lib/wordfenceClass.php:5817
8293
  msgid "Invalid file requested. (Relative paths not allowed)"
8294
  msgstr ""
8295
 
8296
+ #: lib/wordfenceClass.php:5729
8297
+ #: lib/wordfenceClass.php:5765
8298
+ #: lib/wordfenceClass.php:5821
8299
  msgid "File contains illegal characters."
8300
  msgstr ""
8301
 
8302
  #. translators: Error message.
8303
+ #: lib/wordfenceClass.php:5739
8304
  msgid "We could not open the requested file for reading. The error was: %s"
8305
  msgstr ""
8306
 
8307
+ #: lib/wordfenceClass.php:5747
8308
  msgid "Greater than 2 Gigs"
8309
  msgstr ""
8310
 
8311
+ #: lib/wordfenceClass.php:5752
8312
  msgid "Unknown file size."
8313
  msgstr ""
8314
 
8315
+ #: lib/wordfenceClass.php:5774
8316
  msgid "We could not get the contents of the original file to do a comparison."
8317
  msgstr ""
8318
 
8319
+ #: lib/wordfenceClass.php:5783
8320
+ msgid "Empty file path provided"
8321
+ msgstr ""
8322
+
8323
+ #: lib/wordfenceClass.php:5788
8324
+ msgid "Unable to read file contents"
8325
+ msgstr ""
8326
+
8327
+ #: lib/wordfenceClass.php:5825
8328
  msgid "File does not exist."
8329
  msgstr ""
8330
 
8331
+ #: lib/wordfenceClass.php:6079
8332
  #: views/dashboard/options-group-import.php:167
8333
  msgid "Reload"
8334
  msgstr ""
8335
 
8336
+ #: lib/wordfenceClass.php:6096
8337
  msgid "${totalIPs} addresses in this network"
8338
  msgstr ""
8339
 
8340
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
8341
+ #: lib/wordfenceClass.php:6097
8342
  msgid "%s in POST body: %s"
8343
  msgstr ""
8344
 
8345
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
8346
+ #: lib/wordfenceClass.php:6098
8347
  msgid "%s in cookie: %s"
8348
  msgstr ""
8349
 
8350
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
8351
+ #: lib/wordfenceClass.php:6099
8352
  msgid "%s in file: %s"
8353
  msgstr ""
8354
 
8355
  #. translators: 1. Description of firewall action. 2. Description of input parameters.
8356
+ #: lib/wordfenceClass.php:6100
8357
  msgid "%s in query string: %s"
8358
  msgstr ""
8359
 
8360
  #. translators: Domain name.
8361
+ #: lib/wordfenceClass.php:6101
8362
  msgid "%s is not valid hostname"
8363
  msgstr ""
8364
 
8365
  #. translators: Domain name.
8366
+ #: lib/wordfenceClass.php:6102
8367
  msgid ".htaccess Updated"
8368
  msgstr ""
8369
 
8370
+ #: lib/wordfenceClass.php:6103
8371
  msgid ".htaccess change"
8372
  msgstr ""
8373
 
8374
+ #: lib/wordfenceClass.php:6104
8375
  msgid "404 Not Found"
8376
  msgstr ""
8377
 
8378
+ #: lib/wordfenceClass.php:6105
8379
  msgid "Activity Log Sent"
8380
  msgstr ""
8381
 
8382
+ #: lib/wordfenceClass.php:6106
8383
  msgid "Add action to allowlist"
8384
  msgstr ""
8385
 
8386
+ #: lib/wordfenceClass.php:6107
8387
  msgid "Add code to .htaccess"
8388
  msgstr ""
8389
 
8390
+ #: lib/wordfenceClass.php:6108
8391
  msgid "All Hits"
8392
  msgstr ""
8393
 
8394
  #. translators: WordPress username.
8395
+ #: lib/wordfenceClass.php:6109
8396
  msgid "All capabilties of admin user %s were successfully revoked."
8397
  msgstr ""
8398
 
8399
+ #: lib/wordfenceClass.php:6111
8400
  msgid "An error occurred when adding the request to the allowlist."
8401
  msgstr ""
8402
 
8403
+ #: lib/wordfenceClass.php:6112
8404
  msgid "Are you sure you want to allowlist this action?"
8405
  msgstr ""
8406
 
8407
+ #: lib/wordfenceClass.php:6113
8408
  msgid "Authentication Code"
8409
  msgstr ""
8410
 
8411
+ #: lib/wordfenceClass.php:6114
8412
  msgid "Background Request Blocked"
8413
  msgstr ""
8414
 
8415
+ #: lib/wordfenceClass.php:6115
8416
  msgid "Block This Network"
8417
  msgstr ""
8418
 
8419
+ #: lib/wordfenceClass.php:6117
8420
  msgid "Blocked By Firewall"
8421
  msgstr ""
8422
 
8423
+ #: lib/wordfenceClass.php:6118
8424
  msgid "Blocked WAF"
8425
  msgstr ""
8426
 
8427
+ #: lib/wordfenceClass.php:6119
8428
  msgid "Blocked by Wordfence"
8429
  msgstr ""
8430
 
8431
+ #: lib/wordfenceClass.php:6120
8432
  msgid "Blocked by Wordfence plugin settings"
8433
  msgstr ""
8434
 
8435
+ #: lib/wordfenceClass.php:6121
8436
  msgid "Blocked by the Wordfence Application Firewall and plugin settings"
8437
  msgstr ""
8438
 
8439
+ #: lib/wordfenceClass.php:6122
8440
  msgid "Blocked by the Wordfence Security Network"
8441
  msgstr ""
8442
 
8443
+ #: lib/wordfenceClass.php:6123
8444
  msgid "Blocked by the Wordfence Web Application Firewall"
8445
  msgstr ""
8446
 
8447
+ #: lib/wordfenceClass.php:6126
8448
  msgid "Cellphone Sign-In Recovery Codes"
8449
  msgstr ""
8450
 
8451
+ #: lib/wordfenceClass.php:6127
8452
  msgid "Cellphone Sign-in activated for user."
8453
  msgstr ""
8454
 
8455
+ #: lib/wordfenceClass.php:6128
8456
  msgid "Click here to download a backup copy of this file now"
8457
  msgstr ""
8458
 
8459
+ #: lib/wordfenceClass.php:6129
8460
  msgid "Click here to download a backup copy of your .htaccess file now"
8461
  msgstr ""
8462
 
8463
+ #: lib/wordfenceClass.php:6130
8464
  msgid "Click to fix .htaccess"
8465
  msgstr ""
8466
 
8467
+ #: lib/wordfenceClass.php:6132
8468
  msgid "Crawlers"
8469
  msgstr ""
8470
 
8471
+ #: lib/wordfenceClass.php:6133
8472
  msgid "Diagnostic report has been sent successfully."
8473
  msgstr ""
8474
 
8475
+ #: lib/wordfenceClass.php:6134
8476
  msgid "Directory Listing Disabled"
8477
  msgstr ""
8478
 
8479
+ #: lib/wordfenceClass.php:6135
8480
  msgid "Directory listing has been disabled on your server."
8481
  msgstr ""
8482
 
8483
+ #: lib/wordfenceClass.php:6138
8484
  msgid "Don't ask again"
8485
  msgstr ""
8486
 
8487
+ #: lib/wordfenceClass.php:6140
8488
  msgid "Download Backup File"
8489
  msgstr ""
8490
 
8491
+ #: lib/wordfenceClass.php:6141
8492
  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:"
8493
  msgstr ""
8494
 
8495
+ #: lib/wordfenceClass.php:6142
8496
  msgid "Email Diagnostic Report"
8497
  msgstr ""
8498
 
8499
+ #: lib/wordfenceClass.php:6143
8500
  msgid "Email Wordfence Activity Log"
8501
  msgstr ""
8502
 
8503
+ #: lib/wordfenceClass.php:6145
8504
  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."
8505
  msgstr ""
8506
 
8507
+ #: lib/wordfenceClass.php:6146
8508
  msgid "Error"
8509
  msgstr ""
8510
 
8511
+ #: lib/wordfenceClass.php:6147
8512
  msgid "Error Enabling All Options Page"
8513
  msgstr ""
8514
 
8515
+ #: lib/wordfenceClass.php:6148
8516
  msgid "Error Restoring Defaults"
8517
  msgstr ""
8518
 
8519
+ #: lib/wordfenceClass.php:6149
8520
  msgid "Error Saving Option"
8521
  msgstr ""
8522
 
8523
+ #: lib/wordfenceClass.php:6150
8524
  msgid "Error Saving Options"
8525
  msgstr ""
8526
 
8527
+ #: lib/wordfenceClass.php:6151
8528
  msgid "Failed Login"
8529
  msgstr ""
8530
 
8531
+ #: lib/wordfenceClass.php:6152
8532
  msgid "Failed Login: Invalid Username"
8533
  msgstr ""
8534
 
8535
+ #: lib/wordfenceClass.php:6153
8536
  msgid "Failed Login: Valid Username"
8537
  msgstr ""
8538
 
8539
+ #: lib/wordfenceClass.php:6154
8540
  msgid "File hidden successfully"
8541
  msgstr ""
8542
 
8543
+ #: lib/wordfenceClass.php:6155
8544
  msgid "File restored OK"
8545
  msgstr ""
8546
 
8547
+ #: lib/wordfenceClass.php:6156
8548
  msgid "Filter Traffic"
8549
  msgstr ""
8550
 
8551
+ #: lib/wordfenceClass.php:6157
8552
  msgid "Firewall Response"
8553
  msgstr ""
8554
 
8555
+ #: lib/wordfenceClass.php:6158
8556
  #: views/scanner/issue-wpscan_fullPathDiscl.php:8
8557
  msgid "Full Path Disclosure"
8558
  msgstr ""
8559
 
8560
+ #: lib/wordfenceClass.php:6159
8561
  msgid "Google Bot"
8562
  msgstr ""
8563
 
8564
+ #: lib/wordfenceClass.php:6160
8565
  msgid "Google Crawlers"
8566
  msgstr ""
8567
 
8568
+ #: lib/wordfenceClass.php:6161
8569
  msgid "HTTP Response Code"
8570
  msgstr ""
8571
 
8572
+ #: lib/wordfenceClass.php:6163
8573
  msgid "Humans"
8574
  msgstr ""
8575
 
8576
+ #: lib/wordfenceClass.php:6165
8577
  msgid "Key:"
8578
  msgstr ""
8579
 
8580
  #. translators: Localized date.
8581
+ #: lib/wordfenceClass.php:6166
8582
  msgid "Last Updated: %s"
8583
  msgstr ""
8584
 
8585
  #. translators: Localized date.
8586
+ #: lib/wordfenceClass.php:6167
8587
  msgid "Learn more about repairing modified files."
8588
  msgstr ""
8589
 
8590
+ #: lib/wordfenceClass.php:6169
8591
  msgid "Locked Out"
8592
  msgstr ""
8593
 
8594
+ #: lib/wordfenceClass.php:6170
8595
  msgid "Locked out from logging in"
8596
  msgstr ""
8597
 
8598
+ #: lib/wordfenceClass.php:6171
8599
  msgid "Logged In"
8600
  msgstr ""
8601
 
8602
+ #: lib/wordfenceClass.php:6172
8603
  msgid "Logins"
8604
  msgstr ""
8605
 
8606
+ #: lib/wordfenceClass.php:6173
8607
  msgid "Logins and Logouts"
8608
  msgstr ""
8609
 
8610
  #. translators: Localized date.
8611
+ #: lib/wordfenceClass.php:6176
8612
  msgid "Next Update Check: %s"
8613
  msgstr ""
8614
 
8615
  #. translators: Localized date.
8616
+ #: lib/wordfenceClass.php:6177
8617
  msgid "No activity to report yet. Please complete your first scan."
8618
  msgstr ""
8619
 
8620
+ #: lib/wordfenceClass.php:6178
8621
  msgid "No issues have been ignored."
8622
  msgstr ""
8623
 
8624
+ #: lib/wordfenceClass.php:6179
8625
  msgid "No new issues have been found."
8626
  msgstr ""
8627
 
8628
+ #: lib/wordfenceClass.php:6180
8629
  msgid "No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory."
8630
  msgstr ""
8631
 
8632
+ #: lib/wordfenceClass.php:6181
8633
  msgid "No rules were updated. Please verify your website can reach the Wordfence servers."
8634
  msgstr ""
8635
 
8636
+ #: lib/wordfenceClass.php:6182
8637
  msgid "No rules were updated. Your website has reached the maximum number of rule update requests. Please try again later."
8638
  msgstr ""
8639
 
8640
+ #: lib/wordfenceClass.php:6183
8641
  msgid "Note: Status will update when changes are saved"
8642
  msgstr ""
8643
 
8644
+ #: lib/wordfenceClass.php:6184
8645
  msgid "OK"
8646
  msgstr ""
8647
 
8648
+ #: lib/wordfenceClass.php:6185
8649
  msgid "Pages Not Found"
8650
  msgstr ""
8651
 
8652
+ #: lib/wordfenceClass.php:6186
8653
  msgid "Paid Members Only"
8654
  msgstr ""
8655
 
8656
+ #: lib/wordfenceClass.php:6188
8657
  msgid "Please enter a valid email address."
8658
  msgstr ""
8659
 
8660
+ #: lib/wordfenceClass.php:6189
8661
  msgid "Please include your support ticket number or forum username."
8662
  msgstr ""
8663
 
8664
+ #: lib/wordfenceClass.php:6190
8665
  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:"
8666
  msgstr ""
8667
 
8668
+ #: lib/wordfenceClass.php:6191
8669
  msgid "Please specify a reason"
8670
  msgstr ""
8671
 
8672
+ #: lib/wordfenceClass.php:6192
8673
  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."
8674
  msgstr ""
8675
 
8676
+ #: lib/wordfenceClass.php:6193
8677
  msgid "Please specify either an IP address range, Hostname or a web browser pattern to match."
8678
  msgstr ""
8679
 
8680
+ #: lib/wordfenceClass.php:6194
8681
  msgid "Recent Activity"
8682
  msgstr ""
8683
 
8684
+ #: lib/wordfenceClass.php:6195
8685
  msgid "Recovery Codes"
8686
  msgstr ""
8687
 
8688
+ #: lib/wordfenceClass.php:6196
8689
  msgid "Redirected"
8690
  msgstr ""
8691
 
8692
+ #: lib/wordfenceClass.php:6197
8693
  msgid "Redirected by Country Blocking bypass URL"
8694
  msgstr ""
8695
 
8696
+ #: lib/wordfenceClass.php:6198
8697
  msgid "Referer"
8698
  msgstr ""
8699
 
8700
+ #: lib/wordfenceClass.php:6199
8701
  msgid "Registered Users"
8702
  msgstr ""
8703
 
8704
+ #: lib/wordfenceClass.php:6201
8705
  msgid "Rule Update Failed"
8706
  msgstr ""
8707
 
8708
+ #: lib/wordfenceClass.php:6202
8709
  msgid "Rules Updated"
8710
  msgstr ""
8711
 
8712
+ #: lib/wordfenceClass.php:6204
8713
  msgid "Scan Complete."
8714
  msgstr ""
8715
 
8716
+ #: lib/wordfenceClass.php:6205
8717
  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."
8718
  msgstr ""
8719
 
8720
+ #: lib/wordfenceClass.php:6206
8721
  msgid "Security Event"
8722
  msgstr ""
8723
 
8724
+ #: lib/wordfenceClass.php:6207
8725
  msgid "Send"
8726
  msgstr ""
8727
 
8728
+ #: lib/wordfenceClass.php:6208
8729
  msgid "Sorry, but no data for that IP or domain was found."
8730
  msgstr ""
8731
 
8732
+ #: lib/wordfenceClass.php:6209
8733
  msgid "Specify a valid IP range"
8734
  msgstr ""
8735
 
8736
+ #: lib/wordfenceClass.php:6210
8737
  msgid "Specify a valid hostname"
8738
  msgstr ""
8739
 
8740
+ #: lib/wordfenceClass.php:6211
8741
  msgid "Specify an IP range, Hostname or Browser pattern"
8742
  msgstr ""
8743
 
8744
+ #: lib/wordfenceClass.php:6212
8745
  msgid "Success deleting file"
8746
  msgstr ""
8747
 
8748
+ #: lib/wordfenceClass.php:6213
8749
  msgid "Success removing option"
8750
  msgstr ""
8751
 
8752
+ #: lib/wordfenceClass.php:6214
8753
  msgid "Success restoring file"
8754
  msgstr ""
8755
 
8756
+ #: lib/wordfenceClass.php:6215
8757
  msgid "Success updating option"
8758
  msgstr ""
8759
 
8760
+ #: lib/wordfenceClass.php:6216
8761
  msgid "Successfully deleted admin"
8762
  msgstr ""
8763
 
8764
+ #: lib/wordfenceClass.php:6217
8765
  msgid "Successfully revoked admin"
8766
  msgstr ""
8767
 
8768
+ #: lib/wordfenceClass.php:6218
8769
  msgid "Test Email Sent"
8770
  msgstr ""
8771
 
8772
+ #: lib/wordfenceClass.php:6219
8773
  msgid "The 'How does Wordfence get IPs' option was successfully updated to the recommended value."
8774
  msgstr ""
8775
 
8776
+ #: lib/wordfenceClass.php:6220
8777
  msgid "The Full Path disclosure issue has been fixed"
8778
  msgstr ""
8779
 
8780
  #. translators: WordPress username.
8781
+ #: lib/wordfenceClass.php:6221
8782
  msgid "The admin user %s was successfully deleted."
8783
  msgstr ""
8784
 
8785
  #. translators: File path.
8786
+ #: lib/wordfenceClass.php:6222
8787
  msgid "The file %s was successfully deleted."
8788
  msgstr ""
8789
 
8790
  #. translators: File path.
8791
+ #: lib/wordfenceClass.php:6223
8792
  msgid "The file %s was successfully hidden from public view."
8793
  msgstr ""
8794
 
8795
  #. translators: File path.
8796
+ #: lib/wordfenceClass.php:6224
8797
  msgid "The file %s was successfully restored."
8798
  msgstr ""
8799
 
8800
  #. translators: WordPress option.
8801
+ #: lib/wordfenceClass.php:6225
8802
  msgid "The option %s was successfully removed."
8803
  msgstr ""
8804
 
8805
  #. translators: WordPress option.
8806
+ #: lib/wordfenceClass.php:6226
8807
  msgid "The request has been allowlisted. Please try it again."
8808
  msgstr ""
8809
 
8810
+ #: lib/wordfenceClass.php:6227
8811
  msgid "There was an error while sending the email."
8812
  msgstr ""
8813
 
8814
+ #: lib/wordfenceClass.php:6228
8815
  msgid "This will be shown only once. Keep these codes somewhere safe."
8816
  msgstr ""
8817
 
8818
+ #: lib/wordfenceClass.php:6229
8819
  msgid "Throttled"
8820
  msgstr ""
8821
 
8822
+ #: lib/wordfenceClass.php:6230
8823
  msgid "Two Factor Status"
8824
  msgstr ""
8825
 
8826
  #. translators: HTTP client type.
8827
+ #: lib/wordfenceClass.php:6232
8828
  msgid "Type: %s"
8829
  msgstr ""
8830
 
8831
  #. translators: HTTP client type.
8832
+ #: lib/wordfenceClass.php:6233
8833
  #: views/scanner/issue-checkGSB.php:8
8834
  #: views/scanner/issue-commentBadURL.php:8
8835
  #: views/scanner/issue-configReadable.php:12
8849
  msgid "URL"
8850
  msgstr ""
8851
 
8852
+ #: lib/wordfenceClass.php:6234
8853
  msgid "Unable to automatically hide file"
8854
  msgstr ""
8855
 
8856
  #. translators: 2FA backup codes.
8857
+ #: lib/wordfenceClass.php:6235
8858
  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."
8859
  msgstr ""
8860
 
8861
  #. translators: 2FA backup codes.
8862
+ #: lib/wordfenceClass.php:6236
8863
  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."
8864
  msgstr ""
8865
 
8866
+ #: lib/wordfenceClass.php:6238
8867
  msgid "User ID"
8868
  msgstr ""
8869
 
8870
+ #: lib/wordfenceClass.php:6240
8871
  msgid "WHOIS LOOKUP"
8872
  msgstr ""
8873
 
8874
+ #: lib/wordfenceClass.php:6241
8875
  msgid "We are about to change your <em>.htaccess</em> file. Please make a backup of this file before proceeding."
8876
  msgstr ""
8877
 
8878
  #. translators: Error message.
8879
+ #: lib/wordfenceClass.php:6242
8880
  msgid "We can't modify your .htaccess file for you because: %s"
8881
  msgstr ""
8882
 
8883
  #. translators: Error message.
8884
+ #: lib/wordfenceClass.php:6243
8885
  msgid "We encountered a problem"
8886
  msgstr ""
8887
 
8888
  #. translators: URL.
8889
+ #: lib/wordfenceClass.php:6244
8890
  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."
8891
  msgstr ""
8892
 
8893
  #. translators: URL.
8894
+ #: lib/wordfenceClass.php:6245
8895
  msgid "Wordfence is working..."
8896
  msgstr ""
8897
 
8898
+ #: lib/wordfenceClass.php:6246
8899
  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='https://nginx.org/en/docs/http/ngx_http_autoindex_module.html'>Nginx docs for more info</a> on how to do this."
8900
  msgstr ""
8901
 
8902
+ #: lib/wordfenceClass.php:6247
8903
  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."
8904
  msgstr ""
8905
 
8906
+ #: lib/wordfenceClass.php:6248
8907
  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>"
8908
  msgstr ""
8909
 
8910
+ #: lib/wordfenceClass.php:6249
8911
  msgid "You forgot to include a reason you're blocking this IP range. We ask you to include this for your own record keeping."
8912
  msgstr ""
8913
 
8914
+ #: lib/wordfenceClass.php:6250
8915
  msgid "You have unsaved changes to your options. If you leave this page, those changes will be lost."
8916
  msgstr ""
8917
 
8918
+ #: lib/wordfenceClass.php:6251
8919
  msgid "Your .htaccess has been updated successfully. Please verify your site is functioning normally."
8920
  msgstr ""
8921
 
8922
  #. translators: Email address.
8923
+ #: lib/wordfenceClass.php:6252
8924
  msgid "Your Wordfence activity log was sent to %s"
8925
  msgstr ""
8926
 
8927
  #. translators: Email address.
8928
+ #: lib/wordfenceClass.php:6253
8929
  msgid "Your rules have been updated successfully."
8930
  msgstr ""
8931
 
8932
+ #: lib/wordfenceClass.php:6254
8933
  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>"
8934
  msgstr ""
8935
 
8936
  #. translators: wp_mail() return value.
8937
+ #: lib/wordfenceClass.php:6255
8938
  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."
8939
  msgstr ""
8940
 
8941
  #. translators: wp_mail() return value.
8942
+ #: lib/wordfenceClass.php:6256
8943
  msgid "blocked by firewall"
8944
  msgstr ""
8945
 
8946
  #. translators: Reason for firewall action.
8947
+ #: lib/wordfenceClass.php:6257
8948
  msgid "blocked by firewall for %s"
8949
  msgstr ""
8950
 
8951
  #. translators: Reason for firewall action.
8952
+ #: lib/wordfenceClass.php:6258
8953
  msgid "blocked by real-time IP blocklist"
8954
  msgstr ""
8955
 
8956
+ #: lib/wordfenceClass.php:6259
8957
  msgid "blocked by the Wordfence Security Network"
8958
  msgstr ""
8959
 
8960
  #. translators: Reason for firewall action.
8961
+ #: lib/wordfenceClass.php:6260
8962
  msgid "blocked for %s"
8963
  msgstr ""
8964
 
8965
  #. translators: Reason for firewall action.
8966
+ #: lib/wordfenceClass.php:6261
8967
  msgid "locked out from logging in"
8968
  msgstr ""
8969
 
8970
+ #: lib/wordfenceClass.php:6274
8971
  msgid "Wordfence generated an error on activation. The output we received during activation was:"
8972
  msgstr ""
8973
 
8974
+ #: lib/wordfenceClass.php:6281
8975
  msgid "Wordfence could not register with the Wordfence scanning servers when it activated."
8976
  msgstr ""
8977
 
8978
+ #: lib/wordfenceClass.php:6282
8979
  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."
8980
  msgstr ""
8981
 
8982
+ #: lib/wordfenceClass.php:6296
8983
  msgid "The Wordfence Web Application Firewall cannot run."
8984
  msgstr ""
8985
 
8986
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
8987
+ #: lib/wordfenceClass.php:6299
8988
  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\"><span class=\"screen-reader-text\"> ("
8989
  msgstr ""
8990
 
8991
+ #: lib/wordfenceClass.php:6305
8992
  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."
8993
  msgstr ""
8994
 
8995
+ #: lib/wordfenceClass.php:6318
8996
+ #: lib/wordfenceClass.php:6337
8997
  msgid "The Wordfence Web Application Firewall needs a configuration update."
8998
  msgstr ""
8999
 
9000
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
9001
+ #: lib/wordfenceClass.php:6321
9002
  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\"><span class=\"screen-reader-text\"> ("
9003
  msgstr ""
9004
 
9005
  #. translators: 1. WordPress admin panel URL. 2. Support URL.
9006
+ #: lib/wordfenceClass.php:6340
9007
  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\"><span class=\"screen-reader-text\"> ("
9008
  msgstr ""
9009
 
9010
+ #: lib/wordfenceClass.php:6346
9011
  msgid "The Wordfence Web Application Firewall is in read-only mode."
9012
  msgstr ""
9013
 
9014
+ #: lib/wordfenceClass.php:6355
9015
  msgid "This site is currently using PHP's built in REMOTE_ADDR."
9016
  msgstr ""
9017
 
9018
+ #: lib/wordfenceClass.php:6358
9019
  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."
9020
  msgstr ""
9021
 
9022
+ #: lib/wordfenceClass.php:6361
9023
  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."
9024
  msgstr ""
9025
 
9026
+ #: lib/wordfenceClass.php:6364
9027
  msgid "This site is currently using the Cloudflare \"CF-Connecting-IP\" HTTP header, which should only be used when the site is behind Cloudflare."
9028
  msgstr ""
9029
 
9030
+ #: lib/wordfenceClass.php:6381
9031
  msgid "Your 'How does Wordfence get IPs' setting is misconfigured."
9032
  msgstr ""
9033
 
9034
+ #: lib/wordfenceClass.php:6383
9035
  msgid "Click here to use the recommended setting"
9036
  msgstr ""
9037
 
9038
+ #: lib/wordfenceClass.php:6385
9039
  #: views/onboarding/fresh-install.php:38
9040
  msgid "or"
9041
  msgstr ""
9042
 
9043
+ #: lib/wordfenceClass.php:6387
9044
  msgid "visit the options page"
9045
  msgstr ""
9046
 
9047
+ #: lib/wordfenceClass.php:6389
9048
  msgid "to manually update it."
9049
  msgstr ""
9050
 
9051
+ #: lib/wordfenceClass.php:6397
9052
  msgid "Do you want Wordfence to stay up-to-date automatically?"
9053
  msgstr ""
9054
 
9055
+ #: lib/wordfenceClass.php:6399
9056
  msgid "Yes, enable auto-update."
9057
  msgstr ""
9058
 
9059
+ #: lib/wordfenceClass.php:6401
9060
  msgid "No thanks."
9061
  msgstr ""
9062
 
9063
+ #: lib/wordfenceClass.php:6425
9064
  msgid "Wordfence country blocking is currently set to block the United States. We recommend allowing access from the United States for Google and other benign crawlers, unless you choose to only block the login page."
9065
  msgstr ""
9066
 
9067
  #. translators: Localized date.
9068
+ #: lib/wordfenceClass.php:6534
9069
  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."
9070
  msgstr ""
9071
 
9072
  #. translators: 1. Localized date. 2. WordPress admin panel URL.
9073
+ #: lib/wordfenceClass.php:6542
9074
  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."
9075
  msgstr ""
9076
 
9077
  #. translators: WordPress admin panel URL.
9078
+ #: lib/wordfenceClass.php:6548
9079
  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."
9080
  msgstr ""
9081
 
9082
  #. translators: WordPress admin panel URL.
9083
+ #: lib/wordfenceClass.php:6553
9084
  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."
9085
  msgstr ""
9086
 
9087
+ #: lib/wordfenceClass.php:6556
9088
  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."
9089
  msgstr ""
9090
 
9091
+ #: lib/wordfenceClass.php:6664
9092
  #: models/page/wfPage.php:101
9093
  msgid "Dashboard"
9094
  msgstr ""
9095
 
9096
+ #: lib/wordfenceClass.php:6708
9097
  msgid "Upgrade to Care"
9098
  msgstr ""
9099
 
9100
+ #: lib/wordfenceClass.php:6712
9101
  msgid "Upgrade to Response"
9102
  msgstr ""
9103
 
9104
  #. translators: Number of notifications.
9105
+ #: lib/wordfenceClass.php:6761
9106
  msgid "You have %d new Wordfence notification."
9107
  msgid_plural "You have %d new Wordfence notifications."
9108
  msgstr[0] ""
9109
  msgstr[1] ""
9110
 
9111
+ #: lib/wordfenceClass.php:6785
9112
  msgid "JavaScript Errors"
9113
  msgstr ""
9114
 
9115
+ #: lib/wordfenceClass.php:6791
9116
  msgid "Malware URLs"
9117
  msgstr ""
9118
 
9119
  #. translators: WordPress admin panel URL.
9120
+ #: lib/wordfenceClass.php:6909
9121
+ #: lib/wordfenceClass.php:6972
9122
  msgid "<a href=\"%s\">Click here</a> to rebuild the configuration file."
9123
  msgstr ""
9124
 
9125
  #. translators: File path.
9126
+ #: lib/wordfenceClass.php:6920
9127
+ #: lib/wordfenceClass.php:6983
9128
  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."
9129
  msgstr ""
9130
 
9131
+ #: lib/wordfenceClass.php:6930
9132
+ #: lib/wordfenceClass.php:6993
9133
  msgid "An error occured when fetching the WAF configuration from the database."
9134
  msgstr ""
9135
 
9136
  #. translators: Plugin name.
9137
+ #: lib/wordfenceClass.php:7015
9138
  msgid "The Wordfence Live Traffic feature has been disabled because you have %s active which is not compatible with Wordfence Live Traffic."
9139
  msgstr ""
9140
 
9141
  #. translators: 1. Plugin name.
9142
+ #: lib/wordfenceClass.php:7017
9143
  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."
9144
  msgstr ""
9145
 
9146
  #. translators: File path.
9147
+ #: lib/wordfenceClass.php:7078
9148
  msgid "The file <code>%s</code> was restored successfully."
9149
  msgstr ""
9150
 
9151
+ #: lib/wordfenceClass.php:7083
9152
  msgid "There was an error restoring the file."
9153
  msgstr ""
9154
 
9155
+ #: lib/wordfenceClass.php:7093
9156
+ #: lib/wordfenceClass.php:7116
9157
  msgid "Return to scan results"
9158
  msgstr ""
9159
 
9160
  #. translators: File path.
9161
+ #: lib/wordfenceClass.php:7102
9162
  msgid "The file <code>%s</code> was deleted successfully."
9163
  msgstr ""
9164
 
9165
+ #: lib/wordfenceClass.php:7106
9166
  msgid "There was an error deleting the file."
9167
  msgstr ""
9168
 
9169
  #. translators: IP address.
9170
+ #: lib/wordfenceClass.php:7174
9171
  msgid ""
9172
  "User IP: %s\n"
9173
  ""
9174
  msgstr ""
9175
 
9176
  #. translators: Domain name.
9177
+ #: lib/wordfenceClass.php:7177
9178
  msgid ""
9179
  "User hostname: %s\n"
9180
  ""
9181
  msgstr ""
9182
 
9183
+ #: lib/wordfenceClass.php:7181
9184
  msgid "User location: "
9185
  msgstr ""
9186
 
9187
  #. translators: WordPress admin panel URL.
9188
+ #: lib/wordfenceClass.php:7236
9189
  msgid "No longer an administrator for this site? Click here to stop receiving security alerts: %s"
9190
  msgstr ""
9191
 
9192
+ #: lib/wordfenceClass.php:7277
9193
  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]"
9194
  msgstr ""
9195
 
9196
+ #: lib/wordfenceClass.php:7296
9197
  msgid "Invalid email address provided"
9198
  msgstr ""
9199
 
9200
+ #: lib/wordfenceClass.php:7301
9201
  msgid "Test email sent successfully"
9202
  msgstr ""
9203
 
9204
+ #: lib/wordfenceClass.php:7302
9205
  msgid "Test email failed to send"
9206
  msgstr ""
9207
 
9208
  #. translators: Localized date range.
9209
+ #: lib/wordfenceClass.php:7320
9210
  msgid "Wordfence activity in the past %s"
9211
  msgstr ""
9212
 
9213
+ #: lib/wordfenceClass.php:7360
9214
+ #: lib/wordfenceClass.php:7364
9215
+ #: lib/wordfenceClass.php:7395
9216
  msgid "We could not find that user in the database."
9217
  msgstr ""
9218
 
9219
+ #: lib/wordfenceClass.php:7368
9220
  msgid "This user's email is the network admin email. It will need to be changed before deleting this user."
9221
  msgstr ""
9222
 
9223
+ #: lib/wordfenceClass.php:7432
9224
  msgid "Wordfence could not find your .htaccess file."
9225
  msgstr ""
9226
 
9227
+ #: lib/wordfenceClass.php:7448
9228
  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."
9229
  msgstr ""
9230
 
9231
+ #: lib/wordfenceClass.php:7454
9232
  msgid "There was an error writing to your .htaccess file."
9233
  msgstr ""
9234
 
9235
+ #: lib/wordfenceClass.php:7533
9236
  msgid "Required parameters not sent."
9237
  msgstr ""
9238
 
9239
+ #: lib/wordfenceClass.php:7543
9240
  msgid "The WAF is currently in read-only mode and will not save any configuration changes."
9241
  msgstr ""
9242
 
9243
+ #: lib/wordfenceClass.php:7581
9244
  #: views/waf/option-whitelist.php:60
9245
  msgid "Allowlisted via Firewall Options page"
9246
  msgstr ""
9247
 
9248
+ #: lib/wordfenceClass.php:7868
9249
  msgid "Allowlisted via Live Traffic"
9250
  msgstr ""
9251
 
9252
+ #: lib/wordfenceClass.php:8032
9253
+ #: lib/wordfenceClass.php:8129
9254
  msgid "A valid server configuration was not provided."
9255
  msgstr ""
9256
 
9257
+ #: lib/wordfenceClass.php:8043
9258
+ #: lib/wordfenceClass.php:8150
9259
  msgid "Filesystem Credentials Required"
9260
  msgstr ""
9261
 
9262
  #. translators: Support URL.
9263
+ #: lib/wordfenceClass.php:8045
9264
+ #: lib/wordfenceClass.php:8069
9265
+ #: lib/wordfenceClass.php:8113
9266
+ #: lib/wordfenceClass.php:9005
9267
  msgid "If you cannot complete the setup process, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">click here for help<span class=\"screen-reader-text\"> ("
9268
  msgstr ""
9269
 
9270
  #. translators: Support URL.
9271
+ #: lib/wordfenceClass.php:8046
9272
  msgid "Once you have entered credentials, click Continue to complete the setup."
9273
  msgstr ""
9274
 
9275
+ #: lib/wordfenceClass.php:8067
9276
+ #: lib/wordfenceClass.php:8175
9277
  msgid "Filesystem Permission Error"
9278
  msgstr ""
9279
 
9280
+ #: lib/wordfenceClass.php:8093
9281
  msgid "Manual Installation Instructions"
9282
  msgstr ""
9283
 
9284
+ #: lib/wordfenceClass.php:8100
9285
  msgid "Installation Successful"
9286
  msgstr ""
9287
 
9288
+ #: lib/wordfenceClass.php:8111
9289
  msgid "Installation Failed"
9290
  msgstr ""
9291
 
9292
  #. translators: Support URL.
9293
+ #: lib/wordfenceClass.php:8152
9294
+ #: lib/wordfenceClass.php:8177
9295
+ #: lib/wordfenceClass.php:8208
9296
+ #: lib/wordfenceClass.php:8237
9297
+ #: lib/wordfenceClass.php:8283
9298
  msgid "If you cannot complete the uninstall process, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"%s\">click here for help<span class=\"screen-reader-text\"> ("
9299
  msgstr ""
9300
 
9301
  #. translators: Support URL.
9302
+ #: lib/wordfenceClass.php:8153
9303
  msgid "Once you have entered credentials, click Continue to complete uninstallation."
9304
  msgstr ""
9305
 
9306
+ #: lib/wordfenceClass.php:8197
9307
  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."
9308
  msgstr ""
9309
 
9310
+ #: lib/wordfenceClass.php:8199
9311
  msgid "Any previous value for <code>auto_prepend_file</code> will need to be re-enabled manually if still needed."
9312
  msgstr ""
9313
 
9314
  #. translators: Time until.
9315
+ #: lib/wordfenceClass.php:8203
9316
  msgid "Waiting for it to take effect. This may take up to %s."
9317
  msgstr ""
9318
 
9319
+ #: lib/wordfenceClass.php:8206
9320
  msgid "Waiting for Changes"
9321
  msgstr ""
9322
 
9323
+ #: lib/wordfenceClass.php:8228
9324
  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."
9325
  msgstr ""
9326
 
9327
+ #: lib/wordfenceClass.php:8230
9328
  msgid "Retrying Failed."
9329
  msgstr ""
9330
 
9331
+ #: lib/wordfenceClass.php:8232
9332
  msgid "Try Again"
9333
  msgstr ""
9334
 
9335
+ #: lib/wordfenceClass.php:8235
9336
  msgid "Unable to Uninstall"
9337
  msgstr ""
9338
 
9339
+ #: lib/wordfenceClass.php:8271
9340
  msgid "Uninstallation Complete"
9341
  msgstr ""
9342
 
9343
+ #: lib/wordfenceClass.php:8281
9344
  msgid "Uninstallation Failed"
9345
  msgstr ""
9346
 
9347
  #. translators: 1. Number of attacks/blocks. 2. Time since.
9348
+ #: lib/wordfenceClass.php:8435
9349
  msgid "The Wordfence Web Application Firewall has blocked %1$d attacks over the last %2$s. Below is a sample of these recent attacks:"
9350
  msgstr ""
9351
 
9352
+ #: lib/wordfenceClass.php:9002
9353
  msgid "To make your site as secure as possible, take a moment to optimize the Wordfence Web Application Firewall:"
9354
  msgstr ""
9355
 
9356
+ #: lib/wordfenceClass.php:9002
9357
  msgid "Click here to configure"
9358
  msgstr ""
9359
 
9360
+ #: lib/wordfenceClass.php:9011
9361
  #: views/waf/waf-install-success.php:14
9362
  msgid "Nice work! The firewall is now optimized."
9363
  msgstr ""
9364
 
9365
+ #: lib/wordfenceClass.php:9013
9366
+ #: lib/wordfenceClass.php:9025
9367
  #: views/waf/waf-install-success.php:16
9368
  #: views/waf/waf-uninstall-success.php:19
9369
  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."
9370
  msgstr ""
9371
 
9372
+ #: lib/wordfenceClass.php:9019
9373
  #: views/waf/waf-uninstall-success.php:15
9374
  msgid "Uninstallation was successful!"
9375
  msgstr ""
9376
 
9377
+ #: lib/wordfenceClass.php:9022
9378
  #: views/waf/waf-uninstall-success.php:17
9379
  msgid "Uninstallation from this site was successful! The Wordfence Firewall is still active because it is installed in another WordPress installation."
9380
  msgstr ""
9381
 
9382
+ #: lib/wordfenceClass.php:9030
9383
  msgid "The update was successful!"
9384
  msgstr ""
9385
 
9386
+ #: lib/wordfenceClass.php:9180
9387
  msgid "Auth grant is invalid."
9388
  msgstr ""
9389
 
9390
  #. translators: Error message.
9391
+ #: lib/wordfenceClass.php:9195
9392
  msgid "Invalid response from Wordfence Central: %s"
9393
  msgstr ""
9394
 
9395
  #. translators: JSON property.
9396
+ #: lib/wordfenceClass.php:9201
9397
+ #: lib/wordfenceClass.php:9214
9398
  msgid "Invalid response from Wordfence Central. Parameter %s not found in response."
9399
  msgstr ""
9400
 
9401
+ #: lib/wordfenceClass.php:9243
9402
+ #: lib/wordfenceClass.php:9380
9403
  msgid "Access token not found."
9404
  msgstr ""
9405
 
9406
+ #: lib/wordfenceClass.php:9288
9407
+ #: lib/wordfenceClass.php:9355
9408
  msgid "Invalid response from Wordfence Central."
9409
  msgstr ""
9410
 
9411
+ #: lib/wordfenceClass.php:9331
9412
  msgid "Auth grant not found."
9413
  msgstr ""
9414
 
9415
+ #: lib/wordfenceClass.php:9601
9416
  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."
9417
  msgstr ""
9418
 
9419
+ #: lib/wordfenceClass.php:9693
9420
+ #: lib/wordfenceClass.php:9764
9421
  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."
9422
  msgstr ""
9423
 
9424
  #. translators: File path.
9425
+ #: lib/wordfenceClass.php:9734
9426
+ #: lib/wordfenceClass.php:9782
9427
  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."
9428
  msgstr ""
9429
 
9430
+ #: lib/wordfenceClass.php:9798
9431
  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."
9432
  msgstr ""
9433
 
9434
+ #: lib/wordfenceHash.php:64
9435
  msgid "Fetching core, theme and plugin file signatures from Wordfence"
9436
  msgstr ""
9437
 
9438
+ #: lib/wordfenceHash.php:73
9439
  msgid "Fetching list of known malware files from Wordfence"
9440
  msgstr ""
9441
 
9442
+ #: lib/wordfenceHash.php:77
9443
  msgid "Using cached malware prefixes"
9444
  msgstr ""
9445
 
9446
+ #: lib/wordfenceHash.php:80
9447
  msgid "Fetching fresh malware prefixes"
9448
  msgstr ""
9449
 
9450
+ #: lib/wordfenceHash.php:85
9451
  msgid "Could not fetch malware signatures from Wordfence servers."
9452
  msgstr ""
9453
 
9454
+ #: lib/wordfenceHash.php:90
9455
  msgid "Malware data received from Wordfence servers was not valid."
9456
  msgstr ""
9457
 
9458
+ #: lib/wordfenceHash.php:102
9459
  msgid "Fetching list of known core files from Wordfence"
9460
  msgstr ""
9461
 
9462
+ #: lib/wordfenceHash.php:106
9463
  msgid "Using cached core hashes"
9464
  msgstr ""
9465
 
9466
+ #: lib/wordfenceHash.php:109
9467
  msgid "Fetching fresh core hashes"
9468
  msgstr ""
9469
 
9470
+ #: lib/wordfenceHash.php:114
9471
  msgid "Could not fetch core hashes from Wordfence servers."
9472
  msgstr ""
9473
 
9474
+ #: lib/wordfenceHash.php:119
9475
  msgid "Core hashes data received from Wordfence servers was not valid."
9476
  msgstr ""
9477
 
9478
+ #: lib/wordfenceHash.php:137
 
 
 
 
9479
  msgid "Comparing core WordPress files against originals in repository"
9480
  msgstr ""
9481
 
9482
+ #: lib/wordfenceHash.php:137
9483
  msgid "Skipping core scan"
9484
  msgstr ""
9485
 
9486
+ #: lib/wordfenceHash.php:138
9487
  msgid "Comparing open source themes against WordPress.org originals"
9488
  msgstr ""
9489
 
9490
+ #: lib/wordfenceHash.php:138
9491
  msgid "Skipping theme scan"
9492
  msgstr ""
9493
 
9494
+ #: lib/wordfenceHash.php:139
9495
  msgid "Comparing plugins against WordPress.org originals"
9496
  msgstr ""
9497
 
9498
+ #: lib/wordfenceHash.php:139
9499
  msgid "Skipping plugin scan"
9500
  msgstr ""
9501
 
9502
+ #: lib/wordfenceHash.php:140
9503
  msgid "Scanning for known malware files"
9504
  msgstr ""
9505
 
9506
+ #: lib/wordfenceHash.php:140
9507
  msgid "Skipping malware scan"
9508
  msgstr ""
9509
 
9510
+ #: lib/wordfenceHash.php:141
9511
  msgid "Scanning for unknown files in wp-admin and wp-includes"
9512
  msgstr ""
9513
 
9514
+ #: lib/wordfenceHash.php:141
9515
  msgid "Skipping unknown core file scan"
9516
  msgstr ""
9517
 
9518
  #. translators: WordPress version.
9519
+ #: lib/wordfenceHash.php:154
9520
  msgid "Unknown WordPress core version: %s"
9521
  msgstr ""
9522
 
9523
  #. translators: WordPress version.
9524
+ #: lib/wordfenceHash.php:155
9525
  msgid "The core files scan will not be run because this version of WordPress is not currently indexed by Wordfence. This may be due to using a prerelease version or because the servers are still indexing a new release. If you are using an official WordPress release, this issue will automatically dismiss once the version is indexed and another scan is run."
9526
  msgstr ""
9527
 
9528
  #. translators: File path.
9529
+ #: lib/wordfenceHash.php:188
9530
  msgid "Wordfence file scanner detected a possible infinite loop. Exiting on file: %s"
9531
  msgstr ""
9532
 
 
 
 
 
9533
  #. translators: Time in seconds.
9534
+ #: lib/wordfenceHash.php:202
9535
  msgid "Index time: %s"
9536
  msgstr ""
9537
 
9538
+ #: lib/wordfenceHash.php:207
9539
  msgid "Beginning file hashing"
9540
  msgstr ""
9541
 
9542
+ #: lib/wordfenceHash.php:213
9543
  msgid "Processing pending issues"
9544
  msgstr ""
9545
 
9546
  #. translators: 1. Number of files. 2. Data in bytes.
9547
+ #: lib/wordfenceHash.php:216
9548
  msgid "Analyzed %1$d files containing %2$s of data."
9549
  msgstr ""
9550
 
9551
+ #: lib/wordfenceHash.php:225
9552
  msgid "Invalid response from Wordfence API during check_possible_malware"
9553
  msgstr ""
9554
 
9555
  #. translators: File path.
9556
+ #: lib/wordfenceHash.php:238
9557
  msgid "This file is suspected malware: %s"
9558
  msgstr ""
9559
 
9560
  #. translators: Malware name/title.
9561
+ #: lib/wordfenceHash.php:239
9562
  msgid "This file's signature matches a known malware file. The title of the malware is '%s'. Immediately inspect this file using the 'View' option below and consider deleting it from your server."
9563
  msgstr ""
9564
 
9565
  #. translators: File path.
9566
+ #: lib/wordfenceHash.php:285
9567
+ #: lib/wordfenceHash.php:314
9568
  msgid "Found .suspected file: %s"
9569
  msgstr ""
9570
 
9571
  #. translators: File path.
9572
+ #: lib/wordfenceHash.php:294
9573
  #: lib/wordfenceHash.php:323
 
9574
  msgid "Skipping unneeded hash: %s"
9575
  msgstr ""
9576
 
9577
  #. translators: Number of files.
9578
+ #: lib/wordfenceHash.php:350
9579
  msgid "%d files indexed"
9580
  msgstr ""
9581
 
9582
  #. translators: File path.
9583
+ #: lib/wordfenceHash.php:387
9584
  msgid "Forking during indexing: %s"
9585
  msgstr ""
9586
 
9587
  #. translators: PHP max execution time.
9588
+ #: lib/wordfenceHash.php:390
9589
  msgid "Calling fork() from wordfenceHash with maxExecTime: %s"
9590
  msgstr ""
9591
 
9592
  #. translators: File path.
9593
+ #: lib/wordfenceHash.php:427
9594
  msgid "Skipping file larger than max size: %s"
9595
  msgstr ""
9596
 
9597
  #. translators: 1. File path. 2. Memory in bytes.
9598
+ #: lib/wordfenceHash.php:432
9599
  msgid "Scanning: %1$s (Mem:%2$s)"
9600
  msgstr ""
9601
 
9602
  #. translators: File path.
9603
+ #: lib/wordfenceHash.php:435
9604
  msgid "Scanning: %s"
9605
  msgstr ""
9606
 
9607
  #. translators: File path.
9608
+ #: lib/wordfenceHash.php:475
9609
  msgid "WordPress core file modified: %s"
9610
  msgstr ""
9611
 
9612
  #. translators: File path.
9613
+ #: lib/wordfenceHash.php:476
9614
  msgid "This WordPress core file has been modified and differs from the original file distributed with this version of WordPress."
9615
  msgstr ""
9616
 
9617
  #. translators: File path.
9618
+ #: lib/wordfenceHash.php:512
9619
  msgid "Modified plugin file: %s"
9620
  msgstr ""
9621
 
9622
  #. translators: 1. Plugin name. 2. Plugin version. 3. Support URL.
9623
+ #: lib/wordfenceHash.php:515
9624
  msgid "This file belongs to plugin \"%1$s\" version \"%2$s\" and has been modified from the file that is distributed by WordPress.org for this version. Please use the link to see how the file has changed. If you have modified this file yourself, you can safely ignore this warning. If you see a lot of changed files in a plugin that have been made by the author, then try uninstalling and reinstalling the plugin to force an upgrade. Doing this is a workaround for plugin authors who don't manage their code correctly. <a href=\"%3$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
9625
  msgstr ""
9626
 
9627
  #. translators: File path.
9628
+ #: lib/wordfenceHash.php:559
9629
  msgid "Modified theme file: %s"
9630
  msgstr ""
9631
 
9632
  #. translators: 1. Plugin name. 2. Plugin version. 3. Support URL.
9633
+ #: lib/wordfenceHash.php:562
9634
  msgid "This file belongs to theme \"%1$s\" version \"%2$s\" and has been modified from the original distribution. It is common for site owners to modify their theme files, so if you have modified this file yourself you can safely ignore this warning. <a href=\"%3$s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
9635
  msgstr ""
9636
 
9637
  #. translators: File path.
9638
+ #: lib/wordfenceHash.php:596
9639
  msgid "Old WordPress core file not removed during update: %s"
9640
  msgstr ""
9641
 
9642
  #. translators: File path.
9643
+ #: lib/wordfenceHash.php:597
9644
  msgid "This file is in a WordPress core location but is from an older version of WordPress and not used with your current version. Hosting or permissions issues can cause these files to get left behind when WordPress is updated and they should be removed if possible."
9645
  msgstr ""
9646
 
9647
  #. translators: File path.
9648
+ #: lib/wordfenceHash.php:614
9649
+ #: lib/wordfenceHash.php:635
9650
  msgid "Unknown file in WordPress core: %s"
9651
  msgstr ""
9652
 
9653
  #. translators: File path.
9654
+ #: lib/wordfenceHash.php:615
9655
  msgid "This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker."
9656
  msgstr ""
9657
 
9658
  #. translators: Support URL.
9659
+ #: lib/wordfenceHash.php:636
9660
  msgid "This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker. <a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
9661
  msgstr ""
9662
 
9663
  #. translators: 1. Number of files. 2. Data in bytes.
9664
+ #: lib/wordfenceHash.php:665
9665
  msgid "Analyzed %1$d files containing %2$s of data so far"
9666
  msgstr ""
9667
 
9668
  #. translators: Number of scan results.
9669
+ #: lib/wordfenceHash.php:749
9670
  msgid "(+ %d more)"
9671
  msgstr ""
9672
 
9673
  #. translators: Number of files.
9674
+ #: lib/wordfenceHash.php:750
9675
  msgid "%d more similar files were found."
9676
  msgstr ""
9677
 
9678
  #. translators: Number of files.
9679
+ #: lib/wordfenceHash.php:750
9680
  msgid "1 more similar file was found."
9681
  msgstr ""
9682
 
9683
  #. translators: Number of files.
9684
+ #: lib/wordfenceHash.php:750
9685
  msgid "<a href=\"%s\" target=\"_blank\" rel=\"noopener noreferrer\">Learn More<span class=\"screen-reader-text\"> ("
9686
  msgstr ""
9687
 
9742
  msgstr ""
9743
 
9744
  #. translators: Malware signature rule ID.
9745
+ #: lib/wordfenceScanner.php:372
9746
  msgid "Resuming malware scan at rule %s."
9747
  msgstr ""
9748
 
9749
+ #: lib/wordfenceScanner.php:406
9750
  msgid "This file appears to be installed or modified by a hacker to perform malicious activity. If you know about this file you can choose to ignore it to exclude it from future scans."
9751
  msgstr ""
9752
 
9753
+ #: lib/wordfenceScanner.php:417
9754
  msgid "File appears to be malicious or unsafe: %s"
9755
  msgstr ""
9756
 
9757
+ #: lib/wordfenceScanner.php:418
9758
  msgid "The matched text in this file is: %s"
9759
  msgstr ""
9760
 
9761
  #. translators: Scan result type.
9762
+ #: lib/wordfenceScanner.php:418
9763
  msgid "The issue type is: %s"
9764
  msgstr ""
9765
 
9766
  #. translators: Scan result description.
9767
+ #: lib/wordfenceScanner.php:418
9768
  msgid "Description: %s"
9769
  msgstr ""
9770
 
9771
  #. translators: Malware signature rule ID.
9772
+ #: lib/wordfenceScanner.php:437
9773
  msgid "Forking during malware scan (%s) to ensure continuity."
9774
  msgstr ""
9775
 
9776
+ #: lib/wordfenceScanner.php:459
9777
  msgid "This file may contain malicious executable code: "
9778
  msgstr ""
9779
 
9780
  #. translators: Malware signature matched text.
9781
+ #: lib/wordfenceScanner.php:460
9782
  msgid "This file is a PHP executable file and contains the word \"eval\" (without quotes) and the word \"%s\" (without quotes). The eval() function along with an encoding function like the one mentioned are commonly used by hackers to hide their code. If you know about this file you can choose to ignore it to exclude it from future scans. This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives."
9783
  msgstr ""
9784
 
9785
+ #: lib/wordfenceScanner.php:498
9786
  msgid "Asking Wordfence to check URLs against malware list."
9787
  msgstr ""
9788
 
9789
+ #: lib/wordfenceScanner.php:526
9790
+ #: lib/wordfenceScanner.php:568
9791
  msgid "File contains suspected malware URL: "
9792
  msgstr ""
9793
 
9794
  #. translators: 1. Malware signature matched text. 2. Malicious URL. 3. Malicious URL.
9795
+ #: lib/wordfenceScanner.php:529
9796
  msgid "This file contains a suspected malware URL listed on Google's list of malware sites. Wordfence decodes %1$s when scanning files so the URL may not be visible if you view this file. The URL is: %2$s - More info available at <a href=\"http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%3$s&client=googlechrome&hl=en-US\" target=\"_blank\" rel=\"noopener noreferrer\">Google Safe Browsing diagnostic page<span class=\"screen-reader-text\"> (opens in new tab)</span></a>."
9797
  msgstr ""
9798
 
9799
+ #: lib/wordfenceScanner.php:550
9800
  msgid "File contains suspected phishing URL: "
9801
  msgstr ""
9802
 
9803
+ #: lib/wordfenceScanner.php:551
9804
  msgid "This file contains a URL that is a suspected phishing site that is currently listed on Google's list of known phishing sites. The URL is: "
9805
  msgstr ""
9806
 
9807
+ #: lib/wordfenceScanner.php:569
9808
  msgid "This file contains a URL that is currently listed on Wordfence's domain blocklist. The URL is: "
9809
  msgstr ""
9810
 
9811
+ #: lib/wordfenceScanner.php:585
9812
  msgid "Finalizing malware scan results"
9813
  msgstr ""
9814
 
9815
  #. translators: 1. Number of fils. 2. Seconds in millisecond precision.
9816
+ #: lib/wordfenceScanner.php:607
9817
  msgid "Scanned contents of %1$d additional files at %2$.2f per second"
9818
  msgstr ""
9819
 
10641
  msgstr ""
10642
 
10643
  #: views/dashboard/options-group-license.php:53
10644
+ msgid "Premium License Deactivated"
10645
+ msgstr ""
10646
+
10647
+ #: views/dashboard/options-group-license.php:56
10648
  msgid "%s License Active"
10649
  msgstr ""
10650
 
10651
+ #: views/dashboard/options-group-license.php:62
10652
  msgid "Reset site to a free license"
10653
  msgstr ""
10654
 
10655
+ #: views/dashboard/options-group-license.php:67
10656
  msgid "Click here to manage your Wordfence licenses"
10657
  msgstr ""
10658
 
10659
+ #: views/dashboard/options-group-license.php:70
10660
+ msgid "Remove Invalid License"
10661
+ msgstr ""
10662
+
10663
+ #: views/dashboard/options-group-license.php:74
10664
  msgid "Install License"
10665
  msgstr ""
10666
 
10667
+ #: views/dashboard/options-group-license.php:150
10668
+ msgid "This was a premium license key, but it is no longer valid, so premium features are disabled. You can either remove the invalid key and continue using Wordfence's free features, or enter a new premium key to upgrade. If you have questions, contact <a href=\"mailto:billing@wordfence.com\">billing@wordfence.com</a>."
10669
+ msgstr ""
10670
+
10671
+ #: views/dashboard/options-group-license.php:163
10672
  msgid "Confirm Reset"
10673
  msgstr ""
10674
 
10675
+ #: views/dashboard/options-group-license.php:164
10676
  msgid "<p>Are you sure you want to reset this site's Wordfence License? This will disable Premium features and return the site to the free version of Wordfence. Your settings will still be retained when reinstalling a license.</p><p>If autorenew is enabled for the current license, the license will renew at the next expiration date. If you would like to turn renewal off or assign the license to another site, log into wordfence.com to change it.</p>"
10677
  msgstr ""
10678
 
10679
+ #: views/dashboard/options-group-license.php:166
10680
  msgid "Reset"
10681
  msgstr ""
10682
 
lib/wfFileUtils.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class wfFileUtils {
4
+
5
+ const CURRENT_DIRECTORY = '.';
6
+ const PARENT_DIRECTORY = '..';
7
+ const DIRECTORY_SEPARATOR = '/';
8
+
9
+ public static function isCurrentOrParentDirectory($file) {
10
+ return $file === self::CURRENT_DIRECTORY || $file === self::PARENT_DIRECTORY;
11
+ }
12
+
13
+ public static function getContents($directory) {
14
+ $contents = scandir($directory);
15
+ if ($contents === false)
16
+ throw new Exception("Unable to read contents of directory: $directory");
17
+ return array_filter($contents, function ($file) { return !wfFileUtils::isCurrentOrParentDirectory($file); });
18
+ }
19
+
20
+ public static function trimSeparators($path, $trimLeft = true, $trimRight = true) {
21
+ if ($trimLeft)
22
+ $path = ltrim($path, self::DIRECTORY_SEPARATOR);
23
+ if ($trimRight)
24
+ $path = rtrim($path, self::DIRECTORY_SEPARATOR);
25
+ return $path;
26
+ }
27
+
28
+ public static function joinPaths() {
29
+ $paths = func_get_args();
30
+ $count = count($paths);
31
+ $filtered = array();
32
+ $trailingSeparator = false;
33
+ for ($i = 0; $i < $count; $i++) {
34
+ $path = self::trimSeparators($paths[$i], !empty($filtered));
35
+ if (!empty($path)) {
36
+ $filtered[] = $path;
37
+ $trailingSeparator = substr($paths[$i], -1) === self::DIRECTORY_SEPARATOR;
38
+ }
39
+ }
40
+ return implode(self::DIRECTORY_SEPARATOR, $filtered) . ($trailingSeparator ? self::DIRECTORY_SEPARATOR : '');
41
+ }
42
+
43
+ public static function splitPath($path, &$count = null) {
44
+ $components = array_filter(explode(self::DIRECTORY_SEPARATOR, $path));
45
+ $count = count($components);
46
+ return $components;
47
+ }
48
+
49
+ public static function isReadableFile($file) {
50
+ return @is_file($file) && @is_readable($file);
51
+ }
52
+
53
+ public static function belongsTo($child, $parent) {
54
+ $childComponents = self::splitPath($child, $childCount);
55
+ $parentComponents = self::splitPath($parent, $parentCount);
56
+ if ($childCount < $parentCount)
57
+ return false;
58
+ for ($i = 0; $i < $parentCount; $i++) {
59
+ if ($childComponents[$i] !== $parentComponents[$i])
60
+ return false;
61
+ }
62
+ return true;
63
+ }
64
+
65
+ public static function matchPaths($a, $b) {
66
+ $aComponents = self::splitPath($a, $aCount);
67
+ $bComponents = self::splitPath($b, $bCount);
68
+ if ($aCount !== $bCount)
69
+ return false;
70
+ for ($i = 0; $i < $aCount; $i++) {
71
+ if ($aComponents[$i] !== $bComponents[$i])
72
+ return false;
73
+ }
74
+ return true;
75
+ }
76
+
77
+ }
lib/wfIssues.php CHANGED
@@ -608,12 +608,18 @@ class wfIssues {
608
  foreach($ret as $status => &$issueList){
609
  for($i = 0; $i < sizeof($issueList); $i++){
610
  if ($issueList[$i]['type'] == 'file' || $issueList[$i]['type'] == 'knownfile') {
611
- $localFile = $issueList[$i]['data']['file'];
612
- if ($localFile != '.htaccess' && $localFile != $userIni) {
613
- $localFile = ABSPATH . '/' . preg_replace('/^[\.\/]+/', '', $localFile);
614
  }
615
  else {
616
- $localFile = ABSPATH . '/' . $localFile;
 
 
 
 
 
 
617
  }
618
 
619
  if(file_exists($localFile)){
@@ -747,4 +753,18 @@ class wfIssues {
747
  public function getIssuesTable() {
748
  return $this->issuesTable;
749
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
750
  }
608
  foreach($ret as $status => &$issueList){
609
  for($i = 0; $i < sizeof($issueList); $i++){
610
  if ($issueList[$i]['type'] == 'file' || $issueList[$i]['type'] == 'knownfile') {
611
+ if (array_key_exists('realFile', $issueList[$i]['data'])) {
612
+ $localFile = $issueList[$i]['data']['realFile'];
613
+ $issueList[$i]['data']['realFileToken'] = self::generateRealFileToken($localFile);
614
  }
615
  else {
616
+ $localFile = $issueList[$i]['data']['file'];
617
+ if ($localFile != '.htaccess' && $localFile != $userIni) {
618
+ $localFile = ABSPATH . '/' . preg_replace('/^[\.\/]+/', '', $localFile);
619
+ }
620
+ else {
621
+ $localFile = ABSPATH . '/' . $localFile;
622
+ }
623
  }
624
 
625
  if(file_exists($localFile)){
753
  public function getIssuesTable() {
754
  return $this->issuesTable;
755
  }
756
+
757
+ private static function getRealFileTokenKey($realFile) {
758
+ return 'wf-real-file-' . base64_encode($realFile);
759
+ }
760
+
761
+ private static function generateRealFileToken($realFile) {
762
+ $key = self::getRealFileTokenKey($realFile);
763
+ return wp_create_nonce($key);
764
+ }
765
+
766
+ public static function verifyRealFileToken($token, $realFile) {
767
+ $key = self::getRealFileTokenKey($realFile);
768
+ return wp_verify_nonce($token, $key);
769
+ }
770
  }
lib/wfLog.php CHANGED
@@ -1021,6 +1021,8 @@ class wfUserIPRange {
1021
  }
1022
 
1023
  protected function _sanitizeIPRange($ip_string) {
 
 
1024
  $ip_string = preg_replace('/\s/', '', $ip_string); //Strip whitespace
1025
  $ip_string = preg_replace('/[\\x{2013}-\\x{2015}]/u', '-', $ip_string); //Non-hyphen dashes to hyphen
1026
  $ip_string = strtolower($ip_string);
@@ -1283,6 +1285,9 @@ class wfRequestModel extends wfModel {
1283
  }
1284
  }
1285
  }
 
 
 
1286
  return $actionData;
1287
  }
1288
 
1021
  }
1022
 
1023
  protected function _sanitizeIPRange($ip_string) {
1024
+ if (!is_string($ip_string))
1025
+ return null;
1026
  $ip_string = preg_replace('/\s/', '', $ip_string); //Strip whitespace
1027
  $ip_string = preg_replace('/[\\x{2013}-\\x{2015}]/u', '-', $ip_string); //Non-hyphen dashes to hyphen
1028
  $ip_string = strtolower($ip_string);
1285
  }
1286
  }
1287
  }
1288
+ else {
1289
+ $actionData = array();
1290
+ }
1291
  return $actionData;
1292
  }
1293
 
lib/wfScanEngine.php CHANGED
@@ -1,11 +1,14 @@
1
  <?php
2
- require_once(dirname(__FILE__) . '/wordfenceClass.php');
3
- require_once(dirname(__FILE__) . '/wordfenceHash.php');
4
- require_once(dirname(__FILE__) . '/wfAPI.php');
5
- require_once(dirname(__FILE__) . '/wordfenceScanner.php');
6
- require_once(dirname(__FILE__) . '/wfIssues.php');
7
- require_once(dirname(__FILE__) . '/wfDB.php');
8
- require_once(dirname(__FILE__) . '/wfUtils.php');
 
 
 
9
 
10
  class wfScanEngine {
11
  const SCAN_MANUALLY_KILLED = -999;
@@ -798,6 +801,7 @@ class wfScanEngine {
798
  array(
799
  'url' => $test->getUrl(),
800
  'file' => $pathFromRoot,
 
801
  'canDelete' => true,
802
  )
803
  );
@@ -901,50 +905,64 @@ class wfScanEngine {
901
  private function _scannedSkippedPaths() {
902
  static $_cache = null;
903
  if ($_cache === null) {
904
- $base_abspath_relative = array('.htaccess', 'index.php', 'license.txt', 'readme.html', 'wp-activate.php', 'wp-admin', 'wp-app.php', 'wp-blog-header.php', 'wp-comments-post.php', 'wp-config-sample.php', 'wp-content', 'wp-cron.php', 'wp-includes', 'wp-links-opml.php', 'wp-load.php', 'wp-login.php', 'wp-mail.php', 'wp-pass.php', 'wp-register.php', 'wp-settings.php', 'wp-signup.php', 'wp-trackback.php', 'xmlrpc.php', '.well-known', 'cgi-bin');
905
- $base_absolute = array();
906
- if (defined('WP_CONTENT_DIR') && strlen(WP_CONTENT_DIR)) {
907
- $base_absolute[] = WP_CONTENT_DIR;
908
- }
909
- if (defined('WP_PLUGIN_DIR') && strlen(WP_PLUGIN_DIR)) {
910
- $base_absolute[] = WP_PLUGIN_DIR;
911
- }
912
- if (defined('UPLOADS') && strlen(UPLOADS)) {
913
- $base_absolute[] = ABSPATH . UPLOADS; /* UPLOADS is relative to ABSPATH unlike the others */
914
- }
915
- $baseContents = scandir(ABSPATH);
916
- if (!is_array($baseContents)) {
917
- throw new Exception(__("Wordfence could not read the contents of your base WordPress directory. This usually indicates your permissions are so strict that your web server can't read your WordPress directory.", 'wordfence'));
 
 
 
 
 
 
 
 
 
 
 
 
918
  }
919
-
920
  $scanOutside = $this->scanController->scanOutsideWordPress();
921
- if ($scanOutside) {
922
- $_cache = array('scanned' => array_merge(array(ABSPATH), $base_absolute), 'skipped' => array());
923
- return $_cache;
924
- }
925
-
926
  $scanned = array();
927
  $skipped = array();
928
- foreach ($baseContents as $file) { //Only include base files less than a meg that are files.
929
- if ($file == '.' || $file == '..') {
930
- continue;
931
- }
932
- $fullFile = rtrim(ABSPATH, '/') . '/' . $file;
933
- if (!wfUtils::fileTooBig($fullFile)) { //Silently ignore files that are too large for the purposes of inclusion in the scan issue
934
- if (in_array($file, $base_abspath_relative) || in_array($fullFile, $base_absolute) || (@is_file($fullFile) && @is_readable($fullFile))) {
935
- $scanned[] = realpath($fullFile);
936
- } else {
937
- $skipped[] = $fullFile;
 
 
 
 
 
 
 
938
  }
939
  }
940
- }
941
- foreach ($base_absolute as $fullFile) {
942
- $realFile = realpath($fullFile);
943
- if ($realFile && !in_array($realFile, $scanned)) {
944
- $scanned[] = $realFile;
945
  }
946
  }
947
- $_cache = array('scanned' => $scanned, 'skipped' => $skipped);
 
 
 
948
  }
949
  return $_cache;
950
  }
@@ -957,11 +975,8 @@ class wfScanEngine {
957
  $paths = $this->_scannedSkippedPaths();
958
  if (!empty($paths['skipped'])) {
959
  $skippedList = '';
960
- foreach ($paths['skipped'] as $index => $fullPath) {
961
- $path = esc_html($fullPath);
962
- if (strpos($fullPath, ABSPATH) === 0) {
963
- $path = '~/' . esc_html(substr($fullPath, strlen(ABSPATH)));
964
- }
965
 
966
  if ($index >= 10) {
967
  $skippedList .= sprintf(/* translators: Number of paths skipped in scan. */ __(', and %d more.', 'wordfence'), count($paths['skipped']) - 10);
@@ -1030,7 +1045,7 @@ class wfScanEngine {
1030
  $knownFilesThemes = $this->getThemes();
1031
  $this->status(2, 'info', sprintf(/* translators: Number of themes. */ _n("Found %d theme", "Found %d themes", sizeof($knownFilesThemes), 'wordfence'), sizeof($knownFilesThemes)));
1032
 
1033
- $this->hasher = new wordfenceHash(strlen(ABSPATH), ABSPATH, $includeInKnownFilesScan, $knownFilesThemes, $knownFilesPlugins, $this, wfUtils::hex2bin($this->malwarePrefixesHash), $this->coreHashesHash, $this->scanMode);
1034
  }
1035
 
1036
  private function scan_knownFiles_main() {
1
  <?php
2
+ require_once(__DIR__ . '/wordfenceClass.php');
3
+ require_once(__DIR__ . '/wordfenceHash.php');
4
+ require_once(__DIR__ . '/wfAPI.php');
5
+ require_once(__DIR__ . '/wordfenceScanner.php');
6
+ require_once(__DIR__ . '/wfIssues.php');
7
+ require_once(__DIR__ . '/wfDB.php');
8
+ require_once(__DIR__ . '/wfUtils.php');
9
+ require_once(__DIR__ . '/wfFileUtils.php');
10
+ require_once(__DIR__ . '/wfScanPath.php');
11
+ require_once(__DIR__ . '/wfScanFile.php');
12
 
13
  class wfScanEngine {
14
  const SCAN_MANUALLY_KILLED = -999;
801
  array(
802
  'url' => $test->getUrl(),
803
  'file' => $pathFromRoot,
804
+ 'realFile' => $test->getPath(),
805
  'canDelete' => true,
806
  )
807
  );
905
  private function _scannedSkippedPaths() {
906
  static $_cache = null;
907
  if ($_cache === null) {
908
+ $scanPaths = array(
909
+ new wfScanPath(
910
+ ABSPATH,
911
+ ABSPATH,
912
+ '/',
913
+ array('.htaccess', 'index.php', 'license.txt', 'readme.html', 'wp-activate.php', 'wp-admin', 'wp-app.php', 'wp-blog-header.php', 'wp-comments-post.php', 'wp-config-sample.php', 'wp-content', 'wp-cron.php', 'wp-includes', 'wp-links-opml.php', 'wp-load.php', 'wp-login.php', 'wp-mail.php', 'wp-pass.php', 'wp-register.php', 'wp-settings.php', 'wp-signup.php', 'wp-trackback.php', 'xmlrpc.php', '.well-known', 'cgi-bin')
914
+ )
915
+ );
916
+ $directoryConstants = array(
917
+ 'WP_CONTENT_DIR' => '/wp-content',
918
+ 'WP_PLUGIN_DIR' => '/wp-content/plugins',
919
+ 'UPLOADS' => '/wp-content/uploads'
920
+ );
921
+ foreach ($directoryConstants as $constant => $wordpressPath) {
922
+ if (!defined($constant))
923
+ continue;
924
+ $path = constant($constant);
925
+ if (!empty($path)) {
926
+ if ($constant === 'UPLOADS')
927
+ $path = ABSPATH . $path;
928
+ $scanPaths[] = new wfScanPath(
929
+ ABSPATH,
930
+ $path,
931
+ $wordpressPath
932
+ );
933
+ }
934
  }
 
935
  $scanOutside = $this->scanController->scanOutsideWordPress();
 
 
 
 
 
936
  $scanned = array();
937
  $skipped = array();
938
+ foreach ($scanPaths as $scanPath) {
939
+ if (!$scanOutside && $scanPath->hasExpectedFiles()) {
940
+ try {
941
+ foreach ($scanPath->getContents() as $fileName) {
942
+ $file = $scanPath->createScanFile($fileName);
943
+ if (wfUtils::fileTooBig($file->getRealPath()))
944
+ continue;
945
+ if ($scanPath->expectsFile($fileName) || wfFileUtils::isReadableFile($file->getRealPath())) {
946
+ $scanned[$file->getRealPath()] = $file;
947
+ }
948
+ else {
949
+ $skipped[$file->getRealPath()] = $file;
950
+ }
951
+ }
952
+ }
953
+ catch (Exception $e) {
954
+ throw new Exception(__("Wordfence could not read the content of your WordPress directory. This usually indicates your permissions are so strict that your web server can't read your WordPress directory.", 'wordfence'));
955
  }
956
  }
957
+ else {
958
+ $file = $scanPath->createScanFile('/');
959
+ $scanned[$file->getRealPath()] = $file;
 
 
960
  }
961
  }
962
+ $_cache = array(
963
+ 'scanned' => array_values($scanned),
964
+ 'skipped' => array_values($skipped)
965
+ );
966
  }
967
  return $_cache;
968
  }
975
  $paths = $this->_scannedSkippedPaths();
976
  if (!empty($paths['skipped'])) {
977
  $skippedList = '';
978
+ foreach ($paths['skipped'] as $index => $file) {
979
+ $path = esc_html($file->getDisplayPath());
 
 
 
980
 
981
  if ($index >= 10) {
982
  $skippedList .= sprintf(/* translators: Number of paths skipped in scan. */ __(', and %d more.', 'wordfence'), count($paths['skipped']) - 10);
1045
  $knownFilesThemes = $this->getThemes();
1046
  $this->status(2, 'info', sprintf(/* translators: Number of themes. */ _n("Found %d theme", "Found %d themes", sizeof($knownFilesThemes), 'wordfence'), sizeof($knownFilesThemes)));
1047
 
1048
+ $this->hasher = new wordfenceHash($includeInKnownFilesScan, $knownFilesThemes, $knownFilesPlugins, $this, wfUtils::hex2bin($this->malwarePrefixesHash), $this->coreHashesHash, $this->scanMode);
1049
  }
1050
 
1051
  private function scan_knownFiles_main() {
lib/wfScanFile.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once __DIR__ . '/wfFileUtils.php';
4
+
5
+ class wfScanFile {
6
+
7
+ private $realPath = null;
8
+ private $wordpressPath = null;
9
+
10
+ public function __construct($realPath, $wordpressPath) {
11
+ $this->realPath = $realPath;
12
+ $this->wordpressPath = $wordpressPath;
13
+ }
14
+
15
+ public function getRealPath() {
16
+ return $this->realPath;
17
+ }
18
+
19
+ public function getWordpressPath() {
20
+ return $this->wordpressPath;
21
+ }
22
+
23
+ public function getDisplayPath() {
24
+ if (wfFileUtils::matchPaths($this->realPath, $this->wordpressPath)) {
25
+ return '~/' . $this->getWordpressPath();
26
+ }
27
+ return $this->realPath;
28
+ }
29
+
30
+ public function createChild($childPath) {
31
+ return new self(
32
+ realpath(wfFileUtils::joinPaths($this->realPath, $childPath)),
33
+ wfFileUtils::joinPaths($this->wordpressPath, $childPath)
34
+ );
35
+ }
36
+
37
+ public function __toString() {
38
+ return $this->getRealPath();
39
+ }
40
+
41
+ }
lib/wfScanPath.php ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once __DIR__ . '/wfFileUtils.php';
4
+ require_once __DIR__ . '/wfScanFile.php';
5
+
6
+ class wfScanPath {
7
+
8
+ private $baseDirectory;
9
+ private $path;
10
+ private $realPath;
11
+ private $wordpressPath;
12
+ private $expectedFiles;
13
+
14
+ public function __construct($baseDirectory, $path, $wordpressPath = null, $expectedFiles = null) {
15
+ $this->baseDirectory = $baseDirectory;
16
+ $this->path = $path;
17
+ $this->realPath = realpath($path);
18
+ $this->wordpressPath = $wordpressPath;
19
+ $this->expectedFiles = is_array($expectedFiles) ? array_flip($expectedFiles) : null;
20
+ }
21
+
22
+ public function getPath() {
23
+ return $this->path;
24
+ }
25
+
26
+ public function getRealPath() {
27
+ return $this->realPath;
28
+ }
29
+
30
+ public function getWordpressPath() {
31
+ return $this->wordpressPath;
32
+ }
33
+
34
+ public function hasExpectedFiles() {
35
+ return $this->expectedFiles !== null && !empty($this->expectedFiles);
36
+ }
37
+
38
+ public function expectsFile($name) {
39
+ return array_key_exists($name, $this->expectedFiles);
40
+ }
41
+
42
+ public function isBaseDirectory() {
43
+ return $this->path === $this->baseDirectory;
44
+ }
45
+
46
+ public function isBelowBaseDirectory() {
47
+ return wfFileUtils::belongsTo($this->path, $this->baseDirectory);
48
+ }
49
+
50
+ public function getContents() {
51
+ return wfFileUtils::getContents($this->realPath);
52
+ }
53
+
54
+ public function createScanFile($relativePath) {
55
+ return new wfScanFile(
56
+ realpath(wfFileUtils::joinPaths($this->realPath, $relativePath)),
57
+ wfFileUtils::trimSeparators(wfFileUtils::joinPaths($this->wordpressPath, $relativePath), true, false)
58
+ );
59
+ }
60
+
61
+ public function __toString() {
62
+ return $this->realPath;
63
+ }
64
+
65
+ }
lib/wordfenceClass.php CHANGED
@@ -191,8 +191,9 @@ class wordfence {
191
  global $wpdb;
192
  $version = $wpdb->get_var("SELECT VERSION()");
193
  wfConfig::set('dbVersion', $version);
194
-
195
- $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion());
 
196
  try {
197
  $keyType = wfLicense::KEY_TYPE_FREE;
198
  $keyData = $api->call('ping_api_key', array(), array('supportHash' => wfConfig::get('supportHash', ''), 'whitelistHash' => wfConfig::get('whitelistHash', ''), 'tldlistHash' => wfConfig::get('tldlistHash', '')));
@@ -265,7 +266,12 @@ class wordfence {
265
  }
266
 
267
  if (isset($keyData['_keyNoLongerValid']) && $keyData['_keyNoLongerValid'] == 1) {
268
- self::alert(__("The Wordfence Premium License in use on this site has been removed from your account.", 'wordfence'), __("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.", 'wordfence'), false);
 
 
 
 
 
269
  }
270
 
271
  wfConfig::set('keyType', $keyType);
@@ -1051,6 +1057,20 @@ SQL
1051
  foreach ($tables as $t) {
1052
  $schema->drop($t);
1053
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1054
 
1055
  //---- enable legacy 2fa if applicable
1056
  if (wfConfig::get('isPaid') && (wfCredentialsController::hasOld2FARecords() || version_compare(phpversion(), '5.3', '<'))) {
@@ -1745,7 +1765,13 @@ SQL
1745
  }
1746
 
1747
  if ($user === false && wfConfig::get('loginSec_maskLoginErrors')) {
1748
- wp_safe_redirect(!empty($_REQUEST['redirect_to'])?$_REQUEST['redirect_to']:'wp-login.php?checkemail=confirm');
 
 
 
 
 
 
1749
  exit;
1750
  }
1751
 
@@ -1757,7 +1783,11 @@ SQL
1757
  ), $alertCallback);
1758
 
1759
  }
1760
- if(wfConfig::get('loginSecurityEnabled')){
 
 
 
 
1761
  $tKey = self::getForgotPasswordFailureCountTransient($IP);
1762
  $forgotAttempts = get_transient($tKey);
1763
  if($forgotAttempts){
@@ -4977,6 +5007,21 @@ HTACCESS;
4977
  wfConfig::set('alertEmails', $email);
4978
  return array('ok' => 1, 'email' => $email);
4979
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4980
  public static function ajax_bulkOperation_callback() {
4981
  $op = sanitize_text_field($_POST['op']);
4982
  if ($op == 'del' || $op == 'repair') {
@@ -4990,12 +5035,9 @@ HTACCESS;
4990
  foreach ($issues['new'] as $i) {
4991
  if ($op == 'del' && @$i['data']['canDelete']) {
4992
  $file = $i['data']['file'];
4993
- $localFile = ABSPATH . '/' . $file;
4994
- $localFile = realpath($localFile);
4995
- if (strpos($localFile, ABSPATH) !== 0) {
4996
  continue;
4997
- }
4998
-
4999
  if ($localFile === ABSPATH . 'wp-config.php') {
5000
  $errors[] = esc_html__('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.', 'wordfence');
5001
  }
@@ -5011,12 +5053,9 @@ HTACCESS;
5011
  }
5012
  else if ($op == 'repair' && @$i['data']['canFix']) {
5013
  $file = $i['data']['file'];
5014
- $localFile = ABSPATH . '/' . $file;
5015
- $localFile = realpath($localFile);
5016
- if (strpos($localFile, ABSPATH) !== 0) {
5017
  continue;
5018
- }
5019
-
5020
  $result = array();
5021
  if (isset($i['data']) && is_array($i['data']) && isset($i['data']['file']) && isset($i['data']['cType']) && ( //Basics
5022
  $i['data']['cType'] == 'core' || //Core file
@@ -5115,12 +5154,11 @@ HTACCESS;
5115
  return array('errorMsg' => __('Could not delete file because that issue does not appear to be a file related issue.', 'wordfence'));
5116
  }
5117
  $file = $issue['data']['file'];
5118
- $localFile = ABSPATH . '/' . $file;
5119
- $localFile = realpath($localFile);
5120
- if(strpos($localFile, ABSPATH) !== 0){
5121
  return array('errorMsg' => __('An invalid file was requested for deletion.', 'wordfence'));
5122
  }
5123
- if ($localFile === ABSPATH . 'wp-config.php') {
5124
  return array(
5125
  'errorMsg' => __('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.', 'wordfence')
5126
  );
@@ -5265,7 +5303,12 @@ HTACCESS;
5265
  if(preg_match('/\.\./', $file)){
5266
  return array('errorMsg' => __("An invalid file was specified for repair.", 'wordfence'));
5267
  }
5268
- $localFile = rtrim(ABSPATH, '/') . '/' . preg_replace('/^[\.\/]+/', '', $file);
 
 
 
 
 
5269
  if ($wp_filesystem->put_contents($localFile, $result['fileContent'])) {
5270
  $wfIssues->updateIssue($issueID, 'delete');
5271
  $counts = $wfIssues->getIssueCounts();
@@ -5643,6 +5686,19 @@ HTML;
5643
  return ($a['ctime'] < $b['ctime']) ? -1 : 1;
5644
  }
5645
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5646
  public static function wfFunc_viewOption() {
5647
  /** @var wpdb $wpdb */
5648
  global $wpdb;
@@ -5662,7 +5718,9 @@ HTML;
5662
  _e("File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)", 'wordfence');
5663
  exit();
5664
  }
5665
- $localFile = ABSPATH . preg_replace('/^(?:\.\.|[\/]+)/', '', sanitize_text_field($_GET['file']));
 
 
5666
  if(strpos($localFile, '..') !== false){
5667
  _e("Invalid file requested. (Relative paths not allowed)", 'wordfence');
5668
  exit();
@@ -5696,6 +5754,7 @@ HTML;
5696
  require(dirname(__FILE__) . '/wfViewResult.php');
5697
  exit(0);
5698
  }
 
5699
  public static function wfFunc_diff(){
5700
  wfUtils::doNotCache();
5701
  if (WORDFENCE_DISABLE_FILE_VIEWER) {
@@ -5716,8 +5775,19 @@ HTML;
5716
  exit(0);
5717
  }
5718
 
5719
- $localFile = realpath(ABSPATH . '/' . preg_replace('/^[\.\/]+/', '', $_GET['file']));
 
 
 
 
 
 
 
5720
  $localContents = file_get_contents($localFile);
 
 
 
 
5721
  if($localContents == $result['fileContent']){
5722
  $diffResult = '';
5723
  } else {
@@ -5740,7 +5810,9 @@ HTML;
5740
  esc_html_e("File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)", 'wordfence');
5741
  exit();
5742
  }
5743
- $localFile = ABSPATH . preg_replace('/^(?:\.\.|[\/]+)/', '', sanitize_text_field($_GET['file']));
 
 
5744
  if (strpos($localFile, '..') !== false) {
5745
  esc_html_e("Invalid file requested. (Relative paths not allowed)", 'wordfence');
5746
  exit();
@@ -6621,8 +6693,8 @@ HTML;
6621
  }
6622
 
6623
  public static function admin_menus_80() {
6624
- if (wfCentral::isSupported()) {
6625
- add_submenu_page('', __('Wordfence Central', 'wordfence'), __('Wordfence Central', 'wordfence'), 'activate_plugins', 'WordfenceCentral', 'wordfence::menu_wordfence_central');
6626
  }
6627
  }
6628
 
@@ -6648,6 +6720,10 @@ HTML;
6648
  add_submenu_page("Wordfence", $message, "<strong id=\"wfMenuCallout\" style=\"color: #FCB214;\">" . $message . "</strong>", "activate_plugins", $slug, 'wordfence::_menu_noop');
6649
  add_filter('clean_url', 'wordfence::_patchWordfenceSubmenuCallout', 10, 3);
6650
  }
 
 
 
 
6651
 
6652
  public static function _patchWordfenceSubmenuCallout($url, $original_url, $_context){
6653
  if (preg_match('/(?:WordfenceUpgradeTo(Premium|Care|Response))$/i', $url, $matches)) {
@@ -7091,7 +7167,7 @@ HTML
7091
  public static function alert($subject, $alertMsg, $IP) {
7092
  wfConfig::inc('totalAlertsSent');
7093
  $emails = wfConfig::getAlertEmails();
7094
- if (sizeof($emails) < 1) { return; }
7095
 
7096
  $IPMsg = "";
7097
  if ($IP) {
@@ -7139,7 +7215,7 @@ HTML
7139
  $totalSent += isset($sendArr[$i]) ? $sendArr[$i] : 0;
7140
  }
7141
  if($totalSent >= $sendMax){
7142
- return;
7143
  }
7144
  $sendArr[$minuteTime] = isset($sendArr[$minuteTime]) ? $sendArr[$minuteTime] + 1 : 1;
7145
  wfConfig::set_ser('alertFreqTrack', $sendArr);
@@ -7151,7 +7227,7 @@ HTML
7151
  $lastHashDat = explode(':', $lastHash); //[time, hash]
7152
  if(time() - $lastHashDat[0] < 3600){
7153
  if($lastHashDat[1] == $hash){
7154
- return; //Don't send because this email is identical to the previous email which was sent within the last hour.
7155
  }
7156
  }
7157
  }
@@ -7160,6 +7236,7 @@ HTML
7160
  $uniqueContent = $content . "\n\n" . sprintf(/* translators: WordPress admin panel URL. */ __('No longer an administrator for this site? Click here to stop receiving security alerts: %s', 'wordfence'), wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . wfUtils::generateJWT(array('email' => $email)));
7161
  wp_mail($email, $subject, $uniqueContent);
7162
  }
 
7163
  }
7164
  public static function getLog(){
7165
  if(! self::$wfLog){
@@ -9343,6 +9420,10 @@ if (file_exists(__DIR__.%1$s)) {
9343
  $hasRun = true;
9344
  add_action('shutdown', 'wfCentral::requestConfigurationSync');
9345
  }
 
 
 
 
9346
  }
9347
 
9348
 
191
  global $wpdb;
192
  $version = $wpdb->get_var("SELECT VERSION()");
193
  wfConfig::set('dbVersion', $version);
194
+
195
+ $apiKey = wfConfig::get('apiKey');
196
+ $api = new wfAPI($apiKey, wfUtils::getWPVersion());
197
  try {
198
  $keyType = wfLicense::KEY_TYPE_FREE;
199
  $keyData = $api->call('ping_api_key', array(), array('supportHash' => wfConfig::get('supportHash', ''), 'whitelistHash' => wfConfig::get('whitelistHash', ''), 'tldlistHash' => wfConfig::get('tldlistHash', '')));
266
  }
267
 
268
  if (isset($keyData['_keyNoLongerValid']) && $keyData['_keyNoLongerValid'] == 1) {
269
+ if (wfConfig::get('keyDeletedNotice') !== $apiKey) {
270
+ $keyDeletedNoticeSent = self::alert(__("The Wordfence Premium License in use on this site has been removed from your account.", 'wordfence'), __("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.", 'wordfence'), false);
271
+ if ($keyDeletedNoticeSent) {
272
+ wfConfig::set('keyDeletedNotice', $apiKey);
273
+ }
274
+ }
275
  }
276
 
277
  wfConfig::set('keyType', $keyType);
1057
  foreach ($tables as $t) {
1058
  $schema->drop($t);
1059
  }
1060
+
1061
+ //7.5.10
1062
+ $knownFilesTable = wfDB::networkTable('wfKnownFileList');
1063
+ $wordpressPathColumn = $wpdb->get_row($wpdb->prepare("SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s AND COLUMN_NAME = 'wordpress_path'", $knownFilesTable));
1064
+ if ($wordpressPathColumn === null) {
1065
+ $wpdb->query("DELETE FROM `{$knownFilesTable}`");
1066
+ $wpdb->query("ALTER TABLE `{$knownFilesTable}` ADD COLUMN wordpress_path TEXT NOT NULL");
1067
+ }
1068
+
1069
+ $realPathColumn = $wpdb->get_row($wpdb->prepare("SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s AND COLUMN_NAME = 'real_path'", $fileModsTable));
1070
+ if ($realPathColumn === null) {
1071
+ $wpdb->query("DELETE FROM `{$fileModsTable}`");
1072
+ $wpdb->query("ALTER TABLE `{$fileModsTable}` ADD COLUMN real_path TEXT NOT NULL AFTER filename");
1073
+ }
1074
 
1075
  //---- enable legacy 2fa if applicable
1076
  if (wfConfig::get('isPaid') && (wfCredentialsController::hasOld2FARecords() || version_compare(phpversion(), '5.3', '<'))) {
1765
  }
1766
 
1767
  if ($user === false && wfConfig::get('loginSec_maskLoginErrors')) {
1768
+ if (self::hasWoocommerce() && isset($_POST['wc_reset_password'], $_POST['user_login'])) {
1769
+ $redirectUrl = add_query_arg('reset-link-sent', 'true', wc_get_account_endpoint_url('lost-password'));
1770
+ }
1771
+ else {
1772
+ $redirectUrl = !empty($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm';
1773
+ }
1774
+ wp_safe_redirect($redirectUrl);
1775
  exit;
1776
  }
1777
 
1783
  ), $alertCallback);
1784
 
1785
  }
1786
+
1787
+ // do not count password reset attempts if there is a user logged in with the edit_users capability
1788
+ // because they're probably using the "send password reset" feature in the WP admin and therefore we shouldn't
1789
+ // be locking them out!
1790
+ if(wfConfig::get('loginSecurityEnabled') && !current_user_can( 'edit_users' ) ){
1791
  $tKey = self::getForgotPasswordFailureCountTransient($IP);
1792
  $forgotAttempts = get_transient($tKey);
1793
  if($forgotAttempts){
5007
  wfConfig::set('alertEmails', $email);
5008
  return array('ok' => 1, 'email' => $email);
5009
  }
5010
+ private static function resolveLocalFile($issue) {
5011
+ $data = $issue['data'];
5012
+ if (array_key_exists('realFile', $data)) {
5013
+ return $data['realFile'];
5014
+ }
5015
+ else {
5016
+ $file = $issue['data']['file'];
5017
+ $localFile = ABSPATH . '/' . $file;
5018
+ $localFile = realpath($localFile);
5019
+ if (strpos($localFile, ABSPATH) !== 0) {
5020
+ return null;
5021
+ }
5022
+ return $localFile;
5023
+ }
5024
+ }
5025
  public static function ajax_bulkOperation_callback() {
5026
  $op = sanitize_text_field($_POST['op']);
5027
  if ($op == 'del' || $op == 'repair') {
5035
  foreach ($issues['new'] as $i) {
5036
  if ($op == 'del' && @$i['data']['canDelete']) {
5037
  $file = $i['data']['file'];
5038
+ $localFile = self::resolveLocalFile($i);
5039
+ if ($localFile === null)
 
5040
  continue;
 
 
5041
  if ($localFile === ABSPATH . 'wp-config.php') {
5042
  $errors[] = esc_html__('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.', 'wordfence');
5043
  }
5053
  }
5054
  else if ($op == 'repair' && @$i['data']['canFix']) {
5055
  $file = $i['data']['file'];
5056
+ $localFile = self::resolveLocalFile($i);
5057
+ if ($localFile === null)
 
5058
  continue;
 
 
5059
  $result = array();
5060
  if (isset($i['data']) && is_array($i['data']) && isset($i['data']['file']) && isset($i['data']['cType']) && ( //Basics
5061
  $i['data']['cType'] == 'core' || //Core file
5154
  return array('errorMsg' => __('Could not delete file because that issue does not appear to be a file related issue.', 'wordfence'));
5155
  }
5156
  $file = $issue['data']['file'];
5157
+ $localFile = self::resolveLocalFile($issue);
5158
+ if($localFile === null){
 
5159
  return array('errorMsg' => __('An invalid file was requested for deletion.', 'wordfence'));
5160
  }
5161
+ if ($file === 'wp-config.php') {
5162
  return array(
5163
  'errorMsg' => __('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.', 'wordfence')
5164
  );
5303
  if(preg_match('/\.\./', $file)){
5304
  return array('errorMsg' => __("An invalid file was specified for repair.", 'wordfence'));
5305
  }
5306
+ if (array_key_exists('realFile', $dat)) {
5307
+ $localFile = $dat['realFile'];
5308
+ }
5309
+ else {
5310
+ $localFile = rtrim(ABSPATH, '/') . '/' . preg_replace('/^[\.\/]+/', '', $file);
5311
+ }
5312
  if ($wp_filesystem->put_contents($localFile, $result['fileContent'])) {
5313
  $wfIssues->updateIssue($issueID, 'delete');
5314
  $counts = $wfIssues->getIssueCounts();
5686
  return ($a['ctime'] < $b['ctime']) ? -1 : 1;
5687
  }
5688
 
5689
+ private static function checkRealFileParameters() {
5690
+ if (array_key_exists('realFile', $_GET)) {
5691
+ $realFile = stripslashes($_GET['realFile']);
5692
+ $token = array_key_exists('realFileToken', $_GET) ? $_GET['realFileToken'] : '';
5693
+ if (!wfIssues::verifyRealFileToken($token, $realFile)) {
5694
+ esc_html_e('This link has expired. Refresh the scan results page and try again.', 'wordfence');
5695
+ exit(0);
5696
+ }
5697
+ return $realFile;
5698
+ }
5699
+ return null;
5700
+ }
5701
+
5702
  public static function wfFunc_viewOption() {
5703
  /** @var wpdb $wpdb */
5704
  global $wpdb;
5718
  _e("File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)", 'wordfence');
5719
  exit();
5720
  }
5721
+ $localFile = self::checkRealFileParameters();
5722
+ if ($localFile === null)
5723
+ $localFile = ABSPATH . preg_replace('/^(?:\.\.|[\/]+)/', '', sanitize_text_field($_GET['file']));
5724
  if(strpos($localFile, '..') !== false){
5725
  _e("Invalid file requested. (Relative paths not allowed)", 'wordfence');
5726
  exit();
5754
  require(dirname(__FILE__) . '/wfViewResult.php');
5755
  exit(0);
5756
  }
5757
+
5758
  public static function wfFunc_diff(){
5759
  wfUtils::doNotCache();
5760
  if (WORDFENCE_DISABLE_FILE_VIEWER) {
5775
  exit(0);
5776
  }
5777
 
5778
+ $localFile = self::checkRealFileParameters();
5779
+ if ($localFile === null) {
5780
+ $localFile = realpath(ABSPATH . '/' . preg_replace('/^[\.\/]+/', '', $_GET['file']));
5781
+ }
5782
+ if (empty($localFile)) {
5783
+ esc_html_e('Empty file path provided', 'wordfence');
5784
+ exit(0);
5785
+ }
5786
  $localContents = file_get_contents($localFile);
5787
+ if ($localContents === false) {
5788
+ esc_html_e('Unable to read file contents', 'wordfence');
5789
+ exit(0);
5790
+ }
5791
  if($localContents == $result['fileContent']){
5792
  $diffResult = '';
5793
  } else {
5810
  esc_html_e("File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)", 'wordfence');
5811
  exit();
5812
  }
5813
+ $localFile = self::checkRealFileParameters();
5814
+ if ($localFile === null)
5815
+ $localFile = ABSPATH . preg_replace('/^(?:\.\.|[\/]+)/', '', sanitize_text_field($_GET['file']));
5816
  if (strpos($localFile, '..') !== false) {
5817
  esc_html_e("Invalid file requested. (Relative paths not allowed)", 'wordfence');
5818
  exit();
6693
  }
6694
 
6695
  public static function admin_menus_80() {
6696
+ if (wfCentral::isSupported() && self::isPage('WordfenceCentral')) {
6697
+ add_submenu_page('Wordfence', __('Wordfence Central', 'wordfence'), __('Wordfence Central', 'wordfence'), 'activate_plugins', 'WordfenceCentral', 'wordfence::menu_wordfence_central');
6698
  }
6699
  }
6700
 
6720
  add_submenu_page("Wordfence", $message, "<strong id=\"wfMenuCallout\" style=\"color: #FCB214;\">" . $message . "</strong>", "activate_plugins", $slug, 'wordfence::_menu_noop');
6721
  add_filter('clean_url', 'wordfence::_patchWordfenceSubmenuCallout', 10, 3);
6722
  }
6723
+
6724
+ private static function isPage($page) {
6725
+ return array_key_exists('page', $_GET) && $_GET['page'] === $page;
6726
+ }
6727
 
6728
  public static function _patchWordfenceSubmenuCallout($url, $original_url, $_context){
6729
  if (preg_match('/(?:WordfenceUpgradeTo(Premium|Care|Response))$/i', $url, $matches)) {
7167
  public static function alert($subject, $alertMsg, $IP) {
7168
  wfConfig::inc('totalAlertsSent');
7169
  $emails = wfConfig::getAlertEmails();
7170
+ if (sizeof($emails) < 1) { return false; }
7171
 
7172
  $IPMsg = "";
7173
  if ($IP) {
7215
  $totalSent += isset($sendArr[$i]) ? $sendArr[$i] : 0;
7216
  }
7217
  if($totalSent >= $sendMax){
7218
+ return false;
7219
  }
7220
  $sendArr[$minuteTime] = isset($sendArr[$minuteTime]) ? $sendArr[$minuteTime] + 1 : 1;
7221
  wfConfig::set_ser('alertFreqTrack', $sendArr);
7227
  $lastHashDat = explode(':', $lastHash); //[time, hash]
7228
  if(time() - $lastHashDat[0] < 3600){
7229
  if($lastHashDat[1] == $hash){
7230
+ return false; //Don't send because this email is identical to the previous email which was sent within the last hour.
7231
  }
7232
  }
7233
  }
7236
  $uniqueContent = $content . "\n\n" . sprintf(/* translators: WordPress admin panel URL. */ __('No longer an administrator for this site? Click here to stop receiving security alerts: %s', 'wordfence'), wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . wfUtils::generateJWT(array('email' => $email)));
7237
  wp_mail($email, $subject, $uniqueContent);
7238
  }
7239
+ return true;
7240
  }
7241
  public static function getLog(){
7242
  if(! self::$wfLog){
9420
  $hasRun = true;
9421
  add_action('shutdown', 'wfCentral::requestConfigurationSync');
9422
  }
9423
+
9424
+ public static function hasWoocommerce() {
9425
+ return class_exists('woocommerce');
9426
+ }
9427
  }
9428
 
9429
 
lib/wordfenceHash.php CHANGED
@@ -6,7 +6,6 @@ class wordfenceHash {
6
  private $startTime = false;
7
 
8
  //Begin serialized vars
9
- public $striplen = 0;
10
  public $totalFiles = 0;
11
  public $totalDirs = 0;
12
  public $totalData = 0; //To do a sanity check, don't use 'du' because it gets sparse files wrong and reports blocks used on disk. Use : find . -type f -ls | awk '{total += $7} END {print total}'
@@ -22,8 +21,7 @@ class wordfenceHash {
22
  private $haveIssues = array();
23
  private $status = array();
24
  private $possibleMalware = array();
25
- private $path = false;
26
- private $only = false;
27
  private $totalForks = 0;
28
  private $alertedOnUnknownWordPressVersion = false;
29
  private $foldersEntered = array();
@@ -33,9 +31,9 @@ class wordfenceHash {
33
  private $indexSize = 0;
34
  private $currentIndex = 0;
35
  private $coalescingIssues = array();
 
36
 
37
  /**
38
- * @param string $striplen
39
  * @param string $path
40
  * @param array $only
41
  * @param array $themes
@@ -43,10 +41,8 @@ class wordfenceHash {
43
  * @param wfScanEngine $engine
44
  * @throws Exception
45
  */
46
- public function __construct($striplen, $path, $only, $themes, $plugins, $engine, $malwarePrefixesHash, $coreHashesHash, $scanMode) {
47
- $this->striplen = $striplen;
48
- $this->path = $path;
49
- $this->only = $only;
50
  $this->engine = $engine;
51
 
52
  $this->startTime = microtime(true);
@@ -131,12 +127,6 @@ class wordfenceHash {
131
  wfIssues::statusEnd($coreHashesStatus, wfIssues::STATUS_SUCCESS);
132
  }
133
 
134
- if($this->path[strlen($this->path) - 1] != '/'){
135
- $this->path .= '/';
136
- }
137
- if(! is_readable($path)){
138
- throw new Exception(sprintf(__("Could not read directory %s to do scan.", 'wordfence'), $this->path));
139
- }
140
  $this->haveIssues = array(
141
  'core' => wfIssues::STATUS_SECURE,
142
  'coreUnknown' => wfIssues::STATUS_SECURE,
@@ -171,7 +161,7 @@ class wordfenceHash {
171
  }
172
  }
173
  public function __sleep(){
174
- return array('striplen', 'totalFiles', 'totalDirs', 'totalData', 'stoppedOnFile', 'coreEnabled', 'pluginsEnabled', 'themesEnabled', 'malwareEnabled', 'coreUnknownEnabled', 'knownFiles', 'haveIssues', 'status', 'possibleMalware', 'path', 'only', 'totalForks', 'alertedOnUnknownWordPressVersion', 'foldersProcessed', 'suspectedFiles', 'indexed', 'indexSize', 'currentIndex', 'foldersEntered', 'coalescingIssues');
175
  }
176
  public function __wakeup(){
177
  $this->db = new wfDB();
@@ -193,30 +183,15 @@ class wordfenceHash {
193
  public function getSuspectedFiles() {
194
  return array_keys($this->suspectedFiles);
195
  }
196
- public function run($engine){ //base path and 'only' is a list of files and dirs in the base that are the only ones that should be processed. Everything else in base is ignored. If only is empty then everything is processed.
197
  if($this->totalForks > 1000){
198
  throw new Exception(sprintf(/* translators: File path. */ __("Wordfence file scanner detected a possible infinite loop. Exiting on file: %s", 'wordfence'), $this->stoppedOnFile));
199
  }
200
  $this->engine = $engine;
201
- wordfence::status(4, 'info', __("Indexing files for scanning", 'wordfence'));
202
  if (!$this->indexed) {
203
  $start = microtime(true);
204
  $indexedFiles = array();
205
-
206
- if (count($this->only) > 0) {
207
- $files = $this->only; //These are absolute paths
208
- }
209
- else { //This code path generally should not get hit
210
- $rawFiles = scandir($this->path);
211
- $files = array();
212
- foreach ($rawFiles as $file) {
213
- if ($file == '.' || $file == '..') { continue; }
214
- $fullFile = rtrim($this->path, '/') . '/' . $file;
215
- $files[] = $fullFile;
216
- }
217
- }
218
-
219
- foreach ($files as $file) {
220
  $this->_dirIndex($file, $indexedFiles);
221
  }
222
  $this->_serviceIndexQueue($indexedFiles, true);
@@ -227,7 +202,7 @@ class wordfenceHash {
227
  wordfence::status(4, 'info', sprintf(/* translators: Time in seconds. */ __("Index time: %s", 'wordfence'), ($end - $start)));
228
  }
229
 
230
- $this->_checkForTimeout('');
231
 
232
  wordfence::status(4, 'info', __("Beginning file hashing", 'wordfence'));
233
  while ($file = $this->_nextFile()) {
@@ -258,12 +233,13 @@ class wordfenceHash {
258
  $added = $this->engine->addIssue(
259
  'file',
260
  wfIssues::SEVERITY_CRITICAL,
261
- $this->path . $file,
262
  $md5,
263
  sprintf(/* translators: File path. */ __('This file is suspected malware: %s', 'wordfence'), $file),
264
  sprintf(/* translators: Malware name/title. */ __("This file's signature matches a known malware file. The title of the malware is '%s'. Immediately inspect this file using the 'View' option below and consider deleting it from your server.", 'wordfence'), $name),
265
  array(
266
  'file' => $file,
 
267
  'cType' => 'unknown',
268
  'canDiff' => false,
269
  'canFix' => false,
@@ -279,30 +255,28 @@ class wordfenceHash {
279
  if($this->malwareEnabled){ wfIssues::statusEnd($this->status['malware'], $this->haveIssues['malware']); $this->engine->scanController()->completeStage(wfScanner::STAGE_MALWARE_SCAN, $this->haveIssues['malware']); }
280
  unset($this->knownFiles); $this->knownFiles = false;
281
  }
282
- private function _dirIndex($path, &$indexedFiles) {
283
- if (substr($path, -3, 3) == '/..' || substr($path, -2, 2) == '/.') {
 
 
284
  return;
285
- }
286
- if (!is_readable($path)) { return; } //Applies to files and dirs
287
- if (!$this->_shouldProcessPath($path)) { return; }
288
- if (is_dir($path)) {
289
- $realPath = realpath($path);
290
- if (!$this->stoppedOnFile && isset($this->foldersEntered[$realPath])) { //Not resuming and already entered this path
291
  return;
292
  }
293
 
294
- $this->foldersEntered[$realPath] = 1;
295
 
296
  $this->totalDirs++;
297
- if ($path[strlen($path) - 1] != '/') {
298
- $path .= '/';
299
- }
300
- $cont = scandir($path);
301
- for ($i = 0; $i < sizeof($cont); $i++) {
302
- if ($cont[$i] == '.' || $cont[$i] == '..') { continue; }
303
- $file = $path . $cont[$i];
304
- if (is_file($file)) {
305
- $relativeFile = substr($file, $this->striplen);
306
  if ($this->stoppedOnFile && $relativeFile != $this->stoppedOnFile) {
307
  continue;
308
  }
@@ -312,19 +286,17 @@ class wordfenceHash {
312
  $this->suspectedFiles[$relativeFile] = 1;
313
  }
314
 
315
- $this->_checkForTimeout($file, $indexedFiles);
316
- if ($this->_shouldHashFile($file)) {
317
- $resolvedFile = realpath($file);
318
- if ($resolvedFile) {
319
- $indexedFiles[] = substr($resolvedFile, $this->striplen);
320
- }
321
  }
322
  else {
323
- wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Skipping unneeded hash: %s", 'wordfence'), $file));
324
  }
325
  $this->_serviceIndexQueue($indexedFiles);
326
- } else if (is_dir($file)) {
327
- $this->_dirIndex($file, $indexedFiles);
 
328
  }
329
  }
330
 
@@ -332,8 +304,8 @@ class wordfenceHash {
332
  unset($this->foldersEntered[$realPath]);
333
  }
334
  else {
335
- if (is_file($path)) {
336
- $relativeFile = substr($path, $this->striplen);
337
  if ($this->stoppedOnFile && $relativeFile != $this->stoppedOnFile) {
338
  return;
339
  }
@@ -343,33 +315,36 @@ class wordfenceHash {
343
  $this->suspectedFiles[$relativeFile] = 1;
344
  }
345
 
346
- $this->_checkForTimeout($path, $indexedFiles);
347
- if ($this->_shouldHashFile($path)) {
348
- $indexedFiles[] = substr($path, $this->striplen);
349
  }
350
  else {
351
- wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Skipping unneeded hash: %s", 'wordfence'), $path));
352
  }
353
  $this->_serviceIndexQueue($indexedFiles);
354
  }
355
  }
356
  }
357
  private function _serviceIndexQueue(&$indexedFiles, $final = false) {
358
- $payload = array();
359
  if (count($indexedFiles) > 500) {
360
- $payload = array_splice($indexedFiles, 0, 500);
361
  }
362
  else if ($final) {
363
- $payload = $indexedFiles;
364
  $indexedFiles = array();
365
  }
366
 
367
- $payload = array_filter($payload); //Strip empty strings -- these are symlinks to files outside of the site root (ABSPATH)
368
-
369
- if (count($payload) > 0) {
 
 
 
370
  global $wpdb;
371
  $table_wfKnownFileList = wfDB::networkTable('wfKnownFileList');
372
- $query = substr("INSERT INTO {$table_wfKnownFileList} (path) VALUES " . str_repeat("('%s'), ", count($payload)), 0, -2);
373
  $wpdb->query($wpdb->prepare($query, $payload));
374
  $this->indexSize += count($payload);
375
  wordfence::status(2, 'info', sprintf(/* translators: Number of files. */ __("%d files indexed", 'wordfence'), $this->indexSize));
@@ -380,7 +355,13 @@ class wordfenceHash {
380
  if (count($files) == 0) {
381
  global $wpdb;
382
  $table_wfKnownFileList = wfDB::networkTable('wfKnownFileList');
383
- $files = $wpdb->get_col($wpdb->prepare("SELECT path FROM {$table_wfKnownFileList} WHERE id > %d ORDER BY id ASC LIMIT 500", $this->currentIndex));
 
 
 
 
 
 
384
  }
385
 
386
  $file = null;
@@ -395,15 +376,15 @@ class wordfenceHash {
395
  if ($file === null) {
396
  return null;
397
  }
398
- return ABSPATH . $file;
399
  }
400
- private function _checkForTimeout($path, $indexQueue = false) {
401
- $file = substr($path, $this->striplen);
402
- if ((!$this->stoppedOnFile) && $this->engine->shouldFork()) { //max X seconds but don't allow fork if we're looking for the file we stopped on. Search mode is VERY fast.
403
  if ($indexQueue !== false) {
404
  $this->_serviceIndexQueue($indexQueue, true);
405
- $this->stoppedOnFile = $file;
406
- wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Forking during indexing: %s", 'wordfence'), $path));
407
  }
408
  else {
409
  wordfence::status(4, 'info', sprintf(/* translators: PHP max execution time. */ __("Calling fork() from wordfenceHash with maxExecTime: %s", 'wordfence'), $this->engine->maxExecTime));
@@ -412,25 +393,24 @@ class wordfenceHash {
412
  //exits
413
  }
414
 
415
- if ($this->stoppedOnFile && $file != $this->stoppedOnFile && $indexQueue !== false) {
416
  return;
417
  }
418
- else if ($this->stoppedOnFile && $file == $this->stoppedOnFile) {
419
  $this->stoppedOnFile = false; //Continue indexing
420
  }
421
  }
422
- private function _shouldProcessPath($path) {
423
- $file = substr($path, $this->striplen);
424
  $excludePatterns = wordfenceScanner::getExcludeFilePattern(wordfenceScanner::EXCLUSION_PATTERNS_USER);
425
  if ($excludePatterns) {
426
  foreach ($excludePatterns as $pattern) {
427
- if (preg_match($pattern, $file)) {
428
  return false;
429
  }
430
  }
431
  }
432
 
433
- $realPath = realpath($path);
434
  if ($realPath === '/') {
435
  return false;
436
  }
@@ -440,61 +420,63 @@ class wordfenceHash {
440
 
441
  return true;
442
  }
443
- private function processFile($realFile) {
444
- $file = substr($realFile, $this->striplen);
445
-
446
- if (wfUtils::fileTooBig($realFile)) {
447
- wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Skipping file larger than max size: %s", 'wordfence'), $realFile));
448
  return;
449
  }
450
 
451
  if (function_exists('memory_get_usage')) {
452
- wordfence::status(4, 'info', sprintf(/* translators: 1. File path. 2. Memory in bytes. */ __('Scanning: %1$s (Mem:%2$s)', 'wordfence'), $realFile, sprintf('%.1fM', memory_get_usage(true) / (1024 * 1024))));
453
  }
454
  else {
455
- wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Scanning: %s", 'wordfence'), $realFile));
456
  }
457
 
458
- wfUtils::beginProcessingFile($file);
459
- $wfHash = self::hashFile($realFile);
460
  $this->engine->scanController()->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_FILES);
461
  if ($wfHash) {
462
  $md5 = strtoupper($wfHash[0]);
463
  $shac = strtoupper($wfHash[1]);
464
  $knownFile = 0;
465
  if($this->malwareEnabled && $this->isMalwarePrefix($md5)){
466
- $this->possibleMalware[] = array($file, $md5);
 
467
  }
468
 
469
  $knownFileExclude = wordfenceScanner::getExcludeFilePattern(wordfenceScanner::EXCLUSION_PATTERNS_KNOWN_FILES);
470
  $allowKnownFileScan = true;
471
  if ($knownFileExclude) {
472
  foreach ($knownFileExclude as $pattern) {
473
- if (preg_match($pattern, $realFile)) {
474
  $allowKnownFileScan = false;
475
  }
476
  }
477
  }
478
 
479
  if ($allowKnownFileScan) {
480
- if (isset($this->knownFiles['core'][$file])) {
481
- if (strtoupper($this->knownFiles['core'][$file]) == $shac) {
482
  $knownFile = 1;
483
  }
484
  else {
485
  if ($this->coreEnabled) {
486
- $localFile = ABSPATH . '/' . preg_replace('/^[\.\/]+/', '', $file);
487
  $fileContents = @file_get_contents($localFile);
488
  if ($fileContents && (!preg_match('/<\?' . 'php[\r\n\s\t]*\/\/[\r\n\s\t]*Silence is golden\.[\r\n\s\t]*(?:\?>)?[\r\n\s\t]*$/s', $fileContents))) {
489
  $this->engine->addPendingIssue(
490
  'knownfile',
491
  wfIssues::SEVERITY_HIGH,
492
- 'coreModified' . $file,
493
- 'coreModified' . $file . $md5,
494
- sprintf(/* translators: File path. */ __('WordPress core file modified: %s', 'wordfence'), $file),
495
  __("This WordPress core file has been modified and differs from the original file distributed with this version of WordPress.", 'wordfence'),
496
  array(
497
- 'file' => $file,
 
498
  'cType' => 'core',
499
  'canDiff' => true,
500
  'canFix' => true,
@@ -506,28 +488,28 @@ class wordfenceHash {
506
  }
507
  }
508
  }
509
- else if (isset($this->knownFiles['plugins'][$file])) {
510
- if (in_array($shac, $this->knownFiles['plugins'][$file])) {
511
  $knownFile = 1;
512
  }
513
  else {
514
  if ($this->pluginsEnabled) {
515
  $options = $this->engine->scanController()->scanOptions();
516
  $shouldGenerateIssue = true;
517
- if (!$options['scansEnabled_highSense'] && preg_match('~/readme\.(?:txt|md)$~i', $file)) { //Don't generate issues for changed readme files unless high sensitivity is on
518
  $shouldGenerateIssue = false;
519
  }
520
 
521
  if ($shouldGenerateIssue) {
522
- $itemName = $this->knownFiles['plugins'][$file][0];
523
- $itemVersion = $this->knownFiles['plugins'][$file][1];
524
- $cKey = $this->knownFiles['plugins'][$file][2];
525
  $this->engine->addPendingIssue(
526
  'knownfile',
527
  wfIssues::SEVERITY_MEDIUM,
528
- 'modifiedplugin' . $file,
529
- 'modifiedplugin' . $file . $md5,
530
- sprintf(/* translators: File path. */ __('Modified plugin file: %s', 'wordfence'), $file),
531
  sprintf(
532
  /* translators: 1. Plugin name. 2. Plugin version. 3. Support URL. */
533
  __('This file belongs to plugin "%1$s" version "%2$s" and has been modified from the file that is distributed by WordPress.org for this version. Please use the link to see how the file has changed. If you have modified this file yourself, you can safely ignore this warning. If you see a lot of changed files in a plugin that have been made by the author, then try uninstalling and reinstalling the plugin to force an upgrade. Doing this is a workaround for plugin authors who don\'t manage their code correctly. <a href="%3$s" target="_blank" rel="noopener noreferrer">Learn More<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'),
@@ -536,7 +518,8 @@ class wordfenceHash {
536
  wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_MODIFIED_PLUGIN)
537
  ),
538
  array(
539
- 'file' => $file,
 
540
  'cType' => 'plugin',
541
  'canDiff' => true,
542
  'canFix' => true,
@@ -552,28 +535,28 @@ class wordfenceHash {
552
 
553
  }
554
  }
555
- else if (isset($this->knownFiles['themes'][$file])) {
556
- if (in_array($shac, $this->knownFiles['themes'][$file])) {
557
  $knownFile = 1;
558
  }
559
  else {
560
  if ($this->themesEnabled) {
561
  $options = $this->engine->scanController()->scanOptions();
562
  $shouldGenerateIssue = true;
563
- if (!$options['scansEnabled_highSense'] && preg_match('~/readme\.(?:txt|md)$~i', $file)) { //Don't generate issues for changed readme files unless high sensitivity is on
564
  $shouldGenerateIssue = false;
565
  }
566
 
567
  if ($shouldGenerateIssue) {
568
- $itemName = $this->knownFiles['themes'][$file][0];
569
- $itemVersion = $this->knownFiles['themes'][$file][1];
570
- $cKey = $this->knownFiles['themes'][$file][2];
571
  $this->engine->addPendingIssue(
572
  'knownfile',
573
  wfIssues::SEVERITY_MEDIUM,
574
- 'modifiedtheme' . $file,
575
- 'modifiedtheme' . $file . $md5,
576
- sprintf(/* translators: File path. */ __('Modified theme file: %s', 'wordfence'), $file),
577
  sprintf(
578
  /* translators: 1. Plugin name. 2. Plugin version. 3. Support URL. */
579
  __('This file belongs to theme "%1$s" version "%2$s" and has been modified from the original distribution. It is common for site owners to modify their theme files, so if you have modified this file yourself you can safely ignore this warning. <a href="%3$s" target="_blank" rel="noopener noreferrer">Learn More<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'),
@@ -582,7 +565,8 @@ class wordfenceHash {
582
  wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_MODIFIED_THEME)
583
  ),
584
  array(
585
- 'file' => $file,
 
586
  'cType' => 'theme',
587
  'canDiff' => true,
588
  'canFix' => true,
@@ -602,17 +586,18 @@ class wordfenceHash {
602
  $restrictedWordPressFolders = array(ABSPATH . 'wp-admin/', ABSPATH . WPINC . '/');
603
  $added = false;
604
  foreach ($restrictedWordPressFolders as $path) {
605
- if (strpos($realFile, $path) === 0) {
606
  if ($this->isPreviousCoreFile($shac)) {
607
  $added = $this->engine->addIssue(
608
  'knownfile',
609
  wfIssues::SEVERITY_LOW,
610
- 'coreUnknown' . $file,
611
- 'coreUnknown' . $file . $md5,
612
- sprintf(/* translators: File path. */ __('Old WordPress core file not removed during update: %s', 'wordfence'), $file),
613
  __('This file is in a WordPress core location but is from an older version of WordPress and not used with your current version. Hosting or permissions issues can cause these files to get left behind when WordPress is updated and they should be removed if possible.', 'wordfence'),
614
  array(
615
- 'file' => $file,
 
616
  'cType' => 'core',
617
  'canDiff' => false,
618
  'canFix' => false,
@@ -620,16 +605,17 @@ class wordfenceHash {
620
  )
621
  );
622
  }
623
- else if (preg_match('#/php\.ini$#', $file)) {
624
  $this->engine->addPendingIssue(
625
  'knownfile',
626
  wfIssues::SEVERITY_HIGH,
627
- 'coreUnknown' . $file,
628
- 'coreUnknown' . $file . $md5,
629
- sprintf(/* translators: File path. */ __('Unknown file in WordPress core: %s', 'wordfence'), $file),
630
  __('This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker.', 'wordfence'),
631
  array(
632
- 'file' => $file,
 
633
  'cType' => 'core',
634
  'canDiff' => false,
635
  'canFix' => false,
@@ -644,12 +630,13 @@ class wordfenceHash {
644
  $added = $this->engine->addIssue(
645
  'knownfile',
646
  wfIssues::SEVERITY_HIGH,
647
- 'coreUnknown' . $file,
648
- 'coreUnknown' . $file . $md5,
649
- sprintf(/* translators: File path. */ __('Unknown file in WordPress core: %s', 'wordfence'), $file),
650
  sprintf(/* translators: Support URL. */ __('This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker. <a href="%s" target="_blank" rel="noopener noreferrer">Learn More<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_UNKNOWN_FILE_CORE)),
651
  array(
652
- 'file' => $file,
 
653
  'cType' => 'core',
654
  'canDiff' => false,
655
  'canFix' => false,
@@ -668,10 +655,10 @@ class wordfenceHash {
668
  // we could split this into files whose path we recognize and file's whose path we recognize AND who have a valid sig.
669
  // But because we want to scan files whose sig we don't recognize, regardless of known path or not, we only need one "knownFile" field.
670
  $fileModsTable = wfDB::networkTable('wfFileMods');
671
- $this->db->queryWrite("INSERT INTO {$fileModsTable} (filename, filenameMD5, knownFile, oldMD5, newMD5, SHAC) VALUES ('%s', UNHEX(MD5('%s')), %d, '', UNHEX('%s'), UNHEX('%s')) ON DUPLICATE KEY UPDATE newMD5 = UNHEX('%s'), SHAC = UNHEX('%s'), knownFile = %d", $file, $file, $knownFile, $md5, $shac, $md5, $shac, $knownFile);
672
 
673
  $this->totalFiles++;
674
- $this->totalData += @filesize($realFile); //We already checked if file overflows int in the fileTooBig routine above
675
  if($this->totalFiles % 100 === 0){
676
  wordfence::status(2, 'info', sprintf(
677
  /* translators: 1. Number of files. 2. Data in bytes. */
@@ -681,7 +668,7 @@ class wordfenceHash {
681
  ));
682
  }
683
  } else {
684
- //wordfence::status(2, 'error', "Could not gen hash for file (probably because we don't have permission to access the file): $realFile");
685
  }
686
  wfUtils::endProcessingFile();
687
  }
@@ -787,13 +774,13 @@ class wordfenceHash {
787
  $shac = hash_final($sha256Context, false);
788
  return array($md5, $shac);
789
  }
790
- private function _shouldHashFile($fullPath) {
791
- $file = substr($fullPath, $this->striplen);
792
 
793
  //Core File, return true
794
- if ((isset($this->knownFiles['core']) && isset($this->knownFiles['core'][$file])) ||
795
- (isset($this->knownFiles['plugins']) && isset($this->knownFiles['plugins'][$file])) ||
796
- (isset($this->knownFiles['themes']) && isset($this->knownFiles['themes'][$file]))) {
797
  return true;
798
  }
799
 
@@ -801,7 +788,7 @@ class wordfenceHash {
801
  $excludePatterns = wordfenceScanner::getExcludeFilePattern(wordfenceScanner::EXCLUSION_PATTERNS_USER | wordfenceScanner::EXCLUSION_PATTERNS_MALWARE);
802
  if ($excludePatterns) {
803
  foreach ($excludePatterns as $pattern) {
804
- if (preg_match($pattern, $file)) {
805
  return false;
806
  }
807
  }
@@ -811,7 +798,7 @@ class wordfenceHash {
811
  if ($this->coreUnknownEnabled && !$this->alertedOnUnknownWordPressVersion) {
812
  $restrictedWordPressFolders = array(ABSPATH . 'wp-admin/', ABSPATH . WPINC . '/');
813
  foreach ($restrictedWordPressFolders as $path) {
814
- if (strpos($fullPath, $path) === 0) {
815
  return true;
816
  }
817
  }
@@ -819,19 +806,19 @@ class wordfenceHash {
819
 
820
  //Determine treatment
821
  $fileExt = '';
822
- if (preg_match('/\.([a-zA-Z\d\-]{1,7})$/', $file, $matches)) {
823
  $fileExt = strtolower($matches[1]);
824
  }
825
  $isPHP = false;
826
- if (preg_match('/\.(?:php(?:\d+)?|phtml)(\.|$)/i', $file)) {
827
  $isPHP = true;
828
  }
829
  $isHTML = false;
830
- if (preg_match('/\.(?:html?)(\.|$)/i', $file)) {
831
  $isHTML = true;
832
  }
833
  $isJS = false;
834
- if (preg_match('/\.(?:js|svg)(\.|$)/i', $file)) {
835
  $isJS = true;
836
  }
837
 
6
  private $startTime = false;
7
 
8
  //Begin serialized vars
 
9
  public $totalFiles = 0;
10
  public $totalDirs = 0;
11
  public $totalData = 0; //To do a sanity check, don't use 'du' because it gets sparse files wrong and reports blocks used on disk. Use : find . -type f -ls | awk '{total += $7} END {print total}'
21
  private $haveIssues = array();
22
  private $status = array();
23
  private $possibleMalware = array();
24
+ private $scannedFiles;
 
25
  private $totalForks = 0;
26
  private $alertedOnUnknownWordPressVersion = false;
27
  private $foldersEntered = array();
31
  private $indexSize = 0;
32
  private $currentIndex = 0;
33
  private $coalescingIssues = array();
34
+ private $pathMap = array();
35
 
36
  /**
 
37
  * @param string $path
38
  * @param array $only
39
  * @param array $themes
41
  * @param wfScanEngine $engine
42
  * @throws Exception
43
  */
44
+ public function __construct($scannedFiles, $themes, $plugins, $engine, $malwarePrefixesHash, $coreHashesHash, $scanMode) {
45
+ $this->scannedFiles = $scannedFiles;
 
 
46
  $this->engine = $engine;
47
 
48
  $this->startTime = microtime(true);
127
  wfIssues::statusEnd($coreHashesStatus, wfIssues::STATUS_SUCCESS);
128
  }
129
 
 
 
 
 
 
 
130
  $this->haveIssues = array(
131
  'core' => wfIssues::STATUS_SECURE,
132
  'coreUnknown' => wfIssues::STATUS_SECURE,
161
  }
162
  }
163
  public function __sleep(){
164
+ return array('totalFiles', 'totalDirs', 'totalData', 'stoppedOnFile', 'coreEnabled', 'pluginsEnabled', 'themesEnabled', 'malwareEnabled', 'coreUnknownEnabled', 'knownFiles', 'haveIssues', 'status', 'possibleMalware', 'scannedFiles', 'totalForks', 'alertedOnUnknownWordPressVersion', 'foldersProcessed', 'suspectedFiles', 'indexed', 'indexSize', 'currentIndex', 'foldersEntered', 'coalescingIssues', 'pathMap');
165
  }
166
  public function __wakeup(){
167
  $this->db = new wfDB();
183
  public function getSuspectedFiles() {
184
  return array_keys($this->suspectedFiles);
185
  }
186
+ public function run($engine) {
187
  if($this->totalForks > 1000){
188
  throw new Exception(sprintf(/* translators: File path. */ __("Wordfence file scanner detected a possible infinite loop. Exiting on file: %s", 'wordfence'), $this->stoppedOnFile));
189
  }
190
  $this->engine = $engine;
 
191
  if (!$this->indexed) {
192
  $start = microtime(true);
193
  $indexedFiles = array();
194
+ foreach ($this->scannedFiles as $file) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  $this->_dirIndex($file, $indexedFiles);
196
  }
197
  $this->_serviceIndexQueue($indexedFiles, true);
202
  wordfence::status(4, 'info', sprintf(/* translators: Time in seconds. */ __("Index time: %s", 'wordfence'), ($end - $start)));
203
  }
204
 
205
+ $this->_checkForTimeout();
206
 
207
  wordfence::status(4, 'info', __("Beginning file hashing", 'wordfence'));
208
  while ($file = $this->_nextFile()) {
233
  $added = $this->engine->addIssue(
234
  'file',
235
  wfIssues::SEVERITY_CRITICAL,
236
+ $file,
237
  $md5,
238
  sprintf(/* translators: File path. */ __('This file is suspected malware: %s', 'wordfence'), $file),
239
  sprintf(/* translators: Malware name/title. */ __("This file's signature matches a known malware file. The title of the malware is '%s'. Immediately inspect this file using the 'View' option below and consider deleting it from your server.", 'wordfence'), $name),
240
  array(
241
  'file' => $file,
242
+ 'realFile' => array_key_exists($file, $this->pathMap) ? $this->pathMap[$file] : null,
243
  'cType' => 'unknown',
244
  'canDiff' => false,
245
  'canFix' => false,
255
  if($this->malwareEnabled){ wfIssues::statusEnd($this->status['malware'], $this->haveIssues['malware']); $this->engine->scanController()->completeStage(wfScanner::STAGE_MALWARE_SCAN, $this->haveIssues['malware']); }
256
  unset($this->knownFiles); $this->knownFiles = false;
257
  }
258
+ private function _dirIndex($file, &$indexedFiles) {
259
+ $realPath = $file->getRealPath();
260
+ //Applies to files and dirs
261
+ if (!is_readable($realPath))
262
  return;
263
+ if (!$this->_shouldProcessFile($file))
264
+ return;
265
+ if (is_dir($realPath)) {
266
+ if ((!$this->stoppedOnFile || $this->stoppedOnFile != $file->getWordpressPath()) && isset($this->foldersEntered[$realPath])) { //Not resuming and already entered this path
 
 
267
  return;
268
  }
269
 
270
+ $this->foldersEntered[$file->getRealPath()] = 1;
271
 
272
  $this->totalDirs++;
273
+ foreach (wfFileUtils::getContents($realPath) as $child) {
274
+ if (wfFileUtils::isCurrentOrParentDirectory($child)) {
275
+ continue;
276
+ }
277
+ $child = $file->createChild($child);
278
+ if (is_file($child->getRealPath())) {
279
+ $relativeFile = $child->getWordpressPath();
 
 
280
  if ($this->stoppedOnFile && $relativeFile != $this->stoppedOnFile) {
281
  continue;
282
  }
286
  $this->suspectedFiles[$relativeFile] = 1;
287
  }
288
 
289
+ $this->_checkForTimeout($child, $indexedFiles);
290
+ if ($this->_shouldHashFile($child)) {
291
+ $indexedFiles[] = $child;
 
 
 
292
  }
293
  else {
294
+ wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Skipping unneeded hash: %s", 'wordfence'), (string) $child));
295
  }
296
  $this->_serviceIndexQueue($indexedFiles);
297
+ }
298
+ elseif (is_dir($child->getRealPath())) {
299
+ $this->_dirIndex($child, $indexedFiles);
300
  }
301
  }
302
 
304
  unset($this->foldersEntered[$realPath]);
305
  }
306
  else {
307
+ if (is_file($realPath)) {
308
+ $relativeFile = $file->getWordpressPath();
309
  if ($this->stoppedOnFile && $relativeFile != $this->stoppedOnFile) {
310
  return;
311
  }
315
  $this->suspectedFiles[$relativeFile] = 1;
316
  }
317
 
318
+ $this->_checkForTimeout($file, $indexedFiles);
319
+ if ($this->_shouldHashFile($file)) {
320
+ $indexedFiles[] = $file;
321
  }
322
  else {
323
+ wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Skipping unneeded hash: %s", 'wordfence'), (string) $file));
324
  }
325
  $this->_serviceIndexQueue($indexedFiles);
326
  }
327
  }
328
  }
329
  private function _serviceIndexQueue(&$indexedFiles, $final = false) {
330
+ $files = array();
331
  if (count($indexedFiles) > 500) {
332
+ $files = array_splice($indexedFiles, 0, 500);
333
  }
334
  else if ($final) {
335
+ $files = $indexedFiles;
336
  $indexedFiles = array();
337
  }
338
 
339
+ if (count($files) > 0) {
340
+ $payload = array();
341
+ foreach ($files as $file) {
342
+ $payload[] = (string) $file;
343
+ $payload[] = $file->getWordpressPath();
344
+ }
345
  global $wpdb;
346
  $table_wfKnownFileList = wfDB::networkTable('wfKnownFileList');
347
+ $query = substr("INSERT INTO {$table_wfKnownFileList} (path, wordpress_path) VALUES " . str_repeat("('%s', '%s'), ", count($files)), 0, -2);
348
  $wpdb->query($wpdb->prepare($query, $payload));
349
  $this->indexSize += count($payload);
350
  wordfence::status(2, 'info', sprintf(/* translators: Number of files. */ __("%d files indexed", 'wordfence'), $this->indexSize));
355
  if (count($files) == 0) {
356
  global $wpdb;
357
  $table_wfKnownFileList = wfDB::networkTable('wfKnownFileList');
358
+ $rows = $wpdb->get_results($wpdb->prepare("SELECT path, wordpress_path FROM {$table_wfKnownFileList} WHERE id > %d ORDER BY id ASC LIMIT 500", $this->currentIndex));
359
+ $files = array_map(
360
+ function ($row) {
361
+ return new wfScanFile($row->path, $row->wordpress_path);
362
+ },
363
+ $rows
364
+ );
365
  }
366
 
367
  $file = null;
376
  if ($file === null) {
377
  return null;
378
  }
379
+ return $file;
380
  }
381
+ private function _checkForTimeout($file = null, $indexQueue = false) {
382
+ $wordpressPath = $file ? $file->getWordpressPath() : null;
383
+ if (($this->stoppedOnFile !== $wordpressPath) && $this->engine->shouldFork()) { //max X seconds but don't allow fork if we're looking for the file we stopped on. Search mode is VERY fast.
384
  if ($indexQueue !== false) {
385
  $this->_serviceIndexQueue($indexQueue, true);
386
+ $this->stoppedOnFile = $wordpressPath;
387
+ wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Forking during indexing: %s", 'wordfence'), (string) $file));
388
  }
389
  else {
390
  wordfence::status(4, 'info', sprintf(/* translators: PHP max execution time. */ __("Calling fork() from wordfenceHash with maxExecTime: %s", 'wordfence'), $this->engine->maxExecTime));
393
  //exits
394
  }
395
 
396
+ if ($this->stoppedOnFile && $wordpressPath != $this->stoppedOnFile && $indexQueue !== false) {
397
  return;
398
  }
399
+ else if ($this->stoppedOnFile && $wordpressPath == $this->stoppedOnFile) {
400
  $this->stoppedOnFile = false; //Continue indexing
401
  }
402
  }
403
+ private function _shouldProcessFile($file) {
 
404
  $excludePatterns = wordfenceScanner::getExcludeFilePattern(wordfenceScanner::EXCLUSION_PATTERNS_USER);
405
  if ($excludePatterns) {
406
  foreach ($excludePatterns as $pattern) {
407
+ if (preg_match($pattern, $file->getWordpressPath())) {
408
  return false;
409
  }
410
  }
411
  }
412
 
413
+ $realPath = $file->getRealPath();
414
  if ($realPath === '/') {
415
  return false;
416
  }
420
 
421
  return true;
422
  }
423
+ private function processFile($file) {
424
+ $realPath = $file->getRealPath();
425
+ $wordpressPath = $file->getWordpressPath();
426
+ if (wfUtils::fileTooBig($realPath)) {
427
+ wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Skipping file larger than max size: %s", 'wordfence'), $realPath));
428
  return;
429
  }
430
 
431
  if (function_exists('memory_get_usage')) {
432
+ wordfence::status(4, 'info', sprintf(/* translators: 1. File path. 2. Memory in bytes. */ __('Scanning: %1$s (Mem:%2$s)', 'wordfence'), $realPath, sprintf('%.1fM', memory_get_usage(true) / (1024 * 1024))));
433
  }
434
  else {
435
+ wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Scanning: %s", 'wordfence'), $realPath));
436
  }
437
 
438
+ wfUtils::beginProcessingFile($wordpressPath);
439
+ $wfHash = self::hashFile($realPath);
440
  $this->engine->scanController()->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_FILES);
441
  if ($wfHash) {
442
  $md5 = strtoupper($wfHash[0]);
443
  $shac = strtoupper($wfHash[1]);
444
  $knownFile = 0;
445
  if($this->malwareEnabled && $this->isMalwarePrefix($md5)){
446
+ $this->possibleMalware[] = array($wordpressPath, $md5);
447
+ $this->pathMap[$wordpressPath] = $realPath;
448
  }
449
 
450
  $knownFileExclude = wordfenceScanner::getExcludeFilePattern(wordfenceScanner::EXCLUSION_PATTERNS_KNOWN_FILES);
451
  $allowKnownFileScan = true;
452
  if ($knownFileExclude) {
453
  foreach ($knownFileExclude as $pattern) {
454
+ if (preg_match($pattern, $realPath)) {
455
  $allowKnownFileScan = false;
456
  }
457
  }
458
  }
459
 
460
  if ($allowKnownFileScan) {
461
+ if (isset($this->knownFiles['core'][$wordpressPath])) {
462
+ if (strtoupper($this->knownFiles['core'][$wordpressPath]) == $shac) {
463
  $knownFile = 1;
464
  }
465
  else {
466
  if ($this->coreEnabled) {
467
+ $localFile = ABSPATH . '/' . preg_replace('/^[\.\/]+/', '', $wordpressPath);
468
  $fileContents = @file_get_contents($localFile);
469
  if ($fileContents && (!preg_match('/<\?' . 'php[\r\n\s\t]*\/\/[\r\n\s\t]*Silence is golden\.[\r\n\s\t]*(?:\?>)?[\r\n\s\t]*$/s', $fileContents))) {
470
  $this->engine->addPendingIssue(
471
  'knownfile',
472
  wfIssues::SEVERITY_HIGH,
473
+ 'coreModified' . $wordpressPath,
474
+ 'coreModified' . $wordpressPath . $md5,
475
+ sprintf(/* translators: File path. */ __('WordPress core file modified: %s', 'wordfence'), $wordpressPath),
476
  __("This WordPress core file has been modified and differs from the original file distributed with this version of WordPress.", 'wordfence'),
477
  array(
478
+ 'file' => $wordpressPath,
479
+ 'realFile' => $realPath,
480
  'cType' => 'core',
481
  'canDiff' => true,
482
  'canFix' => true,
488
  }
489
  }
490
  }
491
+ else if (isset($this->knownFiles['plugins'][$wordpressPath])) {
492
+ if (in_array($shac, $this->knownFiles['plugins'][$wordpressPath])) {
493
  $knownFile = 1;
494
  }
495
  else {
496
  if ($this->pluginsEnabled) {
497
  $options = $this->engine->scanController()->scanOptions();
498
  $shouldGenerateIssue = true;
499
+ if (!$options['scansEnabled_highSense'] && preg_match('~/readme\.(?:txt|md)$~i', $wordpressPath)) { //Don't generate issues for changed readme files unless high sensitivity is on
500
  $shouldGenerateIssue = false;
501
  }
502
 
503
  if ($shouldGenerateIssue) {
504
+ $itemName = $this->knownFiles['plugins'][$wordpressPath][0];
505
+ $itemVersion = $this->knownFiles['plugins'][$wordpressPath][1];
506
+ $cKey = $this->knownFiles['plugins'][$wordpressPath][2];
507
  $this->engine->addPendingIssue(
508
  'knownfile',
509
  wfIssues::SEVERITY_MEDIUM,
510
+ 'modifiedplugin' . $wordpressPath,
511
+ 'modifiedplugin' . $wordpressPath . $md5,
512
+ sprintf(/* translators: File path. */ __('Modified plugin file: %s', 'wordfence'), $wordpressPath),
513
  sprintf(
514
  /* translators: 1. Plugin name. 2. Plugin version. 3. Support URL. */
515
  __('This file belongs to plugin "%1$s" version "%2$s" and has been modified from the file that is distributed by WordPress.org for this version. Please use the link to see how the file has changed. If you have modified this file yourself, you can safely ignore this warning. If you see a lot of changed files in a plugin that have been made by the author, then try uninstalling and reinstalling the plugin to force an upgrade. Doing this is a workaround for plugin authors who don\'t manage their code correctly. <a href="%3$s" target="_blank" rel="noopener noreferrer">Learn More<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'),
518
  wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_MODIFIED_PLUGIN)
519
  ),
520
  array(
521
+ 'file' => $wordpressPath,
522
+ 'realFile' => $realPath,
523
  'cType' => 'plugin',
524
  'canDiff' => true,
525
  'canFix' => true,
535
 
536
  }
537
  }
538
+ else if (isset($this->knownFiles['themes'][$wordpressPath])) {
539
+ if (in_array($shac, $this->knownFiles['themes'][$wordpressPath])) {
540
  $knownFile = 1;
541
  }
542
  else {
543
  if ($this->themesEnabled) {
544
  $options = $this->engine->scanController()->scanOptions();
545
  $shouldGenerateIssue = true;
546
+ if (!$options['scansEnabled_highSense'] && preg_match('~/readme\.(?:txt|md)$~i', $wordpressPath)) { //Don't generate issues for changed readme files unless high sensitivity is on
547
  $shouldGenerateIssue = false;
548
  }
549
 
550
  if ($shouldGenerateIssue) {
551
+ $itemName = $this->knownFiles['themes'][$wordpressPath][0];
552
+ $itemVersion = $this->knownFiles['themes'][$wordpressPath][1];
553
+ $cKey = $this->knownFiles['themes'][$wordpressPath][2];
554
  $this->engine->addPendingIssue(
555
  'knownfile',
556
  wfIssues::SEVERITY_MEDIUM,
557
+ 'modifiedtheme' . $wordpressPath,
558
+ 'modifiedtheme' . $wordpressPath . $md5,
559
+ sprintf(/* translators: File path. */ __('Modified theme file: %s', 'wordfence'), $wordpressPath),
560
  sprintf(
561
  /* translators: 1. Plugin name. 2. Plugin version. 3. Support URL. */
562
  __('This file belongs to theme "%1$s" version "%2$s" and has been modified from the original distribution. It is common for site owners to modify their theme files, so if you have modified this file yourself you can safely ignore this warning. <a href="%3$s" target="_blank" rel="noopener noreferrer">Learn More<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'),
565
  wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_MODIFIED_THEME)
566
  ),
567
  array(
568
+ 'file' => $wordpressPath,
569
+ 'realFile' => $realPath,
570
  'cType' => 'theme',
571
  'canDiff' => true,
572
  'canFix' => true,
586
  $restrictedWordPressFolders = array(ABSPATH . 'wp-admin/', ABSPATH . WPINC . '/');
587
  $added = false;
588
  foreach ($restrictedWordPressFolders as $path) {
589
+ if (strpos($realPath, $path) === 0) {
590
  if ($this->isPreviousCoreFile($shac)) {
591
  $added = $this->engine->addIssue(
592
  'knownfile',
593
  wfIssues::SEVERITY_LOW,
594
+ 'coreUnknown' . $wordpressPath,
595
+ 'coreUnknown' . $wordpressPath . $md5,
596
+ sprintf(/* translators: File path. */ __('Old WordPress core file not removed during update: %s', 'wordfence'), $wordpressPath),
597
  __('This file is in a WordPress core location but is from an older version of WordPress and not used with your current version. Hosting or permissions issues can cause these files to get left behind when WordPress is updated and they should be removed if possible.', 'wordfence'),
598
  array(
599
+ 'file' => $wordpressPath,
600
+ 'realFile' => $realPath,
601
  'cType' => 'core',
602
  'canDiff' => false,
603
  'canFix' => false,
605
  )
606
  );
607
  }
608
+ else if (preg_match('#/php\.ini$#', $wordpressPath)) {
609
  $this->engine->addPendingIssue(
610
  'knownfile',
611
  wfIssues::SEVERITY_HIGH,
612
+ 'coreUnknown' . $wordpressPath,
613
+ 'coreUnknown' . $wordpressPath . $md5,
614
+ sprintf(/* translators: File path. */ __('Unknown file in WordPress core: %s', 'wordfence'), $wordpressPath),
615
  __('This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker.', 'wordfence'),
616
  array(
617
+ 'file' => $wordpressPath,
618
+ 'realFile' => $realPath,
619
  'cType' => 'core',
620
  'canDiff' => false,
621
  'canFix' => false,
630
  $added = $this->engine->addIssue(
631
  'knownfile',
632
  wfIssues::SEVERITY_HIGH,
633
+ 'coreUnknown' . $wordpressPath,
634
+ 'coreUnknown' . $wordpressPath . $md5,
635
+ sprintf(/* translators: File path. */ __('Unknown file in WordPress core: %s', 'wordfence'), $wordpressPath),
636
  sprintf(/* translators: Support URL. */ __('This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker. <a href="%s" target="_blank" rel="noopener noreferrer">Learn More<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_UNKNOWN_FILE_CORE)),
637
  array(
638
+ 'file' => $wordpressPath,
639
+ 'realFile' => $realPath,
640
  'cType' => 'core',
641
  'canDiff' => false,
642
  'canFix' => false,
655
  // we could split this into files whose path we recognize and file's whose path we recognize AND who have a valid sig.
656
  // But because we want to scan files whose sig we don't recognize, regardless of known path or not, we only need one "knownFile" field.
657
  $fileModsTable = wfDB::networkTable('wfFileMods');
658
+ $this->db->queryWrite("INSERT INTO {$fileModsTable} (filename, real_path, filenameMD5, knownFile, oldMD5, newMD5, SHAC) VALUES ('%s', '%s', UNHEX(MD5('%s')), %d, '', UNHEX('%s'), UNHEX('%s')) ON DUPLICATE KEY UPDATE newMD5 = UNHEX('%s'), SHAC = UNHEX('%s'), knownFile = %d", $wordpressPath, $realPath, $wordpressPath, $knownFile, $md5, $shac, $md5, $shac, $knownFile);
659
 
660
  $this->totalFiles++;
661
+ $this->totalData += @filesize($realPath); //We already checked if file overflows int in the fileTooBig routine above
662
  if($this->totalFiles % 100 === 0){
663
  wordfence::status(2, 'info', sprintf(
664
  /* translators: 1. Number of files. 2. Data in bytes. */
668
  ));
669
  }
670
  } else {
671
+ //wordfence::status(2, 'error', "Could not gen hash for file (probably because we don't have permission to access the file): $realPath");
672
  }
673
  wfUtils::endProcessingFile();
674
  }
774
  $shac = hash_final($sha256Context, false);
775
  return array($md5, $shac);
776
  }
777
+ private function _shouldHashFile($file) {
778
+ $wordpressPath = $file->getWordpressPath();
779
 
780
  //Core File, return true
781
+ if ((isset($this->knownFiles['core']) && isset($this->knownFiles['core'][$wordpressPath])) ||
782
+ (isset($this->knownFiles['plugins']) && isset($this->knownFiles['plugins'][$wordpressPath])) ||
783
+ (isset($this->knownFiles['themes']) && isset($this->knownFiles['themes'][$wordpressPath]))) {
784
  return true;
785
  }
786
 
788
  $excludePatterns = wordfenceScanner::getExcludeFilePattern(wordfenceScanner::EXCLUSION_PATTERNS_USER | wordfenceScanner::EXCLUSION_PATTERNS_MALWARE);
789
  if ($excludePatterns) {
790
  foreach ($excludePatterns as $pattern) {
791
+ if (preg_match($pattern, $wordpressPath)) {
792
  return false;
793
  }
794
  }
798
  if ($this->coreUnknownEnabled && !$this->alertedOnUnknownWordPressVersion) {
799
  $restrictedWordPressFolders = array(ABSPATH . 'wp-admin/', ABSPATH . WPINC . '/');
800
  foreach ($restrictedWordPressFolders as $path) {
801
+ if (strpos($file->getRealPath(), $path) === 0) {
802
  return true;
803
  }
804
  }
806
 
807
  //Determine treatment
808
  $fileExt = '';
809
+ if (preg_match('/\.([a-zA-Z\d\-]{1,7})$/', $wordpressPath, $matches)) {
810
  $fileExt = strtolower($matches[1]);
811
  }
812
  $isPHP = false;
813
+ if (preg_match('/\.(?:php(?:\d+)?|phtml)(\.|$)/i', $wordpressPath)) {
814
  $isPHP = true;
815
  }
816
  $isHTML = false;
817
+ if (preg_match('/\.(?:html?)(\.|$)/i', $wordpressPath)) {
818
  $isHTML = true;
819
  }
820
  $isJS = false;
821
+ if (preg_match('/\.(?:js|svg)(\.|$)/i', $wordpressPath)) {
822
  $isJS = true;
823
  }
824
 
lib/wordfenceScanner.php CHANGED
@@ -350,6 +350,7 @@ class wordfenceScanner {
350
  'longMsg' => __('This file appears to be an old version of the TimThumb script which makes your system vulnerable to attackers. Please upgrade the theme or plugin that uses this or remove it.', 'wordfence') . $extraMsg,
351
  'data' => array_merge(array(
352
  'file' => $file,
 
353
  'shac' => $record->SHAC,
354
  'highSense' => $options['scansEnabled_highSense'],
355
  'betaSigs' => wfConfig::get('betaThreatDefenseFeed'),
@@ -417,6 +418,7 @@ class wordfenceScanner {
417
  'longMsg' => $customMessage . ' ' . sprintf(__('The matched text in this file is: %s', 'wordfence'), '<strong style="color: #F00;" class="wf-split-word">' . wfUtils::potentialBinaryStringToHTML((wfUtils::strlen($matchString) > 200 ? wfUtils::substr($matchString, 0, 200) . '...' : $matchString)) . '</strong>') . ' ' . '<br><br>' . sprintf(/* translators: Scan result type. */ __('The issue type is: %s', 'wordfence'), '<strong>' . esc_html($rule[7]) . '</strong>') . '<br>' . sprintf(/* translators: Scan result description. */ __('Description: %s', 'wordfence'), '<strong>' . esc_html($rule[3]) . '</strong>') . $extraMsg,
418
  'data' => array_merge(array(
419
  'file' => $file,
 
420
  'shac' => $record->SHAC,
421
  'highSense' => $options['scansEnabled_highSense'],
422
  'betaSigs' => wfConfig::get('betaThreatDefenseFeed'),
@@ -458,6 +460,7 @@ class wordfenceScanner {
458
  'longMsg' => sprintf(/* translators: Malware signature matched text. */ __('This file is a PHP executable file and contains the word "eval" (without quotes) and the word "%s" (without quotes). The eval() function along with an encoding function like the one mentioned are commonly used by hackers to hide their code. If you know about this file you can choose to ignore it to exclude it from future scans. This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives.', 'wordfence'), '<span class="wf-split-word">' . esc_html($badStringFound) . '</span>'),
459
  'data' => array_merge(array(
460
  'file' => $file,
 
461
  'shac' => $record->SHAC,
462
  'highSense' => $options['scansEnabled_highSense'],
463
  'betaSigs' => wfConfig::get('betaThreatDefenseFeed'),
@@ -727,6 +730,7 @@ class wordfenceScanner {
727
  */
728
  class wordfenceMalwareScanFile {
729
  protected $_filename;
 
730
  protected $_filenameMD5;
731
  protected $_newMD5;
732
  protected $_shac;
@@ -749,22 +753,23 @@ class wordfenceMalwareScanFile {
749
 
750
  public static function files($limit = 500) {
751
  $db = self::getDB();
752
- $result = $db->querySelect("SELECT filename, filenameMD5, HEX(newMD5) AS newMD5, HEX(SHAC) AS SHAC, stoppedOnSignature, stoppedOnPosition, isSafeFile FROM " . wfDB::networkTable('wfFileMods') . " WHERE oldMD5 != newMD5 AND knownFile = 0 limit %d", $limit);
753
  $files = array();
754
  foreach ($result as $row) {
755
- $files[] = new wordfenceMalwareScanFile($row['filename'], $row['filenameMD5'], $row['newMD5'], $row['SHAC'], $row['stoppedOnSignature'], $row['stoppedOnPosition'], $row['isSafeFile']);
756
  }
757
  return $files;
758
  }
759
 
760
  public static function fileForPath($file) {
761
  $db = self::getDB();
762
- $row = $db->querySingleRec("SELECT filename, filenameMD5, HEX(newMD5) AS newMD5, HEX(SHAC) AS SHAC, stoppedOnSignature, stoppedOnPosition, isSafeFile FROM " . wfDB::networkTable('wfFileMods') . " WHERE filename = '%s'", $file);
763
- return new wordfenceMalwareScanFile($row['filename'], $row['filenameMD5'], $row['newMD5'], $row['SHAC'], $row['stoppedOnSignature'], $row['stoppedOnPosition'], $row['isSafeFile']);
764
  }
765
 
766
- public function __construct($filename, $filenameMD5, $newMD5, $shac, $stoppedOnSignature, $stoppedOnPosition, $isSafeFile) {
767
  $this->_filename = $filename;
 
768
  $this->_filenameMD5 = $filenameMD5;
769
  $this->_newMD5 = $newMD5;
770
  $this->_shac = strtoupper($shac);
@@ -777,6 +782,8 @@ class wordfenceMalwareScanFile {
777
  switch ($key) {
778
  case 'filename':
779
  return $this->_filename;
 
 
780
  case 'filenameMD5':
781
  return $this->_filenameMD5;
782
  case 'newMD5':
@@ -793,7 +800,7 @@ class wordfenceMalwareScanFile {
793
  }
794
 
795
  public function __toString() {
796
- return "Record [filename: {$this->filename}, filenameMD5: {$this->filenameMD5}, newMD5: {$this->newMD5}, stoppedOnSignature: {$this->stoppedOnSignature}, stoppedOnPosition: {$this->stoppedOnPosition}]";
797
  }
798
 
799
  public function markComplete() {
350
  'longMsg' => __('This file appears to be an old version of the TimThumb script which makes your system vulnerable to attackers. Please upgrade the theme or plugin that uses this or remove it.', 'wordfence') . $extraMsg,
351
  'data' => array_merge(array(
352
  'file' => $file,
353
+ 'realFile' => $record->realPath,
354
  'shac' => $record->SHAC,
355
  'highSense' => $options['scansEnabled_highSense'],
356
  'betaSigs' => wfConfig::get('betaThreatDefenseFeed'),
418
  'longMsg' => $customMessage . ' ' . sprintf(__('The matched text in this file is: %s', 'wordfence'), '<strong style="color: #F00;" class="wf-split-word">' . wfUtils::potentialBinaryStringToHTML((wfUtils::strlen($matchString) > 200 ? wfUtils::substr($matchString, 0, 200) . '...' : $matchString)) . '</strong>') . ' ' . '<br><br>' . sprintf(/* translators: Scan result type. */ __('The issue type is: %s', 'wordfence'), '<strong>' . esc_html($rule[7]) . '</strong>') . '<br>' . sprintf(/* translators: Scan result description. */ __('Description: %s', 'wordfence'), '<strong>' . esc_html($rule[3]) . '</strong>') . $extraMsg,
419
  'data' => array_merge(array(
420
  'file' => $file,
421
+ 'realFile' => $record->realPath,
422
  'shac' => $record->SHAC,
423
  'highSense' => $options['scansEnabled_highSense'],
424
  'betaSigs' => wfConfig::get('betaThreatDefenseFeed'),
460
  'longMsg' => sprintf(/* translators: Malware signature matched text. */ __('This file is a PHP executable file and contains the word "eval" (without quotes) and the word "%s" (without quotes). The eval() function along with an encoding function like the one mentioned are commonly used by hackers to hide their code. If you know about this file you can choose to ignore it to exclude it from future scans. This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives.', 'wordfence'), '<span class="wf-split-word">' . esc_html($badStringFound) . '</span>'),
461
  'data' => array_merge(array(
462
  'file' => $file,
463
+ 'realFile' => $record->realPath,
464
  'shac' => $record->SHAC,
465
  'highSense' => $options['scansEnabled_highSense'],
466
  'betaSigs' => wfConfig::get('betaThreatDefenseFeed'),
730
  */
731
  class wordfenceMalwareScanFile {
732
  protected $_filename;
733
+ protected $_realPath;
734
  protected $_filenameMD5;
735
  protected $_newMD5;
736
  protected $_shac;
753
 
754
  public static function files($limit = 500) {
755
  $db = self::getDB();
756
+ $result = $db->querySelect("SELECT filename, real_path, filenameMD5, HEX(newMD5) AS newMD5, HEX(SHAC) AS SHAC, stoppedOnSignature, stoppedOnPosition, isSafeFile FROM " . wfDB::networkTable('wfFileMods') . " WHERE oldMD5 != newMD5 AND knownFile = 0 limit %d", $limit);
757
  $files = array();
758
  foreach ($result as $row) {
759
+ $files[] = new wordfenceMalwareScanFile($row['filename'], $row['real_path'], $row['filenameMD5'], $row['newMD5'], $row['SHAC'], $row['stoppedOnSignature'], $row['stoppedOnPosition'], $row['isSafeFile']);
760
  }
761
  return $files;
762
  }
763
 
764
  public static function fileForPath($file) {
765
  $db = self::getDB();
766
+ $row = $db->querySingleRec("SELECT filename, real_path, filenameMD5, HEX(newMD5) AS newMD5, HEX(SHAC) AS SHAC, stoppedOnSignature, stoppedOnPosition, isSafeFile FROM " . wfDB::networkTable('wfFileMods') . " WHERE filename = '%s'", $file);
767
+ return new wordfenceMalwareScanFile($row['filename'], $row['real_path'], $row['filenameMD5'], $row['newMD5'], $row['SHAC'], $row['stoppedOnSignature'], $row['stoppedOnPosition'], $row['isSafeFile']);
768
  }
769
 
770
+ public function __construct($filename, $realPath, $filenameMD5, $newMD5, $shac, $stoppedOnSignature, $stoppedOnPosition, $isSafeFile) {
771
  $this->_filename = $filename;
772
+ $this->_realPath = $realPath;
773
  $this->_filenameMD5 = $filenameMD5;
774
  $this->_newMD5 = $newMD5;
775
  $this->_shac = strtoupper($shac);
782
  switch ($key) {
783
  case 'filename':
784
  return $this->_filename;
785
+ case 'realPath':
786
+ return $this->_realPath;
787
  case 'filenameMD5':
788
  return $this->_filenameMD5;
789
  case 'newMD5':
800
  }
801
 
802
  public function __toString() {
803
+ return "Record [filename: {$this->filename}, realPath: {$this->realPath}, filenameMD5: {$this->filenameMD5}, newMD5: {$this->newMD5}, stoppedOnSignature: {$this->stoppedOnSignature}, stoppedOnPosition: {$this->stoppedOnPosition}]";
804
  }
805
 
806
  public function markComplete() {
modules/login-security/css/{admin-global.1647958122.css → admin-global.1652811581.css} RENAMED
File without changes
modules/login-security/css/{admin.1647958122.css → admin.1652811581.css} RENAMED
File without changes
modules/login-security/css/{colorbox.1647958122.css → colorbox.1652811581.css} RENAMED
File without changes
modules/login-security/css/{font-awesome.1647958122.css → font-awesome.1652811581.css} RENAMED
File without changes
modules/login-security/css/{ionicons.1647958122.css → ionicons.1652811581.css} RENAMED
File without changes
modules/login-security/css/{jquery-ui.min.1647958122.css → jquery-ui.min.1652811581.css} RENAMED
File without changes
modules/login-security/css/{jquery-ui.structure.min.1647958122.css → jquery-ui.structure.min.1652811581.css} RENAMED
File without changes
modules/login-security/css/{jquery-ui.theme.min.1647958122.css → jquery-ui.theme.min.1652811581.css} RENAMED
File without changes
modules/login-security/css/{login.1647958122.css → login.1652811581.css} RENAMED
File without changes
modules/login-security/js/{admin-global.1647958122.js → admin-global.1652811581.js} RENAMED
File without changes
modules/login-security/js/{admin.1647958122.js → admin.1652811581.js} RENAMED
File without changes
modules/login-security/js/{jquery.colorbox.1647958122.js → jquery.colorbox.1652811581.js} RENAMED
File without changes
modules/login-security/js/{jquery.colorbox.min.1647958122.js → jquery.colorbox.min.1652811581.js} RENAMED
File without changes
modules/login-security/js/{jquery.qrcode.min.1647958122.js → jquery.qrcode.min.1652811581.js} RENAMED
File without changes
modules/login-security/js/{jquery.tmpl.min.1647958122.js → jquery.tmpl.min.1652811581.js} RENAMED
File without changes
modules/login-security/js/{login.1647958122.js → login.1652811581.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.9');
30
- define('WORDFENCE_LS_BUILD_NUMBER', '1647958122');
31
 
32
  define('WORDFENCE_LS_PLUGIN_BASENAME', plugin_basename(__FILE__));
33
 
27
  define('WORDFENCE_LS_FROM_CORE', ($wfCoreActive && isset($wfCoreLoading) && $wfCoreLoading));
28
 
29
  define('WORDFENCE_LS_VERSION', '1.0.9');
30
+ define('WORDFENCE_LS_BUILD_NUMBER', '1652811581');
31
 
32
  define('WORDFENCE_LS_PLUGIN_BASENAME', plugin_basename(__FILE__));
33
 
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: mmaunder, wfryan, wfmatt, wfmattr
3
  Tags: security, firewall, malware scanner, web application firewall, two factor authentication, block hackers, country blocking, clean hacked site, blocklist, waf, login security
4
  Requires at least: 3.9
5
  Requires PHP: 5.3
6
- Tested up to: 5.9
7
- Stable tag: 7.5.9
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -185,6 +185,17 @@ Secure your website with Wordfence.
185
 
186
  == Changelog ==
187
 
 
 
 
 
 
 
 
 
 
 
 
188
  = 7.5.9 - March 22, 2022 =
189
  * Improvement: Updated GeoIP database
190
  * Improvement: Removed blocking data update logic in order to reduce timeouts
3
  Tags: security, firewall, malware scanner, web application firewall, two factor authentication, block hackers, country blocking, clean hacked site, blocklist, waf, login security
4
  Requires at least: 3.9
5
  Requires PHP: 5.3
6
+ Tested up to: 6.0
7
+ Stable tag: 7.5.10
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
 
185
 
186
  == Changelog ==
187
 
188
+ = 7.5.10 - May 17, 2022 =
189
+ * Improvement: Improved scan support for sites with non-standard directory structures
190
+ * Improvement: Increased accuracy of executable PHP upload detection
191
+ * Improvement: Addressed various deprecation notices with PHP 8.1
192
+ * Improvement: Improved handling of invalidated license keys
193
+ * Fix: Corrected lost password redirect URL when used with WooCommerce
194
+ * Fix: Prevented errors when live traffic data exceeds database column length
195
+ * Fix: Prevented bulk password resets from locking out admins
196
+ * Fix: Corrected issue that prevented saving country blocking settings in certain cases
197
+ * Change: Updated copyright information
198
+
199
  = 7.5.9 - March 22, 2022 =
200
  * Improvement: Updated GeoIP database
201
  * Improvement: Removed blocking data update logic in order to reduce timeouts
vendor/wordfence/wf-waf/src/init.php CHANGED
@@ -19,6 +19,7 @@ require_once WFWAF_LIB_PATH . 'waf.php';
19
  require_once WFWAF_LIB_PATH . 'utils.php';
20
  require_once WFWAF_LIB_PATH . 'i18n.php';
21
  require_once WFWAF_LIB_PATH . 'xmlrpc.php';
 
22
 
23
  require_once WFWAF_LIB_PATH . 'storage.php';
24
  require_once WFWAF_LIB_PATH . 'storage/file.php';
@@ -33,4 +34,4 @@ require_once WFWAF_LIB_PATH . 'parser/sqli.php';
33
 
34
  require_once WFWAF_LIB_PATH . 'request.php';
35
  require_once WFWAF_LIB_PATH . 'http.php';
36
- require_once WFWAF_LIB_PATH . 'view.php';
19
  require_once WFWAF_LIB_PATH . 'utils.php';
20
  require_once WFWAF_LIB_PATH . 'i18n.php';
21
  require_once WFWAF_LIB_PATH . 'xmlrpc.php';
22
+ require_once WFWAF_LIB_PATH . 'shutdown.php';
23
 
24
  require_once WFWAF_LIB_PATH . 'storage.php';
25
  require_once WFWAF_LIB_PATH . 'storage/file.php';
34
 
35
  require_once WFWAF_LIB_PATH . 'request.php';
36
  require_once WFWAF_LIB_PATH . 'http.php';
37
+ require_once WFWAF_LIB_PATH . 'view.php';
vendor/wordfence/wf-waf/src/lib/rules.php CHANGED
@@ -452,6 +452,56 @@ class wfWAFRuleLogicalOperator implements wfWAFRuleInterface {
452
  }
453
  }
454
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
455
  class wfWAFRuleComparison implements wfWAFRuleInterface {
456
 
457
  private $matches;
@@ -893,186 +943,161 @@ class wfWAFRuleComparison implements wfWAFRuleInterface {
893
  if ($backtrackLimit !== false) { ini_set('pcre.backtrack_limit', $backtrackLimit); }
894
  return false;
895
  }
896
-
897
- public function fileHasPHP($subject) {
898
- $request = $this->getWAF()->getRequest();
899
- $files = $request->getFiles();
900
- if (!is_array($files)) {
901
  return false;
902
- }
903
-
904
- foreach ($files as $file) {
905
- if ($file['name'] == (string) $subject) {
906
- if (!is_file($file['tmp_name'])) {
907
- continue;
908
- }
909
- $fh = @fopen($file['tmp_name'], 'r');
910
- if (!$fh) {
911
- continue;
912
- }
913
-
914
- $totalRead = 0;
915
- $insideOpenTag = false;
916
- $hasExecutablePHP = false;
917
- $possiblyHasExecutablePHP = false;
918
- $hasOpenParen = false;
919
- $hasCloseParen = false;
920
- $backtickCount = 0;
921
- $wrappedTokenCheckBytes = '';
922
- $maxTokenSize = 15; //__halt_compiler
923
- $possibleWrappedTokens = array('<?php', '<?=', '<?', '?>', 'exit', 'new', 'clone', 'echo', 'print', 'require', 'include', 'require_once', 'include_once', '__halt_compiler');
924
-
925
- $readsize = 100 * 1024; //100k at a time
926
- while (!feof($fh)) {
927
- $data = fread($fh, $readsize);
928
- $actualReadsize = strlen($data);
929
- $totalRead += $actualReadsize;
930
- if ($totalRead < 1) {
931
  break;
932
  }
933
-
934
- //Make sure we didn't miss PHP split over a chunking boundary
935
- $wrappedCheckLength = strlen($wrappedTokenCheckBytes);
936
- if ($wrappedCheckLength > 0) {
937
- $testBytes = $wrappedTokenCheckBytes . substr($data, 0, min($maxTokenSize, $actualReadsize));
938
- foreach ($possibleWrappedTokens as $t) {
939
- $position = strpos($testBytes, $t);
940
- if ($position !== false && $position < $wrappedCheckLength && $position + strlen($t) >= $wrappedCheckLength) { //Found a token that starts before this segment of data and ends within it
941
- $data = substr($wrappedTokenCheckBytes, $position) . $data;
942
- break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
943
  }
944
- }
945
- }
946
-
947
- //Make sure it tokenizes correctly if chunked
948
- if ($insideOpenTag) {
949
- if ($possiblyHasExecutablePHP) {
950
- $data = '<?= ' . $data;
951
- }
952
- else {
953
- $data = '<?php ' . $data;
954
- }
955
- }
956
-
957
- //Tokenize the data and check for PHP
958
- $this->_resetErrors();
959
- $tokens = @token_get_all($data);
960
- $error = error_get_last();
961
- if ($error !== null && stripos($error['message'], 'Unexpected character in input') !== false) {
962
- break;
963
- }
964
-
965
- if ($error !== null && feof($fh) && stripos($error['message'], 'Unterminated comment') !== false) {
966
- break;
967
- }
968
-
969
- $offset = 0;
970
- foreach ($tokens as $token) {
971
- if (is_array($token)) {
972
- $offset += strlen($token[1]);
973
- switch ($token[0]) {
974
- case T_OPEN_TAG:
975
- $insideOpenTag = true;
976
- $hasOpenParen = false;
977
- $hasCloseParen = false;
978
- $backtickCount = 0;
979
- $possiblyHasExecutablePHP = false;
980
-
981
- if ($error !== null && stripos($error['message'], 'Unterminated comment') !== false) {
982
- $testOffset = $offset - strlen($token[1]);
983
- $commentStart = strpos($data, '/*', $testOffset);
984
- if ($commentStart !== false) {
985
- $testBytes = substr($data, $testOffset, $commentStart - $testOffset);
986
- $this->_resetErrors();
987
- @token_get_all($testBytes);
988
- $error = error_get_last();
989
- if ($error !== null && stripos($error['message'], 'Unexpected character in input') !== false) {
990
- break 3;
991
- }
992
- }
993
- }
994
-
995
- break;
996
-
997
- case T_OPEN_TAG_WITH_ECHO:
998
- $insideOpenTag = true;
999
- $hasOpenParen = false;
1000
- $hasCloseParen = false;
1001
- $backtickCount = 0;
1002
- $possiblyHasExecutablePHP = true;
1003
-
1004
- if ($error !== null && stripos($error['message'], 'Unterminated comment') !== false) {
1005
- $testOffset = $offset - strlen($token[1]);
1006
- $commentStart = strpos($data, '/*', $testOffset);
1007
- if ($commentStart !== false) {
1008
- $testBytes = substr($data, $testOffset, $commentStart - $testOffset);
1009
- $this->_resetErrors();
1010
- @token_get_all($testBytes);
1011
- $error = error_get_last();
1012
- if ($error !== null && stripos($error['message'], 'Unexpected character in input') !== false) {
1013
- break 3;
1014
- }
1015
- }
1016
- }
1017
-
1018
- break;
1019
-
1020
- case T_CLOSE_TAG:
1021
- $insideOpenTag = false;
1022
- if ($possiblyHasExecutablePHP) {
1023
- $hasExecutablePHP = true; //Assume the echo short tag outputted something useful
1024
- }
1025
- break 2;
1026
-
1027
- case T_NEW:
1028
- case T_CLONE:
1029
- case T_ECHO:
1030
- case T_PRINT:
1031
- case T_REQUIRE:
1032
- case T_INCLUDE:
1033
- case T_REQUIRE_ONCE:
1034
- case T_INCLUDE_ONCE:
1035
- case T_HALT_COMPILER:
1036
- case T_EXIT:
1037
- $hasExecutablePHP = true;
1038
- break 2;
1039
  }
1040
- }
1041
- else {
1042
- $offset += strlen($token);
1043
- switch ($token) {
1044
- case '(':
1045
- $hasOpenParen = true;
1046
- break;
1047
- case ')':
1048
- $hasCloseParen = true;
1049
- break;
1050
- case '`':
1051
- $backtickCount++;
1052
- break;
1053
  }
1054
- }
1055
- if (!$hasExecutablePHP && (($hasOpenParen && $hasCloseParen) || ($backtickCount > 1 && $backtickCount % 2 === 0))) {
1056
- $hasExecutablePHP = true;
1057
  break;
1058
- }
1059
  }
1060
-
1061
- if ($hasExecutablePHP) {
1062
- fclose($fh);
1063
- return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1064
  }
1065
-
1066
- $wrappedTokenCheckBytes = substr($data, - min($maxTokenSize, $actualReadsize));
1067
  }
1068
-
 
 
1069
  fclose($fh);
 
1070
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
1071
  }
1072
-
 
 
 
 
 
1073
  return false;
1074
  }
1075
-
1076
  private function _resetErrors() {
1077
  if (function_exists('error_clear_last')) {
1078
  error_clear_last();
452
  }
453
  }
454
 
455
+ class wfWAFPhpBlock {
456
+ public $echoTag;
457
+ public $shortTag;
458
+ public $openParentheses = 0, $closedParentheses = 0;
459
+ public $backtickCount = 0;
460
+ public $badCharacter = false;
461
+ public $mismatchedParentheses = false;
462
+
463
+ public function __construct($echoTag = false, $shortTag = false) {
464
+ $this->echoTag = $echoTag;
465
+ $this->shortTag = $shortTag;
466
+ }
467
+
468
+ public function hasParentheses() {
469
+ return $this->openParentheses > 0 && $this->closedParentheses === $this->openParentheses;
470
+ }
471
+
472
+ public function hasBacktickPair() {
473
+ return $this->backtickCount > 0 && $this->backtickCount % 2 === 0;
474
+ }
475
+
476
+ public function hasParenthesesOrBacktickPair() {
477
+ return $this->hasParentheses() || $this->hasBacktickPair();
478
+ }
479
+
480
+ public function hasMismatchedParentheses() {
481
+ return $this->mismatchedParentheses || $this->closedParentheses !== $this->openParentheses;
482
+ }
483
+
484
+ public function hasSyntaxError() {
485
+ if (version_compare(phpversion(), '8.0.0', '>=')) {
486
+ return $this->badCharacter;
487
+ }
488
+ return $this->hasMismatchedParentheses();
489
+ }
490
+
491
+ public static function isValid($phpBlock) {
492
+ return $phpBlock !== null && !$phpBlock->hasSyntaxError();
493
+ }
494
+
495
+ public static function extend($phpBlock, $echoTag = false, $shortTag = false) {
496
+ if ($phpBlock === null)
497
+ $phpBlock = new self();
498
+ $phpBlock->open = true;
499
+ $phpBlock->echoTag = $echoTag;
500
+ $phpBlock->shortTag = $shortTag;
501
+ return $phpBlock;
502
+ }
503
+ }
504
+
505
  class wfWAFRuleComparison implements wfWAFRuleInterface {
506
 
507
  private $matches;
943
  if ($backtrackLimit !== false) { ini_set('pcre.backtrack_limit', $backtrackLimit); }
944
  return false;
945
  }
946
+
947
+ private function checkForPhp($path) {
948
+ if (!is_file($path))
 
 
949
  return false;
950
+ $fh = @fopen($path, 'r');
951
+ if ($fh === false)
952
+ return false;
953
+ //T_BAD_CHARACTER is only available since PHP 7.4.0 and before 7.0.0
954
+ $T_BAD_CHARACTER = defined('T_BAD_CHARACTER') ? T_BAD_CHARACTER : 10001;
955
+ $phpBlock = null;
956
+ $wrappedTokenCheckBytes = '';
957
+ $maxTokenSize = 15; //__halt_compiler
958
+ $possibleWrappedTokens = array('<?php', '<?=', '<?', '?>', 'exit', 'new', 'clone', 'echo', 'print', 'require', 'include', 'require_once', 'include_once', '__halt_compiler');
959
+
960
+ $readsize = 1024 * 1024; //1MB chunks
961
+ $iteration = 0;
962
+ $shortOpenTagEnabled = (bool) ini_get('short_open_tag');
963
+ do {
964
+ $data = fread($fh, $readsize);
965
+ $actualReadsize = strlen($data);
966
+ if ($actualReadsize === 0)
967
+ break;
968
+
969
+ //Make sure we didn't miss PHP split over a chunking boundary
970
+ $wrappedCheckLength = strlen($wrappedTokenCheckBytes);
971
+ if ($wrappedCheckLength > 0) {
972
+ $testBytes = $wrappedTokenCheckBytes . substr($data, 0, min($maxTokenSize, $actualReadsize));
973
+ foreach ($possibleWrappedTokens as $t) {
974
+ $position = strpos($testBytes, $t);
975
+ if ($position !== false && $position < $wrappedCheckLength && $position + strlen($t) >= $wrappedCheckLength) { //Found a token that starts before this segment of data and ends within it
976
+ $data = substr($wrappedTokenCheckBytes, $position) . $data;
 
 
977
  break;
978
  }
979
+ }
980
+ }
981
+
982
+ $prepended = NULL;
983
+
984
+ //Make sure it tokenizes correctly if chunked
985
+ if ($phpBlock !== null) {
986
+ if ($phpBlock->echoTag) {
987
+ $data = '<?= ' . $data;
988
+ $prepended = T_OPEN_TAG_WITH_ECHO;
989
+ }
990
+ else {
991
+ $data = '<?php ' . $data;
992
+ $prepended = T_OPEN_TAG;
993
+ }
994
+ }
995
+
996
+ //Tokenize the data and check for PHP
997
+ $this->_resetErrors();
998
+ $tokens = @token_get_all($data);
999
+ $error = error_get_last();
1000
+
1001
+ if ($error !== null && feof($fh) && stripos($error['message'], 'Unterminated comment') !== false)
1002
+ break;
1003
+
1004
+ $firstToken = reset($tokens);
1005
+ if (is_array($firstToken) && $firstToken[0] === $prepended)
1006
+ array_shift($tokens); //Ignore the prepended token; it is only relevant for token_get_all
1007
+
1008
+ $offset = 0;
1009
+ foreach ($tokens as $token) {
1010
+ if (is_array($token)) {
1011
+ $offset += strlen($token[1]);
1012
+ switch ($token[0]) {
1013
+ case T_OPEN_TAG:
1014
+ $phpBlock = wfWAFPhpBlock::extend($phpBlock, false, $token[1] === '<?');
1015
+ break;
1016
+ case T_OPEN_TAG_WITH_ECHO:
1017
+ $phpBlock = wfWAFPhpBlock::extend($phpBlock, true);
1018
+ break;
1019
+ case T_CLOSE_TAG:
1020
+ if (wfWAFPhpBlock::isValid($phpBlock) && ($phpBlock->echoTag || $phpBlock->hasParenthesesOrBacktickPair())) {
1021
+ fclose($fh);
1022
+ return true;
1023
  }
1024
+ $phpBlock->open = false;
1025
+ break;
1026
+ case T_NEW:
1027
+ case T_CLONE:
1028
+ case T_ECHO:
1029
+ case T_PRINT:
1030
+ case T_REQUIRE:
1031
+ case T_INCLUDE:
1032
+ case T_REQUIRE_ONCE:
1033
+ case T_INCLUDE_ONCE:
1034
+ case T_HALT_COMPILER:
1035
+ case T_EXIT:
1036
+ if (wfWAFPhpBlock::isValid($phpBlock)) {
1037
+ fclose($fh);
1038
+ return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1039
  }
1040
+ break;
1041
+ case $T_BAD_CHARACTER:
1042
+ if ($phpBlock !== null)
1043
+ $phpBlock->badCharacter = true;
1044
+ break;
1045
+ case T_STRING:
1046
+ if (!$phpBlock->shortTag && preg_match('/^[A-z0-9_]{3,}$/', $token[1]) && function_exists($token[1])) {
1047
+ fclose($fh);
1048
+ return true;
 
 
 
 
1049
  }
 
 
 
1050
  break;
 
1051
  }
1052
+ }
1053
+ else {
1054
+ $offset += strlen($token);
1055
+ if ($phpBlock !== null) {
1056
+ switch ($token) {
1057
+ case '(':
1058
+ $phpBlock->openParentheses++;
1059
+ break;
1060
+ case ')':
1061
+ if ($phpBlock->openParentheses > $phpBlock->closedParentheses)
1062
+ $phpBlock->closedParentheses++;
1063
+ else
1064
+ $phpBlock->mismatchedParentheses = true;
1065
+ break;
1066
+ case '`':
1067
+ $phpBlock->backtickCount++;
1068
+ break;
1069
+ }
1070
  }
 
 
1071
  }
1072
+ }
1073
+
1074
+ if (wfWAFPhpBlock::isValid($phpBlock) && $phpBlock->hasParenthesesOrBacktickPair()) {
1075
  fclose($fh);
1076
+ return true;
1077
  }
1078
+
1079
+ $wrappedTokenCheckBytes = substr($data, - min($maxTokenSize, $actualReadsize));
1080
+ } while (!feof($fh));
1081
+
1082
+ fclose($fh);
1083
+ return false;
1084
+ }
1085
+
1086
+ public function fileHasPHP($subject) {
1087
+ $request = $this->getWAF()->getRequest();
1088
+ $files = $request->getFiles();
1089
+ if (!is_array($files)) {
1090
+ return false;
1091
  }
1092
+
1093
+ foreach ($files as $file) {
1094
+ if ($file['name'] === (string) $subject && $this->checkForPhp($file['tmp_name']))
1095
+ return true;
1096
+ }
1097
+
1098
  return false;
1099
  }
1100
+
1101
  private function _resetErrors() {
1102
  if (function_exists('error_clear_last')) {
1103
  error_clear_last();
vendor/wordfence/wf-waf/src/lib/shutdown.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class wfShutdownFunction {
4
+
5
+ private $callable;
6
+ private $priority;
7
+
8
+ public function __construct($callable, $priority) {
9
+ $this->callable = $callable;
10
+ $this->priority = $priority;
11
+ }
12
+
13
+ public function invoke() {
14
+ call_user_func($this->callable);
15
+ }
16
+
17
+ public function getPriority() {
18
+ return $this->priority;
19
+ }
20
+
21
+ public function __wakeup() {
22
+ $this->callable = function() {};
23
+ }
24
+
25
+ }
26
+
27
+ class wfShutdownRegistry {
28
+
29
+ private static $instance = null;
30
+
31
+ const PRIORITY_LAST = 100;
32
+
33
+ private $functions = array();
34
+ private $registered = false;
35
+
36
+ public function handleShutdown() {
37
+ usort($this->functions, function ($a, $b) {
38
+ return $a->getPriority() - $b->getPriority();
39
+ });
40
+ foreach ($this->functions as $function) {
41
+ $function->invoke();
42
+ }
43
+ }
44
+
45
+ public function register($function, $priority = 50) {
46
+ array_push($this->functions, new wfShutdownFunction($function, $priority));
47
+ $this->registerSelf();
48
+ }
49
+
50
+ private function registerSelf() {
51
+ if (!$this->registered) {
52
+ register_shutdown_function(array($this, 'handleShutdown'));
53
+ $this->registered = true;
54
+ }
55
+ }
56
+
57
+ public function __wakeup() {
58
+ $this->functions = array();
59
+ $this->registered = false;
60
+ }
61
+
62
+ public static function getDefaultInstance() {
63
+ if (self::$instance === null)
64
+ self::$instance = new self();
65
+ return self::$instance;
66
+ }
67
+
68
+ }
vendor/wordfence/wf-waf/src/lib/storage/mysql.php CHANGED
@@ -19,6 +19,7 @@ class wfWAFStorageMySQL implements wfWAFStorageInterface {
19
  private $dataChanged = false;
20
  private $data = array();
21
  private $dataToSave = array();
 
22
 
23
  public $installing = false;
24
 
@@ -26,9 +27,10 @@ class wfWAFStorageMySQL implements wfWAFStorageInterface {
26
  * @param wfWAFStorageEngineDatabase $engine
27
  * @param string $tablePrefix
28
  */
29
- public function __construct($engine, $tablePrefix = 'wp_') {
30
  $this->db = $engine;
31
  $this->tablePrefix = $tablePrefix;
 
32
  }
33
 
34
  public function usingLowercase() {
@@ -100,6 +102,8 @@ class wfWAFStorageMySQL implements wfWAFStorageInterface {
100
  $data = array();
101
  foreach ($results as $row) {
102
  $actionData = wfWAFUtils::json_decode($row['actionData'], true);
 
 
103
  $data[] = array(
104
  $row['attackLogTime'],
105
  $row['ctime'],
@@ -137,6 +141,8 @@ class wfWAFStorageMySQL implements wfWAFStorageInterface {
137
  $data = array();
138
  foreach ($results as $row) {
139
  $actionData = wfWAFUtils::json_decode($row['actionData'], true);
 
 
140
  $data[] = array(
141
  $row['attackLogTime'],
142
  $row['ctime'],
@@ -210,6 +216,16 @@ class wfWAFStorageMySQL implements wfWAFStorageInterface {
210
  }
211
  }
212
 
 
 
 
 
 
 
 
 
 
 
213
  $row = array(
214
  'attackLogTime' => microtime(true),
215
  'ctime' => $request->getTimestamp(),
@@ -222,20 +238,13 @@ class wfWAFStorageMySQL implements wfWAFStorageInterface {
222
  'referer' => $referer,
223
  'UA' => $ua,
224
  'action' => $action,
225
- 'actionData' => wfWAFUtils::json_encode(array(
226
- 'failedRules' => $failedRulesString,
227
- 'paramKey' => base64_encode($failedParamKey),
228
- 'paramValue' => base64_encode($failedParamValue),
229
- 'path' => base64_encode($request->getPath()),
230
- 'fullRequest' => base64_encode($request),
231
- 'requestMetadata' => $request->getMetadata(),
232
- )),
233
  );
234
 
235
  try {
236
  return $this->db->insert($table, $row);
237
  } catch (wfWAFStorageEngineMySQLiException $e) { // Let the firewall block the request without logging.
238
- error_log($e->getMessage());
239
  return false;
240
  }
241
  }
@@ -345,7 +354,7 @@ class wfWAFStorageMySQL implements wfWAFStorageInterface {
345
 
346
  if (!$this->dataChanged && $changedConfigValue) {
347
  $this->dataChanged = array($category, $key, true);
348
- register_shutdown_function(array($this, 'saveConfig'));
349
  }
350
  if ($changedConfigValue) {
351
  $this->dataToSave[$category][$key] = $value;
@@ -1130,4 +1139,4 @@ class wfWAFStorageEngineMySQLi implements wfWAFStorageEngineDatabase {
1130
 
1131
  class wfWAFStorageEngineMySQLiException extends wfWAFException {
1132
 
1133
- }
19
  private $dataChanged = false;
20
  private $data = array();
21
  private $dataToSave = array();
22
+ private $shutdownRegistry = null;
23
 
24
  public $installing = false;
25
 
27
  * @param wfWAFStorageEngineDatabase $engine
28
  * @param string $tablePrefix
29
  */
30
+ public function __construct($engine, $tablePrefix = 'wp_', $shutdownRegistry = null) {
31
  $this->db = $engine;
32
  $this->tablePrefix = $tablePrefix;
33
+ $this->shutdownRegistry = $shutdownRegistry;
34
  }
35
 
36
  public function usingLowercase() {
102
  $data = array();
103
  foreach ($results as $row) {
104
  $actionData = wfWAFUtils::json_decode($row['actionData'], true);
105
+ if (!is_array($actionData))
106
+ $actionData = array();
107
  $data[] = array(
108
  $row['attackLogTime'],
109
  $row['ctime'],
141
  $data = array();
142
  foreach ($results as $row) {
143
  $actionData = wfWAFUtils::json_decode($row['actionData'], true);
144
+ if (!is_array($actionData))
145
+ $actionData = array();
146
  $data[] = array(
147
  $row['attackLogTime'],
148
  $row['ctime'],
216
  }
217
  }
218
 
219
+ $attackData = array(
220
+ 'failedRules' => $failedRulesString,
221
+ 'paramKey' => base64_encode($failedParamKey),
222
+ 'paramValue' => base64_encode($failedParamValue),
223
+ 'path' => base64_encode($request->getPath()),
224
+ 'fullRequest' => base64_encode($request),
225
+ 'requestMetadata' => $request->getMetadata(),
226
+ );
227
+ $attackDataJson = wfWAFUtils::json_encode_limited($attackData, 65535, array('fullRequest', 'paramValue'));
228
+
229
  $row = array(
230
  'attackLogTime' => microtime(true),
231
  'ctime' => $request->getTimestamp(),
238
  'referer' => $referer,
239
  'UA' => $ua,
240
  'action' => $action,
241
+ 'actionData' => $attackDataJson
 
 
 
 
 
 
 
242
  );
243
 
244
  try {
245
  return $this->db->insert($table, $row);
246
  } catch (wfWAFStorageEngineMySQLiException $e) { // Let the firewall block the request without logging.
247
+ error_log('Failed to log attack data: ' . $e->getMessage());
248
  return false;
249
  }
250
  }
354
 
355
  if (!$this->dataChanged && $changedConfigValue) {
356
  $this->dataChanged = array($category, $key, true);
357
+ $this->shutdownRegistry->register(array($this, 'saveConfig'), wfShutdownRegistry::PRIORITY_LAST);
358
  }
359
  if ($changedConfigValue) {
360
  $this->dataToSave[$category][$key] = $value;
1139
 
1140
  class wfWAFStorageEngineMySQLiException extends wfWAFException {
1141
 
1142
+ }
vendor/wordfence/wf-waf/src/lib/utils.php CHANGED
@@ -184,6 +184,40 @@ class wfWAFUtils {
184
  return is_array($data) ? array_map('wfWAFUtils::_json_decode_object_helper', $data) : $data;
185
  }
186
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  /**
188
  * Compare two strings in constant time. It can leak the length of a string.
189
  *
@@ -1191,5 +1225,10 @@ class wfWAFUtils {
1191
  }
1192
  return true;
1193
  }
 
 
 
 
 
1194
  }
1195
- }
184
  return is_array($data) ? array_map('wfWAFUtils::_json_decode_object_helper', $data) : $data;
185
  }
186
 
187
+ public static function json_encode_limited($data, $limit, $truncatable) {
188
+ $json = self::json_encode($data);
189
+ $size = strlen($json);
190
+ if ($size > $limit) {
191
+ $json = null;
192
+ $minimalData = $data;
193
+ foreach ($minimalData as $key => &$value) {
194
+ if (in_array($key, $truncatable)) {
195
+ $value = '';
196
+ }
197
+ }
198
+ $minimumSize = strlen(self::json_encode($minimalData));
199
+ if ($minimumSize <= $limit) {
200
+ $excess = $size - $limit;
201
+ foreach ($truncatable as $field) {
202
+ if (!array_key_exists($field, $data))
203
+ continue;
204
+ $value = $data[$field];
205
+ if (is_string($value)) {
206
+ $originalLength = strlen($value);
207
+ $truncatedLength = max(0, $originalLength - $excess);
208
+ $excess -= ($originalLength - $truncatedLength);
209
+ $data[$field] = substr($value, 0, $truncatedLength);
210
+ }
211
+ if ($excess === 0) {
212
+ $json = self::json_encode($data);
213
+ break;
214
+ }
215
+ }
216
+ }
217
+ }
218
+ return $json;
219
+ }
220
+
221
  /**
222
  * Compare two strings in constant time. It can leak the length of a string.
223
  *
1225
  }
1226
  return true;
1227
  }
1228
+
1229
+ public static function isVersionBelow($target, $compared) {
1230
+ return $compared === null || version_compare($compared, $target, '<');
1231
+ }
1232
+
1233
  }
1234
+ }
vendor/wordfence/wf-waf/src/lib/waf.php CHANGED
@@ -435,7 +435,7 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
435
 
436
  protected function runMigrations() {
437
  $currentVersion = $this->getStorageEngine()->getConfig('version');
438
- if (!$currentVersion || version_compare($currentVersion, WFWAF_VERSION) === -1) {
439
  if (!$currentVersion) {
440
  $cron = array(
441
  new wfWAFCronFetchRulesEvent(time() +
@@ -455,13 +455,13 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
455
  $this->getStorageEngine()->setConfig('cron', $cron, 'livewaf');
456
  }
457
 
458
- if (version_compare($currentVersion, '1.0.2') === -1) {
459
  $event = new wfWAFCronFetchRulesEvent(time() - 2);
460
  $event->setWaf($this);
461
  $event->fire();
462
  }
463
 
464
- if (version_compare($currentVersion, '1.0.3') === -1) {
465
  $this->getStorageEngine()->purgeIPBlocks();
466
 
467
  $cron = (array) $this->getStorageEngine()->getConfig('cron', null, 'livewaf');
@@ -475,7 +475,7 @@ auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh
475
  $event->fire();
476
  }
477
 
478
- if (version_compare($currentVersion, '1.0.4') === -1) {
479
  $movedKeys = array(
480
  'whitelistedURLParams' => 'livewaf',
481
  'cron' => 'livewaf',
@@ -1442,7 +1442,10 @@ HTML
1442
  }
1443
 
1444
  public function fileList() {
1445
- $fileList = array($this->getCompiledRulesFile());
 
 
 
1446
  if (method_exists($this->getStorageEngine(), 'fileList')) {
1447
  $fileList = array_merge($fileList, $this->getStorageEngine()->fileList());
1448
  }
435
 
436
  protected function runMigrations() {
437
  $currentVersion = $this->getStorageEngine()->getConfig('version');
438
+ if (wfWAFUtils::isVersionBelow(WFWAF_VERSION, $currentVersion)) {
439
  if (!$currentVersion) {
440
  $cron = array(
441
  new wfWAFCronFetchRulesEvent(time() +
455
  $this->getStorageEngine()->setConfig('cron', $cron, 'livewaf');
456
  }
457
 
458
+ if (wfWAFUtils::isVersionBelow('1.0.2', $currentVersion)) {
459
  $event = new wfWAFCronFetchRulesEvent(time() - 2);
460
  $event->setWaf($this);
461
  $event->fire();
462
  }
463
 
464
+ if (wfWAFUtils::isVersionBelow('1.0.3', $currentVersion)) {
465
  $this->getStorageEngine()->purgeIPBlocks();
466
 
467
  $cron = (array) $this->getStorageEngine()->getConfig('cron', null, 'livewaf');
475
  $event->fire();
476
  }
477
 
478
+ if (wfWAFUtils::isVersionBelow('1.0.4', $currentVersion)) {
479
  $movedKeys = array(
480
  'whitelistedURLParams' => 'livewaf',
481
  'cron' => 'livewaf',
1442
  }
1443
 
1444
  public function fileList() {
1445
+ $fileList = array();
1446
+ $rulesFile = $this->getCompiledRulesFile();
1447
+ if ($rulesFile !== null)
1448
+ array_push($fileList, $rulesFile);
1449
  if (method_exists($this->getStorageEngine(), 'fileList')) {
1450
  $fileList = array_merge($fileList, $this->getStorageEngine()->fileList());
1451
  }
views/dashboard/options-group-license.php CHANGED
@@ -49,6 +49,9 @@ if (!isset($collapseable)) {
49
  else if (wfLicense::current()->isExpired()) {
50
  echo esc_html(sprintf(__('%s License Expired', 'wordfence'), wfLicense::current()->getTypeLabel(false)));
51
  }
 
 
 
52
  else {
53
  echo esc_html(sprintf(__('%s License Active', 'wordfence'), wfLicense::current()->getTypeLabel()));
54
  }
@@ -63,6 +66,9 @@ if (!isset($collapseable)) {
63
  <?php elseif (wfLicense::current()->isPaidAndCurrent()): ?>
64
  <a href="https://www.wordfence.com/gnl1optMngKys/licenses/" target="_blank" rel="noopener noreferrer" class=""><?php echo esc_html_e('Click here to manage your Wordfence licenses', 'wordfence'); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a>
65
  <?php else: ?>
 
 
 
66
  <a href="https://www.wordfence.com/gnl1optUpgrade/products/pricing/" target="_blank" rel="noopener noreferrer" class="wf-btn wf-btn-primary wf-btn-callout-subtle"><?php esc_html_e('Upgrade to Premium', 'wordfence'); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a>
67
  <?php endif ?>
68
  <a href="#" class="wf-btn wf-btn-primary wf-btn-callout-subtle" style="display: none;" id="wf-install-license" role="button"><?php esc_html_e('Install License', 'wordfence'); ?></a>
@@ -139,6 +145,11 @@ if (!isset($collapseable)) {
139
  })(jQuery);
140
  </script>
141
  </li>
 
 
 
 
 
142
  </ul>
143
  </li>
144
  </ul>
49
  else if (wfLicense::current()->isExpired()) {
50
  echo esc_html(sprintf(__('%s License Expired', 'wordfence'), wfLicense::current()->getTypeLabel(false)));
51
  }
52
+ else if (wfLicense::current()->getKeyType() === wfLicense::KEY_TYPE_PAID_DELETED) {
53
+ esc_html_e('Premium License Deactivated', 'wordfence');
54
+ }
55
  else {
56
  echo esc_html(sprintf(__('%s License Active', 'wordfence'), wfLicense::current()->getTypeLabel()));
57
  }
66
  <?php elseif (wfLicense::current()->isPaidAndCurrent()): ?>
67
  <a href="https://www.wordfence.com/gnl1optMngKys/licenses/" target="_blank" rel="noopener noreferrer" class=""><?php echo esc_html_e('Click here to manage your Wordfence licenses', 'wordfence'); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a>
68
  <?php else: ?>
69
+ <?php if (wfLicense::current()->getKeyType() === wfLicense::KEY_TYPE_PAID_DELETED): ?>
70
+ <a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-downgrade-license" role="button"><?php esc_html_e('Remove Invalid License', 'wordfence'); ?></a>&nbsp;&nbsp;
71
+ <?php endif ?>
72
  <a href="https://www.wordfence.com/gnl1optUpgrade/products/pricing/" target="_blank" rel="noopener noreferrer" class="wf-btn wf-btn-primary wf-btn-callout-subtle"><?php esc_html_e('Upgrade to Premium', 'wordfence'); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a>
73
  <?php endif ?>
74
  <a href="#" class="wf-btn wf-btn-primary wf-btn-callout-subtle" style="display: none;" id="wf-install-license" role="button"><?php esc_html_e('Install License', 'wordfence'); ?></a>
145
  })(jQuery);
146
  </script>
147
  </li>
148
+ <?php if (wfLicense::current()->getKeyType() === wfLicense::KEY_TYPE_PAID_DELETED): ?>
149
+ <li>
150
+ <p><?php echo wp_kses(__('This was a premium license key, but it is no longer valid, so premium features are disabled. You can either remove the invalid key and continue using Wordfence\'s free features, or enter a new premium key to upgrade. If you have questions, contact <a href="mailto:billing@wordfence.com">billing@wordfence.com</a>.', 'wordfence'), array('a' => array('href' => array()))) ?></p>
151
+ </li>
152
+ <?php endif ?>
153
  </ul>
154
  </li>
155
  </ul>
views/scanner/issue-configReadable.php CHANGED
@@ -14,7 +14,7 @@ echo wfView::create('scanner/issue-base', array(
14
  __('Details', 'wordfence') => '{{html longMsg}}'
15
  ),
16
  'detailControls' => array(
17
- '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data.file)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
18
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-delete-file" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
19
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-mark-fixed" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
20
  ),
14
  __('Details', 'wordfence') => '{{html longMsg}}'
15
  ),
16
  'detailControls' => array(
17
+ '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
18
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-delete-file" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
19
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-mark-fixed" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
20
  ),
views/scanner/issue-coreUnknown.php CHANGED
@@ -10,7 +10,7 @@ echo wfView::create('scanner/issue-base', array(
10
  'summaryControls' => array(wfView::create('scanner/issue-control-ignore', array('ignoreP' => __('Always Ignore Version', 'wordfence'), 'ignoreC' => __('Ignore Until Version Changes', 'wordfence'))), wfView::create('scanner/issue-control-show-details')),
11
  'detailPairs' => array(__('Details', 'wordfence') => '{{html longMsg}}'),
12
  'detailControls' => array(
13
- '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data.file)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
14
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-delete-file" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
15
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-mark-fixed" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
16
  ),
10
  'summaryControls' => array(wfView::create('scanner/issue-control-ignore', array('ignoreP' => __('Always Ignore Version', 'wordfence'), 'ignoreC' => __('Ignore Until Version Changes', 'wordfence'))), wfView::create('scanner/issue-control-show-details')),
11
  'detailPairs' => array(__('Details', 'wordfence') => '{{html longMsg}}'),
12
  'detailControls' => array(
13
+ '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
14
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-delete-file" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
15
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-mark-fixed" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
16
  ),
views/scanner/issue-file.php CHANGED
@@ -16,7 +16,7 @@ echo wfView::create('scanner/issue-base', array(
16
  __('Details', 'wordfence') => '{{html longMsg}}<br><br>{{if data.wpconfig}}<strong>' . esc_html__('This is your main configuration file and cannot be deleted. It must be cleaned manually.', 'wordfence') . '</strong>{{/if}}',
17
  ),
18
  'detailControls' => array(
19
- '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data.file)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
20
  '{{if data.canDiff}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeDiffLink(data)}">' . __('View Differences', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
21
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-delete-file" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
22
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-mark-fixed" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
16
  __('Details', 'wordfence') => '{{html longMsg}}<br><br>{{if data.wpconfig}}<strong>' . esc_html__('This is your main configuration file and cannot be deleted. It must be cleaned manually.', 'wordfence') . '</strong>{{/if}}',
17
  ),
18
  'detailControls' => array(
19
+ '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
20
  '{{if data.canDiff}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeDiffLink(data)}">' . __('View Differences', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
21
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-delete-file" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
22
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-mark-fixed" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
views/scanner/issue-knownfile.php CHANGED
@@ -16,7 +16,7 @@ echo wfView::create('scanner/issue-base', array(
16
  __('Details', 'wordfence') => '{{html longMsg}}',
17
  ),
18
  'detailControls' => array(
19
- '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data.file)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
20
  '{{if data.canDiff}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeDiffLink(data)}">' . __('View Differences', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
21
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-delete-file" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
22
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-mark-fixed" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
16
  __('Details', 'wordfence') => '{{html longMsg}}',
17
  ),
18
  'detailControls' => array(
19
+ '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
20
  '{{if data.canDiff}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeDiffLink(data)}">' . __('View Differences', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
21
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-delete-file" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
22
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-mark-fixed" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
views/scanner/issue-publiclyAccessible.php CHANGED
@@ -14,7 +14,7 @@ echo wfView::create('scanner/issue-base', array(
14
  __('Details', 'wordfence') => '{{html longMsg}}'
15
  ),
16
  'detailControls' => array(
17
- '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data.file)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
18
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-delete-file" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
19
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-mark-fixed" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
20
  ),
14
  __('Details', 'wordfence') => '{{html longMsg}}'
15
  ),
16
  'detailControls' => array(
17
+ '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
18
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-delete-file" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
19
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-issue-control-mark-fixed" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
20
  ),
views/scanner/issue-wpscan_directoryList.php CHANGED
@@ -14,7 +14,7 @@ echo wfView::create('scanner/issue-base', array(
14
  __('Details', 'wordfence') => '{{html longMsg}}'
15
  ),
16
  'detailControls' => array(
17
- '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data.file)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
18
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle" onclick="WFAD.deleteFile(\'${id}\'); return false;" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
19
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle" onclick="WFAD.updateIssueStatus(\'${id}\', \'delete\'); return false;" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
20
  ),
14
  __('Details', 'wordfence') => '{{html longMsg}}'
15
  ),
16
  'detailControls' => array(
17
+ '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
18
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle" onclick="WFAD.deleteFile(\'${id}\'); return false;" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
19
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle" onclick="WFAD.updateIssueStatus(\'${id}\', \'delete\'); return false;" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
20
  ),
views/scanner/issue-wpscan_fullPathDiscl.php CHANGED
@@ -14,7 +14,7 @@ echo wfView::create('scanner/issue-base', array(
14
  __('Details', 'wordfence') => '{{html longMsg}}'
15
  ),
16
  'detailControls' => array(
17
- '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data.file)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
18
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle" onclick="WFAD.deleteFile(\'${id}\'); return false;" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
19
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle" onclick="WFAD.updateIssueStatus(\'${id}\', \'delete\'); return false;" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
20
  ),
14
  __('Details', 'wordfence') => '{{html longMsg}}'
15
  ),
16
  'detailControls' => array(
17
+ '{{if data.fileExists}}<a target="_blank" class="wf-btn wf-btn-default wf-btn-callout-subtle" rel="noopener noreferrer" href="${WFAD.makeViewFileLink(data)}">' . __('View File', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>{{/if}}',
18
  '{{if data.canDelete}}<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle" onclick="WFAD.deleteFile(\'${id}\'); return false;" role="button">' . __('Delete File', 'wordfence') . '</a>{{/if}}',
19
  '<a href="#" class="wf-btn wf-btn-default wf-btn-callout-subtle" onclick="WFAD.updateIssueStatus(\'${id}\', \'delete\'); return false;" role="button">' . __('Mark as Fixed', 'wordfence') . '</a>',
20
  ),
waf/bootstrap.php CHANGED
@@ -122,7 +122,8 @@ class wfWAFWordPressRequest extends wfWAFRequest {
122
  continue; //This was an array so we can skip to the next item
123
  }
124
  $skipToNext = false;
125
- $trustedProxies = explode("\n", wfWAF::getInstance()->getStorageEngine()->getConfig('howGetIPs_trusted_proxies', '', 'synced'));
 
126
  foreach (array(',', ' ', "\t") as $char) {
127
  if (strpos($item, $char) !== false) {
128
  $sp = explode($char, $item);
@@ -882,7 +883,7 @@ try {
882
  }
883
 
884
  if (!empty($wfWAFDBCredentials)) {
885
- $wfWAFStorageEngine = new wfWAFWordPressStorageMySQL(new wfWAFStorageEngineMySQLi(), $wfWAFDBCredentials['tablePrefix']);
886
  $wfWAFStorageEngine->getDb()->connect(
887
  $wfWAFDBCredentials['user'],
888
  $wfWAFDBCredentials['pass'],
122
  continue; //This was an array so we can skip to the next item
123
  }
124
  $skipToNext = false;
125
+ $trustedProxyConfig = wfWAF::getInstance()->getStorageEngine()->getConfig('howGetIPs_trusted_proxies', null, 'synced');
126
+ $trustedProxies = $trustedProxyConfig === null ? array() : explode("\n", $trustedProxyConfig);
127
  foreach (array(',', ' ', "\t") as $char) {
128
  if (strpos($item, $char) !== false) {
129
  $sp = explode($char, $item);
883
  }
884
 
885
  if (!empty($wfWAFDBCredentials)) {
886
+ $wfWAFStorageEngine = new wfWAFWordPressStorageMySQL(new wfWAFStorageEngineMySQLi(), $wfWAFDBCredentials['tablePrefix'], wfShutdownRegistry::getDefaultInstance());
887
  $wfWAFStorageEngine->getDb()->connect(
888
  $wfWAFDBCredentials['user'],
889
  $wfWAFDBCredentials['pass'],
waf/wfWAFIPBlocksController.php CHANGED
@@ -1,6 +1,8 @@
1
  <?php
2
  if (!defined('WFWAF_RUN_COMPLETE')) {
3
 
 
 
4
  class wfWAFIPBlocksController
5
  {
6
  const WFWAF_BLOCK_UAREFIPRANGE = 'UA/Referrer/IP Range not allowed';
@@ -41,7 +43,7 @@ class wfWAFIPBlocksController
41
  static $willSynchronize = false;
42
  if (!$willSynchronize) {
43
  $willSynchronize = true;
44
- register_shutdown_function('wfWAFIPBlocksController::synchronizeConfigSettings');
45
  }
46
  }
47
 
@@ -526,4 +528,4 @@ class wfWAFIPBlocksController
526
  return false;
527
  }
528
  }
529
- }
1
  <?php
2
  if (!defined('WFWAF_RUN_COMPLETE')) {
3
 
4
+ require_once __DIR__ . '/../vendor/wordfence/wf-waf/src/lib/shutdown.php';
5
+
6
  class wfWAFIPBlocksController
7
  {
8
  const WFWAF_BLOCK_UAREFIPRANGE = 'UA/Referrer/IP Range not allowed';
43
  static $willSynchronize = false;
44
  if (!$willSynchronize) {
45
  $willSynchronize = true;
46
+ wfShutdownRegistry::getDefaultInstance()->register('wfWAFIPBlocksController::synchronizeConfigSettings');
47
  }
48
  }
49
 
528
  return false;
529
  }
530
  }
531
+ }
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.9
8
  Author URI: http://www.wordfence.com/
9
  Text Domain: wordfence
10
  Domain Path: /languages
@@ -14,7 +14,7 @@ Requires PHP: 5.3
14
  License: GPLv3
15
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
16
 
17
- @copyright Copyright (C) 2022 Defiant Inc.
18
  @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3 or higher
19
 
20
  This program is free software: you can redistribute it and/or modify
@@ -38,8 +38,8 @@ if(defined('WP_INSTALLING') && WP_INSTALLING){
38
  if (!defined('ABSPATH')) {
39
  exit;
40
  }
41
- define('WORDFENCE_VERSION', '7.5.9');
42
- define('WORDFENCE_BUILD_NUMBER', '1647958122');
43
  define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
44
  basename(dirname(__FILE__)) . '/' . basename(__FILE__));
45
 
4
  Plugin URI: http://www.wordfence.com/
5
  Description: Wordfence Security - Anti-virus, Firewall and Malware Scan
6
  Author: Wordfence
7
+ Version: 7.5.10
8
  Author URI: http://www.wordfence.com/
9
  Text Domain: wordfence
10
  Domain Path: /languages
14
  License: GPLv3
15
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
16
 
17
+ @copyright Copyright (C) 2012-2022 Defiant Inc.
18
  @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3 or higher
19
 
20
  This program is free software: you can redistribute it and/or modify
38
  if (!defined('ABSPATH')) {
39
  exit;
40
  }
41
+ define('WORDFENCE_VERSION', '7.5.10');
42
+ define('WORDFENCE_BUILD_NUMBER', '1652811581');
43
  define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
44
  basename(dirname(__FILE__)) . '/' . basename(__FILE__));
45