Shield Security for WordPress - Version 8.2.0

Version Description

  • Current Release = Released: 1st October, 2019 - Release Notes

  • (v.0) IMPROVED: [PRO] Malware scanner now uses network intelligence to the gather information on malware results.

  • (v.0) NEW: Traffic Watcher feature is now free for all users (no longer Pro-only).

  • (v.0) IMPROVED: Scanning cron is improved and more efficient.

  • (v.0) ADDED: Bulk Delete/Repair/Ignore actions now available for Malware scan results.

  • (v.0) IMPROVED: Malware scan results now provide details of affected line numbers and patterns discovered.

  • (v.0) IMPROVED: Malware scanner only scans wp-admin, wp-includes, wp-content folders, and files in top-level directory.

  • (v.0) IMPROVED: Malware scanner now excludes wp-content/cache/ directory.

  • (v.0) IMPROVED: Malware scanner performance improved with caching.

  • (v.0) IMPROVED: Malware auto-repair now works more consistently.

  • (v.0) IMPROVED: Updated default firewall whitelist rules.

  • (v.0) IMPROVED: If the PWNED Passwords API request fails entirely, the password check is skipped.

  • (v.0) ADDED: Japanese translations are at 100%.

  • (v.0) IMPROVED: Dutch translations are greatly improved (a huge thank you to Fred!).

  • (v.0) FIXED: Audit Trail correctly logs multiple occurrences for the same type of event on the same page request.

  • (v.0) FIXED: Audit Trail now correctly logs Google reCAPTCHA failure events.

  • (v.0) FIXED: PHP error when firewall was set to kill response without a user message.

Download this release

Release Info

Developer paultgoodchild
Plugin Icon 128x128 Shield Security for WordPress
Version 8.2.0
Comparing to
See all releases

Code changes from version 8.1.1 to 8.2.0

Files changed (154) hide show
  1. icwp-wpsf.php +1 -1
  2. languages/wp-simple-firewall-en_GB.mo +0 -0
  3. languages/wp-simple-firewall-en_GB.po +967 -781
  4. languages/wp-simple-firewall-ja.mo +0 -0
  5. languages/wp-simple-firewall-nl_NL.mo +0 -0
  6. plugin-spec.php +3 -3
  7. readme.txt +23 -3
  8. src/common/icwp-serviceproviders.php +13 -6
  9. src/config/feature-audit_trail.php +27 -13
  10. src/config/feature-autoupdates.php +1 -1
  11. src/config/feature-events.php +3 -0
  12. src/config/feature-firewall.php +1 -0
  13. src/config/feature-hack_protect.php +68 -6
  14. src/config/feature-ips.php +3 -0
  15. src/config/feature-plugin.php +5 -7
  16. src/config/feature-sessions.php +3 -0
  17. src/config/feature-statistics.php +0 -86
  18. src/config/feature-traffic.php +4 -1
  19. src/features/admin_access_restriction.php +1 -0
  20. src/features/audit_trail.php +30 -12
  21. src/features/base.php +133 -61
  22. src/features/base_wpsf.php +20 -42
  23. src/features/events.php +21 -4
  24. src/features/hack_protect.php +83 -117
  25. src/features/insights.php +15 -15
  26. src/features/ips.php +20 -22
  27. src/features/lockdown.php +0 -20
  28. src/features/login_protect.php +9 -7
  29. src/features/plugin.php +3 -79
  30. src/features/sessions.php +21 -3
  31. src/features/statistics.php +4 -97
  32. src/features/traffic.php +29 -21
  33. src/features/user_management.php +2 -2
  34. src/lib/src/Controller/Controller.php +8 -2
  35. src/lib/src/Databases/AdminNotes/Handler.php +2 -2
  36. src/lib/src/Databases/AuditTrail/Handler.php +3 -3
  37. src/lib/src/Databases/Base/Handler.php +8 -8
  38. src/lib/src/Databases/ChangeTracking/Handler.php +2 -2
  39. src/lib/src/Databases/Comments/Handler.php +3 -3
  40. src/lib/src/Databases/Events/Handler.php +2 -2
  41. src/lib/src/Databases/GeoIp/Handler.php +3 -3
  42. src/lib/src/Databases/IPs/Handler.php +2 -2
  43. src/lib/src/Databases/ScanQueue/Handler.php +2 -2
  44. src/lib/src/Databases/Scanner/Handler.php +2 -2
  45. src/lib/src/Databases/Session/Handler.php +2 -2
  46. src/lib/src/Databases/Tally/Handler.php +2 -2
  47. src/lib/src/Databases/Traffic/Handler.php +3 -3
  48. src/lib/src/Modules/AuditTrail/AjaxHandler.php +2 -2
  49. src/lib/src/Modules/Base/AdminNotices.php +2 -2
  50. src/lib/src/Modules/Base/BaseModCon.php +74 -31
  51. src/lib/src/Modules/Base/Options.php +6 -11
  52. src/lib/src/Modules/Base/Strings.php +23 -3
  53. src/lib/src/Modules/BaseShield/ShieldProcessor.php +1 -1
  54. src/lib/src/Modules/Events/AjaxHandler.php +1 -3
  55. src/lib/src/Modules/HackGuard/AjaxHandler.php +2 -1
  56. src/lib/src/Modules/HackGuard/Options.php +49 -0
  57. src/lib/src/Modules/HackGuard/Scan/Queue/Build/QueueBuilder.php +4 -4
  58. src/lib/src/Modules/HackGuard/Scan/Queue/CompleteQueue.php +1 -2
  59. src/lib/src/Modules/HackGuard/Scan/Queue/Controller.php +2 -2
  60. src/lib/src/Modules/HackGuard/Scan/Queue/QueueProcessor.php +3 -2
  61. src/lib/src/Modules/HackGuard/Scan/Queue/ScanInitiate.php +1 -2
  62. src/lib/src/Modules/HackGuard/Strings.php +18 -1
  63. src/lib/src/Modules/IPs/AjaxHandler.php +9 -6
  64. src/lib/src/Modules/IPs/BotTrack/Base.php +6 -5
  65. src/lib/src/Modules/IPs/Components/UnblockIpByFlag.php +1 -1
  66. src/lib/src/Modules/IPs/Options.php +0 -1
  67. src/lib/src/Modules/Insights/Strings.php +4 -1
  68. src/lib/src/Modules/LoginGuard/Lib/CooldownFlagFile.php +59 -0
  69. src/lib/src/Modules/LoginGuard/Lib/CooldownRedirect.php +62 -0
  70. src/lib/src/Modules/LoginGuard/Options.php +18 -0
  71. src/lib/src/Modules/Plugin/AdminNotices.php +4 -4
  72. src/lib/src/Modules/Plugin/AjaxHandler.php +3 -1
  73. src/lib/src/Modules/Plugin/Options.php +9 -0
  74. src/lib/src/Modules/Plugin/Strings.php +9 -0
  75. src/lib/src/Modules/Traffic/AjaxHandler.php +1 -1
  76. src/lib/src/Modules/Traffic/Limiter/TestIp.php +1 -1
  77. src/lib/src/Scans/Apc/ResultItem.php +0 -1
  78. src/lib/src/Scans/Base/BaseRepair.php +21 -0
  79. src/lib/src/Scans/Base/Files/BaseFileScanner.php +2 -1
  80. src/lib/src/Scans/Base/Files/BaseScanFromFileMap.php +4 -2
  81. src/lib/src/Scans/Mal/BuildFileMap.php +22 -15
  82. src/lib/src/Scans/Mal/BuildScanAction.php +1 -4
  83. src/lib/src/Scans/Mal/FileScanner.php +61 -39
  84. src/lib/src/Scans/Mal/Repair.php +41 -10
  85. src/lib/src/Scans/Mal/ResultItem.php +1 -2
  86. src/lib/src/Scans/Mal/Scan.php +38 -1
  87. src/lib/src/Scans/Mal/ScanActionVO.php +7 -5
  88. src/lib/src/Scans/Mal/ScanFromFileMap.php +3 -1
  89. src/lib/src/Scans/Mal/Utilities/FalsePositiveReporter.php +64 -0
  90. src/lib/src/Scans/Mal/Utilities/Patterns.php +52 -0
  91. src/lib/src/Scans/Mal/Utilities/Whitelist.php +44 -0
  92. src/lib/src/Scans/Ptg/BuildScanAction.php +1 -1
  93. src/lib/src/Scans/Ptg/ResultItem.php +0 -2
  94. src/lib/src/Scans/Ufc/BuildScanAction.php +1 -1
  95. src/lib/src/Scans/Ufc/ResultItem.php +0 -2
  96. src/lib/src/Scans/Ufc/Scan.php +3 -1
  97. src/lib/src/Scans/Ufc/ScanFromFileMap.php +4 -2
  98. src/lib/src/Scans/Wcf/BuildScanAction.php +1 -1
  99. src/lib/src/Scans/Wcf/ResultItem.php +0 -2
  100. src/lib/src/Scans/Wcf/Scan.php +3 -1
  101. src/lib/src/Scans/Wcf/ScanFromFileMap.php +3 -1
  102. src/lib/src/Scans/Wpv/ResultItem.php +0 -2
  103. src/lib/src/Tables/Build/ScanMal.php +43 -7
  104. src/lib/src/Tables/Render/ScanMal.php +2 -0
  105. src/lib/src/Utilities/ReCaptcha/TestRequest.php +0 -4
  106. src/lib/vendor/composer/autoload_classmap.php +15 -2
  107. src/lib/vendor/composer/autoload_static.php +15 -2
  108. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/File/Cache/Base.php +49 -0
  109. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/File/Cache/CacheDefVO.php +17 -0
  110. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/File/Cache/LoadFromCache.php +35 -0
  111. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/File/Cache/StoreToCache.php +28 -0
  112. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/ApiBase.php +47 -3
  113. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/Base.php +30 -7
  114. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/ClassicPress.php +1 -1
  115. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/Plugin.php +1 -1
  116. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/RequestVO.php +1 -0
  117. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/WordPress.php +1 -1
  118. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Patterns/Base.php +10 -0
  119. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Patterns/Retrieve.php +19 -0
  120. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/{Base.php → Whitelist/Base.php} +2 -10
  121. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/ReportFalsePositive.php +34 -0
  122. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/{RequestVO.php → Whitelist/RequestVO.php} +6 -2
  123. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/Retrieve.php +19 -0
  124. src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/WhitelistRetrieve.php +3 -8
  125. src/processors/admin_access_restriction.php +4 -4
  126. src/processors/adminaccess_whitelabel.php +1 -1
  127. src/processors/audit_trail.php +1 -1
  128. src/processors/audit_trail_auditor.php +9 -12
  129. src/processors/audit_trail_changetracking.php +1 -1
  130. src/processors/comments_filter.php +1 -1
  131. src/processors/events.php +11 -12
  132. src/processors/firewall.php +1 -1
  133. src/processors/hack_protect.php +2 -2
  134. src/processors/hackprotect_integrity.php +1 -1
  135. src/processors/hackprotect_scan_apc.php +3 -3
  136. src/processors/hackprotect_scan_base.php +31 -22
  137. src/processors/hackprotect_scan_mal.php +39 -12
  138. src/processors/hackprotect_scan_ptg.php +9 -9
  139. src/processors/hackprotect_scan_wcf.php +2 -2
  140. src/processors/hackprotect_scan_wpv.php +3 -3
  141. src/processors/hackprotect_scanner.php +4 -3
  142. src/processors/ips.php +22 -20
  143. src/processors/login_protect.php +11 -2
  144. src/processors/loginprotect_cooldown.php +5 -32
  145. src/processors/loginprotect_googlerecaptcha.php +1 -4
  146. src/processors/sessions.php +14 -12
  147. src/processors/traffic.php +1 -1
  148. src/processors/traffic_logger.php +2 -2
  149. src/processors/usermanagement_passwords.php +26 -12
  150. src/wizards/plugin.php +10 -5
  151. templates/twig/snippets/cooldown_login_block.twig +37 -0
  152. templates/twig/wpadmin_pages/base.twig +3 -3
  153. templates/twig/wpadmin_pages/insights/audit/audit_table.twig +2 -2
  154. templates/twig/wpadmin_pages/insights/insights/notices.twig +3 -2
icwp-wpsf.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Shield Security
4
  * Plugin URI: https://icwp.io/2f
5
  * Description: Powerful, Easy-To-Use #1 Rated WordPress Security System
6
- * Version: 8.1.1
7
  * Text Domain: wp-simple-firewall
8
  * Domain Path: /languages
9
  * Author: One Dollar Plugin
3
  * Plugin Name: Shield Security
4
  * Plugin URI: https://icwp.io/2f
5
  * Description: Powerful, Easy-To-Use #1 Rated WordPress Security System
6
+ * Version: 8.2.0
7
  * Text Domain: wp-simple-firewall
8
  * Domain Path: /languages
9
  * Author: One Dollar Plugin
languages/wp-simple-firewall-en_GB.mo CHANGED
Binary file
languages/wp-simple-firewall-en_GB.po CHANGED
@@ -1,15 +1,15 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: WPSF v2.0\n"
4
- "POT-Creation-Date: 2019-09-15 14:09+0100\n"
5
- "PO-Revision-Date: 2019-09-15 14:09+0100\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
  "Language: en_GB\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 2.2.3\n"
13
  "X-Poedit-KeywordsList: _wpsf__;gettext;gettext_noop;_wpsf_e;_n;_n:1,2;__;_e\n"
14
  "X-Poedit-Basepath: ..\n"
15
  "X-Poedit-SourceCharset: UTF-8\n"
@@ -37,8 +37,8 @@ msgstr ""
37
 
38
  #: src/features/admin_access_restriction.php:351
39
  #: src/features/admin_access_restriction.php:364
40
- #: src/lib/src/Modules/Plugin/Strings.php:396
41
- #: src/lib/src/Modules/Plugin/Strings.php:398
42
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:35
43
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:38
44
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:102
@@ -96,26 +96,26 @@ msgid "The Security Admin protection is not active."
96
  msgstr ""
97
 
98
  #: src/features/admin_access_restriction.php:420
99
- #: src/features/autoupdates.php:168 src/features/hack_protect.php:841
100
- #: src/features/hack_protect.php:862 src/features/hack_protect.php:883
101
- #: src/features/hack_protect.php:904 src/features/hack_protect.php:925
102
- #: src/features/hack_protect.php:946 src/features/insights.php:267
103
- #: src/features/insights.php:655 src/features/insights.php:668
104
- #: src/features/insights.php:695 src/features/insights.php:708
105
- #: src/features/insights.php:734 src/features/insights.php:746
106
  #: src/features/lockdown.php:81 src/features/user_management.php:313
107
  #, php-format
108
  msgid "Go To %s"
109
  msgstr ""
110
 
111
  #: src/features/admin_access_restriction.php:420
112
- #: src/features/autoupdates.php:168 src/features/hack_protect.php:841
113
- #: src/features/hack_protect.php:862 src/features/hack_protect.php:883
114
- #: src/features/hack_protect.php:904 src/features/hack_protect.php:925
115
- #: src/features/hack_protect.php:946 src/features/insights.php:268
116
- #: src/features/insights.php:746 src/features/lockdown.php:81
117
- #: src/features/user_management.php:313 src/lib/src/Modules/Base/Strings.php:21
118
- #: src/lib/src/Modules/Base/Strings.php:38
119
  #: src/lib/src/Modules/Insights/Strings.php:66
120
  msgid "Options"
121
  msgstr ""
@@ -133,70 +133,70 @@ msgstr ""
133
  msgid "You'll just need to authenticate first and try again."
134
  msgstr ""
135
 
136
- #: src/features/audit_trail.php:49
137
  #, php-format
138
  msgid "[%s] Audit Trail Entries"
139
  msgstr ""
140
 
141
- #: src/features/audit_trail.php:113
142
  msgid "Activity Audit Log"
143
  msgstr ""
144
 
145
- #: src/features/audit_trail.php:114
146
  msgid "Track Activity: What, Who, When, Where"
147
  msgstr ""
148
 
149
- #: src/features/audit_trail.php:127
150
  msgid "users"
151
  msgstr ""
152
 
153
- #: src/features/audit_trail.php:128
154
  msgid "plugins"
155
  msgstr ""
156
 
157
- #: src/features/audit_trail.php:129
158
  msgid "themes"
159
  msgstr ""
160
 
161
- #: src/features/audit_trail.php:130
162
  msgid "posts"
163
  msgstr ""
164
 
165
- #: src/features/audit_trail.php:131
166
  msgid "emails"
167
  msgstr ""
168
 
169
- #: src/features/audit_trail.php:136 src/features/audit_trail.php:145
170
  #: src/lib/src/Modules/AuditTrail/Strings.php:141
171
  msgid "Audit Areas"
172
  msgstr ""
173
 
174
- #: src/features/audit_trail.php:138
175
  msgid "All important events on your site are being logged"
176
  msgstr ""
177
 
178
- #: src/features/audit_trail.php:147
179
  #, php-format
180
  msgid "No areas are set to be audited: %s"
181
  msgstr ""
182
 
183
- #: src/features/audit_trail.php:154
184
  msgid "Audit Events"
185
  msgstr ""
186
 
187
- #: src/features/audit_trail.php:156
188
  #, php-format
189
  msgid "Important events aren't being audited: %s"
190
  msgstr ""
191
 
192
- #: src/features/audit_trail.php:163 src/features/insights.php:74
193
- #: src/features/insights.php:285 src/lib/src/Modules/AuditTrail/Strings.php:122
194
- #: src/lib/src/Modules/Plugin/Strings.php:399 src/wizards/plugin.php:481
195
  #: src/wizards/plugin.php:486
196
  msgid "Audit Trail"
197
  msgstr ""
198
 
199
- #: src/features/audit_trail.php:165
200
  #, php-format
201
  msgid "Maximum Audit Trail entries limited to %s"
202
  msgstr ""
@@ -204,7 +204,7 @@ msgstr ""
204
  #: src/features/autoupdates.php:157 src/features/autoupdates.php:189
205
  #: src/lib/src/Modules/Autoupdates/Strings.php:25
206
  #: src/lib/src/Modules/HackGuard/Strings.php:226
207
- #: src/lib/src/Modules/Plugin/Strings.php:402
208
  msgid "Automatic Updates"
209
  msgstr ""
210
 
@@ -273,28 +273,28 @@ msgstr ""
273
  msgid "%s isn't automatically updated"
274
  msgstr ""
275
 
276
- #: src/features/base.php:720 src/lib/src/Modules/Base/BaseModCon.php:732
277
  #: src/wizards/plugin.php:482 src/wizards/plugin.php:515
278
- #: src/wizards/plugin.php:550 src/wizards/plugin.php:694
279
  msgid "Disabled"
280
  msgstr ""
281
 
282
- #: src/features/base.php:1029 src/lib/src/Modules/Base/BaseModCon.php:1033
283
  msgid ""
284
  "Unfortunately your WordPress and/or PHP versions are too old to support this "
285
  "feature."
286
  msgstr ""
287
 
288
- #: src/features/base.php:1183 src/lib/src/Modules/Base/BaseModCon.php:1187
289
  msgid "You don't currently have permission to save settings."
290
  msgstr ""
291
 
292
- #: src/features/base.php:1277 src/lib/src/Modules/Base/BaseModCon.php:1281
293
  msgid "Password values do not match."
294
  msgstr ""
295
 
296
- #: src/features/base.php:1510 src/lib/src/Modules/AuditTrail/Strings.php:197
297
- #: src/lib/src/Modules/Base/BaseModCon.php:1514
298
  #: src/lib/src/Modules/HackGuard/Strings.php:195
299
  #: src/lib/src/Modules/HackGuard/Strings.php:269
300
  #: src/lib/src/Modules/LoginGuard/Strings.php:265
@@ -306,20 +306,20 @@ msgstr ""
306
  msgid "Default"
307
  msgstr ""
308
 
309
- #: src/features/base.php:1517 src/lib/src/Modules/Base/BaseModCon.php:1521
310
  msgid "For more information:"
311
  msgstr ""
312
 
313
- #: src/features/base.php:1518 src/lib/src/Modules/Base/BaseModCon.php:1522
314
- #: src/lib/src/Modules/Plugin/Strings.php:429
315
  msgid "Support Forums"
316
  msgstr ""
317
 
318
- #: src/features/base_wpsf.php:425
319
  msgid "Module Disabled"
320
  msgstr ""
321
 
322
- #: src/features/base_wpsf.php:427
323
  msgid "All features of this module are completely disabled"
324
  msgstr ""
325
 
@@ -389,16 +389,16 @@ msgid "You were blocked by the %s."
389
  msgstr ""
390
 
391
  #: src/features/firewall.php:86 src/features/firewall.php:98
392
- #: src/lib/src/Modules/Events/Strings.php:161
393
- #: src/lib/src/Modules/Events/Strings.php:165
394
- #: src/lib/src/Modules/Events/Strings.php:169
395
- #: src/lib/src/Modules/Events/Strings.php:173
396
- #: src/lib/src/Modules/Events/Strings.php:177
397
- #: src/lib/src/Modules/Events/Strings.php:181
398
- #: src/lib/src/Modules/Events/Strings.php:185
399
- #: src/lib/src/Modules/Events/Strings.php:189
400
  #: src/lib/src/Modules/Firewall/Strings.php:24
401
- #: src/lib/src/Modules/Plugin/Strings.php:408
402
  msgid "Firewall"
403
  msgstr ""
404
 
@@ -426,298 +426,298 @@ msgstr ""
426
  msgid "Firewall rules aren't applied to admins"
427
  msgstr ""
428
 
429
- #: src/features/hack_protect.php:170
430
  #, php-format
431
  msgid "%s per day"
432
  msgstr ""
433
 
434
- #: src/features/hack_protect.php:576
435
  msgid "Re-install First"
436
  msgstr ""
437
 
438
- #: src/features/hack_protect.php:577
439
  msgid "Then Activate"
440
  msgstr ""
441
 
442
- #: src/features/hack_protect.php:579 src/features/license.php:550
443
- #: src/lib/src/Modules/Base/Strings.php:27 src/lib/src/Tables/Build/Ip.php:54
444
  #: src/lib/src/Tables/Build/ScanBase.php:62
445
  #: src/lib/src/Tables/Build/Sessions.php:68
446
  #: src/lib/src/Tables/Build/Traffic.php:109
447
  msgid "Yes"
448
  msgstr ""
449
 
450
- #: src/features/hack_protect.php:579
451
  msgid "Re-Install It"
452
  msgstr ""
453
 
454
- #: src/features/hack_protect.php:580
455
  msgid "Activate Only"
456
  msgstr ""
457
 
458
- #: src/features/hack_protect.php:581
459
  msgid "Cancel"
460
  msgstr ""
461
 
462
- #: src/features/hack_protect.php:625 src/features/license.php:542
463
- #: src/lib/src/Modules/Base/Strings.php:29
464
- #: src/lib/src/Modules/Plugin/Strings.php:322
465
  #: src/processors/hack_protect.php:87 src/processors/hack_protect.php:117
466
  msgid "Never"
467
  msgstr ""
468
 
469
- #: src/features/hack_protect.php:626
470
  #, php-format
471
  msgid "Last Scan Time: %s"
472
  msgstr ""
473
 
474
- #: src/features/hack_protect.php:642
475
  #, php-format
476
  msgid ""
477
  "Sorry, this feature is not available because we cannot write to disk at this "
478
  "location: \"%s\""
479
  msgstr ""
480
 
481
- #: src/features/hack_protect.php:648
482
  #, php-format
483
  msgid "Not available because the %s extension is not available."
484
  msgstr ""
485
 
486
- #: src/features/hack_protect.php:651
487
  msgid ""
488
  "Not available because PHP/WordPress doesn't have direct filesystem access."
489
  msgstr ""
490
 
491
- #: src/features/hack_protect.php:656
492
  #, php-format
493
  msgid "The %s file isn't writable and so can't be further protected."
494
  msgstr ""
495
 
496
- #: src/features/hack_protect.php:831 src/features/insights.php:283
497
  msgid "Scans"
498
  msgstr ""
499
 
500
- #: src/features/hack_protect.php:839
501
  msgid "Core File scanner is not enabled."
502
  msgstr ""
503
 
504
- #: src/features/hack_protect.php:842
505
  msgid "Automatic WordPress Core File scanner should be turned-on."
506
  msgstr ""
507
 
508
- #: src/features/hack_protect.php:848
509
  msgid "Modified WordPress core files found."
510
  msgstr ""
511
 
512
- #: src/features/hack_protect.php:850 src/features/hack_protect.php:871
513
- #: src/features/hack_protect.php:892 src/features/hack_protect.php:913
514
- #: src/features/hack_protect.php:934 src/features/hack_protect.php:955
515
  msgid "Run Scan"
516
  msgstr ""
517
 
518
- #: src/features/hack_protect.php:851
519
  msgid "Scan WP core files and repair any files that are flagged as modified."
520
  msgstr ""
521
 
522
- #: src/features/hack_protect.php:860
523
  msgid "Unrecognised File scanner is not enabled."
524
  msgstr ""
525
 
526
- #: src/features/hack_protect.php:863
527
  msgid "Automatic scanning for non-WordPress core files is recommended."
528
  msgstr ""
529
 
530
- #: src/features/hack_protect.php:869
531
  msgid "Unrecognised files found in WordPress Core directory."
532
  msgstr ""
533
 
534
- #: src/features/hack_protect.php:872
535
  msgid ""
536
  "Scan and remove any files that are not meant to be in the WP core "
537
  "directories."
538
  msgstr ""
539
 
540
- #: src/features/hack_protect.php:881
541
  msgid "Automatic Plugin/Themes Guard is not enabled."
542
  msgstr ""
543
 
544
- #: src/features/hack_protect.php:884
545
  msgid "Automatic detection of plugin/theme modifications is recommended."
546
  msgstr ""
547
 
548
- #: src/features/hack_protect.php:890
549
  msgid "A plugin/theme was found to have been modified."
550
  msgstr ""
551
 
552
- #: src/features/hack_protect.php:893
553
  msgid "Reviewing modifications to your plugins/themes is recommended."
554
  msgstr ""
555
 
556
- #: src/features/hack_protect.php:902
557
  msgid "Vulnerability Scanner is not enabled."
558
  msgstr ""
559
 
560
- #: src/features/hack_protect.php:905
561
  msgid "Automatic detection of vulnerabilities is recommended."
562
  msgstr ""
563
 
564
- #: src/features/hack_protect.php:911
565
  msgid "At least 1 item has known vulnerabilities."
566
  msgstr ""
567
 
568
- #: src/features/hack_protect.php:914
569
  msgid ""
570
  "Items with known vulnerabilities should be updated, removed, or replaced."
571
  msgstr ""
572
 
573
- #: src/features/hack_protect.php:923
574
  msgid "Abandoned Plugins Scanner is not enabled."
575
  msgstr ""
576
 
577
- #: src/features/hack_protect.php:926
578
  msgid "Automatic detection of abandoned plugins is recommended."
579
  msgstr ""
580
 
581
- #: src/features/hack_protect.php:932
582
  msgid "At least 1 plugin on your site is abandoned."
583
  msgstr ""
584
 
585
- #: src/features/hack_protect.php:935
586
  msgid ""
587
  "Plugins that have been abandoned represent a potential risk to your site."
588
  msgstr ""
589
 
590
- #: src/features/hack_protect.php:944 src/features/hack_protect.php:1087
591
- #: src/features/hack_protect.php:1099
592
  #, php-format
593
  msgid "%s Scanner is not enabled."
594
  msgstr ""
595
 
596
- #: src/features/hack_protect.php:947
597
  msgid "Automatic detection of Malware is recommended."
598
  msgstr ""
599
 
600
- #: src/features/hack_protect.php:953
601
  msgid "At least 1 file with potential Malware has been discovered."
602
  msgstr ""
603
 
604
- #: src/features/hack_protect.php:956
605
  msgid ""
606
  "Files identified as potential malware should be examined as soon as possible."
607
  msgstr ""
608
 
609
- #: src/features/hack_protect.php:980
610
  #: src/lib/src/Modules/HackGuard/Strings.php:94
611
- #: src/lib/src/Modules/Plugin/Strings.php:410
612
  msgid "Hack Guard"
613
  msgstr ""
614
 
615
- #: src/features/hack_protect.php:981
616
  msgid "Threats/Intrusions Detection & Repair"
617
  msgstr ""
618
 
619
- #: src/features/hack_protect.php:993
620
  msgid "Scan Frequency"
621
  msgstr ""
622
 
623
- #: src/features/hack_protect.php:996
624
  msgid "Automatic scanners run more than once per day"
625
  msgstr ""
626
 
627
- #: src/features/hack_protect.php:997
628
  msgid "Automatic scanners only run once per day"
629
  msgstr ""
630
 
631
- #: src/features/hack_protect.php:1004
632
  msgid "WP Core File Scan"
633
  msgstr ""
634
 
635
- #: src/features/hack_protect.php:1007
636
  msgid "Core files scanned regularly for hacks"
637
  msgstr ""
638
 
639
- #: src/features/hack_protect.php:1008
640
  msgid "Core files are never scanned for hacks!"
641
  msgstr ""
642
 
643
- #: src/features/hack_protect.php:1014
644
  msgid "WP Core File Repair"
645
  msgstr ""
646
 
647
- #: src/features/hack_protect.php:1017
648
  msgid "Core files are automatically repaired"
649
  msgstr ""
650
 
651
- #: src/features/hack_protect.php:1018
652
  msgid "Core files aren't automatically repaired!"
653
  msgstr ""
654
 
655
- #: src/features/hack_protect.php:1026 src/lib/src/Modules/Events/Strings.php:94
656
- #: src/lib/src/Modules/Events/Strings.php:118
657
  #: src/lib/src/Modules/HackGuard/Strings.php:26
658
  #: src/lib/src/Modules/HackGuard/Strings.php:118
659
  msgid "Unrecognised Files"
660
  msgstr ""
661
 
662
- #: src/features/hack_protect.php:1029
663
  msgid "Core directories scanned regularly for unrecognised files"
664
  msgstr ""
665
 
666
- #: src/features/hack_protect.php:1030
667
  msgid "WP Core is never scanned for unrecognised files!"
668
  msgstr ""
669
 
670
- #: src/features/hack_protect.php:1036
671
  msgid "Unrecognised Files Removal"
672
  msgstr ""
673
 
674
- #: src/features/hack_protect.php:1039
675
  msgid "Unrecognised files are automatically removed"
676
  msgstr ""
677
 
678
- #: src/features/hack_protect.php:1040
679
  msgid "Unrecognised files aren't automatically removed!"
680
  msgstr ""
681
 
682
- #: src/features/hack_protect.php:1048
683
  msgid "Vulnerability Scan"
684
  msgstr ""
685
 
686
- #: src/features/hack_protect.php:1051
687
  msgid "Regularly scanning for known vulnerabilities"
688
  msgstr ""
689
 
690
- #: src/features/hack_protect.php:1052
691
  msgid "Plugins/Themes never scanned for vulnerabilities!"
692
  msgstr ""
693
 
694
- #: src/features/hack_protect.php:1058
695
  msgid "Auto Update"
696
  msgstr ""
697
 
698
- #: src/features/hack_protect.php:1061
699
  msgid "Vulnerable items are automatically updated"
700
  msgstr ""
701
 
702
- #: src/features/hack_protect.php:1062
703
  msgid "Vulnerable items aren't automatically updated!"
704
  msgstr ""
705
 
706
- #: src/features/hack_protect.php:1071 src/lib/src/Modules/Events/Strings.php:90
707
- #: src/lib/src/Modules/Events/Strings.php:114
708
  #: src/lib/src/Modules/HackGuard/Strings.php:24
709
  msgid "Plugin/Theme Guard"
710
  msgstr ""
711
 
712
- #: src/features/hack_protect.php:1074
713
  msgid "Plugins and Themes are guarded against tampering"
714
  msgstr ""
715
 
716
- #: src/features/hack_protect.php:1075
717
  msgid "Plugins and Themes are never scanned for tampering!"
718
  msgstr ""
719
 
720
- #: src/features/hack_protect.php:1086 src/features/hack_protect.php:1098
721
  #, php-format
722
  msgid "%s Scanner is enabled."
723
  msgstr ""
@@ -730,7 +730,7 @@ msgstr ""
730
  msgid "Protect Visitors With Powerful HTTP Headers"
731
  msgstr ""
732
 
733
- #: src/features/headers.php:147 src/lib/src/Modules/Plugin/Strings.php:411
734
  msgid "HTTP Headers"
735
  msgstr ""
736
 
@@ -754,143 +754,147 @@ msgstr ""
754
  msgid "Content Security Policies aren't active"
755
  msgstr ""
756
 
757
- #: src/features/insights.php:75
758
  msgid "Audit Trail Filters"
759
  msgstr ""
760
 
761
- #: src/features/insights.php:76 src/features/insights.php:169
762
  msgid "Providing a username will cause the 'logged-in' filter to be ignored."
763
  msgstr ""
764
 
765
- #: src/features/insights.php:77 src/features/insights.php:167
766
  msgid "Exclude Your Current IP"
767
  msgstr ""
768
 
769
- #: src/features/insights.php:78 src/features/insights.php:168
770
  msgid "Exclude Your IP From Results"
771
  msgstr ""
772
 
773
- #: src/features/insights.php:79
774
  msgid "Context"
775
  msgstr ""
776
 
777
- #: src/features/insights.php:80
 
 
 
 
778
  msgid "show results that occurred after"
779
  msgstr ""
780
 
781
- #: src/features/insights.php:81
782
  msgid "show results that occurred before"
783
  msgstr ""
784
 
785
- #: src/features/insights.php:103
786
  #, php-format
787
  msgid "Offenses required for IP block: %s"
788
  msgstr ""
789
 
790
- #: src/features/insights.php:107
791
  #, php-format
792
  msgid "Black listed IPs auto-expire after: %s"
793
  msgstr ""
794
 
795
- #: src/features/insights.php:114 src/lib/src/Modules/Plugin/Strings.php:377
796
  msgid "IP Whitelist"
797
  msgstr ""
798
 
799
- #: src/features/insights.php:115
800
  msgid "IP Blacklist"
801
  msgstr ""
802
 
803
- #: src/features/insights.php:116
804
  #, php-format
805
  msgid "IP addresses that are never blocked by %s."
806
  msgstr ""
807
 
808
- #: src/features/insights.php:117
809
  #, php-format
810
  msgid "IP addresses that have tripped %s defenses."
811
  msgstr ""
812
 
813
- #: src/features/insights.php:118
814
  msgid "Enter IP address to block"
815
  msgstr ""
816
 
817
- #: src/features/insights.php:119
818
  msgid "Enter IP address to whitelist"
819
  msgstr ""
820
 
821
- #: src/features/insights.php:120
822
  msgid "Label for IP"
823
  msgstr ""
824
 
825
- #: src/features/insights.php:121
826
  msgid "New IP"
827
  msgstr ""
828
 
829
- #: src/features/insights.php:122
830
  msgid "Block IP"
831
  msgstr ""
832
 
833
- #: src/features/insights.php:140
834
  msgid "Administrator Notes"
835
  msgstr ""
836
 
837
- #: src/features/insights.php:141
838
  msgid "Use this feature to make ongoing notes and to-dos"
839
  msgstr ""
840
 
841
- #: src/features/insights.php:142
842
  msgid "Add Note"
843
  msgstr ""
844
 
845
- #: src/features/insights.php:143
846
  msgid "New Note"
847
  msgstr ""
848
 
849
- #: src/features/insights.php:144
850
  msgid "Enter new note here"
851
  msgstr ""
852
 
853
- #: src/features/insights.php:162
854
  msgid "Traffic Table Filters"
855
  msgstr ""
856
 
857
- #: src/features/insights.php:163 src/features/traffic.php:49
858
  msgid "Traffic Watch"
859
  msgstr ""
860
 
861
- #: src/features/insights.php:164
862
  msgid "Watch and review requests to your site"
863
  msgstr ""
864
 
865
- #: src/features/insights.php:165 src/lib/src/Tables/Build/Traffic.php:148
866
  #: src/lib/src/Tables/Render/Traffic.php:14
867
  msgid "Response"
868
  msgstr ""
869
 
870
- #: src/features/insights.php:166
871
  msgid "Page/Path Contains"
872
  msgstr ""
873
 
874
- #: src/features/insights.php:205
875
  msgid "Sessions Table Filters"
876
  msgstr ""
877
 
878
- #: src/features/insights.php:206 src/processors/events.php:53
879
  msgid "User Sessions"
880
  msgstr ""
881
 
882
- #: src/features/insights.php:207
883
  msgid "Review and manage current user sessions"
884
  msgstr ""
885
 
886
- #: src/features/insights.php:208
887
  msgid ""
888
  "Some sessions may have expired but haven't been automatically cleaned from "
889
  "the database yet"
890
  msgstr ""
891
 
892
- #: src/features/insights.php:209 src/lib/src/Modules/AuditTrail/Strings.php:99
893
- #: src/lib/src/Modules/Base/Strings.php:34
894
  #: src/lib/src/Modules/UserManagement/Strings.php:16
895
  #: src/lib/src/Tables/Render/AdminNotes.php:31
896
  #: src/processors/loginprotect_intentprovider_backup.php:164
@@ -900,127 +904,127 @@ msgstr ""
900
  msgid "Username"
901
  msgstr ""
902
 
903
- #: src/features/insights.php:261
904
  msgid "Recent Events Log"
905
  msgstr ""
906
 
907
- #: src/features/insights.php:262
908
  msgid "Security Notices"
909
  msgstr ""
910
 
911
- #: src/features/insights.php:263
912
  msgid "Potential security issues on your site right now"
913
  msgstr ""
914
 
915
- #: src/features/insights.php:264
916
  msgid "Plugin Configuration Summary"
917
  msgstr ""
918
 
919
- #: src/features/insights.php:265
920
  msgid "click to toggle"
921
  msgstr ""
922
 
923
- #: src/features/insights.php:270 src/lib/src/Modules/License/Strings.php:31
924
  msgid "Key"
925
  msgstr ""
926
 
927
- #: src/features/insights.php:271
928
  msgid "Positive Security"
929
  msgstr ""
930
 
931
- #: src/features/insights.php:272
932
  msgid "Potential Warning"
933
  msgstr ""
934
 
935
- #: src/features/insights.php:273
936
  msgid "Potential Danger"
937
  msgstr ""
938
 
939
- #: src/features/insights.php:274
940
  msgid "Information"
941
  msgstr ""
942
 
943
- #: src/features/insights.php:281 src/lib/src/Modules/Base/Strings.php:24
944
  msgid "Settings"
945
  msgstr ""
946
 
947
- #: src/features/insights.php:282
948
  msgid "Overview"
949
  msgstr ""
950
 
951
- #: src/features/insights.php:284
952
  msgid "IP Lists"
953
  msgstr ""
954
 
955
- #: src/features/insights.php:286 src/features/user_management.php:291
956
  #: src/lib/src/Modules/AuditTrail/Strings.php:90
957
  msgid "Users"
958
  msgstr ""
959
 
960
- #: src/features/insights.php:287 src/features/insights.php:295
961
  msgid "Pro"
962
  msgstr ""
963
 
964
- #: src/features/insights.php:288
965
  msgid "Traffic"
966
  msgstr ""
967
 
968
- #: src/features/insights.php:289
969
  msgid "Notes"
970
  msgstr ""
971
 
972
- #: src/features/insights.php:291 src/lib/src/Modules/Plugin/Strings.php:77
973
- #: src/lib/src/Modules/Plugin/Strings.php:82
974
  msgid "Import"
975
  msgstr ""
976
 
977
- #: src/features/insights.php:291 src/lib/src/Modules/Plugin/Strings.php:77
978
- #: src/lib/src/Modules/Plugin/Strings.php:82
979
  msgid "Export"
980
  msgstr ""
981
 
982
- #: src/features/insights.php:473 src/processors/plugin_importexport.php:74
983
  msgid "Downloading file, please wait..."
984
  msgstr ""
985
 
986
- #: src/features/insights.php:474 src/processors/plugin_importexport.php:75
987
  msgid "There was a problem downloading the file."
988
  msgstr ""
989
 
990
- #: src/features/insights.php:475
991
  msgid "Please select an action to perform."
992
  msgstr ""
993
 
994
- #: src/features/insights.php:476 src/processors/hackprotect_scan_ptg.php:157
995
  msgid "Are you sure?"
996
  msgstr ""
997
 
998
- #: src/features/insights.php:570
999
  msgid "Site"
1000
  msgstr ""
1001
 
1002
- #: src/features/insights.php:594
1003
  msgid "SSL certificate for this site has expired."
1004
  msgstr ""
1005
 
1006
- #: src/features/insights.php:597
1007
  #, php-format
1008
  msgid "SSL certificate will expire soon (in %s days)"
1009
  msgstr ""
1010
 
1011
- #: src/features/insights.php:604
1012
  msgid "Check or renew your SSL certificate."
1013
  msgstr ""
1014
 
1015
- #: src/features/insights.php:627
1016
  msgid "DB Password appears to be weak."
1017
  msgstr ""
1018
 
1019
- #: src/features/insights.php:629
1020
  msgid "The database password should be strong."
1021
  msgstr ""
1022
 
1023
- #: src/features/insights.php:644 src/features/insights.php:655
1024
  #: src/lib/src/Modules/AuditTrail/Strings.php:91
1025
  #: src/lib/src/Modules/AuditTrail/Strings.php:213
1026
  #: src/lib/src/Modules/AuditTrail/Strings.php:214
@@ -1029,35 +1033,35 @@ msgstr ""
1029
  msgid "Plugins"
1030
  msgstr ""
1031
 
1032
- #: src/features/insights.php:652
1033
  msgid "Inactive"
1034
  msgstr ""
1035
 
1036
- #: src/features/insights.php:653
1037
  #, php-format
1038
  msgid "%s inactive plugin(s)"
1039
  msgstr ""
1040
 
1041
- #: src/features/insights.php:656
1042
  msgid "Unused plugins should be removed."
1043
  msgstr ""
1044
 
1045
- #: src/features/insights.php:666
1046
  #, php-format
1047
  msgid "%s plugin update(s)"
1048
  msgstr ""
1049
 
1050
- #: src/features/insights.php:668 src/features/insights.php:708
1051
- #: src/features/insights.php:734
1052
  msgid "Updates"
1053
  msgstr ""
1054
 
1055
- #: src/features/insights.php:669 src/features/insights.php:709
1056
- #: src/features/insights.php:735
1057
  msgid "Updates should be applied as early as possible."
1058
  msgstr ""
1059
 
1060
- #: src/features/insights.php:684 src/features/insights.php:695
1061
  #: src/lib/src/Modules/AuditTrail/Strings.php:92
1062
  #: src/lib/src/Modules/AuditTrail/Strings.php:219
1063
  #: src/lib/src/Modules/AuditTrail/Strings.php:220
@@ -1066,90 +1070,90 @@ msgstr ""
1066
  msgid "Themes"
1067
  msgstr ""
1068
 
1069
- #: src/features/insights.php:693
1070
  #, php-format
1071
  msgid "%s inactive themes(s)"
1072
  msgstr ""
1073
 
1074
- #: src/features/insights.php:696
1075
  msgid "Unused themes should be removed."
1076
  msgstr ""
1077
 
1078
- #: src/features/insights.php:706
1079
  #, php-format
1080
  msgid "%s theme update(s)"
1081
  msgstr ""
1082
 
1083
- #: src/features/insights.php:724
1084
  msgid "WordPress Core"
1085
  msgstr ""
1086
 
1087
- #: src/features/insights.php:732
1088
  msgid "WordPress Core has an update available."
1089
  msgstr ""
1090
 
1091
- #: src/features/insights.php:744
1092
  msgid "WordPress does not automatically install updates."
1093
  msgstr ""
1094
 
1095
- #: src/features/insights.php:747
1096
  msgid "Minor WordPress upgrades should be applied automatically."
1097
  msgstr ""
1098
 
1099
- #: src/features/insights.php:773 src/processors/events.php:45
1100
  msgid "Login Blocks"
1101
  msgstr ""
1102
 
1103
- #: src/features/insights.php:775
1104
  msgid "Total login attempts blocked."
1105
  msgstr ""
1106
 
1107
- #: src/features/insights.php:778 src/processors/events.php:41
1108
  msgid "Firewall Blocks"
1109
  msgstr ""
1110
 
1111
- #: src/features/insights.php:780
1112
  msgid "Total requests blocked by firewall rules."
1113
  msgstr ""
1114
 
1115
- #: src/features/insights.php:783 src/processors/events.php:33
1116
  msgid "Comment Blocks"
1117
  msgstr ""
1118
 
1119
- #: src/features/insights.php:789
1120
  msgid "Total SPAM comments blocked."
1121
  msgstr ""
1122
 
1123
- #: src/features/insights.php:792 src/lib/src/Tables/Render/IpBase.php:23
1124
  #: src/lib/src/Tables/Render/IpBlack.php:14
1125
  msgid "Offenses"
1126
  msgstr ""
1127
 
1128
- #: src/features/insights.php:794
1129
  msgid "Total offenses against the site."
1130
  msgstr ""
1131
 
1132
- #: src/features/insights.php:797 src/processors/events.php:57
1133
  msgid "IP Blocks"
1134
  msgstr ""
1135
 
1136
- #: src/features/insights.php:799
1137
  msgid "Total connections blocked/killed after too many offenses."
1138
  msgstr ""
1139
 
1140
- #: src/features/insights.php:802
1141
  msgid "Blacklist IPs"
1142
  msgstr ""
1143
 
1144
- #: src/features/insights.php:810
1145
  msgid "Current IP addresses with offenses against the site."
1146
  msgstr ""
1147
 
1148
- #: src/features/insights.php:857
1149
  msgid "Not yet recorded"
1150
  msgstr ""
1151
 
1152
- #: src/features/ips.php:84 src/lib/src/Modules/HackGuard/Strings.php:45
1153
  #: src/lib/src/Modules/HackGuard/Strings.php:204
1154
  #: src/lib/src/Modules/Headers/Strings.php:140
1155
  #: src/lib/src/Modules/LoginGuard/Strings.php:81
@@ -1159,9 +1163,9 @@ msgstr ""
1159
  #: src/lib/src/Modules/LoginGuard/Strings.php:213
1160
  #: src/lib/src/Modules/LoginGuard/Strings.php:221
1161
  #: src/lib/src/Modules/LoginGuard/Strings.php:235
1162
- #: src/lib/src/Modules/Plugin/Strings.php:98
1163
- #: src/lib/src/Modules/Plugin/Strings.php:102
1164
- #: src/lib/src/Modules/Plugin/Strings.php:198
1165
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:120
1166
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:139
1167
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:146
@@ -1172,33 +1176,33 @@ msgstr ""
1172
  msgid "Note"
1173
  msgstr ""
1174
 
1175
- #: src/features/ips.php:84
1176
  msgid "IP blocking is turned-off because the offenses limit is set to 0."
1177
  msgstr ""
1178
 
1179
- #: src/features/ips.php:92
1180
  msgid "Since the offenses limit is set to 0, these options have no effect."
1181
  msgstr ""
1182
 
1183
- #: src/features/ips.php:96
1184
  msgid ""
1185
  "Your User Agent appears to be empty. We recommend not turning on this option."
1186
  msgstr ""
1187
 
1188
- #: src/features/ips.php:114 src/features/ips.php:121
1189
  #: src/lib/src/Modules/Firewall/Strings.php:138
1190
  #: src/lib/src/Modules/HackGuard/Strings.php:259
1191
  #: src/lib/src/Modules/HackGuard/Strings.php:283
1192
  #: src/lib/src/Modules/HackGuard/Strings.php:284
1193
- #: src/lib/src/Modules/HackGuard/Strings.php:350
1194
  #: src/lib/src/Modules/IPs/Strings.php:66
1195
  #: src/lib/src/Modules/Lockdown/Strings.php:130
1196
  #: src/lib/src/Modules/Lockdown/Strings.php:143
1197
  #: src/lib/src/Modules/Plugin/AdminNotices.php:88
1198
- #: src/lib/src/Modules/Plugin/Strings.php:214
1199
  #: src/lib/src/Modules/Traffic/Strings.php:54
1200
  #: src/processors/hackprotect_scan_apc.php:100
1201
- #: src/processors/hackprotect_scan_mal.php:94
1202
  #: src/processors/hackprotect_scan_ptg.php:617
1203
  #: src/processors/hackprotect_scan_ufc.php:85
1204
  #: src/processors/hackprotect_scan_wcf.php:71
@@ -1208,30 +1212,23 @@ msgstr ""
1208
  msgid "Warning"
1209
  msgstr ""
1210
 
1211
- #: src/features/ips.php:115
1212
  msgid ""
1213
  "Repeated login attempts that fail will result in a complete ban of your IP "
1214
  "Address."
1215
  msgstr ""
1216
 
1217
- #: src/features/ips.php:122
1218
  #, php-format
1219
  msgid ""
1220
  "You have %s remaining offenses(s) against this site and then your IP address "
1221
  "will be completely blocked."
1222
  msgstr ""
1223
 
1224
- #: src/features/ips.php:123
1225
  msgid "Seriously, stop repeating what you are doing or you will be locked out."
1226
  msgstr ""
1227
 
1228
- #: src/features/ips.php:185
1229
- #, php-format
1230
- msgid ""
1231
- "Sorry, the %s feature may not be disabled while there are IP addresses in "
1232
- "the White List"
1233
- msgstr ""
1234
-
1235
  #: src/features/license.php:116
1236
  msgid "Automatic license verification failed."
1237
  msgstr ""
@@ -1254,11 +1251,11 @@ msgstr ""
1254
  msgid "All attempts to verify Shield Pro license have failed."
1255
  msgstr ""
1256
 
1257
- #: src/features/license.php:550
1258
  msgid "Not Active"
1259
  msgstr ""
1260
 
1261
- #: src/features/lockdown.php:70 src/lib/src/Modules/Plugin/Strings.php:415
1262
  msgid "WP Lockdown"
1263
  msgstr ""
1264
 
@@ -1290,7 +1287,7 @@ msgstr ""
1290
  msgid "File editing is permitted through WP admin"
1291
  msgstr ""
1292
 
1293
- #: src/features/lockdown.php:124 src/lib/src/Modules/Events/Strings.php:221
1294
  msgid "XML-RPC"
1295
  msgstr ""
1296
 
@@ -1370,183 +1367,182 @@ msgstr ""
1370
  msgid "Administrators"
1371
  msgstr ""
1372
 
1373
- #: src/features/login_protect.php:464
1374
  msgid "I'm a human."
1375
  msgstr ""
1376
 
1377
- #: src/features/login_protect.php:468
1378
  msgid "Please check the box to show us you're a human."
1379
  msgstr ""
1380
 
1381
- #: src/features/login_protect.php:503
1382
  #, php-format
1383
  msgid "Support for login protection with %s is a Pro-only feature."
1384
  msgstr ""
1385
 
1386
- #: src/features/login_protect.php:509
1387
  msgid ""
1388
  "2FA by email demands that your WP site is properly configured to send email."
1389
  msgstr ""
1390
 
1391
- #: src/features/login_protect.php:510
1392
  msgid ""
1393
  "This is a common problem and you may get locked out in the future if you "
1394
  "ignore this."
1395
  msgstr ""
1396
 
1397
- #: src/features/login_protect.php:511
1398
  #: src/lib/src/Modules/Plugin/AdminNotices.php:194
1399
  #: src/processors/lockdown.php:96
1400
  msgid "Learn More."
1401
  msgstr ""
1402
 
1403
- #: src/features/login_protect.php:592
1404
  #: src/lib/src/Modules/LoginGuard/Strings.php:71
1405
- #: src/lib/src/Modules/Plugin/Strings.php:417 src/wizards/plugin.php:549
1406
  #: src/wizards/plugin.php:554
1407
  msgid "Login Guard"
1408
  msgstr ""
1409
 
1410
- #: src/features/login_protect.php:593
1411
  msgid "Brute Force Protection & Identity Verification"
1412
  msgstr ""
1413
 
1414
- #: src/features/login_protect.php:609
1415
  msgid "Brute Force Login"
1416
  msgstr ""
1417
 
1418
- #: src/features/login_protect.php:612
1419
  msgid "Login forms are protected against bot attacks"
1420
  msgstr ""
1421
 
1422
- #: src/features/login_protect.php:613
1423
  msgid "Login forms are not protected against brute force bot attacks"
1424
  msgstr ""
1425
 
1426
- #: src/features/login_protect.php:618
1427
  msgid "Bot User Register"
1428
  msgstr ""
1429
 
1430
- #: src/features/login_protect.php:621
1431
  msgid "Registration forms are protected against bot attacks"
1432
  msgstr ""
1433
 
1434
- #: src/features/login_protect.php:622
1435
  msgid "Registration forms are not protected against automated bots"
1436
  msgstr ""
1437
 
1438
- #: src/features/login_protect.php:627
1439
  msgid "Brute Force Lost Password"
1440
  msgstr ""
1441
 
1442
- #: src/features/login_protect.php:630
1443
  msgid "Lost Password forms are protected against bot attacks"
1444
  msgstr ""
1445
 
1446
- #: src/features/login_protect.php:631
1447
  msgid "Lost Password forms are not protected against automated bots"
1448
  msgstr ""
1449
 
1450
- #: src/features/login_protect.php:639
1451
  msgid "Identity Verification"
1452
  msgstr ""
1453
 
1454
- #: src/features/login_protect.php:642
1455
  msgid "At least 1 2FA option is enabled"
1456
  msgstr ""
1457
 
1458
- #: src/features/login_protect.php:643
1459
  msgid "No 2FA options, such as Google Authenticator, are active"
1460
  msgstr ""
1461
 
1462
- #: src/features/plugin.php:175 src/lib/src/Modules/Plugin/AjaxHandler.php:243
1463
  msgid "Options imported successfully"
1464
  msgstr ""
1465
 
1466
- #: src/features/plugin.php:695
1467
- #: src/lib/src/Modules/Plugin/Components/PluginBadge.php:76
1468
- #, php-format
1469
- msgid "This Site Is Protected By %s"
1470
- msgstr ""
1471
-
1472
- #: src/features/plugin.php:758 src/lib/src/Modules/Plugin/Strings.php:374
1473
  #: src/processors/plugin_importexport.php:63
1474
  msgid "General Settings"
1475
  msgstr ""
1476
 
1477
- #: src/features/plugin.php:759
1478
  #, php-format
1479
  msgid "General %s Settings"
1480
  msgstr ""
1481
 
1482
- #: src/features/plugin.php:772
1483
  msgid "Visitor IP"
1484
  msgstr ""
1485
 
1486
- #: src/features/plugin.php:774
1487
  #, php-format
1488
  msgid "Visitor IP address source is: %s"
1489
  msgstr ""
1490
 
1491
- #: src/features/plugin.php:782
1492
  msgid "Reporting Email"
1493
  msgstr ""
1494
 
1495
- #: src/features/plugin.php:785
1496
  #, php-format
1497
  msgid "Email address for reports set to: %s"
1498
  msgstr ""
1499
 
1500
- #: src/features/plugin.php:786
1501
  #, php-format
1502
  msgid "No address provided - defaulting to: %s"
1503
  msgstr ""
1504
 
1505
- #: src/features/plugin.php:794 src/lib/src/Modules/Events/Strings.php:209
1506
  msgid "reCAPTCHA"
1507
  msgstr ""
1508
 
1509
- #: src/features/plugin.php:797
1510
  msgid "Google reCAPTCHA keys have been provided"
1511
  msgstr ""
1512
 
1513
- #: src/features/plugin.php:798
1514
  msgid "Google reCAPTCHA keys haven't been provided"
1515
  msgstr ""
1516
 
1517
- #: src/features/traffic.php:49
 
 
 
 
 
 
1518
  #, php-format
1519
  msgid "%s is a Pro-only feature."
1520
  msgstr ""
1521
 
1522
- #: src/features/traffic.php:54
1523
- msgid ""
1524
- "Traffic Watcher will not run because visitor IP address detection is not "
1525
- "correctly configured."
1526
  msgstr ""
1527
 
1528
  #: src/features/user_management.php:143
1529
- #: src/lib/src/Modules/Plugin/Strings.php:367
1530
  msgid "Very Weak"
1531
  msgstr ""
1532
 
1533
  #: src/features/user_management.php:144
1534
- #: src/lib/src/Modules/Plugin/Strings.php:368
1535
  msgid "Weak"
1536
  msgstr ""
1537
 
1538
  #: src/features/user_management.php:145
1539
- #: src/lib/src/Modules/Plugin/Strings.php:369
 
1540
  msgid "Medium"
1541
  msgstr ""
1542
 
1543
  #: src/features/user_management.php:146
1544
- #: src/lib/src/Modules/Plugin/Strings.php:370
1545
  msgid "Strong"
1546
  msgstr ""
1547
 
1548
  #: src/features/user_management.php:147
1549
- #: src/lib/src/Modules/Plugin/Strings.php:371
1550
  msgid "Very Strong"
1551
  msgstr ""
1552
 
@@ -1559,6 +1555,7 @@ msgid "Default 'admin' user should be disabled or removed."
1559
  msgstr ""
1560
 
1561
  #: src/features/user_management.php:310 src/features/user_management.php:380
 
1562
  #: src/lib/src/Modules/UserManagement/Strings.php:45
1563
  #: src/lib/src/Modules/UserManagement/Strings.php:46
1564
  msgid "Password Policies"
@@ -1573,7 +1570,7 @@ msgid "Password policies should be turned-on."
1573
  msgstr ""
1574
 
1575
  #: src/features/user_management.php:332
1576
- #: src/lib/src/Modules/Plugin/Strings.php:426
1577
  #: src/lib/src/Modules/Sessions/Strings.php:24
1578
  #: src/lib/src/Modules/Traffic/Strings.php:43
1579
  #: src/lib/src/Modules/Traffic/Strings.php:53
@@ -1805,10 +1802,6 @@ msgstr ""
1805
  msgid "Time"
1806
  msgstr ""
1807
 
1808
- #: src/lib/src/Modules/AuditTrail/Strings.php:97
1809
- msgid "Event"
1810
- msgstr ""
1811
-
1812
  #: src/lib/src/Modules/AuditTrail/Strings.php:98
1813
  #: src/lib/src/Modules/IPs/Strings.php:226
1814
  #: src/lib/src/Tables/Render/AuditTrail.php:69
@@ -1820,8 +1813,8 @@ msgid "Category"
1820
  msgstr ""
1821
 
1822
  #: src/lib/src/Modules/AuditTrail/Strings.php:101
1823
- #: src/lib/src/Modules/Base/Strings.php:44
1824
- #: src/lib/src/Modules/Plugin/Strings.php:388
1825
  #: src/lib/src/Tables/Render/IpBase.php:21
1826
  #: src/lib/src/Tables/Render/IpBlack.php:16
1827
  #: src/lib/src/Tables/Render/IpWhite.php:12 src/processors/firewall.php:403
@@ -1845,7 +1838,7 @@ msgstr ""
1845
 
1846
  #: src/lib/src/Modules/AuditTrail/Strings.php:117
1847
  #: src/lib/src/Modules/Autoupdates/Strings.php:21
1848
- #: src/lib/src/Modules/Base/Strings.php:25
1849
  #: src/lib/src/Modules/CommentsFilter/Strings.php:38
1850
  #: src/lib/src/Modules/Firewall/Strings.php:19
1851
  #: src/lib/src/Modules/HackGuard/Strings.php:90
@@ -1864,7 +1857,7 @@ msgstr ""
1864
 
1865
  #: src/lib/src/Modules/AuditTrail/Strings.php:117
1866
  #: src/lib/src/Modules/Autoupdates/Strings.php:21
1867
- #: src/lib/src/Modules/Base/Strings.php:26
1868
  #: src/lib/src/Modules/CommentsFilter/Strings.php:38
1869
  #: src/lib/src/Modules/Firewall/Strings.php:19
1870
  #: src/lib/src/Modules/HackGuard/Strings.php:90
@@ -1908,7 +1901,7 @@ msgstr ""
1908
  #: src/lib/src/Modules/Autoupdates/Strings.php:42
1909
  #: src/lib/src/Modules/Autoupdates/Strings.php:53
1910
  #: src/lib/src/Modules/Autoupdates/Strings.php:63
1911
- #: src/lib/src/Modules/Base/Strings.php:127
1912
  #: src/lib/src/Modules/CommentsFilter/Strings.php:41
1913
  #: src/lib/src/Modules/CommentsFilter/Strings.php:50
1914
  #: src/lib/src/Modules/CommentsFilter/Strings.php:57
@@ -1942,10 +1935,10 @@ msgstr ""
1942
  #: src/lib/src/Modules/LoginGuard/Strings.php:117
1943
  #: src/lib/src/Modules/LoginGuard/Strings.php:126
1944
  #: src/lib/src/Modules/LoginGuard/Strings.php:135
1945
- #: src/lib/src/Modules/Plugin/Strings.php:64
1946
- #: src/lib/src/Modules/Plugin/Strings.php:72
1947
- #: src/lib/src/Modules/Plugin/Strings.php:79
1948
- #: src/lib/src/Modules/Plugin/Strings.php:94
1949
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:37
1950
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:46
1951
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:55
@@ -1979,7 +1972,7 @@ msgstr ""
1979
  #: src/lib/src/Modules/Autoupdates/Strings.php:33
1980
  #: src/lib/src/Modules/Autoupdates/Strings.php:45
1981
  #: src/lib/src/Modules/Autoupdates/Strings.php:54
1982
- #: src/lib/src/Modules/Base/Strings.php:128
1983
  #: src/lib/src/Modules/CommentsFilter/Strings.php:42
1984
  #: src/lib/src/Modules/CommentsFilter/Strings.php:58
1985
  #: src/lib/src/Modules/CommentsFilter/Strings.php:68
@@ -2016,7 +2009,7 @@ msgstr ""
2016
  #: src/lib/src/Modules/LoginGuard/Strings.php:108
2017
  #: src/lib/src/Modules/LoginGuard/Strings.php:127
2018
  #: src/lib/src/Modules/LoginGuard/Strings.php:242
2019
- #: src/lib/src/Modules/Plugin/Strings.php:96
2020
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:38
2021
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:47
2022
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:56
@@ -2518,27 +2511,68 @@ msgid "Failed to update %s plugin options."
2518
  msgstr ""
2519
 
2520
  #: src/lib/src/Modules/Base/Strings.php:19
2521
- msgid "Watch Help Video"
2522
  msgstr ""
2523
 
2524
  #: src/lib/src/Modules/Base/Strings.php:20
2525
- msgid "Save Options"
 
 
 
 
 
2526
  msgstr ""
2527
 
2528
  #: src/lib/src/Modules/Base/Strings.php:22
2529
- #: src/lib/src/Modules/Base/Strings.php:42
2530
- msgid "Help"
2531
  msgstr ""
2532
 
2533
  #: src/lib/src/Modules/Base/Strings.php:23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2534
  msgid "Wizards"
2535
  msgstr ""
2536
 
2537
- #: src/lib/src/Modules/Base/Strings.php:23
2538
  msgid "No Wizards"
2539
  msgstr ""
2540
 
2541
- #: src/lib/src/Modules/Base/Strings.php:28 src/lib/src/Tables/Build/Ip.php:54
2542
  #: src/lib/src/Tables/Build/ScanBase.php:62
2543
  #: src/lib/src/Tables/Build/Sessions.php:68
2544
  #: src/lib/src/Tables/Build/Traffic.php:85
@@ -2546,192 +2580,206 @@ msgstr ""
2546
  msgid "No"
2547
  msgstr ""
2548
 
2549
- #: src/lib/src/Modules/Base/Strings.php:30
2550
  msgid "Until"
2551
  msgstr ""
2552
 
2553
- #: src/lib/src/Modules/Base/Strings.php:31
2554
  msgid "Since"
2555
  msgstr ""
2556
 
2557
- #: src/lib/src/Modules/Base/Strings.php:32
2558
  msgid "Info"
2559
  msgstr ""
2560
 
2561
- #: src/lib/src/Modules/Base/Strings.php:33
2562
  #: src/lib/src/Tables/Build/Traffic.php:141
2563
  #: src/lib/src/Tables/Render/Sessions.php:38
2564
  msgid "Logged-In"
2565
  msgstr ""
2566
 
2567
- #: src/lib/src/Modules/Base/Strings.php:35
2568
  msgid "Blog"
2569
  msgstr ""
2570
 
2571
- #: src/lib/src/Modules/Base/Strings.php:36
2572
  #, php-format
2573
  msgid "Save %s Settings"
2574
  msgstr ""
2575
 
2576
- #: src/lib/src/Modules/Base/Strings.php:39
2577
  msgid "Configure Module"
2578
  msgstr ""
2579
 
2580
- #: src/lib/src/Modules/Base/Strings.php:40
2581
  msgid "Actions and Info"
2582
  msgstr ""
2583
 
2584
- #: src/lib/src/Modules/Base/Strings.php:41
2585
  msgid "Perform actions for this module"
2586
  msgstr ""
2587
 
2588
- #: src/lib/src/Modules/Base/Strings.php:43
2589
  msgid "Learn More"
2590
  msgstr ""
2591
 
2592
- #: src/lib/src/Modules/Base/Strings.php:45
2593
  msgid "Select"
2594
  msgstr ""
2595
 
2596
- #: src/lib/src/Modules/Base/Strings.php:46
2597
  msgid "Clear Filters"
2598
  msgstr ""
2599
 
2600
- #: src/lib/src/Modules/Base/Strings.php:47
2601
  msgid "Apply Filters"
2602
  msgstr ""
2603
 
2604
- #: src/lib/src/Modules/Base/Strings.php:48
2605
  msgid "Find Plugin Option"
2606
  msgstr ""
2607
 
2608
- #: src/lib/src/Modules/Base/Strings.php:49
2609
  msgid "Type below to search all plugin options"
2610
  msgstr ""
2611
 
2612
- #: src/lib/src/Modules/Base/Strings.php:50
2613
  #: src/processors/loginprotect_intentprovider_yubikey.php:30
2614
  #: src/processors/loginprotect_intentprovider_yubikey.php:37
2615
  msgid "Pro Only"
2616
  msgstr ""
2617
 
2618
- #: src/lib/src/Modules/Base/Strings.php:51
2619
  msgid "This is a pro-only feature"
2620
  msgstr ""
2621
 
2622
- #: src/lib/src/Modules/Base/Strings.php:52
2623
  msgid "Go Pro!"
2624
  msgstr ""
2625
 
2626
- #: src/lib/src/Modules/Base/Strings.php:54
2627
  msgid "Please upgrade to Pro to control this option"
2628
  msgstr ""
2629
 
2630
- #: src/lib/src/Modules/Base/Strings.php:56
2631
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:205
2632
  msgid "Description"
2633
  msgstr ""
2634
 
2635
- #: src/lib/src/Modules/Base/Strings.php:57 src/processors/ips.php:285
2636
  #: src/processors/loginprotect_gasp.php:31
2637
  msgid "Loading"
2638
  msgstr ""
2639
 
2640
- #: src/lib/src/Modules/Base/Strings.php:58
2641
  msgid "Plugin Access Restricted"
2642
  msgstr ""
2643
 
2644
- #: src/lib/src/Modules/Base/Strings.php:59
2645
  msgid ""
2646
  "This security plugin is restricted to administrators with the Security "
2647
  "Access Key."
2648
  msgstr ""
2649
 
2650
- #: src/lib/src/Modules/Base/Strings.php:60
2651
  msgid "Please provide the Security Access Key to manage this plugin."
2652
  msgstr ""
2653
 
2654
- #: src/lib/src/Modules/Base/Strings.php:61
2655
  msgid "To manage this plugin you must enter the access key."
2656
  msgstr ""
2657
 
2658
- #: src/lib/src/Modules/Base/Strings.php:62
2659
  msgid "Enter Access Key"
2660
  msgstr ""
2661
 
2662
- #: src/lib/src/Modules/Base/Strings.php:63
2663
  msgid "Submit Security Admin Key"
2664
  msgstr ""
2665
 
2666
- #: src/lib/src/Modules/Base/Strings.php:64
2667
  msgid "Forgotten Key"
2668
  msgstr ""
2669
 
2670
- #: src/lib/src/Modules/Base/Strings.php:65
2671
  msgid "Supply Password"
2672
  msgstr ""
2673
 
2674
- #: src/lib/src/Modules/Base/Strings.php:66
2675
  msgid "Confirm Password"
2676
  msgstr ""
2677
 
2678
- #: src/lib/src/Modules/Base/Strings.php:67
2679
  msgid "Show help video for this section"
2680
  msgstr ""
2681
 
2682
- #: src/lib/src/Modules/Base/Strings.php:69
2683
  msgid "offense"
2684
  msgstr ""
2685
 
2686
- #: src/lib/src/Modules/Base/Strings.php:70
2687
  msgid "Debug"
2688
  msgstr ""
2689
 
2690
- #: src/lib/src/Modules/Base/Strings.php:72
2691
  msgid "Agree To Privacy Policy"
2692
  msgstr ""
2693
 
2694
- #: src/lib/src/Modules/Base/Strings.php:73
2695
  msgid "I confirm that I've read and I agree to the Privacy Policy"
2696
  msgstr ""
2697
 
2698
- #: src/lib/src/Modules/Base/Strings.php:74
2699
  msgid ""
2700
  "We treat your information under our strict, and GDPR-compliant, privacy "
2701
  "policy."
2702
  msgstr ""
2703
 
2704
- #: src/lib/src/Modules/Base/Strings.php:75
2705
  msgid "Privacy Policy"
2706
  msgstr ""
2707
 
2708
- #: src/lib/src/Modules/Base/Strings.php:76
2709
  msgid "We never SPAM and you can remove yourself at any time."
2710
  msgstr ""
2711
 
2712
- #: src/lib/src/Modules/Base/Strings.php:124
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2713
  msgid "User Messages"
2714
  msgstr ""
2715
 
2716
- #: src/lib/src/Modules/Base/Strings.php:125
2717
  msgid "Messages"
2718
  msgstr ""
2719
 
2720
- #: src/lib/src/Modules/Base/Strings.php:127
2721
  msgid "Customize the messages displayed to the user."
2722
  msgstr ""
2723
 
2724
- #: src/lib/src/Modules/Base/Strings.php:128
2725
  msgid ""
2726
  "Use this section if you need to communicate to the user in a particular "
2727
  "manner."
2728
  msgstr ""
2729
 
2730
- #: src/lib/src/Modules/Base/Strings.php:129
2731
  msgid "Hint"
2732
  msgstr ""
2733
 
2734
- #: src/lib/src/Modules/Base/Strings.php:129
2735
  #, php-format
2736
  msgid "To reset any message to its default, enter the text exactly: %s"
2737
  msgstr ""
@@ -2864,7 +2912,7 @@ msgstr ""
2864
  #: src/lib/src/Modules/CommentsFilter/Strings.php:76
2865
  #: src/lib/src/Modules/LoginGuard/Strings.php:108
2866
  #: src/lib/src/Modules/LoginGuard/Strings.php:127
2867
- #: src/lib/src/Modules/Plugin/Strings.php:97
2868
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:47
2869
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:56
2870
  #: src/lib/src/Modules/UserManagement/Strings.php:49
@@ -2890,7 +2938,7 @@ msgid "%s Comment SPAM Protection Filter"
2890
  msgstr ""
2891
 
2892
  #: src/lib/src/Modules/CommentsFilter/Strings.php:73
2893
- #: src/lib/src/Modules/Events/Strings.php:213
2894
  msgid "Human"
2895
  msgstr ""
2896
 
@@ -2909,7 +2957,7 @@ msgid "Enable (or Disable) The Comment SPAM Protection Feature"
2909
  msgstr ""
2910
 
2911
  #: src/lib/src/Modules/CommentsFilter/Strings.php:106
2912
- #: src/wizards/plugin.php:693 src/wizards/plugin.php:698
2913
  msgid "Comment SPAM Protection"
2914
  msgstr ""
2915
 
@@ -2951,14 +2999,14 @@ msgstr ""
2951
  #: src/lib/src/Modules/CommentsFilter/Strings.php:121
2952
  #: src/lib/src/Modules/HackGuard/Strings.php:342
2953
  #: src/lib/src/Modules/HackGuard/Strings.php:343
2954
- #: src/lib/src/Modules/HackGuard/Strings.php:351
2955
  #: src/lib/src/Modules/LoginGuard/Strings.php:222
2956
- #: src/lib/src/Modules/Plugin/Strings.php:239
2957
- #: src/lib/src/Modules/Plugin/Strings.php:246
2958
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:70
2959
  #: src/lib/src/Modules/UserManagement/Strings.php:213
2960
  #: src/lib/src/Modules/UserManagement/Strings.php:230
2961
- #: src/processors/hackprotect_scan_mal.php:121
2962
  #: src/processors/loginprotect_intentprovider_backup.php:29
2963
  msgid "Important"
2964
  msgstr ""
@@ -3124,7 +3172,7 @@ msgstr ""
3124
 
3125
  #: src/lib/src/Modules/CommentsFilter/Strings.php:183
3126
  #: src/lib/src/Modules/LoginGuard/Strings.php:226
3127
- #: src/lib/src/Modules/Plugin/Strings.php:250
3128
  msgid "reCAPTCHA Style"
3129
  msgstr ""
3130
 
@@ -3135,7 +3183,7 @@ msgstr ""
3135
 
3136
  #: src/lib/src/Modules/CommentsFilter/Strings.php:185
3137
  #: src/lib/src/Modules/LoginGuard/Strings.php:228
3138
- #: src/lib/src/Modules/Plugin/Strings.php:252
3139
  msgid ""
3140
  "You can choose the reCAPTCHA display format that best suits your site, "
3141
  "including the new Invisible Recaptcha"
@@ -3216,391 +3264,392 @@ msgid ""
3216
  "(0) turns this off. Suggested: 10"
3217
  msgstr ""
3218
 
3219
- #: src/lib/src/Modules/Events/Strings.php:11
3220
  msgid "Test Cron Run"
3221
  msgstr ""
3222
 
3223
- #: src/lib/src/Modules/Events/Strings.php:12
3224
  msgid "Import Notify Sent"
3225
  msgstr ""
3226
 
3227
- #: src/lib/src/Modules/Events/Strings.php:13
3228
  msgid "Import Notify Received"
3229
  msgstr ""
3230
 
3231
- #: src/lib/src/Modules/Events/Strings.php:14
3232
  msgid "Options Exported"
3233
  msgstr ""
3234
 
3235
- #: src/lib/src/Modules/Events/Strings.php:15
3236
  msgid "Options Imported"
3237
  msgstr ""
3238
 
3239
- #: src/lib/src/Modules/Events/Strings.php:16
3240
  msgid "Whitelist Site Added"
3241
  msgstr ""
3242
 
3243
- #: src/lib/src/Modules/Events/Strings.php:17
3244
  msgid "Whitelist Site Removed"
3245
  msgstr ""
3246
 
3247
- #: src/lib/src/Modules/Events/Strings.php:18
3248
  msgid "Master Site URL Set"
3249
  msgstr ""
3250
 
3251
- #: src/lib/src/Modules/Events/Strings.php:19
3252
  msgid "Google reCAPTCHA Test Success"
3253
  msgstr ""
3254
 
3255
- #: src/lib/src/Modules/Events/Strings.php:20
 
3256
  msgid "Google reCAPTCHA Test Fail"
3257
  msgstr ""
3258
 
3259
- #: src/lib/src/Modules/Events/Strings.php:21
3260
  msgid "Security Admin Key Authentication Success"
3261
  msgstr ""
3262
 
3263
- #: src/lib/src/Modules/Events/Strings.php:22
3264
  msgid "Security Admin Key Authentication Failed"
3265
  msgstr ""
3266
 
3267
- #: src/lib/src/Modules/Events/Strings.php:23
3268
  msgid "Custom Offense"
3269
  msgstr ""
3270
 
3271
- #: src/lib/src/Modules/Events/Strings.php:24
3272
  msgid "Connection Killed"
3273
  msgstr ""
3274
 
3275
- #: src/lib/src/Modules/Events/Strings.php:25
3276
  msgid "Offense Triggered"
3277
  msgstr ""
3278
 
3279
- #: src/lib/src/Modules/Events/Strings.php:26
3280
  msgid "IP Blocked"
3281
  msgstr ""
3282
 
3283
- #: src/lib/src/Modules/Events/Strings.php:27
3284
  msgid "IP Unblocked Using Flag File"
3285
  msgstr ""
3286
 
3287
- #: src/lib/src/Modules/Events/Strings.php:29
3288
- #: src/lib/src/Modules/Events/Strings.php:33
3289
- #: src/lib/src/Modules/Events/Strings.php:37
3290
- #: src/lib/src/Modules/Events/Strings.php:41
3291
- #: src/lib/src/Modules/Events/Strings.php:45
3292
- #: src/lib/src/Modules/Events/Strings.php:49
3293
- #: src/lib/src/Modules/Events/Strings.php:53
3294
  msgid "Bot Detection"
3295
  msgstr ""
3296
 
3297
- #: src/lib/src/Modules/Events/Strings.php:34
3298
  #: src/lib/src/Modules/IPs/Strings.php:192
3299
  msgid "Fake Web Crawler"
3300
  msgstr ""
3301
 
3302
- #: src/lib/src/Modules/Events/Strings.php:38
3303
  #: src/lib/src/Modules/IPs/Strings.php:172
3304
  msgid "Link Cheese"
3305
  msgstr ""
3306
 
3307
- #: src/lib/src/Modules/Events/Strings.php:42
3308
  #: src/lib/src/Modules/IPs/Strings.php:186
3309
  msgid "Failed Login"
3310
  msgstr ""
3311
 
3312
- #: src/lib/src/Modules/Events/Strings.php:46
3313
  msgid "Invalid Username Login"
3314
  msgstr ""
3315
 
3316
- #: src/lib/src/Modules/Events/Strings.php:50
3317
  msgid "Invalid User-Agent"
3318
  msgstr ""
3319
 
3320
- #: src/lib/src/Modules/Events/Strings.php:57
3321
- #: src/lib/src/Modules/Events/Strings.php:61
3322
- #: src/lib/src/Modules/Events/Strings.php:65
3323
- #: src/lib/src/Modules/Events/Strings.php:69
3324
- #: src/lib/src/Modules/Events/Strings.php:73
3325
- #: src/lib/src/Modules/Events/Strings.php:77
3326
  msgid "Alert Sent"
3327
  msgstr ""
3328
 
3329
- #: src/lib/src/Modules/Events/Strings.php:58
3330
  msgid "Abandoned Plugin Detected"
3331
  msgstr ""
3332
 
3333
- #: src/lib/src/Modules/Events/Strings.php:62
3334
  msgid "Malware Detected"
3335
  msgstr ""
3336
 
3337
- #: src/lib/src/Modules/Events/Strings.php:66
3338
  msgid "Modified Plugin/Theme Detected"
3339
  msgstr ""
3340
 
3341
- #: src/lib/src/Modules/Events/Strings.php:70
3342
  msgid "Unrecognised File Detected"
3343
  msgstr ""
3344
 
3345
- #: src/lib/src/Modules/Events/Strings.php:74
3346
  msgid "Modified/Missing WP Core File Detected"
3347
  msgstr ""
3348
 
3349
- #: src/lib/src/Modules/Events/Strings.php:78
3350
  msgid "Vulnerable Plugin Detected"
3351
  msgstr ""
3352
 
3353
- #: src/lib/src/Modules/Events/Strings.php:81
3354
- #: src/lib/src/Modules/Events/Strings.php:85
3355
- #: src/lib/src/Modules/Events/Strings.php:89
3356
- #: src/lib/src/Modules/Events/Strings.php:93
3357
- #: src/lib/src/Modules/Events/Strings.php:97
3358
- #: src/lib/src/Modules/Events/Strings.php:101
3359
- msgid "Scan Completed"
3360
- msgstr ""
3361
-
3362
- #: src/lib/src/Modules/Events/Strings.php:82
3363
  #: src/lib/src/Modules/Events/Strings.php:106
 
 
 
 
 
 
 
3364
  #: src/lib/src/Modules/HackGuard/Strings.php:23
3365
  #: src/lib/src/Modules/HackGuard/Strings.php:128
3366
  msgid "Abandoned Plugins"
3367
  msgstr ""
3368
 
3369
- #: src/lib/src/Modules/Events/Strings.php:86
3370
- #: src/lib/src/Modules/Events/Strings.php:110
3371
  #: src/lib/src/Modules/HackGuard/Strings.php:25
3372
  #: src/lib/src/Modules/HackGuard/Strings.php:146
3373
  msgid "Malware"
3374
  msgstr ""
3375
 
3376
- #: src/lib/src/Modules/Events/Strings.php:98
3377
- #: src/lib/src/Modules/Events/Strings.php:122
3378
  #: src/lib/src/Modules/HackGuard/Strings.php:27
3379
  msgid "WP Core Files"
3380
  msgstr ""
3381
 
3382
- #: src/lib/src/Modules/Events/Strings.php:102
3383
- #: src/lib/src/Modules/Events/Strings.php:126
3384
  #: src/lib/src/Modules/HackGuard/Strings.php:28
3385
  #: src/lib/src/Modules/HackGuard/Strings.php:99
3386
  msgid "Vulnerabilities"
3387
  msgstr ""
3388
 
3389
- #: src/lib/src/Modules/Events/Strings.php:105
3390
- #: src/lib/src/Modules/Events/Strings.php:109
3391
- #: src/lib/src/Modules/Events/Strings.php:113
3392
- #: src/lib/src/Modules/Events/Strings.php:117
3393
- #: src/lib/src/Modules/Events/Strings.php:121
3394
- #: src/lib/src/Modules/Events/Strings.php:125
3395
  msgid "Scan Item Discovered"
3396
  msgstr ""
3397
 
3398
- #: src/lib/src/Modules/Events/Strings.php:159
3399
  #: src/lib/src/Modules/Insights/Strings.php:46
3400
  msgid "Firewall Block"
3401
  msgstr ""
3402
 
3403
- #: src/lib/src/Modules/Events/Strings.php:162
3404
  #: src/lib/src/Modules/Firewall/Strings.php:194 src/processors/firewall.php:430
3405
  msgid "Directory Traversal"
3406
  msgstr ""
3407
 
3408
- #: src/lib/src/Modules/Events/Strings.php:166
3409
  #: src/lib/src/Modules/Firewall/Strings.php:104
3410
  #: src/lib/src/Modules/Firewall/Strings.php:197 src/processors/firewall.php:433
3411
  msgid "WordPress Terms"
3412
  msgstr ""
3413
 
3414
- #: src/lib/src/Modules/Events/Strings.php:170
3415
  #: src/lib/src/Modules/Firewall/Strings.php:110
3416
  #: src/lib/src/Modules/Firewall/Strings.php:200 src/processors/firewall.php:436
3417
  msgid "Field Truncation"
3418
  msgstr ""
3419
 
3420
- #: src/lib/src/Modules/Events/Strings.php:174
3421
  #: src/lib/src/Modules/Firewall/Strings.php:98
3422
  #: src/lib/src/Modules/Firewall/Strings.php:203 src/processors/firewall.php:439
3423
  msgid "SQL Queries"
3424
  msgstr ""
3425
 
3426
- #: src/lib/src/Modules/Events/Strings.php:178
3427
  #: src/lib/src/Modules/Firewall/Strings.php:206 src/processors/firewall.php:445
3428
  msgid "Leading Schema"
3429
  msgstr ""
3430
 
3431
- #: src/lib/src/Modules/Events/Strings.php:182
3432
  #: src/lib/src/Modules/Firewall/Strings.php:209 src/processors/firewall.php:451
3433
  msgid "Aggressive Rules"
3434
  msgstr ""
3435
 
3436
- #: src/lib/src/Modules/Events/Strings.php:186
3437
  #: src/lib/src/Modules/Firewall/Strings.php:116
3438
  #: src/lib/src/Modules/Firewall/Strings.php:212 src/processors/firewall.php:448
3439
  msgid "PHP Code"
3440
  msgstr ""
3441
 
3442
- #: src/lib/src/Modules/Events/Strings.php:190
3443
  #: src/lib/src/Modules/Firewall/Strings.php:215 src/processors/firewall.php:442
3444
  msgid "EXE File Uploads"
3445
  msgstr ""
3446
 
3447
- #: src/lib/src/Modules/Events/Strings.php:192
3448
  msgid "Session Not Found"
3449
  msgstr ""
3450
 
3451
- #: src/lib/src/Modules/Events/Strings.php:193
3452
  msgid "Session Expired"
3453
  msgstr ""
3454
 
3455
- #: src/lib/src/Modules/Events/Strings.php:194
3456
  msgid "Session Idle"
3457
  msgstr ""
3458
 
3459
- #: src/lib/src/Modules/Events/Strings.php:195
3460
  msgid "Session Locked To IP"
3461
  msgstr ""
3462
 
3463
- #: src/lib/src/Modules/Events/Strings.php:196
3464
  msgid "Session Locked To Browser"
3465
  msgstr ""
3466
 
3467
- #: src/lib/src/Modules/Events/Strings.php:197
3468
  msgid "Session Unverified"
3469
  msgstr ""
3470
 
3471
- #: src/lib/src/Modules/Events/Strings.php:198
3472
  msgid "Password Expired"
3473
  msgstr ""
3474
 
3475
- #: src/lib/src/Modules/Events/Strings.php:199
3476
  msgid "Forced Password Change"
3477
  msgstr ""
3478
 
3479
- #: src/lib/src/Modules/Events/Strings.php:200
3480
  msgid "Password Change Blocked"
3481
  msgstr ""
3482
 
3483
- #: src/lib/src/Modules/Events/Strings.php:201
3484
  msgid "User Hard-Suspended"
3485
  msgstr ""
3486
 
3487
- #: src/lib/src/Modules/Events/Strings.php:202
3488
  msgid "User Hard-Unsuspended"
3489
  msgstr ""
3490
 
3491
- #: src/lib/src/Modules/Events/Strings.php:204
3492
- #: src/lib/src/Modules/Events/Strings.php:208
3493
- #: src/lib/src/Modules/Events/Strings.php:212
3494
  msgid "SPAM Blocked"
3495
  msgstr ""
3496
 
3497
- #: src/lib/src/Modules/Events/Strings.php:205
3498
  msgid "Bot"
3499
  msgstr ""
3500
 
3501
- #: src/lib/src/Modules/Events/Strings.php:216
3502
- #: src/lib/src/Modules/Events/Strings.php:220
3503
  #: src/lib/src/Tables/Render/IpBlack.php:13
3504
  msgid "Blocked"
3505
  msgstr ""
3506
 
3507
- #: src/lib/src/Modules/Events/Strings.php:217
3508
  msgid "Anonymous REST API"
3509
  msgstr ""
3510
 
3511
- #: src/lib/src/Modules/Events/Strings.php:223
3512
  msgid "Session Started"
3513
  msgstr ""
3514
 
3515
- #: src/lib/src/Modules/Events/Strings.php:224
3516
  msgid "Session Terminated"
3517
  msgstr ""
3518
 
3519
- #: src/lib/src/Modules/Events/Strings.php:225
3520
  msgid "Plugin Activated"
3521
  msgstr ""
3522
 
3523
- #: src/lib/src/Modules/Events/Strings.php:226
3524
  msgid "Plugin Deactivated"
3525
  msgstr ""
3526
 
3527
- #: src/lib/src/Modules/Events/Strings.php:227
3528
  msgid "Plugin File Edited"
3529
  msgstr ""
3530
 
3531
- #: src/lib/src/Modules/Events/Strings.php:228
3532
  msgid "Theme Activated"
3533
  msgstr ""
3534
 
3535
- #: src/lib/src/Modules/Events/Strings.php:229
3536
  msgid "Theme File Edited"
3537
  msgstr ""
3538
 
3539
- #: src/lib/src/Modules/Events/Strings.php:230
3540
  msgid "WP Core Updated"
3541
  msgstr ""
3542
 
3543
- #: src/lib/src/Modules/Events/Strings.php:231
3544
  msgid "Permalinks Updated"
3545
  msgstr ""
3546
 
3547
- #: src/lib/src/Modules/Events/Strings.php:232
3548
  msgid "Post Deleted"
3549
  msgstr ""
3550
 
3551
- #: src/lib/src/Modules/Events/Strings.php:233
3552
  msgid "Post Trashed"
3553
  msgstr ""
3554
 
3555
- #: src/lib/src/Modules/Events/Strings.php:234
3556
  msgid "Post Recovered"
3557
  msgstr ""
3558
 
3559
- #: src/lib/src/Modules/Events/Strings.php:235
3560
  msgid "Post Updated"
3561
  msgstr ""
3562
 
3563
- #: src/lib/src/Modules/Events/Strings.php:236
3564
  msgid "Post Published"
3565
  msgstr ""
3566
 
3567
- #: src/lib/src/Modules/Events/Strings.php:237
3568
  msgid "Post Unpublished"
3569
  msgstr ""
3570
 
3571
- #: src/lib/src/Modules/Events/Strings.php:238
3572
  msgid "User Login"
3573
  msgstr ""
3574
 
3575
- #: src/lib/src/Modules/Events/Strings.php:239
3576
  msgid "User Registered"
3577
  msgstr ""
3578
 
3579
- #: src/lib/src/Modules/Events/Strings.php:240
3580
  msgid "User Deleted"
3581
  msgstr ""
3582
 
3583
- #: src/lib/src/Modules/Events/Strings.php:241
3584
  msgid "User Deleted And Reassigned"
3585
  msgstr ""
3586
 
3587
- #: src/lib/src/Modules/Events/Strings.php:242
3588
  msgid "Email Sent"
3589
  msgstr ""
3590
 
3591
- #: src/lib/src/Modules/Events/Strings.php:243
3592
  msgid "Invalid Email Sent"
3593
  msgstr ""
3594
 
3595
- #: src/lib/src/Modules/Events/Strings.php:244
3596
  msgid "License Check Success"
3597
  msgstr ""
3598
 
3599
- #: src/lib/src/Modules/Events/Strings.php:245
3600
  msgid "License Failure Email"
3601
  msgstr ""
3602
 
3603
- #: src/lib/src/Modules/Events/Strings.php:246
3604
  msgid "License Deactivated"
3605
  msgstr ""
3606
 
@@ -3927,75 +3976,75 @@ msgstr ""
3927
  msgid "Firewall Block Response: %s."
3928
  msgstr ""
3929
 
3930
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:158
3931
  msgid "Unsupported scanner"
3932
  msgstr ""
3933
 
3934
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:161
3935
  msgid "Unsupported item(s) selected"
3936
  msgstr ""
3937
 
3938
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:179
3939
  msgid "Action successful."
3940
  msgstr ""
3941
 
3942
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:182
3943
  msgid "An error occurred."
3944
  msgstr ""
3945
 
3946
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:182
3947
  msgid "Some items may not have been processed."
3948
  msgstr ""
3949
 
3950
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:188
3951
  msgid "Rescanning"
3952
  msgstr ""
3953
 
3954
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:191
3955
  msgid "Reloading"
3956
  msgstr ""
3957
 
3958
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:227
3959
  msgid "No scan running."
3960
  msgstr ""
3961
 
3962
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:237
3963
  msgid "Current Scan"
3964
  msgstr ""
3965
 
3966
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:239
3967
  #, php-format
3968
  msgid "%s of %s scans remaining."
3969
  msgstr ""
3970
 
3971
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:242
3972
  msgid "Please be patient."
3973
  msgstr ""
3974
 
3975
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:243
3976
  msgid "Some scans can take quite a while to complete."
3977
  msgstr ""
3978
 
3979
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:244
3980
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:295
3981
  msgid "Scans completed."
3982
  msgstr ""
3983
 
3984
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:244
3985
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:295
3986
  #: src/lib/src/Modules/License/AjaxHandler.php:88
3987
  msgid "Reloading page"
3988
  msgstr ""
3989
 
3990
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:260
3991
  msgid "No scans were selected"
3992
  msgstr ""
3993
 
3994
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:294
3995
  msgid "Scans started."
3996
  msgstr ""
3997
 
3998
- #: src/lib/src/Modules/HackGuard/AjaxHandler.php:294
3999
  msgid "Please wait, as this will take a few moments."
4000
  msgstr ""
4001
 
@@ -4144,10 +4193,6 @@ msgstr ""
4144
  msgid "Keep the Plugins/Theme Guard feature turned on."
4145
  msgstr ""
4146
 
4147
- #: src/lib/src/Modules/HackGuard/Strings.php:147
4148
- msgid "Malware Scanner"
4149
- msgstr ""
4150
-
4151
  #: src/lib/src/Modules/HackGuard/Strings.php:149
4152
  msgid "Monitor and detect presence of Malware signatures."
4153
  msgstr ""
@@ -4535,38 +4580,116 @@ msgid ""
4535
  msgstr ""
4536
 
4537
  #: src/lib/src/Modules/HackGuard/Strings.php:347
4538
- msgid "Surgical Auto-Repair"
4539
  msgstr ""
4540
 
4541
  #: src/lib/src/Modules/HackGuard/Strings.php:348
4542
- msgid "Automatically Attempt To Surgically Remove Malware Code"
4543
  msgstr ""
4544
 
4545
  #: src/lib/src/Modules/HackGuard/Strings.php:349
4546
- msgid "Attempts to automatically remove code from infected files."
 
 
4547
  msgstr ""
4548
 
4549
  #: src/lib/src/Modules/HackGuard/Strings.php:350
4550
  msgid ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4551
  "This could break your site if code removal leaves remaining code in an "
4552
  "inconsistent state."
4553
  msgstr ""
4554
 
4555
- #: src/lib/src/Modules/HackGuard/Strings.php:351
4556
  msgid ""
4557
  "Only applies to files that don't fall under the other categories for "
4558
  "automatic repair."
4559
  msgstr ""
4560
 
4561
- #: src/lib/src/Modules/HackGuard/Strings.php:355
4562
  msgid "WP Config"
4563
  msgstr ""
4564
 
4565
- #: src/lib/src/Modules/HackGuard/Strings.php:356
4566
  msgid "Realtime Protection For WP Config File"
4567
  msgstr ""
4568
 
4569
- #: src/lib/src/Modules/HackGuard/Strings.php:357
4570
  msgid "Realtime protection for the wp-config.php file."
4571
  msgstr ""
4572
 
@@ -4771,7 +4894,7 @@ msgid "%s is ignoring you"
4771
  msgstr ""
4772
 
4773
  #: src/lib/src/Modules/IPs/AdminNotices.php:40
4774
- #: src/lib/src/Modules/Plugin/Strings.php:380 src/processors/plugin.php:84
4775
  #, php-format
4776
  msgid "Your IP address is: %s"
4777
  msgstr ""
@@ -4822,15 +4945,15 @@ msgstr ""
4822
  msgid "IP address added successfully"
4823
  msgstr ""
4824
 
4825
- #: src/lib/src/Modules/IPs/AjaxHandler.php:122
4826
  msgid "Invalid entry selected"
4827
  msgstr ""
4828
 
4829
- #: src/lib/src/Modules/IPs/AjaxHandler.php:125
4830
  msgid "IP address deleted"
4831
  msgstr ""
4832
 
4833
- #: src/lib/src/Modules/IPs/AjaxHandler.php:129
4834
  msgid "IP address wasn't deleted from the list"
4835
  msgstr ""
4836
 
@@ -4841,7 +4964,7 @@ msgid ""
4841
  msgstr ""
4842
 
4843
  #: src/lib/src/Modules/IPs/Strings.php:28
4844
- #: src/lib/src/Modules/Plugin/Strings.php:413 src/wizards/plugin.php:514
4845
  #: src/wizards/plugin.php:519
4846
  msgid "IP Manager"
4847
  msgstr ""
@@ -5411,6 +5534,18 @@ msgstr ""
5411
  msgid "Please turn on this feature in the options."
5412
  msgstr ""
5413
 
 
 
 
 
 
 
 
 
 
 
 
 
5414
  #: src/lib/src/Modules/License/AjaxHandler.php:87
5415
  #: src/processors/loginprotect_intent.php:152
5416
  msgid "Success"
@@ -5590,7 +5725,7 @@ msgid "Obscurity"
5590
  msgstr ""
5591
 
5592
  #: src/lib/src/Modules/Lockdown/Strings.php:95
5593
- #: src/lib/src/Modules/Plugin/Strings.php:62
5594
  #, php-format
5595
  msgid "Disable %s"
5596
  msgstr ""
@@ -5763,6 +5898,40 @@ msgstr ""
5763
  msgid "Verification email resent."
5764
  msgstr ""
5765
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5766
  #: src/lib/src/Modules/LoginGuard/Strings.php:15
5767
  #, php-format
5768
  msgid "User \"%s\" attempted \"%s\" but Bot checkbox was not found."
@@ -6019,7 +6188,7 @@ msgid "Two-Factor Login Authentication By %s"
6019
  msgstr ""
6020
 
6021
  #: src/lib/src/Modules/LoginGuard/Strings.php:205
6022
- #: src/lib/src/Modules/Plugin/Strings.php:407
6023
  #: src/processors/user_management.php:204
6024
  msgid "Email"
6025
  msgstr ""
@@ -6049,8 +6218,8 @@ msgid "This setting only applies to %s."
6049
  msgstr ""
6050
 
6051
  #: src/lib/src/Modules/LoginGuard/Strings.php:217
6052
- #: src/lib/src/Modules/Plugin/Strings.php:91
6053
- #: src/lib/src/Modules/Plugin/Strings.php:92
6054
  msgid "Google reCAPTCHA"
6055
  msgstr ""
6056
 
@@ -6069,7 +6238,7 @@ msgid "Use of any theme other than \"%s\", requires a Pro license."
6069
  msgstr ""
6070
 
6071
  #: src/lib/src/Modules/LoginGuard/Strings.php:220
6072
- #: src/lib/src/Modules/Plugin/Strings.php:430
6073
  msgid "Light Theme"
6074
  msgstr ""
6075
 
@@ -6491,6 +6660,11 @@ msgstr ""
6491
  msgid "Site Secured"
6492
  msgstr ""
6493
 
 
 
 
 
 
6494
  #: src/lib/src/Modules/Plugin/Strings.php:15
6495
  msgid "Plugin Actions"
6496
  msgstr ""
@@ -6537,785 +6711,802 @@ msgstr ""
6537
  msgid "Master Site URL set: %s"
6538
  msgstr ""
6539
 
6540
- #: src/lib/src/Modules/Plugin/Strings.php:61
6541
  msgid "Global Security Plugin Disable"
6542
  msgstr ""
6543
 
6544
- #: src/lib/src/Modules/Plugin/Strings.php:64
6545
  msgid "Use this option to completely disable all active Shield Protection."
6546
  msgstr ""
6547
 
6548
- #: src/lib/src/Modules/Plugin/Strings.php:69
6549
- #: src/lib/src/Modules/Plugin/Strings.php:70
6550
  msgid "Plugin Defaults"
6551
  msgstr ""
6552
 
6553
- #: src/lib/src/Modules/Plugin/Strings.php:72
6554
  msgid "Important default settings used throughout the plugin."
6555
  msgstr ""
6556
 
6557
- #: src/lib/src/Modules/Plugin/Strings.php:79
6558
  msgid ""
6559
  "Automatically import options, and deploy configurations across your entire "
6560
  "network."
6561
  msgstr ""
6562
 
6563
- #: src/lib/src/Modules/Plugin/Strings.php:80
6564
  msgid "This is a Pro-only feature."
6565
  msgstr ""
6566
 
6567
- #: src/lib/src/Modules/Plugin/Strings.php:86
6568
  msgid "General Plugin Options"
6569
  msgstr ""
6570
 
6571
- #: src/lib/src/Modules/Plugin/Strings.php:87
6572
  msgid "General Options"
6573
  msgstr ""
6574
 
6575
- #: src/lib/src/Modules/Plugin/Strings.php:94
6576
  #, php-format
6577
  msgid "Setup Google reCAPTCHA for use across %s."
6578
  msgstr ""
6579
 
6580
- #: src/lib/src/Modules/Plugin/Strings.php:98
6581
  msgid "You must create your own Google reCAPTCHA API Keys."
6582
  msgstr ""
6583
 
6584
- #: src/lib/src/Modules/Plugin/Strings.php:100
6585
  msgid "Manage Keys Here"
6586
  msgstr ""
6587
 
6588
- #: src/lib/src/Modules/Plugin/Strings.php:102
6589
  #, php-format
6590
  msgid "Invisible Google reCAPTCHA is available with %s Pro."
6591
  msgstr ""
6592
 
6593
- #: src/lib/src/Modules/Plugin/Strings.php:107
6594
- #: src/lib/src/Modules/Plugin/Strings.php:108
6595
  msgid "Duo Security"
6596
  msgstr ""
6597
 
6598
- #: src/lib/src/Modules/Plugin/Strings.php:135
6599
  #, php-format
6600
  msgid "Enable %s Protection"
6601
  msgstr ""
6602
 
6603
- #: src/lib/src/Modules/Plugin/Strings.php:136
6604
  msgid "Switch Off To Disable All Security Protection"
6605
  msgstr ""
6606
 
6607
- #: src/lib/src/Modules/Plugin/Strings.php:137
6608
  msgid ""
6609
  "You can keep the security plugin activated, but temporarily disable all "
6610
  "protection it provides."
6611
  msgstr ""
6612
 
6613
- #: src/lib/src/Modules/Plugin/Strings.php:141
6614
  msgid "Anonymous Usage Statistics"
6615
  msgstr ""
6616
 
6617
- #: src/lib/src/Modules/Plugin/Strings.php:142
6618
  msgid "Permit Anonymous Usage Information Gathering"
6619
  msgstr ""
6620
 
6621
- #: src/lib/src/Modules/Plugin/Strings.php:143
6622
  msgid ""
6623
  "Allows us to gather information on statistics and features in-use across our "
6624
  "client installations."
6625
  msgstr ""
6626
 
6627
- #: src/lib/src/Modules/Plugin/Strings.php:144
6628
  msgid ""
6629
  "This information is strictly anonymous and contains no personally, or "
6630
  "otherwise, identifiable data."
6631
  msgstr ""
6632
 
6633
- #: src/lib/src/Modules/Plugin/Strings.php:145
6634
  msgid "Click to see the exact data that would be sent."
6635
  msgstr ""
6636
 
6637
- #: src/lib/src/Modules/Plugin/Strings.php:149
6638
  msgid "IP Source"
6639
  msgstr ""
6640
 
6641
- #: src/lib/src/Modules/Plugin/Strings.php:150
6642
  msgid "Which IP Address Is Yours"
6643
  msgstr ""
6644
 
6645
- #: src/lib/src/Modules/Plugin/Strings.php:151
6646
  msgid ""
6647
  "There are many possible ways to detect visitor IP addresses. If Auto-Detect "
6648
  "is not working, please select yours from the list."
6649
  msgstr ""
6650
 
6651
- #: src/lib/src/Modules/Plugin/Strings.php:152
6652
  msgid ""
6653
  "If the option you select becomes unavailable, we will revert to auto "
6654
  "detection."
6655
  msgstr ""
6656
 
6657
- #: src/lib/src/Modules/Plugin/Strings.php:154
6658
  #, php-format
6659
  msgid "Current source is: %s (%s)"
6660
  msgstr ""
6661
 
6662
- #: src/lib/src/Modules/Plugin/Strings.php:163
6663
  msgid "Report Email"
6664
  msgstr ""
6665
 
6666
- #: src/lib/src/Modules/Plugin/Strings.php:164
6667
  msgid "Where to send email reports"
6668
  msgstr ""
6669
 
6670
- #: src/lib/src/Modules/Plugin/Strings.php:165
6671
  #, php-format
6672
  msgid "If this is empty, it will default to the blog admin email address: %s"
6673
  msgstr ""
6674
 
6675
- #: src/lib/src/Modules/Plugin/Strings.php:169
6676
  msgid "In-Plugin Notices"
6677
  msgstr ""
6678
 
6679
- #: src/lib/src/Modules/Plugin/Strings.php:170
6680
  msgid "Display Plugin Specific Notices"
6681
  msgstr ""
6682
 
6683
- #: src/lib/src/Modules/Plugin/Strings.php:171
6684
  msgid ""
6685
  "Disable this option to hide certain plugin admin notices about available "
6686
  "updates and post-update notices."
6687
  msgstr ""
6688
 
6689
- #: src/lib/src/Modules/Plugin/Strings.php:175
6690
  msgid "Show Plugin Badge"
6691
  msgstr ""
6692
 
6693
- #: src/lib/src/Modules/Plugin/Strings.php:176
6694
  msgid "Display Plugin Badge On Your Site"
6695
  msgstr ""
6696
 
6697
- #: src/lib/src/Modules/Plugin/Strings.php:177
6698
  msgid ""
6699
  "Enabling this option helps support the plugin by spreading the word about it "
6700
  "on your website."
6701
  msgstr ""
6702
 
6703
- #: src/lib/src/Modules/Plugin/Strings.php:178
6704
  msgid ""
6705
  "The plugin badge also lets visitors know your are taking your website "
6706
  "security seriously."
6707
  msgstr ""
6708
 
6709
- #: src/lib/src/Modules/Plugin/Strings.php:179
6710
  msgid "Read this carefully before enabling this option."
6711
  msgstr ""
6712
 
6713
- #: src/lib/src/Modules/Plugin/Strings.php:183
6714
  msgid "Delete Plugin Settings"
6715
  msgstr ""
6716
 
6717
- #: src/lib/src/Modules/Plugin/Strings.php:184
6718
  msgid "Delete All Plugin Settings Upon Plugin Deactivation"
6719
  msgstr ""
6720
 
6721
- #: src/lib/src/Modules/Plugin/Strings.php:185
6722
  msgid "Careful: Removes all plugin options when you deactivate the plugin"
6723
  msgstr ""
6724
 
6725
- #: src/lib/src/Modules/Plugin/Strings.php:189
6726
  msgid "XML-RPC Compatibility"
6727
  msgstr ""
6728
 
6729
- #: src/lib/src/Modules/Plugin/Strings.php:190
6730
  msgid "Allow Login Through XML-RPC To By-Pass Accounts Management Rules"
6731
  msgstr ""
6732
 
6733
- #: src/lib/src/Modules/Plugin/Strings.php:191
6734
  msgid ""
6735
  "Enable this if you need XML-RPC functionality e.g. if you use the WordPress "
6736
  "iPhone/Android App."
6737
  msgstr ""
6738
 
6739
- #: src/lib/src/Modules/Plugin/Strings.php:195
6740
  msgid "Allow Import/Export"
6741
  msgstr ""
6742
 
6743
- #: src/lib/src/Modules/Plugin/Strings.php:196
6744
  msgid "Allow Import And Export Of Options On This Site"
6745
  msgstr ""
6746
 
6747
- #: src/lib/src/Modules/Plugin/Strings.php:197
6748
  msgid "Uncheck this box to completely disable import and export of options."
6749
  msgstr ""
6750
 
6751
- #: src/lib/src/Modules/Plugin/Strings.php:198
6752
  msgid "Import/Export is a premium-only feature."
6753
  msgstr ""
6754
 
6755
- #: src/lib/src/Modules/Plugin/Strings.php:202
6756
  msgid "Export Whitelist"
6757
  msgstr ""
6758
 
6759
- #: src/lib/src/Modules/Plugin/Strings.php:203
6760
  msgid "Whitelisted Sites To Export Options From This Site"
6761
  msgstr ""
6762
 
6763
- #: src/lib/src/Modules/Plugin/Strings.php:204
6764
  msgid "Whitelisted sites may export options from this site without the key."
6765
  msgstr ""
6766
 
6767
- #: src/lib/src/Modules/Plugin/Strings.php:205
6768
  msgid "List each site URL on a new line."
6769
  msgstr ""
6770
 
6771
- #: src/lib/src/Modules/Plugin/Strings.php:206
6772
  msgid "This is to be used in conjunction with the Master Import Site feature."
6773
  msgstr ""
6774
 
6775
- #: src/lib/src/Modules/Plugin/Strings.php:210
6776
  msgid "Master Import Site"
6777
  msgstr ""
6778
 
6779
- #: src/lib/src/Modules/Plugin/Strings.php:211
6780
  msgid "Automatically Import Options From This Site URL"
6781
  msgstr ""
6782
 
6783
- #: src/lib/src/Modules/Plugin/Strings.php:212
6784
  msgid "Supplying a site URL here will make this site an 'Options Slave'."
6785
  msgstr ""
6786
 
6787
- #: src/lib/src/Modules/Plugin/Strings.php:213
6788
  msgid "Options will be automatically exported from the Master site each day."
6789
  msgstr ""
6790
 
6791
- #: src/lib/src/Modules/Plugin/Strings.php:214
6792
  msgid ""
6793
  "Use of this feature will overwrite existing options and replace them with "
6794
  "those from the Master Import Site."
6795
  msgstr ""
6796
 
6797
- #: src/lib/src/Modules/Plugin/Strings.php:218
6798
  msgid "Notify Whitelist"
6799
  msgstr ""
6800
 
6801
- #: src/lib/src/Modules/Plugin/Strings.php:219
6802
  msgid "Notify Sites On The Whitelist To Update Options From Master"
6803
  msgstr ""
6804
 
6805
- #: src/lib/src/Modules/Plugin/Strings.php:220
6806
  msgid ""
6807
  "When enabled, manual options saving will notify sites on the whitelist to "
6808
  "export options from the Master site."
6809
  msgstr ""
6810
 
6811
- #: src/lib/src/Modules/Plugin/Strings.php:224
6812
  #: src/processors/plugin_importexport.php:59
6813
  #: src/processors/plugin_importexport.php:63
6814
  msgid "Secret Key"
6815
  msgstr ""
6816
 
6817
- #: src/lib/src/Modules/Plugin/Strings.php:225
6818
  msgid "Import/Export Secret Key"
6819
  msgstr ""
6820
 
6821
- #: src/lib/src/Modules/Plugin/Strings.php:226
6822
  msgid ""
6823
  "Keep this Secret Key private as it will allow the import and export of "
6824
  "options."
6825
  msgstr ""
6826
 
6827
- #: src/lib/src/Modules/Plugin/Strings.php:230
6828
  msgid "Installation ID"
6829
  msgstr ""
6830
 
6831
- #: src/lib/src/Modules/Plugin/Strings.php:231
6832
  msgid "Unique Plugin Installation ID"
6833
  msgstr ""
6834
 
6835
- #: src/lib/src/Modules/Plugin/Strings.php:232
6836
  msgid "Keep this ID private."
6837
  msgstr ""
6838
 
6839
- #: src/lib/src/Modules/Plugin/Strings.php:236
6840
  msgid "reCAPTCHA Secret"
6841
  msgstr ""
6842
 
6843
- #: src/lib/src/Modules/Plugin/Strings.php:237
6844
  msgid "Google reCAPTCHA Secret Key"
6845
  msgstr ""
6846
 
6847
- #: src/lib/src/Modules/Plugin/Strings.php:238
6848
  msgid "Enter your Google reCAPTCHA secret key for use throughout the plugin."
6849
  msgstr ""
6850
 
6851
- #: src/lib/src/Modules/Plugin/Strings.php:243
6852
  msgid "reCAPTCHA Site Key"
6853
  msgstr ""
6854
 
6855
- #: src/lib/src/Modules/Plugin/Strings.php:244
6856
  msgid "Google reCAPTCHA Site Key"
6857
  msgstr ""
6858
 
6859
- #: src/lib/src/Modules/Plugin/Strings.php:245
6860
  msgid "Enter your Google reCAPTCHA site key for use throughout the plugin"
6861
  msgstr ""
6862
 
6863
- #: src/lib/src/Modules/Plugin/Strings.php:251
6864
  msgid "How Google reCAPTCHA Will Be Displayed By Default"
6865
  msgstr ""
6866
 
6867
- #: src/lib/src/Modules/Plugin/Strings.php:302
6868
  msgid "Install"
6869
  msgstr ""
6870
 
6871
- #: src/lib/src/Modules/Plugin/Strings.php:303
6872
  msgid "Update"
6873
  msgstr ""
6874
 
6875
- #: src/lib/src/Modules/Plugin/Strings.php:304
6876
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:146
6877
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:172
6878
  msgid "Activate"
6879
  msgstr ""
6880
 
6881
- #: src/lib/src/Modules/Plugin/Strings.php:305
6882
  #: src/lib/src/Tables/Render/AdminNotes.php:20
6883
  #: src/lib/src/Tables/Render/Base.php:203
 
6884
  #: src/lib/src/Tables/Render/ScanUfc.php:29
6885
  msgid "Delete"
6886
  msgstr ""
6887
 
6888
- #: src/lib/src/Modules/Plugin/Strings.php:306
6889
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:173
6890
  msgid "Edit Theme Options"
6891
  msgstr ""
6892
 
6893
- #: src/lib/src/Modules/Plugin/Strings.php:307
6894
  msgid "Create/Edit"
6895
  msgstr ""
6896
 
6897
- #: src/lib/src/Modules/Plugin/Strings.php:308
6898
  msgid "Publish"
6899
  msgstr ""
6900
 
6901
- #: src/lib/src/Modules/Plugin/Strings.php:309
6902
  msgid "Author Name"
6903
  msgstr ""
6904
 
6905
- #: src/lib/src/Modules/Plugin/Strings.php:310
6906
  msgid "Author Email"
6907
  msgstr ""
6908
 
6909
- #: src/lib/src/Modules/Plugin/Strings.php:311
6910
  msgid "Comment Content"
6911
  msgstr ""
6912
 
6913
- #: src/lib/src/Modules/Plugin/Strings.php:312
6914
  msgid "Browser User Agent"
6915
  msgstr ""
6916
 
6917
- #: src/lib/src/Modules/Plugin/Strings.php:313
6918
  msgid "Login"
6919
  msgstr ""
6920
 
6921
- #: src/lib/src/Modules/Plugin/Strings.php:314
6922
  msgid "Register"
6923
  msgstr ""
6924
 
6925
- #: src/lib/src/Modules/Plugin/Strings.php:315
6926
  msgid "Lost Password"
6927
  msgstr ""
6928
 
6929
- #: src/lib/src/Modules/Plugin/Strings.php:316
6930
  msgid "Checkout (WooCommerce)"
6931
  msgstr ""
6932
 
6933
- #: src/lib/src/Modules/Plugin/Strings.php:317
6934
  msgid "Simple Requests"
6935
  msgstr ""
6936
 
6937
- #: src/lib/src/Modules/Plugin/Strings.php:318
6938
  msgid "Logged-In Users"
6939
  msgstr ""
6940
 
6941
- #: src/lib/src/Modules/Plugin/Strings.php:319
6942
  msgid "Search Engines"
6943
  msgstr ""
6944
 
6945
- #: src/lib/src/Modules/Plugin/Strings.php:320
6946
  msgid "Uptime Monitoring Services"
6947
  msgstr ""
6948
 
6949
- #: src/lib/src/Modules/Plugin/Strings.php:321
6950
  msgid "Enabled With Email Reports"
6951
  msgstr ""
6952
 
6953
- #: src/lib/src/Modules/Plugin/Strings.php:323
6954
  msgid "Minor Versions Only"
6955
  msgstr ""
6956
 
6957
- #: src/lib/src/Modules/Plugin/Strings.php:324
6958
  msgid "Major and Minor Versions"
6959
  msgstr ""
6960
 
6961
- #: src/lib/src/Modules/Plugin/Strings.php:325
6962
  msgid "Let The Plugin Decide"
6963
  msgstr ""
6964
 
6965
- #: src/lib/src/Modules/Plugin/Strings.php:326
6966
  msgid "As Soon As Possible"
6967
  msgstr ""
6968
 
6969
- #: src/lib/src/Modules/Plugin/Strings.php:327
6970
  msgid "Move To Pending Moderation"
6971
  msgstr ""
6972
 
6973
- #: src/lib/src/Modules/Plugin/Strings.php:328
6974
  msgid "Move To SPAM"
6975
  msgstr ""
6976
 
6977
- #: src/lib/src/Modules/Plugin/Strings.php:329
6978
  msgid "Move To Trash"
6979
  msgstr ""
6980
 
6981
- #: src/lib/src/Modules/Plugin/Strings.php:330
6982
  msgid "Block And Redirect"
6983
  msgstr ""
6984
 
6985
- #: src/lib/src/Modules/Plugin/Strings.php:331
6986
  msgid "Invisible"
6987
  msgstr ""
6988
 
6989
- #: src/lib/src/Modules/Plugin/Strings.php:332
6990
  msgid "Default Style"
6991
  msgstr ""
6992
 
6993
- #: src/lib/src/Modules/Plugin/Strings.php:333
6994
  msgid "Redirect To Home Page"
6995
  msgstr ""
6996
 
6997
- #: src/lib/src/Modules/Plugin/Strings.php:334
6998
  msgid "Return 404"
6999
  msgstr ""
7000
 
7001
- #: src/lib/src/Modules/Plugin/Strings.php:335
7002
  msgid "Die"
7003
  msgstr ""
7004
 
7005
- #: src/lib/src/Modules/Plugin/Strings.php:336
7006
  msgid "Scan Disabled"
7007
  msgstr ""
7008
 
7009
- #: src/lib/src/Modules/Plugin/Strings.php:337
7010
  msgid "Scan Enabled"
7011
  msgstr ""
7012
 
7013
- #: src/lib/src/Modules/Plugin/Strings.php:338
7014
  msgid "Automatic Scan Disabled"
7015
  msgstr ""
7016
 
7017
- #: src/lib/src/Modules/Plugin/Strings.php:339
7018
  msgid "Automatic Scan Enabled"
7019
  msgstr ""
7020
 
7021
- #: src/lib/src/Modules/Plugin/Strings.php:340
7022
  msgid "Scan Enabled - Send Email Notification"
7023
  msgstr ""
7024
 
7025
- #: src/lib/src/Modules/Plugin/Strings.php:341
7026
  msgid "Scan Enabled - No Email Notification"
7027
  msgstr ""
7028
 
7029
- #: src/lib/src/Modules/Plugin/Strings.php:342
7030
  msgid "Scan Enabled - Automatically Delete Files"
7031
  msgstr ""
7032
 
7033
- #: src/lib/src/Modules/Plugin/Strings.php:343
7034
  msgid "Scan Enabled - Delete Files and Send Email Notification"
7035
  msgstr ""
7036
 
7037
- #: src/lib/src/Modules/Plugin/Strings.php:344
7038
  msgid "Off: iFrames Not Blocked"
7039
  msgstr ""
7040
 
7041
- #: src/lib/src/Modules/Plugin/Strings.php:345
7042
  msgid "On: Allow iFrames On The Same Domain"
7043
  msgstr ""
7044
 
7045
- #: src/lib/src/Modules/Plugin/Strings.php:346
7046
  msgid "On: Block All iFrames"
7047
  msgstr ""
7048
 
7049
- #: src/lib/src/Modules/Plugin/Strings.php:347
7050
  msgid "Default: Full Referrer URL (aka 'Unsafe URL')"
7051
  msgstr ""
7052
 
7053
- #: src/lib/src/Modules/Plugin/Strings.php:348
7054
  msgid "No Referrer"
7055
  msgstr ""
7056
 
7057
- #: src/lib/src/Modules/Plugin/Strings.php:349
7058
  msgid "No Referrer When Downgrade"
7059
  msgstr ""
7060
 
7061
- #: src/lib/src/Modules/Plugin/Strings.php:350
7062
  msgid "Same Origin"
7063
  msgstr ""
7064
 
7065
- #: src/lib/src/Modules/Plugin/Strings.php:351
7066
  msgid "Origin"
7067
  msgstr ""
7068
 
7069
- #: src/lib/src/Modules/Plugin/Strings.php:352
7070
  msgid "Strict Origin"
7071
  msgstr ""
7072
 
7073
- #: src/lib/src/Modules/Plugin/Strings.php:353
7074
  msgid "Origin When Cross-Origin"
7075
  msgstr ""
7076
 
7077
- #: src/lib/src/Modules/Plugin/Strings.php:354
7078
  msgid "Strict Origin When Cross-Origin"
7079
  msgstr ""
7080
 
7081
- #: src/lib/src/Modules/Plugin/Strings.php:355
7082
  msgid "Empty Header"
7083
  msgstr ""
7084
 
7085
- #: src/lib/src/Modules/Plugin/Strings.php:356
7086
  msgid "Disabled - Don't Send This Header"
7087
  msgstr ""
7088
 
7089
- #: src/lib/src/Modules/Plugin/Strings.php:357
7090
  msgid "Minute"
7091
  msgstr ""
7092
 
7093
- #: src/lib/src/Modules/Plugin/Strings.php:358
7094
  msgid "Hour"
7095
  msgstr ""
7096
 
7097
- #: src/lib/src/Modules/Plugin/Strings.php:359
7098
  msgid "Day"
7099
  msgstr ""
7100
 
7101
- #: src/lib/src/Modules/Plugin/Strings.php:360
7102
  msgid "Week"
7103
  msgstr ""
7104
 
7105
- #: src/lib/src/Modules/Plugin/Strings.php:361
7106
  msgid "Month"
7107
  msgstr ""
7108
 
7109
- #: src/lib/src/Modules/Plugin/Strings.php:362
7110
  msgid "With Shield Bot Protection"
7111
  msgstr ""
7112
 
7113
- #: src/lib/src/Modules/Plugin/Strings.php:363
7114
  msgid "Audit Log Only"
7115
  msgstr ""
7116
 
7117
- #: src/lib/src/Modules/Plugin/Strings.php:364
7118
  msgid "Increment Offense Counter"
7119
  msgstr ""
7120
 
7121
- #: src/lib/src/Modules/Plugin/Strings.php:365
7122
  msgid "Double-Increment Offense Counter"
7123
  msgstr ""
7124
 
7125
- #: src/lib/src/Modules/Plugin/Strings.php:366
7126
  msgid "Immediate Block"
7127
  msgstr ""
7128
 
7129
- #: src/lib/src/Modules/Plugin/Strings.php:375
7130
  msgid "Security Dashboard"
7131
  msgstr ""
7132
 
7133
- #: src/lib/src/Modules/Plugin/Strings.php:376
7134
  msgid "Automatically Detect Visitor IP"
7135
  msgstr ""
7136
 
7137
- #: src/lib/src/Modules/Plugin/Strings.php:378
7138
  msgid "IP Address White List"
7139
  msgstr ""
7140
 
7141
- #: src/lib/src/Modules/Plugin/Strings.php:379
7142
  msgid ""
7143
  "Any IP addresses on this list will by-pass all Plugin Security Checking."
7144
  msgstr ""
7145
 
7146
- #: src/lib/src/Modules/Plugin/Strings.php:381
7147
  msgid "Choose IP Addresses To Blacklist"
7148
  msgstr ""
7149
 
7150
- #: src/lib/src/Modules/Plugin/Strings.php:382
7151
  #, php-format
7152
  msgid "Recommendation - %s"
7153
  msgstr ""
7154
 
7155
- #: src/lib/src/Modules/Plugin/Strings.php:383
7156
  msgid "Blacklist"
7157
  msgstr ""
7158
 
7159
- #: src/lib/src/Modules/Plugin/Strings.php:384
7160
  msgid "Logging"
7161
  msgstr ""
7162
 
7163
- #: src/lib/src/Modules/Plugin/Strings.php:385
7164
  #, php-format
7165
  msgid ""
7166
  "User \"%s\" was forcefully logged out as they were not verified by either "
7167
  "cookie or IP address (or both)."
7168
  msgstr ""
7169
 
7170
- #: src/lib/src/Modules/Plugin/Strings.php:386
7171
  #, php-format
7172
  msgid ""
7173
  "User \"%s\" was found to be un-verified at the given IP Address: \"%s\"."
7174
  msgstr ""
7175
 
7176
- #: src/lib/src/Modules/Plugin/Strings.php:387
7177
  msgid "Cookie"
7178
  msgstr ""
7179
 
7180
- #: src/lib/src/Modules/Plugin/Strings.php:389
7181
  #: src/lib/src/Tables/Build/Traffic.php:140
7182
  msgid "IP"
7183
  msgstr ""
7184
 
7185
- #: src/lib/src/Modules/Plugin/Strings.php:390
7186
  msgid ""
7187
  "This will restrict all user login sessions to a single browser. Use this if "
7188
  "your users have dynamic IP addresses."
7189
  msgstr ""
7190
 
7191
- #: src/lib/src/Modules/Plugin/Strings.php:391
7192
  msgid ""
7193
  "All users will be required to authenticate their login by email-based two-"
7194
  "factor authentication, when logging in from a new IP address"
7195
  msgstr ""
7196
 
7197
- #: src/lib/src/Modules/Plugin/Strings.php:392
7198
  msgid "2-Factor Auth"
7199
  msgstr ""
7200
 
7201
- #: src/lib/src/Modules/Plugin/Strings.php:393
7202
  msgid "Include Logged-In Users"
7203
  msgstr ""
7204
 
7205
- #: src/lib/src/Modules/Plugin/Strings.php:394
7206
  msgid "You may also enable GASP for logged in users"
7207
  msgstr ""
7208
 
7209
- #: src/lib/src/Modules/Plugin/Strings.php:395
7210
  msgid ""
7211
  "Since logged-in users would be expected to be vetted already, this is off by "
7212
  "default."
7213
  msgstr ""
7214
 
7215
- #: src/lib/src/Modules/Plugin/Strings.php:397
7216
  msgid "Protect your security plugin not just your WordPress site"
7217
  msgstr ""
7218
 
7219
- #: src/lib/src/Modules/Plugin/Strings.php:400
7220
  msgid "Get a view on what happens on your site, when it happens"
7221
  msgstr ""
7222
 
7223
- #: src/lib/src/Modules/Plugin/Strings.php:401
7224
  msgid "Audit Trail Viewer"
7225
  msgstr ""
7226
 
7227
- #: src/lib/src/Modules/Plugin/Strings.php:403
7228
  msgid "Take back full control of WordPress automatic updates"
7229
  msgstr ""
7230
 
7231
- #: src/lib/src/Modules/Plugin/Strings.php:404
7232
  msgid "Comments SPAM"
7233
  msgstr ""
7234
 
7235
- #: src/lib/src/Modules/Plugin/Strings.php:405
7236
  msgid "Block Bad IPs/Visitors"
7237
  msgstr ""
7238
 
7239
- #: src/lib/src/Modules/Plugin/Strings.php:406
7240
  msgid "Block comment SPAM and retain your privacy"
7241
  msgstr ""
7242
 
7243
- #: src/lib/src/Modules/Plugin/Strings.php:409
7244
  msgid "Automatically block malicious URLs and data sent to your site"
7245
  msgstr ""
7246
 
7247
- #: src/lib/src/Modules/Plugin/Strings.php:412
7248
  msgid "Control HTTP Security Headers"
7249
  msgstr ""
7250
 
7251
- #: src/lib/src/Modules/Plugin/Strings.php:414
7252
  msgid "Manage Visitor IP Address"
7253
  msgstr ""
7254
 
7255
- #: src/lib/src/Modules/Plugin/Strings.php:416
7256
  msgid "Harden the more loosely controlled settings of your site"
7257
  msgstr ""
7258
 
7259
- #: src/lib/src/Modules/Plugin/Strings.php:418
7260
  msgid ""
7261
  "Block brute force attacks and secure user identities with Two-Factor "
7262
  "Authentication"
7263
  msgstr ""
7264
 
7265
- #: src/lib/src/Modules/Plugin/Strings.php:419
7266
  msgid "Dashboard"
7267
  msgstr ""
7268
 
7269
- #: src/lib/src/Modules/Plugin/Strings.php:420
7270
  msgid "General Plugin Settings"
7271
  msgstr ""
7272
 
7273
- #: src/lib/src/Modules/Plugin/Strings.php:421
7274
  msgid "Statistics"
7275
  msgstr ""
7276
 
7277
- #: src/lib/src/Modules/Plugin/Strings.php:422
7278
  msgid "Summary of the main security actions taken by this plugin"
7279
  msgstr ""
7280
 
7281
- #: src/lib/src/Modules/Plugin/Strings.php:423
7282
  msgid "Stats Viewer"
7283
  msgstr ""
7284
 
7285
- #: src/lib/src/Modules/Plugin/Strings.php:424
7286
  msgid "Premium Support"
7287
  msgstr ""
7288
 
7289
- #: src/lib/src/Modules/Plugin/Strings.php:425
7290
  msgid "Premium Plugin Support Centre"
7291
  msgstr ""
7292
 
7293
- #: src/lib/src/Modules/Plugin/Strings.php:427
7294
  msgid ""
7295
  "Get true user sessions and control account sharing, session duration and "
7296
  "timeouts"
7297
  msgstr ""
7298
 
7299
- #: src/lib/src/Modules/Plugin/Strings.php:428
7300
  msgid "Two-Factor Authentication"
7301
  msgstr ""
7302
 
7303
- #: src/lib/src/Modules/Plugin/Strings.php:431
7304
  msgid "Dark Theme"
7305
  msgstr ""
7306
 
7307
- #: src/lib/src/Modules/Plugin/Strings.php:432
7308
  msgid "Once"
7309
  msgstr ""
7310
 
7311
- #: src/lib/src/Modules/Plugin/Strings.php:433
7312
  msgid "Twice"
7313
  msgstr ""
7314
 
7315
- #: src/lib/src/Modules/Plugin/Strings.php:434
7316
  msgid "Go To Security Dashboard"
7317
  msgstr ""
7318
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7319
  #: src/lib/src/Modules/SecurityAdmin/AdminNotices.php:42
7320
  #: src/lib/src/Modules/SecurityAdmin/AdminNotices.php:67
7321
  #, php-format
@@ -7436,12 +7627,6 @@ msgstr ""
7436
  msgid "Access Restriction Zones"
7437
  msgstr ""
7438
 
7439
- #: src/lib/src/Modules/SecurityAdmin/Strings.php:62
7440
- #: src/lib/src/Modules/SecurityAdmin/Strings.php:75
7441
- #: src/lib/src/Modules/SecurityAdmin/Strings.php:180
7442
- msgid "White Label"
7443
- msgstr ""
7444
-
7445
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:66
7446
  #, php-format
7447
  msgid "Rename and re-brand the %s plugin for your client site installations."
@@ -8427,18 +8612,18 @@ msgstr ""
8427
  msgid "Please contact your website administrator."
8428
  msgstr ""
8429
 
8430
- #: src/lib/src/Scans/Mal/Repair.php:77
8431
  #, php-format
8432
  msgid "%s not installed from WordPress.org."
8433
  msgstr ""
8434
 
8435
- #: src/lib/src/Scans/Mal/Repair.php:78 src/processors/hack_protect.php:283
8436
  #: src/processors/hackprotect_scan_apc.php:84
8437
  #: src/processors/hackprotect_scan_wpv.php:241
8438
  msgid "Plugin"
8439
  msgstr ""
8440
 
8441
- #: src/lib/src/Scans/Mal/Repair.php:85
8442
  msgid "Plugin developer doesn't use SVN tags for official releases."
8443
  msgstr ""
8444
 
@@ -8459,12 +8644,24 @@ msgstr ""
8459
  msgid "Abandoned"
8460
  msgstr ""
8461
 
8462
- #: src/lib/src/Tables/Build/ScanMal.php:32
8463
- #: src/processors/hackprotect_scan_mal.php:94
8464
  msgid "Potential Malware Detected"
8465
  msgstr ""
8466
 
8467
- #: src/lib/src/Tables/Build/ScanMal.php:39
 
 
 
 
 
 
 
 
 
 
 
 
8468
  msgid "Repair Unavailable"
8469
  msgstr ""
8470
 
@@ -8522,6 +8719,7 @@ msgid "Refresh"
8522
  msgstr ""
8523
 
8524
  #: src/lib/src/Tables/Render/Base.php:215
 
8525
  #: src/lib/src/Tables/Render/ScanWcf.php:29
8526
  msgid "Repair"
8527
  msgstr ""
@@ -8594,14 +8792,6 @@ msgstr ""
8594
  msgid "Deactivate"
8595
  msgstr ""
8596
 
8597
- #: src/lib/src/Tables/Render/ScanWpv.php:55
8598
- #: src/processors/hackprotect_scan_mal.php:138
8599
- #: src/processors/hackprotect_scan_wcf.php:112
8600
- #: src/processors/hackprotect_scan_wpv.php:201
8601
- #: src/processors/loginprotect_intent.php:285
8602
- msgid "More Info"
8603
- msgstr ""
8604
-
8605
  #: src/lib/src/Tables/Render/ScanWpv.php:75
8606
  msgid "Vulnerability"
8607
  msgstr ""
@@ -8619,20 +8809,20 @@ msgstr ""
8619
  msgid "Page"
8620
  msgstr ""
8621
 
8622
- #: src/lib/src/Utilities/ReCaptcha/TestRequest.php:42
8623
- #: src/lib/src/Utilities/ReCaptcha/TestRequest.php:49
8624
  msgid "Whoops."
8625
  msgstr ""
8626
 
8627
- #: src/lib/src/Utilities/ReCaptcha/TestRequest.php:42
8628
  msgid "Google reCAPTCHA was not submitted."
8629
  msgstr ""
8630
 
8631
- #: src/lib/src/Utilities/ReCaptcha/TestRequest.php:50
8632
  msgid "Google reCAPTCHA verification failed."
8633
  msgstr ""
8634
 
8635
- #: src/lib/src/Utilities/ReCaptcha/TestRequest.php:52
8636
  msgid "Maybe refresh the page and try again."
8637
  msgstr ""
8638
 
@@ -8911,29 +9101,29 @@ msgstr ""
8911
  msgid "Abandoned Plugin(s) Discovered On Your Site."
8912
  msgstr ""
8913
 
8914
- #: src/processors/hackprotect_scan_base.php:377
8915
  msgid "Run Scanner"
8916
  msgstr ""
8917
 
8918
- #: src/processors/hackprotect_scan_mal.php:120
8919
  #, php-format
8920
  msgid "The %s Malware Scanner found files with potential malware."
8921
  msgstr ""
8922
 
8923
- #: src/processors/hackprotect_scan_mal.php:122
8924
  msgid ""
8925
  "You must examine the file(s) carefully to determine whether suspicious code "
8926
  "is really present."
8927
  msgstr ""
8928
 
8929
- #: src/processors/hackprotect_scan_mal.php:123
8930
  #, php-format
8931
  msgid ""
8932
  "The %s Malware Scanner searches for common malware patterns and so false "
8933
  "positives (detection errors) are to be expected sometimes."
8934
  msgstr ""
8935
 
8936
- #: src/processors/hackprotect_scan_mal.php:124
8937
  #: src/processors/hackprotect_scan_ptg.php:592
8938
  #: src/processors/hackprotect_scan_ufc.php:115
8939
  #: src/processors/hackprotect_scan_wcf.php:98
@@ -8942,46 +9132,46 @@ msgstr ""
8942
  msgid "Site URL"
8943
  msgstr ""
8944
 
8945
- #: src/processors/hackprotect_scan_mal.php:132
8946
  #: src/processors/hackprotect_scan_wcf.php:106
8947
  #, php-format
8948
  msgid "%s has already attempted to repair the files."
8949
  msgstr ""
8950
 
8951
- #: src/processors/hackprotect_scan_mal.php:133
8952
  #: src/processors/hackprotect_scan_wcf.php:107
8953
  msgid ""
8954
  "But, you should always check these files to ensure everything is as you "
8955
  "expect."
8956
  msgstr ""
8957
 
8958
- #: src/processors/hackprotect_scan_mal.php:136
8959
  #: src/processors/hackprotect_scan_wcf.php:110
8960
  msgid ""
8961
  "You should review these files and replace them with official versions if "
8962
  "required."
8963
  msgstr ""
8964
 
8965
- #: src/processors/hackprotect_scan_mal.php:137
8966
  #: src/processors/hackprotect_scan_wcf.php:111
8967
  msgid ""
8968
  "Alternatively you can have the plugin attempt to repair/replace these files "
8969
  "automatically."
8970
  msgstr ""
8971
 
8972
- #: src/processors/hackprotect_scan_mal.php:143
8973
  #: src/processors/hackprotect_scan_ufc.php:131
8974
  #: src/processors/hackprotect_scan_wcf.php:117
8975
  msgid "We recommend you run the scanner to review your site"
8976
  msgstr ""
8977
 
8978
- #: src/processors/hackprotect_scan_mal.php:148
8979
  #: src/processors/hackprotect_scan_ufc.php:136
8980
  #: src/processors/hackprotect_scan_wcf.php:122
8981
  msgid "More Info On This Scanner"
8982
  msgstr ""
8983
 
8984
- #: src/processors/hackprotect_scan_mal.php:160
8985
  msgid "The following files contain suspected malware:"
8986
  msgstr ""
8987
 
@@ -9145,54 +9335,54 @@ msgstr ""
9145
  msgid "No custom message provided."
9146
  msgstr ""
9147
 
9148
- #: src/processors/ips.php:252
9149
  #, php-format
9150
  msgid "You've been blocked by the %s plugin"
9151
  msgstr ""
9152
 
9153
- #: src/processors/ips.php:259
9154
  #, php-format
9155
  msgid "Time remaining on black list: %s"
9156
  msgstr ""
9157
 
9158
- #: src/processors/ips.php:260
9159
  #, php-format
9160
  msgid "%s minute"
9161
  msgid_plural "%s minutes"
9162
  msgstr[0] ""
9163
  msgstr[1] ""
9164
 
9165
- #: src/processors/ips.php:262
9166
  #, php-format
9167
  msgid ""
9168
  "You tripped the security plugin defenses a total of %s times making you a "
9169
  "suspect."
9170
  msgstr ""
9171
 
9172
- #: src/processors/ips.php:263
9173
  msgid ""
9174
  "If you believe this to be in error, please contact the site owner and quote "
9175
  "your IP address below."
9176
  msgstr ""
9177
 
9178
- #: src/processors/ips.php:267
9179
  msgid "Auto-Unblock Your IP"
9180
  msgstr ""
9181
 
9182
- #: src/processors/ips.php:268
9183
  msgid ""
9184
  "You can automatically unblock your IP address by clicking the button below."
9185
  msgstr ""
9186
 
9187
- #: src/processors/ips.php:269
9188
  msgid "Unblock My IP Address"
9189
  msgstr ""
9190
 
9191
- #: src/processors/ips.php:281 src/processors/loginprotect_gasp.php:27
9192
  msgid "You MUST enable Javascript to be able to login"
9193
  msgstr ""
9194
 
9195
- #: src/processors/ips.php:505
9196
  msgid "No Label"
9197
  msgstr ""
9198
 
@@ -9208,11 +9398,11 @@ msgstr ""
9208
  msgid "Anonymous access to the WordPress Rest API has been restricted by %s."
9209
  msgstr ""
9210
 
9211
- #: src/processors/loginprotect_cooldown.php:22
9212
  msgid "Request Cooldown in effect."
9213
  msgstr ""
9214
 
9215
- #: src/processors/loginprotect_cooldown.php:24
9216
  #, php-format
9217
  msgid "You must wait %s seconds before attempting this action again."
9218
  msgstr ""
@@ -9719,10 +9909,6 @@ msgstr ""
9719
  msgid "The secret key is found in: %s"
9720
  msgstr ""
9721
 
9722
- #: src/processors/plugin_importexport.php:63
9723
- msgid "Import/Export"
9724
- msgstr ""
9725
-
9726
  #: src/processors/plugin_importexport.php:65
9727
  msgid "Turn On"
9728
  msgstr ""
@@ -9792,11 +9978,11 @@ msgstr ""
9792
  msgid "Handshake verification failed."
9793
  msgstr ""
9794
 
9795
- #: src/processors/sessions.php:94
9796
  msgid "You're already logged-in."
9797
  msgstr ""
9798
 
9799
- #: src/processors/sessions.php:98
9800
  msgid "Go To Admin"
9801
  msgstr ""
9802
 
@@ -9885,36 +10071,36 @@ msgid ""
9885
  "password."
9886
  msgstr ""
9887
 
9888
- #: src/processors/usermanagement_passwords.php:166
9889
  msgid ""
9890
  "Your security administrator has imposed requirements for password quality."
9891
  msgstr ""
9892
 
9893
- #: src/processors/usermanagement_passwords.php:167
9894
  msgid "Reason"
9895
  msgstr ""
9896
 
9897
- #: src/processors/usermanagement_passwords.php:232
9898
  #, php-format
9899
  msgid "Password length (%s) too short (min: %s characters)"
9900
  msgstr ""
9901
 
9902
- #: src/processors/usermanagement_passwords.php:286
9903
- #: src/processors/usermanagement_passwords.php:346
9904
  msgid "Please use a different password."
9905
  msgstr ""
9906
 
9907
- #: src/processors/usermanagement_passwords.php:287
9908
  msgid "This password has already been pwned."
9909
  msgstr ""
9910
 
9911
- #: src/processors/usermanagement_passwords.php:291
9912
- #: src/processors/usermanagement_passwords.php:351
9913
  #, php-format
9914
  msgid "%s times"
9915
  msgstr ""
9916
 
9917
- #: src/processors/usermanagement_passwords.php:347
9918
  msgid "This password has been pwned."
9919
  msgstr ""
9920
 
@@ -10186,17 +10372,17 @@ msgstr ""
10186
 
10187
  #: src/wizards/plugin.php:469 src/wizards/plugin.php:502
10188
  #: src/wizards/plugin.php:535 src/wizards/plugin.php:571
10189
- #: src/wizards/plugin.php:678
10190
  msgid "No changes were made as no option was selected"
10191
  msgstr ""
10192
 
10193
  #: src/wizards/plugin.php:482 src/wizards/plugin.php:515
10194
- #: src/wizards/plugin.php:550 src/wizards/plugin.php:694
10195
  msgid "Enabled"
10196
  msgstr ""
10197
 
10198
  #: src/wizards/plugin.php:486 src/wizards/plugin.php:519
10199
- #: src/wizards/plugin.php:554 src/wizards/plugin.php:698
10200
  #, php-format
10201
  msgid "%s setting could not be changed at this time."
10202
  msgstr ""
@@ -10209,11 +10395,11 @@ msgstr ""
10209
  msgid "Search item added."
10210
  msgstr ""
10211
 
10212
- #: src/wizards/plugin.php:660
10213
  msgid "All entries were deleted"
10214
  msgstr ""
10215
 
10216
- #: src/wizards/plugin.php:663
10217
  msgid "Please check the box to confirm deletion."
10218
  msgstr ""
10219
 
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: WPSF v2.0\n"
4
+ "POT-Creation-Date: 2019-09-30 17:43+0100\n"
5
+ "PO-Revision-Date: 2019-09-30 17:43+0100\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
  "Language: en_GB\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.2.4\n"
13
  "X-Poedit-KeywordsList: _wpsf__;gettext;gettext_noop;_wpsf_e;_n;_n:1,2;__;_e\n"
14
  "X-Poedit-Basepath: ..\n"
15
  "X-Poedit-SourceCharset: UTF-8\n"
37
 
38
  #: src/features/admin_access_restriction.php:351
39
  #: src/features/admin_access_restriction.php:364
40
+ #: src/lib/src/Modules/Plugin/Strings.php:399
41
+ #: src/lib/src/Modules/Plugin/Strings.php:401
42
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:35
43
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:38
44
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:102
96
  msgstr ""
97
 
98
  #: src/features/admin_access_restriction.php:420
99
+ #: src/features/autoupdates.php:168 src/features/hack_protect.php:754
100
+ #: src/features/hack_protect.php:775 src/features/hack_protect.php:796
101
+ #: src/features/hack_protect.php:817 src/features/hack_protect.php:838
102
+ #: src/features/hack_protect.php:859 src/features/insights.php:274
103
+ #: src/features/insights.php:662 src/features/insights.php:675
104
+ #: src/features/insights.php:702 src/features/insights.php:715
105
+ #: src/features/insights.php:741 src/features/insights.php:753
106
  #: src/features/lockdown.php:81 src/features/user_management.php:313
107
  #, php-format
108
  msgid "Go To %s"
109
  msgstr ""
110
 
111
  #: src/features/admin_access_restriction.php:420
112
+ #: src/features/autoupdates.php:168 src/features/hack_protect.php:754
113
+ #: src/features/hack_protect.php:775 src/features/hack_protect.php:796
114
+ #: src/features/hack_protect.php:817 src/features/hack_protect.php:838
115
+ #: src/features/hack_protect.php:859 src/features/insights.php:275
116
+ #: src/features/insights.php:753 src/features/lockdown.php:81
117
+ #: src/features/user_management.php:313 src/lib/src/Modules/Base/Strings.php:36
118
+ #: src/lib/src/Modules/Base/Strings.php:53
119
  #: src/lib/src/Modules/Insights/Strings.php:66
120
  msgid "Options"
121
  msgstr ""
133
  msgid "You'll just need to authenticate first and try again."
134
  msgstr ""
135
 
136
+ #: src/features/audit_trail.php:56
137
  #, php-format
138
  msgid "[%s] Audit Trail Entries"
139
  msgstr ""
140
 
141
+ #: src/features/audit_trail.php:120
142
  msgid "Activity Audit Log"
143
  msgstr ""
144
 
145
+ #: src/features/audit_trail.php:121
146
  msgid "Track Activity: What, Who, When, Where"
147
  msgstr ""
148
 
149
+ #: src/features/audit_trail.php:134
150
  msgid "users"
151
  msgstr ""
152
 
153
+ #: src/features/audit_trail.php:135
154
  msgid "plugins"
155
  msgstr ""
156
 
157
+ #: src/features/audit_trail.php:136
158
  msgid "themes"
159
  msgstr ""
160
 
161
+ #: src/features/audit_trail.php:137
162
  msgid "posts"
163
  msgstr ""
164
 
165
+ #: src/features/audit_trail.php:138
166
  msgid "emails"
167
  msgstr ""
168
 
169
+ #: src/features/audit_trail.php:143 src/features/audit_trail.php:152
170
  #: src/lib/src/Modules/AuditTrail/Strings.php:141
171
  msgid "Audit Areas"
172
  msgstr ""
173
 
174
+ #: src/features/audit_trail.php:145
175
  msgid "All important events on your site are being logged"
176
  msgstr ""
177
 
178
+ #: src/features/audit_trail.php:154
179
  #, php-format
180
  msgid "No areas are set to be audited: %s"
181
  msgstr ""
182
 
183
+ #: src/features/audit_trail.php:161
184
  msgid "Audit Events"
185
  msgstr ""
186
 
187
+ #: src/features/audit_trail.php:163
188
  #, php-format
189
  msgid "Important events aren't being audited: %s"
190
  msgstr ""
191
 
192
+ #: src/features/audit_trail.php:170 src/features/insights.php:80
193
+ #: src/features/insights.php:292 src/lib/src/Modules/AuditTrail/Strings.php:122
194
+ #: src/lib/src/Modules/Plugin/Strings.php:402 src/wizards/plugin.php:481
195
  #: src/wizards/plugin.php:486
196
  msgid "Audit Trail"
197
  msgstr ""
198
 
199
+ #: src/features/audit_trail.php:172
200
  #, php-format
201
  msgid "Maximum Audit Trail entries limited to %s"
202
  msgstr ""
204
  #: src/features/autoupdates.php:157 src/features/autoupdates.php:189
205
  #: src/lib/src/Modules/Autoupdates/Strings.php:25
206
  #: src/lib/src/Modules/HackGuard/Strings.php:226
207
+ #: src/lib/src/Modules/Plugin/Strings.php:405
208
  msgid "Automatic Updates"
209
  msgstr ""
210
 
273
  msgid "%s isn't automatically updated"
274
  msgstr ""
275
 
276
+ #: src/features/base.php:809 src/lib/src/Modules/Base/BaseModCon.php:732
277
  #: src/wizards/plugin.php:482 src/wizards/plugin.php:515
278
+ #: src/wizards/plugin.php:550 src/wizards/plugin.php:695
279
  msgid "Disabled"
280
  msgstr ""
281
 
282
+ #: src/features/base.php:1118 src/lib/src/Modules/Base/BaseModCon.php:1033
283
  msgid ""
284
  "Unfortunately your WordPress and/or PHP versions are too old to support this "
285
  "feature."
286
  msgstr ""
287
 
288
+ #: src/features/base.php:1273 src/lib/src/Modules/Base/BaseModCon.php:1187
289
  msgid "You don't currently have permission to save settings."
290
  msgstr ""
291
 
292
+ #: src/features/base.php:1367 src/lib/src/Modules/Base/BaseModCon.php:1281
293
  msgid "Password values do not match."
294
  msgstr ""
295
 
296
+ #: src/features/base.php:1593 src/lib/src/Modules/AuditTrail/Strings.php:197
297
+ #: src/lib/src/Modules/Base/BaseModCon.php:1507
298
  #: src/lib/src/Modules/HackGuard/Strings.php:195
299
  #: src/lib/src/Modules/HackGuard/Strings.php:269
300
  #: src/lib/src/Modules/LoginGuard/Strings.php:265
306
  msgid "Default"
307
  msgstr ""
308
 
309
+ #: src/features/base.php:1600 src/lib/src/Modules/Base/BaseModCon.php:1514
310
  msgid "For more information:"
311
  msgstr ""
312
 
313
+ #: src/features/base.php:1601 src/lib/src/Modules/Base/BaseModCon.php:1515
314
+ #: src/lib/src/Modules/Plugin/Strings.php:432
315
  msgid "Support Forums"
316
  msgstr ""
317
 
318
+ #: src/features/base_wpsf.php:402
319
  msgid "Module Disabled"
320
  msgstr ""
321
 
322
+ #: src/features/base_wpsf.php:404
323
  msgid "All features of this module are completely disabled"
324
  msgstr ""
325
 
389
  msgstr ""
390
 
391
  #: src/features/firewall.php:86 src/features/firewall.php:98
392
+ #: src/lib/src/Modules/Events/Strings.php:174
393
+ #: src/lib/src/Modules/Events/Strings.php:178
394
+ #: src/lib/src/Modules/Events/Strings.php:182
395
+ #: src/lib/src/Modules/Events/Strings.php:186
396
+ #: src/lib/src/Modules/Events/Strings.php:190
397
+ #: src/lib/src/Modules/Events/Strings.php:194
398
+ #: src/lib/src/Modules/Events/Strings.php:198
399
+ #: src/lib/src/Modules/Events/Strings.php:202
400
  #: src/lib/src/Modules/Firewall/Strings.php:24
401
+ #: src/lib/src/Modules/Plugin/Strings.php:411
402
  msgid "Firewall"
403
  msgstr ""
404
 
426
  msgid "Firewall rules aren't applied to admins"
427
  msgstr ""
428
 
429
+ #: src/features/hack_protect.php:165
430
  #, php-format
431
  msgid "%s per day"
432
  msgstr ""
433
 
434
+ #: src/features/hack_protect.php:479
435
  msgid "Re-install First"
436
  msgstr ""
437
 
438
+ #: src/features/hack_protect.php:480
439
  msgid "Then Activate"
440
  msgstr ""
441
 
442
+ #: src/features/hack_protect.php:482 src/features/license.php:551
443
+ #: src/lib/src/Modules/Base/Strings.php:42 src/lib/src/Tables/Build/Ip.php:54
444
  #: src/lib/src/Tables/Build/ScanBase.php:62
445
  #: src/lib/src/Tables/Build/Sessions.php:68
446
  #: src/lib/src/Tables/Build/Traffic.php:109
447
  msgid "Yes"
448
  msgstr ""
449
 
450
+ #: src/features/hack_protect.php:482
451
  msgid "Re-Install It"
452
  msgstr ""
453
 
454
+ #: src/features/hack_protect.php:483
455
  msgid "Activate Only"
456
  msgstr ""
457
 
458
+ #: src/features/hack_protect.php:484
459
  msgid "Cancel"
460
  msgstr ""
461
 
462
+ #: src/features/hack_protect.php:528 src/features/license.php:543
463
+ #: src/lib/src/Modules/Base/Strings.php:44
464
+ #: src/lib/src/Modules/Plugin/Strings.php:325
465
  #: src/processors/hack_protect.php:87 src/processors/hack_protect.php:117
466
  msgid "Never"
467
  msgstr ""
468
 
469
+ #: src/features/hack_protect.php:529
470
  #, php-format
471
  msgid "Last Scan Time: %s"
472
  msgstr ""
473
 
474
+ #: src/features/hack_protect.php:545
475
  #, php-format
476
  msgid ""
477
  "Sorry, this feature is not available because we cannot write to disk at this "
478
  "location: \"%s\""
479
  msgstr ""
480
 
481
+ #: src/features/hack_protect.php:551
482
  #, php-format
483
  msgid "Not available because the %s extension is not available."
484
  msgstr ""
485
 
486
+ #: src/features/hack_protect.php:554
487
  msgid ""
488
  "Not available because PHP/WordPress doesn't have direct filesystem access."
489
  msgstr ""
490
 
491
+ #: src/features/hack_protect.php:559
492
  #, php-format
493
  msgid "The %s file isn't writable and so can't be further protected."
494
  msgstr ""
495
 
496
+ #: src/features/hack_protect.php:744 src/features/insights.php:290
497
  msgid "Scans"
498
  msgstr ""
499
 
500
+ #: src/features/hack_protect.php:752
501
  msgid "Core File scanner is not enabled."
502
  msgstr ""
503
 
504
+ #: src/features/hack_protect.php:755
505
  msgid "Automatic WordPress Core File scanner should be turned-on."
506
  msgstr ""
507
 
508
+ #: src/features/hack_protect.php:761
509
  msgid "Modified WordPress core files found."
510
  msgstr ""
511
 
512
+ #: src/features/hack_protect.php:763 src/features/hack_protect.php:784
513
+ #: src/features/hack_protect.php:805 src/features/hack_protect.php:826
514
+ #: src/features/hack_protect.php:847 src/features/hack_protect.php:868
515
  msgid "Run Scan"
516
  msgstr ""
517
 
518
+ #: src/features/hack_protect.php:764
519
  msgid "Scan WP core files and repair any files that are flagged as modified."
520
  msgstr ""
521
 
522
+ #: src/features/hack_protect.php:773
523
  msgid "Unrecognised File scanner is not enabled."
524
  msgstr ""
525
 
526
+ #: src/features/hack_protect.php:776
527
  msgid "Automatic scanning for non-WordPress core files is recommended."
528
  msgstr ""
529
 
530
+ #: src/features/hack_protect.php:782
531
  msgid "Unrecognised files found in WordPress Core directory."
532
  msgstr ""
533
 
534
+ #: src/features/hack_protect.php:785
535
  msgid ""
536
  "Scan and remove any files that are not meant to be in the WP core "
537
  "directories."
538
  msgstr ""
539
 
540
+ #: src/features/hack_protect.php:794
541
  msgid "Automatic Plugin/Themes Guard is not enabled."
542
  msgstr ""
543
 
544
+ #: src/features/hack_protect.php:797
545
  msgid "Automatic detection of plugin/theme modifications is recommended."
546
  msgstr ""
547
 
548
+ #: src/features/hack_protect.php:803
549
  msgid "A plugin/theme was found to have been modified."
550
  msgstr ""
551
 
552
+ #: src/features/hack_protect.php:806
553
  msgid "Reviewing modifications to your plugins/themes is recommended."
554
  msgstr ""
555
 
556
+ #: src/features/hack_protect.php:815
557
  msgid "Vulnerability Scanner is not enabled."
558
  msgstr ""
559
 
560
+ #: src/features/hack_protect.php:818
561
  msgid "Automatic detection of vulnerabilities is recommended."
562
  msgstr ""
563
 
564
+ #: src/features/hack_protect.php:824
565
  msgid "At least 1 item has known vulnerabilities."
566
  msgstr ""
567
 
568
+ #: src/features/hack_protect.php:827
569
  msgid ""
570
  "Items with known vulnerabilities should be updated, removed, or replaced."
571
  msgstr ""
572
 
573
+ #: src/features/hack_protect.php:836
574
  msgid "Abandoned Plugins Scanner is not enabled."
575
  msgstr ""
576
 
577
+ #: src/features/hack_protect.php:839
578
  msgid "Automatic detection of abandoned plugins is recommended."
579
  msgstr ""
580
 
581
+ #: src/features/hack_protect.php:845
582
  msgid "At least 1 plugin on your site is abandoned."
583
  msgstr ""
584
 
585
+ #: src/features/hack_protect.php:848
586
  msgid ""
587
  "Plugins that have been abandoned represent a potential risk to your site."
588
  msgstr ""
589
 
590
+ #: src/features/hack_protect.php:857 src/features/hack_protect.php:1000
591
+ #: src/features/hack_protect.php:1012
592
  #, php-format
593
  msgid "%s Scanner is not enabled."
594
  msgstr ""
595
 
596
+ #: src/features/hack_protect.php:860
597
  msgid "Automatic detection of Malware is recommended."
598
  msgstr ""
599
 
600
+ #: src/features/hack_protect.php:866
601
  msgid "At least 1 file with potential Malware has been discovered."
602
  msgstr ""
603
 
604
+ #: src/features/hack_protect.php:869
605
  msgid ""
606
  "Files identified as potential malware should be examined as soon as possible."
607
  msgstr ""
608
 
609
+ #: src/features/hack_protect.php:893
610
  #: src/lib/src/Modules/HackGuard/Strings.php:94
611
+ #: src/lib/src/Modules/Plugin/Strings.php:413
612
  msgid "Hack Guard"
613
  msgstr ""
614
 
615
+ #: src/features/hack_protect.php:894
616
  msgid "Threats/Intrusions Detection & Repair"
617
  msgstr ""
618
 
619
+ #: src/features/hack_protect.php:906
620
  msgid "Scan Frequency"
621
  msgstr ""
622
 
623
+ #: src/features/hack_protect.php:909
624
  msgid "Automatic scanners run more than once per day"
625
  msgstr ""
626
 
627
+ #: src/features/hack_protect.php:910
628
  msgid "Automatic scanners only run once per day"
629
  msgstr ""
630
 
631
+ #: src/features/hack_protect.php:917
632
  msgid "WP Core File Scan"
633
  msgstr ""
634
 
635
+ #: src/features/hack_protect.php:920
636
  msgid "Core files scanned regularly for hacks"
637
  msgstr ""
638
 
639
+ #: src/features/hack_protect.php:921
640
  msgid "Core files are never scanned for hacks!"
641
  msgstr ""
642
 
643
+ #: src/features/hack_protect.php:927
644
  msgid "WP Core File Repair"
645
  msgstr ""
646
 
647
+ #: src/features/hack_protect.php:930
648
  msgid "Core files are automatically repaired"
649
  msgstr ""
650
 
651
+ #: src/features/hack_protect.php:931
652
  msgid "Core files aren't automatically repaired!"
653
  msgstr ""
654
 
655
+ #: src/features/hack_protect.php:939 src/lib/src/Modules/Events/Strings.php:107
656
+ #: src/lib/src/Modules/Events/Strings.php:131
657
  #: src/lib/src/Modules/HackGuard/Strings.php:26
658
  #: src/lib/src/Modules/HackGuard/Strings.php:118
659
  msgid "Unrecognised Files"
660
  msgstr ""
661
 
662
+ #: src/features/hack_protect.php:942
663
  msgid "Core directories scanned regularly for unrecognised files"
664
  msgstr ""
665
 
666
+ #: src/features/hack_protect.php:943
667
  msgid "WP Core is never scanned for unrecognised files!"
668
  msgstr ""
669
 
670
+ #: src/features/hack_protect.php:949
671
  msgid "Unrecognised Files Removal"
672
  msgstr ""
673
 
674
+ #: src/features/hack_protect.php:952
675
  msgid "Unrecognised files are automatically removed"
676
  msgstr ""
677
 
678
+ #: src/features/hack_protect.php:953
679
  msgid "Unrecognised files aren't automatically removed!"
680
  msgstr ""
681
 
682
+ #: src/features/hack_protect.php:961
683
  msgid "Vulnerability Scan"
684
  msgstr ""
685
 
686
+ #: src/features/hack_protect.php:964
687
  msgid "Regularly scanning for known vulnerabilities"
688
  msgstr ""
689
 
690
+ #: src/features/hack_protect.php:965
691
  msgid "Plugins/Themes never scanned for vulnerabilities!"
692
  msgstr ""
693
 
694
+ #: src/features/hack_protect.php:971
695
  msgid "Auto Update"
696
  msgstr ""
697
 
698
+ #: src/features/hack_protect.php:974
699
  msgid "Vulnerable items are automatically updated"
700
  msgstr ""
701
 
702
+ #: src/features/hack_protect.php:975
703
  msgid "Vulnerable items aren't automatically updated!"
704
  msgstr ""
705
 
706
+ #: src/features/hack_protect.php:984 src/lib/src/Modules/Events/Strings.php:103
707
+ #: src/lib/src/Modules/Events/Strings.php:127
708
  #: src/lib/src/Modules/HackGuard/Strings.php:24
709
  msgid "Plugin/Theme Guard"
710
  msgstr ""
711
 
712
+ #: src/features/hack_protect.php:987
713
  msgid "Plugins and Themes are guarded against tampering"
714
  msgstr ""
715
 
716
+ #: src/features/hack_protect.php:988
717
  msgid "Plugins and Themes are never scanned for tampering!"
718
  msgstr ""
719
 
720
+ #: src/features/hack_protect.php:999 src/features/hack_protect.php:1011
721
  #, php-format
722
  msgid "%s Scanner is enabled."
723
  msgstr ""
730
  msgid "Protect Visitors With Powerful HTTP Headers"
731
  msgstr ""
732
 
733
+ #: src/features/headers.php:147 src/lib/src/Modules/Plugin/Strings.php:414
734
  msgid "HTTP Headers"
735
  msgstr ""
736
 
754
  msgid "Content Security Policies aren't active"
755
  msgstr ""
756
 
757
+ #: src/features/insights.php:81
758
  msgid "Audit Trail Filters"
759
  msgstr ""
760
 
761
+ #: src/features/insights.php:82 src/features/insights.php:176
762
  msgid "Providing a username will cause the 'logged-in' filter to be ignored."
763
  msgstr ""
764
 
765
+ #: src/features/insights.php:83 src/features/insights.php:174
766
  msgid "Exclude Your Current IP"
767
  msgstr ""
768
 
769
+ #: src/features/insights.php:84 src/features/insights.php:175
770
  msgid "Exclude Your IP From Results"
771
  msgstr ""
772
 
773
+ #: src/features/insights.php:85
774
  msgid "Context"
775
  msgstr ""
776
 
777
+ #: src/features/insights.php:86 src/lib/src/Modules/AuditTrail/Strings.php:97
778
+ msgid "Event"
779
+ msgstr ""
780
+
781
+ #: src/features/insights.php:87
782
  msgid "show results that occurred after"
783
  msgstr ""
784
 
785
+ #: src/features/insights.php:88
786
  msgid "show results that occurred before"
787
  msgstr ""
788
 
789
+ #: src/features/insights.php:110
790
  #, php-format
791
  msgid "Offenses required for IP block: %s"
792
  msgstr ""
793
 
794
+ #: src/features/insights.php:114
795
  #, php-format
796
  msgid "Black listed IPs auto-expire after: %s"
797
  msgstr ""
798
 
799
+ #: src/features/insights.php:121 src/lib/src/Modules/Plugin/Strings.php:380
800
  msgid "IP Whitelist"
801
  msgstr ""
802
 
803
+ #: src/features/insights.php:122
804
  msgid "IP Blacklist"
805
  msgstr ""
806
 
807
+ #: src/features/insights.php:123
808
  #, php-format
809
  msgid "IP addresses that are never blocked by %s."
810
  msgstr ""
811
 
812
+ #: src/features/insights.php:124
813
  #, php-format
814
  msgid "IP addresses that have tripped %s defenses."
815
  msgstr ""
816
 
817
+ #: src/features/insights.php:125
818
  msgid "Enter IP address to block"
819
  msgstr ""
820
 
821
+ #: src/features/insights.php:126
822
  msgid "Enter IP address to whitelist"
823
  msgstr ""
824
 
825
+ #: src/features/insights.php:127
826
  msgid "Label for IP"
827
  msgstr ""
828
 
829
+ #: src/features/insights.php:128
830
  msgid "New IP"
831
  msgstr ""
832
 
833
+ #: src/features/insights.php:129
834
  msgid "Block IP"
835
  msgstr ""
836
 
837
+ #: src/features/insights.php:147
838
  msgid "Administrator Notes"
839
  msgstr ""
840
 
841
+ #: src/features/insights.php:148
842
  msgid "Use this feature to make ongoing notes and to-dos"
843
  msgstr ""
844
 
845
+ #: src/features/insights.php:149
846
  msgid "Add Note"
847
  msgstr ""
848
 
849
+ #: src/features/insights.php:150
850
  msgid "New Note"
851
  msgstr ""
852
 
853
+ #: src/features/insights.php:151
854
  msgid "Enter new note here"
855
  msgstr ""
856
 
857
+ #: src/features/insights.php:169
858
  msgid "Traffic Table Filters"
859
  msgstr ""
860
 
861
+ #: src/features/insights.php:170
862
  msgid "Traffic Watch"
863
  msgstr ""
864
 
865
+ #: src/features/insights.php:171
866
  msgid "Watch and review requests to your site"
867
  msgstr ""
868
 
869
+ #: src/features/insights.php:172 src/lib/src/Tables/Build/Traffic.php:148
870
  #: src/lib/src/Tables/Render/Traffic.php:14
871
  msgid "Response"
872
  msgstr ""
873
 
874
+ #: src/features/insights.php:173
875
  msgid "Page/Path Contains"
876
  msgstr ""
877
 
878
+ #: src/features/insights.php:212
879
  msgid "Sessions Table Filters"
880
  msgstr ""
881
 
882
+ #: src/features/insights.php:213 src/processors/events.php:53
883
  msgid "User Sessions"
884
  msgstr ""
885
 
886
+ #: src/features/insights.php:214
887
  msgid "Review and manage current user sessions"
888
  msgstr ""
889
 
890
+ #: src/features/insights.php:215
891
  msgid ""
892
  "Some sessions may have expired but haven't been automatically cleaned from "
893
  "the database yet"
894
  msgstr ""
895
 
896
+ #: src/features/insights.php:216 src/lib/src/Modules/AuditTrail/Strings.php:99
897
+ #: src/lib/src/Modules/Base/Strings.php:49
898
  #: src/lib/src/Modules/UserManagement/Strings.php:16
899
  #: src/lib/src/Tables/Render/AdminNotes.php:31
900
  #: src/processors/loginprotect_intentprovider_backup.php:164
904
  msgid "Username"
905
  msgstr ""
906
 
907
+ #: src/features/insights.php:268
908
  msgid "Recent Events Log"
909
  msgstr ""
910
 
911
+ #: src/features/insights.php:269
912
  msgid "Security Notices"
913
  msgstr ""
914
 
915
+ #: src/features/insights.php:270
916
  msgid "Potential security issues on your site right now"
917
  msgstr ""
918
 
919
+ #: src/features/insights.php:271
920
  msgid "Plugin Configuration Summary"
921
  msgstr ""
922
 
923
+ #: src/features/insights.php:272
924
  msgid "click to toggle"
925
  msgstr ""
926
 
927
+ #: src/features/insights.php:277 src/lib/src/Modules/License/Strings.php:31
928
  msgid "Key"
929
  msgstr ""
930
 
931
+ #: src/features/insights.php:278
932
  msgid "Positive Security"
933
  msgstr ""
934
 
935
+ #: src/features/insights.php:279
936
  msgid "Potential Warning"
937
  msgstr ""
938
 
939
+ #: src/features/insights.php:280
940
  msgid "Potential Danger"
941
  msgstr ""
942
 
943
+ #: src/features/insights.php:281
944
  msgid "Information"
945
  msgstr ""
946
 
947
+ #: src/features/insights.php:288 src/lib/src/Modules/Base/Strings.php:39
948
  msgid "Settings"
949
  msgstr ""
950
 
951
+ #: src/features/insights.php:289
952
  msgid "Overview"
953
  msgstr ""
954
 
955
+ #: src/features/insights.php:291
956
  msgid "IP Lists"
957
  msgstr ""
958
 
959
+ #: src/features/insights.php:293 src/features/user_management.php:291
960
  #: src/lib/src/Modules/AuditTrail/Strings.php:90
961
  msgid "Users"
962
  msgstr ""
963
 
964
+ #: src/features/insights.php:294 src/features/insights.php:302
965
  msgid "Pro"
966
  msgstr ""
967
 
968
+ #: src/features/insights.php:295
969
  msgid "Traffic"
970
  msgstr ""
971
 
972
+ #: src/features/insights.php:296
973
  msgid "Notes"
974
  msgstr ""
975
 
976
+ #: src/features/insights.php:298 src/lib/src/Modules/Plugin/Strings.php:80
977
+ #: src/lib/src/Modules/Plugin/Strings.php:85
978
  msgid "Import"
979
  msgstr ""
980
 
981
+ #: src/features/insights.php:298 src/lib/src/Modules/Plugin/Strings.php:80
982
+ #: src/lib/src/Modules/Plugin/Strings.php:85
983
  msgid "Export"
984
  msgstr ""
985
 
986
+ #: src/features/insights.php:480 src/processors/plugin_importexport.php:74
987
  msgid "Downloading file, please wait..."
988
  msgstr ""
989
 
990
+ #: src/features/insights.php:481 src/processors/plugin_importexport.php:75
991
  msgid "There was a problem downloading the file."
992
  msgstr ""
993
 
994
+ #: src/features/insights.php:482
995
  msgid "Please select an action to perform."
996
  msgstr ""
997
 
998
+ #: src/features/insights.php:483 src/processors/hackprotect_scan_ptg.php:157
999
  msgid "Are you sure?"
1000
  msgstr ""
1001
 
1002
+ #: src/features/insights.php:577
1003
  msgid "Site"
1004
  msgstr ""
1005
 
1006
+ #: src/features/insights.php:601
1007
  msgid "SSL certificate for this site has expired."
1008
  msgstr ""
1009
 
1010
+ #: src/features/insights.php:604
1011
  #, php-format
1012
  msgid "SSL certificate will expire soon (in %s days)"
1013
  msgstr ""
1014
 
1015
+ #: src/features/insights.php:611
1016
  msgid "Check or renew your SSL certificate."
1017
  msgstr ""
1018
 
1019
+ #: src/features/insights.php:634
1020
  msgid "DB Password appears to be weak."
1021
  msgstr ""
1022
 
1023
+ #: src/features/insights.php:636
1024
  msgid "The database password should be strong."
1025
  msgstr ""
1026
 
1027
+ #: src/features/insights.php:651 src/features/insights.php:662
1028
  #: src/lib/src/Modules/AuditTrail/Strings.php:91
1029
  #: src/lib/src/Modules/AuditTrail/Strings.php:213
1030
  #: src/lib/src/Modules/AuditTrail/Strings.php:214
1033
  msgid "Plugins"
1034
  msgstr ""
1035
 
1036
+ #: src/features/insights.php:659
1037
  msgid "Inactive"
1038
  msgstr ""
1039
 
1040
+ #: src/features/insights.php:660
1041
  #, php-format
1042
  msgid "%s inactive plugin(s)"
1043
  msgstr ""
1044
 
1045
+ #: src/features/insights.php:663
1046
  msgid "Unused plugins should be removed."
1047
  msgstr ""
1048
 
1049
+ #: src/features/insights.php:673
1050
  #, php-format
1051
  msgid "%s plugin update(s)"
1052
  msgstr ""
1053
 
1054
+ #: src/features/insights.php:675 src/features/insights.php:715
1055
+ #: src/features/insights.php:741
1056
  msgid "Updates"
1057
  msgstr ""
1058
 
1059
+ #: src/features/insights.php:676 src/features/insights.php:716
1060
+ #: src/features/insights.php:742
1061
  msgid "Updates should be applied as early as possible."
1062
  msgstr ""
1063
 
1064
+ #: src/features/insights.php:691 src/features/insights.php:702
1065
  #: src/lib/src/Modules/AuditTrail/Strings.php:92
1066
  #: src/lib/src/Modules/AuditTrail/Strings.php:219
1067
  #: src/lib/src/Modules/AuditTrail/Strings.php:220
1070
  msgid "Themes"
1071
  msgstr ""
1072
 
1073
+ #: src/features/insights.php:700
1074
  #, php-format
1075
  msgid "%s inactive themes(s)"
1076
  msgstr ""
1077
 
1078
+ #: src/features/insights.php:703
1079
  msgid "Unused themes should be removed."
1080
  msgstr ""
1081
 
1082
+ #: src/features/insights.php:713
1083
  #, php-format
1084
  msgid "%s theme update(s)"
1085
  msgstr ""
1086
 
1087
+ #: src/features/insights.php:731
1088
  msgid "WordPress Core"
1089
  msgstr ""
1090
 
1091
+ #: src/features/insights.php:739
1092
  msgid "WordPress Core has an update available."
1093
  msgstr ""
1094
 
1095
+ #: src/features/insights.php:751
1096
  msgid "WordPress does not automatically install updates."
1097
  msgstr ""
1098
 
1099
+ #: src/features/insights.php:754
1100
  msgid "Minor WordPress upgrades should be applied automatically."
1101
  msgstr ""
1102
 
1103
+ #: src/features/insights.php:780 src/processors/events.php:45
1104
  msgid "Login Blocks"
1105
  msgstr ""
1106
 
1107
+ #: src/features/insights.php:782
1108
  msgid "Total login attempts blocked."
1109
  msgstr ""
1110
 
1111
+ #: src/features/insights.php:785 src/processors/events.php:41
1112
  msgid "Firewall Blocks"
1113
  msgstr ""
1114
 
1115
+ #: src/features/insights.php:787
1116
  msgid "Total requests blocked by firewall rules."
1117
  msgstr ""
1118
 
1119
+ #: src/features/insights.php:790 src/processors/events.php:33
1120
  msgid "Comment Blocks"
1121
  msgstr ""
1122
 
1123
+ #: src/features/insights.php:796
1124
  msgid "Total SPAM comments blocked."
1125
  msgstr ""
1126
 
1127
+ #: src/features/insights.php:799 src/lib/src/Tables/Render/IpBase.php:23
1128
  #: src/lib/src/Tables/Render/IpBlack.php:14
1129
  msgid "Offenses"
1130
  msgstr ""
1131
 
1132
+ #: src/features/insights.php:801
1133
  msgid "Total offenses against the site."
1134
  msgstr ""
1135
 
1136
+ #: src/features/insights.php:804 src/processors/events.php:57
1137
  msgid "IP Blocks"
1138
  msgstr ""
1139
 
1140
+ #: src/features/insights.php:806
1141
  msgid "Total connections blocked/killed after too many offenses."
1142
  msgstr ""
1143
 
1144
+ #: src/features/insights.php:809
1145
  msgid "Blacklist IPs"
1146
  msgstr ""
1147
 
1148
+ #: src/features/insights.php:817
1149
  msgid "Current IP addresses with offenses against the site."
1150
  msgstr ""
1151
 
1152
+ #: src/features/insights.php:863
1153
  msgid "Not yet recorded"
1154
  msgstr ""
1155
 
1156
+ #: src/features/ips.php:91 src/lib/src/Modules/HackGuard/Strings.php:45
1157
  #: src/lib/src/Modules/HackGuard/Strings.php:204
1158
  #: src/lib/src/Modules/Headers/Strings.php:140
1159
  #: src/lib/src/Modules/LoginGuard/Strings.php:81
1163
  #: src/lib/src/Modules/LoginGuard/Strings.php:213
1164
  #: src/lib/src/Modules/LoginGuard/Strings.php:221
1165
  #: src/lib/src/Modules/LoginGuard/Strings.php:235
1166
+ #: src/lib/src/Modules/Plugin/Strings.php:101
1167
+ #: src/lib/src/Modules/Plugin/Strings.php:105
1168
+ #: src/lib/src/Modules/Plugin/Strings.php:201
1169
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:120
1170
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:139
1171
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:146
1176
  msgid "Note"
1177
  msgstr ""
1178
 
1179
+ #: src/features/ips.php:91
1180
  msgid "IP blocking is turned-off because the offenses limit is set to 0."
1181
  msgstr ""
1182
 
1183
+ #: src/features/ips.php:99
1184
  msgid "Since the offenses limit is set to 0, these options have no effect."
1185
  msgstr ""
1186
 
1187
+ #: src/features/ips.php:103
1188
  msgid ""
1189
  "Your User Agent appears to be empty. We recommend not turning on this option."
1190
  msgstr ""
1191
 
1192
+ #: src/features/ips.php:121 src/features/ips.php:128
1193
  #: src/lib/src/Modules/Firewall/Strings.php:138
1194
  #: src/lib/src/Modules/HackGuard/Strings.php:259
1195
  #: src/lib/src/Modules/HackGuard/Strings.php:283
1196
  #: src/lib/src/Modules/HackGuard/Strings.php:284
1197
+ #: src/lib/src/Modules/HackGuard/Strings.php:367
1198
  #: src/lib/src/Modules/IPs/Strings.php:66
1199
  #: src/lib/src/Modules/Lockdown/Strings.php:130
1200
  #: src/lib/src/Modules/Lockdown/Strings.php:143
1201
  #: src/lib/src/Modules/Plugin/AdminNotices.php:88
1202
+ #: src/lib/src/Modules/Plugin/Strings.php:217
1203
  #: src/lib/src/Modules/Traffic/Strings.php:54
1204
  #: src/processors/hackprotect_scan_apc.php:100
1205
+ #: src/processors/hackprotect_scan_mal.php:119
1206
  #: src/processors/hackprotect_scan_ptg.php:617
1207
  #: src/processors/hackprotect_scan_ufc.php:85
1208
  #: src/processors/hackprotect_scan_wcf.php:71
1212
  msgid "Warning"
1213
  msgstr ""
1214
 
1215
+ #: src/features/ips.php:122
1216
  msgid ""
1217
  "Repeated login attempts that fail will result in a complete ban of your IP "
1218
  "Address."
1219
  msgstr ""
1220
 
1221
+ #: src/features/ips.php:129
1222
  #, php-format
1223
  msgid ""
1224
  "You have %s remaining offenses(s) against this site and then your IP address "
1225
  "will be completely blocked."
1226
  msgstr ""
1227
 
1228
+ #: src/features/ips.php:130
1229
  msgid "Seriously, stop repeating what you are doing or you will be locked out."
1230
  msgstr ""
1231
 
 
 
 
 
 
 
 
1232
  #: src/features/license.php:116
1233
  msgid "Automatic license verification failed."
1234
  msgstr ""
1251
  msgid "All attempts to verify Shield Pro license have failed."
1252
  msgstr ""
1253
 
1254
+ #: src/features/license.php:551
1255
  msgid "Not Active"
1256
  msgstr ""
1257
 
1258
+ #: src/features/lockdown.php:70 src/lib/src/Modules/Plugin/Strings.php:418
1259
  msgid "WP Lockdown"
1260
  msgstr ""
1261
 
1287
  msgid "File editing is permitted through WP admin"
1288
  msgstr ""
1289
 
1290
+ #: src/features/lockdown.php:124 src/lib/src/Modules/Events/Strings.php:234
1291
  msgid "XML-RPC"
1292
  msgstr ""
1293
 
1367
  msgid "Administrators"
1368
  msgstr ""
1369
 
1370
+ #: src/features/login_protect.php:458
1371
  msgid "I'm a human."
1372
  msgstr ""
1373
 
1374
+ #: src/features/login_protect.php:462
1375
  msgid "Please check the box to show us you're a human."
1376
  msgstr ""
1377
 
1378
+ #: src/features/login_protect.php:497
1379
  #, php-format
1380
  msgid "Support for login protection with %s is a Pro-only feature."
1381
  msgstr ""
1382
 
1383
+ #: src/features/login_protect.php:503
1384
  msgid ""
1385
  "2FA by email demands that your WP site is properly configured to send email."
1386
  msgstr ""
1387
 
1388
+ #: src/features/login_protect.php:504
1389
  msgid ""
1390
  "This is a common problem and you may get locked out in the future if you "
1391
  "ignore this."
1392
  msgstr ""
1393
 
1394
+ #: src/features/login_protect.php:505
1395
  #: src/lib/src/Modules/Plugin/AdminNotices.php:194
1396
  #: src/processors/lockdown.php:96
1397
  msgid "Learn More."
1398
  msgstr ""
1399
 
1400
+ #: src/features/login_protect.php:586
1401
  #: src/lib/src/Modules/LoginGuard/Strings.php:71
1402
+ #: src/lib/src/Modules/Plugin/Strings.php:420 src/wizards/plugin.php:549
1403
  #: src/wizards/plugin.php:554
1404
  msgid "Login Guard"
1405
  msgstr ""
1406
 
1407
+ #: src/features/login_protect.php:587
1408
  msgid "Brute Force Protection & Identity Verification"
1409
  msgstr ""
1410
 
1411
+ #: src/features/login_protect.php:603
1412
  msgid "Brute Force Login"
1413
  msgstr ""
1414
 
1415
+ #: src/features/login_protect.php:606
1416
  msgid "Login forms are protected against bot attacks"
1417
  msgstr ""
1418
 
1419
+ #: src/features/login_protect.php:607
1420
  msgid "Login forms are not protected against brute force bot attacks"
1421
  msgstr ""
1422
 
1423
+ #: src/features/login_protect.php:612
1424
  msgid "Bot User Register"
1425
  msgstr ""
1426
 
1427
+ #: src/features/login_protect.php:615
1428
  msgid "Registration forms are protected against bot attacks"
1429
  msgstr ""
1430
 
1431
+ #: src/features/login_protect.php:616
1432
  msgid "Registration forms are not protected against automated bots"
1433
  msgstr ""
1434
 
1435
+ #: src/features/login_protect.php:621
1436
  msgid "Brute Force Lost Password"
1437
  msgstr ""
1438
 
1439
+ #: src/features/login_protect.php:624
1440
  msgid "Lost Password forms are protected against bot attacks"
1441
  msgstr ""
1442
 
1443
+ #: src/features/login_protect.php:625
1444
  msgid "Lost Password forms are not protected against automated bots"
1445
  msgstr ""
1446
 
1447
+ #: src/features/login_protect.php:633
1448
  msgid "Identity Verification"
1449
  msgstr ""
1450
 
1451
+ #: src/features/login_protect.php:636
1452
  msgid "At least 1 2FA option is enabled"
1453
  msgstr ""
1454
 
1455
+ #: src/features/login_protect.php:637
1456
  msgid "No 2FA options, such as Google Authenticator, are active"
1457
  msgstr ""
1458
 
1459
+ #: src/features/plugin.php:165 src/lib/src/Modules/Plugin/AjaxHandler.php:243
1460
  msgid "Options imported successfully"
1461
  msgstr ""
1462
 
1463
+ #: src/features/plugin.php:710 src/lib/src/Modules/Plugin/Strings.php:377
 
 
 
 
 
 
1464
  #: src/processors/plugin_importexport.php:63
1465
  msgid "General Settings"
1466
  msgstr ""
1467
 
1468
+ #: src/features/plugin.php:711
1469
  #, php-format
1470
  msgid "General %s Settings"
1471
  msgstr ""
1472
 
1473
+ #: src/features/plugin.php:724
1474
  msgid "Visitor IP"
1475
  msgstr ""
1476
 
1477
+ #: src/features/plugin.php:726
1478
  #, php-format
1479
  msgid "Visitor IP address source is: %s"
1480
  msgstr ""
1481
 
1482
+ #: src/features/plugin.php:734
1483
  msgid "Reporting Email"
1484
  msgstr ""
1485
 
1486
+ #: src/features/plugin.php:737
1487
  #, php-format
1488
  msgid "Email address for reports set to: %s"
1489
  msgstr ""
1490
 
1491
+ #: src/features/plugin.php:738
1492
  #, php-format
1493
  msgid "No address provided - defaulting to: %s"
1494
  msgstr ""
1495
 
1496
+ #: src/features/plugin.php:746 src/lib/src/Modules/Events/Strings.php:222
1497
  msgid "reCAPTCHA"
1498
  msgstr ""
1499
 
1500
+ #: src/features/plugin.php:749
1501
  msgid "Google reCAPTCHA keys have been provided"
1502
  msgstr ""
1503
 
1504
+ #: src/features/plugin.php:750
1505
  msgid "Google reCAPTCHA keys haven't been provided"
1506
  msgstr ""
1507
 
1508
+ #: src/features/traffic.php:57
1509
+ msgid ""
1510
+ "Traffic Watcher will not run because visitor IP address detection is not "
1511
+ "correctly configured."
1512
+ msgstr ""
1513
+
1514
+ #: src/features/traffic.php:63
1515
  #, php-format
1516
  msgid "%s is a Pro-only feature."
1517
  msgstr ""
1518
 
1519
+ #: src/features/traffic.php:63
1520
+ msgid "Traffic Limiting"
 
 
1521
  msgstr ""
1522
 
1523
  #: src/features/user_management.php:143
1524
+ #: src/lib/src/Modules/Plugin/Strings.php:370
1525
  msgid "Very Weak"
1526
  msgstr ""
1527
 
1528
  #: src/features/user_management.php:144
1529
+ #: src/lib/src/Modules/Plugin/Strings.php:371
1530
  msgid "Weak"
1531
  msgstr ""
1532
 
1533
  #: src/features/user_management.php:145
1534
+ #: src/lib/src/Modules/Plugin/Strings.php:372
1535
+ #: src/lib/src/Modules/Plugin/Strings.php:441
1536
  msgid "Medium"
1537
  msgstr ""
1538
 
1539
  #: src/features/user_management.php:146
1540
+ #: src/lib/src/Modules/Plugin/Strings.php:373
1541
  msgid "Strong"
1542
  msgstr ""
1543
 
1544
  #: src/features/user_management.php:147
1545
+ #: src/lib/src/Modules/Plugin/Strings.php:374
1546
  msgid "Very Strong"
1547
  msgstr ""
1548
 
1555
  msgstr ""
1556
 
1557
  #: src/features/user_management.php:310 src/features/user_management.php:380
1558
+ #: src/lib/src/Modules/Base/Strings.php:26
1559
  #: src/lib/src/Modules/UserManagement/Strings.php:45
1560
  #: src/lib/src/Modules/UserManagement/Strings.php:46
1561
  msgid "Password Policies"
1570
  msgstr ""
1571
 
1572
  #: src/features/user_management.php:332
1573
+ #: src/lib/src/Modules/Plugin/Strings.php:429
1574
  #: src/lib/src/Modules/Sessions/Strings.php:24
1575
  #: src/lib/src/Modules/Traffic/Strings.php:43
1576
  #: src/lib/src/Modules/Traffic/Strings.php:53
1802
  msgid "Time"
1803
  msgstr ""
1804
 
 
 
 
 
1805
  #: src/lib/src/Modules/AuditTrail/Strings.php:98
1806
  #: src/lib/src/Modules/IPs/Strings.php:226
1807
  #: src/lib/src/Tables/Render/AuditTrail.php:69
1813
  msgstr ""
1814
 
1815
  #: src/lib/src/Modules/AuditTrail/Strings.php:101
1816
+ #: src/lib/src/Modules/Base/Strings.php:59
1817
+ #: src/lib/src/Modules/Plugin/Strings.php:391
1818
  #: src/lib/src/Tables/Render/IpBase.php:21
1819
  #: src/lib/src/Tables/Render/IpBlack.php:16
1820
  #: src/lib/src/Tables/Render/IpWhite.php:12 src/processors/firewall.php:403
1838
 
1839
  #: src/lib/src/Modules/AuditTrail/Strings.php:117
1840
  #: src/lib/src/Modules/Autoupdates/Strings.php:21
1841
+ #: src/lib/src/Modules/Base/Strings.php:40
1842
  #: src/lib/src/Modules/CommentsFilter/Strings.php:38
1843
  #: src/lib/src/Modules/Firewall/Strings.php:19
1844
  #: src/lib/src/Modules/HackGuard/Strings.php:90
1857
 
1858
  #: src/lib/src/Modules/AuditTrail/Strings.php:117
1859
  #: src/lib/src/Modules/Autoupdates/Strings.php:21
1860
+ #: src/lib/src/Modules/Base/Strings.php:41
1861
  #: src/lib/src/Modules/CommentsFilter/Strings.php:38
1862
  #: src/lib/src/Modules/Firewall/Strings.php:19
1863
  #: src/lib/src/Modules/HackGuard/Strings.php:90
1901
  #: src/lib/src/Modules/Autoupdates/Strings.php:42
1902
  #: src/lib/src/Modules/Autoupdates/Strings.php:53
1903
  #: src/lib/src/Modules/Autoupdates/Strings.php:63
1904
+ #: src/lib/src/Modules/Base/Strings.php:147
1905
  #: src/lib/src/Modules/CommentsFilter/Strings.php:41
1906
  #: src/lib/src/Modules/CommentsFilter/Strings.php:50
1907
  #: src/lib/src/Modules/CommentsFilter/Strings.php:57
1935
  #: src/lib/src/Modules/LoginGuard/Strings.php:117
1936
  #: src/lib/src/Modules/LoginGuard/Strings.php:126
1937
  #: src/lib/src/Modules/LoginGuard/Strings.php:135
1938
+ #: src/lib/src/Modules/Plugin/Strings.php:67
1939
+ #: src/lib/src/Modules/Plugin/Strings.php:75
1940
+ #: src/lib/src/Modules/Plugin/Strings.php:82
1941
+ #: src/lib/src/Modules/Plugin/Strings.php:97
1942
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:37
1943
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:46
1944
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:55
1972
  #: src/lib/src/Modules/Autoupdates/Strings.php:33
1973
  #: src/lib/src/Modules/Autoupdates/Strings.php:45
1974
  #: src/lib/src/Modules/Autoupdates/Strings.php:54
1975
+ #: src/lib/src/Modules/Base/Strings.php:148
1976
  #: src/lib/src/Modules/CommentsFilter/Strings.php:42
1977
  #: src/lib/src/Modules/CommentsFilter/Strings.php:58
1978
  #: src/lib/src/Modules/CommentsFilter/Strings.php:68
2009
  #: src/lib/src/Modules/LoginGuard/Strings.php:108
2010
  #: src/lib/src/Modules/LoginGuard/Strings.php:127
2011
  #: src/lib/src/Modules/LoginGuard/Strings.php:242
2012
+ #: src/lib/src/Modules/Plugin/Strings.php:99
2013
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:38
2014
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:47
2015
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:56
2511
  msgstr ""
2512
 
2513
  #: src/lib/src/Modules/Base/Strings.php:19
2514
+ msgid "Customer Support"
2515
  msgstr ""
2516
 
2517
  #: src/lib/src/Modules/Base/Strings.php:20
2518
+ msgid "More Scans"
2519
+ msgstr ""
2520
+
2521
+ #: src/lib/src/Modules/Base/Strings.php:21
2522
+ #: src/lib/src/Modules/HackGuard/Strings.php:147
2523
+ msgid "Malware Scanner"
2524
  msgstr ""
2525
 
2526
  #: src/lib/src/Modules/Base/Strings.php:22
2527
+ msgid "Scan Every Hour"
 
2528
  msgstr ""
2529
 
2530
  #: src/lib/src/Modules/Base/Strings.php:23
2531
+ #: src/lib/src/Modules/SecurityAdmin/Strings.php:62
2532
+ #: src/lib/src/Modules/SecurityAdmin/Strings.php:75
2533
+ #: src/lib/src/Modules/SecurityAdmin/Strings.php:180
2534
+ msgid "White Label"
2535
+ msgstr ""
2536
+
2537
+ #: src/lib/src/Modules/Base/Strings.php:24
2538
+ #: src/processors/plugin_importexport.php:63
2539
+ msgid "Import/Export"
2540
+ msgstr ""
2541
+
2542
+ #: src/lib/src/Modules/Base/Strings.php:25
2543
+ msgid "Better Bot Detection"
2544
+ msgstr ""
2545
+
2546
+ #: src/lib/src/Modules/Base/Strings.php:27
2547
+ msgid "WooCommerce Support"
2548
+ msgstr ""
2549
+
2550
+ #: src/lib/src/Modules/Base/Strings.php:30
2551
+ msgid "and much more!"
2552
+ msgstr ""
2553
+
2554
+ #: src/lib/src/Modules/Base/Strings.php:34
2555
+ msgid "Watch Help Video"
2556
+ msgstr ""
2557
+
2558
+ #: src/lib/src/Modules/Base/Strings.php:35
2559
+ msgid "Save Options"
2560
+ msgstr ""
2561
+
2562
+ #: src/lib/src/Modules/Base/Strings.php:37
2563
+ #: src/lib/src/Modules/Base/Strings.php:57
2564
+ msgid "Help"
2565
+ msgstr ""
2566
+
2567
+ #: src/lib/src/Modules/Base/Strings.php:38
2568
  msgid "Wizards"
2569
  msgstr ""
2570
 
2571
+ #: src/lib/src/Modules/Base/Strings.php:38
2572
  msgid "No Wizards"
2573
  msgstr ""
2574
 
2575
+ #: src/lib/src/Modules/Base/Strings.php:43 src/lib/src/Tables/Build/Ip.php:54
2576
  #: src/lib/src/Tables/Build/ScanBase.php:62
2577
  #: src/lib/src/Tables/Build/Sessions.php:68
2578
  #: src/lib/src/Tables/Build/Traffic.php:85
2580
  msgid "No"
2581
  msgstr ""
2582
 
2583
+ #: src/lib/src/Modules/Base/Strings.php:45
2584
  msgid "Until"
2585
  msgstr ""
2586
 
2587
+ #: src/lib/src/Modules/Base/Strings.php:46
2588
  msgid "Since"
2589
  msgstr ""
2590
 
2591
+ #: src/lib/src/Modules/Base/Strings.php:47
2592
  msgid "Info"
2593
  msgstr ""
2594
 
2595
+ #: src/lib/src/Modules/Base/Strings.php:48
2596
  #: src/lib/src/Tables/Build/Traffic.php:141
2597
  #: src/lib/src/Tables/Render/Sessions.php:38
2598
  msgid "Logged-In"
2599
  msgstr ""
2600
 
2601
+ #: src/lib/src/Modules/Base/Strings.php:50
2602
  msgid "Blog"
2603
  msgstr ""
2604
 
2605
+ #: src/lib/src/Modules/Base/Strings.php:51
2606
  #, php-format
2607
  msgid "Save %s Settings"
2608
  msgstr ""
2609
 
2610
+ #: src/lib/src/Modules/Base/Strings.php:54
2611
  msgid "Configure Module"
2612
  msgstr ""
2613
 
2614
+ #: src/lib/src/Modules/Base/Strings.php:55
2615
  msgid "Actions and Info"
2616
  msgstr ""
2617
 
2618
+ #: src/lib/src/Modules/Base/Strings.php:56
2619
  msgid "Perform actions for this module"
2620
  msgstr ""
2621
 
2622
+ #: src/lib/src/Modules/Base/Strings.php:58
2623
  msgid "Learn More"
2624
  msgstr ""
2625
 
2626
+ #: src/lib/src/Modules/Base/Strings.php:60
2627
  msgid "Select"
2628
  msgstr ""
2629
 
2630
+ #: src/lib/src/Modules/Base/Strings.php:61
2631
  msgid "Clear Filters"
2632
  msgstr ""
2633
 
2634
+ #: src/lib/src/Modules/Base/Strings.php:62
2635
  msgid "Apply Filters"
2636
  msgstr ""
2637
 
2638
+ #: src/lib/src/Modules/Base/Strings.php:63
2639
  msgid "Find Plugin Option"
2640
  msgstr ""
2641
 
2642
+ #: src/lib/src/Modules/Base/Strings.php:64
2643
  msgid "Type below to search all plugin options"
2644
  msgstr ""
2645
 
2646
+ #: src/lib/src/Modules/Base/Strings.php:65
2647
  #: src/processors/loginprotect_intentprovider_yubikey.php:30
2648
  #: src/processors/loginprotect_intentprovider_yubikey.php:37
2649
  msgid "Pro Only"
2650
  msgstr ""
2651
 
2652
+ #: src/lib/src/Modules/Base/Strings.php:66
2653
  msgid "This is a pro-only feature"
2654
  msgstr ""
2655
 
2656
+ #: src/lib/src/Modules/Base/Strings.php:67
2657
  msgid "Go Pro!"
2658
  msgstr ""
2659
 
2660
+ #: src/lib/src/Modules/Base/Strings.php:69
2661
  msgid "Please upgrade to Pro to control this option"
2662
  msgstr ""
2663
 
2664
+ #: src/lib/src/Modules/Base/Strings.php:71
2665
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:205
2666
  msgid "Description"
2667
  msgstr ""
2668
 
2669
+ #: src/lib/src/Modules/Base/Strings.php:72 src/processors/ips.php:283
2670
  #: src/processors/loginprotect_gasp.php:31
2671
  msgid "Loading"
2672
  msgstr ""
2673
 
2674
+ #: src/lib/src/Modules/Base/Strings.php:73
2675
  msgid "Plugin Access Restricted"
2676
  msgstr ""
2677
 
2678
+ #: src/lib/src/Modules/Base/Strings.php:74
2679
  msgid ""
2680
  "This security plugin is restricted to administrators with the Security "
2681
  "Access Key."
2682
  msgstr ""
2683
 
2684
+ #: src/lib/src/Modules/Base/Strings.php:75
2685
  msgid "Please provide the Security Access Key to manage this plugin."
2686
  msgstr ""
2687
 
2688
+ #: src/lib/src/Modules/Base/Strings.php:76
2689
  msgid "To manage this plugin you must enter the access key."
2690
  msgstr ""
2691
 
2692
+ #: src/lib/src/Modules/Base/Strings.php:77
2693
  msgid "Enter Access Key"
2694
  msgstr ""
2695
 
2696
+ #: src/lib/src/Modules/Base/Strings.php:78
2697
  msgid "Submit Security Admin Key"
2698
  msgstr ""
2699
 
2700
+ #: src/lib/src/Modules/Base/Strings.php:79
2701
  msgid "Forgotten Key"
2702
  msgstr ""
2703
 
2704
+ #: src/lib/src/Modules/Base/Strings.php:80
2705
  msgid "Supply Password"
2706
  msgstr ""
2707
 
2708
+ #: src/lib/src/Modules/Base/Strings.php:81
2709
  msgid "Confirm Password"
2710
  msgstr ""
2711
 
2712
+ #: src/lib/src/Modules/Base/Strings.php:82
2713
  msgid "Show help video for this section"
2714
  msgstr ""
2715
 
2716
+ #: src/lib/src/Modules/Base/Strings.php:84
2717
  msgid "offense"
2718
  msgstr ""
2719
 
2720
+ #: src/lib/src/Modules/Base/Strings.php:85
2721
  msgid "Debug"
2722
  msgstr ""
2723
 
2724
+ #: src/lib/src/Modules/Base/Strings.php:87
2725
  msgid "Agree To Privacy Policy"
2726
  msgstr ""
2727
 
2728
+ #: src/lib/src/Modules/Base/Strings.php:88
2729
  msgid "I confirm that I've read and I agree to the Privacy Policy"
2730
  msgstr ""
2731
 
2732
+ #: src/lib/src/Modules/Base/Strings.php:89
2733
  msgid ""
2734
  "We treat your information under our strict, and GDPR-compliant, privacy "
2735
  "policy."
2736
  msgstr ""
2737
 
2738
+ #: src/lib/src/Modules/Base/Strings.php:90
2739
  msgid "Privacy Policy"
2740
  msgstr ""
2741
 
2742
+ #: src/lib/src/Modules/Base/Strings.php:91
2743
  msgid "We never SPAM and you can remove yourself at any time."
2744
  msgstr ""
2745
 
2746
+ #: src/lib/src/Modules/Base/Strings.php:93
2747
+ msgid "Pro features include"
2748
+ msgstr ""
2749
+
2750
+ #: src/lib/src/Modules/Base/Strings.php:94
2751
+ msgid ""
2752
+ "Join The 1,000s Who've Already Upgraded Their WordPress Security To Better "
2753
+ "Protect Their Sites."
2754
+ msgstr ""
2755
+
2756
+ #: src/lib/src/Modules/Base/Strings.php:96
2757
+ msgid "Upgrade To Pro Protection"
2758
+ msgstr ""
2759
+
2760
+ #: src/lib/src/Modules/Base/Strings.php:144
2761
  msgid "User Messages"
2762
  msgstr ""
2763
 
2764
+ #: src/lib/src/Modules/Base/Strings.php:145
2765
  msgid "Messages"
2766
  msgstr ""
2767
 
2768
+ #: src/lib/src/Modules/Base/Strings.php:147
2769
  msgid "Customize the messages displayed to the user."
2770
  msgstr ""
2771
 
2772
+ #: src/lib/src/Modules/Base/Strings.php:148
2773
  msgid ""
2774
  "Use this section if you need to communicate to the user in a particular "
2775
  "manner."
2776
  msgstr ""
2777
 
2778
+ #: src/lib/src/Modules/Base/Strings.php:149
2779
  msgid "Hint"
2780
  msgstr ""
2781
 
2782
+ #: src/lib/src/Modules/Base/Strings.php:149
2783
  #, php-format
2784
  msgid "To reset any message to its default, enter the text exactly: %s"
2785
  msgstr ""
2912
  #: src/lib/src/Modules/CommentsFilter/Strings.php:76
2913
  #: src/lib/src/Modules/LoginGuard/Strings.php:108
2914
  #: src/lib/src/Modules/LoginGuard/Strings.php:127
2915
+ #: src/lib/src/Modules/Plugin/Strings.php:100
2916
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:47
2917
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:56
2918
  #: src/lib/src/Modules/UserManagement/Strings.php:49
2938
  msgstr ""
2939
 
2940
  #: src/lib/src/Modules/CommentsFilter/Strings.php:73
2941
+ #: src/lib/src/Modules/Events/Strings.php:226
2942
  msgid "Human"
2943
  msgstr ""
2944
 
2957
  msgstr ""
2958
 
2959
  #: src/lib/src/Modules/CommentsFilter/Strings.php:106
2960
+ #: src/wizards/plugin.php:694 src/wizards/plugin.php:699
2961
  msgid "Comment SPAM Protection"
2962
  msgstr ""
2963
 
2999
  #: src/lib/src/Modules/CommentsFilter/Strings.php:121
3000
  #: src/lib/src/Modules/HackGuard/Strings.php:342
3001
  #: src/lib/src/Modules/HackGuard/Strings.php:343
3002
+ #: src/lib/src/Modules/HackGuard/Strings.php:368
3003
  #: src/lib/src/Modules/LoginGuard/Strings.php:222
3004
+ #: src/lib/src/Modules/Plugin/Strings.php:242
3005
+ #: src/lib/src/Modules/Plugin/Strings.php:249
3006
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:70
3007
  #: src/lib/src/Modules/UserManagement/Strings.php:213
3008
  #: src/lib/src/Modules/UserManagement/Strings.php:230
3009
+ #: src/processors/hackprotect_scan_mal.php:148
3010
  #: src/processors/loginprotect_intentprovider_backup.php:29
3011
  msgid "Important"
3012
  msgstr ""
3172
 
3173
  #: src/lib/src/Modules/CommentsFilter/Strings.php:183
3174
  #: src/lib/src/Modules/LoginGuard/Strings.php:226
3175
+ #: src/lib/src/Modules/Plugin/Strings.php:253
3176
  msgid "reCAPTCHA Style"
3177
  msgstr ""
3178
 
3183
 
3184
  #: src/lib/src/Modules/CommentsFilter/Strings.php:185
3185
  #: src/lib/src/Modules/LoginGuard/Strings.php:228
3186
+ #: src/lib/src/Modules/Plugin/Strings.php:255
3187
  msgid ""
3188
  "You can choose the reCAPTCHA display format that best suits your site, "
3189
  "including the new Invisible Recaptcha"
3264
  "(0) turns this off. Suggested: 10"
3265
  msgstr ""
3266
 
3267
+ #: src/lib/src/Modules/Events/Strings.php:24
3268
  msgid "Test Cron Run"
3269
  msgstr ""
3270
 
3271
+ #: src/lib/src/Modules/Events/Strings.php:25
3272
  msgid "Import Notify Sent"
3273
  msgstr ""
3274
 
3275
+ #: src/lib/src/Modules/Events/Strings.php:26
3276
  msgid "Import Notify Received"
3277
  msgstr ""
3278
 
3279
+ #: src/lib/src/Modules/Events/Strings.php:27
3280
  msgid "Options Exported"
3281
  msgstr ""
3282
 
3283
+ #: src/lib/src/Modules/Events/Strings.php:28
3284
  msgid "Options Imported"
3285
  msgstr ""
3286
 
3287
+ #: src/lib/src/Modules/Events/Strings.php:29
3288
  msgid "Whitelist Site Added"
3289
  msgstr ""
3290
 
3291
+ #: src/lib/src/Modules/Events/Strings.php:30
3292
  msgid "Whitelist Site Removed"
3293
  msgstr ""
3294
 
3295
+ #: src/lib/src/Modules/Events/Strings.php:31
3296
  msgid "Master Site URL Set"
3297
  msgstr ""
3298
 
3299
+ #: src/lib/src/Modules/Events/Strings.php:32
3300
  msgid "Google reCAPTCHA Test Success"
3301
  msgstr ""
3302
 
3303
+ #: src/lib/src/Modules/Events/Strings.php:33
3304
+ #: src/lib/src/Modules/Plugin/Strings.php:48
3305
  msgid "Google reCAPTCHA Test Fail"
3306
  msgstr ""
3307
 
3308
+ #: src/lib/src/Modules/Events/Strings.php:34
3309
  msgid "Security Admin Key Authentication Success"
3310
  msgstr ""
3311
 
3312
+ #: src/lib/src/Modules/Events/Strings.php:35
3313
  msgid "Security Admin Key Authentication Failed"
3314
  msgstr ""
3315
 
3316
+ #: src/lib/src/Modules/Events/Strings.php:36
3317
  msgid "Custom Offense"
3318
  msgstr ""
3319
 
3320
+ #: src/lib/src/Modules/Events/Strings.php:37
3321
  msgid "Connection Killed"
3322
  msgstr ""
3323
 
3324
+ #: src/lib/src/Modules/Events/Strings.php:38
3325
  msgid "Offense Triggered"
3326
  msgstr ""
3327
 
3328
+ #: src/lib/src/Modules/Events/Strings.php:39
3329
  msgid "IP Blocked"
3330
  msgstr ""
3331
 
3332
+ #: src/lib/src/Modules/Events/Strings.php:40
3333
  msgid "IP Unblocked Using Flag File"
3334
  msgstr ""
3335
 
3336
+ #: src/lib/src/Modules/Events/Strings.php:42
3337
+ #: src/lib/src/Modules/Events/Strings.php:46
3338
+ #: src/lib/src/Modules/Events/Strings.php:50
3339
+ #: src/lib/src/Modules/Events/Strings.php:54
3340
+ #: src/lib/src/Modules/Events/Strings.php:58
3341
+ #: src/lib/src/Modules/Events/Strings.php:62
3342
+ #: src/lib/src/Modules/Events/Strings.php:66
3343
  msgid "Bot Detection"
3344
  msgstr ""
3345
 
3346
+ #: src/lib/src/Modules/Events/Strings.php:47
3347
  #: src/lib/src/Modules/IPs/Strings.php:192
3348
  msgid "Fake Web Crawler"
3349
  msgstr ""
3350
 
3351
+ #: src/lib/src/Modules/Events/Strings.php:51
3352
  #: src/lib/src/Modules/IPs/Strings.php:172
3353
  msgid "Link Cheese"
3354
  msgstr ""
3355
 
3356
+ #: src/lib/src/Modules/Events/Strings.php:55
3357
  #: src/lib/src/Modules/IPs/Strings.php:186
3358
  msgid "Failed Login"
3359
  msgstr ""
3360
 
3361
+ #: src/lib/src/Modules/Events/Strings.php:59
3362
  msgid "Invalid Username Login"
3363
  msgstr ""
3364
 
3365
+ #: src/lib/src/Modules/Events/Strings.php:63
3366
  msgid "Invalid User-Agent"
3367
  msgstr ""
3368
 
3369
+ #: src/lib/src/Modules/Events/Strings.php:70
3370
+ #: src/lib/src/Modules/Events/Strings.php:74
3371
+ #: src/lib/src/Modules/Events/Strings.php:78
3372
+ #: src/lib/src/Modules/Events/Strings.php:82
3373
+ #: src/lib/src/Modules/Events/Strings.php:86
3374
+ #: src/lib/src/Modules/Events/Strings.php:90
3375
  msgid "Alert Sent"
3376
  msgstr ""
3377
 
3378
+ #: src/lib/src/Modules/Events/Strings.php:71
3379
  msgid "Abandoned Plugin Detected"
3380
  msgstr ""
3381
 
3382
+ #: src/lib/src/Modules/Events/Strings.php:75
3383
  msgid "Malware Detected"
3384
  msgstr ""
3385
 
3386
+ #: src/lib/src/Modules/Events/Strings.php:79
3387
  msgid "Modified Plugin/Theme Detected"
3388
  msgstr ""
3389
 
3390
+ #: src/lib/src/Modules/Events/Strings.php:83
3391
  msgid "Unrecognised File Detected"
3392
  msgstr ""
3393
 
3394
+ #: src/lib/src/Modules/Events/Strings.php:87
3395
  msgid "Modified/Missing WP Core File Detected"
3396
  msgstr ""
3397
 
3398
+ #: src/lib/src/Modules/Events/Strings.php:91
3399
  msgid "Vulnerable Plugin Detected"
3400
  msgstr ""
3401
 
3402
+ #: src/lib/src/Modules/Events/Strings.php:94
3403
+ #: src/lib/src/Modules/Events/Strings.php:98
3404
+ #: src/lib/src/Modules/Events/Strings.php:102
 
 
 
 
 
 
 
3405
  #: src/lib/src/Modules/Events/Strings.php:106
3406
+ #: src/lib/src/Modules/Events/Strings.php:110
3407
+ #: src/lib/src/Modules/Events/Strings.php:114
3408
+ msgid "Scan Completed"
3409
+ msgstr ""
3410
+
3411
+ #: src/lib/src/Modules/Events/Strings.php:95
3412
+ #: src/lib/src/Modules/Events/Strings.php:119
3413
  #: src/lib/src/Modules/HackGuard/Strings.php:23
3414
  #: src/lib/src/Modules/HackGuard/Strings.php:128
3415
  msgid "Abandoned Plugins"
3416
  msgstr ""
3417
 
3418
+ #: src/lib/src/Modules/Events/Strings.php:99
3419
+ #: src/lib/src/Modules/Events/Strings.php:123
3420
  #: src/lib/src/Modules/HackGuard/Strings.php:25
3421
  #: src/lib/src/Modules/HackGuard/Strings.php:146
3422
  msgid "Malware"
3423
  msgstr ""
3424
 
3425
+ #: src/lib/src/Modules/Events/Strings.php:111
3426
+ #: src/lib/src/Modules/Events/Strings.php:135
3427
  #: src/lib/src/Modules/HackGuard/Strings.php:27
3428
  msgid "WP Core Files"
3429
  msgstr ""
3430
 
3431
+ #: src/lib/src/Modules/Events/Strings.php:115
3432
+ #: src/lib/src/Modules/Events/Strings.php:139
3433
  #: src/lib/src/Modules/HackGuard/Strings.php:28
3434
  #: src/lib/src/Modules/HackGuard/Strings.php:99
3435
  msgid "Vulnerabilities"
3436
  msgstr ""
3437
 
3438
+ #: src/lib/src/Modules/Events/Strings.php:118
3439
+ #: src/lib/src/Modules/Events/Strings.php:122
3440
+ #: src/lib/src/Modules/Events/Strings.php:126
3441
+ #: src/lib/src/Modules/Events/Strings.php:130
3442
+ #: src/lib/src/Modules/Events/Strings.php:134
3443
+ #: src/lib/src/Modules/Events/Strings.php:138
3444
  msgid "Scan Item Discovered"
3445
  msgstr ""
3446
 
3447
+ #: src/lib/src/Modules/Events/Strings.php:172
3448
  #: src/lib/src/Modules/Insights/Strings.php:46
3449
  msgid "Firewall Block"
3450
  msgstr ""
3451
 
3452
+ #: src/lib/src/Modules/Events/Strings.php:175
3453
  #: src/lib/src/Modules/Firewall/Strings.php:194 src/processors/firewall.php:430
3454
  msgid "Directory Traversal"
3455
  msgstr ""
3456
 
3457
+ #: src/lib/src/Modules/Events/Strings.php:179
3458
  #: src/lib/src/Modules/Firewall/Strings.php:104
3459
  #: src/lib/src/Modules/Firewall/Strings.php:197 src/processors/firewall.php:433
3460
  msgid "WordPress Terms"
3461
  msgstr ""
3462
 
3463
+ #: src/lib/src/Modules/Events/Strings.php:183
3464
  #: src/lib/src/Modules/Firewall/Strings.php:110
3465
  #: src/lib/src/Modules/Firewall/Strings.php:200 src/processors/firewall.php:436
3466
  msgid "Field Truncation"
3467
  msgstr ""
3468
 
3469
+ #: src/lib/src/Modules/Events/Strings.php:187
3470
  #: src/lib/src/Modules/Firewall/Strings.php:98
3471
  #: src/lib/src/Modules/Firewall/Strings.php:203 src/processors/firewall.php:439
3472
  msgid "SQL Queries"
3473
  msgstr ""
3474
 
3475
+ #: src/lib/src/Modules/Events/Strings.php:191
3476
  #: src/lib/src/Modules/Firewall/Strings.php:206 src/processors/firewall.php:445
3477
  msgid "Leading Schema"
3478
  msgstr ""
3479
 
3480
+ #: src/lib/src/Modules/Events/Strings.php:195
3481
  #: src/lib/src/Modules/Firewall/Strings.php:209 src/processors/firewall.php:451
3482
  msgid "Aggressive Rules"
3483
  msgstr ""
3484
 
3485
+ #: src/lib/src/Modules/Events/Strings.php:199
3486
  #: src/lib/src/Modules/Firewall/Strings.php:116
3487
  #: src/lib/src/Modules/Firewall/Strings.php:212 src/processors/firewall.php:448
3488
  msgid "PHP Code"
3489
  msgstr ""
3490
 
3491
+ #: src/lib/src/Modules/Events/Strings.php:203
3492
  #: src/lib/src/Modules/Firewall/Strings.php:215 src/processors/firewall.php:442
3493
  msgid "EXE File Uploads"
3494
  msgstr ""
3495
 
3496
+ #: src/lib/src/Modules/Events/Strings.php:205
3497
  msgid "Session Not Found"
3498
  msgstr ""
3499
 
3500
+ #: src/lib/src/Modules/Events/Strings.php:206
3501
  msgid "Session Expired"
3502
  msgstr ""
3503
 
3504
+ #: src/lib/src/Modules/Events/Strings.php:207
3505
  msgid "Session Idle"
3506
  msgstr ""
3507
 
3508
+ #: src/lib/src/Modules/Events/Strings.php:208
3509
  msgid "Session Locked To IP"
3510
  msgstr ""
3511
 
3512
+ #: src/lib/src/Modules/Events/Strings.php:209
3513
  msgid "Session Locked To Browser"
3514
  msgstr ""
3515
 
3516
+ #: src/lib/src/Modules/Events/Strings.php:210
3517
  msgid "Session Unverified"
3518
  msgstr ""
3519
 
3520
+ #: src/lib/src/Modules/Events/Strings.php:211
3521
  msgid "Password Expired"
3522
  msgstr ""
3523
 
3524
+ #: src/lib/src/Modules/Events/Strings.php:212
3525
  msgid "Forced Password Change"
3526
  msgstr ""
3527
 
3528
+ #: src/lib/src/Modules/Events/Strings.php:213
3529
  msgid "Password Change Blocked"
3530
  msgstr ""
3531
 
3532
+ #: src/lib/src/Modules/Events/Strings.php:214
3533
  msgid "User Hard-Suspended"
3534
  msgstr ""
3535
 
3536
+ #: src/lib/src/Modules/Events/Strings.php:215
3537
  msgid "User Hard-Unsuspended"
3538
  msgstr ""
3539
 
3540
+ #: src/lib/src/Modules/Events/Strings.php:217
3541
+ #: src/lib/src/Modules/Events/Strings.php:221
3542
+ #: src/lib/src/Modules/Events/Strings.php:225
3543
  msgid "SPAM Blocked"
3544
  msgstr ""
3545
 
3546
+ #: src/lib/src/Modules/Events/Strings.php:218
3547
  msgid "Bot"
3548
  msgstr ""
3549
 
3550
+ #: src/lib/src/Modules/Events/Strings.php:229
3551
+ #: src/lib/src/Modules/Events/Strings.php:233
3552
  #: src/lib/src/Tables/Render/IpBlack.php:13
3553
  msgid "Blocked"
3554
  msgstr ""
3555
 
3556
+ #: src/lib/src/Modules/Events/Strings.php:230
3557
  msgid "Anonymous REST API"
3558
  msgstr ""
3559
 
3560
+ #: src/lib/src/Modules/Events/Strings.php:236
3561
  msgid "Session Started"
3562
  msgstr ""
3563
 
3564
+ #: src/lib/src/Modules/Events/Strings.php:237
3565
  msgid "Session Terminated"
3566
  msgstr ""
3567
 
3568
+ #: src/lib/src/Modules/Events/Strings.php:238
3569
  msgid "Plugin Activated"
3570
  msgstr ""
3571
 
3572
+ #: src/lib/src/Modules/Events/Strings.php:239
3573
  msgid "Plugin Deactivated"
3574
  msgstr ""
3575
 
3576
+ #: src/lib/src/Modules/Events/Strings.php:240
3577
  msgid "Plugin File Edited"
3578
  msgstr ""
3579
 
3580
+ #: src/lib/src/Modules/Events/Strings.php:241
3581
  msgid "Theme Activated"
3582
  msgstr ""
3583
 
3584
+ #: src/lib/src/Modules/Events/Strings.php:242
3585
  msgid "Theme File Edited"
3586
  msgstr ""
3587
 
3588
+ #: src/lib/src/Modules/Events/Strings.php:243
3589
  msgid "WP Core Updated"
3590
  msgstr ""
3591
 
3592
+ #: src/lib/src/Modules/Events/Strings.php:244
3593
  msgid "Permalinks Updated"
3594
  msgstr ""
3595
 
3596
+ #: src/lib/src/Modules/Events/Strings.php:245
3597
  msgid "Post Deleted"
3598
  msgstr ""
3599
 
3600
+ #: src/lib/src/Modules/Events/Strings.php:246
3601
  msgid "Post Trashed"
3602
  msgstr ""
3603
 
3604
+ #: src/lib/src/Modules/Events/Strings.php:247
3605
  msgid "Post Recovered"
3606
  msgstr ""
3607
 
3608
+ #: src/lib/src/Modules/Events/Strings.php:248
3609
  msgid "Post Updated"
3610
  msgstr ""
3611
 
3612
+ #: src/lib/src/Modules/Events/Strings.php:249
3613
  msgid "Post Published"
3614
  msgstr ""
3615
 
3616
+ #: src/lib/src/Modules/Events/Strings.php:250
3617
  msgid "Post Unpublished"
3618
  msgstr ""
3619
 
3620
+ #: src/lib/src/Modules/Events/Strings.php:251
3621
  msgid "User Login"
3622
  msgstr ""
3623
 
3624
+ #: src/lib/src/Modules/Events/Strings.php:252
3625
  msgid "User Registered"
3626
  msgstr ""
3627
 
3628
+ #: src/lib/src/Modules/Events/Strings.php:253
3629
  msgid "User Deleted"
3630
  msgstr ""
3631
 
3632
+ #: src/lib/src/Modules/Events/Strings.php:254
3633
  msgid "User Deleted And Reassigned"
3634
  msgstr ""
3635
 
3636
+ #: src/lib/src/Modules/Events/Strings.php:255
3637
  msgid "Email Sent"
3638
  msgstr ""
3639
 
3640
+ #: src/lib/src/Modules/Events/Strings.php:256
3641
  msgid "Invalid Email Sent"
3642
  msgstr ""
3643
 
3644
+ #: src/lib/src/Modules/Events/Strings.php:257
3645
  msgid "License Check Success"
3646
  msgstr ""
3647
 
3648
+ #: src/lib/src/Modules/Events/Strings.php:258
3649
  msgid "License Failure Email"
3650
  msgstr ""
3651
 
3652
+ #: src/lib/src/Modules/Events/Strings.php:259
3653
  msgid "License Deactivated"
3654
  msgstr ""
3655
 
3976
  msgid "Firewall Block Response: %s."
3977
  msgstr ""
3978
 
3979
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:159
3980
  msgid "Unsupported scanner"
3981
  msgstr ""
3982
 
3983
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:162
3984
  msgid "Unsupported item(s) selected"
3985
  msgstr ""
3986
 
3987
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:180
3988
  msgid "Action successful."
3989
  msgstr ""
3990
 
3991
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:183
3992
  msgid "An error occurred."
3993
  msgstr ""
3994
 
3995
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:183
3996
  msgid "Some items may not have been processed."
3997
  msgstr ""
3998
 
3999
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:189
4000
  msgid "Rescanning"
4001
  msgstr ""
4002
 
4003
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:192
4004
  msgid "Reloading"
4005
  msgstr ""
4006
 
4007
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:228
4008
  msgid "No scan running."
4009
  msgstr ""
4010
 
4011
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:238
4012
  msgid "Current Scan"
4013
  msgstr ""
4014
 
4015
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:240
4016
  #, php-format
4017
  msgid "%s of %s scans remaining."
4018
  msgstr ""
4019
 
4020
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:243
4021
  msgid "Please be patient."
4022
  msgstr ""
4023
 
4024
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:244
4025
  msgid "Some scans can take quite a while to complete."
4026
  msgstr ""
4027
 
4028
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:245
4029
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:296
4030
  msgid "Scans completed."
4031
  msgstr ""
4032
 
4033
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:245
4034
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:296
4035
  #: src/lib/src/Modules/License/AjaxHandler.php:88
4036
  msgid "Reloading page"
4037
  msgstr ""
4038
 
4039
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:261
4040
  msgid "No scans were selected"
4041
  msgstr ""
4042
 
4043
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:295
4044
  msgid "Scans started."
4045
  msgstr ""
4046
 
4047
+ #: src/lib/src/Modules/HackGuard/AjaxHandler.php:295
4048
  msgid "Please wait, as this will take a few moments."
4049
  msgstr ""
4050
 
4193
  msgid "Keep the Plugins/Theme Guard feature turned on."
4194
  msgstr ""
4195
 
 
 
 
 
4196
  #: src/lib/src/Modules/HackGuard/Strings.php:149
4197
  msgid "Monitor and detect presence of Malware signatures."
4198
  msgstr ""
4580
  msgstr ""
4581
 
4582
  #: src/lib/src/Modules/HackGuard/Strings.php:347
4583
+ msgid "Ignore False Positives Threshold"
4584
  msgstr ""
4585
 
4586
  #: src/lib/src/Modules/HackGuard/Strings.php:348
4587
+ msgid "Ignore False Positives In Scan Results Automatically"
4588
  msgstr ""
4589
 
4590
  #: src/lib/src/Modules/HackGuard/Strings.php:349
4591
+ msgid ""
4592
+ "You can choose to ignore files with potential malware, depending on whether "
4593
+ "the confidence that it's a 'false positive' meets your minimum threshold."
4594
  msgstr ""
4595
 
4596
  #: src/lib/src/Modules/HackGuard/Strings.php:350
4597
  msgid ""
4598
+ "A false positive happens when a file appears to contain malware and shows up "
4599
+ "in scan results, but it's actually clean."
4600
+ msgstr ""
4601
+
4602
+ #: src/lib/src/Modules/HackGuard/Strings.php:351
4603
+ msgid ""
4604
+ "A false positive is similar to when an anti-virus alerts to a file that "
4605
+ "doesnt have a virus."
4606
+ msgstr ""
4607
+
4608
+ #: src/lib/src/Modules/HackGuard/Strings.php:352
4609
+ msgid ""
4610
+ "The higher the confidence level, the more likely a result is a false "
4611
+ "positive."
4612
+ msgstr ""
4613
+
4614
+ #: src/lib/src/Modules/HackGuard/Strings.php:353
4615
+ msgid "A low level means it's less likely to be a false positive."
4616
+ msgstr ""
4617
+
4618
+ #: src/lib/src/Modules/HackGuard/Strings.php:354
4619
+ msgid ""
4620
+ "The scan will automatically ignore results whose 'false positive' confidence "
4621
+ "level is greater than your chosen threshold."
4622
+ msgstr ""
4623
+
4624
+ #: src/lib/src/Modules/HackGuard/Strings.php:355
4625
+ msgid ""
4626
+ "The higher the confidence threshold you select, the more likely that 'false "
4627
+ "positives' will appears in your scan results."
4628
+ msgstr ""
4629
+
4630
+ #: src/lib/src/Modules/HackGuard/Strings.php:356
4631
+ msgid ""
4632
+ "Disabling network intelligence turns off 'false positive confidence' levels."
4633
+ msgstr ""
4634
+
4635
+ #: src/lib/src/Modules/HackGuard/Strings.php:357
4636
+ msgid ""
4637
+ "You will no longer benefit from the intelligence gathered from the entire "
4638
+ "network."
4639
+ msgstr ""
4640
+
4641
+ #: src/lib/src/Modules/HackGuard/Strings.php:358
4642
+ msgid "All data shared is completely anonymous."
4643
+ msgstr ""
4644
+
4645
+ #: src/lib/src/Modules/HackGuard/Strings.php:359
4646
+ #: src/lib/src/Tables/Render/ScanWpv.php:55
4647
+ #: src/processors/hackprotect_scan_mal.php:165
4648
+ #: src/processors/hackprotect_scan_wcf.php:112
4649
+ #: src/processors/hackprotect_scan_wpv.php:201
4650
+ #: src/processors/loginprotect_intent.php:285
4651
+ msgid "More Info"
4652
+ msgstr ""
4653
+
4654
+ #: src/lib/src/Modules/HackGuard/Strings.php:360
4655
+ msgid ""
4656
+ "The more sites that share this information, the stronger and smarter the "
4657
+ "network becomes."
4658
+ msgstr ""
4659
+
4660
+ #: src/lib/src/Modules/HackGuard/Strings.php:364
4661
+ msgid "Surgical Auto-Repair"
4662
+ msgstr ""
4663
+
4664
+ #: src/lib/src/Modules/HackGuard/Strings.php:365
4665
+ msgid "Automatically Attempt To Surgically Remove Malware Code"
4666
+ msgstr ""
4667
+
4668
+ #: src/lib/src/Modules/HackGuard/Strings.php:366
4669
+ msgid "Attempts to automatically remove code from infected files."
4670
+ msgstr ""
4671
+
4672
+ #: src/lib/src/Modules/HackGuard/Strings.php:367
4673
+ msgid ""
4674
  "This could break your site if code removal leaves remaining code in an "
4675
  "inconsistent state."
4676
  msgstr ""
4677
 
4678
+ #: src/lib/src/Modules/HackGuard/Strings.php:368
4679
  msgid ""
4680
  "Only applies to files that don't fall under the other categories for "
4681
  "automatic repair."
4682
  msgstr ""
4683
 
4684
+ #: src/lib/src/Modules/HackGuard/Strings.php:372
4685
  msgid "WP Config"
4686
  msgstr ""
4687
 
4688
+ #: src/lib/src/Modules/HackGuard/Strings.php:373
4689
  msgid "Realtime Protection For WP Config File"
4690
  msgstr ""
4691
 
4692
+ #: src/lib/src/Modules/HackGuard/Strings.php:374
4693
  msgid "Realtime protection for the wp-config.php file."
4694
  msgstr ""
4695
 
4894
  msgstr ""
4895
 
4896
  #: src/lib/src/Modules/IPs/AdminNotices.php:40
4897
+ #: src/lib/src/Modules/Plugin/Strings.php:383 src/processors/plugin.php:84
4898
  #, php-format
4899
  msgid "Your IP address is: %s"
4900
  msgstr ""
4945
  msgid "IP address added successfully"
4946
  msgstr ""
4947
 
4948
+ #: src/lib/src/Modules/IPs/AjaxHandler.php:124
4949
  msgid "Invalid entry selected"
4950
  msgstr ""
4951
 
4952
+ #: src/lib/src/Modules/IPs/AjaxHandler.php:127
4953
  msgid "IP address deleted"
4954
  msgstr ""
4955
 
4956
+ #: src/lib/src/Modules/IPs/AjaxHandler.php:131
4957
  msgid "IP address wasn't deleted from the list"
4958
  msgstr ""
4959
 
4964
  msgstr ""
4965
 
4966
  #: src/lib/src/Modules/IPs/Strings.php:28
4967
+ #: src/lib/src/Modules/Plugin/Strings.php:416 src/wizards/plugin.php:514
4968
  #: src/wizards/plugin.php:519
4969
  msgid "IP Manager"
4970
  msgstr ""
5534
  msgid "Please turn on this feature in the options."
5535
  msgstr ""
5536
 
5537
+ #: src/lib/src/Modules/Insights/Strings.php:71
5538
+ msgid "There are no important security notices at this time."
5539
+ msgstr ""
5540
+
5541
+ #: src/lib/src/Modules/Insights/Strings.php:72
5542
+ msgid "This is wonderful!"
5543
+ msgstr ""
5544
+
5545
+ #: src/lib/src/Modules/Insights/Strings.php:73
5546
+ msgid "YYYY-MM-DD"
5547
+ msgstr ""
5548
+
5549
  #: src/lib/src/Modules/License/AjaxHandler.php:87
5550
  #: src/processors/loginprotect_intent.php:152
5551
  msgid "Success"
5725
  msgstr ""
5726
 
5727
  #: src/lib/src/Modules/Lockdown/Strings.php:95
5728
+ #: src/lib/src/Modules/Plugin/Strings.php:65
5729
  #, php-format
5730
  msgid "Disable %s"
5731
  msgstr ""
5898
  msgid "Verification email resent."
5899
  msgstr ""
5900
 
5901
+ #: src/lib/src/Modules/LoginGuard/Lib/CooldownRedirect.php:40
5902
+ msgid "The login page is protected against too many login attempts."
5903
+ msgstr ""
5904
+
5905
+ #: src/lib/src/Modules/LoginGuard/Lib/CooldownRedirect.php:42
5906
+ msgid ""
5907
+ "If you attempt to login again too quickly you may be blocked from accessing "
5908
+ "this site entirely."
5909
+ msgstr ""
5910
+
5911
+ #: src/lib/src/Modules/LoginGuard/Lib/CooldownRedirect.php:43
5912
+ msgid ""
5913
+ "If you share this website with others, you may also block their access to "
5914
+ "the site."
5915
+ msgstr ""
5916
+
5917
+ #: src/lib/src/Modules/LoginGuard/Lib/CooldownRedirect.php:44
5918
+ msgid ""
5919
+ "To ignore this message and return to the login page, please check the box "
5920
+ "and click continue."
5921
+ msgstr ""
5922
+
5923
+ #: src/lib/src/Modules/LoginGuard/Lib/CooldownRedirect.php:46
5924
+ msgid "I understand I may block my access to the site."
5925
+ msgstr ""
5926
+
5927
+ #: src/lib/src/Modules/LoginGuard/Lib/CooldownRedirect.php:47
5928
+ msgid "Seconds remaining"
5929
+ msgstr ""
5930
+
5931
+ #: src/lib/src/Modules/LoginGuard/Lib/CooldownRedirect.php:48
5932
+ msgid "Proceed To Login Page"
5933
+ msgstr ""
5934
+
5935
  #: src/lib/src/Modules/LoginGuard/Strings.php:15
5936
  #, php-format
5937
  msgid "User \"%s\" attempted \"%s\" but Bot checkbox was not found."
6188
  msgstr ""
6189
 
6190
  #: src/lib/src/Modules/LoginGuard/Strings.php:205
6191
+ #: src/lib/src/Modules/Plugin/Strings.php:410
6192
  #: src/processors/user_management.php:204
6193
  msgid "Email"
6194
  msgstr ""
6218
  msgstr ""
6219
 
6220
  #: src/lib/src/Modules/LoginGuard/Strings.php:217
6221
+ #: src/lib/src/Modules/Plugin/Strings.php:94
6222
+ #: src/lib/src/Modules/Plugin/Strings.php:95
6223
  msgid "Google reCAPTCHA"
6224
  msgstr ""
6225
 
6238
  msgstr ""
6239
 
6240
  #: src/lib/src/Modules/LoginGuard/Strings.php:220
6241
+ #: src/lib/src/Modules/Plugin/Strings.php:433
6242
  msgid "Light Theme"
6243
  msgstr ""
6244
 
6660
  msgid "Site Secured"
6661
  msgstr ""
6662
 
6663
+ #: src/lib/src/Modules/Plugin/Components/PluginBadge.php:76
6664
+ #, php-format
6665
+ msgid "This Site Is Protected By %s"
6666
+ msgstr ""
6667
+
6668
  #: src/lib/src/Modules/Plugin/Strings.php:15
6669
  msgid "Plugin Actions"
6670
  msgstr ""
6711
  msgid "Master Site URL set: %s"
6712
  msgstr ""
6713
 
6714
+ #: src/lib/src/Modules/Plugin/Strings.php:64
6715
  msgid "Global Security Plugin Disable"
6716
  msgstr ""
6717
 
6718
+ #: src/lib/src/Modules/Plugin/Strings.php:67
6719
  msgid "Use this option to completely disable all active Shield Protection."
6720
  msgstr ""
6721
 
6722
+ #: src/lib/src/Modules/Plugin/Strings.php:72
6723
+ #: src/lib/src/Modules/Plugin/Strings.php:73
6724
  msgid "Plugin Defaults"
6725
  msgstr ""
6726
 
6727
+ #: src/lib/src/Modules/Plugin/Strings.php:75
6728
  msgid "Important default settings used throughout the plugin."
6729
  msgstr ""
6730
 
6731
+ #: src/lib/src/Modules/Plugin/Strings.php:82
6732
  msgid ""
6733
  "Automatically import options, and deploy configurations across your entire "
6734
  "network."
6735
  msgstr ""
6736
 
6737
+ #: src/lib/src/Modules/Plugin/Strings.php:83
6738
  msgid "This is a Pro-only feature."
6739
  msgstr ""
6740
 
6741
+ #: src/lib/src/Modules/Plugin/Strings.php:89
6742
  msgid "General Plugin Options"
6743
  msgstr ""
6744
 
6745
+ #: src/lib/src/Modules/Plugin/Strings.php:90
6746
  msgid "General Options"
6747
  msgstr ""
6748
 
6749
+ #: src/lib/src/Modules/Plugin/Strings.php:97
6750
  #, php-format
6751
  msgid "Setup Google reCAPTCHA for use across %s."
6752
  msgstr ""
6753
 
6754
+ #: src/lib/src/Modules/Plugin/Strings.php:101
6755
  msgid "You must create your own Google reCAPTCHA API Keys."
6756
  msgstr ""
6757
 
6758
+ #: src/lib/src/Modules/Plugin/Strings.php:103
6759
  msgid "Manage Keys Here"
6760
  msgstr ""
6761
 
6762
+ #: src/lib/src/Modules/Plugin/Strings.php:105
6763
  #, php-format
6764
  msgid "Invisible Google reCAPTCHA is available with %s Pro."
6765
  msgstr ""
6766
 
6767
+ #: src/lib/src/Modules/Plugin/Strings.php:110
6768
+ #: src/lib/src/Modules/Plugin/Strings.php:111
6769
  msgid "Duo Security"
6770
  msgstr ""
6771
 
6772
+ #: src/lib/src/Modules/Plugin/Strings.php:138
6773
  #, php-format
6774
  msgid "Enable %s Protection"
6775
  msgstr ""
6776
 
6777
+ #: src/lib/src/Modules/Plugin/Strings.php:139
6778
  msgid "Switch Off To Disable All Security Protection"
6779
  msgstr ""
6780
 
6781
+ #: src/lib/src/Modules/Plugin/Strings.php:140
6782
  msgid ""
6783
  "You can keep the security plugin activated, but temporarily disable all "
6784
  "protection it provides."
6785
  msgstr ""
6786
 
6787
+ #: src/lib/src/Modules/Plugin/Strings.php:144
6788
  msgid "Anonymous Usage Statistics"
6789
  msgstr ""
6790
 
6791
+ #: src/lib/src/Modules/Plugin/Strings.php:145
6792
  msgid "Permit Anonymous Usage Information Gathering"
6793
  msgstr ""
6794
 
6795
+ #: src/lib/src/Modules/Plugin/Strings.php:146
6796
  msgid ""
6797
  "Allows us to gather information on statistics and features in-use across our "
6798
  "client installations."
6799
  msgstr ""
6800
 
6801
+ #: src/lib/src/Modules/Plugin/Strings.php:147
6802
  msgid ""
6803
  "This information is strictly anonymous and contains no personally, or "
6804
  "otherwise, identifiable data."
6805
  msgstr ""
6806
 
6807
+ #: src/lib/src/Modules/Plugin/Strings.php:148
6808
  msgid "Click to see the exact data that would be sent."
6809
  msgstr ""
6810
 
6811
+ #: src/lib/src/Modules/Plugin/Strings.php:152
6812
  msgid "IP Source"
6813
  msgstr ""
6814
 
6815
+ #: src/lib/src/Modules/Plugin/Strings.php:153
6816
  msgid "Which IP Address Is Yours"
6817
  msgstr ""
6818
 
6819
+ #: src/lib/src/Modules/Plugin/Strings.php:154
6820
  msgid ""
6821
  "There are many possible ways to detect visitor IP addresses. If Auto-Detect "
6822
  "is not working, please select yours from the list."
6823
  msgstr ""
6824
 
6825
+ #: src/lib/src/Modules/Plugin/Strings.php:155
6826
  msgid ""
6827
  "If the option you select becomes unavailable, we will revert to auto "
6828
  "detection."
6829
  msgstr ""
6830
 
6831
+ #: src/lib/src/Modules/Plugin/Strings.php:157
6832
  #, php-format
6833
  msgid "Current source is: %s (%s)"
6834
  msgstr ""
6835
 
6836
+ #: src/lib/src/Modules/Plugin/Strings.php:166
6837
  msgid "Report Email"
6838
  msgstr ""
6839
 
6840
+ #: src/lib/src/Modules/Plugin/Strings.php:167
6841
  msgid "Where to send email reports"
6842
  msgstr ""
6843
 
6844
+ #: src/lib/src/Modules/Plugin/Strings.php:168
6845
  #, php-format
6846
  msgid "If this is empty, it will default to the blog admin email address: %s"
6847
  msgstr ""
6848
 
6849
+ #: src/lib/src/Modules/Plugin/Strings.php:172
6850
  msgid "In-Plugin Notices"
6851
  msgstr ""
6852
 
6853
+ #: src/lib/src/Modules/Plugin/Strings.php:173
6854
  msgid "Display Plugin Specific Notices"
6855
  msgstr ""
6856
 
6857
+ #: src/lib/src/Modules/Plugin/Strings.php:174
6858
  msgid ""
6859
  "Disable this option to hide certain plugin admin notices about available "
6860
  "updates and post-update notices."
6861
  msgstr ""
6862
 
6863
+ #: src/lib/src/Modules/Plugin/Strings.php:178
6864
  msgid "Show Plugin Badge"
6865
  msgstr ""
6866
 
6867
+ #: src/lib/src/Modules/Plugin/Strings.php:179
6868
  msgid "Display Plugin Badge On Your Site"
6869
  msgstr ""
6870
 
6871
+ #: src/lib/src/Modules/Plugin/Strings.php:180
6872
  msgid ""
6873
  "Enabling this option helps support the plugin by spreading the word about it "
6874
  "on your website."
6875
  msgstr ""
6876
 
6877
+ #: src/lib/src/Modules/Plugin/Strings.php:181
6878
  msgid ""
6879
  "The plugin badge also lets visitors know your are taking your website "
6880
  "security seriously."
6881
  msgstr ""
6882
 
6883
+ #: src/lib/src/Modules/Plugin/Strings.php:182
6884
  msgid "Read this carefully before enabling this option."
6885
  msgstr ""
6886
 
6887
+ #: src/lib/src/Modules/Plugin/Strings.php:186
6888
  msgid "Delete Plugin Settings"
6889
  msgstr ""
6890
 
6891
+ #: src/lib/src/Modules/Plugin/Strings.php:187
6892
  msgid "Delete All Plugin Settings Upon Plugin Deactivation"
6893
  msgstr ""
6894
 
6895
+ #: src/lib/src/Modules/Plugin/Strings.php:188
6896
  msgid "Careful: Removes all plugin options when you deactivate the plugin"
6897
  msgstr ""
6898
 
6899
+ #: src/lib/src/Modules/Plugin/Strings.php:192
6900
  msgid "XML-RPC Compatibility"
6901
  msgstr ""
6902
 
6903
+ #: src/lib/src/Modules/Plugin/Strings.php:193
6904
  msgid "Allow Login Through XML-RPC To By-Pass Accounts Management Rules"
6905
  msgstr ""
6906
 
6907
+ #: src/lib/src/Modules/Plugin/Strings.php:194
6908
  msgid ""
6909
  "Enable this if you need XML-RPC functionality e.g. if you use the WordPress "
6910
  "iPhone/Android App."
6911
  msgstr ""
6912
 
6913
+ #: src/lib/src/Modules/Plugin/Strings.php:198
6914
  msgid "Allow Import/Export"
6915
  msgstr ""
6916
 
6917
+ #: src/lib/src/Modules/Plugin/Strings.php:199
6918
  msgid "Allow Import And Export Of Options On This Site"
6919
  msgstr ""
6920
 
6921
+ #: src/lib/src/Modules/Plugin/Strings.php:200
6922
  msgid "Uncheck this box to completely disable import and export of options."
6923
  msgstr ""
6924
 
6925
+ #: src/lib/src/Modules/Plugin/Strings.php:201
6926
  msgid "Import/Export is a premium-only feature."
6927
  msgstr ""
6928
 
6929
+ #: src/lib/src/Modules/Plugin/Strings.php:205
6930
  msgid "Export Whitelist"
6931
  msgstr ""
6932
 
6933
+ #: src/lib/src/Modules/Plugin/Strings.php:206
6934
  msgid "Whitelisted Sites To Export Options From This Site"
6935
  msgstr ""
6936
 
6937
+ #: src/lib/src/Modules/Plugin/Strings.php:207
6938
  msgid "Whitelisted sites may export options from this site without the key."
6939
  msgstr ""
6940
 
6941
+ #: src/lib/src/Modules/Plugin/Strings.php:208
6942
  msgid "List each site URL on a new line."
6943
  msgstr ""
6944
 
6945
+ #: src/lib/src/Modules/Plugin/Strings.php:209
6946
  msgid "This is to be used in conjunction with the Master Import Site feature."
6947
  msgstr ""
6948
 
6949
+ #: src/lib/src/Modules/Plugin/Strings.php:213
6950
  msgid "Master Import Site"
6951
  msgstr ""
6952
 
6953
+ #: src/lib/src/Modules/Plugin/Strings.php:214
6954
  msgid "Automatically Import Options From This Site URL"
6955
  msgstr ""
6956
 
6957
+ #: src/lib/src/Modules/Plugin/Strings.php:215
6958
  msgid "Supplying a site URL here will make this site an 'Options Slave'."
6959
  msgstr ""
6960
 
6961
+ #: src/lib/src/Modules/Plugin/Strings.php:216
6962
  msgid "Options will be automatically exported from the Master site each day."
6963
  msgstr ""
6964
 
6965
+ #: src/lib/src/Modules/Plugin/Strings.php:217
6966
  msgid ""
6967
  "Use of this feature will overwrite existing options and replace them with "
6968
  "those from the Master Import Site."
6969
  msgstr ""
6970
 
6971
+ #: src/lib/src/Modules/Plugin/Strings.php:221
6972
  msgid "Notify Whitelist"
6973
  msgstr ""
6974
 
6975
+ #: src/lib/src/Modules/Plugin/Strings.php:222
6976
  msgid "Notify Sites On The Whitelist To Update Options From Master"
6977
  msgstr ""
6978
 
6979
+ #: src/lib/src/Modules/Plugin/Strings.php:223
6980
  msgid ""
6981
  "When enabled, manual options saving will notify sites on the whitelist to "
6982
  "export options from the Master site."
6983
  msgstr ""
6984
 
6985
+ #: src/lib/src/Modules/Plugin/Strings.php:227
6986
  #: src/processors/plugin_importexport.php:59
6987
  #: src/processors/plugin_importexport.php:63
6988
  msgid "Secret Key"
6989
  msgstr ""
6990
 
6991
+ #: src/lib/src/Modules/Plugin/Strings.php:228
6992
  msgid "Import/Export Secret Key"
6993
  msgstr ""
6994
 
6995
+ #: src/lib/src/Modules/Plugin/Strings.php:229
6996
  msgid ""
6997
  "Keep this Secret Key private as it will allow the import and export of "
6998
  "options."
6999
  msgstr ""
7000
 
7001
+ #: src/lib/src/Modules/Plugin/Strings.php:233
7002
  msgid "Installation ID"
7003
  msgstr ""
7004
 
7005
+ #: src/lib/src/Modules/Plugin/Strings.php:234
7006
  msgid "Unique Plugin Installation ID"
7007
  msgstr ""
7008
 
7009
+ #: src/lib/src/Modules/Plugin/Strings.php:235
7010
  msgid "Keep this ID private."
7011
  msgstr ""
7012
 
7013
+ #: src/lib/src/Modules/Plugin/Strings.php:239
7014
  msgid "reCAPTCHA Secret"
7015
  msgstr ""
7016
 
7017
+ #: src/lib/src/Modules/Plugin/Strings.php:240
7018
  msgid "Google reCAPTCHA Secret Key"
7019
  msgstr ""
7020
 
7021
+ #: src/lib/src/Modules/Plugin/Strings.php:241
7022
  msgid "Enter your Google reCAPTCHA secret key for use throughout the plugin."
7023
  msgstr ""
7024
 
7025
+ #: src/lib/src/Modules/Plugin/Strings.php:246
7026
  msgid "reCAPTCHA Site Key"
7027
  msgstr ""
7028
 
7029
+ #: src/lib/src/Modules/Plugin/Strings.php:247
7030
  msgid "Google reCAPTCHA Site Key"
7031
  msgstr ""
7032
 
7033
+ #: src/lib/src/Modules/Plugin/Strings.php:248
7034
  msgid "Enter your Google reCAPTCHA site key for use throughout the plugin"
7035
  msgstr ""
7036
 
7037
+ #: src/lib/src/Modules/Plugin/Strings.php:254
7038
  msgid "How Google reCAPTCHA Will Be Displayed By Default"
7039
  msgstr ""
7040
 
7041
+ #: src/lib/src/Modules/Plugin/Strings.php:305
7042
  msgid "Install"
7043
  msgstr ""
7044
 
7045
+ #: src/lib/src/Modules/Plugin/Strings.php:306
7046
  msgid "Update"
7047
  msgstr ""
7048
 
7049
+ #: src/lib/src/Modules/Plugin/Strings.php:307
7050
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:146
7051
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:172
7052
  msgid "Activate"
7053
  msgstr ""
7054
 
7055
+ #: src/lib/src/Modules/Plugin/Strings.php:308
7056
  #: src/lib/src/Tables/Render/AdminNotes.php:20
7057
  #: src/lib/src/Tables/Render/Base.php:203
7058
+ #: src/lib/src/Tables/Render/ScanMal.php:35
7059
  #: src/lib/src/Tables/Render/ScanUfc.php:29
7060
  msgid "Delete"
7061
  msgstr ""
7062
 
7063
+ #: src/lib/src/Modules/Plugin/Strings.php:309
7064
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:173
7065
  msgid "Edit Theme Options"
7066
  msgstr ""
7067
 
7068
+ #: src/lib/src/Modules/Plugin/Strings.php:310
7069
  msgid "Create/Edit"
7070
  msgstr ""
7071
 
7072
+ #: src/lib/src/Modules/Plugin/Strings.php:311
7073
  msgid "Publish"
7074
  msgstr ""
7075
 
7076
+ #: src/lib/src/Modules/Plugin/Strings.php:312
7077
  msgid "Author Name"
7078
  msgstr ""
7079
 
7080
+ #: src/lib/src/Modules/Plugin/Strings.php:313
7081
  msgid "Author Email"
7082
  msgstr ""
7083
 
7084
+ #: src/lib/src/Modules/Plugin/Strings.php:314
7085
  msgid "Comment Content"
7086
  msgstr ""
7087
 
7088
+ #: src/lib/src/Modules/Plugin/Strings.php:315
7089
  msgid "Browser User Agent"
7090
  msgstr ""
7091
 
7092
+ #: src/lib/src/Modules/Plugin/Strings.php:316
7093
  msgid "Login"
7094
  msgstr ""
7095
 
7096
+ #: src/lib/src/Modules/Plugin/Strings.php:317
7097
  msgid "Register"
7098
  msgstr ""
7099
 
7100
+ #: src/lib/src/Modules/Plugin/Strings.php:318
7101
  msgid "Lost Password"
7102
  msgstr ""
7103
 
7104
+ #: src/lib/src/Modules/Plugin/Strings.php:319
7105
  msgid "Checkout (WooCommerce)"
7106
  msgstr ""
7107
 
7108
+ #: src/lib/src/Modules/Plugin/Strings.php:320
7109
  msgid "Simple Requests"
7110
  msgstr ""
7111
 
7112
+ #: src/lib/src/Modules/Plugin/Strings.php:321
7113
  msgid "Logged-In Users"
7114
  msgstr ""
7115
 
7116
+ #: src/lib/src/Modules/Plugin/Strings.php:322
7117
  msgid "Search Engines"
7118
  msgstr ""
7119
 
7120
+ #: src/lib/src/Modules/Plugin/Strings.php:323
7121
  msgid "Uptime Monitoring Services"
7122
  msgstr ""
7123
 
7124
+ #: src/lib/src/Modules/Plugin/Strings.php:324
7125
  msgid "Enabled With Email Reports"
7126
  msgstr ""
7127
 
7128
+ #: src/lib/src/Modules/Plugin/Strings.php:326
7129
  msgid "Minor Versions Only"
7130
  msgstr ""
7131
 
7132
+ #: src/lib/src/Modules/Plugin/Strings.php:327
7133
  msgid "Major and Minor Versions"
7134
  msgstr ""
7135
 
7136
+ #: src/lib/src/Modules/Plugin/Strings.php:328
7137
  msgid "Let The Plugin Decide"
7138
  msgstr ""
7139
 
7140
+ #: src/lib/src/Modules/Plugin/Strings.php:329
7141
  msgid "As Soon As Possible"
7142
  msgstr ""
7143
 
7144
+ #: src/lib/src/Modules/Plugin/Strings.php:330
7145
  msgid "Move To Pending Moderation"
7146
  msgstr ""
7147
 
7148
+ #: src/lib/src/Modules/Plugin/Strings.php:331
7149
  msgid "Move To SPAM"
7150
  msgstr ""
7151
 
7152
+ #: src/lib/src/Modules/Plugin/Strings.php:332
7153
  msgid "Move To Trash"
7154
  msgstr ""
7155
 
7156
+ #: src/lib/src/Modules/Plugin/Strings.php:333
7157
  msgid "Block And Redirect"
7158
  msgstr ""
7159
 
7160
+ #: src/lib/src/Modules/Plugin/Strings.php:334
7161
  msgid "Invisible"
7162
  msgstr ""
7163
 
7164
+ #: src/lib/src/Modules/Plugin/Strings.php:335
7165
  msgid "Default Style"
7166
  msgstr ""
7167
 
7168
+ #: src/lib/src/Modules/Plugin/Strings.php:336
7169
  msgid "Redirect To Home Page"
7170
  msgstr ""
7171
 
7172
+ #: src/lib/src/Modules/Plugin/Strings.php:337
7173
  msgid "Return 404"
7174
  msgstr ""
7175
 
7176
+ #: src/lib/src/Modules/Plugin/Strings.php:338
7177
  msgid "Die"
7178
  msgstr ""
7179
 
7180
+ #: src/lib/src/Modules/Plugin/Strings.php:339
7181
  msgid "Scan Disabled"
7182
  msgstr ""
7183
 
7184
+ #: src/lib/src/Modules/Plugin/Strings.php:340
7185
  msgid "Scan Enabled"
7186
  msgstr ""
7187
 
7188
+ #: src/lib/src/Modules/Plugin/Strings.php:341
7189
  msgid "Automatic Scan Disabled"
7190
  msgstr ""
7191
 
7192
+ #: src/lib/src/Modules/Plugin/Strings.php:342
7193
  msgid "Automatic Scan Enabled"
7194
  msgstr ""
7195
 
7196
+ #: src/lib/src/Modules/Plugin/Strings.php:343
7197
  msgid "Scan Enabled - Send Email Notification"
7198
  msgstr ""
7199
 
7200
+ #: src/lib/src/Modules/Plugin/Strings.php:344
7201
  msgid "Scan Enabled - No Email Notification"
7202
  msgstr ""
7203
 
7204
+ #: src/lib/src/Modules/Plugin/Strings.php:345
7205
  msgid "Scan Enabled - Automatically Delete Files"
7206
  msgstr ""
7207
 
7208
+ #: src/lib/src/Modules/Plugin/Strings.php:346
7209
  msgid "Scan Enabled - Delete Files and Send Email Notification"
7210
  msgstr ""
7211
 
7212
+ #: src/lib/src/Modules/Plugin/Strings.php:347
7213
  msgid "Off: iFrames Not Blocked"
7214
  msgstr ""
7215
 
7216
+ #: src/lib/src/Modules/Plugin/Strings.php:348
7217
  msgid "On: Allow iFrames On The Same Domain"
7218
  msgstr ""
7219
 
7220
+ #: src/lib/src/Modules/Plugin/Strings.php:349
7221
  msgid "On: Block All iFrames"
7222
  msgstr ""
7223
 
7224
+ #: src/lib/src/Modules/Plugin/Strings.php:350
7225
  msgid "Default: Full Referrer URL (aka 'Unsafe URL')"
7226
  msgstr ""
7227
 
7228
+ #: src/lib/src/Modules/Plugin/Strings.php:351
7229
  msgid "No Referrer"
7230
  msgstr ""
7231
 
7232
+ #: src/lib/src/Modules/Plugin/Strings.php:352
7233
  msgid "No Referrer When Downgrade"
7234
  msgstr ""
7235
 
7236
+ #: src/lib/src/Modules/Plugin/Strings.php:353
7237
  msgid "Same Origin"
7238
  msgstr ""
7239
 
7240
+ #: src/lib/src/Modules/Plugin/Strings.php:354
7241
  msgid "Origin"
7242
  msgstr ""
7243
 
7244
+ #: src/lib/src/Modules/Plugin/Strings.php:355
7245
  msgid "Strict Origin"
7246
  msgstr ""
7247
 
7248
+ #: src/lib/src/Modules/Plugin/Strings.php:356
7249
  msgid "Origin When Cross-Origin"
7250
  msgstr ""
7251
 
7252
+ #: src/lib/src/Modules/Plugin/Strings.php:357
7253
  msgid "Strict Origin When Cross-Origin"
7254
  msgstr ""
7255
 
7256
+ #: src/lib/src/Modules/Plugin/Strings.php:358
7257
  msgid "Empty Header"
7258
  msgstr ""
7259
 
7260
+ #: src/lib/src/Modules/Plugin/Strings.php:359
7261
  msgid "Disabled - Don't Send This Header"
7262
  msgstr ""
7263
 
7264
+ #: src/lib/src/Modules/Plugin/Strings.php:360
7265
  msgid "Minute"
7266
  msgstr ""
7267
 
7268
+ #: src/lib/src/Modules/Plugin/Strings.php:361
7269
  msgid "Hour"
7270
  msgstr ""
7271
 
7272
+ #: src/lib/src/Modules/Plugin/Strings.php:362
7273
  msgid "Day"
7274
  msgstr ""
7275
 
7276
+ #: src/lib/src/Modules/Plugin/Strings.php:363
7277
  msgid "Week"
7278
  msgstr ""
7279
 
7280
+ #: src/lib/src/Modules/Plugin/Strings.php:364
7281
  msgid "Month"
7282
  msgstr ""
7283
 
7284
+ #: src/lib/src/Modules/Plugin/Strings.php:365
7285
  msgid "With Shield Bot Protection"
7286
  msgstr ""
7287
 
7288
+ #: src/lib/src/Modules/Plugin/Strings.php:366
7289
  msgid "Audit Log Only"
7290
  msgstr ""
7291
 
7292
+ #: src/lib/src/Modules/Plugin/Strings.php:367
7293
  msgid "Increment Offense Counter"
7294
  msgstr ""
7295
 
7296
+ #: src/lib/src/Modules/Plugin/Strings.php:368
7297
  msgid "Double-Increment Offense Counter"
7298
  msgstr ""
7299
 
7300
+ #: src/lib/src/Modules/Plugin/Strings.php:369
7301
  msgid "Immediate Block"
7302
  msgstr ""
7303
 
7304
+ #: src/lib/src/Modules/Plugin/Strings.php:378
7305
  msgid "Security Dashboard"
7306
  msgstr ""
7307
 
7308
+ #: src/lib/src/Modules/Plugin/Strings.php:379
7309
  msgid "Automatically Detect Visitor IP"
7310
  msgstr ""
7311
 
7312
+ #: src/lib/src/Modules/Plugin/Strings.php:381
7313
  msgid "IP Address White List"
7314
  msgstr ""
7315
 
7316
+ #: src/lib/src/Modules/Plugin/Strings.php:382
7317
  msgid ""
7318
  "Any IP addresses on this list will by-pass all Plugin Security Checking."
7319
  msgstr ""
7320
 
7321
+ #: src/lib/src/Modules/Plugin/Strings.php:384
7322
  msgid "Choose IP Addresses To Blacklist"
7323
  msgstr ""
7324
 
7325
+ #: src/lib/src/Modules/Plugin/Strings.php:385
7326
  #, php-format
7327
  msgid "Recommendation - %s"
7328
  msgstr ""
7329
 
7330
+ #: src/lib/src/Modules/Plugin/Strings.php:386
7331
  msgid "Blacklist"
7332
  msgstr ""
7333
 
7334
+ #: src/lib/src/Modules/Plugin/Strings.php:387
7335
  msgid "Logging"
7336
  msgstr ""
7337
 
7338
+ #: src/lib/src/Modules/Plugin/Strings.php:388
7339
  #, php-format
7340
  msgid ""
7341
  "User \"%s\" was forcefully logged out as they were not verified by either "
7342
  "cookie or IP address (or both)."
7343
  msgstr ""
7344
 
7345
+ #: src/lib/src/Modules/Plugin/Strings.php:389
7346
  #, php-format
7347
  msgid ""
7348
  "User \"%s\" was found to be un-verified at the given IP Address: \"%s\"."
7349
  msgstr ""
7350
 
7351
+ #: src/lib/src/Modules/Plugin/Strings.php:390
7352
  msgid "Cookie"
7353
  msgstr ""
7354
 
7355
+ #: src/lib/src/Modules/Plugin/Strings.php:392
7356
  #: src/lib/src/Tables/Build/Traffic.php:140
7357
  msgid "IP"
7358
  msgstr ""
7359
 
7360
+ #: src/lib/src/Modules/Plugin/Strings.php:393
7361
  msgid ""
7362
  "This will restrict all user login sessions to a single browser. Use this if "
7363
  "your users have dynamic IP addresses."
7364
  msgstr ""
7365
 
7366
+ #: src/lib/src/Modules/Plugin/Strings.php:394
7367
  msgid ""
7368
  "All users will be required to authenticate their login by email-based two-"
7369
  "factor authentication, when logging in from a new IP address"
7370
  msgstr ""
7371
 
7372
+ #: src/lib/src/Modules/Plugin/Strings.php:395
7373
  msgid "2-Factor Auth"
7374
  msgstr ""
7375
 
7376
+ #: src/lib/src/Modules/Plugin/Strings.php:396
7377
  msgid "Include Logged-In Users"
7378
  msgstr ""
7379
 
7380
+ #: src/lib/src/Modules/Plugin/Strings.php:397
7381
  msgid "You may also enable GASP for logged in users"
7382
  msgstr ""
7383
 
7384
+ #: src/lib/src/Modules/Plugin/Strings.php:398
7385
  msgid ""
7386
  "Since logged-in users would be expected to be vetted already, this is off by "
7387
  "default."
7388
  msgstr ""
7389
 
7390
+ #: src/lib/src/Modules/Plugin/Strings.php:400
7391
  msgid "Protect your security plugin not just your WordPress site"
7392
  msgstr ""
7393
 
7394
+ #: src/lib/src/Modules/Plugin/Strings.php:403
7395
  msgid "Get a view on what happens on your site, when it happens"
7396
  msgstr ""
7397
 
7398
+ #: src/lib/src/Modules/Plugin/Strings.php:404
7399
  msgid "Audit Trail Viewer"
7400
  msgstr ""
7401
 
7402
+ #: src/lib/src/Modules/Plugin/Strings.php:406
7403
  msgid "Take back full control of WordPress automatic updates"
7404
  msgstr ""
7405
 
7406
+ #: src/lib/src/Modules/Plugin/Strings.php:407
7407
  msgid "Comments SPAM"
7408
  msgstr ""
7409
 
7410
+ #: src/lib/src/Modules/Plugin/Strings.php:408
7411
  msgid "Block Bad IPs/Visitors"
7412
  msgstr ""
7413
 
7414
+ #: src/lib/src/Modules/Plugin/Strings.php:409
7415
  msgid "Block comment SPAM and retain your privacy"
7416
  msgstr ""
7417
 
7418
+ #: src/lib/src/Modules/Plugin/Strings.php:412
7419
  msgid "Automatically block malicious URLs and data sent to your site"
7420
  msgstr ""
7421
 
7422
+ #: src/lib/src/Modules/Plugin/Strings.php:415
7423
  msgid "Control HTTP Security Headers"
7424
  msgstr ""
7425
 
7426
+ #: src/lib/src/Modules/Plugin/Strings.php:417
7427
  msgid "Manage Visitor IP Address"
7428
  msgstr ""
7429
 
7430
+ #: src/lib/src/Modules/Plugin/Strings.php:419
7431
  msgid "Harden the more loosely controlled settings of your site"
7432
  msgstr ""
7433
 
7434
+ #: src/lib/src/Modules/Plugin/Strings.php:421
7435
  msgid ""
7436
  "Block brute force attacks and secure user identities with Two-Factor "
7437
  "Authentication"
7438
  msgstr ""
7439
 
7440
+ #: src/lib/src/Modules/Plugin/Strings.php:422
7441
  msgid "Dashboard"
7442
  msgstr ""
7443
 
7444
+ #: src/lib/src/Modules/Plugin/Strings.php:423
7445
  msgid "General Plugin Settings"
7446
  msgstr ""
7447
 
7448
+ #: src/lib/src/Modules/Plugin/Strings.php:424
7449
  msgid "Statistics"
7450
  msgstr ""
7451
 
7452
+ #: src/lib/src/Modules/Plugin/Strings.php:425
7453
  msgid "Summary of the main security actions taken by this plugin"
7454
  msgstr ""
7455
 
7456
+ #: src/lib/src/Modules/Plugin/Strings.php:426
7457
  msgid "Stats Viewer"
7458
  msgstr ""
7459
 
7460
+ #: src/lib/src/Modules/Plugin/Strings.php:427
7461
  msgid "Premium Support"
7462
  msgstr ""
7463
 
7464
+ #: src/lib/src/Modules/Plugin/Strings.php:428
7465
  msgid "Premium Plugin Support Centre"
7466
  msgstr ""
7467
 
7468
+ #: src/lib/src/Modules/Plugin/Strings.php:430
7469
  msgid ""
7470
  "Get true user sessions and control account sharing, session duration and "
7471
  "timeouts"
7472
  msgstr ""
7473
 
7474
+ #: src/lib/src/Modules/Plugin/Strings.php:431
7475
  msgid "Two-Factor Authentication"
7476
  msgstr ""
7477
 
7478
+ #: src/lib/src/Modules/Plugin/Strings.php:434
7479
  msgid "Dark Theme"
7480
  msgstr ""
7481
 
7482
+ #: src/lib/src/Modules/Plugin/Strings.php:435
7483
  msgid "Once"
7484
  msgstr ""
7485
 
7486
+ #: src/lib/src/Modules/Plugin/Strings.php:436
7487
  msgid "Twice"
7488
  msgstr ""
7489
 
7490
+ #: src/lib/src/Modules/Plugin/Strings.php:437
7491
  msgid "Go To Security Dashboard"
7492
  msgstr ""
7493
 
7494
+ #: src/lib/src/Modules/Plugin/Strings.php:439
7495
+ msgid "None - Turn Off Malware Intelligence Network"
7496
+ msgstr ""
7497
+
7498
+ #: src/lib/src/Modules/Plugin/Strings.php:440
7499
+ msgid "Low"
7500
+ msgstr ""
7501
+
7502
+ #: src/lib/src/Modules/Plugin/Strings.php:442
7503
+ msgid "High"
7504
+ msgstr ""
7505
+
7506
+ #: src/lib/src/Modules/Plugin/Strings.php:443
7507
+ msgid "Full"
7508
+ msgstr ""
7509
+
7510
  #: src/lib/src/Modules/SecurityAdmin/AdminNotices.php:42
7511
  #: src/lib/src/Modules/SecurityAdmin/AdminNotices.php:67
7512
  #, php-format
7627
  msgid "Access Restriction Zones"
7628
  msgstr ""
7629
 
 
 
 
 
 
 
7630
  #: src/lib/src/Modules/SecurityAdmin/Strings.php:66
7631
  #, php-format
7632
  msgid "Rename and re-brand the %s plugin for your client site installations."
8612
  msgid "Please contact your website administrator."
8613
  msgstr ""
8614
 
8615
+ #: src/lib/src/Scans/Mal/Repair.php:108
8616
  #, php-format
8617
  msgid "%s not installed from WordPress.org."
8618
  msgstr ""
8619
 
8620
+ #: src/lib/src/Scans/Mal/Repair.php:109 src/processors/hack_protect.php:283
8621
  #: src/processors/hackprotect_scan_apc.php:84
8622
  #: src/processors/hackprotect_scan_wpv.php:241
8623
  msgid "Plugin"
8624
  msgstr ""
8625
 
8626
+ #: src/lib/src/Scans/Mal/Repair.php:116
8627
  msgid "Plugin developer doesn't use SVN tags for official releases."
8628
  msgstr ""
8629
 
8644
  msgid "Abandoned"
8645
  msgstr ""
8646
 
8647
+ #: src/lib/src/Tables/Build/ScanMal.php:39
8648
+ #: src/processors/hackprotect_scan_mal.php:119
8649
  msgid "Potential Malware Detected"
8650
  msgstr ""
8651
 
8652
+ #: src/lib/src/Tables/Build/ScanMal.php:40
8653
+ msgid "Pattern Detected"
8654
+ msgstr ""
8655
+
8656
+ #: src/lib/src/Tables/Build/ScanMal.php:41
8657
+ msgid "Affected line numbers"
8658
+ msgstr ""
8659
+
8660
+ #: src/lib/src/Tables/Build/ScanMal.php:45
8661
+ msgid "False Positive Confidence"
8662
+ msgstr ""
8663
+
8664
+ #: src/lib/src/Tables/Build/ScanMal.php:52
8665
  msgid "Repair Unavailable"
8666
  msgstr ""
8667
 
8719
  msgstr ""
8720
 
8721
  #: src/lib/src/Tables/Render/Base.php:215
8722
+ #: src/lib/src/Tables/Render/ScanMal.php:36
8723
  #: src/lib/src/Tables/Render/ScanWcf.php:29
8724
  msgid "Repair"
8725
  msgstr ""
8792
  msgid "Deactivate"
8793
  msgstr ""
8794
 
 
 
 
 
 
 
 
 
8795
  #: src/lib/src/Tables/Render/ScanWpv.php:75
8796
  msgid "Vulnerability"
8797
  msgstr ""
8809
  msgid "Page"
8810
  msgstr ""
8811
 
8812
+ #: src/lib/src/Utilities/ReCaptcha/TestRequest.php:40
8813
+ #: src/lib/src/Utilities/ReCaptcha/TestRequest.php:47
8814
  msgid "Whoops."
8815
  msgstr ""
8816
 
8817
+ #: src/lib/src/Utilities/ReCaptcha/TestRequest.php:40
8818
  msgid "Google reCAPTCHA was not submitted."
8819
  msgstr ""
8820
 
8821
+ #: src/lib/src/Utilities/ReCaptcha/TestRequest.php:48
8822
  msgid "Google reCAPTCHA verification failed."
8823
  msgstr ""
8824
 
8825
+ #: src/lib/src/Utilities/ReCaptcha/TestRequest.php:50
8826
  msgid "Maybe refresh the page and try again."
8827
  msgstr ""
8828
 
9101
  msgid "Abandoned Plugin(s) Discovered On Your Site."
9102
  msgstr ""
9103
 
9104
+ #: src/processors/hackprotect_scan_base.php:373
9105
  msgid "Run Scanner"
9106
  msgstr ""
9107
 
9108
+ #: src/processors/hackprotect_scan_mal.php:147
9109
  #, php-format
9110
  msgid "The %s Malware Scanner found files with potential malware."
9111
  msgstr ""
9112
 
9113
+ #: src/processors/hackprotect_scan_mal.php:149
9114
  msgid ""
9115
  "You must examine the file(s) carefully to determine whether suspicious code "
9116
  "is really present."
9117
  msgstr ""
9118
 
9119
+ #: src/processors/hackprotect_scan_mal.php:150
9120
  #, php-format
9121
  msgid ""
9122
  "The %s Malware Scanner searches for common malware patterns and so false "
9123
  "positives (detection errors) are to be expected sometimes."
9124
  msgstr ""
9125
 
9126
+ #: src/processors/hackprotect_scan_mal.php:151
9127
  #: src/processors/hackprotect_scan_ptg.php:592
9128
  #: src/processors/hackprotect_scan_ufc.php:115
9129
  #: src/processors/hackprotect_scan_wcf.php:98
9132
  msgid "Site URL"
9133
  msgstr ""
9134
 
9135
+ #: src/processors/hackprotect_scan_mal.php:159
9136
  #: src/processors/hackprotect_scan_wcf.php:106
9137
  #, php-format
9138
  msgid "%s has already attempted to repair the files."
9139
  msgstr ""
9140
 
9141
+ #: src/processors/hackprotect_scan_mal.php:160
9142
  #: src/processors/hackprotect_scan_wcf.php:107
9143
  msgid ""
9144
  "But, you should always check these files to ensure everything is as you "
9145
  "expect."
9146
  msgstr ""
9147
 
9148
+ #: src/processors/hackprotect_scan_mal.php:163
9149
  #: src/processors/hackprotect_scan_wcf.php:110
9150
  msgid ""
9151
  "You should review these files and replace them with official versions if "
9152
  "required."
9153
  msgstr ""
9154
 
9155
+ #: src/processors/hackprotect_scan_mal.php:164
9156
  #: src/processors/hackprotect_scan_wcf.php:111
9157
  msgid ""
9158
  "Alternatively you can have the plugin attempt to repair/replace these files "
9159
  "automatically."
9160
  msgstr ""
9161
 
9162
+ #: src/processors/hackprotect_scan_mal.php:170
9163
  #: src/processors/hackprotect_scan_ufc.php:131
9164
  #: src/processors/hackprotect_scan_wcf.php:117
9165
  msgid "We recommend you run the scanner to review your site"
9166
  msgstr ""
9167
 
9168
+ #: src/processors/hackprotect_scan_mal.php:175
9169
  #: src/processors/hackprotect_scan_ufc.php:136
9170
  #: src/processors/hackprotect_scan_wcf.php:122
9171
  msgid "More Info On This Scanner"
9172
  msgstr ""
9173
 
9174
+ #: src/processors/hackprotect_scan_mal.php:187
9175
  msgid "The following files contain suspected malware:"
9176
  msgstr ""
9177
 
9335
  msgid "No custom message provided."
9336
  msgstr ""
9337
 
9338
+ #: src/processors/ips.php:250
9339
  #, php-format
9340
  msgid "You've been blocked by the %s plugin"
9341
  msgstr ""
9342
 
9343
+ #: src/processors/ips.php:257
9344
  #, php-format
9345
  msgid "Time remaining on black list: %s"
9346
  msgstr ""
9347
 
9348
+ #: src/processors/ips.php:258
9349
  #, php-format
9350
  msgid "%s minute"
9351
  msgid_plural "%s minutes"
9352
  msgstr[0] ""
9353
  msgstr[1] ""
9354
 
9355
+ #: src/processors/ips.php:260
9356
  #, php-format
9357
  msgid ""
9358
  "You tripped the security plugin defenses a total of %s times making you a "
9359
  "suspect."
9360
  msgstr ""
9361
 
9362
+ #: src/processors/ips.php:261
9363
  msgid ""
9364
  "If you believe this to be in error, please contact the site owner and quote "
9365
  "your IP address below."
9366
  msgstr ""
9367
 
9368
+ #: src/processors/ips.php:265
9369
  msgid "Auto-Unblock Your IP"
9370
  msgstr ""
9371
 
9372
+ #: src/processors/ips.php:266
9373
  msgid ""
9374
  "You can automatically unblock your IP address by clicking the button below."
9375
  msgstr ""
9376
 
9377
+ #: src/processors/ips.php:267
9378
  msgid "Unblock My IP Address"
9379
  msgstr ""
9380
 
9381
+ #: src/processors/ips.php:279 src/processors/loginprotect_gasp.php:27
9382
  msgid "You MUST enable Javascript to be able to login"
9383
  msgstr ""
9384
 
9385
+ #: src/processors/ips.php:509
9386
  msgid "No Label"
9387
  msgstr ""
9388
 
9398
  msgid "Anonymous access to the WordPress Rest API has been restricted by %s."
9399
  msgstr ""
9400
 
9401
+ #: src/processors/loginprotect_cooldown.php:20
9402
  msgid "Request Cooldown in effect."
9403
  msgstr ""
9404
 
9405
+ #: src/processors/loginprotect_cooldown.php:22
9406
  #, php-format
9407
  msgid "You must wait %s seconds before attempting this action again."
9408
  msgstr ""
9909
  msgid "The secret key is found in: %s"
9910
  msgstr ""
9911
 
 
 
 
 
9912
  #: src/processors/plugin_importexport.php:65
9913
  msgid "Turn On"
9914
  msgstr ""
9978
  msgid "Handshake verification failed."
9979
  msgstr ""
9980
 
9981
+ #: src/processors/sessions.php:95
9982
  msgid "You're already logged-in."
9983
  msgstr ""
9984
 
9985
+ #: src/processors/sessions.php:99
9986
  msgid "Go To Admin"
9987
  msgstr ""
9988
 
10071
  "password."
10072
  msgstr ""
10073
 
10074
+ #: src/processors/usermanagement_passwords.php:173
10075
  msgid ""
10076
  "Your security administrator has imposed requirements for password quality."
10077
  msgstr ""
10078
 
10079
+ #: src/processors/usermanagement_passwords.php:174
10080
  msgid "Reason"
10081
  msgstr ""
10082
 
10083
+ #: src/processors/usermanagement_passwords.php:239
10084
  #, php-format
10085
  msgid "Password length (%s) too short (min: %s characters)"
10086
  msgstr ""
10087
 
10088
+ #: src/processors/usermanagement_passwords.php:294
10089
+ #: src/processors/usermanagement_passwords.php:356
10090
  msgid "Please use a different password."
10091
  msgstr ""
10092
 
10093
+ #: src/processors/usermanagement_passwords.php:295
10094
  msgid "This password has already been pwned."
10095
  msgstr ""
10096
 
10097
+ #: src/processors/usermanagement_passwords.php:299
10098
+ #: src/processors/usermanagement_passwords.php:361
10099
  #, php-format
10100
  msgid "%s times"
10101
  msgstr ""
10102
 
10103
+ #: src/processors/usermanagement_passwords.php:357
10104
  msgid "This password has been pwned."
10105
  msgstr ""
10106
 
10372
 
10373
  #: src/wizards/plugin.php:469 src/wizards/plugin.php:502
10374
  #: src/wizards/plugin.php:535 src/wizards/plugin.php:571
10375
+ #: src/wizards/plugin.php:679
10376
  msgid "No changes were made as no option was selected"
10377
  msgstr ""
10378
 
10379
  #: src/wizards/plugin.php:482 src/wizards/plugin.php:515
10380
+ #: src/wizards/plugin.php:550 src/wizards/plugin.php:695
10381
  msgid "Enabled"
10382
  msgstr ""
10383
 
10384
  #: src/wizards/plugin.php:486 src/wizards/plugin.php:519
10385
+ #: src/wizards/plugin.php:554 src/wizards/plugin.php:699
10386
  #, php-format
10387
  msgid "%s setting could not be changed at this time."
10388
  msgstr ""
10395
  msgid "Search item added."
10396
  msgstr ""
10397
 
10398
+ #: src/wizards/plugin.php:661
10399
  msgid "All entries were deleted"
10400
  msgstr ""
10401
 
10402
+ #: src/wizards/plugin.php:664
10403
  msgid "Please check the box to confirm deletion."
10404
  msgstr ""
10405
 
languages/wp-simple-firewall-ja.mo CHANGED
Binary file
languages/wp-simple-firewall-nl_NL.mo CHANGED
Binary file
plugin-spec.php CHANGED
@@ -1,8 +1,8 @@
1
  {
2
  "properties": {
3
- "version": "8.1.1",
4
- "release_timestamp": 1568814556,
5
- "build": "201909.1802",
6
  "slug_parent": "icwp",
7
  "slug_plugin": "wpsf",
8
  "human_name": "Shield",
1
  {
2
  "properties": {
3
+ "version": "8.2.0",
4
+ "release_timestamp": 1569918000,
5
+ "build": "201910.0101",
6
  "slug_parent": "icwp",
7
  "slug_plugin": "wpsf",
8
  "human_name": "Shield",
readme.txt CHANGED
@@ -7,8 +7,8 @@ Tags: scan, firewall, two factor authentication, login protection, malware
7
  Requires at least: 3.5.2
8
  Requires PHP: 5.4.0
9
  Recommended PHP: 7.0
10
- Tested up to: 5.2
11
- Stable tag: 8.1.1
12
 
13
  Security protection from hackers through smarter automation. Powerful scanners, 2-Factor Auth, limit logins, auto IP blocks & more.
14
 
@@ -370,7 +370,27 @@ You will always be able to use Shield Security and its free features in-full.
370
 
371
  [Go Pro for just $1/month](https://icwp.io/aa).
372
 
373
- = 8.1.1 - Current Release =
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
374
  *Released: 18th September, 2019* - [Release Notes](https://icwp.io/fy)
375
 
376
  * **(v.1)** FIXED: Error for sites pre-5.0 that don't have function `determine_locale()`
7
  Requires at least: 3.5.2
8
  Requires PHP: 5.4.0
9
  Recommended PHP: 7.0
10
+ Tested up to: 5.3
11
+ Stable tag: 8.2.0
12
 
13
  Security protection from hackers through smarter automation. Powerful scanners, 2-Factor Auth, limit logins, auto IP blocks & more.
14
 
370
 
371
  [Go Pro for just $1/month](https://icwp.io/aa).
372
 
373
+ = 8.2.0 - Current Release =
374
+ *Released: 1st October, 2019* - [Release Notes](https://icwp.io/g0)
375
+
376
+ * **(v.0)** IMPROVED: [**PRO**] Malware scanner now uses network intelligence to the gather information on malware results.
377
+ * **(v.0)** NEW: Traffic Watcher feature is now free for all users (no longer Pro-only).
378
+ * **(v.0)** IMPROVED: Scanning cron is improved and more efficient.
379
+ * **(v.0)** ADDED: Bulk Delete/Repair/Ignore actions now available for Malware scan results.
380
+ * **(v.0)** IMPROVED: Malware scan results now provide details of affected line numbers and patterns discovered.
381
+ * **(v.0)** IMPROVED: Malware scanner only scans `wp-admin`, `wp-includes`, `wp-content` folders, and files in top-level directory.
382
+ * **(v.0)** IMPROVED: Malware scanner now excludes `wp-content/cache/` directory.
383
+ * **(v.0)** IMPROVED: Malware scanner performance improved with caching.
384
+ * **(v.0)** IMPROVED: Malware auto-repair now works more consistently.
385
+ * **(v.0)** IMPROVED: Updated default firewall whitelist rules.
386
+ * **(v.0)** IMPROVED: If the PWNED Passwords API request fails entirely, the password check is skipped.
387
+ * **(v.0)** ADDED: Japanese translations are at 100%.
388
+ * **(v.0)** IMPROVED: Dutch translations are greatly improved (a huge thank you to Fred!).
389
+ * **(v.0)** FIXED: Audit Trail correctly logs multiple occurrences for the same type of event on the same page request.
390
+ * **(v.0)** FIXED: Audit Trail now correctly logs Google reCAPTCHA failure events.
391
+ * **(v.0)** FIXED: PHP error when firewall was set to kill response without a user message.
392
+
393
+ = 8.1 - Series =
394
  *Released: 18th September, 2019* - [Release Notes](https://icwp.io/fy)
395
 
396
  * **(v.1)** FIXED: Error for sites pre-5.0 that don't have function `determine_locale()`
src/common/icwp-serviceproviders.php CHANGED
@@ -43,7 +43,7 @@ class ICWP_WPSF_ServiceProviders extends ICWP_WPSF_Foundation {
43
  4 => $this->downloadServiceIps_Cloudflare( 4 ),
44
  6 => $this->downloadServiceIps_Cloudflare( 6 )
45
  ];
46
- $oWp->setTransient( $sStoreKey, $aIps, WEEK_IN_SECONDS*4 );
47
  }
48
  return $aIps;
49
  }
@@ -82,7 +82,7 @@ class ICWP_WPSF_ServiceProviders extends ICWP_WPSF_Foundation {
82
  $aIps = $oWp->getTransient( $sStoreKey );
83
  if ( empty( $aIps ) ) {
84
  $aIps = $this->downloadServiceIps_iControlWP();
85
- $oWp->setTransient( $sStoreKey, $aIps, WEEK_IN_SECONDS*2 );
86
  }
87
 
88
  return $bFlat ? array_merge( $aIps[ 4 ], $aIps[ 6 ] ) : $aIps;
@@ -98,7 +98,7 @@ class ICWP_WPSF_ServiceProviders extends ICWP_WPSF_Foundation {
98
  $aIps = $oWp->getTransient( $sStoreKey );
99
  if ( empty( $aIps ) ) {
100
  $aIps = $this->downloadServiceIps_ManageWp();
101
- $oWp->setTransient( $sStoreKey, $aIps, WEEK_IN_SECONDS*4 );
102
  }
103
  return $aIps;
104
  }
@@ -116,7 +116,7 @@ class ICWP_WPSF_ServiceProviders extends ICWP_WPSF_Foundation {
116
  4 => $this->downloadServiceIps_Pingdom( 4 ),
117
  6 => $this->downloadServiceIps_Pingdom( 6 )
118
  ];
119
- $oWp->setTransient( $sStoreKey, $aIps, WEEK_IN_SECONDS*4 );
120
  }
121
  return $aIps;
122
  }
@@ -131,7 +131,7 @@ class ICWP_WPSF_ServiceProviders extends ICWP_WPSF_Foundation {
131
  $aIps = $oWp->getTransient( $sStoreKey );
132
  if ( empty( $aIps ) || !is_array( $aIps ) ) {
133
  $aIps = $this->downloadServiceIps_StatusCake();
134
- $oWp->setTransient( $sStoreKey, $aIps, WEEK_IN_SECONDS*4 );
135
  }
136
  return $aIps;
137
  }
@@ -149,7 +149,7 @@ class ICWP_WPSF_ServiceProviders extends ICWP_WPSF_Foundation {
149
  4 => $this->downloadServiceIps_UptimeRobot( 4 ),
150
  6 => $this->downloadServiceIps_UptimeRobot( 6 )
151
  ];
152
- $oWp->setTransient( $sStoreKey, $aIps, WEEK_IN_SECONDS*4 );
153
  }
154
  return $aIps;
155
  }
@@ -543,4 +543,11 @@ class ICWP_WPSF_ServiceProviders extends ICWP_WPSF_Foundation {
543
  $aIps = empty( $sRaw ) ? [] : explode( "\n", $sRaw );
544
  return array_filter( array_map( 'trim', $aIps ) );
545
  }
 
 
 
 
 
 
 
546
  }
43
  4 => $this->downloadServiceIps_Cloudflare( 4 ),
44
  6 => $this->downloadServiceIps_Cloudflare( 6 )
45
  ];
46
+ $oWp->setTransient( $sStoreKey, $aIps, $this->getLookupExpiration() );
47
  }
48
  return $aIps;
49
  }
82
  $aIps = $oWp->getTransient( $sStoreKey );
83
  if ( empty( $aIps ) ) {
84
  $aIps = $this->downloadServiceIps_iControlWP();
85
+ $oWp->setTransient( $sStoreKey, $aIps, $this->getLookupExpiration() );
86
  }
87
 
88
  return $bFlat ? array_merge( $aIps[ 4 ], $aIps[ 6 ] ) : $aIps;
98
  $aIps = $oWp->getTransient( $sStoreKey );
99
  if ( empty( $aIps ) ) {
100
  $aIps = $this->downloadServiceIps_ManageWp();
101
+ $oWp->setTransient( $sStoreKey, $aIps, $this->getLookupExpiration() );
102
  }
103
  return $aIps;
104
  }
116
  4 => $this->downloadServiceIps_Pingdom( 4 ),
117
  6 => $this->downloadServiceIps_Pingdom( 6 )
118
  ];
119
+ $oWp->setTransient( $sStoreKey, $aIps, $this->getLookupExpiration() );
120
  }
121
  return $aIps;
122
  }
131
  $aIps = $oWp->getTransient( $sStoreKey );
132
  if ( empty( $aIps ) || !is_array( $aIps ) ) {
133
  $aIps = $this->downloadServiceIps_StatusCake();
134
+ $oWp->setTransient( $sStoreKey, $aIps, $this->getLookupExpiration() );
135
  }
136
  return $aIps;
137
  }
149
  4 => $this->downloadServiceIps_UptimeRobot( 4 ),
150
  6 => $this->downloadServiceIps_UptimeRobot( 6 )
151
  ];
152
+ $oWp->setTransient( $sStoreKey, $aIps, $this->getLookupExpiration() );
153
  }
154
  return $aIps;
155
  }
543
  $aIps = empty( $sRaw ) ? [] : explode( "\n", $sRaw );
544
  return array_filter( array_map( 'trim', $aIps ) );
545
  }
546
+
547
+ /**
548
+ * @return int
549
+ */
550
+ private function getLookupExpiration() {
551
+ return WEEK_IN_SECONDS*2;
552
+ }
553
  }
src/config/feature-audit_trail.php CHANGED
@@ -231,6 +231,9 @@
231
  }
232
  ],
233
  "definitions": {
 
 
 
234
  "audit_trail_default_max_entries": 100,
235
  "audit_trail_table_name": "audit_trail",
236
  "audit_trail_table_columns": [
@@ -257,10 +260,12 @@
257
  ],
258
  "events": {
259
  "plugin_activated": {
260
- "context": "plugins"
 
261
  },
262
  "plugin_deactivated": {
263
- "context": "plugins"
 
264
  },
265
  "plugin_file_edited": {
266
  "context": "plugins"
@@ -278,22 +283,28 @@
278
  "context": "wordpress"
279
  },
280
  "post_deleted": {
281
- "context": "posts"
 
282
  },
283
  "post_trashed": {
284
- "context": "posts"
 
285
  },
286
  "post_recovered": {
287
- "context": "posts"
 
288
  },
289
  "post_updated": {
290
- "context": "posts"
 
291
  },
292
  "post_published": {
293
- "context": "posts"
 
294
  },
295
  "post_unpublished": {
296
- "context": "posts"
 
297
  },
298
  "user_login": {
299
  "context": "users"
@@ -302,16 +313,19 @@
302
  "context": "users"
303
  },
304
  "user_deleted": {
305
- "context": "users"
 
306
  },
307
  "user_deleted_reassigned": {
308
  "context": "users"
309
  },
310
- "email_attempt_send": {
311
- "context": "emails"
 
312
  },
313
- "email_send_invalid": {
314
- "context": "emails"
 
315
  }
316
  }
317
  }
231
  }
232
  ],
233
  "definitions": {
234
+ "db_classes": {
235
+ "audit": "\\FernleafSystems\\Wordpress\\Plugin\\Shield\\Databases\\AuditTrail\\Handler"
236
+ },
237
  "audit_trail_default_max_entries": 100,
238
  "audit_trail_table_name": "audit_trail",
239
  "audit_trail_table_columns": [
260
  ],
261
  "events": {
262
  "plugin_activated": {
263
+ "context": "plugins",
264
+ "audit_multiple": true
265
  },
266
  "plugin_deactivated": {
267
+ "context": "plugins",
268
+ "audit_multiple": true
269
  },
270
  "plugin_file_edited": {
271
  "context": "plugins"
283
  "context": "wordpress"
284
  },
285
  "post_deleted": {
286
+ "context": "posts",
287
+ "audit_multiple": true
288
  },
289
  "post_trashed": {
290
+ "context": "posts",
291
+ "audit_multiple": true
292
  },
293
  "post_recovered": {
294
+ "context": "posts",
295
+ "audit_multiple": true
296
  },
297
  "post_updated": {
298
+ "context": "posts",
299
+ "audit_multiple": true
300
  },
301
  "post_published": {
302
+ "context": "posts",
303
+ "audit_multiple": true
304
  },
305
  "post_unpublished": {
306
+ "context": "posts",
307
+ "audit_multiple": true
308
  },
309
  "user_login": {
310
  "context": "users"
313
  "context": "users"
314
  },
315
  "user_deleted": {
316
+ "context": "users",
317
+ "audit_multiple": true
318
  },
319
  "user_deleted_reassigned": {
320
  "context": "users"
321
  },
322
+ "email_attempt_send": {
323
+ "context": "emails",
324
+ "audit_multiple": true
325
  },
326
+ "email_send_invalid": {
327
+ "context": "emails",
328
+ "audit_multiple": true
329
  }
330
  }
331
  }
src/config/feature-autoupdates.php CHANGED
@@ -190,7 +190,7 @@
190
  {
191
  "key": "enable_upgrade_notification_email",
192
  "section": "section_options",
193
- "default": "",
194
  "type": "checkbox",
195
  "link_info": "",
196
  "link_blog": "",
190
  {
191
  "key": "enable_upgrade_notification_email",
192
  "section": "section_options",
193
+ "default": "Y",
194
  "type": "checkbox",
195
  "link_info": "",
196
  "link_blog": "",
src/config/feature-events.php CHANGED
@@ -42,6 +42,9 @@
42
  }
43
  ],
44
  "definitions": {
 
 
 
45
  "events_table_name": "events",
46
  "events_table_columns": [
47
  "id",
42
  }
43
  ],
44
  "definitions": {
45
+ "db_classes": {
46
+ "events": "\\FernleafSystems\\Wordpress\\Plugin\\Shield\\Databases\\Events\\Handler"
47
+ },
48
  "events_table_name": "events",
49
  "events_table_columns": [
50
  "id",
src/config/feature-firewall.php CHANGED
@@ -299,6 +299,7 @@
299
  "wp_http_referer",
300
  "_wp_http_referer",
301
  "_wp_original_http_referer",
 
302
  "pass1",
303
  "pass1-text",
304
  "pwd",
299
  "wp_http_referer",
300
  "_wp_http_referer",
301
  "_wp_original_http_referer",
302
+ "JCS_INENREF",
303
  "pass1",
304
  "pass1-text",
305
  "pwd",
src/config/feature-hack_protect.php CHANGED
@@ -1,6 +1,6 @@
1
  {
2
- "slug": "hack_protect",
3
- "properties": {
4
  "slug": "hack_protect",
5
  "name": "Hack Guard",
6
  "show_module_menu_item": false,
@@ -15,7 +15,23 @@
15
  "run_if_verified_bot": true,
16
  "run_if_wpcli": false
17
  },
18
- "sections": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  {
20
  "slug": "section_scan_options",
21
  "title": "Scan Options",
@@ -116,7 +132,7 @@
116
  "hidden": true
117
  }
118
  ],
119
- "options": [
120
  {
121
  "key": "enable_hack_protect",
122
  "section": "section_enable_plugin_feature_hack_protection_tools",
@@ -426,6 +442,40 @@
426
  "summary": "Enable Malware File Scanner",
427
  "description": "When enabled the Malware scanner will run automatically."
428
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
429
  {
430
  "key": "mal_autorepair_core",
431
  "section": "section_scan_mal",
@@ -639,9 +689,20 @@
639
  "transferable": false,
640
  "type": "boolean",
641
  "default": false
 
 
 
 
 
 
 
642
  }
643
  ],
644
- "definitions": {
 
 
 
 
645
  "all_scan_slugs": [
646
  "apc",
647
  "mal",
@@ -677,7 +738,8 @@
677
  "url_mal_sigs_simple": "https://raw.githubusercontent.com/scr34m/php-malware-scanner/master/definitions/patterns_raw.txt",
678
  "url_mal_sigs_regex": "https://raw.githubusercontent.com/scr34m/php-malware-scanner/master/definitions/patterns_re.txt",
679
  "malware_whitelist_paths": [
680
- "wp-content/wflogs/"
 
681
  ],
682
  "cron_all_scans": "all-scans",
683
  "url_checksum_api": "https://api.wordpress.org/core/checksums/1.0/",
1
  {
2
+ "slug": "hack_protect",
3
+ "properties": {
4
  "slug": "hack_protect",
5
  "name": "Hack Guard",
6
  "show_module_menu_item": false,
15
  "run_if_verified_bot": true,
16
  "run_if_wpcli": false
17
  },
18
+ "menu_items": [
19
+ {
20
+ "title": "Scans",
21
+ "slug": "scans-redirect",
22
+ "callback": ""
23
+ }
24
+ ],
25
+ "custom_redirects": [
26
+ {
27
+ "source_mod_page": "scans-redirect",
28
+ "target_mod_page": "insights",
29
+ "query_args": {
30
+ "inav": "scans"
31
+ }
32
+ }
33
+ ],
34
+ "sections": [
35
  {
36
  "slug": "section_scan_options",
37
  "title": "Scan Options",
132
  "hidden": true
133
  }
134
  ],
135
+ "options": [
136
  {
137
  "key": "enable_hack_protect",
138
  "section": "section_enable_plugin_feature_hack_protection_tools",
442
  "summary": "Enable Malware File Scanner",
443
  "description": "When enabled the Malware scanner will run automatically."
444
  },
445
+ {
446
+ "key": "mal_fp_confidence",
447
+ "section": "section_scan_mal",
448
+ "premium": true,
449
+ "default": "75",
450
+ "type": "select",
451
+ "value_options": [
452
+ {
453
+ "value_key": "0",
454
+ "text": "None - Turn Off Malware Intelligence Network"
455
+ },
456
+ {
457
+ "value_key": "25",
458
+ "text": "Low"
459
+ },
460
+ {
461
+ "value_key": "50",
462
+ "text": "Medium"
463
+ },
464
+ {
465
+ "value_key": "75",
466
+ "text": "High"
467
+ },
468
+ {
469
+ "value_key": "100",
470
+ "text": "Full"
471
+ }
472
+ ],
473
+ "link_info": "https://icwp.io/fp",
474
+ "link_blog": "https://icwp.io/fz",
475
+ "name": "Automatic Malware Scan",
476
+ "summary": "Enable Malware File Scanner",
477
+ "description": "When enabled the Malware scanner will run automatically."
478
+ },
479
  {
480
  "key": "mal_autorepair_core",
481
  "section": "section_scan_mal",
689
  "transferable": false,
690
  "type": "boolean",
691
  "default": false
692
+ },
693
+ {
694
+ "key": "mal_fp_reports",
695
+ "section": "section_non_ui",
696
+ "transferable": false,
697
+ "type": "array",
698
+ "default": []
699
  }
700
  ],
701
+ "definitions": {
702
+ "db_classes": {
703
+ "scanresults": "\\FernleafSystems\\Wordpress\\Plugin\\Shield\\Databases\\Scanner\\Handler",
704
+ "scanq": "\\FernleafSystems\\Wordpress\\Plugin\\Shield\\Databases\\ScanQueue\\Handler"
705
+ },
706
  "all_scan_slugs": [
707
  "apc",
708
  "mal",
738
  "url_mal_sigs_simple": "https://raw.githubusercontent.com/scr34m/php-malware-scanner/master/definitions/patterns_raw.txt",
739
  "url_mal_sigs_regex": "https://raw.githubusercontent.com/scr34m/php-malware-scanner/master/definitions/patterns_re.txt",
740
  "malware_whitelist_paths": [
741
+ "wp-content/wflogs/",
742
+ "wp-content/cache/"
743
  ],
744
  "cron_all_scans": "all-scans",
745
  "url_checksum_api": "https://api.wordpress.org/core/checksums/1.0/",
src/config/feature-ips.php CHANGED
@@ -485,6 +485,9 @@
485
  }
486
  ],
487
  "definitions": {
 
 
 
488
  "ip_lists_table_name": "ip_lists",
489
  "ip_list_table_columns": [
490
  "id",
485
  }
486
  ],
487
  "definitions": {
488
+ "db_classes": {
489
+ "ips": "\\FernleafSystems\\Wordpress\\Plugin\\Shield\\Databases\\IPs\\Handler"
490
+ },
491
  "ip_lists_table_name": "ip_lists",
492
  "ip_list_table_columns": [
493
  "id",
src/config/feature-plugin.php CHANGED
@@ -434,6 +434,10 @@
434
  "tracking_post_url": "https://tracking.icontrolwp.com/track/plugin/shield",
435
  "importexport_cron_name": "autoimport",
436
  "href_privacy_policy": "https://icwp.io/wpshieldprivacypolicy",
 
 
 
 
437
  "db_autoexpire_notes": 0,
438
  "db_autoexpire_geoip": 30,
439
  "db_notes_name": "notes",
@@ -507,12 +511,6 @@
507
  "storage_key": "events",
508
  "load_priority": 11
509
  },
510
- {
511
- "slug": "statistics",
512
- "storage_key": "statistics",
513
- "load_priority": 11,
514
- "hidden": false
515
- },
516
  {
517
  "slug": "sessions",
518
  "storage_key": "sessions",
@@ -572,7 +570,7 @@
572
  "audit": false
573
  },
574
  "recaptcha_fail": {
575
- "audit": false
576
  }
577
  },
578
  "wizards": {
434
  "tracking_post_url": "https://tracking.icontrolwp.com/track/plugin/shield",
435
  "importexport_cron_name": "autoimport",
436
  "href_privacy_policy": "https://icwp.io/wpshieldprivacypolicy",
437
+ "db_classes": {
438
+ "geoip": "\\FernleafSystems\\Wordpress\\Plugin\\Shield\\Databases\\GeoIp\\Handler",
439
+ "notes": "\\FernleafSystems\\Wordpress\\Plugin\\Shield\\Databases\\AdminNotes\\Handler"
440
+ },
441
  "db_autoexpire_notes": 0,
442
  "db_autoexpire_geoip": 30,
443
  "db_notes_name": "notes",
511
  "storage_key": "events",
512
  "load_priority": 11
513
  },
 
 
 
 
 
 
514
  {
515
  "slug": "sessions",
516
  "storage_key": "sessions",
570
  "audit": false
571
  },
572
  "recaptcha_fail": {
573
+ "audit": true
574
  }
575
  },
576
  "wizards": {
src/config/feature-sessions.php CHANGED
@@ -51,6 +51,9 @@
51
  }
52
  ],
53
  "definitions": {
 
 
 
54
  "sessions_table_name": "sessions",
55
  "sessions_table_columns": [
56
  "id",
51
  }
52
  ],
53
  "definitions": {
54
+ "db_classes": {
55
+ "session": "\\FernleafSystems\\Wordpress\\Plugin\\Shield\\Databases\\Session\\Handler"
56
+ },
57
  "sessions_table_name": "sessions",
58
  "sessions_table_columns": [
59
  "id",
src/config/feature-statistics.php DELETED
@@ -1,86 +0,0 @@
1
- {
2
- "properties": {
3
- "slug": "statistics",
4
- "name": "Statistics",
5
- "show_module_menu_item": false,
6
- "storage_key": "statistics",
7
- "tagline": "Summary of the main security actions taken by this plugin",
8
- "show_central": false,
9
- "premium": false,
10
- "access_restricted": true,
11
- "run_if_whitelisted": true,
12
- "run_if_verified_bot": false,
13
- "run_if_wpcli": false
14
- },
15
- "sections": [
16
- {
17
- "slug": "section_enable_plugin_feature_statistics",
18
- "primary": true,
19
- "title": "Enable Module: Statistics",
20
- "title_short": "Disable Module",
21
- "summary": [
22
- "Purpose - Helps you see at a glance how effective the plugin has been.",
23
- "Recommendation - Keep the Statistics feature turned on."
24
- ]
25
- },
26
- {
27
- "slug": "section_enable_plugin_feature_reporting",
28
- "primary": true,
29
- "title": "Enable Module: Reporting",
30
- "title_short": "Disable Module",
31
- "summary": [
32
- "Purpose - To track stats and issue reports.",
33
- "Recommendation - Keep the Reporting feature turned on."
34
- ]
35
- },
36
- {
37
- "slug": "section_stats_sharing",
38
- "title": "Statistics Sharing",
39
- "title_short": "Sharing",
40
- "summary": [
41
- "Purpose - Help us to provide globally accessible statistics on the effectiveness of the plugin.",
42
- "Recommendation - Enabling this option helps us improve our plugin over time.All statistics data collection is 100% anonymous.Neither we nor anyone else will be able to trace the data back to the originating site."
43
- ]
44
- },
45
- {
46
- "slug": "section_non_ui",
47
- "hidden": true
48
- }
49
- ],
50
- "options": [
51
- {
52
- "key": "enable_statistics",
53
- "section": "section_enable_plugin_feature_statistics",
54
- "default": "Y",
55
- "type": "checkbox",
56
- "link_info": "",
57
- "link_blog": "",
58
- "name": "Enable Statistics",
59
- "summary": "Enable (or Disable) The Statistics module",
60
- "description": "Un-Checking this option will completely disable the Statistics module"
61
- },
62
- {
63
- "key": "enable_reporting",
64
- "section": "section_enable_plugin_feature_reporting",
65
- "default": "Y",
66
- "type": "checkbox",
67
- "link_info": "",
68
- "link_blog": "",
69
- "name": "Enable Reporting",
70
- "summary": "Enable (or Disable) The Reporting module",
71
- "description": "Un-Checking this option will completely disable the Reporting module"
72
- }
73
- ],
74
- "definitions": {
75
- "statistics_table_name": "statistics",
76
- "statistics_table_columns": [
77
- "id",
78
- "stat_key",
79
- "parent_stat_key",
80
- "tally",
81
- "created_at",
82
- "modified_at",
83
- "deleted_at"
84
- ]
85
- }
86
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/config/feature-traffic.php CHANGED
@@ -9,7 +9,7 @@
9
  "tagline": "Watch All Requests To Your Site",
10
  "show_central": true,
11
  "access_restricted": true,
12
- "premium": true,
13
  "run_if_whitelisted": false,
14
  "run_if_verified_bot": true,
15
  "run_if_wpcli": false,
@@ -191,6 +191,9 @@
191
  }
192
  ],
193
  "definitions": {
 
 
 
194
  "traffic_table_name": "traffic",
195
  "traffic_table_columns": [
196
  "id",
9
  "tagline": "Watch All Requests To Your Site",
10
  "show_central": true,
11
  "access_restricted": true,
12
+ "premium": false,
13
  "run_if_whitelisted": false,
14
  "run_if_verified_bot": true,
15
  "run_if_wpcli": false,
191
  }
192
  ],
193
  "definitions": {
194
+ "db_classes": {
195
+ "traffic": "\\FernleafSystems\\Wordpress\\Plugin\\Shield\\Databases\\Traffic\\Handler"
196
+ },
197
  "traffic_table_name": "traffic",
198
  "traffic_table_columns": [
199
  "id",
src/features/admin_access_restriction.php CHANGED
@@ -22,6 +22,7 @@ class ICWP_WPSF_FeatureHandler_AdminAccessRestriction extends ICWP_WPSF_FeatureH
22
 
23
  /**
24
  * @return bool
 
25
  */
26
  protected function isReadyToExecute() {
27
  return $this->isEnabledSecurityAdmin() && parent::isReadyToExecute();
22
 
23
  /**
24
  * @return bool
25
+ * @throws \Exception
26
  */
27
  protected function isReadyToExecute() {
28
  return $this->isEnabledSecurityAdmin() && parent::isReadyToExecute();
src/features/audit_trail.php CHANGED
@@ -6,6 +6,23 @@ use FernleafSystems\Wordpress\Services\Services;
6
 
7
  class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseWpsf {
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  /**
10
  * @return int
11
  * @deprecated 8.1 - TODO: Need to handle isPremium() within Options class
@@ -53,10 +70,10 @@ class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseW
53
  ];
54
 
55
  try {
56
- $oFinder = $this->getDbHandler()
57
- ->getQuerySelector()
58
- ->addWhereSearch( 'wp_username', $oUser->user_login )
59
- ->setResultsAsVo( true );
60
 
61
  $oWp = Services::WpGeneral();
62
  /** @var Shield\Databases\AuditTrail\EntryVO $oEntry */
@@ -89,7 +106,7 @@ class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseW
89
  public function onWpPrivacyErase( $aData, $sEmail, $nPage = 1 ) {
90
  try {
91
  $oThisUsername = Services::WpUsers()->getUserByEmail( $sEmail )->user_login;
92
- $this->getDbHandler()
93
  ->getQueryDeleter()
94
  ->addWhereSearch( 'wp_username', $oThisUsername )
95
  ->all();
@@ -172,13 +189,6 @@ class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseW
172
  return $aAllData;
173
  }
174
 
175
- /**
176
- * @return Shield\Databases\AuditTrail\Handler
177
- */
178
- protected function loadDbHandler() {
179
- return new Shield\Databases\AuditTrail\Handler();
180
- }
181
-
182
  /**
183
  * @return string
184
  */
@@ -281,4 +291,12 @@ class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseW
281
  public function getDefaultMaxEntries() {
282
  return $this->getDef( 'audit_trail_default_max_entries' );
283
  }
 
 
 
 
 
 
 
 
284
  }
6
 
7
  class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseWpsf {
8
 
9
+ /**
10
+ * @return false|Shield\Databases\AuditTrail\Handler
11
+ */
12
+ public function getDbHandler_AuditTrail() {
13
+ return $this->getDbH( 'audit' );
14
+ }
15
+
16
+ /**
17
+ * @return bool
18
+ * @throws \Exception
19
+ */
20
+ protected function isReadyToExecute() {
21
+ return ( $this->getDbHandler_AuditTrail() instanceof Shield\Databases\AuditTrail\Handler )
22
+ && $this->getDbHandler_AuditTrail()->isReady()
23
+ && parent::isReadyToExecute();
24
+ }
25
+
26
  /**
27
  * @return int
28
  * @deprecated 8.1 - TODO: Need to handle isPremium() within Options class
70
  ];
71
 
72
  try {
73
+ /** @var Shield\Databases\AuditTrail\Select $oFinder */
74
+ $oFinder = $this->getDbHandler_AuditTrail()
75
+ ->getQuerySelector();
76
+ $oFinder->filterByUsername( $oUser->user_login );
77
 
78
  $oWp = Services::WpGeneral();
79
  /** @var Shield\Databases\AuditTrail\EntryVO $oEntry */
106
  public function onWpPrivacyErase( $aData, $sEmail, $nPage = 1 ) {
107
  try {
108
  $oThisUsername = Services::WpUsers()->getUserByEmail( $sEmail )->user_login;
109
+ $this->getDbHandler_AuditTrail()
110
  ->getQueryDeleter()
111
  ->addWhereSearch( 'wp_username', $oThisUsername )
112
  ->all();
189
  return $aAllData;
190
  }
191
 
 
 
 
 
 
 
 
192
  /**
193
  * @return string
194
  */
291
  public function getDefaultMaxEntries() {
292
  return $this->getDef( 'audit_trail_default_max_entries' );
293
  }
294
+
295
+ /**
296
+ * @return Shield\Databases\AuditTrail\Handler
297
+ * @deprecated 8.1.2
298
+ */
299
+ protected function loadDbHandler() {
300
+ return new Shield\Databases\AuditTrail\Handler();
301
+ }
302
  }
src/features/base.php CHANGED
@@ -52,6 +52,11 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
52
  */
53
  private $oOpts;
54
 
 
 
 
 
 
55
  /**
56
  * @param Shield\Controller\Controller $oPluginController
57
  * @param array $aMod
@@ -75,6 +80,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
75
  }
76
 
77
  if ( $this->verifyModuleMeetRequirements() ) {
 
78
  $this->setupHooks( $aMod );
79
  $this->doPostConstruction();
80
  }
@@ -152,14 +158,67 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
152
  }
153
 
154
  protected function cleanupDatabases() {
155
- $oDbh = $this->getDbHandler();
156
- try {
157
- if ( $oDbh instanceof Shield\Databases\Base\Handler && $oDbh->isReady() ) {
158
- $oDbh->autoCleanDb();
 
 
 
159
  }
160
  }
161
- catch ( \Exception $oE ) {
 
 
 
 
 
 
 
 
 
 
162
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  }
164
 
165
  /**
@@ -177,12 +236,13 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
177
  $aEvts = $this->getSupportedEvents();
178
 
179
  $aDefaults = [
180
- 'context' => $this->getSlug(),
181
- 'cat' => 1,
182
- 'stat' => true,
183
- 'audit' => true,
184
- 'recent' => false, // whether to show in the recent events logs
185
- 'offense' => false, // whether to mark offense against IP
 
186
  ];
187
  foreach ( $aEvts as $sKey => $aEvt ) {
188
  $aEvts[ $sKey ] = array_merge( $aDefaults, $aEvt );
@@ -316,8 +376,12 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
316
  if ( $this->getOptions()->getFeatureProperty( 'auto_load_processor' ) ) {
317
  $this->loadProcessor();
318
  }
319
- if ( !$this->isUpgrading() && $this->isModuleEnabled() && $this->isReadyToExecute() ) {
320
- $this->doExecuteProcessor();
 
 
 
 
321
  }
322
  }
323
 
@@ -333,20 +397,11 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
333
  }
334
 
335
  /**
336
- * Used to effect certain processing that is to do with options etc. but isn't related to processing
337
- * functionality of the plugin.
338
  * @return bool
 
339
  */
340
  protected function isReadyToExecute() {
341
- try {
342
- $oDbH = $this->getDbHandler();
343
- $bReady = ( $this->getProcessor() instanceof Shield\Modules\Base\BaseProcessor )
344
- && ( !$oDbH instanceof Shield\Databases\Base\Handler || $oDbH->isReady() );
345
- }
346
- catch ( \Exception $oE ) {
347
- $bReady = false;
348
- }
349
- return $bReady;
350
  }
351
 
352
  protected function doExecuteProcessor() {
@@ -621,16 +676,12 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
621
  if ( !empty( $aAdditionalItems ) && is_array( $aAdditionalItems ) ) {
622
 
623
  foreach ( $aAdditionalItems as $aMenuItem ) {
624
-
625
- if ( empty( $aMenuItem[ 'callback' ] ) || !method_exists( $this, $aMenuItem[ 'callback' ] ) ) {
626
- continue;
627
- }
628
-
629
  $sMenuPageTitle = $sHumanName.' - '.$aMenuItem[ 'title' ];
630
  $aItems[ $sMenuPageTitle ] = [
631
- $aMenuItem[ 'title' ],
632
  $this->prefix( $aMenuItem[ 'slug' ] ),
633
- [ $this, $aMenuItem[ 'callback' ] ]
 
634
  ];
635
  }
636
  }
@@ -638,6 +689,27 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
638
  return $aItems;
639
  }
640
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
641
  /**
642
  * @return array
643
  */
@@ -1146,11 +1218,12 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1146
  }
1147
 
1148
  public function onPluginDelete() {
1149
- $oDbh = $this->getDbHandler();
1150
- if ( !empty( $oDbh ) ) {
1151
- $oDbh->deleteTable();
 
1152
  }
1153
- $this->getOptions()->doOptionsDelete();
1154
  }
1155
 
1156
  /**
@@ -1197,6 +1270,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1197
  /**
1198
  * @param string $sMsg
1199
  * @param bool $bError
 
1200
  * @return $this
1201
  */
1202
  public function setFlashAdminNotice( $sMsg, $bError = false, $bShowOnLogin = false ) {
@@ -1353,13 +1427,6 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1353
  return ( $this->getCon()->getShieldAction() == 'wizard' && $this->isThisModulePage() );
1354
  }
1355
 
1356
- /**
1357
- * @return boolean
1358
- */
1359
- public function hasEncryptOption() {
1360
- return function_exists( 'md5' );
1361
- }
1362
-
1363
  /**
1364
  * Will prefix and return any string with the unique plugin prefix.
1365
  * @param string $sSuffix
@@ -1891,21 +1958,26 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1891
  }
1892
 
1893
  /**
 
1894
  * @return null|Shield\Databases\Base\Handler|mixed
 
1895
  */
1896
  public function getDbHandler() {
1897
- if ( !isset( $this->oDbh ) ) {
1898
- $this->oDbh = $this->loadDbHandler();
1899
- if ( $this->oDbh instanceof Shield\Databases\Base\Handler ) {
1900
- try {
1901
- $this->oDbh->setMod( $this )
1902
- ->tableInit();
1903
- }
1904
- catch ( \Exception$oE ) {
1905
- }
1906
- }
1907
  }
1908
- return $this->oDbh;
 
 
 
 
 
 
 
 
 
 
1909
  }
1910
 
1911
  /**
@@ -1918,13 +1990,6 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1918
  return $this->oStrings;
1919
  }
1920
 
1921
- /**
1922
- * @return Shield\Databases\Base\Handler|mixed|false
1923
- */
1924
- protected function loadDbHandler() {
1925
- return false;
1926
- }
1927
-
1928
  /**
1929
  * @return $this
1930
  */
@@ -1979,7 +2044,6 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
1979
  }
1980
 
1981
  /**
1982
- * This will eventually be not needed
1983
  * @return string
1984
  */
1985
  protected function getNamespaceBase() {
@@ -2000,4 +2064,12 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
2000
  private function getAjax() {
2001
  $this->loadAjaxHandler();
2002
  }
 
 
 
 
 
 
 
 
2003
  }
52
  */
53
  private $oOpts;
54
 
55
+ /**
56
+ * @var Shield\Databases\Base\Handler[]
57
+ */
58
+ private $aDbHandlers;
59
+
60
  /**
61
  * @param Shield\Controller\Controller $oPluginController
62
  * @param array $aMod
80
  }
81
 
82
  if ( $this->verifyModuleMeetRequirements() ) {
83
+ $this->handleAutoPageRedirects();
84
  $this->setupHooks( $aMod );
85
  $this->doPostConstruction();
86
  }
158
  }
159
 
160
  protected function cleanupDatabases() {
161
+ foreach ( $this->getDbHandlers( true ) as $oDbh ) {
162
+ try {
163
+ if ( $oDbh instanceof Shield\Databases\Base\Handler && $oDbh->isReady() ) {
164
+ $oDbh->autoCleanDb();
165
+ }
166
+ }
167
+ catch ( \Exception $oE ) {
168
  }
169
  }
170
+ }
171
+
172
+ /**
173
+ * @param bool $bInitAll
174
+ * @return Shield\Databases\Base\Handler[]
175
+ */
176
+ protected function getDbHandlers( $bInitAll = false ) {
177
+ if ( $bInitAll ) {
178
+ foreach ( $this->getAllDbClasses() as $sDbSlug => $sDbClass ) {
179
+ $this->getDbH( $sDbSlug );
180
+ }
181
  }
182
+ return is_array( $this->aDbHandlers ) ? $this->aDbHandlers : [];
183
+ }
184
+
185
+ /**
186
+ * @param string $sDbhKey
187
+ * @return Shield\Databases\Base\Handler|mixed|false
188
+ */
189
+ protected function getDbH( $sDbhKey ) {
190
+ $oDbH = false;
191
+
192
+ if ( !is_array( $this->aDbHandlers ) ) {
193
+ $this->aDbHandlers = [];
194
+ }
195
+
196
+ if ( !empty( $this->aDbHandlers[ $sDbhKey ] ) ) {
197
+ $oDbH = $this->aDbHandlers[ $sDbhKey ];
198
+ }
199
+ else {
200
+ $aDbClasses = $this->getAllDbClasses();
201
+ if ( isset( $aDbClasses[ $sDbhKey ] ) ) {
202
+ /** @var Shield\Databases\Base\Handler $oDbH */
203
+ $oDbH = new $aDbClasses[ $sDbhKey ]();
204
+ try {
205
+ $oDbH->setMod( $this )->tableInit();
206
+ }
207
+ catch ( \Exception $oE ) {
208
+ }
209
+ }
210
+ $this->aDbHandlers[ $sDbhKey ] = $oDbH;
211
+ }
212
+
213
+ return $oDbH;
214
+ }
215
+
216
+ /**
217
+ * @return string[]
218
+ */
219
+ private function getAllDbClasses() {
220
+ $aCls = $this->getOptions()->getDef( 'db_classes' );
221
+ return is_array( $aCls ) ? $aCls : [];
222
  }
223
 
224
  /**
236
  $aEvts = $this->getSupportedEvents();
237
 
238
  $aDefaults = [
239
+ 'context' => $this->getSlug(),
240
+ 'cat' => 1,
241
+ 'stat' => true,
242
+ 'audit' => true,
243
+ 'recent' => false, // whether to show in the recent events logs
244
+ 'offense' => false, // whether to mark offense against IP
245
+ 'audit_multiple' => false, // allow multiple audit entries in the same request
246
  ];
247
  foreach ( $aEvts as $sKey => $aEvt ) {
248
  $aEvts[ $sKey ] = array_merge( $aDefaults, $aEvt );
376
  if ( $this->getOptions()->getFeatureProperty( 'auto_load_processor' ) ) {
377
  $this->loadProcessor();
378
  }
379
+ try {
380
+ if ( !$this->isUpgrading() && $this->isModuleEnabled() && $this->isReadyToExecute() ) {
381
+ $this->doExecuteProcessor();
382
+ }
383
+ }
384
+ catch ( \Exception $oE ) {
385
  }
386
  }
387
 
397
  }
398
 
399
  /**
 
 
400
  * @return bool
401
+ * @throws \Exception
402
  */
403
  protected function isReadyToExecute() {
404
+ return ( $this->getProcessor() instanceof Shield\Modules\Base\BaseProcessor );
 
 
 
 
 
 
 
 
405
  }
406
 
407
  protected function doExecuteProcessor() {
676
  if ( !empty( $aAdditionalItems ) && is_array( $aAdditionalItems ) ) {
677
 
678
  foreach ( $aAdditionalItems as $aMenuItem ) {
 
 
 
 
 
679
  $sMenuPageTitle = $sHumanName.' - '.$aMenuItem[ 'title' ];
680
  $aItems[ $sMenuPageTitle ] = [
681
+ __( $aMenuItem[ 'title' ], 'wp-simple-firewall' ),
682
  $this->prefix( $aMenuItem[ 'slug' ] ),
683
+ [ $this, $aMenuItem[ 'callback' ] ],
684
+ true
685
  ];
686
  }
687
  }
689
  return $aItems;
690
  }
691
 
692
+ /**
693
+ * Handles the case where we want to redirect certain menu requests to other pages
694
+ * of the plugin automatically. It lets us create custom menu items.
695
+ * This can of course be extended for any other types of redirect.
696
+ */
697
+ public function handleAutoPageRedirects() {
698
+ $aConf = $this->getOptions()->getRawData_FullFeatureConfig();
699
+ if ( !empty( $aConf[ 'custom_redirects' ] ) && $this->getCon()->isValidAdminArea() ) {
700
+ foreach ( $aConf[ 'custom_redirects' ] as $aRedirect ) {
701
+ if ( Services::Request()->query( 'page' ) == $this->prefix( $aRedirect[ 'source_mod_page' ] ) ) {
702
+ Services::Response()->redirect(
703
+ $this->getCon()->getModule( $aRedirect[ 'target_mod_page' ] )->getUrl_AdminPage(),
704
+ $aRedirect[ 'query_args' ],
705
+ true,
706
+ false
707
+ );
708
+ }
709
+ }
710
+ }
711
+ }
712
+
713
  /**
714
  * @return array
715
  */
1218
  }
1219
 
1220
  public function onPluginDelete() {
1221
+ foreach ( $this->getDbHandlers( true ) as $oDbh ) {
1222
+ if ( !empty( $oDbh ) ) {
1223
+ $oDbh->deleteTable();
1224
+ }
1225
  }
1226
+ $this->getOptions()->deleteStorage();
1227
  }
1228
 
1229
  /**
1270
  /**
1271
  * @param string $sMsg
1272
  * @param bool $bError
1273
+ * @param bool $bShowOnLogin
1274
  * @return $this
1275
  */
1276
  public function setFlashAdminNotice( $sMsg, $bError = false, $bShowOnLogin = false ) {
1427
  return ( $this->getCon()->getShieldAction() == 'wizard' && $this->isThisModulePage() );
1428
  }
1429
 
 
 
 
 
 
 
 
1430
  /**
1431
  * Will prefix and return any string with the unique plugin prefix.
1432
  * @param string $sSuffix
1958
  }
1959
 
1960
  /**
1961
+ * The primary DB for the
1962
  * @return null|Shield\Databases\Base\Handler|mixed
1963
+ * @deprecated 8.1.2
1964
  */
1965
  public function getDbHandler() {
1966
+ // TODO: remove this IF, as it's a stop-gap for the newer implementation (below)
1967
+ if ( $this->oDbh instanceof Shield\Databases\Base\Handler ) {
1968
+ return $this->oDbh;
 
 
 
 
 
 
 
1969
  }
1970
+
1971
+ return $this->getPrimaryDbHandler();
1972
+ }
1973
+
1974
+ /**
1975
+ * The primary DB for the
1976
+ * @return null|Shield\Databases\Base\Handler|mixed
1977
+ */
1978
+ public function getPrimaryDbHandler() {
1979
+ $aDBs = $this->getAllDbClasses();
1980
+ return empty( $aDBs ) ? null : $this->getDbH( key( $aDBs ) );
1981
  }
1982
 
1983
  /**
1990
  return $this->oStrings;
1991
  }
1992
 
 
 
 
 
 
 
 
1993
  /**
1994
  * @return $this
1995
  */
2044
  }
2045
 
2046
  /**
 
2047
  * @return string
2048
  */
2049
  protected function getNamespaceBase() {
2064
  private function getAjax() {
2065
  $this->loadAjaxHandler();
2066
  }
2067
+
2068
+ /**
2069
+ * @return Shield\Databases\Base\Handler|mixed|false
2070
+ * @deprecated 8.1.2
2071
+ */
2072
+ protected function loadDbHandler() {
2073
+ return false;
2074
+ }
2075
  }
src/features/base_wpsf.php CHANGED
@@ -34,11 +34,9 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
34
  * @return \ICWP_WPSF_Processor_Sessions
35
  */
36
  public function getSessionsProcessor() {
37
- /** @var \ICWP_WPSF_Processor_Sessions $oP */
38
- $oP = $this->getCon()
39
- ->getModule_Sessions()
40
- ->getProcessor();
41
- return $oP;
42
  }
43
 
44
  /**
@@ -47,7 +45,7 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
47
  public function getDbHandler_Sessions() {
48
  return $this->getCon()
49
  ->getModule_Sessions()
50
- ->getDbHandler();
51
  }
52
 
53
  /**
@@ -81,41 +79,6 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
81
  add_action( $oCon->prefix( 'event' ), [ $this, 'eventStat' ], 10, 2 );
82
  }
83
 
84
- /**
85
- */
86
- protected function updateHandler() {
87
- $this->updateHandler_ConvertInsights();
88
- }
89
-
90
- private function updateHandler_ConvertInsights() {
91
- $aMap = [
92
- 'insights_last_comment_block_at' => 'spam_block_bot',
93
- 'insights_last_firewall_block_at' => 'firewall_block',
94
- 'insights_last_scan_ufc_at' => 'ufc_scan_run',
95
- 'insights_last_scan_apc_at' => 'apc_scan_run',
96
- 'insights_last_scan_wcf_at' => 'wcf_scan_run',
97
- 'insights_last_scan_ptg_at' => 'ptg_scan_run',
98
- 'insights_last_scan_wpv_at' => 'wpv_scan_run',
99
- 'insights_last_transgression_at' => 'ip_offense',
100
- 'insights_last_ip_block_at' => 'conn_kill',
101
- 'insights_xml_block_at' => 'block_xml',
102
- 'insights_restapi_block_at' => 'block_anonymous_restapi',
103
- 'insights_last_2fa_login_at' => '2fa_success',
104
- 'insights_last_login_block_at' => 'login_block',
105
- 'insights_test_cron_last_run_at' => 'test_cron_run',
106
- 'insights_last_password_block_at' => 'password_policy_block',
107
- ];
108
- foreach ( $this->getOptions()->getOptionsKeys() as $sOpt ) {
109
- if ( strpos( $sOpt, 'insights_' ) === 0 && isset( $aMap[ $sOpt ] ) && $this->getOpt( $sOpt ) > 0 ) {
110
- $this->addStatEvent( $aMap[ $sOpt ], [ 'ts' => $this->getOpt( $sOpt ) ] );
111
- $this->setOpt( $sOpt, 0 );
112
- }
113
- }
114
- /** @var Shield\Databases\Events\Handler $oDbh */
115
- $oDbh = $this->getCon()->getModule_Events()->getDbHandler();
116
- $oDbh->commitEvents( $this->getRegisteredEvents( true ) );
117
- }
118
-
119
  /**
120
  * @param string $sEvent
121
  * @param array $aMeta
@@ -133,7 +96,14 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
133
  if ( !is_array( self::$aAuditLogs ) ) {
134
  self::$aAuditLogs = [];
135
  }
136
- self::$aAuditLogs[ $sEvent ] = $oEntry;
 
 
 
 
 
 
 
137
  }
138
  }
139
  return $this;
@@ -302,6 +272,13 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
302
  return apply_filters( $this->prefix( 'report_email_address' ), Services::WpGeneral()->getSiteAdminEmail() );
303
  }
304
 
 
 
 
 
 
 
 
305
  /**
306
  * @return array
307
  */
@@ -341,6 +318,7 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
341
 
342
  /**
343
  * @return bool
 
344
  */
345
  protected function isReadyToExecute() {
346
  $oOpts = $this->getOptions();
34
  * @return \ICWP_WPSF_Processor_Sessions
35
  */
36
  public function getSessionsProcessor() {
37
+ return $this->getCon()
38
+ ->getModule_Sessions()
39
+ ->getProcessor();
 
 
40
  }
41
 
42
  /**
45
  public function getDbHandler_Sessions() {
46
  return $this->getCon()
47
  ->getModule_Sessions()
48
+ ->getDbHandler_Sessions();
49
  }
50
 
51
  /**
79
  add_action( $oCon->prefix( 'event' ), [ $this, 'eventStat' ], 10, 2 );
80
  }
81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  /**
83
  * @param string $sEvent
84
  * @param array $aMeta
96
  if ( !is_array( self::$aAuditLogs ) ) {
97
  self::$aAuditLogs = [];
98
  }
99
+
100
+ // cater for where certain events may happen more than once in the same request
101
+ if ( !empty( $aDef[ 'audit_multiple' ] ) ) {
102
+ self::$aAuditLogs[] = $oEntry;
103
+ }
104
+ else {
105
+ self::$aAuditLogs[ $sEvent ] = $oEntry;
106
+ }
107
  }
108
  }
109
  return $this;
272
  return apply_filters( $this->prefix( 'report_email_address' ), Services::WpGeneral()->getSiteAdminEmail() );
273
  }
274
 
275
+ /**
276
+ * @return Shield\Modules\BaseShield\ShieldProcessor|mixed
277
+ */
278
+ public function getProcessor() {
279
+ return parent::getProcessor();
280
+ }
281
+
282
  /**
283
  * @return array
284
  */
318
 
319
  /**
320
  * @return bool
321
+ * @throws \Exception
322
  */
323
  protected function isReadyToExecute() {
324
  $oOpts = $this->getOptions();
src/features/events.php CHANGED
@@ -1,15 +1,24 @@
1
  <?php
2
 
3
  use FernleafSystems\Wordpress\Plugin\Shield;
4
- use FernleafSystems\Wordpress\Services\Services;
5
 
6
  class ICWP_WPSF_FeatureHandler_Events extends ICWP_WPSF_FeatureHandler_BaseWpsf {
7
 
8
  /**
9
- * @return Shield\Databases\Events\Handler
10
  */
11
- protected function loadDbHandler() {
12
- return new Shield\Databases\Events\Handler();
 
 
 
 
 
 
 
 
 
 
13
  }
14
 
15
  /**
@@ -18,4 +27,12 @@ class ICWP_WPSF_FeatureHandler_Events extends ICWP_WPSF_FeatureHandler_BaseWpsf
18
  protected function getNamespaceBase() {
19
  return 'Events';
20
  }
 
 
 
 
 
 
 
 
21
  }
1
  <?php
2
 
3
  use FernleafSystems\Wordpress\Plugin\Shield;
 
4
 
5
  class ICWP_WPSF_FeatureHandler_Events extends ICWP_WPSF_FeatureHandler_BaseWpsf {
6
 
7
  /**
8
+ * @return false|Shield\Databases\Events\Handler
9
  */
10
+ public function getDbHandler_Events() {
11
+ return $this->getDbH( 'events' );
12
+ }
13
+
14
+ /**
15
+ * @return bool
16
+ * @throws \Exception
17
+ */
18
+ protected function isReadyToExecute() {
19
+ return ( $this->getDbHandler_Events() instanceof Shield\Databases\Events\Handler )
20
+ && $this->getDbHandler_Events()->isReady()
21
+ && parent::isReadyToExecute();
22
  }
23
 
24
  /**
27
  protected function getNamespaceBase() {
28
  return 'Events';
29
  }
30
+
31
+ /**
32
+ * @return Shield\Databases\Events\Handler
33
+ * @deprecated 8.1.2
34
+ */
35
+ protected function loadDbHandler() {
36
+ return new Shield\Databases\Events\Handler();
37
+ }
38
  }
src/features/hack_protect.php CHANGED
@@ -6,11 +6,6 @@ use FernleafSystems\Wordpress\Services\Services;
6
 
7
  class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_BaseWpsf {
8
 
9
- /**
10
- * @var Shield\Databases\ScanQueue\Handler
11
- */
12
- private $oDbh_ScanQueue;
13
-
14
  /**
15
  * @var HackGuard\Scan\Queue\Controller
16
  */
@@ -83,7 +78,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
83
  $oOpts = $this->getOptions();
84
  if ( $oOpts->isOptChanged( 'ptg_enable' ) || $oOpts->isOptChanged( 'ptg_depth' ) || $oOpts->isOptChanged( 'ptg_extensions' ) ) {
85
  $this->setPtgLastBuildAt( 0 );
86
- /** @var ICWP_WPSF_Processor_HackProtect $oPro */
87
  $oPro = $this->getProcessor();
88
  $oPro->getSubProScanner()
89
  ->getSubProcessorPtg()
@@ -103,7 +98,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
103
  /** @var Shield\Databases\Events\Select $oSel */
104
  $oSel = $this->getCon()
105
  ->getModule_Events()
106
- ->getDbHandler()
107
  ->getQuerySelector();
108
  $aEvents = $oSel->getLatestForAllEvents();
109
 
@@ -123,7 +118,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
123
  /** @var Shield\Databases\Events\Select $oSel */
124
  $oSel = $this->getCon()
125
  ->getModule_Events()
126
- ->getDbHandler()
127
  ->getQuerySelector();
128
  $oEntry = $oSel->getLatestForEvent( $sScan.'_scan_run' );
129
  return ( $oEntry instanceof Shield\Databases\Events\EntryVO ) ? $oEntry->created_at : 0;
@@ -135,7 +130,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
135
  */
136
  public function getScanHasProblem( $sScan ) {
137
  /** @var Shield\Databases\Scanner\Select $oSel */
138
- $oSel = $this->getDbHandler()->getQuerySelector();
139
  return $oSel->filterByNotIgnored()
140
  ->filterByScan( $sScan )
141
  ->count() > 0;
@@ -220,25 +215,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
220
  return $aExclusions;
221
  }
222
 
223
- /**
224
- * @param string $sOption
225
- * @return $this
226
- */
227
- public function setUfcOption( $sOption ) {
228
- return $this->setOpt( 'enable_unrecognised_file_cleaner_scan', $sOption );
229
- }
230
-
231
- /**
232
- * @param array $aExclusions
233
- * @return $this
234
- */
235
- public function setUfcFileExclusions( $aExclusions ) {
236
- if ( !is_array( $aExclusions ) ) {
237
- $aExclusions = [];
238
- }
239
- return $this->setOpt( 'ufc_exclusions', array_filter( array_map( 'trim', $aExclusions ) ) );
240
- }
241
-
242
  /**
243
  * @return $this
244
  */
@@ -280,13 +256,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
280
  return ( $this->getUnrecognisedFileScannerOption() != 'disabled' );
281
  }
282
 
283
- /**
284
- * @return bool
285
- */
286
- public function isUfsScanUploads() {
287
- return $this->isOpt( 'ufc_scan_uploads', 'Y' );
288
- }
289
-
290
  /**
291
  * @return string
292
  */
@@ -311,22 +280,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
311
  return $this->isOpt( 'enable_core_file_integrity_scan', 'Y' );
312
  }
313
 
314
- /**
315
- * @param bool $bEnabled
316
- * @return $this
317
- */
318
- public function setWcfScanEnabled( $bEnabled ) {
319
- return $this->setOpt( 'enable_core_file_integrity_scan', $bEnabled ? 'Y' : 'N' );
320
- }
321
-
322
- /**
323
- * @param bool $bEnabled
324
- * @return $this
325
- */
326
- public function setWcfScanAutoRepair( $bEnabled ) {
327
- return $this->setOpt( 'attempt_auto_file_repair', $bEnabled ? 'Y' : 'N' );
328
- }
329
-
330
  /**
331
  * @return bool
332
  */
@@ -416,13 +369,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
416
  return $this->getOpt( 'ptg_depth' );
417
  }
418
 
419
- /**
420
- * @return string
421
- */
422
- public function getPtgEnabledOption() {
423
- return $this->getOpt( 'ptg_enable' );
424
- }
425
-
426
  /**
427
  * @return int
428
  */
@@ -505,14 +451,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
505
  return $this->setOpt( 'ptg_last_build_at', is_null( $nTime ) ? Services::Request()->ts() : $nTime );
506
  }
507
 
508
- /**
509
- * @param string $sValue
510
- * @return $this
511
- */
512
- public function setPtgEnabledOption( $sValue ) {
513
- return $this->setOpt( 'ptg_enable', $sValue );
514
- }
515
-
516
  /**
517
  * @return bool
518
  */
@@ -527,41 +465,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
527
  return $this->isOpt( 'enabled_scan_apc', 'enabled_email' );
528
  }
529
 
530
- /**
531
- * @return bool
532
- */
533
- public function isMalScanEnabled() {
534
- return !$this->isOpt( 'mal_scan_enable', 'disabled' );
535
- }
536
-
537
- /**
538
- * @return bool
539
- */
540
- public function isMalScanAutoRepair() {
541
- return $this->isMalAutoRepairCore() || $this->isMalAutoRepairPlugins() || $this->isMalAutoRepairSurgical();
542
- }
543
-
544
- /**
545
- * @return bool
546
- */
547
- public function isMalAutoRepairCore() {
548
- return $this->isOpt( 'mal_autorepair_core', 'Y' );
549
- }
550
-
551
- /**
552
- * @return bool
553
- */
554
- public function isMalAutoRepairPlugins() {
555
- return $this->isOpt( 'mal_autorepair_plugins', 'Y' );
556
- }
557
-
558
- /**
559
- * @return bool
560
- */
561
- public function isMalAutoRepairSurgical() {
562
- return $this->isOpt( 'mal_autorepair_surgical', 'Y' );
563
- }
564
-
565
  public function insertCustomJsVars_Admin() {
566
  parent::insertCustomJsVars_Admin();
567
 
@@ -818,11 +721,21 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
818
  return $this->setOpt( 'rt_can_write_files', $aFiles );
819
  }
820
 
 
 
 
 
 
 
 
 
821
  /**
822
  * @param array $aAllNotices
823
  * @return array
824
  */
825
  public function addInsightsNoticeData( $aAllNotices ) {
 
 
826
  /** @var HackGuard\Strings $oStrings */
827
  $oStrings = $this->getStrings();
828
  $aScanNames = $oStrings->getScanNames();
@@ -938,7 +851,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
938
  }
939
 
940
  {// Malware
941
- if ( !$this->isMalScanEnabled() ) {
942
  $aNotices[ 'messages' ][ 'mal' ] = [
943
  'title' => $aScanNames[ 'mal' ],
944
  'message' => sprintf( __( '%s Scanner is not enabled.' ), $aScanNames[ 'mal' ] ),
@@ -1077,7 +990,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
1077
  'href' => $this->getUrl_DirectLinkToSection( 'section_scan_ptg' ),
1078
  ];
1079
 
1080
- $bMal = $this->isMalScanEnabled();
1081
  $aThis[ 'key_opts' ][ 'mal' ] = [
1082
  'title' => $aScanNames[ 'mal' ],
1083
  'name' => $aScanNames[ 'mal' ],
@@ -1117,26 +1030,71 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
1117
  }
1118
 
1119
  /**
1120
- * @return Shield\Databases\ScanQueue\Handler
1121
  */
1122
  public function getDbHandler_ScanQueue() {
1123
- if ( !isset( $this->oDbh_ScanQueue ) ) {
1124
- try {
1125
- $this->oDbh_ScanQueue = ( new Shield\Databases\ScanQueue\Handler() )
1126
- ->setMod( $this )
1127
- ->tableInit();
1128
- }
1129
- catch ( \Exception $oE ) {
1130
- }
1131
- }
1132
- return $this->oDbh_ScanQueue;
1133
  }
1134
 
1135
  /**
1136
- * @return Shield\Databases\Scanner\Handler
1137
  */
1138
- protected function loadDbHandler() {
1139
- return new Shield\Databases\Scanner\Handler();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1140
  }
1141
 
1142
  /**
@@ -1146,6 +1104,14 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
1146
  return 'HackGuard';
1147
  }
1148
 
 
 
 
 
 
 
 
 
1149
  /**
1150
  * @return int
1151
  * @deprecated 8.1
6
 
7
  class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_BaseWpsf {
8
 
 
 
 
 
 
9
  /**
10
  * @var HackGuard\Scan\Queue\Controller
11
  */
78
  $oOpts = $this->getOptions();
79
  if ( $oOpts->isOptChanged( 'ptg_enable' ) || $oOpts->isOptChanged( 'ptg_depth' ) || $oOpts->isOptChanged( 'ptg_extensions' ) ) {
80
  $this->setPtgLastBuildAt( 0 );
81
+ /** @var \ICWP_WPSF_Processor_HackProtect $oPro */
82
  $oPro = $this->getProcessor();
83
  $oPro->getSubProScanner()
84
  ->getSubProcessorPtg()
98
  /** @var Shield\Databases\Events\Select $oSel */
99
  $oSel = $this->getCon()
100
  ->getModule_Events()
101
+ ->getDbHandler_Events()
102
  ->getQuerySelector();
103
  $aEvents = $oSel->getLatestForAllEvents();
104
 
118
  /** @var Shield\Databases\Events\Select $oSel */
119
  $oSel = $this->getCon()
120
  ->getModule_Events()
121
+ ->getDbHandler_Events()
122
  ->getQuerySelector();
123
  $oEntry = $oSel->getLatestForEvent( $sScan.'_scan_run' );
124
  return ( $oEntry instanceof Shield\Databases\Events\EntryVO ) ? $oEntry->created_at : 0;
130
  */
131
  public function getScanHasProblem( $sScan ) {
132
  /** @var Shield\Databases\Scanner\Select $oSel */
133
+ $oSel = $this->getDbHandler_ScanResults()->getQuerySelector();
134
  return $oSel->filterByNotIgnored()
135
  ->filterByScan( $sScan )
136
  ->count() > 0;
215
  return $aExclusions;
216
  }
217
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
  /**
219
  * @return $this
220
  */
256
  return ( $this->getUnrecognisedFileScannerOption() != 'disabled' );
257
  }
258
 
 
 
 
 
 
 
 
259
  /**
260
  * @return string
261
  */
280
  return $this->isOpt( 'enable_core_file_integrity_scan', 'Y' );
281
  }
282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  /**
284
  * @return bool
285
  */
369
  return $this->getOpt( 'ptg_depth' );
370
  }
371
 
 
 
 
 
 
 
 
372
  /**
373
  * @return int
374
  */
451
  return $this->setOpt( 'ptg_last_build_at', is_null( $nTime ) ? Services::Request()->ts() : $nTime );
452
  }
453
 
 
 
 
 
 
 
 
 
454
  /**
455
  * @return bool
456
  */
465
  return $this->isOpt( 'enabled_scan_apc', 'enabled_email' );
466
  }
467
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
468
  public function insertCustomJsVars_Admin() {
469
  parent::insertCustomJsVars_Admin();
470
 
721
  return $this->setOpt( 'rt_can_write_files', $aFiles );
722
  }
723
 
724
+ /**
725
+ * @return string
726
+ */
727
+ public function getTempDir() {
728
+ $sDir = $this->getCon()->getPluginCachePath( 'scans' );
729
+ return Services::WpFs()->mkdir( $sDir ) ? $sDir : false;
730
+ }
731
+
732
  /**
733
  * @param array $aAllNotices
734
  * @return array
735
  */
736
  public function addInsightsNoticeData( $aAllNotices ) {
737
+ /** @var Shield\Modules\HackGuard\Options $oOpts */
738
+ $oOpts = $this->getOptions();
739
  /** @var HackGuard\Strings $oStrings */
740
  $oStrings = $this->getStrings();
741
  $aScanNames = $oStrings->getScanNames();
851
  }
852
 
853
  {// Malware
854
+ if ( !$oOpts->isMalScanEnabled() ) {
855
  $aNotices[ 'messages' ][ 'mal' ] = [
856
  'title' => $aScanNames[ 'mal' ],
857
  'message' => sprintf( __( '%s Scanner is not enabled.' ), $aScanNames[ 'mal' ] ),
990
  'href' => $this->getUrl_DirectLinkToSection( 'section_scan_ptg' ),
991
  ];
992
 
993
+ $bMal = $oOpts->isMalScanEnabled();
994
  $aThis[ 'key_opts' ][ 'mal' ] = [
995
  'title' => $aScanNames[ 'mal' ],
996
  'name' => $aScanNames[ 'mal' ],
1030
  }
1031
 
1032
  /**
1033
+ * @return false|Shield\Databases\ScanQueue\Handler
1034
  */
1035
  public function getDbHandler_ScanQueue() {
1036
+ return $this->getDbH( 'scanq' );
 
 
 
 
 
 
 
 
 
1037
  }
1038
 
1039
  /**
1040
+ * @return false|Shield\Databases\Scanner\Handler
1041
  */
1042
+ public function getDbHandler_ScanResults() {
1043
+ return $this->getDbH( 'scanresults' );
1044
+ }
1045
+
1046
+ /**
1047
+ * @return bool
1048
+ * @throws \Exception
1049
+ */
1050
+ protected function isReadyToExecute() {
1051
+ return ( $this->getDbHandler_ScanQueue() instanceof Shield\Databases\ScanQueue\Handler )
1052
+ && $this->getDbHandler_ScanQueue()->isReady()
1053
+ && ( $this->getDbHandler_ScanResults() instanceof Shield\Databases\Scanner\Handler )
1054
+ && $this->getDbHandler_ScanQueue()->isReady()
1055
+ && parent::isReadyToExecute();
1056
+ }
1057
+
1058
+ /**
1059
+ * @return bool
1060
+ * @deprecated 8.2
1061
+ */
1062
+ public function isMalScanEnabled() {
1063
+ return !$this->isOpt( 'mal_scan_enable', 'disabled' );
1064
+ }
1065
+
1066
+ /**
1067
+ * @return bool
1068
+ * @deprecated 8.2
1069
+ */
1070
+ public function isMalAutoRepairPlugins() {
1071
+ return $this->isOpt( 'mal_autorepair_plugins', 'Y' );
1072
+ }
1073
+
1074
+ /**
1075
+ * @return bool
1076
+ * @deprecated 8.2
1077
+ */
1078
+ public function isMalScanAutoRepair() {
1079
+ /** @var HackGuard\Options $oOpts */
1080
+ $oOpts = $this->getOptions();
1081
+ return $oOpts->isMalAutoRepair();
1082
+ }
1083
+
1084
+ /**
1085
+ * @return bool
1086
+ * @deprecated 8.2
1087
+ */
1088
+ public function isMalAutoRepairCore() {
1089
+ return $this->isOpt( 'mal_autorepair_core', 'Y' );
1090
+ }
1091
+
1092
+ /**
1093
+ * @return bool
1094
+ * @deprecated 8.2
1095
+ */
1096
+ public function isMalAutoRepairSurgical() {
1097
+ return $this->isOpt( 'mal_autorepair_surgical', 'Y' );
1098
  }
1099
 
1100
  /**
1104
  return 'HackGuard';
1105
  }
1106
 
1107
+ /**
1108
+ * @return Shield\Databases\Scanner\Handler
1109
+ * @deprecated 8.1.2
1110
+ */
1111
+ protected function loadDbHandler() {
1112
+ return new Shield\Databases\Scanner\Handler();
1113
+ }
1114
+
1115
  /**
1116
  * @return int
1117
  * @deprecated 8.1
src/features/insights.php CHANGED
@@ -35,13 +35,12 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
35
  /** @var ICWP_WPSF_FeatureHandler_Traffic $oTrafficMod */
36
  $oTrafficMod = $oCon->getModule( 'traffic' );
37
  /** @var Shield\Databases\Traffic\Select $oTrafficSelector */
38
- $oTrafficSelector = $oTrafficMod->getDbHandler()
39
- ->getQuerySelector();
40
 
41
  /** @var ICWP_WPSF_FeatureHandler_AuditTrail $oAuditMod */
42
  $oAuditMod = $oCon->getModule( 'audit_trail' );
43
  /** @var Shield\Databases\AuditTrail\Select $oAuditSelect */
44
- $oAuditSelect = $oAuditMod->getDbHandler()->getQuerySelector();
45
 
46
  /** @var Shield\Modules\Events\Strings $oEventStrings */
47
  $oEventStrings = $oCon->getModule_Events()->getStrings();
@@ -49,6 +48,8 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
49
  asort( $aEventsSelect );
50
 
51
  $oIpMod = $oCon->getModule_IPs();
 
 
52
 
53
  /** @var Shield\Databases\Session\Select $oSessionSelect */
54
  $oSessionSelect = $this->getDbHandler_Sessions()->getQuerySelector();
@@ -113,7 +114,7 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
113
  __( 'Black listed IPs auto-expire after: %s', 'wp-simple-firewall' ),
114
  sprintf( '<a href="%s" target="_blank">%s</a>',
115
  $oIpMod->getUrl_DirectLinkToOption( 'auto_expire' ),
116
- $oCarbon->setTimestamp( $oReq->ts() + $oIpMod->getAutoExpireTime() + 100 )
117
  ->diffForHumans( null, true )
118
  )
119
  ),
@@ -158,7 +159,7 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
158
  'render_table_traffic' => $oTrafficMod->getAjaxActionData( 'render_table_traffic', true )
159
  ],
160
  'flags' => [
161
- 'can_traffic' => $bIsPro,
162
  'is_enabled' => $oTrafficMod->isModOptEnabled(),
163
  ],
164
  'hrefs' => [
@@ -763,15 +764,15 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
763
  * @return array[]
764
  */
765
  protected function getStats() {
 
766
  /** @var Shield\Databases\Events\Handler $oDbhEvents */
767
- $oDbhEvents = $this->getCon()->getModule_Events()->getDbHandler();
768
  /** @var Shield\Databases\Events\Select $oSelEvents */
769
  $oSelEvents = $oDbhEvents->getQuerySelector();
770
 
771
  /** @var Shield\Databases\IPs\Select $oSelectIp */
772
- $oSelectIp = $this->getCon()
773
- ->getModule_IPs()
774
- ->getDbHandler()
775
  ->getQuerySelector();
776
 
777
  return [
@@ -827,9 +828,10 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
827
  * @return array
828
  */
829
  protected function getRecentEvents() {
 
830
 
831
  $aEmptyStats = [];
832
- foreach ( $this->getCon()->getModules() as $oModule ) {
833
  /** @var ICWP_WPSF_FeatureHandler_BaseWpsf $oModule */
834
  $aStat = $oModule->getStatEvents_Recent();
835
  $aEmptyStats = array_merge( $aEmptyStats, $aStat );
@@ -839,12 +841,10 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
839
  $oStrs = $this->getStrings();
840
  $aNames = $oStrs->getInsightStatNames();
841
 
842
- /** @var Shield\Databases\Events\Handler $oEventsDbh */
843
- $oEventsDbh = $this->getCon()
844
- ->getModule_Events()
845
- ->getDbHandler();
846
  /** @var Shield\Databases\Events\Select $oSel */
847
- $oSel = $oEventsDbh->getQuerySelector();
 
 
848
 
849
  $aLatestStats = array_intersect_key(
850
  array_map(
35
  /** @var ICWP_WPSF_FeatureHandler_Traffic $oTrafficMod */
36
  $oTrafficMod = $oCon->getModule( 'traffic' );
37
  /** @var Shield\Databases\Traffic\Select $oTrafficSelector */
38
+ $oTrafficSelector = $oTrafficMod->getDbHandler_Traffic()->getQuerySelector();
 
39
 
40
  /** @var ICWP_WPSF_FeatureHandler_AuditTrail $oAuditMod */
41
  $oAuditMod = $oCon->getModule( 'audit_trail' );
42
  /** @var Shield\Databases\AuditTrail\Select $oAuditSelect */
43
+ $oAuditSelect = $oAuditMod->getDbHandler_AuditTrail()->getQuerySelector();
44
 
45
  /** @var Shield\Modules\Events\Strings $oEventStrings */
46
  $oEventStrings = $oCon->getModule_Events()->getStrings();
48
  asort( $aEventsSelect );
49
 
50
  $oIpMod = $oCon->getModule_IPs();
51
+ /** @var Shield\Modules\IPs\Options $oIpOpts */
52
+ $oIpOpts = $oIpMod->getOptions();
53
 
54
  /** @var Shield\Databases\Session\Select $oSessionSelect */
55
  $oSessionSelect = $this->getDbHandler_Sessions()->getQuerySelector();
114
  __( 'Black listed IPs auto-expire after: %s', 'wp-simple-firewall' ),
115
  sprintf( '<a href="%s" target="_blank">%s</a>',
116
  $oIpMod->getUrl_DirectLinkToOption( 'auto_expire' ),
117
+ $oCarbon->setTimestamp( $oReq->ts() + $oIpOpts->getAutoExpireTime() + 10 )
118
  ->diffForHumans( null, true )
119
  )
120
  ),
159
  'render_table_traffic' => $oTrafficMod->getAjaxActionData( 'render_table_traffic', true )
160
  ],
161
  'flags' => [
162
+ 'can_traffic' => true, // since 8.2 it's always available
163
  'is_enabled' => $oTrafficMod->isModOptEnabled(),
164
  ],
165
  'hrefs' => [
764
  * @return array[]
765
  */
766
  protected function getStats() {
767
+ $oCon = $this->getCon();
768
  /** @var Shield\Databases\Events\Handler $oDbhEvents */
769
+ $oDbhEvents = $oCon->getModule_Events()->getDbHandler_Events();
770
  /** @var Shield\Databases\Events\Select $oSelEvents */
771
  $oSelEvents = $oDbhEvents->getQuerySelector();
772
 
773
  /** @var Shield\Databases\IPs\Select $oSelectIp */
774
+ $oSelectIp = $oCon->getModule_IPs()
775
+ ->getDbHandler_IPs()
 
776
  ->getQuerySelector();
777
 
778
  return [
828
  * @return array
829
  */
830
  protected function getRecentEvents() {
831
+ $oCon = $this->getCon();
832
 
833
  $aEmptyStats = [];
834
+ foreach ( $oCon->getModules() as $oModule ) {
835
  /** @var ICWP_WPSF_FeatureHandler_BaseWpsf $oModule */
836
  $aStat = $oModule->getStatEvents_Recent();
837
  $aEmptyStats = array_merge( $aEmptyStats, $aStat );
841
  $oStrs = $this->getStrings();
842
  $aNames = $oStrs->getInsightStatNames();
843
 
 
 
 
 
844
  /** @var Shield\Databases\Events\Select $oSel */
845
+ $oSel = $oCon->getModule_Events()
846
+ ->getDbHandler_Events()
847
+ ->getQuerySelector();
848
 
849
  $aLatestStats = array_intersect_key(
850
  array_map(
src/features/ips.php CHANGED
@@ -9,12 +9,23 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
9
  const LIST_MANUAL_BLACK = 'MB';
10
  const LIST_AUTO_BLACK = 'AB';
11
 
 
 
 
 
 
 
 
12
  /**
13
  * @return bool
 
14
  */
15
  protected function isReadyToExecute() {
16
  $oIp = Services::IP();
17
- return $oIp->isValidIp_PublicRange( $oIp->getRequestIp() ) && parent::isReadyToExecute();
 
 
 
18
  }
19
 
20
  protected function doExtraSubmitProcessing() {
@@ -174,27 +185,6 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
174
  }
175
  }
176
 
177
- protected function ensureFeatureEnabled() {
178
- // we prevent disabling of this feature if the white list isn't empty
179
- if ( !$this->isModuleEnabled() ) {
180
- /** @var ICWP_WPSF_Processor_Ips $oProcessor */
181
- $oProcessor = $this->getProcessor();
182
- if ( count( $oProcessor->getWhitelistIpsData() ) > 0 ) {
183
- $this->setIsMainFeatureEnabled( true );
184
- $this->setFlashAdminNotice(
185
- sprintf( __( 'Sorry, the %s feature may not be disabled while there are IP addresses in the White List', 'wp-simple-firewall' ), $this->getMainFeatureName() )
186
- );
187
- }
188
- }
189
- }
190
-
191
- /**
192
- * @return Shield\Databases\IPs\Handler
193
- */
194
- protected function loadDbHandler() {
195
- return new Shield\Databases\IPs\Handler();
196
- }
197
-
198
  /**
199
  * @return string
200
  */
@@ -311,4 +301,12 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
311
  $sConstant = strtoupper( $this->getOpt( 'auto_expire' ).'_IN_SECONDS' );
312
  return defined( $sConstant ) ? constant( $sConstant ) : ( DAY_IN_SECONDS*30 );
313
  }
 
 
 
 
 
 
 
 
314
  }
9
  const LIST_MANUAL_BLACK = 'MB';
10
  const LIST_AUTO_BLACK = 'AB';
11
 
12
+ /**
13
+ * @return false|Shield\Databases\IPs\Handler
14
+ */
15
+ public function getDbHandler_IPs() {
16
+ return $this->getDbH( 'ips' );
17
+ }
18
+
19
  /**
20
  * @return bool
21
+ * @throws \Exception
22
  */
23
  protected function isReadyToExecute() {
24
  $oIp = Services::IP();
25
+ return $oIp->isValidIp_PublicRange( $oIp->getRequestIp() )
26
+ && ( $this->getDbHandler_IPs() instanceof Shield\Databases\IPs\Handler )
27
+ && $this->getDbHandler_IPs()->isReady()
28
+ && parent::isReadyToExecute();
29
  }
30
 
31
  protected function doExtraSubmitProcessing() {
185
  }
186
  }
187
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188
  /**
189
  * @return string
190
  */
301
  $sConstant = strtoupper( $this->getOpt( 'auto_expire' ).'_IN_SECONDS' );
302
  return defined( $sConstant ) ? constant( $sConstant ) : ( DAY_IN_SECONDS*30 );
303
  }
304
+
305
+ /**
306
+ * @return Shield\Databases\IPs\Handler
307
+ * @deprecated 8.1.2
308
+ */
309
+ protected function loadDbHandler() {
310
+ return new Shield\Databases\IPs\Handler();
311
+ }
312
  }
src/features/lockdown.php CHANGED
@@ -146,26 +146,6 @@ class ICWP_WPSF_FeatureHandler_Lockdown extends ICWP_WPSF_FeatureHandler_BaseWps
146
  return $aAllData;
147
  }
148
 
149
- protected function getCanDoAuthSalts() {
150
- $oWpFs = Services::WpFs();
151
-
152
- if ( !$oWpFs->getCanWpRemoteGet() ) {
153
- return false;
154
- }
155
-
156
- if ( !$oWpFs->getCanDiskWrite() ) {
157
- return false;
158
- }
159
-
160
- $sWpConfigPath = $oWpFs->exists( ABSPATH.'wp-config.php' ) ? ABSPATH.'wp-config.php' : ABSPATH.'../wp-config.php';
161
-
162
- if ( !$oWpFs->exists( $sWpConfigPath ) ) {
163
- return false;
164
- }
165
- $mResult = $oWpFs->getCanReadWriteFile( $sWpConfigPath );
166
- return !empty( $mResult );
167
- }
168
-
169
  /**
170
  * @return string
171
  */
146
  return $aAllData;
147
  }
148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
  /**
150
  * @return string
151
  */
src/features/login_protect.php CHANGED
@@ -184,6 +184,7 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
184
 
185
  /**
186
  * @return int
 
187
  */
188
  public function getCooldownInterval() {
189
  return (int)$this->getOpt( 'login_limit_interval' );
@@ -393,13 +394,6 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
393
  return is_array( $aLocs ) ? $aLocs : (array)$this->getOptions()->getOptDefault( 'bot_protection_locations' );
394
  }
395
 
396
- /**
397
- * @return bool
398
- */
399
- public function isCooldownEnabled() {
400
- return $this->getCooldownInterval() > 0;
401
- }
402
-
403
  /**
404
  * @return bool
405
  */
@@ -650,6 +644,14 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
650
  return $aAllData;
651
  }
652
 
 
 
 
 
 
 
 
 
653
  /**
654
  * @return string
655
  */
184
 
185
  /**
186
  * @return int
187
+ * @deprecated 8.1.2
188
  */
189
  public function getCooldownInterval() {
190
  return (int)$this->getOpt( 'login_limit_interval' );
394
  return is_array( $aLocs ) ? $aLocs : (array)$this->getOptions()->getOptDefault( 'bot_protection_locations' );
395
  }
396
 
 
 
 
 
 
 
 
397
  /**
398
  * @return bool
399
  */
644
  return $aAllData;
645
  }
646
 
647
+ /**
648
+ * @return bool
649
+ * @deprecated 8.1.2
650
+ */
651
+ public function isCooldownEnabled() {
652
+ return $this->getCooldownInterval() > 0;
653
+ }
654
+
655
  /**
656
  * @return string
657
  */
src/features/plugin.php CHANGED
@@ -5,16 +5,6 @@ use FernleafSystems\Wordpress\Services\Services;
5
 
6
  class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf {
7
 
8
- /**
9
- * @var Shield\Databases\AdminNotes\Handler
10
- */
11
- private $oDbh_Notes;
12
-
13
- /**
14
- * @var Shield\Databases\GeoIp\Handler
15
- */
16
- private $oDbh_GeoIp;
17
-
18
  protected function doPostConstruction() {
19
  parent::doPostConstruction();
20
  $this->setVisitorIp();
@@ -201,6 +191,7 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
201
  /**
202
  * @param bool $bOnOrOff
203
  * @return $this
 
204
  */
205
  public function setPluginTrackingPermission( $bOnOrOff = true ) {
206
  return $this->setOpt( 'enable_tracking', $bOnOrOff ? 'Y' : 'N' )
@@ -673,37 +664,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
673
  return ( !empty( $sId ) && is_string( $sId ) && strlen( $sId ) == 40 );
674
  }
675
 
676
- /**
677
- * @return string
678
- * @throws \Exception
679
- */
680
- public function renderPluginBadge() {
681
- $oCon = $this->getCon();
682
-
683
- $aData = [
684
- 'ajax' => [
685
- 'plugin_badge_close' => $this->getAjaxActionData( 'plugin_badge_close', true ),
686
- ],
687
- 'flags' => [
688
- 'nofollow' => apply_filters( 'icwp_shield_badge_relnofollow', false ),
689
- ],
690
- 'hrefs' => [
691
- 'logo' => $oCon->getPluginUrl_Image( 'shield/shield-security-logo-colour-32px.png' ),
692
- ],
693
- 'strings' => [
694
- 'link' => apply_filters( 'icwp_shield_plugin_badge_text', sprintf(
695
- __( 'This Site Is Protected By %s', 'wp-simple-firewall' ),
696
- sprintf(
697
- '<br /><span style="font-weight: bold;">The %s &rarr;</span>',
698
- $oCon->getHumanName()
699
- )
700
- ) ),
701
- 'name' => $oCon->getHumanName()
702
- ]
703
- ];
704
- return $this->renderTemplate( 'snippets/plugin_badge', $aData );
705
- }
706
-
707
  /**
708
  * @return bool
709
  */
@@ -711,13 +671,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
711
  return $this->isOpt( 'enable_xmlrpc_compatibility', 'Y' );
712
  }
713
 
714
- /**
715
- * @return int
716
- */
717
- public function getTestCronLastRunAt() {
718
- return (int)$this->getOpt( 'insights_test_cron_last_run_at', 0 );
719
- }
720
-
721
  /**
722
  * @return bool
723
  */
@@ -805,47 +758,18 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
805
  return $aAllData;
806
  }
807
 
808
- public function onPluginDelete() {
809
- $this->getDbHandler_GeoIp()->deleteTable();
810
- $this->getDbHandler_Notes()->deleteTable();
811
- parent::onPluginDelete();
812
- }
813
-
814
- protected function cleanupDatabases() {
815
- $this->getDbHandler_GeoIp()->autoCleanDb();
816
- $this->getDbHandler_Notes()->autoCleanDb();
817
- }
818
-
819
  /**
820
  * @return Shield\Databases\GeoIp\Handler
821
  */
822
  public function getDbHandler_GeoIp() {
823
- if ( !isset( $this->oDbh_GeoIp ) ) {
824
- try {
825
- $this->oDbh_GeoIp = ( new Shield\Databases\GeoIp\Handler() )
826
- ->setMod( $this )
827
- ->tableInit();
828
- }
829
- catch ( \Exception $oE ) {
830
- }
831
- }
832
- return $this->oDbh_GeoIp;
833
  }
834
 
835
  /**
836
  * @return Shield\Databases\AdminNotes\Handler
837
  */
838
  public function getDbHandler_Notes() {
839
- if ( !isset( $this->oDbh_Notes ) ) {
840
- try {
841
- $this->oDbh_Notes = ( new Shield\Databases\AdminNotes\Handler() )
842
- ->setMod( $this )
843
- ->tableInit();
844
- }
845
- catch ( \Exception $oE ) {
846
- }
847
- }
848
- return $this->oDbh_Notes;
849
  }
850
 
851
  /**
5
 
6
  class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf {
7
 
 
 
 
 
 
 
 
 
 
 
8
  protected function doPostConstruction() {
9
  parent::doPostConstruction();
10
  $this->setVisitorIp();
191
  /**
192
  * @param bool $bOnOrOff
193
  * @return $this
194
+ * @deprecated 8.2
195
  */
196
  public function setPluginTrackingPermission( $bOnOrOff = true ) {
197
  return $this->setOpt( 'enable_tracking', $bOnOrOff ? 'Y' : 'N' )
664
  return ( !empty( $sId ) && is_string( $sId ) && strlen( $sId ) == 40 );
665
  }
666
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
667
  /**
668
  * @return bool
669
  */
671
  return $this->isOpt( 'enable_xmlrpc_compatibility', 'Y' );
672
  }
673
 
 
 
 
 
 
 
 
674
  /**
675
  * @return bool
676
  */
758
  return $aAllData;
759
  }
760
 
 
 
 
 
 
 
 
 
 
 
 
761
  /**
762
  * @return Shield\Databases\GeoIp\Handler
763
  */
764
  public function getDbHandler_GeoIp() {
765
+ return $this->getDbH( 'geoip' );
 
 
 
 
 
 
 
 
 
766
  }
767
 
768
  /**
769
  * @return Shield\Databases\AdminNotes\Handler
770
  */
771
  public function getDbHandler_Notes() {
772
+ return $this->getDbH( 'notes' );
 
 
 
 
 
 
 
 
 
773
  }
774
 
775
  /**
src/features/sessions.php CHANGED
@@ -19,10 +19,20 @@ class ICWP_WPSF_FeatureHandler_Sessions extends ICWP_WPSF_FeatureHandler_BaseWps
19
  }
20
 
21
  /**
22
- * @return Shield\Databases\Session\Handler
23
  */
24
- protected function loadDbHandler() {
25
- return new Shield\Databases\Session\Handler();
 
 
 
 
 
 
 
 
 
 
26
  }
27
 
28
  /**
@@ -31,4 +41,12 @@ class ICWP_WPSF_FeatureHandler_Sessions extends ICWP_WPSF_FeatureHandler_BaseWps
31
  protected function getNamespaceBase() {
32
  return 'Sessions';
33
  }
 
 
 
 
 
 
 
 
34
  }
19
  }
20
 
21
  /**
22
+ * @return false|Shield\Databases\Session\Handler
23
  */
24
+ public function getDbHandler_Sessions() {
25
+ return $this->getDbH( 'session' );
26
+ }
27
+
28
+ /**
29
+ * @return bool
30
+ * @throws \Exception
31
+ */
32
+ protected function isReadyToExecute() {
33
+ return ( $this->getDbHandler_Sessions() instanceof Shield\Databases\Session\Handler )
34
+ && $this->getDbHandler_Sessions()->isReady()
35
+ && parent::isReadyToExecute();
36
  }
37
 
38
  /**
41
  protected function getNamespaceBase() {
42
  return 'Sessions';
43
  }
44
+
45
+ /**
46
+ * @return Shield\Databases\Session\Handler
47
+ * @deprecated 8.1.2
48
+ */
49
+ protected function loadDbHandler() {
50
+ return new Shield\Databases\Session\Handler();
51
+ }
52
  }
src/features/statistics.php CHANGED
@@ -3,6 +3,10 @@
3
  use FernleafSystems\Wordpress\Plugin\Shield;
4
  use FernleafSystems\Wordpress\Services\Services;
5
 
 
 
 
 
6
  class ICWP_WPSF_FeatureHandler_Statistics extends ICWP_WPSF_FeatureHandler_BaseWpsf {
7
 
8
  /**
@@ -12,103 +16,6 @@ class ICWP_WPSF_FeatureHandler_Statistics extends ICWP_WPSF_FeatureHandler_BaseW
12
  return false;
13
  }
14
 
15
- /**
16
- */
17
- protected function updateHandler() {
18
- $this->updateHandler_ConvertStats();
19
- }
20
-
21
- private function updateHandler_ConvertStats() {
22
- $aMap = [
23
- 'firewall.blocked.dirtraversal' => 'blockparam_dirtraversal',
24
- 'firewall.blocked.sqlqueries' => 'blockparam_sqlqueries',
25
- 'firewall.blocked.wpterms' => 'blockparam_wpterms',
26
- 'firewall.blocked.fieldtruncation' => 'blockparam_fieldtruncation',
27
- 'firewall.blocked.phpcode' => 'blockparam_phpcode',
28
- 'firewall.blocked.schema' => 'blockparam_schema',
29
- 'firewall.blocked.aggressive' => 'blockparam_aggressive',
30
- 'firewall.blocked.exefile' => 'block_exefile',
31
- 'ip.connection.killed' => 'conn_kill',
32
- 'ip.transgression.incremented' => 'ip_offense',
33
- 'login.rename.fail' => 'hide_login_url',
34
- 'user.session.start' => 'session_start',
35
- 'user.session.terminate' => 'session_terminate',
36
- 'login.recaptcha.verified' => 'recaptcha_success',
37
- 'login.recaptcha.fail' => 'recaptcha_fail',
38
- 'login.cooldown.fail' => 'block_exefile',
39
- 'login.twofactor.verified' => '2fa_success',
40
- ];
41
- // TODO: Count all firewall.blocked.*
42
-
43
- /** @var Shield\Databases\Tally\Handler $oDbH */
44
- $oDbH = $this->getDbHandler();
45
- /** @var Shield\Databases\Tally\Select $oSelectTally */
46
- $oSelectTally = $oDbH->getQuerySelector();
47
-
48
- /** @var Shield\Databases\Tally\EntryVO[] $aAll */
49
- $aAll = $oSelectTally->all();
50
-
51
- $aNewEvents = [
52
- 'firewall_block' => 0,
53
- 'botbox_fail' => 0,
54
- 'honeypot_fail' => 0,
55
- 'spam_block_bot' => 0,
56
- 'spam_block_recaptcha' => 0,
57
- 'spam_block_human' => 0,
58
- 'login_block' => 0,
59
- ];
60
- foreach ( $aAll as $oTally ) {
61
- if ( isset( $aMap[ $oTally->stat_key ] ) ) {
62
- $aNewEvents[ $aMap[ $oTally->stat_key ] ] = $oTally->tally;
63
- }
64
- if ( strpos( $oTally->stat_key, 'firewall.blocked.' ) === 0 ) {
65
- $aNewEvents[ 'firewall_block' ] += $oTally->tally;
66
- }
67
- if ( strpos( $oTally->stat_key, 'gasp.checkbox.fail' ) === 0 ) {
68
- $aNewEvents[ 'botbox_fail' ] += $oTally->tally;
69
- }
70
- if ( strpos( $oTally->stat_key, 'gasp.honeypot.fail' ) === 0 ) {
71
- $aNewEvents[ 'honeypot_fail' ] += $oTally->tally;
72
- }
73
- if ( strpos( $oTally->stat_key, 'spam.gasp.' ) === 0 ) {
74
- $aNewEvents[ 'spam_block_bot' ] += $oTally->tally;
75
- }
76
- if ( strpos( $oTally->stat_key, 'spam.recaptcha.' ) === 0 ) {
77
- $aNewEvents[ 'spam_block_recaptcha' ] += $oTally->tally;
78
- }
79
- if ( strpos( $oTally->stat_key, 'spam.human.' ) === 0 ) {
80
- $aNewEvents[ 'spam_block_human' ] += $oTally->tally;
81
- }
82
- if ( preg_match( '#login.*fail#', $oTally->stat_key ) ) {
83
- $aNewEvents[ 'login_block' ] += $oTally->tally;
84
- }
85
- }
86
-
87
- /** @var Shield\Databases\Events\Handler $oDbhEvents */
88
- $oDbhEvents = $this->getCon()->getModule_Events()->getDbHandler();
89
- $nTs = Services::Request()
90
- ->carbon()
91
- ->subYear( 1 )->timestamp;
92
- foreach ( array_filter( $aNewEvents ) as $sEvent => $nTally ) {
93
- $oDbhEvents->commitEvent( $sEvent, $nTally, $nTs );
94
- }
95
-
96
- /** @var Shield\Databases\Tally\Handler $oDbhTallys */
97
- $oDbhTallys = $this->getDbHandler();
98
- /** @var Shield\Databases\Tally\Delete $oDelTallys */
99
- $oDelTallys = $oDbhTallys->getQueryDeleter();
100
- foreach ( $aAll as $oTally ) {
101
- $oDelTallys->deleteEntry( $oTally );
102
- }
103
- }
104
-
105
- /**
106
- * @return Shield\Databases\Tally\Handler
107
- */
108
- protected function loadDbHandler() {
109
- return new Shield\Databases\Tally\Handler();
110
- }
111
-
112
  /**
113
  * @return string
114
  */
3
  use FernleafSystems\Wordpress\Plugin\Shield;
4
  use FernleafSystems\Wordpress\Services\Services;
5
 
6
+ /**
7
+ * Class ICWP_WPSF_FeatureHandler_Statistics
8
+ * @deprecated 8.1.2
9
+ */
10
  class ICWP_WPSF_FeatureHandler_Statistics extends ICWP_WPSF_FeatureHandler_BaseWpsf {
11
 
12
  /**
16
  return false;
17
  }
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  /**
20
  * @return string
21
  */
src/features/traffic.php CHANGED
@@ -5,6 +5,13 @@ use FernleafSystems\Wordpress\Services\Services;
5
 
6
  class ICWP_WPSF_FeatureHandler_Traffic extends ICWP_WPSF_FeatureHandler_BaseWpsf {
7
 
 
 
 
 
 
 
 
8
  /**
9
  * Hooked to the plugin's main plugin_shutdown action
10
  */
@@ -32,10 +39,14 @@ class ICWP_WPSF_FeatureHandler_Traffic extends ICWP_WPSF_FeatureHandler_BaseWpsf
32
 
33
  /**
34
  * @return bool
 
35
  */
36
  protected function isReadyToExecute() {
37
  $oIp = Services::IP();
38
- return $oIp->isValidIp_PublicRange( $oIp->getRequestIp() ) && parent::isReadyToExecute();
 
 
 
39
  }
40
 
41
  /**
@@ -45,26 +56,22 @@ class ICWP_WPSF_FeatureHandler_Traffic extends ICWP_WPSF_FeatureHandler_BaseWpsf
45
  protected function getSectionWarnings( $sSection ) {
46
  $aWarnings = [];
47
 
48
- if ( !$this->isPremium() ) {
49
- $aWarnings[] = sprintf( __( '%s is a Pro-only feature.', 'wp-simple-firewall' ), __( 'Traffic Watch', 'wp-simple-firewall' ) );
 
50
  }
51
- else {
52
- $oIp = Services::IP();
53
- if ( !$oIp->isValidIp_PublicRange( $oIp->getRequestIp() ) ) {
54
- $aWarnings[] = __( 'Traffic Watcher will not run because visitor IP address detection is not correctly configured.', 'wp-simple-firewall' );
55
- }
 
 
56
  }
57
 
58
  return $aWarnings;
59
  }
60
 
61
- /**
62
- * @return int
63
- */
64
- public function getAutoCleanDays() {
65
- return (int)$this->getOpt( 'auto_clean' );
66
- }
67
-
68
  /**
69
  * @return array
70
  */
@@ -152,17 +159,18 @@ class ICWP_WPSF_FeatureHandler_Traffic extends ICWP_WPSF_FeatureHandler_BaseWpsf
152
  }
153
 
154
  /**
155
- * @return Shield\Databases\Traffic\Handler
156
  */
157
- protected function loadDbHandler() {
158
- return new Shield\Databases\Traffic\Handler();
159
  }
160
 
161
  /**
162
- * @return string
 
163
  */
164
- protected function getNamespaceBase() {
165
- return 'Traffic';
166
  }
167
 
168
  /**
5
 
6
  class ICWP_WPSF_FeatureHandler_Traffic extends ICWP_WPSF_FeatureHandler_BaseWpsf {
7
 
8
+ /**
9
+ * @return false|Shield\Databases\Traffic\Handler
10
+ */
11
+ public function getDbHandler_Traffic() {
12
+ return $this->getDbH( 'traffic' );
13
+ }
14
+
15
  /**
16
  * Hooked to the plugin's main plugin_shutdown action
17
  */
39
 
40
  /**
41
  * @return bool
42
+ * @throws \Exception
43
  */
44
  protected function isReadyToExecute() {
45
  $oIp = Services::IP();
46
+ return $oIp->isValidIp_PublicRange( $oIp->getRequestIp() )
47
+ && ( $this->getDbHandler_Traffic() instanceof Shield\Databases\Traffic\Handler )
48
+ && $this->getDbHandler_Traffic()->isReady()
49
+ && parent::isReadyToExecute();
50
  }
51
 
52
  /**
56
  protected function getSectionWarnings( $sSection ) {
57
  $aWarnings = [];
58
 
59
+ $oIp = Services::IP();
60
+ if ( !$oIp->isValidIp_PublicRange( $oIp->getRequestIp() ) ) {
61
+ $aWarnings[] = __( 'Traffic Watcher will not run because visitor IP address detection is not correctly configured.', 'wp-simple-firewall' );
62
  }
63
+
64
+ switch ( $sSection ) {
65
+ case 'section_traffic_limiter':
66
+ if ( !$this->isPremium() ) {
67
+ $aWarnings[] = sprintf( __( '%s is a Pro-only feature.', 'wp-simple-firewall' ), __( 'Traffic Limiting', 'wp-simple-firewall' ) );
68
+ }
69
+ break;
70
  }
71
 
72
  return $aWarnings;
73
  }
74
 
 
 
 
 
 
 
 
75
  /**
76
  * @return array
77
  */
159
  }
160
 
161
  /**
162
+ * @return string
163
  */
164
+ protected function getNamespaceBase() {
165
+ return 'Traffic';
166
  }
167
 
168
  /**
169
+ * @return Shield\Databases\Traffic\Handler
170
+ * @deprecated 8.1.2
171
  */
172
+ protected function loadDbHandler() {
173
+ return new Shield\Databases\Traffic\Handler();
174
  }
175
 
176
  /**
src/features/user_management.php CHANGED
@@ -14,7 +14,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
14
 
15
  $sEmails = $this->getOpt( 'enable_admin_login_email_notification', '' );
16
  if ( !empty( $sEmails ) ) {
17
- $aEmails = array_values( array_filter(
18
  array_map(
19
  function ( $sEmail ) {
20
  return trim( strtolower( $sEmail ) );
@@ -24,7 +24,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
24
  function ( $sEmail ) {
25
  return Services::Data()->validEmail( $sEmail );
26
  }
27
- ) );
28
  if ( !$this->isPremium() && !empty( $aEmails ) ) {
29
  $aEmails = array_slice( $aEmails, 0, 1 );
30
  }
14
 
15
  $sEmails = $this->getOpt( 'enable_admin_login_email_notification', '' );
16
  if ( !empty( $sEmails ) ) {
17
+ $aEmails = array_values( array_unique( array_filter(
18
  array_map(
19
  function ( $sEmail ) {
20
  return trim( strtolower( $sEmail ) );
24
  function ( $sEmail ) {
25
  return Services::Data()->validEmail( $sEmail );
26
  }
27
+ ) ) );
28
  if ( !$this->isPremium() && !empty( $aEmails ) ) {
29
  $aEmails = array_slice( $aEmails, 0, 1 );
30
  }
src/lib/src/Controller/Controller.php CHANGED
@@ -1707,8 +1707,7 @@ class Controller extends Shield\Deprecated\Foundation {
1707
  $this->getSessionId(),
1708
  Services::Request()->ts() + DAY_IN_SECONDS*30,
1709
  Services::WpGeneral()->getCookiePath(),
1710
- Services::WpGeneral()->getCookieDomain(),
1711
- false
1712
  );
1713
  }
1714
 
@@ -1832,6 +1831,13 @@ class Controller extends Shield\Deprecated\Foundation {
1832
  return $this->getModule( 'sessions' );
1833
  }
1834
 
 
 
 
 
 
 
 
1835
  /**
1836
  * @return \ICWP_WPSF_FeatureHandler_Base[]
1837
  */
1707
  $this->getSessionId(),
1708
  Services::Request()->ts() + DAY_IN_SECONDS*30,
1709
  Services::WpGeneral()->getCookiePath(),
1710
+ Services::WpGeneral()->getCookieDomain()
 
1711
  );
1712
  }
1713
 
1831
  return $this->getModule( 'sessions' );
1832
  }
1833
 
1834
+ /**
1835
+ * @return \ICWP_WPSF_FeatureHandler_Traffic
1836
+ */
1837
+ public function getModule_Traffic() {
1838
+ return $this->getModule( 'traffic' );
1839
+ }
1840
+
1841
  /**
1842
  * @return \ICWP_WPSF_FeatureHandler_Base[]
1843
  */
src/lib/src/Databases/AdminNotes/Handler.php CHANGED
@@ -12,7 +12,7 @@ class Handler extends Base\Handler {
12
  */
13
  protected function getDefaultColumnsDefinition() {
14
  /** @var Options $oOpts */
15
- $oOpts = $this->getMod()->getOptions();
16
  return $oOpts->getDbColumns_Notes();
17
  }
18
 
@@ -21,7 +21,7 @@ class Handler extends Base\Handler {
21
  */
22
  protected function getDefaultTableName() {
23
  /** @var Options $oOpts */
24
- $oOpts = $this->getMod()->getOptions();
25
  return $oOpts->getDbTable_Notes();
26
  }
27
 
12
  */
13
  protected function getDefaultColumnsDefinition() {
14
  /** @var Options $oOpts */
15
+ $oOpts = $this->getOptions();
16
  return $oOpts->getDbColumns_Notes();
17
  }
18
 
21
  */
22
  protected function getDefaultTableName() {
23
  /** @var Options $oOpts */
24
+ $oOpts = $this->getOptions();
25
  return $oOpts->getDbTable_Notes();
26
  }
27
 
src/lib/src/Databases/AuditTrail/Handler.php CHANGED
@@ -14,7 +14,7 @@ class Handler extends Base\Handler {
14
  /** @var Options $oOpts */
15
  $oOpts = $oMod->getOptions();
16
  $this->cleanDb( $oOpts->getAutoCleanDays() );
17
- $this->trimDb( $oMod->getMaxEntries() );
18
  }
19
 
20
  /**
@@ -62,7 +62,7 @@ class Handler extends Base\Handler {
62
  */
63
  protected function getDefaultColumnsDefinition() {
64
  /** @var Options $oOpts */
65
- $oOpts = $this->getMod()->getOptions();
66
  return $oOpts->getDbColumns_AuditTrail();
67
  }
68
 
@@ -71,7 +71,7 @@ class Handler extends Base\Handler {
71
  */
72
  protected function getDefaultTableName() {
73
  /** @var Options $oOpts */
74
- $oOpts = $this->getMod()->getOptions();
75
  return $oOpts->getDbTable_AuditTrail();
76
  }
77
 
14
  /** @var Options $oOpts */
15
  $oOpts = $oMod->getOptions();
16
  $this->cleanDb( $oOpts->getAutoCleanDays() );
17
+ $this->trimDb( $oOpts->getMaxEntries() );
18
  }
19
 
20
  /**
62
  */
63
  protected function getDefaultColumnsDefinition() {
64
  /** @var Options $oOpts */
65
+ $oOpts = $this->getOptions();
66
  return $oOpts->getDbColumns_AuditTrail();
67
  }
68
 
71
  */
72
  protected function getDefaultTableName() {
73
  /** @var Options $oOpts */
74
+ $oOpts = $this->getOptions();
75
  return $oOpts->getDbTable_AuditTrail();
76
  }
77
 
src/lib/src/Databases/Base/Handler.php CHANGED
@@ -132,7 +132,7 @@ class Handler {
132
  * @return Insert
133
  */
134
  public function getQueryInserter() {
135
- $sClass = $this->getNamespace().'\\Insert';
136
  /** @var Insert $o */
137
  $o = new $sClass();
138
  return $o->setDbH( $this );
@@ -142,7 +142,7 @@ class Handler {
142
  * @return Delete
143
  */
144
  public function getQueryDeleter() {
145
- $sClass = $this->getNamespace().'\\Delete';
146
  /** @var Delete $o */
147
  $o = new $sClass();
148
  return $o->setDbH( $this );
@@ -152,7 +152,7 @@ class Handler {
152
  * @return Select
153
  */
154
  public function getQuerySelector() {
155
- $sClass = $this->getNamespace().'\\Select';
156
  /** @var Select $o */
157
  $o = new $sClass();
158
  return $o->setDbH( $this )
@@ -163,7 +163,7 @@ class Handler {
163
  * @return Update
164
  */
165
  public function getQueryUpdater() {
166
- $sClass = $this->getNamespace().'\\Update';
167
  /** @var Update $o */
168
  $o = new $sClass();
169
  return $o->setDbH( $this );
@@ -173,7 +173,7 @@ class Handler {
173
  * @return EntryVO
174
  */
175
  public function getVo() {
176
- $sClass = $this->getNamespace().'\\EntryVO';
177
  return new $sClass();
178
  }
179
 
@@ -323,11 +323,11 @@ class Handler {
323
  */
324
  private function getNamespace() {
325
  try {
326
- $sName = ( new \ReflectionClass( $this ) )->getNamespaceName();
327
  }
328
  catch ( \Exception $oE ) {
329
- $sName = __NAMESPACE__;
330
  }
331
- return $sName;
332
  }
333
  }
132
  * @return Insert
133
  */
134
  public function getQueryInserter() {
135
+ $sClass = $this->getNamespace().'Insert';
136
  /** @var Insert $o */
137
  $o = new $sClass();
138
  return $o->setDbH( $this );
142
  * @return Delete
143
  */
144
  public function getQueryDeleter() {
145
+ $sClass = $this->getNamespace().'Delete';
146
  /** @var Delete $o */
147
  $o = new $sClass();
148
  return $o->setDbH( $this );
152
  * @return Select
153
  */
154
  public function getQuerySelector() {
155
+ $sClass = $this->getNamespace().'Select';
156
  /** @var Select $o */
157
  $o = new $sClass();
158
  return $o->setDbH( $this )
163
  * @return Update
164
  */
165
  public function getQueryUpdater() {
166
+ $sClass = $this->getNamespace().'Update';
167
  /** @var Update $o */
168
  $o = new $sClass();
169
  return $o->setDbH( $this );
173
  * @return EntryVO
174
  */
175
  public function getVo() {
176
+ $sClass = $this->getNamespace().'EntryVO';
177
  return new $sClass();
178
  }
179
 
323
  */
324
  private function getNamespace() {
325
  try {
326
+ $sNS = ( new \ReflectionClass( $this ) )->getNamespaceName();
327
  }
328
  catch ( \Exception $oE ) {
329
+ $sNS = __NAMESPACE__;
330
  }
331
+ return rtrim( $sNS, '\\' ).'\\';
332
  }
333
  }
src/lib/src/Databases/ChangeTracking/Handler.php CHANGED
@@ -12,7 +12,7 @@ class Handler extends Base\Handler {
12
  */
13
  protected function getDefaultColumnsDefinition() {
14
  /** @var Options $oOpts */
15
- $oOpts = $this->getMod()->getOptions();
16
  return $oOpts->getDbColumns_ChangeTracking();
17
  }
18
 
@@ -21,7 +21,7 @@ class Handler extends Base\Handler {
21
  */
22
  protected function getDefaultTableName() {
23
  /** @var Options $oOpts */
24
- $oOpts = $this->getMod()->getOptions();
25
  return $oOpts->getDbTable_ChangeTracking();
26
  }
27
 
12
  */
13
  protected function getDefaultColumnsDefinition() {
14
  /** @var Options $oOpts */
15
+ $oOpts = $this->getOptions();
16
  return $oOpts->getDbColumns_ChangeTracking();
17
  }
18
 
21
  */
22
  protected function getDefaultTableName() {
23
  /** @var Options $oOpts */
24
+ $oOpts = $this->getOptions();
25
  return $oOpts->getDbTable_ChangeTracking();
26
  }
27
 
src/lib/src/Databases/Comments/Handler.php CHANGED
@@ -9,7 +9,7 @@ class Handler extends Base\Handler {
9
 
10
  public function autoCleanDb() {
11
  /** @var Options $oOpts */
12
- $oOpts = $this->getMod()->getOptions();
13
  $this->cleanDb( $oOpts->getTokenExpireInterval()/DAY_IN_SECONDS );
14
  }
15
 
@@ -18,7 +18,7 @@ class Handler extends Base\Handler {
18
  */
19
  protected function getDefaultTableName() {
20
  /** @var Options $oOpts */
21
- $oOpts = $this->getMod()->getOptions();
22
  return $oOpts->getDbTable_Spam();
23
  }
24
 
@@ -27,7 +27,7 @@ class Handler extends Base\Handler {
27
  */
28
  protected function getDefaultColumnsDefinition() {
29
  /** @var Options $oOpts */
30
- $oOpts = $this->getMod()->getOptions();
31
  return $oOpts->getDbColumns_Spam();
32
  }
33
 
9
 
10
  public function autoCleanDb() {
11
  /** @var Options $oOpts */
12
+ $oOpts = $this->getOptions();
13
  $this->cleanDb( $oOpts->getTokenExpireInterval()/DAY_IN_SECONDS );
14
  }
15
 
18
  */
19
  protected function getDefaultTableName() {
20
  /** @var Options $oOpts */
21
+ $oOpts = $this->getOptions();
22
  return $oOpts->getDbTable_Spam();
23
  }
24
 
27
  */
28
  protected function getDefaultColumnsDefinition() {
29
  /** @var Options $oOpts */
30
+ $oOpts = $this->getOptions();
31
  return $oOpts->getDbColumns_Spam();
32
  }
33
 
src/lib/src/Databases/Events/Handler.php CHANGED
@@ -43,7 +43,7 @@ class Handler extends Base\Handler {
43
  */
44
  protected function getDefaultColumnsDefinition() {
45
  /** @var Options $oOpts */
46
- $oOpts = $this->getMod()->getOptions();
47
  return $oOpts->getDbColumns_Events();
48
  }
49
 
@@ -52,7 +52,7 @@ class Handler extends Base\Handler {
52
  */
53
  protected function getDefaultTableName() {
54
  /** @var Options $oOpts */
55
- $oOpts = $this->getMod()->getOptions();
56
  return $oOpts->getDbTable_Events();
57
  }
58
 
43
  */
44
  protected function getDefaultColumnsDefinition() {
45
  /** @var Options $oOpts */
46
+ $oOpts = $this->getOptions();
47
  return $oOpts->getDbColumns_Events();
48
  }
49
 
52
  */
53
  protected function getDefaultTableName() {
54
  /** @var Options $oOpts */
55
+ $oOpts = $this->getOptions();
56
  return $oOpts->getDbTable_Events();
57
  }
58
 
src/lib/src/Databases/GeoIp/Handler.php CHANGED
@@ -9,7 +9,7 @@ class Handler extends Base\Handler {
9
 
10
  public function autoCleanDb() {
11
  /** @var Options $oOpts */
12
- $oOpts = $this->getMod()->getOptions();
13
  $this->cleanDb( $oOpts->getDef( 'db_autoexpire_geoip' ) );
14
  }
15
 
@@ -18,7 +18,7 @@ class Handler extends Base\Handler {
18
  */
19
  protected function getDefaultColumnsDefinition() {
20
  /** @var Options $oOpts */
21
- $oOpts = $this->getMod()->getOptions();
22
  return $oOpts->getDbColumns_GeoIp();
23
  }
24
 
@@ -27,7 +27,7 @@ class Handler extends Base\Handler {
27
  */
28
  protected function getDefaultTableName() {
29
  /** @var Options $oOpts */
30
- $oOpts = $this->getMod()->getOptions();
31
  return $oOpts->getDbTable_GeoIp();
32
  }
33
 
9
 
10
  public function autoCleanDb() {
11
  /** @var Options $oOpts */
12
+ $oOpts = $this->getOptions();
13
  $this->cleanDb( $oOpts->getDef( 'db_autoexpire_geoip' ) );
14
  }
15
 
18
  */
19
  protected function getDefaultColumnsDefinition() {
20
  /** @var Options $oOpts */
21
+ $oOpts = $this->getOptions();
22
  return $oOpts->getDbColumns_GeoIp();
23
  }
24
 
27
  */
28
  protected function getDefaultTableName() {
29
  /** @var Options $oOpts */
30
+ $oOpts = $this->getOptions();
31
  return $oOpts->getDbTable_GeoIp();
32
  }
33
 
src/lib/src/Databases/IPs/Handler.php CHANGED
@@ -36,7 +36,7 @@ class Handler extends Base\Handler {
36
  */
37
  protected function getDefaultColumnsDefinition() {
38
  /** @var Options $oOpts */
39
- $oOpts = $this->getMod()->getOptions();
40
  return $oOpts->getDbColumns_IPs();
41
  }
42
 
@@ -45,7 +45,7 @@ class Handler extends Base\Handler {
45
  */
46
  protected function getDefaultTableName() {
47
  /** @var Options $oOpts */
48
- $oOpts = $this->getMod()->getOptions();
49
  return $oOpts->getDbTable_IPs();
50
  }
51
 
36
  */
37
  protected function getDefaultColumnsDefinition() {
38
  /** @var Options $oOpts */
39
+ $oOpts = $this->getOptions();
40
  return $oOpts->getDbColumns_IPs();
41
  }
42
 
45
  */
46
  protected function getDefaultTableName() {
47
  /** @var Options $oOpts */
48
+ $oOpts = $this->getOptions();
49
  return $oOpts->getDbTable_IPs();
50
  }
51
 
src/lib/src/Databases/ScanQueue/Handler.php CHANGED
@@ -12,7 +12,7 @@ class Handler extends Base\Handler {
12
  */
13
  protected function getDefaultColumnsDefinition() {
14
  /** @var Options $oOpts */
15
- $oOpts = $this->getMod()->getOptions();
16
  return $oOpts->getDbColumns_ScanQueue();
17
  }
18
 
@@ -21,7 +21,7 @@ class Handler extends Base\Handler {
21
  */
22
  protected function getDefaultTableName() {
23
  /** @var Options $oOpts */
24
- $oOpts = $this->getMod()->getOptions();
25
  return $oOpts->getDbTable_ScanQueue();
26
  }
27
 
12
  */
13
  protected function getDefaultColumnsDefinition() {
14
  /** @var Options $oOpts */
15
+ $oOpts = $this->getOptions();
16
  return $oOpts->getDbColumns_ScanQueue();
17
  }
18
 
21
  */
22
  protected function getDefaultTableName() {
23
  /** @var Options $oOpts */
24
+ $oOpts = $this->getOptions();
25
  return $oOpts->getDbTable_ScanQueue();
26
  }
27
 
src/lib/src/Databases/Scanner/Handler.php CHANGED
@@ -12,7 +12,7 @@ class Handler extends Base\Handler {
12
  */
13
  protected function getDefaultColumnsDefinition() {
14
  /** @var Options $oOpts */
15
- $oOpts = $this->getMod()->getOptions();
16
  return $oOpts->getDbColumns_Scanner();
17
  }
18
 
@@ -21,7 +21,7 @@ class Handler extends Base\Handler {
21
  */
22
  protected function getDefaultTableName() {
23
  /** @var Options $oOpts */
24
- $oOpts = $this->getMod()->getOptions();
25
  return $oOpts->getDbTable_Scanner();
26
  }
27
 
12
  */
13
  protected function getDefaultColumnsDefinition() {
14
  /** @var Options $oOpts */
15
+ $oOpts = $this->getOptions();
16
  return $oOpts->getDbColumns_Scanner();
17
  }
18
 
21
  */
22
  protected function getDefaultTableName() {
23
  /** @var Options $oOpts */
24
+ $oOpts = $this->getOptions();
25
  return $oOpts->getDbTable_Scanner();
26
  }
27
 
src/lib/src/Databases/Session/Handler.php CHANGED
@@ -16,7 +16,7 @@ class Handler extends Base\Handler {
16
  */
17
  protected function getDefaultColumnsDefinition() {
18
  /** @var Options $oOpts */
19
- $oOpts = $this->getMod()->getOptions();
20
  return $oOpts->getDbColumns_Sessions();
21
  }
22
 
@@ -25,7 +25,7 @@ class Handler extends Base\Handler {
25
  */
26
  protected function getDefaultTableName() {
27
  /** @var Options $oOpts */
28
- $oOpts = $this->getMod()->getOptions();
29
  return $oOpts->getDbTable_Sessions();
30
  }
31
 
16
  */
17
  protected function getDefaultColumnsDefinition() {
18
  /** @var Options $oOpts */
19
+ $oOpts = $this->getOptions();
20
  return $oOpts->getDbColumns_Sessions();
21
  }
22
 
25
  */
26
  protected function getDefaultTableName() {
27
  /** @var Options $oOpts */
28
+ $oOpts = $this->getOptions();
29
  return $oOpts->getDbTable_Sessions();
30
  }
31
 
src/lib/src/Databases/Tally/Handler.php CHANGED
@@ -12,7 +12,7 @@ class Handler extends Base\Handler {
12
  */
13
  protected function getDefaultColumnsDefinition() {
14
  /** @var Options $oOpts */
15
- $oOpts = $this->getMod()->getOptions();
16
  return $oOpts->getDbColumns_Tallys();
17
  }
18
 
@@ -21,7 +21,7 @@ class Handler extends Base\Handler {
21
  */
22
  protected function getDefaultTableName() {
23
  /** @var Options $oOpts */
24
- $oOpts = $this->getMod()->getOptions();
25
  return $oOpts->getDbTable_Tallys();
26
  }
27
 
12
  */
13
  protected function getDefaultColumnsDefinition() {
14
  /** @var Options $oOpts */
15
+ $oOpts = $this->getOptions();
16
  return $oOpts->getDbColumns_Tallys();
17
  }
18
 
21
  */
22
  protected function getDefaultTableName() {
23
  /** @var Options $oOpts */
24
+ $oOpts = $this->getOptions();
25
  return $oOpts->getDbTable_Tallys();
26
  }
27
 
src/lib/src/Databases/Traffic/Handler.php CHANGED
@@ -9,7 +9,7 @@ class Handler extends Base\Handler {
9
 
10
  public function autoCleanDb() {
11
  /** @var Options $oOpts */
12
- $oOpts = $this->getMod()->getOptions();
13
  $this->cleanDb( $oOpts->getAutoCleanDays() );
14
  $this->trimDb( $oOpts->getMaxEntries() );
15
  }
@@ -19,7 +19,7 @@ class Handler extends Base\Handler {
19
  */
20
  protected function getDefaultColumnsDefinition() {
21
  /** @var Options $oOpts */
22
- $oOpts = $this->getMod()->getOptions();
23
  return $oOpts->getDbColumns_TrafficLog();
24
  }
25
 
@@ -28,7 +28,7 @@ class Handler extends Base\Handler {
28
  */
29
  protected function getDefaultTableName() {
30
  /** @var Options $oOpts */
31
- $oOpts = $this->getMod()->getOptions();
32
  return $oOpts->getDbTable_TrafficLog();
33
  }
34
 
9
 
10
  public function autoCleanDb() {
11
  /** @var Options $oOpts */
12
+ $oOpts = $this->getOptions();
13
  $this->cleanDb( $oOpts->getAutoCleanDays() );
14
  $this->trimDb( $oOpts->getMaxEntries() );
15
  }
19
  */
20
  protected function getDefaultColumnsDefinition() {
21
  /** @var Options $oOpts */
22
+ $oOpts = $this->getOptions();
23
  return $oOpts->getDbColumns_TrafficLog();
24
  }
25
 
28
  */
29
  protected function getDefaultTableName() {
30
  /** @var Options $oOpts */
31
+ $oOpts = $this->getOptions();
32
  return $oOpts->getDbTable_TrafficLog();
33
  }
34
 
src/lib/src/Modules/AuditTrail/AjaxHandler.php CHANGED
@@ -43,7 +43,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
43
  }
44
  else {
45
  /** @var Shield\Databases\AuditTrail\EntryVO $oEntry */
46
- $oEntry = $oMod->getDbHandler()
47
  ->getQuerySelector()
48
  ->byId( $nId );
49
 
@@ -81,7 +81,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
81
  $oMod = $this->getMod();
82
  $oTableBuilder = ( new Shield\Tables\Build\AuditTrail() )
83
  ->setMod( $oMod )
84
- ->setDbHandler( $oMod->getDbHandler() );
85
 
86
  return [
87
  'success' => true,
43
  }
44
  else {
45
  /** @var Shield\Databases\AuditTrail\EntryVO $oEntry */
46
+ $oEntry = $oMod->getDbHandler_AuditTrail()
47
  ->getQuerySelector()
48
  ->byId( $nId );
49
 
81
  $oMod = $this->getMod();
82
  $oTableBuilder = ( new Shield\Tables\Build\AuditTrail() )
83
  ->setMod( $oMod )
84
+ ->setDbHandler( $oMod->getDbHandler_AuditTrail() );
85
 
86
  return [
87
  'success' => true,
src/lib/src/Modules/Base/AdminNotices.php CHANGED
@@ -111,7 +111,7 @@ class AdminNotices {
111
  );
112
  return ( new Shield\Utilities\AdminNotices\NoticeVO() )->applyFromArray( $aNotDef );
113
  },
114
- $this->getMod()->getOptions()->getAdminNotices()
115
  );
116
  }
117
 
@@ -126,7 +126,7 @@ class AdminNotices {
126
  if ( $oNtc->plugin_page_only && !$oCon->isModulePage() ) {
127
  $oNtc->non_display_reason = 'plugin_page_only';
128
  }
129
- else if ( $oNtc->type == 'promo' && !$this->getMod()->getOptions()->isShowPromoAdminNotices() ) {
130
  $oNtc->non_display_reason = 'promo_hidden';
131
  }
132
  else if ( $oNtc->valid_admin && !$oCon->isValidAdminArea() ) {
111
  );
112
  return ( new Shield\Utilities\AdminNotices\NoticeVO() )->applyFromArray( $aNotDef );
113
  },
114
+ $this->getOptions()->getAdminNotices()
115
  );
116
  }
117
 
126
  if ( $oNtc->plugin_page_only && !$oCon->isModulePage() ) {
127
  $oNtc->non_display_reason = 'plugin_page_only';
128
  }
129
+ else if ( $oNtc->type == 'promo' && !$this->getOptions()->isShowPromoAdminNotices() ) {
130
  $oNtc->non_display_reason = 'promo_hidden';
131
  }
132
  else if ( $oNtc->valid_admin && !$oCon->isValidAdminArea() ) {
src/lib/src/Modules/Base/BaseModCon.php CHANGED
@@ -56,6 +56,11 @@ class BaseModCon extends Deprecated\Foundation {
56
  */
57
  private $oOpts;
58
 
 
 
 
 
 
59
  /**
60
  * @param Shield\Controller\Controller $oPluginController
61
  * @param array $aMod
@@ -156,14 +161,67 @@ class BaseModCon extends Deprecated\Foundation {
156
  }
157
 
158
  protected function cleanupDatabases() {
159
- $oDbh = $this->getDbHandler();
160
- try {
161
- if ( $oDbh instanceof Shield\Databases\Base\Handler && $oDbh->isReady() ) {
162
- $oDbh->autoCleanDb();
 
 
 
163
  }
164
  }
165
- catch ( \Exception $oE ) {
 
 
 
 
 
 
 
 
 
 
166
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  }
168
 
169
  /**
@@ -181,12 +239,13 @@ class BaseModCon extends Deprecated\Foundation {
181
  $aEvts = $this->getSupportedEvents();
182
 
183
  $aDefaults = [
184
- 'context' => $this->getSlug(),
185
- 'cat' => 1,
186
- 'stat' => true,
187
- 'audit' => true,
188
- 'recent' => false, // whether to show in the recent events logs
189
- 'offense' => false, // whether to mark offense against IP
 
190
  ];
191
  foreach ( $aEvts as $sKey => $aEvt ) {
192
  $aEvts[ $sKey ] = array_merge( $aDefaults, $aEvt );
@@ -337,20 +396,10 @@ class BaseModCon extends Deprecated\Foundation {
337
  }
338
 
339
  /**
340
- * Used to effect certain processing that is to do with options etc. but isn't related to processing
341
- * functionality of the plugin.
342
  * @return bool
343
  */
344
  protected function isReadyToExecute() {
345
- try {
346
- $oDbH = $this->getDbHandler();
347
- $bReady = ( $this->getProcessor() instanceof Shield\Modules\Base\BaseProcessor )
348
- && ( !$oDbH instanceof Shield\Databases\Base\Handler || $oDbH->isReady() );
349
- }
350
- catch ( \Exception $oE ) {
351
- $bReady = false;
352
- }
353
- return $bReady;
354
  }
355
 
356
  protected function doExecuteProcessor() {
@@ -768,7 +817,7 @@ class BaseModCon extends Deprecated\Foundation {
768
  * @return mixed|null
769
  */
770
  public function getDef( $sKey ) {
771
- return $this->getOptions()->getFeatureDefinition( $sKey );
772
  }
773
 
774
  /**
@@ -1154,7 +1203,7 @@ class BaseModCon extends Deprecated\Foundation {
1154
  if ( !empty( $oDbh ) ) {
1155
  $oDbh->deleteTable();
1156
  }
1157
- $this->getOptions()->doOptionsDelete();
1158
  }
1159
 
1160
  /**
@@ -1201,6 +1250,7 @@ class BaseModCon extends Deprecated\Foundation {
1201
  /**
1202
  * @param string $sMsg
1203
  * @param bool $bError
 
1204
  * @return $this
1205
  */
1206
  public function setFlashAdminNotice( $sMsg, $bError = false, $bShowOnLogin = false ) {
@@ -1357,13 +1407,6 @@ class BaseModCon extends Deprecated\Foundation {
1357
  return ( $this->getCon()->getShieldAction() == 'wizard' && $this->isThisModulePage() );
1358
  }
1359
 
1360
- /**
1361
- * @return boolean
1362
- */
1363
- public function hasEncryptOption() {
1364
- return function_exists( 'md5' );
1365
- }
1366
-
1367
  /**
1368
  * Will prefix and return any string with the unique plugin prefix.
1369
  * @param string $sSuffix
56
  */
57
  private $oOpts;
58
 
59
+ /**
60
+ * @var Shield\Databases\Base\Handler[]
61
+ */
62
+ private $aDbHandlers;
63
+
64
  /**
65
  * @param Shield\Controller\Controller $oPluginController
66
  * @param array $aMod
161
  }
162
 
163
  protected function cleanupDatabases() {
164
+ foreach ( $this->getDbHandlers( true ) as $oDbh ) {
165
+ try {
166
+ if ( $oDbh instanceof Shield\Databases\Base\Handler && $oDbh->isReady() ) {
167
+ $oDbh->autoCleanDb();
168
+ }
169
+ }
170
+ catch ( \Exception $oE ) {
171
  }
172
  }
173
+ }
174
+
175
+ /**
176
+ * @param bool $bInitAll
177
+ * @return Shield\Databases\Base\Handler[]
178
+ */
179
+ protected function getDbHandlers( $bInitAll = false ) {
180
+ if ( $bInitAll ) {
181
+ foreach ( $this->getAllDbClasses() as $sDbSlug => $sDbClass ) {
182
+ $this->getDbH( $sDbSlug );
183
+ }
184
  }
185
+ return is_array( $this->aDbHandlers ) ? $this->aDbHandlers : [];
186
+ }
187
+
188
+ /**
189
+ * @param string $sDbhKey
190
+ * @return Shield\Databases\Base\Handler|mixed|false
191
+ */
192
+ protected function getDbH( $sDbhKey ) {
193
+ $oDbH = false;
194
+
195
+ if ( !is_array( $this->aDbHandlers ) ) {
196
+ $this->aDbHandlers = [];
197
+ }
198
+
199
+ if ( !empty( $this->aDbHandlers[ $sDbhKey ] ) ) {
200
+ $oDbH = $this->aDbHandlers[ $sDbhKey ];
201
+ }
202
+ else {
203
+ $aDbClasses = $this->getAllDbClasses();
204
+ if ( isset( $aDbClasses[ $sDbhKey ] ) ) {
205
+ /** @var Shield\Databases\Base\Handler $oDbH */
206
+ $oDbH = new $aDbClasses[ $sDbhKey ]();
207
+ try {
208
+ $oDbH->setMod( $this )->tableInit();
209
+ }
210
+ catch ( \Exception $oE ) {
211
+ }
212
+ }
213
+ $this->aDbHandlers[ $sDbhKey ] = $oDbH;
214
+ }
215
+
216
+ return $oDbH;
217
+ }
218
+
219
+ /**
220
+ * @return string[]
221
+ */
222
+ private function getAllDbClasses() {
223
+ $aCls = $this->getOptions()->getDef( 'db_classes' );
224
+ return is_array( $aCls ) ? $aCls : [];
225
  }
226
 
227
  /**
239
  $aEvts = $this->getSupportedEvents();
240
 
241
  $aDefaults = [
242
+ 'context' => $this->getSlug(),
243
+ 'cat' => 1,
244
+ 'stat' => true,
245
+ 'audit' => true,
246
+ 'recent' => false, // whether to show in the recent events logs
247
+ 'offense' => false, // whether to mark offense against IP
248
+ 'audit_multiple' => false, // allow multiple audit entries in the same request
249
  ];
250
  foreach ( $aEvts as $sKey => $aEvt ) {
251
  $aEvts[ $sKey ] = array_merge( $aDefaults, $aEvt );
396
  }
397
 
398
  /**
 
 
399
  * @return bool
400
  */
401
  protected function isReadyToExecute() {
402
+ return ( $this->getProcessor() instanceof Shield\Modules\Base\BaseProcessor );
 
 
 
 
 
 
 
 
403
  }
404
 
405
  protected function doExecuteProcessor() {
817
  * @return mixed|null
818
  */
819
  public function getDef( $sKey ) {
820
+ return $this->getOptions()->getDef( $sKey );
821
  }
822
 
823
  /**
1203
  if ( !empty( $oDbh ) ) {
1204
  $oDbh->deleteTable();
1205
  }
1206
+ $this->getOptions()->deleteStorage();
1207
  }
1208
 
1209
  /**
1250
  /**
1251
  * @param string $sMsg
1252
  * @param bool $bError
1253
+ * @param bool $bShowOnLogin
1254
  * @return $this
1255
  */
1256
  public function setFlashAdminNotice( $sMsg, $bError = false, $bShowOnLogin = false ) {
1407
  return ( $this->getCon()->getShieldAction() == 'wizard' && $this->isThisModulePage() );
1408
  }
1409
 
 
 
 
 
 
 
 
1410
  /**
1411
  * Will prefix and return any string with the unique plugin prefix.
1412
  * @param string $sSuffix
src/lib/src/Modules/Base/Options.php CHANGED
@@ -60,13 +60,6 @@ class Options {
60
  public function __construct() {
61
  }
62
 
63
- /**
64
- * @return bool
65
- */
66
- public function cleanTransientStorage() {
67
- return Services::WpGeneral()->deleteTransient( $this->getSpecTransientStorageKey() );
68
- }
69
-
70
  /**
71
  * @param bool $bDeleteFirst Used primarily with plugin reset
72
  * @param bool $bIsPremiumLicensed
@@ -90,7 +83,7 @@ class Options {
90
  /**
91
  * @return bool
92
  */
93
- public function doOptionsDelete() {
94
  $oWp = Services::WpGeneral();
95
  $oWp->deleteTransient( $this->getSpecTransientStorageKey() );
96
  return $oWp->deleteOption( $this->getOptionsStorageKey() );
@@ -850,9 +843,11 @@ class Options {
850
  if ( !is_null( $nMin ) ) {
851
  $bValid = $mPotentialValue >= $nMin;
852
  }
853
- $nMax = $this->getOptProperty( $sOptKey, 'max' );
854
- if ( !is_null( $nMax ) ) {
855
- $bValid = $mPotentialValue <= $nMax;
 
 
856
  }
857
  break;
858
 
60
  public function __construct() {
61
  }
62
 
 
 
 
 
 
 
 
63
  /**
64
  * @param bool $bDeleteFirst Used primarily with plugin reset
65
  * @param bool $bIsPremiumLicensed
83
  /**
84
  * @return bool
85
  */
86
+ public function deleteStorage() {
87
  $oWp = Services::WpGeneral();
88
  $oWp->deleteTransient( $this->getSpecTransientStorageKey() );
89
  return $oWp->deleteOption( $this->getOptionsStorageKey() );
843
  if ( !is_null( $nMin ) ) {
844
  $bValid = $mPotentialValue >= $nMin;
845
  }
846
+ if ( $bValid ) {
847
+ $nMax = $this->getOptProperty( $sOptKey, 'max' );
848
+ if ( !is_null( $nMax ) ) {
849
+ $bValid = $mPotentialValue <= $nMax;
850
+ }
851
  }
852
  break;
853
 
src/lib/src/Modules/Base/Strings.php CHANGED
@@ -14,6 +14,21 @@ class Strings {
14
  */
15
  public function getDisplayStrings() {
16
  $oCon = $this->getCon();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  return Services::DataManipulation()->mergeArraysRecursive(
18
  [
19
  'see_help_video' => __( 'Watch Help Video' ),
@@ -69,11 +84,16 @@ class Strings {
69
  'offense' => __( 'offense', 'wp-simple-firewall' ),
70
  'debug' => __( 'Debug', 'wp-simple-firewall' ),
71
 
72
- 'privacy_policy_agree' => __( 'Agree To Privacy Policy', 'wp-simple-firewall' ),
73
  'privacy_policy_confirm' => __( "I confirm that I've read and I agree to the Privacy Policy", 'wp-simple-firewall' ),
74
- 'privacy_policy_gdpr' => __( 'We treat your information under our strict, and GDPR-compliant, privacy policy.', 'wp-simple-firewall' ),
75
  'privacy_policy' => __( 'Privacy Policy', 'wp-simple-firewall' ),
76
- 'privacy_never_spam' => __( 'We never SPAM and you can remove yourself at any time.', 'wp-simple-firewall' ),
 
 
 
 
 
77
  ],
78
  $this->getAdditionalDisplayStrings()
79
  );
14
  */
15
  public function getDisplayStrings() {
16
  $oCon = $this->getCon();
17
+
18
+ $aProFeatures = [
19
+ __( 'Customer Support', 'wp-simple-firewall' ),
20
+ __( 'More Scans', 'wp-simple-firewall' ),
21
+ __( 'Malware Scanner', 'wp-simple-firewall' ),
22
+ __( 'Scan Every Hour', 'wp-simple-firewall' ),
23
+ __( 'White Label', 'wp-simple-firewall' ),
24
+ __( 'Import/Export', 'wp-simple-firewall' ),
25
+ __( 'Better Bot Detection', 'wp-simple-firewall' ),
26
+ __( 'Password Policies', 'wp-simple-firewall' ),
27
+ __( 'WooCommerce Support', 'wp-simple-firewall' ),
28
+ ];
29
+ $aProFeaturesDisplay = array_intersect_key( $aProFeatures, array_flip( array_rand( $aProFeatures, 6 ) ) );
30
+ $aProFeaturesDisplay[] = __( 'and much more!' );
31
+
32
  return Services::DataManipulation()->mergeArraysRecursive(
33
  [
34
  'see_help_video' => __( 'Watch Help Video' ),
84
  'offense' => __( 'offense', 'wp-simple-firewall' ),
85
  'debug' => __( 'Debug', 'wp-simple-firewall' ),
86
 
87
+ 'privacy_policy_agree' => __( 'Agree To Privacy Policy', 'wp-simple-firewall' ),
88
  'privacy_policy_confirm' => __( "I confirm that I've read and I agree to the Privacy Policy", 'wp-simple-firewall' ),
89
+ 'privacy_policy_gdpr' => __( 'We treat your information under our strict, and GDPR-compliant, privacy policy.', 'wp-simple-firewall' ),
90
  'privacy_policy' => __( 'Privacy Policy', 'wp-simple-firewall' ),
91
+ 'privacy_never_spam' => __( 'We never SPAM and you can remove yourself at any time.', 'wp-simple-firewall' ),
92
+
93
+ 'pro_features' => __( 'Pro features include', 'wp-simple-firewall' ),
94
+ 'join_thousands_H' => __( "Join The 1,000s Who've Already Upgraded Their WordPress Security To Better Protect Their Sites.", 'wp-simple-firewall' ),
95
+ 'join_thousands_P' => implode( ', ', $aProFeaturesDisplay ),
96
+ 'get_pro_protection' => __( 'Upgrade To Pro Protection', 'wp-simple-firewall' ),
97
  ],
98
  $this->getAdditionalDisplayStrings()
99
  );
src/lib/src/Modules/BaseShield/ShieldProcessor.php CHANGED
@@ -65,7 +65,7 @@ class ShieldProcessor extends Base\BaseProcessor {
65
  * @param bool $bLog
66
  * @return $this
67
  */
68
- protected function setIfLogRequest( $bLog ) {
69
  $this->bLogRequest = $bLog;
70
  return $this;
71
  }
65
  * @param bool $bLog
66
  * @return $this
67
  */
68
+ public function setIfLogRequest( $bLog ) {
69
  $this->bLogRequest = $bLog;
70
  return $this;
71
  }
src/lib/src/Modules/Events/AjaxHandler.php CHANGED
@@ -31,14 +31,12 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
31
  public function ajaxExec_RenderChart() {
32
  /** @var \ICWP_WPSF_FeatureHandler_Events $oMod */
33
  $oMod = $this->getMod();
34
- /** @var Strings $oStrs */
35
- $oStrs = $oMod->getStrings();
36
 
37
  $aParams = $this->getAjaxFormParams();
38
  $sEvent = $aParams[ 'event' ];
39
 
40
  /** @var Shield\Databases\Events\Handler $oDbhEvts */
41
- $oDbhEvts = $oMod->getDbHandler();
42
  $nDays = 0;
43
  $aSeries = [];
44
  $aLabels = [];
31
  public function ajaxExec_RenderChart() {
32
  /** @var \ICWP_WPSF_FeatureHandler_Events $oMod */
33
  $oMod = $this->getMod();
 
 
34
 
35
  $aParams = $this->getAjaxFormParams();
36
  $sEvent = $aParams[ 'event' ];
37
 
38
  /** @var Shield\Databases\Events\Handler $oDbhEvts */
39
+ $oDbhEvts = $oMod->getDbHandler_Events();
40
  $nDays = 0;
41
  $aSeries = [];
42
  $aLabels = [];
src/lib/src/Modules/HackGuard/AjaxHandler.php CHANGED
@@ -56,6 +56,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
56
  * @return array
57
  */
58
  private function ajaxExec_BuildTableScan() {
 
59
  $oMod = $this->getMod();
60
 
61
  $sScanSlug = Services::Request()->post( 'fScan' );
@@ -95,7 +96,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
95
  else {
96
  $sHtml = $oTableBuilder
97
  ->setMod( $oMod )
98
- ->setDbHandler( $oMod->getDbHandler() )
99
  ->setScanActionVO( ( new Scan\ScanActionFromSlug() )->getAction( $sScanSlug ) )
100
  ->buildTable();
101
  }
56
  * @return array
57
  */
58
  private function ajaxExec_BuildTableScan() {
59
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
60
  $oMod = $this->getMod();
61
 
62
  $sScanSlug = Services::Request()->post( 'fScan' );
96
  else {
97
  $sHtml = $oTableBuilder
98
  ->setMod( $oMod )
99
+ ->setDbHandler( $oMod->getDbHandler_ScanResults() )
100
  ->setScanActionVO( ( new Scan\ScanActionFromSlug() )->getAction( $sScanSlug ) )
101
  ->buildTable();
102
  }
src/lib/src/Modules/HackGuard/Options.php CHANGED
@@ -35,6 +35,13 @@ class Options extends Base\ShieldOptions {
35
  return $this->getCon()->prefixOption( $this->getDef( 'table_name_scanqueue' ) );
36
  }
37
 
 
 
 
 
 
 
 
38
  /**
39
  * We do some WP Content dir replacement as there may be custom wp-content dir defines
40
  * @return string[]
@@ -101,6 +108,48 @@ class Options extends Base\ShieldOptions {
101
  return $aSigs;
102
  }
103
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  /**
105
  * @return string[]
106
  */
35
  return $this->getCon()->prefixOption( $this->getDef( 'table_name_scanqueue' ) );
36
  }
37
 
38
+ /**
39
+ * @return int
40
+ */
41
+ public function getMalConfidenceBoundary() {
42
+ return (int)$this->getOpt( 'mal_fp_confidence' );
43
+ }
44
+
45
  /**
46
  * We do some WP Content dir replacement as there may be custom wp-content dir defines
47
  * @return string[]
108
  return $aSigs;
109
  }
110
 
111
+ /**
112
+ * @return bool
113
+ */
114
+ public function isMalAutoRepairPlugins() {
115
+ return $this->isOpt( 'mal_autorepair_plugins', 'Y' );
116
+ }
117
+
118
+ /**
119
+ * @return bool
120
+ */
121
+ public function isMalAutoRepair() {
122
+ return $this->isMalAutoRepairCore() || $this->isMalAutoRepairPlugins() || $this->isMalAutoRepairSurgical();
123
+ }
124
+
125
+ /**
126
+ * @return bool
127
+ */
128
+ public function isMalAutoRepairCore() {
129
+ return $this->isOpt( 'mal_autorepair_core', 'Y' );
130
+ }
131
+
132
+ /**
133
+ * @return bool
134
+ */
135
+ public function isMalAutoRepairSurgical() {
136
+ return $this->isOpt( 'mal_autorepair_surgical', 'Y' );
137
+ }
138
+
139
+ /**
140
+ * @return bool
141
+ */
142
+ public function isMalScanEnabled() {
143
+ return !$this->isOpt( 'mal_scan_enable', 'disabled' );
144
+ }
145
+
146
+ /**
147
+ * @return bool
148
+ */
149
+ public function isMalUseNetworkIntelligence() {
150
+ return $this->getMalConfidenceBoundary() > 0;
151
+ }
152
+
153
  /**
154
  * @return string[]
155
  */
src/lib/src/Modules/HackGuard/Scan/Queue/Build/QueueBuilder.php CHANGED
@@ -18,7 +18,7 @@ class QueueBuilder extends Utilities\BackgroundProcessing\BackgroundProcess {
18
  */
19
  protected function get_batch() {
20
  /** @var HackGuard\Options $oOpts */
21
- $oOpts = $this->getMod()->getOptions();
22
  $aScans = $oOpts->getScansToBuild();
23
  $sScan = key( $aScans );
24
 
@@ -38,7 +38,7 @@ class QueueBuilder extends Utilities\BackgroundProcessing\BackgroundProcess {
38
  // ensure any scheduled scans have been saved before remote post
39
  $this->save();
40
  // Perform remote post.
41
- return parent::dispatch();
42
  }
43
 
44
  /**
@@ -88,7 +88,7 @@ class QueueBuilder extends Utilities\BackgroundProcessing\BackgroundProcess {
88
  */
89
  public function delete( $sScanSlug ) {
90
  /** @var HackGuard\Options $oOpts */
91
- $oOpts = $this->getMod()->getOptions();
92
  $oOpts->addRemoveScanToBuild( $sScanSlug, false );
93
  $this->save();
94
  return $this;
@@ -101,7 +101,7 @@ class QueueBuilder extends Utilities\BackgroundProcessing\BackgroundProcess {
101
  */
102
  protected function is_queue_empty() {
103
  /** @var HackGuard\Options $oOpts */
104
- $oOpts = $this->getMod()->getOptions();
105
  return count( $oOpts->getScansToBuild() ) === 0;
106
  }
107
 
18
  */
19
  protected function get_batch() {
20
  /** @var HackGuard\Options $oOpts */
21
+ $oOpts = $this->getOptions();
22
  $aScans = $oOpts->getScansToBuild();
23
  $sScan = key( $aScans );
24
 
38
  // ensure any scheduled scans have been saved before remote post
39
  $this->save();
40
  // Perform remote post.
41
+ parent::dispatch();
42
  }
43
 
44
  /**
88
  */
89
  public function delete( $sScanSlug ) {
90
  /** @var HackGuard\Options $oOpts */
91
+ $oOpts = $this->getOptions();
92
  $oOpts->addRemoveScanToBuild( $sScanSlug, false );
93
  $this->save();
94
  return $this;
101
  */
102
  protected function is_queue_empty() {
103
  /** @var HackGuard\Options $oOpts */
104
+ $oOpts = $this->getOptions();
105
  return count( $oOpts->getScansToBuild() ) === 0;
106
  }
107
 
src/lib/src/Modules/HackGuard/Scan/Queue/CompleteQueue.php CHANGED
@@ -26,8 +26,7 @@ class CompleteQueue {
26
  $oDbH = $this->getDbHandler();
27
  $oSel = $oDbH->getQuerySelector();
28
 
29
- /** @var Databases\Scanner\Handler $oDbH */
30
- $oDbHResults = $oMod->getDbHandler();
31
  $aScansToNotify = [];
32
  foreach ( $oSel->getDistinctForColumn( 'scan' ) as $sScanSlug ) {
33
 
26
  $oDbH = $this->getDbHandler();
27
  $oSel = $oDbH->getQuerySelector();
28
 
29
+ $oDbHResults = $oMod->getDbHandler_ScanResults();
 
30
  $aScansToNotify = [];
31
  foreach ( $oSel->getDistinctForColumn( 'scan' ) as $sScanSlug ) {
32
 
src/lib/src/Modules/HackGuard/Scan/Queue/Controller.php CHANGED
@@ -87,7 +87,7 @@ class Controller {
87
  */
88
  public function hasRunningScans() {
89
  /** @var HackGuard\Options $oOpts */
90
- $oOpts = $this->getMod()->getOptions();
91
  return count( $this->getRunningScans() ) > 0 || count( $oOpts->getScansToBuild() ) > 0;
92
  }
93
 
@@ -100,7 +100,7 @@ class Controller {
100
  }
101
  if ( !empty( $aScanSlugs ) ) {
102
  /** @var HackGuard\Options $oOpts */
103
- $oOpts = $this->getMod()->getOptions();
104
  foreach ( $aScanSlugs as $sSlug ) {
105
  $oOpts->addRemoveScanToBuild( $sSlug );
106
  }
87
  */
88
  public function hasRunningScans() {
89
  /** @var HackGuard\Options $oOpts */
90
+ $oOpts = $this->getOptions();
91
  return count( $this->getRunningScans() ) > 0 || count( $oOpts->getScansToBuild() ) > 0;
92
  }
93
 
100
  }
101
  if ( !empty( $aScanSlugs ) ) {
102
  /** @var HackGuard\Options $oOpts */
103
+ $oOpts = $this->getOptions();
104
  foreach ( $aScanSlugs as $sSlug ) {
105
  $oOpts->addRemoveScanToBuild( $sSlug );
106
  }
src/lib/src/Modules/HackGuard/Scan/Queue/QueueProcessor.php CHANGED
@@ -111,16 +111,17 @@ class QueueProcessor extends Utilities\BackgroundProcessing\BackgroundProcess {
111
  */
112
  public function save() {
113
 
114
- if ( !empty( $this->data ) ) {
115
  /** @var ScanQueue\Insert $oInsert */
116
  $oInsert = $this->getDbHandler()->getQueryInserter();
117
- foreach ( $this->data as $oEntry ) {
118
  if ( $oEntry instanceof ScanQueue\EntryVO ) {
119
  $oInsert->insert( $oEntry );
120
  }
121
  }
122
  }
123
 
 
124
  return $this;
125
  }
126
 
111
  */
112
  public function save() {
113
 
114
+ if ( is_array( $this->data ) ) {
115
  /** @var ScanQueue\Insert $oInsert */
116
  $oInsert = $this->getDbHandler()->getQueryInserter();
117
+ foreach ( $this->data as $nKey => $oEntry ) {
118
  if ( $oEntry instanceof ScanQueue\EntryVO ) {
119
  $oInsert->insert( $oEntry );
120
  }
121
  }
122
  }
123
 
124
+ $this->data = []; // critical to preventing duplicate entries
125
  return $this;
126
  }
127
 
src/lib/src/Modules/HackGuard/Scan/Queue/ScanInitiate.php CHANGED
@@ -32,10 +32,9 @@ class ScanInitiate {
32
  ->setMod( $oMod )
33
  ->build( $sSlug );
34
 
35
- $oQ = $this->getQueueProcessor();
36
  ( new ScanEnqueue() )
37
  ->setDbHandler( $oDbH )
38
- ->setQueueProcessor( $oQ )
39
  ->setScanActionVO( $oAction )
40
  ->enqueue();
41
  }
32
  ->setMod( $oMod )
33
  ->build( $sSlug );
34
 
 
35
  ( new ScanEnqueue() )
36
  ->setDbHandler( $oDbH )
37
+ ->setQueueProcessor( $this->getQueueProcessor() )
38
  ->setScanActionVO( $oAction )
39
  ->enqueue();
40
  }
src/lib/src/Modules/HackGuard/Strings.php CHANGED
@@ -326,7 +326,7 @@ class Strings extends Base\Strings {
326
  case 'mal_scan_enable' :
327
  $sName = __( 'Automatic Malware Scan', 'wp-simple-firewall' );
328
  $sSummary = __( 'Turn On Automatic Malware Scanning', 'wp-simple-firewall' );
329
- $sDescription = __( "Automatically run scanner to detect files infected with malware signatures.", 'wp-simple-firewall' );
330
  break;
331
 
332
  case 'mal_autorepair_core' :
@@ -343,6 +343,23 @@ class Strings extends Base\Strings {
343
  .'<br />'.sprintf( '%s: %s', __( 'Important', 'wp-simple-firewall' ), __( "Also deletes suspected files if they weren't originally distributed with the plugin.", 'wp-simple-firewall' ) );
344
  break;
345
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
346
  case 'mal_autorepair_surgical' :
347
  $sName = __( 'Surgical Auto-Repair', 'wp-simple-firewall' );
348
  $sSummary = __( 'Automatically Attempt To Surgically Remove Malware Code', 'wp-simple-firewall' );
326
  case 'mal_scan_enable' :
327
  $sName = __( 'Automatic Malware Scan', 'wp-simple-firewall' );
328
  $sSummary = __( 'Turn On Automatic Malware Scanning', 'wp-simple-firewall' );
329
+ $sDescription = __( 'Automatically run scanner to detect files infected with malware signatures.', 'wp-simple-firewall' );
330
  break;
331
 
332
  case 'mal_autorepair_core' :
343
  .'<br />'.sprintf( '%s: %s', __( 'Important', 'wp-simple-firewall' ), __( "Also deletes suspected files if they weren't originally distributed with the plugin.", 'wp-simple-firewall' ) );
344
  break;
345
 
346
+ case 'mal_fp_confidence' :
347
+ $sName = __( 'Ignore False Positives Threshold', 'wp-simple-firewall' );
348
+ $sSummary = __( 'Ignore False Positives In Scan Results Automatically', 'wp-simple-firewall' );
349
+ $sDescription = __( "You can choose to ignore files with potential malware, depending on whether the confidence that it's a 'false positive' meets your minimum threshold.", 'wp-simple-firewall' )
350
+ .'<br />'.__( "A false positive happens when a file appears to contain malware and shows up in scan results, but it's actually clean.", 'wp-simple-firewall' )
351
+ .' ('.__( "A false positive is similar to when an anti-virus alerts to a file that doesnt have a virus.", 'wp-simple-firewall' ).')'
352
+ .'<br />'.__( "The higher the confidence level, the more likely a result is a false positive.", 'wp-simple-firewall' )
353
+ .' '.__( "A low level means it's less likely to be a false positive.", 'wp-simple-firewall' )
354
+ .'<br />'.__( "The scan will automatically ignore results whose 'false positive' confidence level is greater than your chosen threshold.", 'wp-simple-firewall' )
355
+ .'<br />'.__( "The higher the confidence threshold you select, the more likely that 'false positives' will appears in your scan results.", 'wp-simple-firewall' )
356
+ .'<br />'.__( "Disabling network intelligence turns off 'false positive confidence' levels.", 'wp-simple-firewall' )
357
+ .' '.__( 'You will no longer benefit from the intelligence gathered from the entire network.', 'wp-simple-firewall' )
358
+ .' '.__( 'All data shared is completely anonymous.', 'wp-simple-firewall' )
359
+ .' '.' [<a href="https://icwp.io/moreinfochecksum">'.__( 'More Info', 'wp-simple-firewall' ).'</a>]'
360
+ .'<br />'.__( 'The more sites that share this information, the stronger and smarter the network becomes.', 'wp-simple-firewall' );
361
+ break;
362
+
363
  case 'mal_autorepair_surgical' :
364
  $sName = __( 'Surgical Auto-Repair', 'wp-simple-firewall' );
365
  $sSummary = __( 'Automatically Attempt To Surgically Remove Malware Code', 'wp-simple-firewall' );
src/lib/src/Modules/IPs/AjaxHandler.php CHANGED
@@ -39,6 +39,8 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
39
  private function ajaxExec_AddIp() {
40
  /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
41
  $oMod = $this->getMod();
 
 
42
  /** @var \ICWP_WPSF_Processor_Ips $oProcessor */
43
  $oProcessor = $oMod->getProcessor();
44
  $oIpServ = Services::IP();
@@ -48,7 +50,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
48
  $bSuccess = false;
49
  $sMessage = __( "IP address wasn't added to the list", 'wp-simple-firewall' );
50
 
51
- $sIp = preg_replace( '#[^/:\.a-f\d]#i', '', ( isset( $aFormParams[ 'ip' ] ) ? $aFormParams[ 'ip' ] : '' ) );
52
  $sList = isset( $aFormParams[ 'list' ] ) ? $aFormParams[ 'list' ] : '';
53
 
54
  $bAcceptableIp = $oIpServ->isValidIp( $sIp ) || $oIpServ->isValidIp4Range( $sIp );
@@ -89,8 +91,8 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
89
  $oIp = $oProcessor->addIpToBlackList( $sIp, $sLabel );
90
  if ( !empty( $oIp ) ) {
91
  /** @var Shield\Databases\IPs\Update $oUpd */
92
- $oUpd = $oMod->getDbHandler()->getQueryUpdater();
93
- $oUpd->updateTransgressions( $oIp, $oMod->getOptTransgressionLimit() );
94
  }
95
  break;
96
 
@@ -115,13 +117,15 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
115
  * @return array
116
  */
117
  private function ajaxExec_IpDelete() {
 
 
118
  $bSuccess = false;
119
  $nId = Services::Request()->post( 'rid', -1 );
120
 
121
  if ( !is_numeric( $nId ) || $nId < 0 ) {
122
  $sMessage = __( 'Invalid entry selected', 'wp-simple-firewall' );
123
  }
124
- else if ( $this->getMod()->getDbHandler()->getQueryDeleter()->deleteById( $nId ) ) {
125
  $sMessage = __( 'IP address deleted', 'wp-simple-firewall' );
126
  $bSuccess = true;
127
  }
@@ -142,8 +146,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
142
  /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
143
  $oMod = $this->getMod();
144
 
145
- /** @var Shield\Databases\IPs\Handler $oDbH */
146
- $oDbH = $oMod->getDbHandler();
147
  $oDbH->autoCleanDb();
148
 
149
  $oTableBuilder = ( new Shield\Tables\Build\Ip() )
39
  private function ajaxExec_AddIp() {
40
  /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
41
  $oMod = $this->getMod();
42
+ /** @var Options $oOpts */
43
+ $oOpts = $this->getOptions();
44
  /** @var \ICWP_WPSF_Processor_Ips $oProcessor */
45
  $oProcessor = $oMod->getProcessor();
46
  $oIpServ = Services::IP();
50
  $bSuccess = false;
51
  $sMessage = __( "IP address wasn't added to the list", 'wp-simple-firewall' );
52
 
53
+ $sIp = preg_replace( '#[^/:.a-f\d]#i', '', ( isset( $aFormParams[ 'ip' ] ) ? $aFormParams[ 'ip' ] : '' ) );
54
  $sList = isset( $aFormParams[ 'list' ] ) ? $aFormParams[ 'list' ] : '';
55
 
56
  $bAcceptableIp = $oIpServ->isValidIp( $sIp ) || $oIpServ->isValidIp4Range( $sIp );
91
  $oIp = $oProcessor->addIpToBlackList( $sIp, $sLabel );
92
  if ( !empty( $oIp ) ) {
93
  /** @var Shield\Databases\IPs\Update $oUpd */
94
+ $oUpd = $oMod->getDbHandler_IPs()->getQueryUpdater();
95
+ $oUpd->updateTransgressions( $oIp, $oOpts->getOffenseLimit() );
96
  }
97
  break;
98
 
117
  * @return array
118
  */
119
  private function ajaxExec_IpDelete() {
120
+ /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
121
+ $oMod = $this->getMod();
122
  $bSuccess = false;
123
  $nId = Services::Request()->post( 'rid', -1 );
124
 
125
  if ( !is_numeric( $nId ) || $nId < 0 ) {
126
  $sMessage = __( 'Invalid entry selected', 'wp-simple-firewall' );
127
  }
128
+ else if ( $oMod->getDbHandler_IPs()->getQueryDeleter()->deleteById( $nId ) ) {
129
  $sMessage = __( 'IP address deleted', 'wp-simple-firewall' );
130
  $bSuccess = true;
131
  }
146
  /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
147
  $oMod = $this->getMod();
148
 
149
+ $oDbH = $oMod->getDbHandler_IPs();
 
150
  $oDbH->autoCleanDb();
151
 
152
  $oTableBuilder = ( new Shield\Tables\Build\Ip() )
src/lib/src/Modules/IPs/BotTrack/Base.php CHANGED
@@ -3,6 +3,7 @@
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\IPs\BotTrack;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield;
 
6
  use FernleafSystems\Wordpress\Services\Services;
7
 
8
  abstract class Base {
@@ -15,14 +16,14 @@ abstract class Base {
15
  }
16
 
17
  protected function doTransgression() {
18
- /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
19
- $oMod = $this->getMod();
20
 
21
- if ( $oMod->isTrackOptImmediateBlock( static::OPT_KEY ) ) {
22
  $bCount = PHP_INT_MAX;
23
  }
24
- else if ( $oMod->isTrackOptTransgression( static::OPT_KEY ) ) {
25
- $bCount = $oMod->isTrackOptDoubleTransgression( static::OPT_KEY ) ? 2 : 1;
26
  }
27
  else {
28
  $bCount = 0;
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\IPs\BotTrack;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\IPs;
7
  use FernleafSystems\Wordpress\Services\Services;
8
 
9
  abstract class Base {
16
  }
17
 
18
  protected function doTransgression() {
19
+ /** @var IPs\Options $oOpts */
20
+ $oOpts = $this->getOptions();
21
 
22
+ if ( $oOpts->isTrackOptImmediateBlock( static::OPT_KEY ) ) {
23
  $bCount = PHP_INT_MAX;
24
  }
25
+ else if ( $oOpts->isTrackOptTransgression( static::OPT_KEY ) ) {
26
+ $bCount = $oOpts->isTrackOptDoubleTransgression( static::OPT_KEY ) ? 2 : 1;
27
  }
28
  else {
29
  $bCount = 0;
src/lib/src/Modules/IPs/Components/UnblockIpByFlag.php CHANGED
@@ -22,7 +22,7 @@ class UnblockIpByFlag {
22
 
23
  $aLines = array_map( 'trim', explode( "\n", $sContent ) );
24
  /** @var Shield\Databases\IPs\Handler $oDbH */
25
- $oDbH = $oMod->getDbHandler();
26
  $oIP = Services::IP();
27
 
28
  /** @var Shield\Databases\IPs\Delete $oDel */
22
 
23
  $aLines = array_map( 'trim', explode( "\n", $sContent ) );
24
  /** @var Shield\Databases\IPs\Handler $oDbH */
25
+ $oDbH = $oMod->getDbHandler_IPs();
26
  $oIP = Services::IP();
27
 
28
  /** @var Shield\Databases\IPs\Delete $oDel */
src/lib/src/Modules/IPs/Options.php CHANGED
@@ -111,7 +111,6 @@ class Options extends Base\ShieldOptions {
111
  /**
112
  * @param string $sOptionKey
113
  * @return bool
114
- * @deprecated 8.1
115
  */
116
  public function isTrackOptTransgression( $sOptionKey ) {
117
  return strpos( $this->getOpt( $sOptionKey ), 'transgression' ) !== false;
111
  /**
112
  * @param string $sOptionKey
113
  * @return bool
 
114
  */
115
  public function isTrackOptTransgression( $sOptionKey ) {
116
  return strpos( $this->getOpt( $sOptionKey ), 'transgression' ) !== false;
src/lib/src/Modules/Insights/Strings.php CHANGED
@@ -67,7 +67,10 @@ class Strings extends Base\Strings {
67
  'not_available' => __( 'Sorry, this feature is included with Pro subscriptions.', 'wp-simple-firewall' ),
68
  'not_enabled' => __( "This feature isn't currently enabled.", 'wp-simple-firewall' ),
69
  'please_upgrade' => __( 'You can get this feature (along with loads more) by going Pro.', 'wp-simple-firewall' ),
70
- 'please_enable' => __( 'Please turn on this feature in the options.', 'wp-simple-firewall' )
 
 
 
71
  ];
72
  }
73
  }
67
  'not_available' => __( 'Sorry, this feature is included with Pro subscriptions.', 'wp-simple-firewall' ),
68
  'not_enabled' => __( "This feature isn't currently enabled.", 'wp-simple-firewall' ),
69
  'please_upgrade' => __( 'You can get this feature (along with loads more) by going Pro.', 'wp-simple-firewall' ),
70
+ 'please_enable' => __( 'Please turn on this feature in the options.', 'wp-simple-firewall' ),
71
+ 'no_security_notices' => __( 'There are no important security notices at this time.', 'wp-simple-firewall' ),
72
+ 'this_is_wonderful' => __( 'This is wonderful!', 'wp-simple-firewall' ),
73
+ 'yyyymmdd' => __( 'YYYY-MM-DD', 'wp-simple-firewall' ),
74
  ];
75
  }
76
  }
src/lib/src/Modules/LoginGuard/Lib/CooldownFlagFile.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\LoginGuard\Lib;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules;
6
+ use FernleafSystems\Wordpress\Services\Services;
7
+
8
+ /**
9
+ * Class CooldownFlagFile
10
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Modules\LoginGuard\Lib
11
+ */
12
+ class CooldownFlagFile {
13
+
14
+ use Modules\ModConsumer;
15
+
16
+ /**
17
+ * @return bool
18
+ */
19
+ public function isWithinCooldownPeriod() {
20
+ return $this->getCooldownRemaining() > 0;
21
+ }
22
+
23
+ /**
24
+ * @return int
25
+ */
26
+ public function getCooldownRemaining() {
27
+ /** @var Modules\LoginGuard\Options $oOpts */
28
+ $oOpts = $this->getOptions();
29
+ return max( 0, $oOpts->getCooldownInterval() - $this->getSecondsSinceLastLogin() );
30
+ }
31
+
32
+ /**
33
+ * @return string
34
+ */
35
+ public function getFlagFilePath() {
36
+ return path_join( $this->getCon()->getRootDir(), 'mode.login_throttled' );
37
+ }
38
+
39
+ /**
40
+ * @return int
41
+ */
42
+ public function getSecondsSinceLastLogin() {
43
+ $oFS = Services::WpFs();
44
+ $sFile = $this->getFlagFilePath();
45
+ $nLastLogin = $oFS->exists( $sFile ) ? $oFS->getModifiedTime( $sFile ) : 0;
46
+ return ( Services::Request()->ts() - $nLastLogin );
47
+ }
48
+
49
+ /**
50
+ * @return $this
51
+ */
52
+ public function updateCooldownFlag() {
53
+ $oFS = Services::WpFs();
54
+ $sFile = $this->getFlagFilePath();
55
+ $oFS->deleteFile( $sFile );
56
+ $oFS->touch( $sFile, Services::Request()->ts() );
57
+ return $this;
58
+ }
59
+ }
src/lib/src/Modules/LoginGuard/Lib/CooldownRedirect.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\LoginGuard\Lib;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\LoginGuard;
7
+ use FernleafSystems\Wordpress\Services\Services;
8
+
9
+ /**
10
+ * Class CooldownRedirect
11
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Modules\LoginGuard
12
+ */
13
+ class CooldownRedirect {
14
+
15
+ use Modules\ModConsumer;
16
+
17
+ public function run() {
18
+ add_action( 'wp_loaded', [ $this, 'onWpLoaded' ] );
19
+ }
20
+
21
+ public function onWpLoaded() {
22
+ $oReq = Services::Request();
23
+ $oCooldownFile = ( new LoginGuard\Lib\CooldownFlagFile() )->setMod( $this->getMod() );
24
+ if ( !$oReq->isPost() && Services::WpGeneral()->isLoginUrl()
25
+ && $oCooldownFile->isWithinCooldownPeriod()
26
+ && !Services::WpUsers()->isUserLoggedIn()
27
+ && $oReq->query( 'cooldown_bypass' ) != 1 ) {
28
+ $this->renderCooldownPage();
29
+ }
30
+ }
31
+
32
+ private function renderCooldownPage() {
33
+ /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
34
+ $oMod = $this->getMod();
35
+ $nTimeRemaining = ( new LoginGuard\Lib\CooldownFlagFile() )
36
+ ->setMod( $oMod )
37
+ ->getCooldownRemaining();
38
+ $aData = [
39
+ 'strings' => [
40
+ 'title' => __( "The login page is protected against too many login attempts.", 'wp-simple-firewall' ),
41
+ 'lines' => [
42
+ __( 'If you attempt to login again too quickly you may be blocked from accessing this site entirely.', 'wp-simple-firewall' ),
43
+ __( 'If you share this website with others, you may also block their access to the site.', 'wp-simple-firewall' ),
44
+ __( 'To ignore this message and return to the login page, please check the box and click continue.', 'wp-simple-firewall' ),
45
+ ],
46
+ 'understand' => __( 'I understand I may block my access to the site.', 'wp-simple-firewall' ),
47
+ 'time_remaining' => __( 'Seconds remaining', 'wp-simple-firewall' ),
48
+ 'button' => __( 'Proceed To Login Page', 'wp-simple-firewall' ),
49
+ ],
50
+ 'vars' => [
51
+ 'remaining' => $nTimeRemaining,
52
+ 'login_url' => Services::WpGeneral()->getLoginUrl(),
53
+ ],
54
+ 'flags' => [
55
+ ],
56
+ ];
57
+ Services::WpGeneral()
58
+ ->wpDie(
59
+ $oMod->renderTemplate( '/snippets/cooldown_login_block.twig', $aData, true )
60
+ );
61
+ }
62
+ }
src/lib/src/Modules/LoginGuard/Options.php CHANGED
@@ -4,5 +4,23 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\LoginGuard;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
6
 
 
 
 
 
7
  class Options extends Base\ShieldOptions {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  }
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
6
 
7
+ /**
8
+ * Class Options
9
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Modules\LoginGuard
10
+ */
11
  class Options extends Base\ShieldOptions {
12
+
13
+ /**
14
+ * @return bool
15
+ */
16
+ public function isCooldownEnabled() {
17
+ return $this->getCooldownInterval() > 0;
18
+ }
19
+
20
+ /**
21
+ * @return int
22
+ */
23
+ public function getCooldownInterval() {
24
+ return (int)$this->getOpt( 'login_limit_interval' );
25
+ }
26
  }
src/lib/src/Modules/Plugin/AdminNotices.php CHANGED
@@ -70,9 +70,9 @@ class AdminNotices extends Shield\Modules\Base\AdminNotices {
70
  * @return array
71
  */
72
  private function ajaxExec_SetPluginTrackingPerm() {
73
- /** @var \ICWP_WPSF_FeatureHandler_Plugin $oMod */
74
- $oMod = $this->getMod();
75
- $oMod->setPluginTrackingPermission( (bool)Services::Request()->query( 'agree', false ) );
76
  return $this->ajaxExec_DismissAdminNotice();
77
  }
78
 
@@ -103,7 +103,7 @@ class AdminNotices extends Shield\Modules\Base\AdminNotices {
103
  * @param Shield\Utilities\AdminNotices\NoticeVO $oNotice
104
  */
105
  private function buildNotice_PluginMailingListSignup( $oNotice ) {
106
- $oOpts = $this->getMod()->getOptions();
107
 
108
  $sName = $this->getCon()->getHumanName();
109
  $oUser = Services::WpUsers()->getCurrentWpUser();
70
  * @return array
71
  */
72
  private function ajaxExec_SetPluginTrackingPerm() {
73
+ /** @var Options $oOpts */
74
+ $oOpts = $this->getOptions();
75
+ $oOpts->setPluginTrackingPermission( (bool)Services::Request()->query( 'agree', false ) );
76
  return $this->ajaxExec_DismissAdminNotice();
77
  }
78
 
103
  * @param Shield\Utilities\AdminNotices\NoticeVO $oNotice
104
  */
105
  private function buildNotice_PluginMailingListSignup( $oNotice ) {
106
+ $oOpts = $this->getOptions();
107
 
108
  $sName = $this->getCon()->getHumanName();
109
  $oUser = Services::WpUsers()->getCurrentWpUser();
src/lib/src/Modules/Plugin/AjaxHandler.php CHANGED
@@ -104,7 +104,9 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
104
  * @return array
105
  */
106
  private function ajaxExec_SetPluginTrackingPerm() {
107
- $this->setPluginTrackingPermission( (bool)Services::Request()->query( 'agree', false ) );
 
 
108
  return [ 'success' => true ];
109
  }
110
 
104
  * @return array
105
  */
106
  private function ajaxExec_SetPluginTrackingPerm() {
107
+ /** @var Options $oOpts */
108
+ $oOpts = $this->getOptions();
109
+ $oOpts->setPluginTrackingPermission( (bool)Services::Request()->query( 'agree', false ) );
110
  return [ 'success' => true ];
111
  }
112
 
src/lib/src/Modules/Plugin/Options.php CHANGED
@@ -57,4 +57,13 @@ class Options extends Base\ShieldOptions {
57
  public function isOnFloatingPluginBadge() {
58
  return $this->isOpt( 'display_plugin_badge', 'Y' );
59
  }
 
 
 
 
 
 
 
 
 
60
  }
57
  public function isOnFloatingPluginBadge() {
58
  return $this->isOpt( 'display_plugin_badge', 'Y' );
59
  }
60
+
61
+ /**
62
+ * @param bool $bOnOrOff
63
+ * @return $this
64
+ */
65
+ public function setPluginTrackingPermission( $bOnOrOff = true ) {
66
+ return $this->setOpt( 'enable_tracking', $bOnOrOff ? 'Y' : 'N' )
67
+ ->setOpt( 'tracking_permission_set_at', Services::Request()->ts() );
68
+ }
69
  }
src/lib/src/Modules/Plugin/Strings.php CHANGED
@@ -44,6 +44,9 @@ class Strings extends Base\Strings {
44
  'master_url_set' => [
45
  __( 'Master Site URL set: %s', 'wp-simple-firewall' ),
46
  ],
 
 
 
47
  ];
48
  }
49
 
@@ -432,5 +435,11 @@ class Strings extends Base\Strings {
432
  __( 'Once', 'wp-simple-firewall' );
433
  __( 'Twice', 'wp-simple-firewall' );
434
  __( 'Go To Security Dashboard', 'wp-simple-firewall' );
 
 
 
 
 
 
435
  }
436
  }
44
  'master_url_set' => [
45
  __( 'Master Site URL set: %s', 'wp-simple-firewall' ),
46
  ],
47
+ 'recaptcha_fail' => [
48
+ __( 'Google reCAPTCHA Test Fail', 'wp-simple-firewall' )
49
+ ],
50
  ];
51
  }
52
 
435
  __( 'Once', 'wp-simple-firewall' );
436
  __( 'Twice', 'wp-simple-firewall' );
437
  __( 'Go To Security Dashboard', 'wp-simple-firewall' );
438
+
439
+ __( 'None - Turn Off Malware Intelligence Network', 'wp-simple-firewall' );
440
+ __( 'Low', 'wp-simple-firewall' );
441
+ __( 'Medium', 'wp-simple-firewall' );
442
+ __( 'High', 'wp-simple-firewall' );
443
+ __( 'Full', 'wp-simple-firewall' );
444
  }
445
  }
src/lib/src/Modules/Traffic/AjaxHandler.php CHANGED
@@ -35,7 +35,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
35
  'success' => true,
36
  'html' => ( new Shield\Tables\Build\Traffic() )
37
  ->setMod( $oMod )
38
- ->setDbHandler( $oMod->getDbHandler() )
39
  ->buildTable()
40
  ];
41
  }
35
  'success' => true,
36
  'html' => ( new Shield\Tables\Build\Traffic() )
37
  ->setMod( $oMod )
38
+ ->setDbHandler( $oMod->getDbHandler_Traffic() )
39
  ->buildTable()
40
  ];
41
  }
src/lib/src/Modules/Traffic/Limiter/TestIp.php CHANGED
@@ -25,7 +25,7 @@ class TestIp {
25
  /** @var Shield\Modules\Traffic\Options $oOpts */
26
  $oOpts = $oMod->getOptions();
27
  /** @var Traffic\Select $oSel */
28
- $oSel = $oMod->getDbHandler()->getQuerySelector();
29
 
30
  $oNow = Services::Request()->carbon();
31
 
25
  /** @var Shield\Modules\Traffic\Options $oOpts */
26
  $oOpts = $oMod->getOptions();
27
  /** @var Traffic\Select $oSel */
28
+ $oSel = $oMod->getDbHandler_Traffic()->getQuerySelector();
29
 
30
  $oNow = Services::Request()->carbon();
31
 
src/lib/src/Scans/Apc/ResultItem.php CHANGED
@@ -13,5 +13,4 @@ use FernleafSystems\Wordpress\Plugin\Shield\Scans\Base;
13
  */
14
  class ResultItem extends Base\BaseResultItem {
15
 
16
- const SCAN_RESULT_TYPE = 'apc';
17
  }
13
  */
14
  class ResultItem extends Base\BaseResultItem {
15
 
 
16
  }
src/lib/src/Scans/Base/BaseRepair.php CHANGED
@@ -8,6 +8,27 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Scans\Base;
8
  */
9
  abstract class BaseRepair {
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  /**
12
  * @param BaseResultsSet $oResults
13
  */
8
  */
9
  abstract class BaseRepair {
10
 
11
+ /**
12
+ * @var bool
13
+ */
14
+ private $bIsManualAction = false;
15
+
16
+ /**
17
+ * @return bool
18
+ */
19
+ public function isManualAction() {
20
+ return (bool)$this->bIsManualAction;
21
+ }
22
+
23
+ /**
24
+ * @param bool $bManual
25
+ * @return $this
26
+ */
27
+ public function setIsManualAction( $bManual ) {
28
+ $this->bIsManualAction = $bManual;
29
+ return $this;
30
+ }
31
+
32
  /**
33
  * @param BaseResultsSet $oResults
34
  */
src/lib/src/Scans/Base/Files/BaseFileScanner.php CHANGED
@@ -10,7 +10,8 @@ use FernleafSystems\Wordpress\Plugin\Shield;
10
  */
11
  abstract class BaseFileScanner {
12
 
13
- use Shield\Scans\Common\ScanActionConsumer;
 
14
 
15
  /**
16
  * @param string $sFullPath
10
  */
11
  abstract class BaseFileScanner {
12
 
13
+ use Shield\Scans\Common\ScanActionConsumer,
14
+ Shield\Modules\ModConsumer;
15
 
16
  /**
17
  * @param string $sFullPath
src/lib/src/Scans/Base/Files/BaseScanFromFileMap.php CHANGED
@@ -2,15 +2,17 @@
2
 
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Scans\Base\Files;
4
 
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Scans;
6
 
7
  /**
8
  * Class BaseScanFromFileMap
9
- * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Wcf
10
  */
11
  abstract class BaseScanFromFileMap {
12
 
13
- use Scans\Common\ScanActionConsumer;
 
14
 
15
  /**
16
  * @return Scans\Base\BaseResultsSet
2
 
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Scans\Base\Files;
4
 
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
6
  use FernleafSystems\Wordpress\Plugin\Shield\Scans;
7
 
8
  /**
9
  * Class BaseScanFromFileMap
10
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Base\Files
11
  */
12
  abstract class BaseScanFromFileMap {
13
 
14
+ use Scans\Common\ScanActionConsumer,
15
+ ModConsumer;
16
 
17
  /**
18
  * @return Scans\Base\BaseResultsSet
src/lib/src/Scans/Mal/BuildFileMap.php CHANGED
@@ -23,21 +23,23 @@ class BuildFileMap {
23
  /** @var ScanActionVO $oAction */
24
  $oAction = $this->getScanActionVO();
25
 
26
- try {
27
- $oDirIt = StandardDirectoryIterator::create( $oAction->scan_root_dir, 0, $oAction->file_exts, false );
28
- foreach ( $oDirIt as $oFsItem ) {
29
- $sFullPath = wp_normalize_path( $oFsItem->getPathname() );
30
- /** @var \SplFileInfo $oFsItem */
31
- if ( $this->isWhitelistedPath( $sFullPath ) || $oFsItem->getSize() == 0 ) {
32
- continue;
 
 
 
33
  }
34
- $aFiles[] = $sFullPath;
35
  }
36
- }
37
- catch ( \Exception $oE ) {
38
- error_log(
39
- sprintf( 'Shield file scanner attempted to read directory but there was error: "%s".', $oE->getMessage() )
40
- );
41
  }
42
  return $aFiles;
43
  }
@@ -46,8 +48,13 @@ class BuildFileMap {
46
  /** @var ScanActionVO $oAction */
47
  $oAction = $this->getScanActionVO();
48
 
49
- if ( empty( $oAction->scan_root_dir ) ) {
50
- $oAction->scan_root_dir = ABSPATH;
 
 
 
 
 
51
  }
52
  if ( empty( $oAction->file_exts ) ) {
53
  $oAction->file_exts = [ 'php', 'php5' ];
23
  /** @var ScanActionVO $oAction */
24
  $oAction = $this->getScanActionVO();
25
 
26
+ foreach ( $oAction->scan_root_dirs as $sScanDir => $nDepth ) {
27
+ try {
28
+ $oDirIt = StandardDirectoryIterator::create( $sScanDir, (int)$nDepth, $oAction->file_exts, false );
29
+ foreach ( $oDirIt as $oFsItem ) {
30
+ $sFullPath = wp_normalize_path( $oFsItem->getPathname() );
31
+ /** @var \SplFileInfo $oFsItem */
32
+ if ( $this->isWhitelistedPath( $sFullPath ) || $oFsItem->getSize() == 0 ) {
33
+ continue;
34
+ }
35
+ $aFiles[] = $sFullPath;
36
  }
 
37
  }
38
+ catch ( \Exception $oE ) {
39
+ error_log(
40
+ sprintf( 'Shield file scanner attempted to read directory but there was error: "%s".', $oE->getMessage() )
41
+ );
42
+ }
43
  }
44
  return $aFiles;
45
  }
48
  /** @var ScanActionVO $oAction */
49
  $oAction = $this->getScanActionVO();
50
 
51
+ if ( empty( $oAction->scan_root_dirs ) || !is_array( $oAction->scan_root_dirs ) ) {
52
+ $oAction->scan_root_dirs = [
53
+ ABSPATH => 1,
54
+ path_join( ABSPATH, WPINC ) => 0,
55
+ path_join( ABSPATH, 'wp-admin' ) => 0,
56
+ WP_CONTENT_DIR => 0,
57
+ ];
58
  }
59
  if ( empty( $oAction->file_exts ) ) {
60
  $oAction->file_exts = [ 'php', 'php5' ];
src/lib/src/Scans/Mal/BuildScanAction.php CHANGED
@@ -20,12 +20,9 @@ class BuildScanAction extends Shield\Scans\Base\BaseBuildScanAction {
20
  /** @var ScanActionVO $oAction */
21
  $oAction = $this->getScanActionVO();
22
  /** @var Shield\Modules\HackGuard\Options $oOpts */
23
- $oOpts = $this->getMod()->getOptions();
24
 
25
  $oAction->paths_whitelisted = $oOpts->getMalWhitelistPaths();
26
- $oAction->patterns_regex = $oOpts->getMalSignaturesRegex();
27
- $oAction->patterns_simple = $oOpts->getMalSignaturesSimple();
28
  $oAction->file_exts = [ 'php', 'php5', 'php7' ];
29
- $oAction->scan_root_dir = ABSPATH;
30
  }
31
  }
20
  /** @var ScanActionVO $oAction */
21
  $oAction = $this->getScanActionVO();
22
  /** @var Shield\Modules\HackGuard\Options $oOpts */
23
+ $oOpts = $this->getOptions();
24
 
25
  $oAction->paths_whitelisted = $oOpts->getMalWhitelistPaths();
 
 
26
  $oAction->file_exts = [ 'php', 'php5', 'php7' ];
 
27
  }
28
  }
src/lib/src/Scans/Mal/FileScanner.php CHANGED
@@ -6,7 +6,6 @@ use FernleafSystems\Wordpress\Plugin\Shield;
6
  use FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo;
7
  use FernleafSystems\Wordpress\Services\Services;
8
  use FernleafSystems\Wordpress\Services\Utilities;
9
- use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware;
10
 
11
  /**
12
  * Class FileScanner
@@ -14,17 +13,12 @@ use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware;
14
  */
15
  class FileScanner extends Shield\Scans\Base\Files\BaseFileScanner {
16
 
17
- /**
18
- * @var array[]
19
- */
20
- private $aWhitelistHashes;
21
-
22
  /**
23
  * @param string $sFullPath
24
  * @return ResultItem|null
25
  */
26
  public function scan( $sFullPath ) {
27
- $oResultItem = null;
28
 
29
  /** @var ScanActionVO $oAction */
30
  $oAction = $this->getScanActionVO();
@@ -35,11 +29,9 @@ class FileScanner extends Shield\Scans\Base\Files\BaseFileScanner {
35
  { // Simple Patterns first
36
  $oLocator->setIsRegEx( false );
37
  foreach ( $oAction->patterns_simple as $sSig ) {
38
-
39
- $aLines = $oLocator->setNeedle( $sSig )
40
- ->run();
41
- if ( !empty( $aLines ) && !$this->canExcludeFile( $sFullPath ) ) {
42
- return $this->getResultItemFromLines( $aLines, $sFullPath, $sSig );
43
  }
44
  }
45
  }
@@ -47,11 +39,9 @@ class FileScanner extends Shield\Scans\Base\Files\BaseFileScanner {
47
  { // RegEx Patterns
48
  $oLocator->setIsRegEx( true );
49
  foreach ( $oAction->patterns_regex as $sSig ) {
50
-
51
- $aLines = $oLocator->setNeedle( $sSig )
52
- ->run();
53
- if ( !empty( $aLines ) && !$this->canExcludeFile( $sFullPath ) ) {
54
- return $this->getResultItemFromLines( $aLines, $sFullPath, $sSig );
55
  }
56
  }
57
  }
@@ -59,20 +49,34 @@ class FileScanner extends Shield\Scans\Base\Files\BaseFileScanner {
59
  catch ( \Exception $oE ) {
60
  }
61
 
62
- return $oResultItem;
63
  }
64
 
65
  /**
66
- * @return array[]
 
 
67
  */
68
- protected function getWhitelistHashes() {
69
- if ( !is_array( $this->aWhitelistHashes ) ) {
70
- $this->aWhitelistHashes = ( new Malware\WhitelistRetrieve() )->getFiles();
71
- if ( !is_array( $this->aWhitelistHashes ) ) {
72
- $this->aWhitelistHashes = [];
73
- };
 
 
 
 
 
 
 
 
 
 
 
 
74
  }
75
- return $this->aWhitelistHashes;
76
  }
77
 
78
  /**
@@ -87,7 +91,13 @@ class FileScanner extends Shield\Scans\Base\Files\BaseFileScanner {
87
  $oResultItem->path_fragment = str_replace( wp_normalize_path( ABSPATH ), '', $oResultItem->path_full );
88
  $oResultItem->is_mal = true;
89
  $oResultItem->mal_sig = base64_encode( $sSig );
90
- $oResultItem->file_lines = $aLines;
 
 
 
 
 
 
91
  return $oResultItem;
92
  }
93
 
@@ -96,23 +106,35 @@ class FileScanner extends Shield\Scans\Base\Files\BaseFileScanner {
96
  * @return bool
97
  */
98
  private function canExcludeFile( $sFullPath ) {
99
- return $this->isValidCoreFile( $sFullPath ) || $this->isPluginFileValid( $sFullPath )
100
- || $this->isPathWhitelisted( $sFullPath );
 
 
 
 
 
 
 
 
 
101
  }
102
 
103
  /**
104
- * @param string $sFullPath
105
- * @return bool
106
  */
107
- private function isPathWhitelisted( $sFullPath ) {
108
- $bWhitelisted = false;
109
- $aWhitelistHashes = $this->getWhitelistHashes();
110
- if ( isset( $aWhitelistHashes[ basename( $sFullPath ) ] ) ) {
 
 
 
111
  try {
112
  $oHasher = new Utilities\File\Compare\CompareHash();
113
- foreach ( $aWhitelistHashes[ basename( $sFullPath ) ] as $sWlHash ) {
114
- if ( $oHasher->isEqualFileSha1( $sFullPath, $sWlHash ) ) {
115
- $bWhitelisted = true;
116
  break;
117
  }
118
  }
@@ -120,7 +142,7 @@ class FileScanner extends Shield\Scans\Base\Files\BaseFileScanner {
120
  catch ( \InvalidArgumentException $oE ) {
121
  }
122
  }
123
- return $bWhitelisted;
124
  }
125
 
126
  /**
6
  use FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo;
7
  use FernleafSystems\Wordpress\Services\Services;
8
  use FernleafSystems\Wordpress\Services\Utilities;
 
9
 
10
  /**
11
  * Class FileScanner
13
  */
14
  class FileScanner extends Shield\Scans\Base\Files\BaseFileScanner {
15
 
 
 
 
 
 
16
  /**
17
  * @param string $sFullPath
18
  * @return ResultItem|null
19
  */
20
  public function scan( $sFullPath ) {
21
+ $oItem = null;
22
 
23
  /** @var ScanActionVO $oAction */
24
  $oAction = $this->getScanActionVO();
29
  { // Simple Patterns first
30
  $oLocator->setIsRegEx( false );
31
  foreach ( $oAction->patterns_simple as $sSig ) {
32
+ $oItem = $this->scanForSig( $oLocator, $sSig );
33
+ if ( $oItem instanceof ResultItem ) {
34
+ return $oItem;
 
 
35
  }
36
  }
37
  }
39
  { // RegEx Patterns
40
  $oLocator->setIsRegEx( true );
41
  foreach ( $oAction->patterns_regex as $sSig ) {
42
+ $oItem = $this->scanForSig( $oLocator, $sSig );
43
+ if ( $oItem instanceof ResultItem ) {
44
+ return $oItem;
 
 
45
  }
46
  }
47
  }
49
  catch ( \Exception $oE ) {
50
  }
51
 
52
+ return $oItem;
53
  }
54
 
55
  /**
56
+ * @param Utilities\File\LocateStrInFile $oLocator
57
+ * @param string $sSig
58
+ * @return ResultItem|null
59
  */
60
+ private function scanForSig( $oLocator, $sSig ) {
61
+ $oResultItem = null;
62
+
63
+ $aLines = $oLocator->setNeedle( $sSig )
64
+ ->run();
65
+ $sFullPath = $oLocator->getPath();
66
+ if ( !empty( $aLines ) && !$this->canExcludeFile( $sFullPath ) ) {
67
+
68
+ $oMaybeItem = $this->getResultItemFromLines( $aLines, $sFullPath, $sSig );
69
+ $oAction = $this->getScanActionVO();
70
+ // Zero indicates not using intelligence network
71
+ if ( $oAction->confidence_threshold > 0 ) {
72
+ $oMaybeItem->fp_confidence = $this->getFalsePositiveConfidence( $sFullPath );
73
+ }
74
+
75
+ if ( $oAction->confidence_threshold == 0 || $oMaybeItem->fp_confidence < $oAction->confidence_threshold ) {
76
+ $oResultItem = $oMaybeItem;
77
+ }
78
  }
79
+ return $oResultItem;
80
  }
81
 
82
  /**
91
  $oResultItem->path_fragment = str_replace( wp_normalize_path( ABSPATH ), '', $oResultItem->path_full );
92
  $oResultItem->is_mal = true;
93
  $oResultItem->mal_sig = base64_encode( $sSig );
94
+ $oResultItem->fp_confidence = 0;
95
+ $oResultItem->file_lines = array_map(
96
+ function ( $nLineNumber ) {
97
+ return $nLineNumber + 1;
98
+ },
99
+ $aLines // because lines start at ZERO
100
+ );
101
  return $oResultItem;
102
  }
103
 
106
  * @return bool
107
  */
108
  private function canExcludeFile( $sFullPath ) {
109
+ $bExclude = $this->isValidCoreFile( $sFullPath );
110
+
111
+ if ( !$bExclude ) {
112
+ if ( $this->isPluginFileValid( $sFullPath ) ) {
113
+ $bExclude = true;
114
+ ( new Shield\Scans\Mal\Utilities\FalsePositiveReporter() )
115
+ ->setMod( $this->getMod() )
116
+ ->report( $sFullPath, 'sha1', true );
117
+ }
118
+ }
119
+ return $bExclude;
120
  }
121
 
122
  /**
123
+ * @param string $sFilePath
124
+ * @return int
125
  */
126
+ private function getFalsePositiveConfidence( $sFilePath ) {
127
+ /** @var ScanActionVO $oScanVO */
128
+ $oScanVO = $this->getScanActionVO();
129
+
130
+ $nConfidence = 0;
131
+ $sFilePart = basename( $sFilePath );
132
+ if ( isset( $oScanVO->whitelist[ $sFilePart ] ) ) {
133
  try {
134
  $oHasher = new Utilities\File\Compare\CompareHash();
135
+ foreach ( $oScanVO->whitelist[ $sFilePart ] as $sWlHash => $nHashConfidence ) {
136
+ if ( $oHasher->isEqualFileSha1( $sFilePath, $sWlHash ) ) {
137
+ $nConfidence = $nHashConfidence;
138
  break;
139
  }
140
  }
142
  catch ( \InvalidArgumentException $oE ) {
143
  }
144
  }
145
+ return (int)$nConfidence;
146
  }
147
 
148
  /**
src/lib/src/Scans/Mal/Repair.php CHANGED
@@ -14,15 +14,42 @@ class Repair extends Shield\Scans\Base\BaseRepair {
14
 
15
  use Shield\Modules\ModConsumer;
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  /**
18
  * @param ResultItem $oItem
19
  * @return bool
20
  */
21
  public function repairItem( $oItem ) {
22
- /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
23
- $oMod = $this->getMod();
24
  $bSuccess = false;
25
 
 
 
 
 
 
 
26
  try {
27
  $bCanAutoRepair = $this->canAutoRepairFromSource( $oItem );
28
  }
@@ -31,22 +58,26 @@ class Repair extends Shield\Scans\Base\BaseRepair {
31
  }
32
 
33
  if ( $bCanAutoRepair ) {
34
-
35
- if ( $oMod->isMalAutoRepairCore()
36
- && Services\Services::CoreFileHashes()->isCoreFile( $oItem->path_fragment ) ) {
37
  $bSuccess = $this->repairCoreItem( $oItem );
38
  }
39
  else {
40
  $oPlugin = ( new WpOrg\Plugin\Files() )->findPluginFromFile( $oItem->path_full );
41
- if ( $oMod->isMalAutoRepairPlugins()
42
- && $oPlugin instanceof Services\Core\VOs\WpPluginVo && $oPlugin->isWpOrg() ) {
43
- $bSuccess = $this->repairItemInPlugin( $oItem );
 
 
44
  }
45
- else if ( $oMod->isMalAutoRepairSurgical() ) {
46
  $bSuccess = $this->repairSurgicalItem( $oItem );
47
  }
48
  }
49
  }
 
 
 
50
 
51
  return $bSuccess;
52
  }
@@ -55,7 +86,7 @@ class Repair extends Shield\Scans\Base\BaseRepair {
55
  * @param ResultItem $oItem
56
  * @return bool
57
  */
58
- public function repairItemByDelete( $oItem ) {
59
  return Services\Services::WpFs()->deleteFile( $oItem->path_full );
60
  }
61
 
14
 
15
  use Shield\Modules\ModConsumer;
16
 
17
+ /**
18
+ * @var bool
19
+ */
20
+ private $bAllowDelete = false;
21
+
22
+ /**
23
+ * @return bool
24
+ */
25
+ public function isAllowDelete() {
26
+ return (bool)$this->bAllowDelete;
27
+ }
28
+
29
+ /**
30
+ * @param bool $bAllowDelete
31
+ * @return $this
32
+ */
33
+ public function setAllowDelete( $bAllowDelete ) {
34
+ $this->bAllowDelete = $bAllowDelete;
35
+ return $this;
36
+ }
37
+
38
  /**
39
  * @param ResultItem $oItem
40
  * @return bool
41
  */
42
  public function repairItem( $oItem ) {
43
+ /** @var Shield\Modules\HackGuard\Options $oOpts */
44
+ $oOpts = $this->getOptions();
45
  $bSuccess = false;
46
 
47
+ // 1) Report the file as being malware.
48
+ ( new Shield\Scans\Mal\Utilities\FalsePositiveReporter() )
49
+ ->setMod( $this->getMod() )
50
+ ->report( $oItem->path_full, 'sha1', false );
51
+
52
+ // 2). Repair
53
  try {
54
  $bCanAutoRepair = $this->canAutoRepairFromSource( $oItem );
55
  }
58
  }
59
 
60
  if ( $bCanAutoRepair ) {
61
+
62
+ if ( Services\Services::CoreFileHashes()->isCoreFile( $oItem->path_fragment ) ) {
 
63
  $bSuccess = $this->repairCoreItem( $oItem );
64
  }
65
  else {
66
  $oPlugin = ( new WpOrg\Plugin\Files() )->findPluginFromFile( $oItem->path_full );
67
+ if ( $oPlugin instanceof Services\Core\VOs\WpPluginVo && $oPlugin->isWpOrg() ) {
68
+
69
+ if ( $this->isManualAction() || $oOpts->isMalAutoRepairPlugins() ) {
70
+ $bSuccess = $this->repairItemInPlugin( $oItem );
71
+ }
72
  }
73
+ else if ( $oOpts->isMalAutoRepairSurgical() ) {
74
  $bSuccess = $this->repairSurgicalItem( $oItem );
75
  }
76
  }
77
  }
78
+ else if ( $this->isAllowDelete() ) {
79
+ $bSuccess = $this->repairItemByDelete( $oItem );
80
+ }
81
 
82
  return $bSuccess;
83
  }
86
  * @param ResultItem $oItem
87
  * @return bool
88
  */
89
+ private function repairItemByDelete( $oItem ) {
90
  return Services\Services::WpFs()->deleteFile( $oItem->path_full );
91
  }
92
 
src/lib/src/Scans/Mal/ResultItem.php CHANGED
@@ -11,12 +11,11 @@ use FernleafSystems\Wordpress\Plugin\Shield\Scans\Base;
11
  * @property bool $is_mal
12
  * @property string $mal_sig
13
  * @property int[] $file_lines
 
14
  * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal
15
  */
16
  class ResultItem extends Base\BaseResultItem {
17
 
18
- const SCAN_RESULT_TYPE = 'mal';
19
-
20
  /**
21
  * @return string
22
  */
11
  * @property bool $is_mal
12
  * @property string $mal_sig
13
  * @property int[] $file_lines
14
+ * @property int $fp_confidence - false positive confidence level
15
  * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal
16
  */
17
  class ResultItem extends Base\BaseResultItem {
18
 
 
 
19
  /**
20
  * @return string
21
  */
src/lib/src/Scans/Mal/Scan.php CHANGED
@@ -3,13 +3,50 @@
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield;
 
6
 
 
 
 
 
7
  class Scan extends Shield\Scans\Base\Files\BaseFileMapScan {
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  /**
10
  * @return ScanFromFileMap
11
  */
12
  protected function getScanFromFileMap() {
13
- return ( new ScanFromFileMap() )->setScanActionVO( $this->getScanActionVO() );
 
 
14
  }
15
  }
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard;
7
 
8
+ /**
9
+ * Class Scan
10
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal
11
+ */
12
  class Scan extends Shield\Scans\Base\Files\BaseFileMapScan {
13
 
14
+ /**
15
+ * @throws \Exception
16
+ */
17
+ protected function preScan() {
18
+ parent::preScan();
19
+
20
+ /** @var HackGuard\Options $oOpts */
21
+ $oOpts = $this->getOptions();
22
+
23
+ /** @var ScanActionVO $oScanVO */
24
+ $oScanVO = $this->getScanActionVO();
25
+
26
+ if ( $oOpts->isMalUseNetworkIntelligence() ) {
27
+ $oScanVO->whitelist = ( new Utilities\Whitelist() )
28
+ ->setMod( $this->getMod() )
29
+ ->retrieve();
30
+ }
31
+ else {
32
+ $oScanVO->whitelist = [];
33
+ }
34
+
35
+ $oScanVO->confidence_threshold = $oOpts->getMalConfidenceBoundary();
36
+
37
+ $aPatterns = ( new Utilities\Patterns() )
38
+ ->setMod( $this->getMod() )
39
+ ->retrieve();
40
+ $oScanVO->patterns_simple = $aPatterns[ 'simple' ];
41
+ $oScanVO->patterns_regex = $aPatterns[ 'regex' ];
42
+ }
43
+
44
  /**
45
  * @return ScanFromFileMap
46
  */
47
  protected function getScanFromFileMap() {
48
+ return ( new ScanFromFileMap() )
49
+ ->setMod( $this->getMod() )
50
+ ->setScanActionVO( $this->getScanActionVO() );
51
  }
52
  }
src/lib/src/Scans/Mal/ScanActionVO.php CHANGED
@@ -7,11 +7,13 @@ use FernleafSystems\Wordpress\Plugin\Shield\Scans\Base\BaseScanActionVO;
7
  /**
8
  * Class ScanActionVO
9
  * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal
10
- * @property string[] $file_exts
11
- * @property string[] $scan_root_dir
12
- * @property string[] $paths_whitelisted
13
- * @property string[] $patterns_regex
14
- * @property string[] $patterns_simple
 
 
15
  */
16
  class ScanActionVO extends BaseScanActionVO {
17
 
7
  /**
8
  * Class ScanActionVO
9
  * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal
10
+ * @property string[] $file_exts
11
+ * @property string[] $scan_root_dirs
12
+ * @property string[] $paths_whitelisted
13
+ * @property string[] $patterns_regex
14
+ * @property string[] $patterns_simple
15
+ * @property string[][] $whitelist
16
+ * @property int $confidence_threshold
17
  */
18
  class ScanActionVO extends BaseScanActionVO {
19
 
src/lib/src/Scans/Mal/ScanFromFileMap.php CHANGED
@@ -14,6 +14,8 @@ class ScanFromFileMap extends BaseScanFromFileMap {
14
  * @return FileScanner
15
  */
16
  protected function getFileScanner() {
17
- return ( new FileScanner() )->setScanActionVO( $this->getScanActionVO() );
 
 
18
  }
19
  }
14
  * @return FileScanner
15
  */
16
  protected function getFileScanner() {
17
+ return ( new FileScanner() )
18
+ ->setMod( $this->getMod() )
19
+ ->setScanActionVO( $this->getScanActionVO() );
20
  }
21
  }
src/lib/src/Scans/Mal/Utilities/FalsePositiveReporter.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal\Utilities;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules;
6
+ use FernleafSystems\Wordpress\Services\Services;
7
+ use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware;
8
+
9
+ /**
10
+ * Class FalsePositiveReporter
11
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal\Utilities
12
+ */
13
+ class FalsePositiveReporter {
14
+
15
+ use Modules\ModConsumer;
16
+
17
+ /**
18
+ * To prevent duplicate reports, we cache what we report and only send the report
19
+ * if we've never sent this before.
20
+ * @param string $sFullPath
21
+ * @param string $sAlgo
22
+ * @param bool $bIsFalsePositive
23
+ * @return mixed
24
+ */
25
+ public function report( $sFullPath, $sAlgo = 'sha1', $bIsFalsePositive = true ) {
26
+ $bReported = false;
27
+
28
+ /** @var Modules\HackGuard\Options $oOpts */
29
+ $oOpts = $this->getOptions();
30
+ if ( !$oOpts->isMalUseNetworkIntelligence() ) {
31
+ return $bReported;
32
+ }
33
+
34
+ $aReported = $oOpts->getOpt( 'mal_fp_reports', [] );
35
+ $sSig = md5( serialize(
36
+ [
37
+ basename( $sFullPath ),
38
+ sha1( Services::DataManipulation()->convertLineEndingsDosToLinux( $sFullPath ) ),
39
+ $bIsFalsePositive
40
+ ]
41
+ ) );
42
+
43
+ if ( !is_array( $aReported ) ) {
44
+ $aReported = [];
45
+ }
46
+ if ( !isset( $aReported[ $sSig ] ) ) {
47
+ // Haven't reported yet, so we proceed.
48
+ $bReported = ( new Malware\Whitelist\ReportFalsePositive() )
49
+ ->report( $sFullPath, $sAlgo, $bIsFalsePositive );
50
+ }
51
+
52
+ $aReported[ $sSig ] = Services::Request()->ts();
53
+ $oOpts->setOpt( 'mal_fp_reports', array_filter(
54
+ $aReported,
55
+ function ( $nTS ) {
56
+ return $nTS > Services::Request()->carbon()->subMonth()->timestamp;
57
+ }
58
+ ) );
59
+
60
+ $this->getMod()->saveModOptions(); // important to save immediately due to async nature
61
+
62
+ return $bReported;
63
+ }
64
+ }
src/lib/src/Scans/Mal/Utilities/Patterns.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal\Utilities;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules;
6
+ use FernleafSystems\Wordpress\Services\Utilities\File\Cache;
7
+ use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware;
8
+
9
+ /**
10
+ * Class Patterns
11
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal\Utilities
12
+ */
13
+ class Patterns {
14
+
15
+ use Modules\ModConsumer;
16
+
17
+ /**
18
+ * @return string[][]
19
+ */
20
+ public function retrieve() {
21
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
22
+ $oMod = $this->getMod();
23
+ $oCacheDef = new Cache\CacheDefVO();
24
+ $oCacheDef->dir = $oMod->getTempDir();
25
+ if ( empty( $oCacheDef->dir ) ) { // Fallback to original method
26
+ /** @var Modules\HackGuard\Options $oOpts */
27
+ $oOpts = $this->getOptions();
28
+ $oCacheDef->data = [
29
+ 'simple' => $oOpts->getMalSignaturesSimple(),
30
+ 'regex' => $oOpts->getMalSignaturesRegex(),
31
+ ];
32
+ }
33
+ else {
34
+ $oCacheDef->file_fragment = 'cache_patterns.txt';
35
+ $oCacheDef->expiration = HOUR_IN_SECONDS;
36
+ ( new Cache\LoadFromCache() )
37
+ ->setCacheDef( $oCacheDef )
38
+ ->load();
39
+ if ( empty( $oCacheDef->data ) ) {
40
+ $aNewPatt = ( new Malware\Patterns\Retrieve() )->getPatterns();
41
+ if ( is_array( $aNewPatt ) && !empty( $aNewPatt[ 'simple' ] ) && !empty( $aNewPatt[ 'regex' ] ) ) {
42
+ $oCacheDef->data = $aNewPatt;
43
+ ( new Cache\StoreToCache() )
44
+ ->setCacheDef( $oCacheDef )
45
+ ->store();
46
+ }
47
+ }
48
+ }
49
+
50
+ return $oCacheDef->data;
51
+ }
52
+ }
src/lib/src/Scans/Mal/Utilities/Whitelist.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal\Utilities;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
6
+ use FernleafSystems\Wordpress\Services\Utilities\File\Cache;
7
+ use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware;
8
+
9
+ /**
10
+ * Class Whitelist
11
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Mal\Utilities
12
+ */
13
+ class Whitelist {
14
+
15
+ use ModConsumer;
16
+
17
+ /**
18
+ * @return string[][]
19
+ */
20
+ public function retrieve() {
21
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
22
+ $oMod = $this->getMod();
23
+ $oCacheDef = new Cache\CacheDefVO();
24
+ $oCacheDef->dir = $oMod->getTempDir();
25
+ if ( empty( $oCacheDef->dir ) ) {
26
+ $oCacheDef->data = [];
27
+ }
28
+ else {
29
+ $oCacheDef->file_fragment = 'cache_whitelist_confidence.txt';
30
+ $oCacheDef->expiration = HOUR_IN_SECONDS; // Prevent lots of unnecessary HTTP requests out.
31
+ ( new Cache\LoadFromCache() )
32
+ ->setCacheDef( $oCacheDef )
33
+ ->load();
34
+ if ( empty( $oCacheDef->data ) ) {
35
+ $oCacheDef->data = ( new Malware\Whitelist\Retrieve() )->getWhitelist();
36
+ ( new Cache\StoreToCache() )
37
+ ->setCacheDef( $oCacheDef )
38
+ ->store();
39
+ }
40
+ }
41
+
42
+ return $oCacheDef->data;
43
+ }
44
+ }
src/lib/src/Scans/Ptg/BuildScanAction.php CHANGED
@@ -38,7 +38,7 @@ class BuildScanAction extends Shield\Scans\Base\BaseBuildScanAction {
38
  /** @var ScanActionVO $oAction */
39
  $oAction = $this->getScanActionVO();
40
  /** @var Shield\Modules\HackGuard\Options $oOpts */
41
- $oOpts = $this->getMod()->getOptions();
42
  $oAction->scan_depth = $oOpts->getPtgScanDepth();
43
  $oAction->file_exts = $oOpts->getPtgFileExtensions();
44
  $oAction->hashes_base_path = $oOpts->getPtgSnapsBaseDir();
38
  /** @var ScanActionVO $oAction */
39
  $oAction = $this->getScanActionVO();
40
  /** @var Shield\Modules\HackGuard\Options $oOpts */
41
+ $oOpts = $this->getOptions();
42
  $oAction->scan_depth = $oOpts->getPtgScanDepth();
43
  $oAction->file_exts = $oOpts->getPtgFileExtensions();
44
  $oAction->hashes_base_path = $oOpts->getPtgSnapsBaseDir();
src/lib/src/Scans/Ptg/ResultItem.php CHANGED
@@ -17,8 +17,6 @@ use FernleafSystems\Wordpress\Plugin\Shield\Scans\Base;
17
  */
18
  class ResultItem extends Base\BaseResultItem {
19
 
20
- const SCAN_RESULT_TYPE = 'ptg';
21
-
22
  /**
23
  * @return string
24
  */
17
  */
18
  class ResultItem extends Base\BaseResultItem {
19
 
 
 
20
  /**
21
  * @return string
22
  */
src/lib/src/Scans/Ufc/BuildScanAction.php CHANGED
@@ -22,7 +22,7 @@ class BuildScanAction extends Shield\Scans\Base\BaseBuildScanAction {
22
  /** @var ScanActionVO $oAction */
23
  $oAction = $this->getScanActionVO();
24
  /** @var Shield\Modules\HackGuard\Options $oOpts */
25
- $oOpts = $this->getMod()->getOptions();
26
 
27
  $oAction->exclusions = $oOpts->getUfcFileExclusions();
28
  $oAction->scan_dirs = $oOpts->getUfcScanDirectories();
22
  /** @var ScanActionVO $oAction */
23
  $oAction = $this->getScanActionVO();
24
  /** @var Shield\Modules\HackGuard\Options $oOpts */
25
+ $oOpts = $this->getOptions();
26
 
27
  $oAction->exclusions = $oOpts->getUfcFileExclusions();
28
  $oAction->scan_dirs = $oOpts->getUfcScanDirectories();
src/lib/src/Scans/Ufc/ResultItem.php CHANGED
@@ -12,8 +12,6 @@ use FernleafSystems\Wordpress\Plugin\Shield\Scans\Base;
12
  */
13
  class ResultItem extends Base\BaseResultItem {
14
 
15
- const SCAN_RESULT_TYPE = 'ufc';
16
-
17
  /**
18
  * @return string
19
  */
12
  */
13
  class ResultItem extends Base\BaseResultItem {
14
 
 
 
15
  /**
16
  * @return string
17
  */
src/lib/src/Scans/Ufc/Scan.php CHANGED
@@ -10,6 +10,8 @@ class Scan extends Shield\Scans\Base\Files\BaseFileMapScan {
10
  * @return ScanFromFileMap
11
  */
12
  protected function getScanFromFileMap() {
13
- return ( new ScanFromFileMap() )->setScanActionVO( $this->getScanActionVO() );
 
 
14
  }
15
  }
10
  * @return ScanFromFileMap
11
  */
12
  protected function getScanFromFileMap() {
13
+ return ( new ScanFromFileMap() )
14
+ ->setMod( $this->getMod() )
15
+ ->setScanActionVO( $this->getScanActionVO() );
16
  }
17
  }
src/lib/src/Scans/Ufc/ScanFromFileMap.php CHANGED
@@ -6,7 +6,7 @@ use FernleafSystems\Wordpress\Plugin\Shield\Scans\Base\Files\BaseScanFromFileMap
6
 
7
  /**
8
  * Class ScanFromFileMap
9
- * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Wcf
10
  */
11
  class ScanFromFileMap extends BaseScanFromFileMap {
12
 
@@ -14,6 +14,8 @@ class ScanFromFileMap extends BaseScanFromFileMap {
14
  * @return FileScanner
15
  */
16
  protected function getFileScanner() {
17
- return ( new FileScanner() )->setScanActionVO( $this->getScanActionVO() );
 
 
18
  }
19
  }
6
 
7
  /**
8
  * Class ScanFromFileMap
9
+ * @package FernleafSystems\Wordpress\Plugin\Shield\Scans\Ufc
10
  */
11
  class ScanFromFileMap extends BaseScanFromFileMap {
12
 
14
  * @return FileScanner
15
  */
16
  protected function getFileScanner() {
17
+ return ( new FileScanner() )
18
+ ->setMod( $this->getMod() )
19
+ ->setScanActionVO( $this->getScanActionVO() );
20
  }
21
  }
src/lib/src/Scans/Wcf/BuildScanAction.php CHANGED
@@ -18,7 +18,7 @@ class BuildScanAction extends Shield\Scans\Base\BaseBuildScanAction {
18
  /** @var ScanActionVO $oAction */
19
  $oAction = $this->getScanActionVO();
20
  /** @var Shield\Modules\HackGuard\Options $oOpts */
21
- $oOpts = $this->getMod()->getOptions();
22
 
23
  $oAction->exclusions_missing_regex = $oOpts->getWcfMissingExclusions();
24
  $oAction->exclusions_files_regex = $oOpts->getWcfFileExclusions();
18
  /** @var ScanActionVO $oAction */
19
  $oAction = $this->getScanActionVO();
20
  /** @var Shield\Modules\HackGuard\Options $oOpts */
21
+ $oOpts = $this->getOptions();
22
 
23
  $oAction->exclusions_missing_regex = $oOpts->getWcfMissingExclusions();
24
  $oAction->exclusions_files_regex = $oOpts->getWcfFileExclusions();
src/lib/src/Scans/Wcf/ResultItem.php CHANGED
@@ -15,8 +15,6 @@ use FernleafSystems\Wordpress\Plugin\Shield\Scans\Base;
15
  */
16
  class ResultItem extends Base\BaseResultItem {
17
 
18
- const SCAN_RESULT_TYPE = 'wcf';
19
-
20
  /**
21
  * @return string
22
  */
15
  */
16
  class ResultItem extends Base\BaseResultItem {
17
 
 
 
18
  /**
19
  * @return string
20
  */
src/lib/src/Scans/Wcf/Scan.php CHANGED
@@ -10,6 +10,8 @@ class Scan extends Shield\Scans\Base\Files\BaseFileMapScan {
10
  * @return ScanFromFileMap
11
  */
12
  protected function getScanFromFileMap() {
13
- return ( new ScanFromFileMap() )->setScanActionVO( $this->getScanActionVO() );
 
 
14
  }
15
  }
10
  * @return ScanFromFileMap
11
  */
12
  protected function getScanFromFileMap() {
13
+ return ( new ScanFromFileMap() )
14
+ ->setMod( $this->getMod() )
15
+ ->setScanActionVO( $this->getScanActionVO() );
16
  }
17
  }
src/lib/src/Scans/Wcf/ScanFromFileMap.php CHANGED
@@ -14,6 +14,8 @@ class ScanFromFileMap extends BaseScanFromFileMap {
14
  * @return FileScanner
15
  */
16
  protected function getFileScanner() {
17
- return ( new FileScanner() )->setScanActionVO( $this->getScanActionVO() );
 
 
18
  }
19
  }
14
  * @return FileScanner
15
  */
16
  protected function getFileScanner() {
17
+ return ( new FileScanner() )
18
+ ->setMod( $this->getMod() )
19
+ ->setScanActionVO( $this->getScanActionVO() );
20
  }
21
  }
src/lib/src/Scans/Wpv/ResultItem.php CHANGED
@@ -15,8 +15,6 @@ use FernleafSystems\Wordpress\Plugin\Shield\Scans\Wpv\WpVulnDb\WpVulnVO;
15
  */
16
  class ResultItem extends Base\BaseResultItem {
17
 
18
- const SCAN_RESULT_TYPE = 'wpv';
19
-
20
  /**
21
  * @return string
22
  */
15
  */
16
  class ResultItem extends Base\BaseResultItem {
17
 
 
 
18
  /**
19
  * @return string
20
  */
src/lib/src/Tables/Build/ScanMal.php CHANGED
@@ -3,7 +3,7 @@
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Tables\Build;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield;
6
- use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Scan;
7
 
8
  /**
9
  * Class ScanMal
@@ -19,8 +19,11 @@ class ScanMal extends ScanBase {
19
 
20
  /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
21
  $oMod = $this->getMod();
 
 
 
22
  $oRepairer = ( new Shield\Scans\Mal\Repair() )->setMod( $oMod );
23
- $oConverter = ( new Scan\Results\ConvertBetweenTypes() )
24
  ->setScanActionVO( $this->getScanActionVO() );
25
 
26
  foreach ( $this->getEntriesRaw() as $nKey => $oEntry ) {
@@ -28,19 +31,29 @@ class ScanMal extends ScanBase {
28
  /** @var Shield\Scans\Mal\ResultItem $oIt */
29
  $oIt = $oConverter->convertVoToResultItem( $oEntry );
30
  $aE = $oEntry->getRawDataAsArray();
 
31
  $aE[ 'path' ] = $oIt->path_fragment;
32
- $aE[ 'status' ] = __( 'Potential Malware Detected', 'wp-simple-firewall' );
33
  $aE[ 'ignored' ] = $this->formatIsIgnored( $oEntry );
 
 
 
 
 
 
 
 
 
 
 
34
  try {
35
  $bCanRepair = $oRepairer->canAutoRepairFromSource( $oIt );
36
  }
37
  catch ( \Exception $oE ) {
38
- $aE[ 'status' ] .= sprintf( '<br/>%s: %s',
39
- __( 'Repair Unavailable', 'wp-simple-firewall' ),
40
- $oE->getMessage()
41
- );
42
  $bCanRepair = false;
43
  }
 
 
44
  $aE[ 'can_repair' ] = $bCanRepair;
45
  $aE[ 'created_at' ] = $this->formatTimestampField( $oEntry->created_at );
46
  $aE[ 'href_download' ] = $oMod->createFileDownloadLink( $oEntry );
@@ -50,6 +63,29 @@ class ScanMal extends ScanBase {
50
  return $aEntries;
51
  }
52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  /**
54
  * @return Shield\Tables\Render\ScanMal
55
  */
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Tables\Build;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard;
7
 
8
  /**
9
  * Class ScanMal
19
 
20
  /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
21
  $oMod = $this->getMod();
22
+ /** @var HackGuard\Options $oOpts */
23
+ $oOpts = $this->getOptions();
24
+
25
  $oRepairer = ( new Shield\Scans\Mal\Repair() )->setMod( $oMod );
26
+ $oConverter = ( new HackGuard\Scan\Results\ConvertBetweenTypes() )
27
  ->setScanActionVO( $this->getScanActionVO() );
28
 
29
  foreach ( $this->getEntriesRaw() as $nKey => $oEntry ) {
31
  /** @var Shield\Scans\Mal\ResultItem $oIt */
32
  $oIt = $oConverter->convertVoToResultItem( $oEntry );
33
  $aE = $oEntry->getRawDataAsArray();
34
+
35
  $aE[ 'path' ] = $oIt->path_fragment;
 
36
  $aE[ 'ignored' ] = $this->formatIsIgnored( $oEntry );
37
+
38
+ $aStatus = [
39
+ __( 'Potential Malware Detected', 'wp-simple-firewall' ),
40
+ sprintf( '%s: %s', __( 'Pattern Detected' ), $this->getPatternForDisplay( base64_decode( $oIt->mal_sig ) ) ),
41
+ sprintf( '%s: %s', __( 'Affected line numbers' ), implode( ', ', $oIt->file_lines ) ),
42
+ ];
43
+
44
+ if ( $oOpts->isMalUseNetworkIntelligence() ) {
45
+ $aStatus[] = sprintf( '%s: %s/100', __( 'False Positive Confidence' ), sprintf( '<strong>%s</strong>', (int)$oIt->fp_confidence ) );
46
+ }
47
+
48
  try {
49
  $bCanRepair = $oRepairer->canAutoRepairFromSource( $oIt );
50
  }
51
  catch ( \Exception $oE ) {
52
+ $aStatus[] = sprintf( '%s: %s', __( 'Repair Unavailable', 'wp-simple-firewall' ), $oE->getMessage() );
 
 
 
53
  $bCanRepair = false;
54
  }
55
+
56
+ $aE[ 'status' ] = implode( '<br/>', $aStatus );
57
  $aE[ 'can_repair' ] = $bCanRepair;
58
  $aE[ 'created_at' ] = $this->formatTimestampField( $oEntry->created_at );
59
  $aE[ 'href_download' ] = $oMod->createFileDownloadLink( $oEntry );
63
  return $aEntries;
64
  }
65
 
66
+ /**
67
+ * @param string $sText
68
+ * @return string
69
+ */
70
+ private function getPatternForDisplay( $sText ) {
71
+ if ( false && function_exists( 'imagecreate' ) ) {
72
+ $oImg = imagecreate( 400, 20 );
73
+ imagecolorallocate( $oImg, 255, 255, 255 );
74
+ $oTxtColour = imagecolorallocate( $oImg, 25, 25, 25 );
75
+ imagestring( $oImg, 5, 1, 1, $sText, $oTxtColour );
76
+ ob_start();
77
+ imagepng( $oImg );
78
+ $sImg = ob_get_clean();
79
+ imagedestroy( $oImg );
80
+ $sPattern = sprintf( '<img src="data:image/png;base64,%s" alt="Pattern" />', base64_encode( $sImg ) );
81
+ }
82
+ else {
83
+ $sPattern = sprintf( '<code>%s</code>', esc_html( $sText ) );
84
+ }
85
+
86
+ return $sPattern;
87
+ }
88
+
89
  /**
90
  * @return Shield\Tables\Render\ScanMal
91
  */
src/lib/src/Tables/Render/ScanMal.php CHANGED
@@ -32,6 +32,8 @@ class ScanMal extends ScanBase {
32
  protected function get_bulk_actions() {
33
  return [
34
  'ignore' => __( 'Ignore', 'wp-simple-firewall' ),
 
 
35
  ];
36
  }
37
 
32
  protected function get_bulk_actions() {
33
  return [
34
  'ignore' => __( 'Ignore', 'wp-simple-firewall' ),
35
+ 'delete' => __( 'Delete', 'wp-simple-firewall' ),
36
+ 'repair' => __( 'Repair', 'wp-simple-firewall' ),
37
  ];
38
  }
39
 
src/lib/src/Utilities/ReCaptcha/TestRequest.php CHANGED
@@ -31,14 +31,12 @@ class TestRequest {
31
  * @throws \Exception
32
  */
33
  private function runTest() {
34
-
35
  /** @var \ICWP_WPSF_FeatureHandler_BaseWpsf $oMod */
36
  $oMod = $this->getMod();
37
 
38
  $sCaptchaResponse = Services::Request()->post( 'g-recaptcha-response' );
39
 
40
  if ( empty( $sCaptchaResponse ) ) {
41
- $this->getCon()->fireEvent( 'recaptcha_fail' );
42
  throw new \Exception( __( 'Whoops.', 'wp-simple-firewall' ).' '.__( 'Google reCAPTCHA was not submitted.', 'wp-simple-firewall' ), 1 );
43
  }
44
  else {
@@ -51,11 +49,9 @@ class TestRequest {
51
  Services::WpGeneral()->isAjax() ?
52
  __( 'Maybe refresh the page and try again.', 'wp-simple-firewall' ) : ''
53
  ];
54
- $this->getCon()->fireEvent( 'recaptcha_fail' );
55
  throw new \Exception( implode( ' ', $aMsg ), 2 );
56
  }
57
  }
58
- $this->getCon()->fireEvent( 'recaptcha_success' );
59
  return true;
60
  }
61
  }
31
  * @throws \Exception
32
  */
33
  private function runTest() {
 
34
  /** @var \ICWP_WPSF_FeatureHandler_BaseWpsf $oMod */
35
  $oMod = $this->getMod();
36
 
37
  $sCaptchaResponse = Services::Request()->post( 'g-recaptcha-response' );
38
 
39
  if ( empty( $sCaptchaResponse ) ) {
 
40
  throw new \Exception( __( 'Whoops.', 'wp-simple-firewall' ).' '.__( 'Google reCAPTCHA was not submitted.', 'wp-simple-firewall' ), 1 );
41
  }
42
  else {
49
  Services::WpGeneral()->isAjax() ?
50
  __( 'Maybe refresh the page and try again.', 'wp-simple-firewall' ) : ''
51
  ];
 
52
  throw new \Exception( implode( ' ', $aMsg ), 2 );
53
  }
54
  }
 
55
  return true;
56
  }
57
  }
src/lib/vendor/composer/autoload_classmap.php CHANGED
@@ -220,6 +220,8 @@ return array(
220
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\Lockdown\\Strings' => $baseDir . '/src/Modules/Lockdown/Strings.php',
221
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\AdminNotices' => $baseDir . '/src/Modules/LoginGuard/AdminNotices.php',
222
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\AjaxHandler' => $baseDir . '/src/Modules/LoginGuard/AjaxHandler.php',
 
 
223
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Options' => $baseDir . '/src/Modules/LoginGuard/Options.php',
224
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Strings' => $baseDir . '/src/Modules/LoginGuard/Strings.php',
225
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\ModConsumer' => $baseDir . '/src/Modules/ModConsumer.php',
@@ -289,6 +291,9 @@ return array(
289
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\Scan' => $baseDir . '/src/Scans/Mal/Scan.php',
290
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\ScanActionVO' => $baseDir . '/src/Scans/Mal/ScanActionVO.php',
291
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\ScanFromFileMap' => $baseDir . '/src/Scans/Mal/ScanFromFileMap.php',
 
 
 
292
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\BuildScanAction' => $baseDir . '/src/Scans/Ptg/BuildScanAction.php',
293
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\DiffHashes' => $baseDir . '/src/Scans/Ptg/DiffHashes.php',
294
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\ItemScanner' => $baseDir . '/src/Scans/Ptg/ItemScanner.php',
@@ -408,6 +413,10 @@ return array(
408
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Email' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Email.php',
409
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Encrypt\\OpenSslEncrypt' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Encrypt/OpenSslEncrypt.php',
410
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Encrypt\\OpenSslEncryptVo' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Encrypt/OpenSslEncryptVo.php',
 
 
 
 
411
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Compare\\CompareHash' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/File/Compare/CompareHash.php',
412
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\ExtractLineFromFile' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/File/ExtractLineFromFile.php',
413
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\LocateStrInFile' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/File/LocateStrInFile.php',
@@ -427,9 +436,13 @@ return array(
427
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\Plugin' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/Plugin.php',
428
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\RequestVO' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/RequestVO.php',
429
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\WordPress' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/WordPress.php',
430
- 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Base' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Base.php',
431
- 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\RequestVO' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/RequestVO.php',
432
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\WhitelistRetrieve' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/WhitelistRetrieve.php',
 
 
 
 
433
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\Base' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/Base.php',
434
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\BasePluginTheme' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/BasePluginTheme.php',
435
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\Plugin' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/Plugin.php',
220
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\Lockdown\\Strings' => $baseDir . '/src/Modules/Lockdown/Strings.php',
221
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\AdminNotices' => $baseDir . '/src/Modules/LoginGuard/AdminNotices.php',
222
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\AjaxHandler' => $baseDir . '/src/Modules/LoginGuard/AjaxHandler.php',
223
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Lib\\CooldownFlagFile' => $baseDir . '/src/Modules/LoginGuard/Lib/CooldownFlagFile.php',
224
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Lib\\CooldownRedirect' => $baseDir . '/src/Modules/LoginGuard/Lib/CooldownRedirect.php',
225
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Options' => $baseDir . '/src/Modules/LoginGuard/Options.php',
226
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Strings' => $baseDir . '/src/Modules/LoginGuard/Strings.php',
227
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\ModConsumer' => $baseDir . '/src/Modules/ModConsumer.php',
291
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\Scan' => $baseDir . '/src/Scans/Mal/Scan.php',
292
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\ScanActionVO' => $baseDir . '/src/Scans/Mal/ScanActionVO.php',
293
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\ScanFromFileMap' => $baseDir . '/src/Scans/Mal/ScanFromFileMap.php',
294
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\Utilities\\FalsePositiveReporter' => $baseDir . '/src/Scans/Mal/Utilities/FalsePositiveReporter.php',
295
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\Utilities\\Patterns' => $baseDir . '/src/Scans/Mal/Utilities/Patterns.php',
296
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\Utilities\\Whitelist' => $baseDir . '/src/Scans/Mal/Utilities/Whitelist.php',
297
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\BuildScanAction' => $baseDir . '/src/Scans/Ptg/BuildScanAction.php',
298
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\DiffHashes' => $baseDir . '/src/Scans/Ptg/DiffHashes.php',
299
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\ItemScanner' => $baseDir . '/src/Scans/Ptg/ItemScanner.php',
413
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Email' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Email.php',
414
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Encrypt\\OpenSslEncrypt' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Encrypt/OpenSslEncrypt.php',
415
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Encrypt\\OpenSslEncryptVo' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Encrypt/OpenSslEncryptVo.php',
416
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Cache\\Base' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/File/Cache/Base.php',
417
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Cache\\CacheDefVO' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/File/Cache/CacheDefVO.php',
418
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Cache\\LoadFromCache' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/File/Cache/LoadFromCache.php',
419
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Cache\\StoreToCache' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/File/Cache/StoreToCache.php',
420
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Compare\\CompareHash' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/File/Compare/CompareHash.php',
421
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\ExtractLineFromFile' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/File/ExtractLineFromFile.php',
422
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\LocateStrInFile' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/File/LocateStrInFile.php',
436
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\Plugin' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/Plugin.php',
437
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\RequestVO' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/RequestVO.php',
438
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\WordPress' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/WordPress.php',
439
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Patterns\\Base' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Patterns/Base.php',
440
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Patterns\\Retrieve' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Patterns/Retrieve.php',
441
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\WhitelistRetrieve' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/WhitelistRetrieve.php',
442
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Whitelist\\Base' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/Base.php',
443
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Whitelist\\ReportFalsePositive' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/ReportFalsePositive.php',
444
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Whitelist\\RequestVO' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/RequestVO.php',
445
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Whitelist\\Retrieve' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/Retrieve.php',
446
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\Base' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/Base.php',
447
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\BasePluginTheme' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/BasePluginTheme.php',
448
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\Plugin' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/Plugin.php',
src/lib/vendor/composer/autoload_static.php CHANGED
@@ -369,6 +369,8 @@ class ComposerStaticInitfcf2fe1888f1f5fc092770cdc8ef3cf4
369
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\Lockdown\\Strings' => __DIR__ . '/../..' . '/src/Modules/Lockdown/Strings.php',
370
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\AdminNotices' => __DIR__ . '/../..' . '/src/Modules/LoginGuard/AdminNotices.php',
371
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\AjaxHandler' => __DIR__ . '/../..' . '/src/Modules/LoginGuard/AjaxHandler.php',
 
 
372
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Options' => __DIR__ . '/../..' . '/src/Modules/LoginGuard/Options.php',
373
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Strings' => __DIR__ . '/../..' . '/src/Modules/LoginGuard/Strings.php',
374
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\ModConsumer' => __DIR__ . '/../..' . '/src/Modules/ModConsumer.php',
@@ -438,6 +440,9 @@ class ComposerStaticInitfcf2fe1888f1f5fc092770cdc8ef3cf4
438
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\Scan' => __DIR__ . '/../..' . '/src/Scans/Mal/Scan.php',
439
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\ScanActionVO' => __DIR__ . '/../..' . '/src/Scans/Mal/ScanActionVO.php',
440
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\ScanFromFileMap' => __DIR__ . '/../..' . '/src/Scans/Mal/ScanFromFileMap.php',
 
 
 
441
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\BuildScanAction' => __DIR__ . '/../..' . '/src/Scans/Ptg/BuildScanAction.php',
442
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\DiffHashes' => __DIR__ . '/../..' . '/src/Scans/Ptg/DiffHashes.php',
443
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\ItemScanner' => __DIR__ . '/../..' . '/src/Scans/Ptg/ItemScanner.php',
@@ -557,6 +562,10 @@ class ComposerStaticInitfcf2fe1888f1f5fc092770cdc8ef3cf4
557
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Email' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Email.php',
558
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Encrypt\\OpenSslEncrypt' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Encrypt/OpenSslEncrypt.php',
559
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Encrypt\\OpenSslEncryptVo' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Encrypt/OpenSslEncryptVo.php',
 
 
 
 
560
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Compare\\CompareHash' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/File/Compare/CompareHash.php',
561
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\ExtractLineFromFile' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/File/ExtractLineFromFile.php',
562
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\LocateStrInFile' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/File/LocateStrInFile.php',
@@ -576,9 +585,13 @@ class ComposerStaticInitfcf2fe1888f1f5fc092770cdc8ef3cf4
576
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\Plugin' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/Plugin.php',
577
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\RequestVO' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/RequestVO.php',
578
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\WordPress' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/WordPress.php',
579
- 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Base' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Base.php',
580
- 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\RequestVO' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/RequestVO.php',
581
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\WhitelistRetrieve' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/WhitelistRetrieve.php',
 
 
 
 
582
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\Base' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/Base.php',
583
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\BasePluginTheme' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/BasePluginTheme.php',
584
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\Plugin' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/Plugin.php',
369
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\Lockdown\\Strings' => __DIR__ . '/../..' . '/src/Modules/Lockdown/Strings.php',
370
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\AdminNotices' => __DIR__ . '/../..' . '/src/Modules/LoginGuard/AdminNotices.php',
371
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\AjaxHandler' => __DIR__ . '/../..' . '/src/Modules/LoginGuard/AjaxHandler.php',
372
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Lib\\CooldownFlagFile' => __DIR__ . '/../..' . '/src/Modules/LoginGuard/Lib/CooldownFlagFile.php',
373
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Lib\\CooldownRedirect' => __DIR__ . '/../..' . '/src/Modules/LoginGuard/Lib/CooldownRedirect.php',
374
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Options' => __DIR__ . '/../..' . '/src/Modules/LoginGuard/Options.php',
375
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\LoginGuard\\Strings' => __DIR__ . '/../..' . '/src/Modules/LoginGuard/Strings.php',
376
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Modules\\ModConsumer' => __DIR__ . '/../..' . '/src/Modules/ModConsumer.php',
440
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\Scan' => __DIR__ . '/../..' . '/src/Scans/Mal/Scan.php',
441
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\ScanActionVO' => __DIR__ . '/../..' . '/src/Scans/Mal/ScanActionVO.php',
442
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\ScanFromFileMap' => __DIR__ . '/../..' . '/src/Scans/Mal/ScanFromFileMap.php',
443
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\Utilities\\FalsePositiveReporter' => __DIR__ . '/../..' . '/src/Scans/Mal/Utilities/FalsePositiveReporter.php',
444
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\Utilities\\Patterns' => __DIR__ . '/../..' . '/src/Scans/Mal/Utilities/Patterns.php',
445
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Mal\\Utilities\\Whitelist' => __DIR__ . '/../..' . '/src/Scans/Mal/Utilities/Whitelist.php',
446
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\BuildScanAction' => __DIR__ . '/../..' . '/src/Scans/Ptg/BuildScanAction.php',
447
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\DiffHashes' => __DIR__ . '/../..' . '/src/Scans/Ptg/DiffHashes.php',
448
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Scans\\Ptg\\ItemScanner' => __DIR__ . '/../..' . '/src/Scans/Ptg/ItemScanner.php',
562
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Email' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Email.php',
563
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Encrypt\\OpenSslEncrypt' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Encrypt/OpenSslEncrypt.php',
564
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Encrypt\\OpenSslEncryptVo' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Encrypt/OpenSslEncryptVo.php',
565
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Cache\\Base' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/File/Cache/Base.php',
566
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Cache\\CacheDefVO' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/File/Cache/CacheDefVO.php',
567
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Cache\\LoadFromCache' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/File/Cache/LoadFromCache.php',
568
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Cache\\StoreToCache' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/File/Cache/StoreToCache.php',
569
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\Compare\\CompareHash' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/File/Compare/CompareHash.php',
570
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\ExtractLineFromFile' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/File/ExtractLineFromFile.php',
571
  'FernleafSystems\\Wordpress\\Services\\Utilities\\File\\LocateStrInFile' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/File/LocateStrInFile.php',
585
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\Plugin' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/Plugin.php',
586
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\RequestVO' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/RequestVO.php',
587
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Hashes\\WordPress' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/WordPress.php',
588
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Patterns\\Base' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Patterns/Base.php',
589
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Patterns\\Retrieve' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Patterns/Retrieve.php',
590
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\WhitelistRetrieve' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/WhitelistRetrieve.php',
591
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Whitelist\\Base' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/Base.php',
592
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Whitelist\\ReportFalsePositive' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/ReportFalsePositive.php',
593
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Whitelist\\RequestVO' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/RequestVO.php',
594
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Malware\\Whitelist\\Retrieve' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/Retrieve.php',
595
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\Base' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/Base.php',
596
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\BasePluginTheme' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/BasePluginTheme.php',
597
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Integrations\\WpHashes\\Vulnerabilities\\Plugin' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Vulnerabilities/Plugin.php',
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/File/Cache/Base.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\File\Cache;
4
+
5
+ use FernleafSystems\Wordpress\Services\Services;
6
+
7
+ /**
8
+ * Class Base
9
+ * @package FernleafSystems\Wordpress\Services\Utilities\File\Cache
10
+ */
11
+ class Base {
12
+
13
+ /**
14
+ * @var CacheDefVO
15
+ */
16
+ private $oDef;
17
+
18
+ /**
19
+ * @return CacheDefVO
20
+ */
21
+ public function getCacheDef() {
22
+ return $this->oDef;
23
+ }
24
+
25
+ /**
26
+ * This can be overwritten as-needed
27
+ * @return string
28
+ */
29
+ public function getCacheFile() {
30
+ $oDef = $this->getCacheDef();
31
+ return path_join( $oDef->dir, $oDef->file_fragment );
32
+ }
33
+
34
+ /**
35
+ * @param CacheDefVO $oDef
36
+ * @return $this
37
+ */
38
+ public function setCacheDef( CacheDefVO $oDef ) {
39
+ $this->oDef = $oDef;
40
+ return $this;
41
+ }
42
+
43
+ /**
44
+ * @return bool
45
+ */
46
+ protected function prepCacheDir() {
47
+ return Services::WpFs()->mkdir( dirname( $this->getCacheFile() ) );
48
+ }
49
+ }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/File/Cache/CacheDefVO.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\File\Cache;
4
+
5
+ /**
6
+ * Class CacheDefVO
7
+ * @package FernleafSystems\Wordpress\Services\Utilities\File\Cache
8
+ * @property string $dir
9
+ * @property string $file_fragment
10
+ * @property string $expiration
11
+ * @property bool $touch_on_load
12
+ * @property array $data
13
+ */
14
+ class CacheDefVO {
15
+
16
+ use \FernleafSystems\Utilities\Data\Adapter\StdClassAdapter;
17
+ }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/File/Cache/LoadFromCache.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\File\Cache;
4
+
5
+ use FernleafSystems\Wordpress\Services\Services;
6
+
7
+ /**
8
+ * Class LoadFromCache
9
+ * @package FernleafSystems\Wordpress\Services\Utilities\File\Cache
10
+ */
11
+ class LoadFromCache extends Base {
12
+
13
+ /**
14
+ * @return bool
15
+ */
16
+ public function load() {
17
+ $bSuccess = false;
18
+ $oFS = Services::WpFs();
19
+
20
+ $oDef = $this->getCacheDef();
21
+ $sFile = $this->getCacheFile();
22
+ $nExpireBoundary = Services::Request()->carbon()->subSeconds( $oDef->expiration );
23
+ if ( $oFS->exists( $sFile ) && $oFS->getModifiedTime( $sFile ) > $nExpireBoundary ) {
24
+ $sJson = $oFS->getFileContent( $sFile, true );
25
+ if ( !empty( $sJson ) ) {
26
+ if ( $oDef->touch_on_load ) {
27
+ $oFS->touch( $sFile );
28
+ }
29
+ $oDef->data = json_decode( $sJson, true );
30
+ $bSuccess = is_array( $oDef->data );
31
+ }
32
+ }
33
+ return $bSuccess;
34
+ }
35
+ }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/File/Cache/StoreToCache.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\File\Cache;
4
+
5
+ use FernleafSystems\Wordpress\Services\Services;
6
+
7
+ /**
8
+ * Class StoreToCache
9
+ * @package FernleafSystems\Wordpress\Services\Utilities\File\Cache
10
+ */
11
+ class StoreToCache extends Base {
12
+
13
+ /**
14
+ * @return bool
15
+ */
16
+ public function store() {
17
+ $bSuccess = false;
18
+ $oDef = $this->getCacheDef();
19
+ if ( is_array( $oDef->data ) && $this->prepCacheDir() ) {
20
+ $bSuccess = Services::WpFs()->putFileContent(
21
+ $this->getCacheFile(),
22
+ json_encode( $oDef->data ),
23
+ true
24
+ );
25
+ }
26
+ return $bSuccess;
27
+ }
28
+ }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/ApiBase.php CHANGED
@@ -13,6 +13,7 @@ abstract class ApiBase {
13
 
14
  const API_URL = 'https://wphashes.com/api/apto-wphashes/v1/';
15
  const API_ENDPOINT = '';
 
16
  const RESPONSE_DATA_KEY = '';
17
 
18
  /**
@@ -55,9 +56,52 @@ abstract class ApiBase {
55
  * @return array|mixed|null
56
  */
57
  public function query() {
58
- $sUrl = add_query_arg( array_map( 'strtolower', $this->getQueryData() ), $this->getApiUrl() );
59
- $sResponse = ( new HttpRequest() )->getContent( $sUrl );
60
  $aData = empty( $sResponse ) ? null : json_decode( $sResponse, true );
61
- return is_array( $aData ) ? $aData[ static::RESPONSE_DATA_KEY ] : null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  }
63
  }
13
 
14
  const API_URL = 'https://wphashes.com/api/apto-wphashes/v1/';
15
  const API_ENDPOINT = '';
16
+ const REQUEST_TYPE = 'GET';
17
  const RESPONSE_DATA_KEY = '';
18
 
19
  /**
56
  * @return array|mixed|null
57
  */
58
  public function query() {
59
+ $this->preQuery();
60
+ $sResponse = $this->fireRequest();
61
  $aData = empty( $sResponse ) ? null : json_decode( $sResponse, true );
62
+ if ( is_array( $aData ) && strlen( static::RESPONSE_DATA_KEY ) > 0 ) {
63
+ $aData = $aData[ static::RESPONSE_DATA_KEY ];
64
+ }
65
+ return $aData;
66
+ }
67
+
68
+ protected function preQuery() {
69
+ }
70
+
71
+ /**
72
+ * @return string
73
+ */
74
+ protected function fireRequest() {
75
+ switch ( static::REQUEST_TYPE ) {
76
+ case 'POST':
77
+ $sResponse = $this->fireRequest_POST();
78
+ break;
79
+ case 'GET':
80
+ default:
81
+ $sResponse = $this->fireRequest_GET();
82
+ break;
83
+ }
84
+ return $sResponse;
85
+ }
86
+
87
+ /**
88
+ * @return string
89
+ */
90
+ protected function fireRequest_GET() {
91
+ $sUrl = add_query_arg( array_map( 'strtolower', $this->getQueryData() ), $this->getApiUrl() );
92
+ return ( new HttpRequest() )->getContent( $sUrl );
93
+ }
94
+
95
+ /**
96
+ * @return string|null
97
+ */
98
+ protected function fireRequest_POST() {
99
+ $oHttp = new HttpRequest();
100
+ $oHttp
101
+ ->post(
102
+ add_query_arg( array_map( 'strtolower', $this->getQueryData() ), $this->getApiUrl() ),
103
+ [ 'body' => $this->getRequestVO()->getRawDataAsArray() ]
104
+ );
105
+ return $oHttp->isSuccess() ? $oHttp->lastResponse->body : null;
106
  }
107
  }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/Base.php CHANGED
@@ -6,13 +6,26 @@ use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes;
6
 
7
  abstract class Base extends WpHashes\ApiBase {
8
 
 
9
  const DEFAULT_HASH_ALGO = 'md5';
 
 
10
 
11
  /**
12
- * @return array
13
  */
14
- protected function getQueryData() {
15
- return $this->getRequestVO()->getRawDataAsArray();
 
 
 
 
 
 
 
 
 
 
16
  }
17
 
18
  /**
@@ -23,14 +36,15 @@ abstract class Base extends WpHashes\ApiBase {
23
  }
24
 
25
  /**
26
- * @return string[]|null
27
  */
28
- public function query() {
29
  $oReq = $this->getRequestVO();
30
  if ( empty( $oReq->hash ) ) {
31
- $oReq->hash = static::DEFAULT_HASH_ALGO;
 
 
 
32
  }
33
- return parent::query();
34
  }
35
 
36
  /**
@@ -41,4 +55,13 @@ abstract class Base extends WpHashes\ApiBase {
41
  $this->getRequestVO()->hash = $sHashAlgo;
42
  return $this;
43
  }
 
 
 
 
 
 
 
 
 
44
  }
6
 
7
  abstract class Base extends WpHashes\ApiBase {
8
 
9
+ const API_ENDPOINT = 'hashes/';
10
  const DEFAULT_HASH_ALGO = 'md5';
11
+ const RESPONSE_DATA_KEY = 'hashes';
12
+ const TYPE = '';
13
 
14
  /**
15
+ * @return string
16
  */
17
+ protected function getApiUrl() {
18
+ $aData = array_filter( array_merge(
19
+ [
20
+ 'type' => false,
21
+ 'slug' => false,
22
+ 'version' => false,
23
+ 'locale' => false,
24
+ 'hash' => false,
25
+ ],
26
+ $this->getRequestVO()->getRawDataAsArray()
27
+ ) );
28
+ return sprintf( '%s%s', parent::getApiUrl(), implode( '/', $aData ) );
29
  }
30
 
31
  /**
36
  }
37
 
38
  /**
 
39
  */
40
+ protected function preQuery() {
41
  $oReq = $this->getRequestVO();
42
  if ( empty( $oReq->hash ) ) {
43
+ $this->setHashAlgo( static::DEFAULT_HASH_ALGO );
44
+ }
45
+ if ( empty( $oReq->type ) ) {
46
+ $this->setType( static::TYPE );
47
  }
 
48
  }
49
 
50
  /**
55
  $this->getRequestVO()->hash = $sHashAlgo;
56
  return $this;
57
  }
58
+
59
+ /**
60
+ * @param string $sType
61
+ * @return $this
62
+ */
63
+ public function setType( $sType ) {
64
+ $this->getRequestVO()->type = $sType;
65
+ return $this;
66
+ }
67
  }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/ClassicPress.php CHANGED
@@ -10,7 +10,7 @@ use FernleafSystems\Wordpress\Services;
10
  */
11
  class ClassicPress extends Base {
12
 
13
- const API_ENDPOINT = 'classicpress';
14
 
15
  /**
16
  * @param string $sVersion
10
  */
11
  class ClassicPress extends Base {
12
 
13
+ const TYPE = 'classicpress';
14
 
15
  /**
16
  * @param string $sVersion
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/Plugin.php CHANGED
@@ -10,7 +10,7 @@ use FernleafSystems\Wordpress\Services;
10
  */
11
  class Plugin extends Base {
12
 
13
- const API_ENDPOINT = 'plugin';
14
 
15
  /**
16
  * @param string $sSlug
10
  */
11
  class Plugin extends Base {
12
 
13
+ const TYPE = 'plugin';
14
 
15
  /**
16
  * @param string $sSlug
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/RequestVO.php CHANGED
@@ -7,6 +7,7 @@ use FernleafSystems\Wordpress\Services\Utilities\Integrations;
7
  /**
8
  * Class RequestVO
9
  * @package FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Hashes
 
10
  * @property string $version
11
  * @property string $hash
12
  * @property string $slug
7
  /**
8
  * Class RequestVO
9
  * @package FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Hashes
10
+ * @property string $type
11
  * @property string $version
12
  * @property string $hash
13
  * @property string $slug
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Hashes/WordPress.php CHANGED
@@ -10,7 +10,7 @@ use FernleafSystems\Wordpress\Services\Services;
10
  */
11
  class WordPress extends Base {
12
 
13
- const API_ENDPOINT = 'wordpress';
14
 
15
  /**
16
  * @param string $sVersion
10
  */
11
  class WordPress extends Base {
12
 
13
+ const TYPE = 'wordpress';
14
 
15
  /**
16
  * @param string $sVersion
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Patterns/Base.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware\Patterns;
4
+
5
+ use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes;
6
+
7
+ abstract class Base extends WpHashes\ApiBase {
8
+
9
+ const API_ENDPOINT = 'malware/patterns';
10
+ }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Patterns/Retrieve.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware\Patterns;
4
+
5
+ /**
6
+ * Class Retrieve
7
+ * @package FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware\Patterns
8
+ */
9
+ class Retrieve extends Base {
10
+
11
+ const RESPONSE_DATA_KEY = 'patterns';
12
+
13
+ /**
14
+ * @return string[][]|null
15
+ */
16
+ public function getPatterns() {
17
+ return $this->query();
18
+ }
19
+ }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/{Base.php → Whitelist/Base.php} RENAMED
@@ -1,20 +1,12 @@
1
  <?php
2
 
3
- namespace FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware;
4
 
5
  use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes;
6
 
7
  abstract class Base extends WpHashes\ApiBase {
8
 
9
- const API_ENDPOINT = 'malware/';
10
- const RESPONSE_DATA_KEY = 'hashes';
11
-
12
- /**
13
- * @return array[]|null
14
- */
15
- public function query() {
16
- return parent::query();
17
- }
18
 
19
  /**
20
  * @return RequestVO
1
  <?php
2
 
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware\Whitelist;
4
 
5
  use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes;
6
 
7
  abstract class Base extends WpHashes\ApiBase {
8
 
9
+ const API_ENDPOINT = 'malware/whitelist';
 
 
 
 
 
 
 
 
10
 
11
  /**
12
  * @return RequestVO
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/ReportFalsePositive.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware\Whitelist;
4
+
5
+ use FernleafSystems\Wordpress\Services\Services;
6
+
7
+ /**
8
+ * Class SubmitFalsePositive
9
+ * @package FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware\Whitelist
10
+ */
11
+ class ReportFalsePositive extends Base {
12
+
13
+ const REQUEST_TYPE = 'POST';
14
+
15
+ /**
16
+ * @param string $sFile
17
+ * @param string $aAlgo
18
+ * @param bool $bIsFalsePositive
19
+ * @return bool
20
+ */
21
+ public function report( $sFile, $aAlgo = 'sha1', $bIsFalsePositive = true ) {
22
+ /** @var RequestVO $oReq */
23
+ $oReq = $this->getRequestVO();
24
+ $oReq->file = basename( $sFile );
25
+ $oReq->hashes = [
26
+ sha1( Services::DataManipulation()->convertLineEndingsDosToLinux( $sFile ) )
27
+ ];
28
+ $oReq->algo = 'sha1';
29
+ $oReq->is_fp = $bIsFalsePositive;
30
+
31
+ $aResult = $this->query();
32
+ return !empty( $aResult ) && $aResult[ 'error' ] !== false;
33
+ }
34
+ }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/{RequestVO.php → Whitelist/RequestVO.php} RENAMED
@@ -1,12 +1,16 @@
1
  <?php
2
 
3
- namespace FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware;
4
 
5
  use FernleafSystems\Wordpress\Services\Utilities\Integrations;
6
 
7
  /**
8
  * Class RequestVO
9
- * @package FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware
 
 
 
 
10
  */
11
  class RequestVO extends Integrations\RequestVO {
12
 
1
  <?php
2
 
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware\Whitelist;
4
 
5
  use FernleafSystems\Wordpress\Services\Utilities\Integrations;
6
 
7
  /**
8
  * Class RequestVO
9
+ * @package FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware\Whitelist
10
+ * @property string $file
11
+ * @property string[] $hashes
12
+ * @property string $algo
13
+ * @property bool $is_fp
14
  */
15
  class RequestVO extends Integrations\RequestVO {
16
 
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/Whitelist/Retrieve.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware\Whitelist;
4
+
5
+ /**
6
+ * Class Retrieve
7
+ * @package FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware\Whitelist
8
+ */
9
+ class Retrieve extends Base {
10
+
11
+ const RESPONSE_DATA_KEY = 'hashes';
12
+
13
+ /**
14
+ * @return array[][]
15
+ */
16
+ public function getWhitelist() {
17
+ return $this->query();
18
+ }
19
+ }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/Malware/WhitelistRetrieve.php CHANGED
@@ -5,20 +5,15 @@ namespace FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Mal
5
  /**
6
  * Class WhitelistRetrieve
7
  * @package FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware
 
8
  */
9
- class WhitelistRetrieve extends Base {
10
 
11
  /**
12
  * @return array[]|null
 
13
  */
14
  public function getFiles() {
15
  return $this->query();
16
  }
17
-
18
- /**
19
- * @return string
20
- */
21
- protected function getApiUrl() {
22
- return sprintf( '%s%s', parent::getApiUrl(), 'whitelist/files' );
23
- }
24
  }
5
  /**
6
  * Class WhitelistRetrieve
7
  * @package FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Malware
8
+ * @deprecated 0.1.13
9
  */
10
+ class WhitelistRetrieve extends Whitelist\Retrieve {
11
 
12
  /**
13
  * @return array[]|null
14
+ * @deprecated
15
  */
16
  public function getFiles() {
17
  return $this->query();
18
  }
 
 
 
 
 
 
 
19
  }
src/processors/admin_access_restriction.php CHANGED
@@ -13,7 +13,7 @@ class ICWP_WPSF_Processor_AdminAccessRestriction extends Modules\BaseShield\Shie
13
 
14
  public function run() {
15
  /** @var SecurityAdmin\Options $oOpts */
16
- $oOpts = $this->getMod()->getOptions();
17
 
18
  add_filter( $this->getCon()->prefix( 'is_plugin_admin' ), [ $this, 'adjustUserAdminPermissions' ] );
19
 
@@ -336,7 +336,7 @@ class ICWP_WPSF_Processor_AdminAccessRestriction extends Modules\BaseShield\Shie
336
  */
337
  public function disablePluginManipulation( $aAllCaps, $cap, $aArgs ) {
338
  /** @var SecurityAdmin\Options $oOpts */
339
- $oOpts = $this->getMod()->getOptions();
340
  $oReq = Services::Request();
341
 
342
  /** @var string $sRequestedCapability */
@@ -376,7 +376,7 @@ class ICWP_WPSF_Processor_AdminAccessRestriction extends Modules\BaseShield\Shie
376
  }
377
 
378
  /** @var SecurityAdmin\Options $oOpts */
379
- $oOpts = $this->getMod()->getOptions();
380
 
381
  /** @var string $sRequestedCapability */
382
  $sRequestedCapability = $aArgs[ 0 ];
@@ -410,7 +410,7 @@ class ICWP_WPSF_Processor_AdminAccessRestriction extends Modules\BaseShield\Shie
410
  }
411
 
412
  /** @var SecurityAdmin\Options $oOpts */
413
- $oOpts = $this->getMod()->getOptions();
414
 
415
  /** @var string $sRequestedCapability */
416
  $sRequestedCapability = $aArgs[ 0 ];
13
 
14
  public function run() {
15
  /** @var SecurityAdmin\Options $oOpts */
16
+ $oOpts = $this->getOptions();
17
 
18
  add_filter( $this->getCon()->prefix( 'is_plugin_admin' ), [ $this, 'adjustUserAdminPermissions' ] );
19
 
336
  */
337
  public function disablePluginManipulation( $aAllCaps, $cap, $aArgs ) {
338
  /** @var SecurityAdmin\Options $oOpts */
339
+ $oOpts = $this->getOptions();
340
  $oReq = Services::Request();
341
 
342
  /** @var string $sRequestedCapability */
376
  }
377
 
378
  /** @var SecurityAdmin\Options $oOpts */
379
+ $oOpts = $this->getOptions();
380
 
381
  /** @var string $sRequestedCapability */
382
  $sRequestedCapability = $aArgs[ 0 ];
410
  }
411
 
412
  /** @var SecurityAdmin\Options $oOpts */
413
+ $oOpts = $this->getOptions();
414
 
415
  /** @var string $sRequestedCapability */
416
  $sRequestedCapability = $aArgs[ 0 ];
src/processors/adminaccess_whitelabel.php CHANGED
@@ -20,7 +20,7 @@ class ICWP_WPSF_Processor_AdminAccess_Whitelabel extends Modules\BaseShield\Shie
20
  parent::onWpInit();
21
 
22
  /** @var Modules\SecurityAdmin\Options $oOpts */
23
- $oOpts = $this->getMod()->getOptions();
24
  if ( $oOpts->isWlHideUpdates() && $this->isNeedToHideUpdates() && !$this->getCon()->isPluginAdmin() ) {
25
  $this->hideUpdates();
26
  }
20
  parent::onWpInit();
21
 
22
  /** @var Modules\SecurityAdmin\Options $oOpts */
23
+ $oOpts = $this->getOptions();
24
  if ( $oOpts->isWlHideUpdates() && $this->isNeedToHideUpdates() && !$this->getCon()->isPluginAdmin() ) {
25
  $this->hideUpdates();
26
  }
src/processors/audit_trail.php CHANGED
@@ -8,7 +8,7 @@ class ICWP_WPSF_Processor_AuditTrail extends Modules\BaseShield\ShieldProcessor
8
 
9
  public function run() {
10
  /** @var AuditTrail\Options $oOpts */
11
- $oOpts = $this->getMod()->getOptions();
12
  if ( $oOpts->isEnabledAuditing() ) {
13
  $this->getSubProAuditor()->execute();
14
  }
8
 
9
  public function run() {
10
  /** @var AuditTrail\Options $oOpts */
11
+ $oOpts = $this->getOptions();
12
  if ( $oOpts->isEnabledAuditing() ) {
13
  $this->getSubProAuditor()->execute();
14
  }
src/processors/audit_trail_auditor.php CHANGED
@@ -60,10 +60,9 @@ class ICWP_WPSF_Processor_AuditTrail_Auditor extends ShieldProcessor {
60
  public function onModuleShutdown() {
61
  parent::onModuleShutdown();
62
  if ( $this->bAudit && !$this->getCon()->isPluginDeleting() ) {
63
- /** @var \ICWP_WPSF_FeatureHandler_Events $oMod */
64
  $oMod = $this->getMod();
65
- /** @var AuditTrail\Handler $oDbh */
66
- $oDbh = $oMod->getDbHandler();
67
  $oDbh->commitAudits( $oMod->getRegisteredAuditLogs( true ) );
68
  }
69
  }
@@ -78,15 +77,13 @@ class ICWP_WPSF_Processor_AuditTrail_Auditor extends ShieldProcessor {
78
  * @return AuditTrail\EntryVO[]
79
  */
80
  public function getAuditEntriesForContext( $sContext = 'all', $sOrderBy = 'created_at', $sOrder = 'DESC', $nPage = 1, $nLimit = 50 ) {
81
- /** @var \ICWP_WPSF_FeatureHandler_AuditTrail $oFO */
82
- $oFO = $this->getMod();
83
- /** @var AuditTrail\Select $oSelect */
84
- $oSelect = $oFO->getDbHandler()
85
- ->getQuerySelector()
86
- ->setResultsAsVo( true )
87
- ->setOrderBy( $sOrderBy, $sOrder )
88
- ->setLimit( $nLimit )
89
- ->setPage( $nPage );
90
  return $oSelect->query();
91
  }
92
  }
60
  public function onModuleShutdown() {
61
  parent::onModuleShutdown();
62
  if ( $this->bAudit && !$this->getCon()->isPluginDeleting() ) {
63
+ /** @var \ICWP_WPSF_FeatureHandler_AuditTrail $oMod */
64
  $oMod = $this->getMod();
65
+ $oDbh = $oMod->getDbHandler_AuditTrail();
 
66
  $oDbh->commitAudits( $oMod->getRegisteredAuditLogs( true ) );
67
  }
68
  }
77
  * @return AuditTrail\EntryVO[]
78
  */
79
  public function getAuditEntriesForContext( $sContext = 'all', $sOrderBy = 'created_at', $sOrder = 'DESC', $nPage = 1, $nLimit = 50 ) {
80
+ /** @var \ICWP_WPSF_FeatureHandler_AuditTrail $oMod */
81
+ $oMod = $this->getMod();
82
+ $oSelect = $oMod->getDbHandler_AuditTrail()
83
+ ->getQuerySelector()
84
+ ->setOrderBy( $sOrderBy, $sOrder )
85
+ ->setLimit( $nLimit )
86
+ ->setPage( $nPage );
 
 
87
  return $oSelect->query();
88
  }
89
  }
src/processors/audit_trail_changetracking.php CHANGED
@@ -18,7 +18,7 @@ class ICWP_WPSF_Processor_AuditTrail_ChangeTracking extends ShieldProcessor {
18
 
19
  public function runHourlyCron() {
20
  /** @var Options $oOpts */
21
- $oOpts = $this->getMod()->getOptions();
22
  if ( $oOpts->isCTSnapshotDue() && $this->isReadyToRun() ) {
23
  $oOpts->updateCTLastSnapshotAt();
24
  $this->runSnapshot();
18
 
19
  public function runHourlyCron() {
20
  /** @var Options $oOpts */
21
+ $oOpts = $this->getOptions();
22
  if ( $oOpts->isCTSnapshotDue() && $this->isReadyToRun() ) {
23
  $oOpts->updateCTLastSnapshotAt();
24
  $this->runSnapshot();
src/processors/comments_filter.php CHANGED
@@ -47,7 +47,7 @@ class ICWP_WPSF_Processor_CommentsFilter extends Modules\BaseShield\ShieldProces
47
  public function runHourlyCron() {
48
  /** @var ICWP_WPSF_FeatureHandler_CommentsFilter $oMod */
49
  $oMod = $this->getMod();
50
- if ( $oMod->isEnabledGaspCheck() ) {
51
  delete_expired_transients(); // cleanup unused comment tokens
52
  }
53
  }
47
  public function runHourlyCron() {
48
  /** @var ICWP_WPSF_FeatureHandler_CommentsFilter $oMod */
49
  $oMod = $this->getMod();
50
+ if ( $oMod->isEnabledGaspCheck() && function_exists( 'delete_expired_transients' ) ) {
51
  delete_expired_transients(); // cleanup unused comment tokens
52
  }
53
  }
src/processors/events.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
 
3
  use FernleafSystems\Wordpress\Plugin\Shield;
4
- use FernleafSystems\Wordpress\Services\Services;
5
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Events;
6
 
7
  class ICWP_WPSF_Processor_Events extends Shield\Modules\BaseShield\ShieldProcessor {
@@ -23,10 +22,11 @@ class ICWP_WPSF_Processor_Events extends Shield\Modules\BaseShield\ShieldProcess
23
  * @return string[]
24
  */
25
  public function statsWidget( $aContent ) {
26
- /** @var Events\Handler $oDbhEvents */
27
- $oDbhEvents = $this->getCon()->getModule_Events()->getDbHandler();
28
  /** @var Events\Select $oSelEvents */
29
- $oSelEvents = $oDbhEvents->getQuerySelector();
 
 
 
30
 
31
  $aKeyStats = [
32
  'comments' => [
@@ -85,13 +85,13 @@ class ICWP_WPSF_Processor_Events extends Shield\Modules\BaseShield\ShieldProcess
85
  * @return array
86
  */
87
  public function tracking_DataCollect( $aData ) {
88
- /** @var Events\Handler $oDbhEvents */
89
- $oDbhEvents = $this->getMod()->getDbHandler();
90
- /** @var Events\Select $oSelEvents */
91
- $oSelEvents = $oDbhEvents->getQuerySelector();
92
 
93
  $aData = parent::tracking_DataCollect( $aData );
94
- $aData[ $this->getMod()->getSlug() ][ 'stats' ] = $oSelEvents->sumAllEvents();
 
 
95
  return $aData;
96
  }
97
 
@@ -107,8 +107,7 @@ class ICWP_WPSF_Processor_Events extends Shield\Modules\BaseShield\ShieldProcess
107
  private function commitEvents() {
108
  /** @var \ICWP_WPSF_FeatureHandler_Events $oMod */
109
  $oMod = $this->getMod();
110
- /** @var Events\Handler $oDbh */
111
- $oDbh = $oMod->getDbHandler();
112
- $oDbh->commitEvents( $oMod->getRegisteredEvents( true ) );
113
  }
114
  }
1
  <?php
2
 
3
  use FernleafSystems\Wordpress\Plugin\Shield;
 
4
  use FernleafSystems\Wordpress\Plugin\Shield\Databases\Events;
5
 
6
  class ICWP_WPSF_Processor_Events extends Shield\Modules\BaseShield\ShieldProcessor {
22
  * @return string[]
23
  */
24
  public function statsWidget( $aContent ) {
 
 
25
  /** @var Events\Select $oSelEvents */
26
+ $oSelEvents = $this->getCon()
27
+ ->getModule_Events()
28
+ ->getDbHandler_Events()
29
+ ->getQuerySelector();
30
 
31
  $aKeyStats = [
32
  'comments' => [
85
  * @return array
86
  */
87
  public function tracking_DataCollect( $aData ) {
88
+ /** @var \ICWP_WPSF_FeatureHandler_Events $oMod */
89
+ $oMod = $this->getMod();
 
 
90
 
91
  $aData = parent::tracking_DataCollect( $aData );
92
+ $aData[ $oMod->getSlug() ][ 'stats' ] = $oMod->getDbHandler_Events()
93
+ ->getQuerySelector()
94
+ ->sumAllEvents();
95
  return $aData;
96
  }
97
 
107
  private function commitEvents() {
108
  /** @var \ICWP_WPSF_FeatureHandler_Events $oMod */
109
  $oMod = $this->getMod();
110
+ $oMod->getDbHandler_Events()
111
+ ->commitEvents( $oMod->getRegisteredEvents( true ) );
 
112
  }
113
  }
src/processors/firewall.php CHANGED
@@ -268,7 +268,7 @@ class ICWP_WPSF_Processor_Firewall extends Modules\BaseShield\ShieldProcessor {
268
 
269
  switch ( $oMod->getBlockResponse() ) {
270
  case 'redirect_die':
271
- Services::WpGeneral()->wpDie();
272
  break;
273
  case 'redirect_die_message':
274
  Services::WpGeneral()->wpDie( $this->getFirewallDieMessageForDisplay() );
268
 
269
  switch ( $oMod->getBlockResponse() ) {
270
  case 'redirect_die':
271
+ Services::WpGeneral()->wpDie( 'Firewall Triggered' );
272
  break;
273
  case 'redirect_die_message':
274
  Services::WpGeneral()->wpDie( $this->getFirewallDieMessageForDisplay() );
src/processors/hack_protect.php CHANGED
@@ -192,7 +192,7 @@ class ICWP_WPSF_Processor_HackProtect extends Modules\BaseShield\ShieldProcessor
192
  ];
193
 
194
  /** @var \FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner\Select $oSelector */
195
- $oSelector = $oMod->getDbHandler()->getQuerySelector();
196
  /** @var HackGuard\Strings $oStrings */
197
  $oStrings = $oMod->getStrings();
198
  $aScanNames = $oStrings->getScanNames();
@@ -225,7 +225,7 @@ class ICWP_WPSF_Processor_HackProtect extends Modules\BaseShield\ShieldProcessor
225
  $oPro = $oMod->getProcessor();
226
  $oProPtg = $oPro->getSubProScanner()->getSubProcessorPtg();
227
  /** @var \FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner\Select $oSelector */
228
- $oSelector = $oMod->getDbHandler()->getQuerySelector();
229
 
230
  /** @var \FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner\EntryVO[] $aPtgResults */
231
  $aPtgResults = $oSelector->filterByNotIgnored()
192
  ];
193
 
194
  /** @var \FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner\Select $oSelector */
195
+ $oSelector = $oMod->getDbHandler_ScanResults()->getQuerySelector();
196
  /** @var HackGuard\Strings $oStrings */
197
  $oStrings = $oMod->getStrings();
198
  $aScanNames = $oStrings->getScanNames();
225
  $oPro = $oMod->getProcessor();
226
  $oProPtg = $oPro->getSubProScanner()->getSubProcessorPtg();
227
  /** @var \FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner\Select $oSelector */
228
+ $oSelector = $oMod->getDbHandler_ScanResults()->getQuerySelector();
229
 
230
  /** @var \FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner\EntryVO[] $aPtgResults */
231
  $aPtgResults = $oSelector->filterByNotIgnored()
src/processors/hackprotect_integrity.php CHANGED
@@ -144,7 +144,7 @@ class ICWP_WPSF_Processor_HackProtect_Integrity extends ShieldProcessor {
144
  */
145
  protected function getCronFrequency() {
146
  /** @var HackGuard\Options $oOpts */
147
- $oOpts = $this->getMod()->getOptions();
148
  return $oOpts->getScanFrequency();
149
  }
150
  }
144
  */
145
  protected function getCronFrequency() {
146
  /** @var HackGuard\Options $oOpts */
147
+ $oOpts = $this->getOptions();
148
  return $oOpts->getScanFrequency();
149
  }
150
  }
src/processors/hackprotect_scan_apc.php CHANGED
@@ -124,10 +124,10 @@ class ICWP_WPSF_Processor_HackProtect_Apc extends ICWP_WPSF_Processor_ScanBase {
124
  * @return Shield\Scans\Apc\ResultsSet
125
  */
126
  protected function getAllAbandoned() {
 
 
127
  /** @var Shield\Databases\Scanner\Select $oSel */
128
- $oSel = $this->getMod()
129
- ->getDbHandler()
130
- ->getQuerySelector();
131
  $aVos = $oSel->filterByScan( static::SCAN_SLUG )
132
  ->filterByNotIgnored()
133
  ->query();
124
  * @return Shield\Scans\Apc\ResultsSet
125
  */
126
  protected function getAllAbandoned() {
127
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
128
+ $oMod = $this->getMod();
129
  /** @var Shield\Databases\Scanner\Select $oSel */
130
+ $oSel = $oMod->getDbHandler_ScanResults()->getQuerySelector();
 
 
131
  $aVos = $oSel->filterByScan( static::SCAN_SLUG )
132
  ->filterByNotIgnored()
133
  ->query();
src/processors/hackprotect_scan_base.php CHANGED
@@ -88,8 +88,10 @@ abstract class ICWP_WPSF_Processor_ScanBase extends Shield\Modules\BaseShield\Sh
88
  * @param Shield\Scans\Base\BaseResultsSet $oToDelete
89
  */
90
  protected function deleteResultsSet( $oToDelete ) {
 
 
91
  ( new Scan\Results\Clean() )
92
- ->setDbHandler( $this->getMod()->getDbHandler() )
93
  ->deleteResults( $oToDelete );
94
  }
95
 
@@ -97,8 +99,10 @@ abstract class ICWP_WPSF_Processor_ScanBase extends Shield\Modules\BaseShield\Sh
97
  * @return Shield\Scans\Base\BaseResultsSet
98
  */
99
  protected function readScanResultsFromDb() {
 
 
100
  /** @var Shield\Databases\Scanner\Select $oSelector */
101
- $oSelector = $this->getMod()->getDbHandler()->getQuerySelector();
102
  return $this->convertVosToResults( $oSelector->forScan( static::SCAN_SLUG ) );
103
  }
104
 
@@ -117,23 +121,22 @@ abstract class ICWP_WPSF_Processor_ScanBase extends Shield\Modules\BaseShield\Sh
117
  * @return Shield\Databases\Scanner\EntryVO|null
118
  */
119
  protected function getVoFromResultItem( $oItem ) {
 
 
120
  /** @var Shield\Databases\Scanner\Select $oSel */
121
- $oSel = $this->getMod()
122
- ->getDbHandler()
123
- ->getQuerySelector();
124
- /** @var Shield\Databases\Scanner\EntryVO $oVo */
125
- $oVo = $oSel->filterByHash( $oItem->hash )
126
  ->filterByScan( $this->getScanActionVO()->scan )
127
  ->first();
128
- return $oVo;
129
  }
130
 
131
  /**
132
  * @return $this
133
  */
134
  public function resetIgnoreStatus() {
135
- /** @var Shield\Databases\Scanner\Handler $oUpd */
136
- $oDbh = $this->getMod()->getDbHandler();
 
137
  /** @var Shield\Databases\Scanner\Select $oSel */
138
  $oSel = $oDbh->getQuerySelector();
139
 
@@ -149,8 +152,9 @@ abstract class ICWP_WPSF_Processor_ScanBase extends Shield\Modules\BaseShield\Sh
149
  * @return $this
150
  */
151
  public function resetNotifiedStatus() {
152
- /** @var Shield\Databases\Scanner\Handler $oUpd */
153
- $oDbh = $this->getMod()->getDbHandler();
 
154
  /** @var Shield\Databases\Scanner\Select $oSel */
155
  $oSel = $oDbh->getQuerySelector();
156
 
@@ -169,11 +173,13 @@ abstract class ICWP_WPSF_Processor_ScanBase extends Shield\Modules\BaseShield\Sh
169
  * @throws \Exception
170
  */
171
  public function executeItemAction( $sItemId, $sAction ) {
 
 
 
172
  $bSuccess = false;
173
  if ( is_numeric( $sItemId ) ) {
174
  /** @var Shield\Databases\Scanner\EntryVO $oEntry */
175
- $oEntry = $this->getMod()
176
- ->getDbHandler()
177
  ->getQuerySelector()
178
  ->byId( $sItemId );
179
  if ( empty( $oEntry ) ) {
@@ -274,16 +280,17 @@ abstract class ICWP_WPSF_Processor_ScanBase extends Shield\Modules\BaseShield\Sh
274
  * @throws \Exception
275
  */
276
  protected function itemIgnore( $oItem ) {
 
277
  /** @var Shield\Databases\Scanner\EntryVO $oEntry */
278
  $oEntry = $this->getVoFromResultItem( $oItem );
279
  if ( empty( $oEntry ) ) {
280
  throw new \Exception( 'Item could not be found to ignore.' );
281
  }
282
 
 
 
283
  /** @var Shield\Databases\Scanner\Update $oUp */
284
- $oUp = $this->getMod()
285
- ->getDbHandler()
286
- ->getQueryUpdater();
287
 
288
  if ( !$oUp->setIgnored( $oEntry ) ) {
289
  throw new \Exception( 'Item could not be ignored at this time.' );
@@ -309,9 +316,7 @@ abstract class ICWP_WPSF_Processor_ScanBase extends Shield\Modules\BaseShield\Sh
309
  /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
310
  $oMod = $this->getMod();
311
  /** @var Shield\Databases\Scanner\Select $oSel */
312
- $oSel = $this->getMod()
313
- ->getDbHandler()
314
- ->getQuerySelector();
315
  /** @var Shield\Databases\Scanner\EntryVO[] $aRes */
316
  $aRes = $oSel->filterByScan( static::SCAN_SLUG )
317
  ->filterForCron( $oMod->getScanNotificationInterval() )
@@ -346,8 +351,10 @@ abstract class ICWP_WPSF_Processor_ScanBase extends Shield\Modules\BaseShield\Sh
346
  * @param Shield\Databases\Scanner\EntryVO[] $aRes
347
  */
348
  private function updateLastNotifiedAt( $aRes ) {
 
 
349
  /** @var Shield\Databases\Scanner\Update $oUpd */
350
- $oUpd = $this->getMod()->getDbHandler()->getQueryUpdater();
351
  foreach ( $aRes as $oVo ) {
352
  $oUpd->reset()
353
  ->setNotified( $oVo );
@@ -377,8 +384,10 @@ abstract class ICWP_WPSF_Processor_ScanBase extends Shield\Modules\BaseShield\Sh
377
  * @return $this
378
  */
379
  public function resetScan() {
 
 
380
  ( new Scan\Results\Clean() )
381
- ->setDbHandler( $this->getMod()->getDbHandler() )
382
  ->setScanActionVO( $this->getScanActionVO() )
383
  ->deleteAllForScan();
384
  return $this;
88
  * @param Shield\Scans\Base\BaseResultsSet $oToDelete
89
  */
90
  protected function deleteResultsSet( $oToDelete ) {
91
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
92
+ $oMod = $this->getMod();
93
  ( new Scan\Results\Clean() )
94
+ ->setDbHandler( $oMod->getDbHandler_ScanResults() )
95
  ->deleteResults( $oToDelete );
96
  }
97
 
99
  * @return Shield\Scans\Base\BaseResultsSet
100
  */
101
  protected function readScanResultsFromDb() {
102
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
103
+ $oMod = $this->getMod();
104
  /** @var Shield\Databases\Scanner\Select $oSelector */
105
+ $oSelector = $oMod->getDbHandler_ScanResults()->getQuerySelector();
106
  return $this->convertVosToResults( $oSelector->forScan( static::SCAN_SLUG ) );
107
  }
108
 
121
  * @return Shield\Databases\Scanner\EntryVO|null
122
  */
123
  protected function getVoFromResultItem( $oItem ) {
124
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
125
+ $oMod = $this->getMod();
126
  /** @var Shield\Databases\Scanner\Select $oSel */
127
+ $oSel = $oMod->getDbHandler_ScanResults()->getQuerySelector();
128
+ return $oSel->filterByHash( $oItem->hash )
 
 
 
129
  ->filterByScan( $this->getScanActionVO()->scan )
130
  ->first();
 
131
  }
132
 
133
  /**
134
  * @return $this
135
  */
136
  public function resetIgnoreStatus() {
137
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
138
+ $oMod = $this->getMod();
139
+ $oDbh = $oMod->getDbHandler_ScanResults();
140
  /** @var Shield\Databases\Scanner\Select $oSel */
141
  $oSel = $oDbh->getQuerySelector();
142
 
152
  * @return $this
153
  */
154
  public function resetNotifiedStatus() {
155
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
156
+ $oMod = $this->getMod();
157
+ $oDbh = $oMod->getDbHandler_ScanResults();
158
  /** @var Shield\Databases\Scanner\Select $oSel */
159
  $oSel = $oDbh->getQuerySelector();
160
 
173
  * @throws \Exception
174
  */
175
  public function executeItemAction( $sItemId, $sAction ) {
176
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
177
+ $oMod = $this->getMod();
178
+
179
  $bSuccess = false;
180
  if ( is_numeric( $sItemId ) ) {
181
  /** @var Shield\Databases\Scanner\EntryVO $oEntry */
182
+ $oEntry = $oMod->getDbHandler_ScanResults()
 
183
  ->getQuerySelector()
184
  ->byId( $sItemId );
185
  if ( empty( $oEntry ) ) {
280
  * @throws \Exception
281
  */
282
  protected function itemIgnore( $oItem ) {
283
+
284
  /** @var Shield\Databases\Scanner\EntryVO $oEntry */
285
  $oEntry = $this->getVoFromResultItem( $oItem );
286
  if ( empty( $oEntry ) ) {
287
  throw new \Exception( 'Item could not be found to ignore.' );
288
  }
289
 
290
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
291
+ $oMod = $this->getMod();
292
  /** @var Shield\Databases\Scanner\Update $oUp */
293
+ $oUp = $oMod->getDbHandler_ScanResults()->getQueryUpdater();
 
 
294
 
295
  if ( !$oUp->setIgnored( $oEntry ) ) {
296
  throw new \Exception( 'Item could not be ignored at this time.' );
316
  /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
317
  $oMod = $this->getMod();
318
  /** @var Shield\Databases\Scanner\Select $oSel */
319
+ $oSel = $oMod->getDbHandler_ScanResults()->getQuerySelector();
 
 
320
  /** @var Shield\Databases\Scanner\EntryVO[] $aRes */
321
  $aRes = $oSel->filterByScan( static::SCAN_SLUG )
322
  ->filterForCron( $oMod->getScanNotificationInterval() )
351
  * @param Shield\Databases\Scanner\EntryVO[] $aRes
352
  */
353
  private function updateLastNotifiedAt( $aRes ) {
354
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
355
+ $oMod = $this->getMod();
356
  /** @var Shield\Databases\Scanner\Update $oUpd */
357
+ $oUpd = $oMod->getDbHandler_ScanResults()->getQueryUpdater();
358
  foreach ( $aRes as $oVo ) {
359
  $oUpd->reset()
360
  ->setNotified( $oVo );
384
  * @return $this
385
  */
386
  public function resetScan() {
387
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
388
+ $oMod = $this->getMod();
389
  ( new Scan\Results\Clean() )
390
+ ->setDbHandler( $oMod->getDbHandler_ScanResults() )
391
  ->setScanActionVO( $this->getScanActionVO() )
392
  ->deleteAllForScan();
393
  return $this;
src/processors/hackprotect_scan_mal.php CHANGED
@@ -25,9 +25,9 @@ class ICWP_WPSF_Processor_HackProtect_Mal extends ICWP_WPSF_Processor_ScanBase {
25
  * @return bool
26
  */
27
  public function isEnabled() {
28
- /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oFO */
29
- $oFO = $this->getMod();
30
- return $oFO->isMalScanEnabled();
31
  }
32
 
33
  /**
@@ -43,7 +43,11 @@ class ICWP_WPSF_Processor_HackProtect_Mal extends ICWP_WPSF_Processor_ScanBase {
43
  * @throws \Exception
44
  */
45
  protected function itemRepair( $oItem ) {
46
- $bSuccess = $this->getRepairer()->repairItem( $oItem );
 
 
 
 
47
  $this->getCon()->fireEvent(
48
  static::SCAN_SLUG.'_item_repair_'.( $bSuccess ? 'success' : 'fail' ),
49
  [ 'audit' => [ 'fragment' => $oItem->path_fragment ] ]
@@ -56,17 +60,38 @@ class ICWP_WPSF_Processor_HackProtect_Mal extends ICWP_WPSF_Processor_ScanBase {
56
  * @return bool
57
  */
58
  protected function itemDelete( $oItem ) {
59
- return $this->getRepairer()->repairItemByDelete( $oItem );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  }
61
 
62
  /**
63
  * @param Shield\Scans\Mal\ResultsSet $oRes
64
  */
65
  protected function runCronAutoRepair( $oRes ) {
66
- /** @var ICWP_WPSF_FeatureHandler_HackProtect $oFO */
67
- $oFO = $this->getMod();
68
- if ( $oFO->isMalScanAutoRepair() ) {
69
  $this->getRepairer()
 
 
70
  ->repairResultsSet( $oRes );
71
  }
72
  }
@@ -113,6 +138,8 @@ class ICWP_WPSF_Processor_HackProtect_Mal extends ICWP_WPSF_Processor_ScanBase {
113
  private function buildEmailBodyFromFiles( $oResults ) {
114
  /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oFO */
115
  $oFO = $this->getMod();
 
 
116
  $sName = $this->getCon()->getHumanName();
117
  $sHomeUrl = Services::WpGeneral()->getHomeUrl();
118
 
@@ -124,18 +151,18 @@ class ICWP_WPSF_Processor_HackProtect_Mal extends ICWP_WPSF_Processor_ScanBase {
124
  sprintf( '%s: %s', __( 'Site URL', 'wp-simple-firewall' ), sprintf( '<a href="%s" target="_blank">%s</a>', $sHomeUrl, $sHomeUrl ) ),
125
  ];
126
 
127
- if ( $oFO->isMalScanAutoRepair() || $oFO->isIncludeFileLists() ) {
128
  $aContent = array_merge( $aContent, $this->buildListOfFilesForEmail( $oResults ) );
129
  $aContent[] = '';
130
 
131
- if ( $oFO->isMalScanAutoRepair() ) {
132
  $aContent[] = '<strong>'.sprintf( __( "%s has already attempted to repair the files.", 'wp-simple-firewall' ), $sName ).'</strong>'
133
  .' '.__( 'But, you should always check these files to ensure everything is as you expect.', 'wp-simple-firewall' );
134
  }
135
  else {
136
  $aContent[] = __( 'You should review these files and replace them with official versions if required.', 'wp-simple-firewall' );
137
  $aContent[] = __( 'Alternatively you can have the plugin attempt to repair/replace these files automatically.', 'wp-simple-firewall' )
138
- .' [<a href="https://icwp.io/moreinfochecksum">'.__( 'More Info', 'wp-simple-firewall' ).']</a>';
139
  }
140
  }
141
 
@@ -145,7 +172,7 @@ class ICWP_WPSF_Processor_HackProtect_Mal extends ICWP_WPSF_Processor_ScanBase {
145
 
146
  if ( !$this->getCon()->isRelabelled() ) {
147
  $aContent[] = '';
148
- $aContent[] = '[ <a href="https://icwp.io/moreinfochecksum">'.__( 'More Info On This Scanner', 'wp-simple-firewall' ).' ]</a>';
149
  }
150
 
151
  return $aContent;
25
  * @return bool
26
  */
27
  public function isEnabled() {
28
+ /** @var Shield\Modules\HackGuard\Options $oOpts */
29
+ $oOpts = $this->getOptions();
30
+ return $oOpts->isMalScanEnabled();
31
  }
32
 
33
  /**
43
  * @throws \Exception
44
  */
45
  protected function itemRepair( $oItem ) {
46
+ /** @var Shield\Scans\Mal\Repair $oRepair */
47
+ $oRepair = $this->getRepairer()
48
+ ->setIsManualAction( true );
49
+ $bSuccess = $oRepair->setAllowDelete( false )
50
+ ->repairItem( $oItem );
51
  $this->getCon()->fireEvent(
52
  static::SCAN_SLUG.'_item_repair_'.( $bSuccess ? 'success' : 'fail' ),
53
  [ 'audit' => [ 'fragment' => $oItem->path_fragment ] ]
60
  * @return bool
61
  */
62
  protected function itemDelete( $oItem ) {
63
+ /** @var Shield\Scans\Mal\Repair $oRepair */
64
+ $oRepair = $this->getRepairer()
65
+ ->setIsManualAction( true );
66
+ return $oRepair->setAllowDelete( true )
67
+ ->repairItem( $oItem );
68
+ }
69
+
70
+ /**
71
+ * @param Shield\Scans\Mal\ResultItem $oItem
72
+ * @return bool
73
+ * @throws \Exception
74
+ */
75
+ protected function itemIgnore( $oItem ) {
76
+ parent::itemIgnore( $oItem );
77
+
78
+ ( new Shield\Scans\Mal\Utilities\FalsePositiveReporter() )
79
+ ->setMod( $this->getMod() )
80
+ ->report( $oItem->path_full, 'sha1', true );
81
+
82
+ return true;
83
  }
84
 
85
  /**
86
  * @param Shield\Scans\Mal\ResultsSet $oRes
87
  */
88
  protected function runCronAutoRepair( $oRes ) {
89
+ /** @var Shield\Modules\HackGuard\Options $oOpts */
90
+ $oOpts = $this->getOptions();
91
+ if ( $oOpts->isMalAutoRepair() ) {
92
  $this->getRepairer()
93
+ ->setIsManualAction( false )
94
+ ->setAllowDelete( false )
95
  ->repairResultsSet( $oRes );
96
  }
97
  }
138
  private function buildEmailBodyFromFiles( $oResults ) {
139
  /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oFO */
140
  $oFO = $this->getMod();
141
+ /** @var Shield\Modules\HackGuard\Options $oOpts */
142
+ $oOpts = $this->getOptions();
143
  $sName = $this->getCon()->getHumanName();
144
  $sHomeUrl = Services::WpGeneral()->getHomeUrl();
145
 
151
  sprintf( '%s: %s', __( 'Site URL', 'wp-simple-firewall' ), sprintf( '<a href="%s" target="_blank">%s</a>', $sHomeUrl, $sHomeUrl ) ),
152
  ];
153
 
154
+ if ( $oOpts->isMalAutoRepair() || $oFO->isIncludeFileLists() ) {
155
  $aContent = array_merge( $aContent, $this->buildListOfFilesForEmail( $oResults ) );
156
  $aContent[] = '';
157
 
158
+ if ( $oOpts->isMalAutoRepair() ) {
159
  $aContent[] = '<strong>'.sprintf( __( "%s has already attempted to repair the files.", 'wp-simple-firewall' ), $sName ).'</strong>'
160
  .' '.__( 'But, you should always check these files to ensure everything is as you expect.', 'wp-simple-firewall' );
161
  }
162
  else {
163
  $aContent[] = __( 'You should review these files and replace them with official versions if required.', 'wp-simple-firewall' );
164
  $aContent[] = __( 'Alternatively you can have the plugin attempt to repair/replace these files automatically.', 'wp-simple-firewall' )
165
+ .' [<a href="https://icwp.io/moreinfochecksum">'.__( 'More Info', 'wp-simple-firewall' ).'</a>]';
166
  }
167
  }
168
 
172
 
173
  if ( !$this->getCon()->isRelabelled() ) {
174
  $aContent[] = '';
175
+ $aContent[] = '[ <a href="https://icwp.io/moreinfochecksum">'.__( 'More Info On This Scanner', 'wp-simple-firewall' ).'</a> ]';
176
  }
177
 
178
  return $aContent;
src/processors/hackprotect_scan_ptg.php CHANGED
@@ -362,15 +362,15 @@ class ICWP_WPSF_Processor_HackProtect_Ptg extends ICWP_WPSF_Processor_HackProtec
362
  * When initiating snapshots, we must clean old results before creating a clean snapshot
363
  */
364
  private function initSnapshots() {
365
- /** @var ICWP_WPSF_FeatureHandler_HackProtect $oFO */
366
- $oFO = $this->getMod();
367
 
368
- $bPluginsRebuildReqd = $oFO->isPtgBuildRequired() || !$this->getStore_Plugins()->getSnapStoreExists();
369
- $bThemesRebuildReqd = $oFO->isPtgBuildRequired() || !$this->getStore_Themes()->getSnapStoreExists();
370
 
371
  if ( $bPluginsRebuildReqd || $bThemesRebuildReqd ) {
372
  // grab all the existing results
373
- $oDbH = $this->getMod()->getDbHandler();
374
  /** @var Shield\Databases\Scanner\Select $oSel */
375
  $oSel = $oDbH->getQuerySelector();
376
  /** @var Shield\Databases\Scanner\EntryVO[] $aRes */
@@ -391,17 +391,17 @@ class ICWP_WPSF_Processor_HackProtect_Ptg extends ICWP_WPSF_Processor_HackProtec
391
  }
392
  }
393
 
394
- if ( $oFO->isPtgRebuildSelfRequired() ) {
395
  // rebuilt self when the plugin itself upgrades
396
  $this->updatePluginSnapshot( $this->getCon()->getPluginBaseFile() );
397
- $oFO->setPtgRebuildSelfRequired( false );
398
  }
399
 
400
- if ( $oFO->isPtgUpdateStoreFormat() ) {
401
  ( new Shield\Scans\Ptg\Snapshots\StoreFormatUpgrade() )
402
  ->setStore( $this->getStore_Plugins() )->run()
403
  ->setStore( $this->getStore_Themes() )->run();
404
- $oFO->setPtgUpdateStoreFormat( false );
405
  }
406
  }
407
 
362
  * When initiating snapshots, we must clean old results before creating a clean snapshot
363
  */
364
  private function initSnapshots() {
365
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
366
+ $oMod = $this->getMod();
367
 
368
+ $bPluginsRebuildReqd = $oMod->isPtgBuildRequired() || !$this->getStore_Plugins()->getSnapStoreExists();
369
+ $bThemesRebuildReqd = $oMod->isPtgBuildRequired() || !$this->getStore_Themes()->getSnapStoreExists();
370
 
371
  if ( $bPluginsRebuildReqd || $bThemesRebuildReqd ) {
372
  // grab all the existing results
373
+ $oDbH = $oMod->getDbHandler_ScanResults();
374
  /** @var Shield\Databases\Scanner\Select $oSel */
375
  $oSel = $oDbH->getQuerySelector();
376
  /** @var Shield\Databases\Scanner\EntryVO[] $aRes */
391
  }
392
  }
393
 
394
+ if ( $oMod->isPtgRebuildSelfRequired() ) {
395
  // rebuilt self when the plugin itself upgrades
396
  $this->updatePluginSnapshot( $this->getCon()->getPluginBaseFile() );
397
+ $oMod->setPtgRebuildSelfRequired( false );
398
  }
399
 
400
+ if ( $oMod->isPtgUpdateStoreFormat() ) {
401
  ( new Shield\Scans\Ptg\Snapshots\StoreFormatUpgrade() )
402
  ->setStore( $this->getStore_Plugins() )->run()
403
  ->setStore( $this->getStore_Themes() )->run();
404
+ $oMod->setPtgUpdateStoreFormat( false );
405
  }
406
  }
407
 
src/processors/hackprotect_scan_wcf.php CHANGED
@@ -109,7 +109,7 @@ class ICWP_WPSF_Processor_HackProtect_Wcf extends ICWP_WPSF_Processor_ScanBase {
109
  else {
110
  $aContent[] = __( 'You should review these files and replace them with official versions if required.', 'wp-simple-firewall' );
111
  $aContent[] = __( 'Alternatively you can have the plugin attempt to repair/replace these files automatically.', 'wp-simple-firewall' )
112
- .' [<a href="https://icwp.io/moreinfochecksum">'.__( 'More Info', 'wp-simple-firewall' ).']</a>';
113
  }
114
  }
115
 
@@ -119,7 +119,7 @@ class ICWP_WPSF_Processor_HackProtect_Wcf extends ICWP_WPSF_Processor_ScanBase {
119
 
120
  if ( !$this->getCon()->isRelabelled() ) {
121
  $aContent[] = '';
122
- $aContent[] = '[ <a href="https://icwp.io/moreinfochecksum">'.__( 'More Info On This Scanner', 'wp-simple-firewall' ).' ]</a>';
123
  }
124
 
125
  return $aContent;
109
  else {
110
  $aContent[] = __( 'You should review these files and replace them with official versions if required.', 'wp-simple-firewall' );
111
  $aContent[] = __( 'Alternatively you can have the plugin attempt to repair/replace these files automatically.', 'wp-simple-firewall' )
112
+ .' [<a href="https://icwp.io/moreinfochecksum">'.__( 'More Info', 'wp-simple-firewall' ).'</a>]';
113
  }
114
  }
115
 
119
 
120
  if ( !$this->getCon()->isRelabelled() ) {
121
  $aContent[] = '';
122
+ $aContent[] = '[ <a href="https://icwp.io/moreinfochecksum">'.__( 'More Info On This Scanner', 'wp-simple-firewall' ).'</a> ]';
123
  }
124
 
125
  return $aContent;
src/processors/hackprotect_scan_wpv.php CHANGED
@@ -285,10 +285,10 @@ class ICWP_WPSF_Processor_HackProtect_Wpv extends ICWP_WPSF_Processor_HackProtec
285
  * @return Shield\Scans\Wpv\ResultsSet
286
  */
287
  protected function getAllVulnerabilities() {
 
 
288
  /** @var Shield\Databases\Scanner\Select $oSel */
289
- $oSel = $this->getMod()
290
- ->getDbHandler()
291
- ->getQuerySelector();
292
  $aVos = $oSel->filterByScan( static::SCAN_SLUG )
293
  ->filterByNotIgnored()
294
  ->query();
285
  * @return Shield\Scans\Wpv\ResultsSet
286
  */
287
  protected function getAllVulnerabilities() {
288
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
289
+ $oMod = $this->getMod();
290
  /** @var Shield\Databases\Scanner\Select $oSel */
291
+ $oSel = $oMod->getDbHandler_ScanResults()->getQuerySelector();
 
 
292
  $aVos = $oSel->filterByScan( static::SCAN_SLUG )
293
  ->filterByNotIgnored()
294
  ->query();
src/processors/hackprotect_scanner.php CHANGED
@@ -133,9 +133,10 @@ class ICWP_WPSF_Processor_HackProtect_Scanner extends ShieldProcessor {
133
  * @param string $sItemId
134
  */
135
  public function downloadItemFile( $sItemId ) {
 
 
136
  /** @var Scanner\EntryVO $oEntry */
137
- $oEntry = $this->getMod()
138
- ->getDbHandler()
139
  ->getQuerySelector()
140
  ->byId( (int)$sItemId );
141
  if ( !empty( $oEntry ) ) {
@@ -183,7 +184,7 @@ class ICWP_WPSF_Processor_HackProtect_Scanner extends ShieldProcessor {
183
  */
184
  protected function getCronFrequency() {
185
  /** @var Shield\Modules\HackGuard\Options $oOpts */
186
- $oOpts = $this->getMod()->getOptions();
187
  return $oOpts->getScanFrequency();
188
  }
189
 
133
  * @param string $sItemId
134
  */
135
  public function downloadItemFile( $sItemId ) {
136
+ /** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
137
+ $oMod = $this->getMod();
138
  /** @var Scanner\EntryVO $oEntry */
139
+ $oEntry = $oMod->getDbHandler_ScanResults()
 
140
  ->getQuerySelector()
141
  ->byId( (int)$sItemId );
142
  if ( !empty( $oEntry ) ) {
184
  */
185
  protected function getCronFrequency() {
186
  /** @var Shield\Modules\HackGuard\Options $oOpts */
187
+ $oOpts = $this->getOptions();
188
  return $oOpts->getScanFrequency();
189
  }
190
 
src/processors/ips.php CHANGED
@@ -19,7 +19,7 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
19
 
20
  $oCon = $this->getCon();
21
  /** @var IPs\Options $oOpts */
22
- $oOpts = $this->getMod()->getOptions();
23
  if ( $oOpts->isEnabledAutoBlackList() ) {
24
  add_filter( $oCon->prefix( 'firewall_die_message' ), [ $this, 'fAugmentFirewallDieMessage' ] );
25
  add_action( $oCon->prefix( 'pre_plugin_shutdown' ), [ $this, 'doBlackMarkCurrentVisitor' ] );
@@ -127,7 +127,7 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
127
  */
128
  public function getRemainingTransgressions( $sIp = '' ) {
129
  /** @var IPs\Options $oOpts */
130
- $oOpts = $this->getMod()->getOptions();
131
  if ( empty( $sIp ) ) {
132
  $sIp = Services::IP()->getRequestIp();
133
  }
@@ -174,9 +174,7 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
174
  $this->setIfLogRequest( false ); // don't log traffic from killed requests
175
 
176
  /** @var Databases\IPs\Update $oUp */
177
- $oUp = $this->getMod()
178
- ->getDbHandler()
179
- ->getQueryUpdater();
180
  $oUp->updateLastAccessAt( $this->getAutoBlackListIp( $sIp ) );
181
 
182
  try {
@@ -227,7 +225,7 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
227
  $oMod->updateIpRequestAutoUnblockTs( $sIp );
228
 
229
  /** @var Databases\IPs\Delete $oDel */
230
- $oDel = $oMod->getDbHandler()->getQueryDeleter();
231
  $oDel->deleteIpFromBlacklists( $sIp );
232
  Services::Response()->redirectToHome();
233
  }
@@ -344,7 +342,7 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
344
  $nNewOffenses = min( $nLimit, $oBlackIp->transgressions + $nToIncrement );
345
 
346
  /** @var Databases\IPs\Update $oUp */
347
- $oUp = $oMod->getDbHandler()->getQueryUpdater();
348
  $oUp->updateTransgressions( $oBlackIp, $nNewOffenses );
349
 
350
  $oCon->fireEvent( $bBlock ? 'ip_blocked' : 'ip_offense',
@@ -372,8 +370,10 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
372
  * @return Databases\IPs\EntryVO[]
373
  */
374
  public function getWhitelistIpsData() {
 
 
375
  /** @var Databases\IPs\Select $oSelect */
376
- $oSelect = $this->getMod()->getDbHandler()->getQuerySelector();
377
  return $oSelect->allFromList( \ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_WHITE );
378
  }
379
 
@@ -402,7 +402,7 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
402
  */
403
  public function isIpToBeBlocked( $sIp ) {
404
  /** @var IPs\Options $oOpts */
405
- $oOpts = $this->getMod()->getOptions();
406
  $oIp = $this->getBlackListIp( $sIp );
407
  return ( $oIp instanceof Databases\IPs\EntryVO && $oIp->getTransgressions() >= $oOpts->getOffenseLimit() );
408
  }
@@ -415,8 +415,10 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
415
  private function isIpOnList( $sIp, $sList ) {
416
  $bOnList = false;
417
 
 
 
418
  /** @var Databases\IPs\Select $oSelect */
419
- $oSelect = $this->getMod()->getDbHandler()->getQuerySelector();
420
  foreach ( $oSelect->allFromList( $sList ) as $oIp ) {
421
  try {
422
  if ( Services::IP()->checkIp( $sIp, $oIp->ip ) ) {
@@ -456,7 +458,9 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
456
  * @return Databases\IPs\EntryVO|null
457
  */
458
  private function addIpToManualList( $sIp, $sList, $sLabel = '' ) {
459
- $oDbh = $this->getMod()->getDbHandler();
 
 
460
 
461
  /** @var Databases\IPs\Select $oSelect */
462
  $oSelect = $oDbh->getQuerySelector();
@@ -486,12 +490,12 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
486
  private function addIpToList( $sIp, $sList, $sLabel = '' ) {
487
  $oIp = null;
488
 
489
- /** @var ICWP_WPSF_FeatureHandler_Ips $oMod */
490
  $oMod = $this->getMod();
491
 
492
  // Never add a reserved IP to any black list
493
  if ( $sList == $oMod::LIST_MANUAL_WHITE || !in_array( $sIp, $oMod->getReservedIps() ) ) {
494
- $oDbh = $oMod->getDbHandler();
495
 
496
  // delete any previous old entries as we go.
497
  /** @var Databases\IPs\Delete $oDel */
@@ -521,12 +525,12 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
521
  * @return Databases\IPs\EntryVO|null
522
  */
523
  protected function getBlackListIp( $sIp ) {
524
- /** @var ICWP_WPSF_FeatureHandler_Ips $oMod */
525
  $oMod = $this->getMod();
526
  /** @var IPs\Options $oOpts */
527
  $oOpts = $oMod->getOptions();
528
  /** @var Databases\IPs\Select $oSelect */
529
- $oSelect = $oMod->getDbHandler()->getQuerySelector();
530
  /** @var Databases\IPs\EntryVO $oIp */
531
  $oIp = $oSelect->filterByIp( $sIp )
532
  ->filterByLists( [
@@ -544,17 +548,15 @@ class ICWP_WPSF_Processor_Ips extends ShieldProcessor {
544
  * @return Databases\IPs\EntryVO|null
545
  */
546
  protected function getAutoBlackListIp( $sIp ) {
547
- /** @var ICWP_WPSF_FeatureHandler_Ips $oMod */
548
  $oMod = $this->getMod();
549
  /** @var IPs\Options $oOpts */
550
  $oOpts = $oMod->getOptions();
551
  /** @var Databases\IPs\Select $oSelect */
552
- $oSelect = $oMod->getDbHandler()->getQuerySelector();
553
- /** @var Databases\IPs\EntryVO $oIp */
554
- $oIp = $oSelect->filterByIp( $sIp )
555
  ->filterByList( $oMod::LIST_AUTO_BLACK )
556
  ->filterByLastAccessAfter( Services::Request()->ts() - $oOpts->getAutoExpireTime() )
557
  ->first();
558
- return $oIp;
559
  }
560
  }
19
 
20
  $oCon = $this->getCon();
21
  /** @var IPs\Options $oOpts */
22
+ $oOpts = $this->getOptions();
23
  if ( $oOpts->isEnabledAutoBlackList() ) {
24
  add_filter( $oCon->prefix( 'firewall_die_message' ), [ $this, 'fAugmentFirewallDieMessage' ] );
25
  add_action( $oCon->prefix( 'pre_plugin_shutdown' ), [ $this, 'doBlackMarkCurrentVisitor' ] );
127
  */
128
  public function getRemainingTransgressions( $sIp = '' ) {
129
  /** @var IPs\Options $oOpts */
130
+ $oOpts = $this->getOptions();
131
  if ( empty( $sIp ) ) {
132
  $sIp = Services::IP()->getRequestIp();
133
  }
174
  $this->setIfLogRequest( false ); // don't log traffic from killed requests
175
 
176
  /** @var Databases\IPs\Update $oUp */
177
+ $oUp = $oMod->getDbHandler_IPs()->getQueryUpdater();
 
 
178
  $oUp->updateLastAccessAt( $this->getAutoBlackListIp( $sIp ) );
179
 
180
  try {
225
  $oMod->updateIpRequestAutoUnblockTs( $sIp );
226
 
227
  /** @var Databases\IPs\Delete $oDel */
228
+ $oDel = $oMod->getDbHandler_IPs()->getQueryDeleter();
229
  $oDel->deleteIpFromBlacklists( $sIp );
230
  Services::Response()->redirectToHome();
231
  }
342
  $nNewOffenses = min( $nLimit, $oBlackIp->transgressions + $nToIncrement );
343
 
344
  /** @var Databases\IPs\Update $oUp */
345
+ $oUp = $oMod->getDbHandler_IPs()->getQueryUpdater();
346
  $oUp->updateTransgressions( $oBlackIp, $nNewOffenses );
347
 
348
  $oCon->fireEvent( $bBlock ? 'ip_blocked' : 'ip_offense',
370
  * @return Databases\IPs\EntryVO[]
371
  */
372
  public function getWhitelistIpsData() {
373
+ /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
374
+ $oMod = $this->getMod();
375
  /** @var Databases\IPs\Select $oSelect */
376
+ $oSelect = $oMod->getDbHandler_IPs()->getQuerySelector();
377
  return $oSelect->allFromList( \ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_WHITE );
378
  }
379
 
402
  */
403
  public function isIpToBeBlocked( $sIp ) {
404
  /** @var IPs\Options $oOpts */
405
+ $oOpts = $this->getOptions();
406
  $oIp = $this->getBlackListIp( $sIp );
407
  return ( $oIp instanceof Databases\IPs\EntryVO && $oIp->getTransgressions() >= $oOpts->getOffenseLimit() );
408
  }
415
  private function isIpOnList( $sIp, $sList ) {
416
  $bOnList = false;
417
 
418
+ /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
419
+ $oMod = $this->getMod();
420
  /** @var Databases\IPs\Select $oSelect */
421
+ $oSelect = $oMod->getDbHandler_IPs()->getQuerySelector();
422
  foreach ( $oSelect->allFromList( $sList ) as $oIp ) {
423
  try {
424
  if ( Services::IP()->checkIp( $sIp, $oIp->ip ) ) {
458
  * @return Databases\IPs\EntryVO|null
459
  */
460
  private function addIpToManualList( $sIp, $sList, $sLabel = '' ) {
461
+ /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
462
+ $oMod = $this->getMod();
463
+ $oDbh = $oMod->getDbHandler_IPs();
464
 
465
  /** @var Databases\IPs\Select $oSelect */
466
  $oSelect = $oDbh->getQuerySelector();
490
  private function addIpToList( $sIp, $sList, $sLabel = '' ) {
491
  $oIp = null;
492
 
493
+ /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
494
  $oMod = $this->getMod();
495
 
496
  // Never add a reserved IP to any black list
497
  if ( $sList == $oMod::LIST_MANUAL_WHITE || !in_array( $sIp, $oMod->getReservedIps() ) ) {
498
+ $oDbh = $oMod->getDbHandler_IPs();
499
 
500
  // delete any previous old entries as we go.
501
  /** @var Databases\IPs\Delete $oDel */
525
  * @return Databases\IPs\EntryVO|null
526
  */
527
  protected function getBlackListIp( $sIp ) {
528
+ /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
529
  $oMod = $this->getMod();
530
  /** @var IPs\Options $oOpts */
531
  $oOpts = $oMod->getOptions();
532
  /** @var Databases\IPs\Select $oSelect */
533
+ $oSelect = $oMod->getDbHandler_IPs()->getQuerySelector();
534
  /** @var Databases\IPs\EntryVO $oIp */
535
  $oIp = $oSelect->filterByIp( $sIp )
536
  ->filterByLists( [
548
  * @return Databases\IPs\EntryVO|null
549
  */
550
  protected function getAutoBlackListIp( $sIp ) {
551
+ /** @var \ICWP_WPSF_FeatureHandler_Ips $oMod */
552
  $oMod = $this->getMod();
553
  /** @var IPs\Options $oOpts */
554
  $oOpts = $oMod->getOptions();
555
  /** @var Databases\IPs\Select $oSelect */
556
+ $oSelect = $oMod->getDbHandler_IPs()->getQuerySelector();
557
+ return $oSelect->filterByIp( $sIp )
 
558
  ->filterByList( $oMod::LIST_AUTO_BLACK )
559
  ->filterByLastAccessAfter( Services::Request()->ts() - $oOpts->getAutoExpireTime() )
560
  ->first();
 
561
  }
562
  }
src/processors/login_protect.php CHANGED
@@ -10,6 +10,8 @@ class ICWP_WPSF_Processor_LoginProtect extends Modules\BaseShield\ShieldProcesso
10
  public function run() {
11
  /** @var \ICWP_WPSF_FeatureHandler_LoginProtect $oMod */
12
  $oMod = $this->getMod();
 
 
13
 
14
  // XML-RPC Compatibility
15
  if ( Services::WpGeneral()->isXmlrpc() && $oMod->isXmlrpcBypass() ) {
@@ -26,8 +28,15 @@ class ICWP_WPSF_Processor_LoginProtect extends Modules\BaseShield\ShieldProcesso
26
  $this->getSubProGasp()->execute();
27
  }
28
 
29
- if ( $oMod->isCooldownEnabled() && Services::Request()->isPost() ) {
30
- $this->getSubProCooldown()->execute();
 
 
 
 
 
 
 
31
  }
32
 
33
  if ( $oMod->isGoogleRecaptchaEnabled() ) {
10
  public function run() {
11
  /** @var \ICWP_WPSF_FeatureHandler_LoginProtect $oMod */
12
  $oMod = $this->getMod();
13
+ /** @var Modules\LoginGuard\Options $oOpts */
14
+ $oOpts = $this->getOptions();
15
 
16
  // XML-RPC Compatibility
17
  if ( Services::WpGeneral()->isXmlrpc() && $oMod->isXmlrpcBypass() ) {
28
  $this->getSubProGasp()->execute();
29
  }
30
 
31
+ if ( $oOpts->isCooldownEnabled() ) {
32
+ if ( Services::Request()->isPost() ) {
33
+ $this->getSubProCooldown()->execute();
34
+ }
35
+ /*
36
+ ( new Modules\LoginGuard\Lib\CooldownRedirect() )
37
+ ->setMod( $oMod )
38
+ ->run();
39
+ */
40
  }
41
 
42
  if ( $oMod->isGoogleRecaptchaEnabled() ) {
src/processors/loginprotect_cooldown.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- use FernleafSystems\Wordpress\Services\Services;
4
 
5
  class ICWP_WPSF_Processor_LoginProtect_Cooldown extends ICWP_WPSF_Processor_LoginProtect_Base {
6
 
@@ -8,8 +8,6 @@ class ICWP_WPSF_Processor_LoginProtect_Cooldown extends ICWP_WPSF_Processor_Logi
8
  * @throws \Exception
9
  */
10
  protected function performCheckWithException() {
11
- /** @var ICWP_WPSF_FeatureHandler_LoginProtect $oFO */
12
- $oFO = $this->getMod();
13
 
14
  if ( !$this->isFactorTested() ) {
15
  $this->setFactorTested( true );
@@ -17,12 +15,12 @@ class ICWP_WPSF_Processor_LoginProtect_Cooldown extends ICWP_WPSF_Processor_Logi
17
  // At this point someone has attempted to login within the previous login wait interval
18
  // So we remove WordPress's authentication filter and our own user check authentication
19
  // And finally return a WP_Error which will be reflected back to the user.
20
- $nRemaining = $oFO->getCooldownInterval() - $this->getSecondsSinceLastLogin();
21
- if ( $nRemaining > 0 ) {
22
  $sErrorString = __( "Request Cooldown in effect.", 'wp-simple-firewall' ).' '
23
  .sprintf(
24
  __( "You must wait %s seconds before attempting this action again.", 'wp-simple-firewall' ),
25
- $nRemaining
26
  );
27
 
28
  $this->getCon()->fireEvent( 'cooldown_fail' );
@@ -30,32 +28,7 @@ class ICWP_WPSF_Processor_LoginProtect_Cooldown extends ICWP_WPSF_Processor_Logi
30
  throw new \Exception( $sErrorString );
31
  }
32
 
33
- $this->updateLastLoginTime();
34
  }
35
  }
36
-
37
- /**
38
- * @return int
39
- */
40
- private function getSecondsSinceLastLogin() {
41
- $sFile = $this->getLastLoginTimeFilePath();
42
- $nLastLogin = Services::WpFs()->exists( $sFile ) ? filemtime( $sFile ) : 0;
43
- return ( Services::Request()->ts() - $nLastLogin );
44
- }
45
-
46
- /**
47
- * @return string
48
- */
49
- private function getLastLoginTimeFilePath() {
50
- return path_join( $this->getCon()->getRootDir(), 'mode.login_throttled' );
51
- }
52
-
53
- /**
54
- * @return $this
55
- */
56
- private function updateLastLoginTime() {
57
- Services::WpFs()->deleteFile( $this->getLastLoginTimeFilePath() );
58
- Services::WpFs()->touch( $this->getLastLoginTimeFilePath(), Services::Request()->ts() );
59
- return $this;
60
- }
61
  }
1
  <?php
2
 
3
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\LoginGuard;
4
 
5
  class ICWP_WPSF_Processor_LoginProtect_Cooldown extends ICWP_WPSF_Processor_LoginProtect_Base {
6
 
8
  * @throws \Exception
9
  */
10
  protected function performCheckWithException() {
 
 
11
 
12
  if ( !$this->isFactorTested() ) {
13
  $this->setFactorTested( true );
15
  // At this point someone has attempted to login within the previous login wait interval
16
  // So we remove WordPress's authentication filter and our own user check authentication
17
  // And finally return a WP_Error which will be reflected back to the user.
18
+ $oCooldownFlag = ( new LoginGuard\Lib\CooldownFlagFile() )->setMod( $this->getMod() );
19
+ if ( $oCooldownFlag->isWithinCooldownPeriod() ) {
20
  $sErrorString = __( "Request Cooldown in effect.", 'wp-simple-firewall' ).' '
21
  .sprintf(
22
  __( "You must wait %s seconds before attempting this action again.", 'wp-simple-firewall' ),
23
+ $oCooldownFlag->getCooldownRemaining()
24
  );
25
 
26
  $this->getCon()->fireEvent( 'cooldown_fail' );
28
  throw new \Exception( $sErrorString );
29
  }
30
 
31
+ $oCooldownFlag->updateCooldownFlag();
32
  }
33
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  }
src/processors/loginprotect_googlerecaptcha.php CHANGED
@@ -17,14 +17,11 @@ class ICWP_WPSF_Processor_LoginProtect_GoogleRecaptcha extends ICWP_WPSF_Process
17
  * @throws \Exception
18
  */
19
  protected function performCheckWithException() {
20
- /** @var ICWP_WPSF_FeatureHandler_BaseWpsf $oFO */
21
- $oFO = $this->getMod();
22
-
23
  if ( !$this->isFactorTested() ) {
24
  $this->setFactorTested( true );
25
  try {
26
  ( new Shield\Utilities\ReCaptcha\TestRequest() )
27
- ->setMod( $oFO )
28
  ->test();
29
  }
30
  catch ( \Exception $oE ) {
17
  * @throws \Exception
18
  */
19
  protected function performCheckWithException() {
 
 
 
20
  if ( !$this->isFactorTested() ) {
21
  $this->setFactorTested( true );
22
  try {
23
  ( new Shield\Utilities\ReCaptcha\TestRequest() )
24
+ ->setMod( $this->getMod() )
25
  ->test();
26
  }
27
  catch ( \Exception $oE ) {
src/processors/sessions.php CHANGED
@@ -52,13 +52,14 @@ class ICWP_WPSF_Processor_Sessions extends Modules\BaseShield\ShieldProcessor {
52
  }
53
 
54
  public function onModuleShutdown() {
 
 
 
55
  if ( !Services::Rest()->isRest() ) {
56
  $oSession = $this->getCurrentSession();
57
- if ( $oSession instanceof Session\EntryVO) {
58
  /** @var Session\Update $oUpd */
59
- $oUpd = $this->getMod()
60
- ->getDbHandler()
61
- ->getQueryUpdater();
62
  $oUpd->updateLastActivity( $this->getCurrentSession() );
63
  }
64
  }
@@ -131,9 +132,10 @@ class ICWP_WPSF_Processor_Sessions extends Modules\BaseShield\ShieldProcessor {
131
  * @return bool
132
  */
133
  public function terminateSession( $nSessionId ) {
 
 
134
  $this->getCon()->fireEvent( 'session_terminate' );
135
- return $this->getMod()
136
- ->getDbHandler()
137
  ->getQueryDeleter()
138
  ->deleteById( $nSessionId );
139
  }
@@ -195,10 +197,10 @@ class ICWP_WPSF_Processor_Sessions extends Modules\BaseShield\ShieldProcessor {
195
 
196
  $this->getCon()->fireEvent( 'session_start' );
197
 
 
 
198
  /** @var Session\Insert $oInsert */
199
- $oInsert = $this->getMod()
200
- ->getDbHandler()
201
- ->getQueryInserter();
202
  return $oInsert->create( $sSessionId, $sUsername );
203
  }
204
 
@@ -209,10 +211,10 @@ class ICWP_WPSF_Processor_Sessions extends Modules\BaseShield\ShieldProcessor {
209
  * @return Session\EntryVO|null
210
  */
211
  private function queryGetSession( $sSessionId, $sUsername = '' ) {
 
 
212
  /** @var Session\Select $oSel */
213
- $oSel = $this->getMod()
214
- ->getDbHandler()
215
- ->getQuerySelector();
216
  return $oSel->retrieveUserSession( $sSessionId, $sUsername );
217
  }
218
  }
52
  }
53
 
54
  public function onModuleShutdown() {
55
+ /** @var \ICWP_WPSF_FeatureHandler_Sessions $oMod */
56
+ $oMod = $this->getMod();
57
+
58
  if ( !Services::Rest()->isRest() ) {
59
  $oSession = $this->getCurrentSession();
60
+ if ( $oSession instanceof Session\EntryVO ) {
61
  /** @var Session\Update $oUpd */
62
+ $oUpd = $oMod->getDbHandler_Sessions()->getQueryUpdater();
 
 
63
  $oUpd->updateLastActivity( $this->getCurrentSession() );
64
  }
65
  }
132
  * @return bool
133
  */
134
  public function terminateSession( $nSessionId ) {
135
+ /** @var \ICWP_WPSF_FeatureHandler_Sessions $oMod */
136
+ $oMod = $this->getMod();
137
  $this->getCon()->fireEvent( 'session_terminate' );
138
+ return $oMod->getDbHandler_Sessions()
 
139
  ->getQueryDeleter()
140
  ->deleteById( $nSessionId );
141
  }
197
 
198
  $this->getCon()->fireEvent( 'session_start' );
199
 
200
+ /** @var \ICWP_WPSF_FeatureHandler_Sessions $oMod */
201
+ $oMod = $this->getMod();
202
  /** @var Session\Insert $oInsert */
203
+ $oInsert = $oMod->getDbHandler_Sessions()->getQueryInserter();
 
 
204
  return $oInsert->create( $sSessionId, $sUsername );
205
  }
206
 
211
  * @return Session\EntryVO|null
212
  */
213
  private function queryGetSession( $sSessionId, $sUsername = '' ) {
214
+ /** @var \ICWP_WPSF_FeatureHandler_Sessions $oMod */
215
+ $oMod = $this->getMod();
216
  /** @var Session\Select $oSel */
217
+ $oSel = $oMod->getDbHandler_Sessions()->getQuerySelector();
 
 
218
  return $oSel->retrieveUserSession( $sSessionId, $sUsername );
219
  }
220
  }
src/processors/traffic.php CHANGED
@@ -16,7 +16,7 @@ class ICWP_WPSF_Processor_Traffic extends Modules\BaseShield\ShieldProcessor {
16
  */
17
  public function onWpInit() {
18
  /** @var Modules\Traffic\Options $oOpts */
19
- $oOpts = $this->getMod()->getOptions();
20
  if ( false && $oOpts->isTrafficLimitEnabled() ) {
21
  ( new Modules\Traffic\Limiter\Limiter() )
22
  ->setMod( $this->getMod() )
16
  */
17
  public function onWpInit() {
18
  /** @var Modules\Traffic\Options $oOpts */
19
+ $oOpts = $this->getOptions();
20
  if ( false && $oOpts->isTrafficLimitEnabled() ) {
21
  ( new Modules\Traffic\Limiter\Limiter() )
22
  ->setMod( $this->getMod() )
src/processors/traffic_logger.php CHANGED
@@ -21,7 +21,7 @@ class ICWP_WPSF_Processor_TrafficLogger extends ShieldProcessor {
21
  /** @var ICWP_WPSF_FeatureHandler_Traffic $oMod */
22
  $oMod = $this->getMod();
23
  /** @var Options $oOpts */
24
- $oOpts = $this->getMod()->getOptions();
25
  $oWp = Services::WpGeneral();
26
  $bLoggedIn = Services::WpUsers()->isUserLoggedIn();
27
  return parent::getIfLogRequest()
@@ -96,7 +96,7 @@ class ICWP_WPSF_Processor_TrafficLogger extends ShieldProcessor {
96
  $oMod = $this->getMod();
97
  $oReq = Services::Request();
98
  /** @var Traffic\Handler $oDbh */
99
- $oDbh = $oMod->getDbHandler();
100
 
101
  // For multisites that are separated by sub-domains we also show the host.
102
  $sLeadingPath = Services::WpGeneral()->isMultisite_SubdomainInstall() ? $oReq->getHost() : '';
21
  /** @var ICWP_WPSF_FeatureHandler_Traffic $oMod */
22
  $oMod = $this->getMod();
23
  /** @var Options $oOpts */
24
+ $oOpts = $this->getOptions();
25
  $oWp = Services::WpGeneral();
26
  $bLoggedIn = Services::WpUsers()->isUserLoggedIn();
27
  return parent::getIfLogRequest()
96
  $oMod = $this->getMod();
97
  $oReq = Services::Request();
98
  /** @var Traffic\Handler $oDbh */
99
+ $oDbh = $oMod->getDbHandler_Traffic();
100
 
101
  // For multisites that are separated by sub-domains we also show the host.
102
  $sLeadingPath = Services::WpGeneral()->isMultisite_SubdomainInstall() ? $oReq->getHost() : '';
src/processors/usermanagement_passwords.php CHANGED
@@ -49,7 +49,7 @@ class ICWP_WPSF_Processor_UserManagement_Passwords extends Modules\BaseShield\Sh
49
  $bFailed = false;
50
  }
51
  catch ( \Exception $oE ) {
52
- $bFailed = true;
53
  }
54
  $this->setPasswordFailedFlag( $oUser, $bFailed );
55
  }
@@ -158,11 +158,18 @@ class ICWP_WPSF_Processor_UserManagement_Passwords extends Modules\BaseShield\Sh
158
  if ( !empty( $sPassword ) ) {
159
  try {
160
  $this->applyPasswordChecks( $sPassword );
 
 
 
 
 
 
 
161
  if ( Services::WpUsers()->isUserLoggedIn() ) {
162
  $this->getCon()->getCurrentUserMeta()->pass_check_failed_at = 0;
163
  }
164
  }
165
- catch ( \Exception $oE ) {
166
  $sMessage = __( 'Your security administrator has imposed requirements for password quality.', 'wp-simple-firewall' )
167
  .'<br/>'.sprintf( __( 'Reason', 'wp-simple-firewall' ).': '.$oE->getMessage() );
168
  $oErrors->add( 'shield_password_policy', $sMessage );
@@ -251,6 +258,7 @@ class ICWP_WPSF_Processor_UserManagement_Passwords extends Modules\BaseShield\Sh
251
  * @param string $sPass
252
  * @return bool
253
  * @throws \Exception
 
254
  */
255
  protected function sendRequestToPwned( $sPass ) {
256
  $oHttpReq = Services::HttpRequest();
@@ -306,7 +314,7 @@ class ICWP_WPSF_Processor_UserManagement_Passwords extends Modules\BaseShield\Sh
306
  * @return bool
307
  * @throws \Exception
308
  */
309
- protected function sendRequestToPwnedRange( $sPass ) {
310
  $oHttpReq = Services::HttpRequest();
311
 
312
  $sPassHash = strtoupper( hash( 'sha1', $sPass ) );
@@ -320,42 +328,48 @@ class ICWP_WPSF_Processor_UserManagement_Passwords extends Modules\BaseShield\Sh
320
  );
321
 
322
  $sError = '';
 
323
  if ( !$bSuccess ) {
324
  $sError = 'API request failed';
 
325
  }
326
  else {
327
- $nCode = $oHttpReq->lastResponse->getCode();
328
- if ( empty( $nCode ) ) {
329
  $sError = 'Unexpected Error: No response code available from the Pwned API';
330
  }
331
- else if ( $nCode != 200 ) {
332
  $sError = 'Unexpected Error: The response from the Pwned API was unexpected';
333
  }
334
  else if ( empty( $oHttpReq->lastResponse->body ) ) {
335
  $sError = 'Unexpected Error: The response from the Pwned API was empty';
336
  }
337
  else {
338
- $nCount = 0;
339
  foreach ( array_map( 'trim', explode( "\n", trim( $oHttpReq->lastResponse->body ) ) ) as $sRow ) {
340
  if ( $sSubHash.substr( strtoupper( $sRow ), 0, 35 ) == $sPassHash ) {
341
- $nCount = substr( $sRow, 36 );
342
  break;
343
  }
344
  }
345
- if ( $nCount > 0 ) {
346
  $sError = __( 'Please use a different password.', 'wp-simple-firewall' )
347
  .'<br/>'.__( 'This password has been pwned.', 'wp-simple-firewall' )
348
  .' '.sprintf(
349
  '(<a href="%s" target="_blank">%s</a>)',
350
  'https://www.troyhunt.com/ive-just-launched-pwned-passwords-version-2/',
351
- sprintf( __( '%s times', 'wp-simple-firewall' ), $nCount )
352
  );
353
  }
 
 
 
 
354
  }
355
  }
356
 
357
- if ( !empty( $sError ) ) {
358
- throw new \Exception( '[Pwned Request] '.$sError );
359
  }
360
 
361
  return true;
49
  $bFailed = false;
50
  }
51
  catch ( \Exception $oE ) {
52
+ $bFailed = ( $oE->getCode() != 999 ); // We don't fail when the PWNED API is not available.
53
  }
54
  $this->setPasswordFailedFlag( $oUser, $bFailed );
55
  }
158
  if ( !empty( $sPassword ) ) {
159
  try {
160
  $this->applyPasswordChecks( $sPassword );
161
+ $bChecksPassed = true;
162
+ }
163
+ catch ( \Exception $oE ) {
164
+ $bChecksPassed = ( $oE->getCode() === 999 );
165
+ }
166
+
167
+ if ( $bChecksPassed ) {
168
  if ( Services::WpUsers()->isUserLoggedIn() ) {
169
  $this->getCon()->getCurrentUserMeta()->pass_check_failed_at = 0;
170
  }
171
  }
172
+ else {
173
  $sMessage = __( 'Your security administrator has imposed requirements for password quality.', 'wp-simple-firewall' )
174
  .'<br/>'.sprintf( __( 'Reason', 'wp-simple-firewall' ).': '.$oE->getMessage() );
175
  $oErrors->add( 'shield_password_policy', $sMessage );
258
  * @param string $sPass
259
  * @return bool
260
  * @throws \Exception
261
+ * @deprecated 8.1.2
262
  */
263
  protected function sendRequestToPwned( $sPass ) {
264
  $oHttpReq = Services::HttpRequest();
314
  * @return bool
315
  * @throws \Exception
316
  */
317
+ private function sendRequestToPwnedRange( $sPass ) {
318
  $oHttpReq = Services::HttpRequest();
319
 
320
  $sPassHash = strtoupper( hash( 'sha1', $sPass ) );
328
  );
329
 
330
  $sError = '';
331
+ $nErrorCode = 2; // Default To Error
332
  if ( !$bSuccess ) {
333
  $sError = 'API request failed';
334
+ $nErrorCode = 999; // We don't fail PWNED passwords on failed API requests.
335
  }
336
  else {
337
+ $nHttpCode = $oHttpReq->lastResponse->getCode();
338
+ if ( empty( $nHttpCode ) ) {
339
  $sError = 'Unexpected Error: No response code available from the Pwned API';
340
  }
341
+ else if ( $nHttpCode != 200 ) {
342
  $sError = 'Unexpected Error: The response from the Pwned API was unexpected';
343
  }
344
  else if ( empty( $oHttpReq->lastResponse->body ) ) {
345
  $sError = 'Unexpected Error: The response from the Pwned API was empty';
346
  }
347
  else {
348
+ $nPwnedCount = 0;
349
  foreach ( array_map( 'trim', explode( "\n", trim( $oHttpReq->lastResponse->body ) ) ) as $sRow ) {
350
  if ( $sSubHash.substr( strtoupper( $sRow ), 0, 35 ) == $sPassHash ) {
351
+ $nPwnedCount = substr( $sRow, 36 );
352
  break;
353
  }
354
  }
355
+ if ( $nPwnedCount > 0 ) {
356
  $sError = __( 'Please use a different password.', 'wp-simple-firewall' )
357
  .'<br/>'.__( 'This password has been pwned.', 'wp-simple-firewall' )
358
  .' '.sprintf(
359
  '(<a href="%s" target="_blank">%s</a>)',
360
  'https://www.troyhunt.com/ive-just-launched-pwned-passwords-version-2/',
361
+ sprintf( __( '%s times', 'wp-simple-firewall' ), $nPwnedCount )
362
  );
363
  }
364
+ else {
365
+ // Success: Password is not pwned
366
+ $nErrorCode = 0;
367
+ }
368
  }
369
  }
370
 
371
+ if ( $nErrorCode != 0 ) {
372
+ throw new \Exception( '[Pwned Request] '.$sError, $nErrorCode );
373
  }
374
 
375
  return true;
src/wizards/plugin.php CHANGED
@@ -1,5 +1,6 @@
1
  <?php
2
 
 
3
  use FernleafSystems\Wordpress\Services\Services;
4
 
5
  /**
@@ -566,6 +567,8 @@ class ICWP_WPSF_Wizard_Plugin extends ICWP_WPSF_Wizard_BaseWpsf {
566
  private function wizardOptin() {
567
  $oReq = Services::Request();
568
  $oMod = $this->getCon()->getModule_Plugin();
 
 
569
 
570
  $bSuccess = false;
571
  $sMessage = __( 'No changes were made as no option was selected', 'wp-simple-firewall' );
@@ -586,7 +589,7 @@ class ICWP_WPSF_Wizard_Plugin extends ICWP_WPSF_Wizard_BaseWpsf {
586
 
587
  if ( !empty( $sInput ) ) {
588
  $bEnabled = $sInput === 'Y';
589
- $oMod->setPluginTrackingPermission( $bEnabled );
590
  $bSuccess = true;
591
  $sMessage = __( 'Preferences have been saved.', 'wp-simple-firewall' );
592
  }
@@ -646,8 +649,9 @@ class ICWP_WPSF_Wizard_Plugin extends ICWP_WPSF_Wizard_BaseWpsf {
646
  private function wizardConfirmDelete() {
647
  $bDelete = Services::Request()->post( 'ConfirmDelete' ) === 'Y';
648
  if ( $bDelete ) {
649
- $oMod = $this->getCon()->getModule_AuditTrail();
650
- $oDeleter = $oMod->getDbHandler()
 
651
  ->getQueryDeleter();
652
  foreach ( $this->getGdprSearchItems() as $sItem ) {
653
  $oDeleter->reset()
@@ -737,8 +741,9 @@ class ICWP_WPSF_Wizard_Plugin extends ICWP_WPSF_Wizard_BaseWpsf {
737
  * @return array[]
738
  */
739
  private function runGdprSearch() {
740
- $oMod = $this->getCon()->getModule_AuditTrail();
741
- $oFinder = $oMod->getDbHandler()
 
742
  ->getQuerySelector()
743
  ->setResultsAsVo( false );
744
 
1
  <?php
2
 
3
+ use FernleafSystems\Wordpress\Plugin\Shield\Modules\Plugin;
4
  use FernleafSystems\Wordpress\Services\Services;
5
 
6
  /**
567
  private function wizardOptin() {
568
  $oReq = Services::Request();
569
  $oMod = $this->getCon()->getModule_Plugin();
570
+ /** @var Plugin\Options $oOpts */
571
+ $oOpts = $this->getOptions();
572
 
573
  $bSuccess = false;
574
  $sMessage = __( 'No changes were made as no option was selected', 'wp-simple-firewall' );
589
 
590
  if ( !empty( $sInput ) ) {
591
  $bEnabled = $sInput === 'Y';
592
+ $oOpts->setPluginTrackingPermission( $bEnabled );
593
  $bSuccess = true;
594
  $sMessage = __( 'Preferences have been saved.', 'wp-simple-firewall' );
595
  }
649
  private function wizardConfirmDelete() {
650
  $bDelete = Services::Request()->post( 'ConfirmDelete' ) === 'Y';
651
  if ( $bDelete ) {
652
+ $oDeleter = $this->getCon()
653
+ ->getModule_AuditTrail()
654
+ ->getDbHandler_AuditTrail()
655
  ->getQueryDeleter();
656
  foreach ( $this->getGdprSearchItems() as $sItem ) {
657
  $oDeleter->reset()
741
  * @return array[]
742
  */
743
  private function runGdprSearch() {
744
+ $oFinder = $this->getCon()
745
+ ->getModule_AuditTrail()
746
+ ->getDbHandler_AuditTrail()
747
  ->getQuerySelector()
748
  ->setResultsAsVo( false );
749
 
templates/twig/snippets/cooldown_login_block.twig ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h3 style="text-align: center;">{{ strings.title|raw }}</h3>
2
+ <ul>
3
+ {% for line in strings.lines %}
4
+ <li>{{ line }}</li>
5
+ {% endfor %}
6
+ </ul>
7
+ <p>{{ strings.time_remaining }}: <span id="TimeRemaining">{{ vars.remaining }}</span></p>
8
+ <script type="text/javascript">
9
+ var nRemaining = {{ vars.remaining }};
10
+
11
+ var timeout = function () {
12
+ nRemaining--;
13
+ if ( nRemaining < 1 ) {
14
+ location.reload();
15
+ }
16
+ else {
17
+ document.getElementById( 'TimeRemaining' ).innerHTML = nRemaining;
18
+ }
19
+
20
+ setTimeout( timeout, 1000 );
21
+ };
22
+ timeout();
23
+ </script>
24
+ <style>
25
+ p {
26
+ margin: 10px 0 !important;
27
+ }
28
+ </style>
29
+ <div style="">
30
+ <form method="get" action="{{ vars.login_url }}">
31
+ <p><label>
32
+ <input type="checkbox" name="cooldown_bypass" value="1" />
33
+ {{ strings.understand }}
34
+ </label></p>
35
+ <p><button type="submit">{{ strings.button }}</button></p>
36
+ </form>
37
+ </div>
templates/twig/wpadmin_pages/base.twig CHANGED
@@ -31,12 +31,12 @@
31
  <div id="FooterWizardBanner" class="container-fluid">
32
  <div id="WizardBanner" class="row">
33
  <div class="col-xl-5 offset-xl-1 col-6">
34
- <h6 class="text-left">Join The 1,000s Who've Already Taken Their Security Pro</h6>
35
- <p>Deeper, Automated Scans; Traffic Watcher; Better 2FA; Email Support +much, much more.</p>
36
  </div>
37
  <div class="offset-1 col-3">
38
  <a href="{{ hrefs.go_pro }}" target="_blank" class="btn btn-success">
39
- Get More Protection &rarr;</a>
40
  </div>
41
  </div>
42
  </div>
31
  <div id="FooterWizardBanner" class="container-fluid">
32
  <div id="WizardBanner" class="row">
33
  <div class="col-xl-5 offset-xl-1 col-6">
34
+ <h6 class="text-left">{{ strings.join_thousands_H }}</h6>
35
+ <p>{{ strings.pro_features }}: {{ strings.join_thousands_P }}</p>
36
  </div>
37
  <div class="offset-1 col-3">
38
  <a href="{{ hrefs.go_pro }}" target="_blank" class="btn btn-success">
39
+ {{ strings.get_pro_protection }} &rarr;</a>
40
  </div>
41
  </div>
42
  </div>
templates/twig/wpadmin_pages/insights/audit/audit_table.twig CHANGED
@@ -71,12 +71,12 @@
71
  <label class="form-label" for="_fDateFrom" title="{{ strings.show_after }}...">
72
  {{ strings.time_since }}:</label>
73
  <input type="text" class="form-control date-picker" id="_fDateFrom"
74
- name="fDateFrom" value="" placeholder="YYYY-MM-DD">
75
 
76
  <label class="form-label" for="_fDateTo" title="{{ strings.show_before }}...">
77
  {{ strings.time_until }}:</label>
78
  <input type="text" class="form-control date-picker" id="_fDateTo"
79
- name="fDateTo" value="" placeholder="YYYY-MM-DD">
80
  </div>
81
 
82
  <div class="form-group text-right">
71
  <label class="form-label" for="_fDateFrom" title="{{ strings.show_after }}...">
72
  {{ strings.time_since }}:</label>
73
  <input type="text" class="form-control date-picker" id="_fDateFrom"
74
+ name="fDateFrom" value="" placeholder="{{ strings.yyyymmdd }}">
75
 
76
  <label class="form-label" for="_fDateTo" title="{{ strings.show_before }}...">
77
  {{ strings.time_until }}:</label>
78
  <input type="text" class="form-control date-picker" id="_fDateTo"
79
+ name="fDateTo" value="" placeholder="{{ strings.yyyymmdd }}">
80
  </div>
81
 
82
  <div class="form-group text-right">
templates/twig/wpadmin_pages/insights/insights/notices.twig CHANGED
@@ -18,7 +18,8 @@
18
  <th colspan="4">
19
  <h6 class="m-0">
20
  {{ notice_section.title }}
21
- <span class="text-muted" style="font-size: smaller;">({{ notice_section.count }})</span>
 
22
  </h6>
23
  </th>
24
  </tr>
@@ -50,7 +51,7 @@
50
  </div>
51
  {% else %}
52
  <div class="alert alert-success">
53
- There are no important security notices at this time. This is a wonderful thing! :)
54
  </div>
55
  {% endif %}
56
 
18
  <th colspan="4">
19
  <h6 class="m-0">
20
  {{ notice_section.title }}
21
+ <span class="text-muted"
22
+ style="font-size: smaller;">({{ notice_section.count }})</span>
23
  </h6>
24
  </th>
25
  </tr>
51
  </div>
52
  {% else %}
53
  <div class="alert alert-success">
54
+ {{ strings.no_security_notices }} {{ strings.this_is_wonderful }} :)
55
  </div>
56
  {% endif %}
57