Shield Security for WordPress - Version 11.4.3

Version Description

Download this release

Release Info

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

Code changes from version 11.4.2 to 11.4.3

cl.json CHANGED
@@ -47,6 +47,12 @@
47
  "title": "Capturing and managing user 2-Factor Authentication is improved.",
48
  "description": []
49
  },
 
 
 
 
 
 
50
  {
51
  "type": "improved",
52
  "title": "Tweaks and adjustments to crowd-sourced hashing.",
@@ -64,6 +70,12 @@
64
  "title": "HTML formatting issue with the 2FA Login Page.",
65
  "description": [],
66
  "patch": "11.4.2"
 
 
 
 
 
 
67
  }
68
  ]
69
  },
47
  "title": "Capturing and managing user 2-Factor Authentication is improved.",
48
  "description": []
49
  },
50
+ {
51
+ "type": "improved",
52
+ "pro_only": false,
53
+ "title": "Added enhancement for when local tests for NotBot JS loading fails, use ShieldNET to test.",
54
+ "description": []
55
+ },
56
  {
57
  "type": "improved",
58
  "title": "Tweaks and adjustments to crowd-sourced hashing.",
70
  "title": "HTML formatting issue with the 2FA Login Page.",
71
  "description": [],
72
  "patch": "11.4.2"
73
+ },
74
+ {
75
+ "type": "improved",
76
+ "title": "Refinements to the ShieldNET cron processing.",
77
+ "description": [],
78
+ "patch": "11.4.3"
79
  }
80
  ]
81
  },
icwp-wpsf.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Shield Security
4
  * Plugin URI: https://shsec.io/2f
5
  * Description: Powerful, Easy-To-Use #1 Rated WordPress Security System
6
- * Version: 11.4.2
7
  * Text Domain: wp-simple-firewall
8
  * Domain Path: /languages
9
  * Author: Shield Security
3
  * Plugin Name: Shield Security
4
  * Plugin URI: https://shsec.io/2f
5
  * Description: Powerful, Easy-To-Use #1 Rated WordPress Security System
6
+ * Version: 11.4.3
7
  * Text Domain: wp-simple-firewall
8
  * Domain Path: /languages
9
  * Author: Shield Security
plugin-spec.php CHANGED
@@ -1,8 +1,8 @@
1
  {
2
  "properties": {
3
- "version": "11.4.2",
4
  "release_timestamp": 1625589161,
5
- "build": "202107.0604",
6
  "slug_parent": "icwp",
7
  "slug_plugin": "wpsf",
8
  "human_name": "Shield Security",
1
  {
2
  "properties": {
3
+ "version": "11.4.3",
4
  "release_timestamp": 1625589161,
5
+ "build": "202107.0801",
6
  "slug_parent": "icwp",
7
  "slug_plugin": "wpsf",
8
  "human_name": "Shield Security",
readme.txt CHANGED
@@ -8,7 +8,7 @@ Requires at least: 3.7
8
  Requires PHP: 7.0
9
  Recommended PHP: 7.4
10
  Tested up to: 5.8
11
- Stable tag: 11.4.2
12
 
13
  No-Nonsense Security Hardening that protects WordPress against hackers, malicious bots, and spammers (no captchas!). Now with exclusive ShieldNET Technology.
14
 
8
  Requires PHP: 7.0
9
  Recommended PHP: 7.4
10
  Tested up to: 5.8
11
+ Stable tag: 11.4.3
12
 
13
  No-Nonsense Security Hardening that protects WordPress against hackers, malicious bots, and spammers (no captchas!). Now with exclusive ShieldNET Technology.
14
 
resources/css/plugin.css CHANGED
@@ -1617,14 +1617,15 @@ body.folded #FooterBannerGoPro {
1617
  width: 100%;
1618
  z-index: 1000;
1619
  height: auto;
1620
- transition: visibility 0s;
1621
  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.4);
1622
- margin-top: -40px;
 
 
1623
  }
1624
  .with-submenu.activesub .subnav-menu {
1625
  visibility: visible;
1626
  opacity: 1;
1627
- transition: visibility 0s;
1628
  z-index: 1001;
1629
  }
1630
  .primary_side_sub_menu {
1617
  width: 100%;
1618
  z-index: 1000;
1619
  height: auto;
 
1620
  box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.4);
1621
+ margin-top: -60px;
1622
+ opacity: 0;
1623
+ transition: visibility 0.15s 0s, opacity 0.15s ease-in;
1624
  }
1625
  .with-submenu.activesub .subnav-menu {
1626
  visibility: visible;
1627
  opacity: 1;
1628
+ transition: visibility 0s, opacity 0.15s ease-in;
1629
  z-index: 1001;
1630
  }
1631
  .primary_side_sub_menu {
resources/js/plugin.js CHANGED
@@ -99,30 +99,6 @@ var iCWP_WPSF_Toaster = new function () {
99
  }();
100
  iCWP_WPSF_Toaster.initialise();
101
 
102
- var iCWP_WPSF_SubMenu = new function () {
103
- this.initialise = function () {
104
- jQuery( document ).ready( function () {
105
- let navBar = jQuery( '#NavSideBar' );
106
- navBar.on( 'click', 'li.nav-item.with-submenu', function ( evt ) {
107
- let $theLink = jQuery( evt.currentTarget );
108
- if ( $theLink.hasClass( 'activesub' ) ) {
109
- $theLink.removeClass( 'activesub' )
110
- }
111
- else {
112
- jQuery( 'li.nav-item.with-submenu.activesub', navBar ).removeClass( 'activesub' );
113
- $theLink.addClass( 'activesub' )
114
- }
115
- } );
116
- jQuery( document ).on( 'click', function ( evt ) {
117
- if ( !jQuery( evt.target ).closest( navBar ).length && jQuery( navBar ).is( ":visible" ) ) {
118
- jQuery( 'li.nav-item.with-submenu.activesub', navBar ).removeClass( 'activesub' );
119
- }
120
- } );
121
- } );
122
- };
123
- }();
124
- iCWP_WPSF_SubMenu.initialise();
125
-
126
  var iCWP_WPSF_OptionsFormSubmit = new function () {
127
 
128
  let bRequestCurrentlyRunning = false;
99
  }();
100
  iCWP_WPSF_Toaster.initialise();
101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  var iCWP_WPSF_OptionsFormSubmit = new function () {
103
 
104
  let bRequestCurrentlyRunning = false;
resources/js/shield/navigation.js CHANGED
@@ -21,7 +21,7 @@ jQuery.fn.icwpWpsfPluginNavigation = function ( options ) {
21
 
22
  let parentNav = currentMenuClickTarget.closest( 'ul' ).closest( 'li.nav-item' );
23
  if ( parentNav !== null ) {
24
- parentNav.querySelector( 'a.nav-link' ).classList.add( 'active' );
25
  }
26
 
27
  iCWP_WPSF_BodyOverlay.hide();
@@ -51,6 +51,23 @@ jQuery.fn.icwpWpsfPluginNavigation = function ( options ) {
51
  } );
52
 
53
  jQuery( document ).on( 'shield-dynamic_load', handleDynamicLoad );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  } );
55
  };
56
 
21
 
22
  let parentNav = currentMenuClickTarget.closest( 'ul' ).closest( 'li.nav-item' );
23
  if ( parentNav !== null ) {
24
+ parentNav.querySelector( 'li.nav-item > a.nav-link' ).classList.add( 'active' );
25
  }
26
 
27
  iCWP_WPSF_BodyOverlay.hide();
51
  } );
52
 
53
  jQuery( document ).on( 'shield-dynamic_load', handleDynamicLoad );
54
+
55
+ let navBar = jQuery( '#NavSideBar' );
56
+ navBar.on( 'click', 'li.nav-item.with-submenu', function ( evt ) {
57
+ let $theLink = jQuery( evt.currentTarget );
58
+ if ( $theLink.hasClass( 'activesub' ) ) {
59
+ $theLink.removeClass( 'activesub' )
60
+ }
61
+ else {
62
+ jQuery( 'li.nav-item.with-submenu.activesub', navBar ).removeClass( 'activesub' );
63
+ $theLink.addClass( 'activesub' )
64
+ }
65
+ } );
66
+ jQuery( document ).on( 'click', function ( evt ) {
67
+ if ( !jQuery( evt.target ).closest( navBar ).length && jQuery( navBar ).is( ":visible" ) ) {
68
+ jQuery( 'li.nav-item.with-submenu.activesub', navBar ).removeClass( 'activesub' );
69
+ }
70
+ } );
71
  } );
72
  };
73
 
src/lib/src/Crons/PluginCronsConsumer.php CHANGED
@@ -2,6 +2,8 @@
2
 
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Crons;
4
 
 
 
5
  trait PluginCronsConsumer {
6
 
7
  public function runDailyCron() {
@@ -11,7 +13,9 @@ trait PluginCronsConsumer {
11
  }
12
 
13
  protected function setupCronHooks() {
14
- add_action( $this->getCon()->prefix( 'daily_cron' ), [ $this, 'runDailyCron' ] );
15
- add_action( $this->getCon()->prefix( 'hourly_cron' ), [ $this, 'runHourlyCron' ] );
 
 
16
  }
17
  }
2
 
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Crons;
4
 
5
+ use FernleafSystems\Wordpress\Services\Services;
6
+
7
  trait PluginCronsConsumer {
8
 
9
  public function runDailyCron() {
13
  }
14
 
15
  protected function setupCronHooks() {
16
+ if ( Services::WpGeneral()->isCron() ) {
17
+ add_action( $this->getCon()->prefix( 'daily_cron' ), [ $this, 'runDailyCron' ] );
18
+ add_action( $this->getCon()->prefix( 'hourly_cron' ), [ $this, 'runHourlyCron' ] );
19
+ }
20
  }
21
  }
src/lib/src/Modules/HackGuard/Lib/Snapshots/CrowdSourced/SubmitHashes.php CHANGED
@@ -8,6 +8,7 @@ use FernleafSystems\Wordpress\Services\Core\VOs\Assets\{
8
  WpPluginVo,
9
  WpThemeVo
10
  };
 
11
  use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\CrowdSourcedHashes\Submit\{
12
  PreSubmit,
13
  Submit
@@ -44,8 +45,8 @@ class SubmitHashes {
44
  }
45
 
46
  private function canSubmitAsset() :bool {
47
- return preg_match( '#^[0-9.]$#', $this->asset->Version )
48
- && preg_match( '#^[0-9a-z]+[0-9a-z_\-]+$#i', $this->asset->slug );
49
  }
50
 
51
  private function isSubmitRequired() :bool {
8
  WpPluginVo,
9
  WpThemeVo
10
  };
11
+ use FernleafSystems\Wordpress\Services\Utilities\Constants\Regex;
12
  use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\CrowdSourcedHashes\Submit\{
13
  PreSubmit,
14
  Submit
45
  }
46
 
47
  private function canSubmitAsset() :bool {
48
+ return preg_match( sprintf( '#^%s$#', Regex::ASSET_VERSION ), $this->asset->Version )
49
+ && preg_match( sprintf( '#^%s$#', Regex::ASSET_SLUG ), $this->asset->slug );
50
  }
51
 
52
  private function isSubmitRequired() :bool {
src/lib/src/Modules/HackGuard/UI.php CHANGED
@@ -288,27 +288,27 @@ class UI extends BaseShield\UI {
288
  }
289
 
290
  protected function getSectionWarnings( string $section ) :array {
291
- $aWarnings = [];
292
 
293
  switch ( $section ) {
294
 
295
  case 'section_realtime':
296
- $bCanHandshake = $this->getCon()
297
  ->getModule_Plugin()
298
  ->getShieldNetApiController()
299
  ->canHandshake();
300
- if ( !$bCanHandshake ) {
301
- $aWarnings[] = sprintf( __( 'Not available as your site cannot handshake with ShieldNET API.', 'wp-simple-firewall' ), 'OpenSSL' );
302
  }
303
  // if ( !Services::Encrypt()->isSupportedOpenSslDataEncryption() ) {
304
- // $aWarnings[] = sprintf( __( 'Not available because the %s extension is not available.', 'wp-simple-firewall' ), 'OpenSSL' );
305
  // }
306
  // if ( !Services::WpFs()->isFilesystemAccessDirect() ) {
307
- // $aWarnings[] = sprintf( __( "Not available because PHP/WordPress doesn't have direct filesystem access.", 'wp-simple-firewall' ), 'OpenSSL' );
308
  // }
309
  break;
310
  }
311
 
312
- return $aWarnings;
313
  }
314
  }
288
  }
289
 
290
  protected function getSectionWarnings( string $section ) :array {
291
+ $warnings = [];
292
 
293
  switch ( $section ) {
294
 
295
  case 'section_realtime':
296
+ $canHandshake = $this->getCon()
297
  ->getModule_Plugin()
298
  ->getShieldNetApiController()
299
  ->canHandshake();
300
+ if ( !$canHandshake ) {
301
+ $warnings[] = sprintf( __( 'Not available as your site cannot handshake with ShieldNET API.', 'wp-simple-firewall' ), 'OpenSSL' );
302
  }
303
  // if ( !Services::Encrypt()->isSupportedOpenSslDataEncryption() ) {
304
+ // $warnings[] = sprintf( __( 'Not available because the %s extension is not available.', 'wp-simple-firewall' ), 'OpenSSL' );
305
  // }
306
  // if ( !Services::WpFs()->isFilesystemAccessDirect() ) {
307
+ // $warnings[] = sprintf( __( "Not available because PHP/WordPress doesn't have direct filesystem access.", 'wp-simple-firewall' ), 'OpenSSL' );
308
  // }
309
  break;
310
  }
311
 
312
+ return $warnings;
313
  }
314
  }
src/lib/src/Modules/IPs/Lib/BlacklistHandler.php CHANGED
@@ -21,7 +21,7 @@ class BlacklistHandler extends Modules\Base\Common\ExecOnceModConsumer {
21
  /** @var IPs\ModCon $mod */
22
  $mod = $this->getMod();
23
 
24
- if ( Services::WpGeneral()->isCron() && $this->getCon()->isPremiumActive() ) {
25
  $this->setupCronHooks();
26
  }
27
 
21
  /** @var IPs\ModCon $mod */
22
  $mod = $this->getMod();
23
 
24
+ if ( $this->getCon()->isPremiumActive() ) {
25
  $this->setupCronHooks();
26
  }
27
 
src/lib/src/Modules/IPs/Lib/Bots/NotBot/InsertNotBotJs.php CHANGED
@@ -10,7 +10,9 @@ use FernleafSystems\Wordpress\Services\Services;
10
  class InsertNotBotJs extends ExecOnceModConsumer {
11
 
12
  protected function canRun() :bool {
13
- return ( Services::Request()->ts() - ( new BotSignalsRecord() )
 
 
14
  ->setMod( $this->getMod() )
15
  ->setIP( Services::IP()->getRequestIp() )
16
  ->retrieve()->notbot_at ) > MINUTE_IN_SECONDS*45;
10
  class InsertNotBotJs extends ExecOnceModConsumer {
11
 
12
  protected function canRun() :bool {
13
+ $req = Services::Request();
14
+ return $req->query( 'force_notbot' ) == 1
15
+ || ( $req->ts() - ( new BotSignalsRecord() )
16
  ->setMod( $this->getMod() )
17
  ->setIP( Services::IP()->getRequestIp() )
18
  ->retrieve()->notbot_at ) > MINUTE_IN_SECONDS*45;
src/lib/src/Modules/IPs/Lib/Bots/NotBot/TestNotBotLoading.php CHANGED
@@ -3,6 +3,7 @@
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\IPs\Lib\Bots\NotBot;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
 
6
  use FernleafSystems\Wordpress\Services\Services;
7
 
8
  class TestNotBotLoading {
@@ -10,12 +11,23 @@ class TestNotBotLoading {
10
  use ModConsumer;
11
 
12
  public function test() :bool {
 
 
 
 
13
  $urlToFind = explode( '?', $this->getCon()->urls->forJs( 'shield/notbot' ) )[ 0 ];
14
  return preg_match(
15
  sprintf( '#%s#i', preg_quote( $urlToFind, '#' ) ),
16
- Services::HttpRequest()->getContent( network_home_url( '/' ), [
17
- 'timeout' => 5
18
- ] )
 
19
  ) === 1;
20
  }
 
 
 
 
 
 
21
  }
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\IPs\Lib\Bots\NotBot;
4
 
5
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
6
+ use FernleafSystems\Wordpress\Plugin\Shield\ShieldNetApi\Tools\DetectNotBot;
7
  use FernleafSystems\Wordpress\Services\Services;
8
 
9
  class TestNotBotLoading {
11
  use ModConsumer;
12
 
13
  public function test() :bool {
14
+ return $this->testInternally() || $this->testViaShieldNet();
15
+ }
16
+
17
+ public function testInternally() :bool {
18
  $urlToFind = explode( '?', $this->getCon()->urls->forJs( 'shield/notbot' ) )[ 0 ];
19
  return preg_match(
20
  sprintf( '#%s#i', preg_quote( $urlToFind, '#' ) ),
21
+ Services::HttpRequest()->getContent(
22
+ add_query_arg( [ 'force_notbot' => '1' ], network_home_url( '/' ) ),
23
+ [ 'timeout' => 5 ]
24
+ )
25
  ) === 1;
26
  }
27
+
28
+ public function testViaShieldNet() :bool {
29
+ return ( new DetectNotBot() )
30
+ ->setMod( $this->getCon()->getModule_Plugin() )
31
+ ->run( explode( '?', $this->getCon()->urls->forJs( 'shield/notbot' ) )[ 0 ] );
32
+ }
33
  }
src/lib/src/Modules/Insights/Lib/SideMenuBuilder.php CHANGED
@@ -50,9 +50,6 @@ class SideMenuBuilder {
50
  }
51
 
52
  if ( !empty( $item[ 'sub_items' ] ) ) {
53
- $item[ 'data' ][ 'toggle' ] = 'collapse';
54
- $item[ 'href' ] = '#collapse-'.$item[ 'slug' ];
55
-
56
  $item[ 'sub_items' ] = array_map( function ( $sub ) {
57
  if ( empty( $sub[ 'classes' ] ) ) {
58
  $sub[ 'classes' ] = [];
50
  }
51
 
52
  if ( !empty( $item[ 'sub_items' ] ) ) {
 
 
 
53
  $item[ 'sub_items' ] = array_map( function ( $sub ) {
54
  if ( empty( $sub[ 'classes' ] ) ) {
55
  $sub[ 'classes' ] = [];
src/lib/src/Modules/Plugin/Components/PluginBadge.php CHANGED
@@ -10,11 +10,9 @@ use FernleafSystems\Wordpress\Services\Services;
10
  * Class PluginBadge
11
  * @package FernleafSystems\Wordpress\Plugin\Shield\Modules\Plugin\Components
12
  */
13
- class PluginBadge {
14
 
15
- use Modules\ModConsumer;
16
-
17
- public function run() {
18
  /** @var Plugin\Options $opts */
19
  $opts = $this->getOptions();
20
  $req = Services::Request();
10
  * Class PluginBadge
11
  * @package FernleafSystems\Wordpress\Plugin\Shield\Modules\Plugin\Components
12
  */
13
+ class PluginBadge extends Modules\Base\Common\ExecOnceModConsumer {
14
 
15
+ protected function run() {
 
 
16
  /** @var Plugin\Options $opts */
17
  $opts = $this->getOptions();
18
  $req = Services::Request();
src/lib/src/Modules/Plugin/Processor.php CHANGED
@@ -21,7 +21,8 @@ class Processor extends BaseShield\Processor {
21
  ->setMod( $this->getMod() )
22
  ->run();
23
 
24
- $mod->getPluginBadgeCon()->run();
 
25
 
26
  ( new PluginTelemetry() )
27
  ->setMod( $this->getMod() )
21
  ->setMod( $this->getMod() )
22
  ->run();
23
 
24
+ $mod->getShieldNetApiController()->execute();
25
+ $mod->getPluginBadgeCon()->execute();
26
 
27
  ( new PluginTelemetry() )
28
  ->setMod( $this->getMod() )
src/lib/src/ShieldNetApi/ShieldNetApiController.php CHANGED
@@ -3,6 +3,7 @@
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\ShieldNetApi;
4
 
5
  use FernleafSystems\Utilities\Data\Adapter\DynPropertiesClass;
 
6
  use FernleafSystems\Wordpress\Plugin\Shield\Crons\PluginCronsConsumer;
7
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\IPs\Lib\Bots\ShieldNET\BuildData;
8
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
@@ -18,9 +19,14 @@ use FernleafSystems\Wordpress\Services\Services;
18
  */
19
  class ShieldNetApiController extends DynPropertiesClass {
20
 
 
21
  use ModConsumer;
22
  use PluginCronsConsumer;
23
 
 
 
 
 
24
  /**
25
  * Automatically throttles request because otherwise PRO-nulled versions of Shield will cause
26
  * overload on our API.
@@ -128,7 +134,7 @@ class ShieldNetApiController extends DynPropertiesClass {
128
  * So if the timestamp for the last store is too far in the past, we believe we can't reliably
129
  * store data.
130
  */
131
- private function canStoreDataReliably() :bool {
132
  if ( Services::Request()->carbon()->subHours( 2 )->timestamp > $this->vo->data_last_saved_at ) {
133
  $can = false;
134
  $this->storeVoData();
3
  namespace FernleafSystems\Wordpress\Plugin\Shield\ShieldNetApi;
4
 
5
  use FernleafSystems\Utilities\Data\Adapter\DynPropertiesClass;
6
+ use FernleafSystems\Utilities\Logic\ExecOnce;
7
  use FernleafSystems\Wordpress\Plugin\Shield\Crons\PluginCronsConsumer;
8
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\IPs\Lib\Bots\ShieldNET\BuildData;
9
  use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
19
  */
20
  class ShieldNetApiController extends DynPropertiesClass {
21
 
22
+ use ExecOnce;
23
  use ModConsumer;
24
  use PluginCronsConsumer;
25
 
26
+ protected function run() {
27
+ $this->setupCronHooks();
28
+ }
29
+
30
  /**
31
  * Automatically throttles request because otherwise PRO-nulled versions of Shield will cause
32
  * overload on our API.
134
  * So if the timestamp for the last store is too far in the past, we believe we can't reliably
135
  * store data.
136
  */
137
+ public function canStoreDataReliably() :bool {
138
  if ( Services::Request()->carbon()->subHours( 2 )->timestamp > $this->vo->data_last_saved_at ) {
139
  $can = false;
140
  $this->storeVoData();
src/lib/src/ShieldNetApi/Tools/DetectNotBot.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare( strict_types=1 );
2
+
3
+ namespace FernleafSystems\Wordpress\Plugin\Shield\ShieldNetApi\Tools;
4
+
5
+ use FernleafSystems\Wordpress\Plugin\Shield\ShieldNetApi\Common;
6
+
7
+ class DetectNotBot extends Common\BaseShieldNetApi {
8
+
9
+ const API_ACTION = 'tools/detect/notbot';
10
+
11
+ public function run( string $urlToFind ) :bool {
12
+ $this->shield_net_params_required = true;
13
+ $this->params_query = [
14
+ 'to_find' => $urlToFind,
15
+ ];
16
+ $raw = $this->sendReq();
17
+ return is_array( $raw ) && empty( $raw[ 'error' ] ) && $raw[ 'data' ][ 'success' ];
18
+ }
19
+ }
src/lib/vendor/composer/autoload_classmap.php CHANGED
@@ -837,6 +837,7 @@ return array(
837
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\ShieldNetApiDataVO' => $baseDir . '/src/ShieldNetApi/ShieldNetApiDataVO.php',
838
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\SureSend\\SendEmail' => $baseDir . '/src/ShieldNetApi/SureSend/SendEmail.php',
839
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\Telemetry\\SendTelemetry' => $baseDir . '/src/ShieldNetApi/Telemetry/SendTelemetry.php',
 
840
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\Tools\\GenerateGoogleAuthQrCode' => $baseDir . '/src/ShieldNetApi/Tools/GenerateGoogleAuthQrCode.php',
841
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\WPHashes\\SolicitToken' => $baseDir . '/src/ShieldNetApi/WPHashes/SolicitToken.php',
842
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Tables\\Build\\AdminNotes' => $baseDir . '/src/Tables/Build/AdminNotes.php',
@@ -935,6 +936,7 @@ return array(
935
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Autoloading\\FindClassFromNamespaceRoots' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Autoloading/FindClassFromNamespaceRoots.php',
936
  'FernleafSystems\\Wordpress\\Services\\Utilities\\BackgroundProcessing\\BackgroundProcess' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/BackgroundProcessing/BackgroundProcess.php',
937
  'FernleafSystems\\Wordpress\\Services\\Utilities\\ClassicPress\\Checksums' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/ClassicPress/Checksums.php',
 
938
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Consumers\\PluginConsumer' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Consumers/PluginConsumer.php',
939
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Data' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Data.php',
940
  'FernleafSystems\\Wordpress\\Services\\Utilities\\DataManipulation' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/DataManipulation.php',
837
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\ShieldNetApiDataVO' => $baseDir . '/src/ShieldNetApi/ShieldNetApiDataVO.php',
838
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\SureSend\\SendEmail' => $baseDir . '/src/ShieldNetApi/SureSend/SendEmail.php',
839
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\Telemetry\\SendTelemetry' => $baseDir . '/src/ShieldNetApi/Telemetry/SendTelemetry.php',
840
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\Tools\\DetectNotBot' => $baseDir . '/src/ShieldNetApi/Tools/DetectNotBot.php',
841
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\Tools\\GenerateGoogleAuthQrCode' => $baseDir . '/src/ShieldNetApi/Tools/GenerateGoogleAuthQrCode.php',
842
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\WPHashes\\SolicitToken' => $baseDir . '/src/ShieldNetApi/WPHashes/SolicitToken.php',
843
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Tables\\Build\\AdminNotes' => $baseDir . '/src/Tables/Build/AdminNotes.php',
936
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Autoloading\\FindClassFromNamespaceRoots' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Autoloading/FindClassFromNamespaceRoots.php',
937
  'FernleafSystems\\Wordpress\\Services\\Utilities\\BackgroundProcessing\\BackgroundProcess' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/BackgroundProcessing/BackgroundProcess.php',
938
  'FernleafSystems\\Wordpress\\Services\\Utilities\\ClassicPress\\Checksums' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/ClassicPress/Checksums.php',
939
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Constants\\Regex' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Constants/Regex.php',
940
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Consumers\\PluginConsumer' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Consumers/PluginConsumer.php',
941
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Data' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/Data.php',
942
  'FernleafSystems\\Wordpress\\Services\\Utilities\\DataManipulation' => $vendorDir . '/fernleafsystems/wordpress-services/src/Utilities/DataManipulation.php',
src/lib/vendor/composer/autoload_static.php CHANGED
@@ -1010,6 +1010,7 @@ class ComposerStaticInit4fc2c6daaffaf40b64b79b6d26830171
1010
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\ShieldNetApiDataVO' => __DIR__ . '/../..' . '/src/ShieldNetApi/ShieldNetApiDataVO.php',
1011
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\SureSend\\SendEmail' => __DIR__ . '/../..' . '/src/ShieldNetApi/SureSend/SendEmail.php',
1012
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\Telemetry\\SendTelemetry' => __DIR__ . '/../..' . '/src/ShieldNetApi/Telemetry/SendTelemetry.php',
 
1013
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\Tools\\GenerateGoogleAuthQrCode' => __DIR__ . '/../..' . '/src/ShieldNetApi/Tools/GenerateGoogleAuthQrCode.php',
1014
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\WPHashes\\SolicitToken' => __DIR__ . '/../..' . '/src/ShieldNetApi/WPHashes/SolicitToken.php',
1015
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Tables\\Build\\AdminNotes' => __DIR__ . '/../..' . '/src/Tables/Build/AdminNotes.php',
@@ -1108,6 +1109,7 @@ class ComposerStaticInit4fc2c6daaffaf40b64b79b6d26830171
1108
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Autoloading\\FindClassFromNamespaceRoots' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Autoloading/FindClassFromNamespaceRoots.php',
1109
  'FernleafSystems\\Wordpress\\Services\\Utilities\\BackgroundProcessing\\BackgroundProcess' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/BackgroundProcessing/BackgroundProcess.php',
1110
  'FernleafSystems\\Wordpress\\Services\\Utilities\\ClassicPress\\Checksums' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/ClassicPress/Checksums.php',
 
1111
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Consumers\\PluginConsumer' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Consumers/PluginConsumer.php',
1112
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Data' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Data.php',
1113
  'FernleafSystems\\Wordpress\\Services\\Utilities\\DataManipulation' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/DataManipulation.php',
1010
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\ShieldNetApiDataVO' => __DIR__ . '/../..' . '/src/ShieldNetApi/ShieldNetApiDataVO.php',
1011
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\SureSend\\SendEmail' => __DIR__ . '/../..' . '/src/ShieldNetApi/SureSend/SendEmail.php',
1012
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\Telemetry\\SendTelemetry' => __DIR__ . '/../..' . '/src/ShieldNetApi/Telemetry/SendTelemetry.php',
1013
+ 'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\Tools\\DetectNotBot' => __DIR__ . '/../..' . '/src/ShieldNetApi/Tools/DetectNotBot.php',
1014
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\Tools\\GenerateGoogleAuthQrCode' => __DIR__ . '/../..' . '/src/ShieldNetApi/Tools/GenerateGoogleAuthQrCode.php',
1015
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\ShieldNetApi\\WPHashes\\SolicitToken' => __DIR__ . '/../..' . '/src/ShieldNetApi/WPHashes/SolicitToken.php',
1016
  'FernleafSystems\\Wordpress\\Plugin\\Shield\\Tables\\Build\\AdminNotes' => __DIR__ . '/../..' . '/src/Tables/Build/AdminNotes.php',
1109
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Autoloading\\FindClassFromNamespaceRoots' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Autoloading/FindClassFromNamespaceRoots.php',
1110
  'FernleafSystems\\Wordpress\\Services\\Utilities\\BackgroundProcessing\\BackgroundProcess' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/BackgroundProcessing/BackgroundProcess.php',
1111
  'FernleafSystems\\Wordpress\\Services\\Utilities\\ClassicPress\\Checksums' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/ClassicPress/Checksums.php',
1112
+ 'FernleafSystems\\Wordpress\\Services\\Utilities\\Constants\\Regex' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Constants/Regex.php',
1113
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Consumers\\PluginConsumer' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Consumers/PluginConsumer.php',
1114
  'FernleafSystems\\Wordpress\\Services\\Utilities\\Data' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/Data.php',
1115
  'FernleafSystems\\Wordpress\\Services\\Utilities\\DataManipulation' => __DIR__ . '/..' . '/fernleafsystems/wordpress-services/src/Utilities/DataManipulation.php',
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Constants/Regex.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php declare( strict_types=1 );
2
+
3
+ namespace FernleafSystems\Wordpress\Services\Utilities\Constants;
4
+
5
+ class Regex {
6
+
7
+ const ASSET_SLUG = '([A-Za-z0-9]+[_\-])*[A-Za-z0-9]+';
8
+ const ASSET_VERSION = '([0-9]+\.)*[0-9]+';
9
+ const HASH_MD5 = '[A-Fa-f0-9]{32}';
10
+ const HASH_SHA1 = '[A-Fa-f0-9]{40}';
11
+ }
src/lib/vendor/fernleafsystems/wordpress-services/src/Utilities/Integrations/WpHashes/CrowdSourcedHashes/Base.php CHANGED
@@ -5,4 +5,5 @@ namespace FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Cro
5
  abstract class Base extends \FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\ApiBase {
6
 
7
  const API_ENDPOINT = 'cshashes';
 
8
  }
5
  abstract class Base extends \FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\ApiBase {
6
 
7
  const API_ENDPOINT = 'cshashes';
8
+ const API_VERSION = 2;
9
  }
templates/twig/wpadmin_pages/components/page/nav_sidebar.twig CHANGED
@@ -14,7 +14,7 @@
14
  <span class="text-secondary font-italic text-monospace">{{ mitem.title }}</span>
15
  </li>
16
  {% for sub in mitem.sub_items %}
17
- <li class="nav-item mb-2 pl-0 py-1">
18
  <a class="p-0 nav-link {{ sub.classes|default([])|join( ' ' ) }}"
19
  href="{{ sub.href|default('#') }}"
20
  {% for data_key,data_val in sub.data|default([]) %}
14
  <span class="text-secondary font-italic text-monospace">{{ mitem.title }}</span>
15
  </li>
16
  {% for sub in mitem.sub_items %}
17
+ <li class="mb-2 pl-0 py-1">
18
  <a class="p-0 nav-link {{ sub.classes|default([])|join( ' ' ) }}"
19
  href="{{ sub.href|default('#') }}"
20
  {% for data_key,data_val in sub.data|default([]) %}