From 137b58d4a7f1aaed5199a6cbf4a9f341b0d88dbb Mon Sep 17 00:00:00 2001 From: alexandergull Date: Tue, 24 Sep 2024 14:46:48 +0500 Subject: [PATCH 01/15] Mod. Bruteforce protection. BFP module now can use FW whitelists. --- lib/CleantalkSP/SpbctWP/Firewall/BFP.php | 58 ++++++++++++++++++++++++ lib/CleantalkSP/SpbctWP/Firewall/FW.php | 4 +- security-malware-firewall.php | 1 + 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/lib/CleantalkSP/SpbctWP/Firewall/BFP.php b/lib/CleantalkSP/SpbctWP/Firewall/BFP.php index 7a32818c4..a2be478ea 100644 --- a/lib/CleantalkSP/SpbctWP/Firewall/BFP.php +++ b/lib/CleantalkSP/SpbctWP/Firewall/BFP.php @@ -2,8 +2,10 @@ namespace CleantalkSP\SpbctWP\Firewall; +use CleantalkSP\SpbctWP\DB; use CleantalkSP\SpbctWP\Helpers\Helper; use CleantalkSP\Security\Firewall\Result; +use CleantalkSP\SpbctWP\Helpers\IP; class BFP extends FirewallModule { @@ -17,6 +19,7 @@ class BFP extends FirewallModule protected $chance_to_clean = 100; // Chance to clean log table from old entries. In percents. public static $is_checked = false; + protected $use_fw_personal_whitelists = false; /** * @psalm-suppress PossiblyUnusedProperty @@ -33,6 +36,7 @@ public function __construct($params = array()) { $params['count_period'] = $params['count_period'] ?: $this->count_period; $params['block_period'] = $params['block_period'] ?: $this->block_period; + $this->use_fw_personal_whitelists = !empty($params['use_fw_personal_whitelists']) ?: $this->use_fw_personal_whitelists; parent::__construct($params); } @@ -47,6 +51,11 @@ public function check() if ( $this->is_login_page && ! $this->is_logged_in ) { foreach ( $this->ip_array as $_ip_origin => $current_ip ) { + if ($this->use_fw_personal_whitelists && $this->isPersonalWhitelisted($current_ip)) { + //probably we should log this case + continue; + } + $rand = rand(1, 100000); $md5_ip = md5($current_ip); $query = "SELECT md5_ip as blocked @@ -181,4 +190,53 @@ private function clearTable() } } } + + /** + * Check if the IP is whitelisted in the personal FW whitelist. + * @param $current_ip + * @return bool + */ + private function isPersonalWhitelisted($current_ip) + { + global $spbc; + $result = false; + $fw = new FW( + array( + 'data_table__personal_countries' => SPBC_TBL_FIREWALL_DATA__COUNTRIES, + 'log_table' => SPBC_TBL_FIREWALL_LOG, + 'state' => $spbc, + 'api_key' => $spbc->api_key, + ) + ); + $fw->setDb(new DB()); + try { + $version = IP::validate($current_ip); + if ( $version === 'v6' ) { + //IPV6 handling logic + $db_results = $fw->ipv6GetResultsFromDb($current_ip); + } elseif ($version === 'v4') { + //IPV4 handling logic + $db_results = $fw->ipv4GetResultsFromDb($current_ip); + } else { + throw new \Exception('IP address record is invalid.'); + } + } catch (\Exception $e) { + error_log('Security by CleanTalk. Firewall IP handling error: ' . $e->getMessage()); + } + if (isset($db_results) && is_array($db_results)) { + foreach ($db_results as $_key => $result) { + if ( + isset($result['is_personal']) && + $result['is_personal'] === '1' && + isset($result['status']) && + $result['status'] === '1' + ) { + $result = true; + break; + } + } + } + + return $result; + } } diff --git a/lib/CleantalkSP/SpbctWP/Firewall/FW.php b/lib/CleantalkSP/SpbctWP/Firewall/FW.php index d02ff1046..e02b4be90 100644 --- a/lib/CleantalkSP/SpbctWP/Firewall/FW.php +++ b/lib/CleantalkSP/SpbctWP/Firewall/FW.php @@ -144,7 +144,7 @@ public function check() * @param $ip * @return array|null|object */ - protected function ipv4GetResultsFromDb($ip) + public function ipv4GetResultsFromDb($ip) { $current_ipv4 = sprintf('%u', ip2long($ip)); $needles = IP::getNetworkNeedles([$current_ipv4]); @@ -183,7 +183,7 @@ protected function ipv4GetResultsFromDb($ip) * @return array * @throws \Exception */ - protected function ipv6GetResultsFromDb($ip) + public function ipv6GetResultsFromDb($ip) { $needles = IP::getNetworkNeedles(IP::getFourIPv4FromIP($ip)); $data_table__common_v6 = SPBC_TBL_FIREWALL_DATA_V6; diff --git a/security-malware-firewall.php b/security-malware-firewall.php index 5e6ab31d9..0c8a4ce0d 100644 --- a/security-malware-firewall.php +++ b/security-malware-firewall.php @@ -617,6 +617,7 @@ function spbc_authenticate__check_brute_force() 'bf_limit' => $spbc->settings['bfp__allowed_wrong_auths'], 'block_period' => $spbc->settings['bfp__block_period__5_fails'], 'count_period' => $spbc->settings['bfp__count_interval'], + 'use_fw_personal_whitelists' => true, //we can also manage it with settings ) ); From dea9c59f63e5fcf87a8fd18b6937c602942880a4 Mon Sep 17 00:00:00 2001 From: alexandergull Date: Sun, 23 Feb 2025 21:14:02 +0500 Subject: [PATCH 02/15] Fix. OSCron. Skip task parsing on regexp empty result. --- lib/CleantalkSP/SpbctWP/Scanner/OSCron/OSCronModel.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/CleantalkSP/SpbctWP/Scanner/OSCron/OSCronModel.php b/lib/CleantalkSP/SpbctWP/Scanner/OSCron/OSCronModel.php index 88c53f552..f2b3df946 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/OSCron/OSCronModel.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/OSCron/OSCronModel.php @@ -101,6 +101,10 @@ public static function parseEnvTasks($cron_file) // Split the line into parts and extract the time pattern and command $parts = preg_split('/\s/', $whole_task, 6); $time_pattern = implode(' ', array_slice($parts, 0, 5)); + if (empty($parts[5])) { + // can not parse the command + continue; + } $command = $parts[5]; // Create a new task and set its properties From 8a874e0a1cd01cb600458e7decd9dedfab09d945 Mon Sep 17 00:00:00 2001 From: AntonV1211 Date: Mon, 24 Feb 2025 21:32:34 +0700 Subject: [PATCH 03/15] Version 2.152.99-fix --- security-malware-firewall.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security-malware-firewall.php b/security-malware-firewall.php index 18754a5e3..0ec3d563d 100644 --- a/security-malware-firewall.php +++ b/security-malware-firewall.php @@ -5,7 +5,7 @@ Plugin URI: https://wordpress.org/plugins/security-malware-firewall/ Description: Security & Malware scan by CleanTalk to protect your website from online threats and viruses. IP/Country FireWall, Web application FireWall. Detailed stats and logs to have full control. Author: CleanTalk Security -Version: 2.152 +Version: 2.152.99-fix Author URI: https://cleantalk.org Text Domain: security-malware-firewall Domain Path: /i18n From f05f00225c4b55efa67c680abb1f3d367a032035 Mon Sep 17 00:00:00 2001 From: alexandergull Date: Wed, 26 Feb 2025 17:22:26 +0500 Subject: [PATCH 04/15] Mod. Scanner. Getting approved hashes. Memory usage reduced. --- lib/CleantalkSP/Common/Helpers/CSV.php | 33 ++++++++++--------- lib/CleantalkSP/SpbctWP/Scanner/Helper.php | 1 - .../SpbctWP/Scanner/ScannerQueue.php | 15 +++++---- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/lib/CleantalkSP/Common/Helpers/CSV.php b/lib/CleantalkSP/Common/Helpers/CSV.php index 257e196e4..4545573cb 100644 --- a/lib/CleantalkSP/Common/Helpers/CSV.php +++ b/lib/CleantalkSP/Common/Helpers/CSV.php @@ -17,37 +17,40 @@ */ class CSV { - public static function sanitizeFromEmptyLines($buffer) + /** + * Sanitize buffer from empty lines, keep this method with void return to reduce memory usage + * @param array $buffer + * + * @return void + */ + public static function sanitizeFromEmptyLines(&$buffer) { $buffer = (array) $buffer; - foreach ($buffer as $indx => &$line) { - $line = trim($line); - if ($line === '') { - unset($buffer[$indx]); + + for ( $i = 0; $i < count($buffer); $i++ ) { + if (trim($buffer[$i]) === '') { + unset($buffer[$i]); } } - - return $buffer; } /** * Parse Comma-separated values, without formatting to csv * - * @param $buffer + * @param string $buffer * - * @return false|string[] + * @return string[] */ public static function parseCSVLite($buffer) { $buffer = explode("\n", $buffer); - $buffer = self::sanitizeFromEmptyLines($buffer); + self::sanitizeFromEmptyLines($buffer); - foreach ($buffer as &$line) { - if ($line !== '') { - $line = substr($line, 6); + for ( $i = 0; $i < count($buffer); $i++ ) { + if (!empty($buffer[$i]) ) { + $buffer[$i] = substr($buffer[$i], 6); } } - return $buffer; } @@ -61,7 +64,7 @@ public static function parseCSVLite($buffer) public static function parseCSV($buffer) { $buffer = explode("\n", $buffer); - $buffer = self::sanitizeFromEmptyLines($buffer); + self::sanitizeFromEmptyLines($buffer); foreach ($buffer as &$line) { if ($line !== '') { $line = str_getcsv($line, ',', '\''); diff --git a/lib/CleantalkSP/SpbctWP/Scanner/Helper.php b/lib/CleantalkSP/SpbctWP/Scanner/Helper.php index e4553091c..0d00219e3 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/Helper.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/Helper.php @@ -124,7 +124,6 @@ public static function getHashesForModules($cms, $type, $plugin, $version) public static function getHashesForFiles($cms, $type, $version) { $file_path = 'https://cleantalk-security.s3-us-west-2.amazonaws.com/extensions_checksums/' . $cms . '/' . $type . '/' . $version . '.csv.gz'; - if ( HTTP::getResponseCode($file_path) !== 200 ) { return array('error' => 'REMOTE_FILE_NOT_FOUND'); } diff --git a/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php b/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php index 7348a57b7..7d5158d4e 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php @@ -1169,11 +1169,14 @@ public function get_approved_hashes() // phpcs:ignore PSR1.Methods.CamelCapsMeth $scanning_stages_storage->converter->loadCollection(); $stage_data_obj = $scanning_stages_storage->getStage(GetApprovedHashes::class); - if ( empty($result['error']) ) { - $spbc->data['scanner']['checksums_count_ct'] = count($result); - $spbc->save('data'); + $approved_hashes_count = empty($result['error']) ? count($result) : 0; + if ( empty($result['error']) ) { $where = implode('\',\'', $result); + unset($result); + + $spbc->data['scanner']['checksums_count_ct'] = $approved_hashes_count; + $spbc->save('data'); if ( ! preg_match('#^[a-zA-Z0-9\',]+$#', $where) ) { return array('error' => 'BAD_PARAMS'); @@ -1208,18 +1211,16 @@ public function get_approved_hashes() // phpcs:ignore PSR1.Methods.CamelCapsMeth WHERE full_hash IN (\'' . $where . '\');' ); - $stage_data_obj->set('count_approved_hashes', count($result)); + $stage_data_obj->set('count_approved_hashes', $approved_hashes_count); $stage_data_obj->set('count_approved_hashes_in_db', $updated_rows); $scanning_stages_storage->saveToDb(); } $out = array( 'end' => 1, - 'processed' => empty($result['error']) ? count($result) : 0 + 'processed' => empty($result['error']) ? $approved_hashes_count : 0 ); - unset($result); - // Adding to log ScanningLogFacade::writeToLog( '' . $stage_data_obj::getTitle() . ' ' . $stage_data_obj->getDescription() From 23f676626034a993b0f06bfb5a4e6fae98538d2b Mon Sep 17 00:00:00 2001 From: Glomberg Date: Wed, 19 Feb 2025 14:34:56 +0300 Subject: [PATCH 05/15] Fix. Firewall. BFP logic fixed. --- lib/CleantalkSP/SpbctWP/Firewall/BFP.php | 66 +++--------------------- security-malware-firewall.php | 12 ++--- 2 files changed, 12 insertions(+), 66 deletions(-) diff --git a/lib/CleantalkSP/SpbctWP/Firewall/BFP.php b/lib/CleantalkSP/SpbctWP/Firewall/BFP.php index a71777279..2ba8047d6 100644 --- a/lib/CleantalkSP/SpbctWP/Firewall/BFP.php +++ b/lib/CleantalkSP/SpbctWP/Firewall/BFP.php @@ -2,10 +2,8 @@ namespace CleantalkSP\SpbctWP\Firewall; -use CleantalkSP\SpbctWP\DB; use CleantalkSP\SpbctWP\Helpers\Helper; use CleantalkSP\Security\Firewall\Result; -use CleantalkSP\SpbctWP\Helpers\IP; class BFP extends FirewallModule { @@ -19,7 +17,6 @@ class BFP extends FirewallModule protected $chance_to_clean = 100; // Chance to clean log table from old entries. In percents. public static $is_checked = false; - protected $use_fw_personal_whitelists = false; /** * @psalm-suppress PossiblyUnusedProperty @@ -36,7 +33,6 @@ public function __construct($params = array()) { $params['count_period'] = $params['count_period'] ?: $this->count_period; $params['block_period'] = $params['block_period'] ?: $this->block_period; - $this->use_fw_personal_whitelists = !empty($params['use_fw_personal_whitelists']) ?: $this->use_fw_personal_whitelists; parent::__construct($params); } @@ -51,11 +47,6 @@ public function check() if ( ( $this->is_login_page && ! $this->is_logged_in ) || ( defined('XMLRPC_REQUEST') && XMLRPC_REQUEST ) ) { foreach ( $this->ip_array as $_ip_origin => $current_ip ) { - if ($this->use_fw_personal_whitelists && $this->isPersonalWhitelisted($current_ip)) { - //probably we should log this case - continue; - } - $rand = rand(1, 100000); $md5_ip = md5($current_ip); $query = "SELECT md5_ip as blocked @@ -76,6 +67,14 @@ public function check() ) ); FirewallState::setIsNeedToIncrementEntire(false); + } else { + $results[] = new Result( + array( + 'module' => 'BFP', + 'ip' => $current_ip, + 'status' => 'PASS', + ) + ); } } } @@ -190,53 +189,4 @@ private function clearTable() } } } - - /** - * Check if the IP is whitelisted in the personal FW whitelist. - * @param $current_ip - * @return bool - */ - private function isPersonalWhitelisted($current_ip) - { - global $spbc; - $result = false; - $fw = new FW( - array( - 'data_table__personal_countries' => SPBC_TBL_FIREWALL_DATA__COUNTRIES, - 'log_table' => SPBC_TBL_FIREWALL_LOG, - 'state' => $spbc, - 'api_key' => $spbc->api_key, - ) - ); - $fw->setDb(new DB()); - try { - $version = IP::validate($current_ip); - if ( $version === 'v6' ) { - //IPV6 handling logic - $db_results = $fw->ipv6GetResultsFromDb($current_ip); - } elseif ($version === 'v4') { - //IPV4 handling logic - $db_results = $fw->ipv4GetResultsFromDb($current_ip); - } else { - throw new \Exception('IP address record is invalid.'); - } - } catch (\Exception $e) { - error_log('Security by CleanTalk. Firewall IP handling error: ' . $e->getMessage()); - } - if (isset($db_results) && is_array($db_results)) { - foreach ($db_results as $_key => $result) { - if ( - isset($result['is_personal']) && - $result['is_personal'] === '1' && - isset($result['status']) && - $result['status'] === '1' - ) { - $result = true; - break; - } - } - } - - return $result; - } } diff --git a/security-malware-firewall.php b/security-malware-firewall.php index cc4a6526f..4e13aee05 100644 --- a/security-malware-firewall.php +++ b/security-malware-firewall.php @@ -574,6 +574,8 @@ function spbc_authenticate__check_brute_force() $login_url = RenameLoginPage::getURL($spbc->settings['login_page_rename__name']); } + $firewall = new \CleantalkSP\SpbctWP\Firewall(); + $bfp = new BFP( array( 'api_key' => $spbc->api_key, @@ -583,18 +585,12 @@ function spbc_authenticate__check_brute_force() 'bf_limit' => $spbc->settings['bfp__allowed_wrong_auths'], 'block_period' => $spbc->settings['bfp__block_period__5_fails'], 'count_period' => $spbc->settings['bfp__count_interval'], - 'use_fw_personal_whitelists' => true, //we can also manage it with settings ) ); - $bfp->setDb(new DB()); - $bfp->setIpArray([IP::get()]); - $bfp_result = $bfp->check(); - $bfp->middleAction(); + $firewall->loadFwModule($bfp); - if (!empty($bfp_result)) { - $bfp->_die($bfp_result[0]); - } + $firewall->run(); } // From 13798acf3c18b1de226f3de9328a2478d650adca Mon Sep 17 00:00:00 2001 From: Glomberg Date: Wed, 19 Feb 2025 14:37:53 +0300 Subject: [PATCH 06/15] Fix. Firewall. BFP was removed from common FW flow. --- inc/spbc-firewall.php | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/inc/spbc-firewall.php b/inc/spbc-firewall.php index 6848f058c..0ba4bc560 100644 --- a/inc/spbc-firewall.php +++ b/inc/spbc-firewall.php @@ -46,27 +46,6 @@ function spbc_firewall__check() $GLOBALS['wp_rewrite'] = new WP_Rewrite(); // Fix for early load WP_Rewrite } - $login_url = wp_login_url(); - if ( $spbc->settings['login_page_rename__enabled'] ) { - //todo This rewrite could break permalinks, need to implement new logic - $GLOBALS['wp_rewrite'] = new WP_Rewrite(); // Fix for early load WP_Rewrite - $login_url = RenameLoginPage::getURL($spbc->settings['login_page_rename__name']); - } - - $firewall->loadFwModule( - new BFP( - array( - 'api_key' => $spbc->api_key, - 'state' => $spbc, - 'is_login_page' => strpos(trim(Server::getURL(), '/'), trim($login_url, '/')) === 0, - 'is_logged_in' => Cookie::get('spbc_is_logged_in') === md5($spbc->data['salt'] . get_option('home')), - 'bf_limit' => $spbc->settings['bfp__allowed_wrong_auths'], - 'block_period' => $spbc->settings['bfp__block_period__5_fails'], - 'count_period' => $spbc->settings['bfp__count_interval'], // Counting login attempts in this interval - ) - ) - ); - if ( $spbc->settings['traffic_control__enabled'] && ( From 7bc21c35b949df253cf0c3dfe8fe50c89d2fffb8 Mon Sep 17 00:00:00 2001 From: Glomberg Date: Tue, 4 Mar 2025 10:38:27 +0300 Subject: [PATCH 07/15] Fix. Firewall. Modules running refactored. --- inc/spbc-firewall.php | 2 +- lib/CleantalkSP/Security/Firewall.php | 184 ++++++++++++++++++ .../Security/Firewall/FirewallModule.php | 2 + lib/CleantalkSP/SpbctWP/Firewall/FW.php | 152 --------------- 4 files changed, 187 insertions(+), 153 deletions(-) diff --git a/inc/spbc-firewall.php b/inc/spbc-firewall.php index 0ba4bc560..3c7fccb31 100644 --- a/inc/spbc-firewall.php +++ b/inc/spbc-firewall.php @@ -16,7 +16,7 @@ function spbc_firewall__check() { global $spbc; - $firewall = new Firewall(); + $firewall = Firewall::getInstance(); $secfw_enabled_on_main_site = false; if (!is_main_site() && $spbc->network_settings['ms__work_mode'] == 2) { diff --git a/lib/CleantalkSP/Security/Firewall.php b/lib/CleantalkSP/Security/Firewall.php index 6031a29c1..d9123d236 100644 --- a/lib/CleantalkSP/Security/Firewall.php +++ b/lib/CleantalkSP/Security/Firewall.php @@ -5,6 +5,7 @@ use CleantalkSP\Common\Helper; use CleantalkSP\Security\Firewall\FirewallModule; use CleantalkSP\SpbctWP\Variables\Cookie; +use CleantalkSP\Templates\Singleton; use CleantalkSP\Variables\Get; use CleantalkSP\Security\Firewall\Result; use CleantalkSP\SpbctWP\Helpers\IP; @@ -25,8 +26,12 @@ */ class Firewall { + use Singleton; + public $ip_array = array(); + public $local_networks; + private $test_block; // Database @@ -67,6 +72,7 @@ public function __construct($db = null) { $this->debug = (bool)Get::get('debug'); $this->ip_array = $this->ipGet('real'); + $this->local_networks = $this->getLocalNetworks(); if ( isset($db) ) { $this->db = $db; @@ -117,6 +123,11 @@ public function run() // Check requests by all enabled modules foreach ( $this->fw_modules as $module ) { + + if ( $module->already_checked ) { + continue; + } + // Perform module check $module_results = $module->check(); @@ -138,6 +149,8 @@ public function run() $module->middleAction($results[$module->module_name]); } + $module->already_checked = true; + // Don't use other modules if the IP is whitelisted if ( $this->isWhitelisted($results) && ! empty($this->test_block) ) { break; @@ -287,4 +300,175 @@ private function isWhitelisted($results) public function updateLog(Result $fw_result) { } + + public function getLocalNetworks() + { + try { + $version = IP::validate($current_ip); + if ( $version === 'v6' ) { + //IPV6 handling logic + $db_results = $this->ipv6GetResultsFromDb($current_ip); + } elseif ($version === 'v4') { + //IPV4 handling logic + $db_results = $this->ipv4GetResultsFromDb($current_ip); + } else { + throw new \Exception('IP address record is invalid.'); + } + } catch (\Exception $e) { + error_log('Security by CleanTalk. Firewall IP handling error: ' . $e->getMessage()); + continue; + } + } + + /** + * Return array of database search result for IP (ipv4) + * @param $ip + * @return array|null|object + */ + public function ipv4GetResultsFromDb($ip) + { + $current_ipv4 = sprintf('%u', ip2long($ip)); + $needles = IP::getNetworkNeedles([$current_ipv4]); + $data_table__common_v4 = SPBC_TBL_FIREWALL_DATA_V4; + $data_table__personal_v4 = SPBC_TBL_FIREWALL_DATA__IPS_V4; + + $query_ipv4 = '( + SELECT 0 AS is_personal, 1 AS is_ip, status, country_code, network, mask + FROM ' . $data_table__common_v4 . ' + WHERE network IN (' . current($needles) . ') + AND network = ' . $current_ipv4 . ' & mask + AND country_code = "0" + ) UNION ( + SELECT 1 AS is_personal, 1 AS is_ip, status, 0 AS country_code, network, mask + FROM ' . $data_table__personal_v4 . ' + WHERE network IN (' . current($needles) . ') + AND network = ' . $current_ipv4 . ' & mask + ) UNION ( + SELECT 1 AS is_personal, 0 AS is_ip, tbl_private.status, country_code, network, mask + FROM ' . $this->data_table__personal_countries . ' AS tbl_private + RIGHT JOIN ' . $data_table__common_v4 . ' AS tbl_common USING(country_code) + WHERE network IN (' . current($needles) . ') + AND network = ' . $current_ipv4 . ' & mask + AND tbl_private.status IS NOT NULL + AND ' . mt_rand(1, 100000) . ' <> 0 + )'; + + $db_results = $this->db->fetchAll($query_ipv4, ARRAY_A); + + return $db_results; + } + + /** + * Return database search result for IP (ipv6) + * @param $ip + * @return array + * @throws \Exception + */ + public function ipv6GetResultsFromDb($ip) + { + $needles = IP::getNetworkNeedles(IP::getFourIPv4FromIP($ip)); + $data_table__common_v6 = SPBC_TBL_FIREWALL_DATA_V6; + $data_table__personal_v6 = SPBC_TBL_FIREWALL_DATA__IPS_V6; + + $query_ipv6 = '( + SELECT 0 AS is_personal, 1 AS is_ip, status, country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 + FROM ' . $data_table__common_v6 . ' + WHERE + network1 IN (0,' . $needles[0] . ') + AND network2 IN (0,' . $needles[1] . ') + AND network3 IN (0,' . $needles[2] . ') + AND network4 IN (0,' . $needles[3] . ') + AND country_code = "0" + ) UNION ( + SELECT 1 AS is_personal, 1 AS is_ip, status, 0 AS country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 + FROM ' . $data_table__personal_v6 . ' + WHERE + network1 IN (0,' . $needles[0] . ') + AND network2 IN (0,' . $needles[1] . ') + AND network3 IN (0,' . $needles[2] . ') + AND network4 IN (0,' . $needles[3] . ') + ) UNION ( + SELECT 1 AS is_personal, 0 AS is_ip, tbl_private.status, country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 + FROM ' . $this->data_table__personal_countries . ' AS tbl_private + RIGHT JOIN ' . $data_table__common_v6 . ' AS tbl_common USING(country_code) + WHERE + network1 IN (0,' . $needles[0] . ') + AND network2 IN (0,' . $needles[1] . ') + AND network3 IN (0,' . $needles[2] . ') + AND network4 IN (0,' . $needles[3] . ') + AND tbl_private.status IS NOT NULL + AND ' . mt_rand(1, 100000) . ' <> 0 + )'; + + $db_results = $this->db->fetchAll($query_ipv6, ARRAY_A); + + $output_db_results = array(); + + $error = ''; + + foreach ($db_results as $current_result) { + //collecting data + if ( !isset( + $current_result['network1'], + $current_result['network2'], + $current_result['network3'], + $current_result['network4'], + $current_result['mask1'], + $current_result['mask2'], + $current_result['mask3'], + $current_result['mask4'] + ) ) { + $error = 'db data is not correct;'; + continue; + } + $hex_network_from_db = str_pad(dechex($current_result['network1']), 8, '0', STR_PAD_LEFT); + $hex_network_from_db .= str_pad(dechex($current_result['network2']), 8, '0', STR_PAD_LEFT); + $hex_network_from_db .= str_pad(dechex($current_result['network3']), 8, '0', STR_PAD_LEFT); + $hex_network_from_db .= str_pad(dechex($current_result['network4']), 8, '0', STR_PAD_LEFT); + + if ( strlen($hex_network_from_db) <> 32) { + $error = 'can not collect hex string from db'; + continue; + } + + $mask = IP::convertLongIntmaskToDec($current_result['mask1']); + $mask += IP::convertLongIntmaskToDec($current_result['mask2']); + $mask += IP::convertLongIntmaskToDec($current_result['mask3']); + $mask += IP::convertLongIntmaskToDec($current_result['mask4']); + + if ( !is_int($mask) || $mask < 0 || $mask > 128 ) { + $error = 'can not collect network mask from db'; + continue; + } + + //converting stuff + $ipv6_network_from_db = implode(':', str_split($hex_network_from_db, 4)); + + if ( IP::validate($ipv6_network_from_db) !== 'v6' ) { + $error = 'can not construct ipv6 subnet from db'; + continue; + } + + $ip = IP::extendIPv6(IP::normalizeIPv6($ip)); + + //belonging check logic + $ip_in_network = IP::isIpv6AddrInIpv6Network($ip, $ipv6_network_from_db, $mask); + + if ( false === $ip_in_network ) { + $error = 'can not check if address belongs to network'; + continue; + } + + if ($ip_in_network === 1) { + //output found result + $output_db_results[] = $current_result; + } + } + + if ( !empty($error) ) { + throw new \Exception($error); + } + + return $output_db_results; + } } diff --git a/lib/CleantalkSP/Security/Firewall/FirewallModule.php b/lib/CleantalkSP/Security/Firewall/FirewallModule.php index 737186151..dcd41fdf4 100644 --- a/lib/CleantalkSP/Security/Firewall/FirewallModule.php +++ b/lib/CleantalkSP/Security/Firewall/FirewallModule.php @@ -20,6 +20,8 @@ class FirewallModule extends FirewallModuleAbstract { public $module_name; + public $already_checked = false; + /** * @var DB */ diff --git a/lib/CleantalkSP/SpbctWP/Firewall/FW.php b/lib/CleantalkSP/SpbctWP/Firewall/FW.php index e02b4be90..c3c507bab 100644 --- a/lib/CleantalkSP/SpbctWP/Firewall/FW.php +++ b/lib/CleantalkSP/SpbctWP/Firewall/FW.php @@ -139,158 +139,6 @@ public function check() return $results; } - /** - * Return array of database search result for IP (ipv4) - * @param $ip - * @return array|null|object - */ - public function ipv4GetResultsFromDb($ip) - { - $current_ipv4 = sprintf('%u', ip2long($ip)); - $needles = IP::getNetworkNeedles([$current_ipv4]); - $data_table__common_v4 = SPBC_TBL_FIREWALL_DATA_V4; - $data_table__personal_v4 = SPBC_TBL_FIREWALL_DATA__IPS_V4; - - $query_ipv4 = '( - SELECT 0 AS is_personal, 1 AS is_ip, status, country_code, network, mask - FROM ' . $data_table__common_v4 . ' - WHERE network IN (' . current($needles) . ') - AND network = ' . $current_ipv4 . ' & mask - AND country_code = "0" - ) UNION ( - SELECT 1 AS is_personal, 1 AS is_ip, status, 0 AS country_code, network, mask - FROM ' . $data_table__personal_v4 . ' - WHERE network IN (' . current($needles) . ') - AND network = ' . $current_ipv4 . ' & mask - ) UNION ( - SELECT 1 AS is_personal, 0 AS is_ip, tbl_private.status, country_code, network, mask - FROM ' . $this->data_table__personal_countries . ' AS tbl_private - RIGHT JOIN ' . $data_table__common_v4 . ' AS tbl_common USING(country_code) - WHERE network IN (' . current($needles) . ') - AND network = ' . $current_ipv4 . ' & mask - AND tbl_private.status IS NOT NULL - AND ' . mt_rand(1, 100000) . ' <> 0 - )'; - - $db_results = $this->db->fetchAll($query_ipv4, ARRAY_A); - - return $db_results; - } - - /** - * Return database search result for IP (ipv6) - * @param $ip - * @return array - * @throws \Exception - */ - public function ipv6GetResultsFromDb($ip) - { - $needles = IP::getNetworkNeedles(IP::getFourIPv4FromIP($ip)); - $data_table__common_v6 = SPBC_TBL_FIREWALL_DATA_V6; - $data_table__personal_v6 = SPBC_TBL_FIREWALL_DATA__IPS_V6; - - $query_ipv6 = '( - SELECT 0 AS is_personal, 1 AS is_ip, status, country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 - FROM ' . $data_table__common_v6 . ' - WHERE - network1 IN (0,' . $needles[0] . ') - AND network2 IN (0,' . $needles[1] . ') - AND network3 IN (0,' . $needles[2] . ') - AND network4 IN (0,' . $needles[3] . ') - AND country_code = "0" - ) UNION ( - SELECT 1 AS is_personal, 1 AS is_ip, status, 0 AS country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 - FROM ' . $data_table__personal_v6 . ' - WHERE - network1 IN (0,' . $needles[0] . ') - AND network2 IN (0,' . $needles[1] . ') - AND network3 IN (0,' . $needles[2] . ') - AND network4 IN (0,' . $needles[3] . ') - ) UNION ( - SELECT 1 AS is_personal, 0 AS is_ip, tbl_private.status, country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 - FROM ' . $this->data_table__personal_countries . ' AS tbl_private - RIGHT JOIN ' . $data_table__common_v6 . ' AS tbl_common USING(country_code) - WHERE - network1 IN (0,' . $needles[0] . ') - AND network2 IN (0,' . $needles[1] . ') - AND network3 IN (0,' . $needles[2] . ') - AND network4 IN (0,' . $needles[3] . ') - AND tbl_private.status IS NOT NULL - AND ' . mt_rand(1, 100000) . ' <> 0 - )'; - - $db_results = $this->db->fetchAll($query_ipv6, ARRAY_A); - - $output_db_results = array(); - - $error = ''; - - foreach ($db_results as $current_result) { - //collecting data - if ( !isset( - $current_result['network1'], - $current_result['network2'], - $current_result['network3'], - $current_result['network4'], - $current_result['mask1'], - $current_result['mask2'], - $current_result['mask3'], - $current_result['mask4'] - ) ) { - $error = 'db data is not correct;'; - continue; - } - $hex_network_from_db = str_pad(dechex($current_result['network1']), 8, '0', STR_PAD_LEFT); - $hex_network_from_db .= str_pad(dechex($current_result['network2']), 8, '0', STR_PAD_LEFT); - $hex_network_from_db .= str_pad(dechex($current_result['network3']), 8, '0', STR_PAD_LEFT); - $hex_network_from_db .= str_pad(dechex($current_result['network4']), 8, '0', STR_PAD_LEFT); - - if ( strlen($hex_network_from_db) <> 32) { - $error = 'can not collect hex string from db'; - continue; - } - - $mask = IP::convertLongIntmaskToDec($current_result['mask1']); - $mask += IP::convertLongIntmaskToDec($current_result['mask2']); - $mask += IP::convertLongIntmaskToDec($current_result['mask3']); - $mask += IP::convertLongIntmaskToDec($current_result['mask4']); - - if ( !is_int($mask) || $mask < 0 || $mask > 128 ) { - $error = 'can not collect network mask from db'; - continue; - } - - //converting stuff - $ipv6_network_from_db = implode(':', str_split($hex_network_from_db, 4)); - - if ( IP::validate($ipv6_network_from_db) !== 'v6' ) { - $error = 'can not construct ipv6 subnet from db'; - continue; - } - - $ip = IP::extendIPv6(IP::normalizeIPv6($ip)); - - //belonging check logic - $ip_in_network = IP::isIpv6AddrInIpv6Network($ip, $ipv6_network_from_db, $mask); - - if ( false === $ip_in_network ) { - $error = 'can not check if address belongs to network'; - continue; - } - - if ($ip_in_network === 1) { - //output found result - $output_db_results[] = $current_result; - } - } - - if ( !empty($error) ) { - throw new \Exception($error); - } - - return $output_db_results; - } - /** * Sends and wipe SFW log * From 493f6d7e55d4fddc21c4f56d4075ad35fef0fc1b Mon Sep 17 00:00:00 2001 From: AntonV1211 Date: Thu, 6 Feb 2025 13:56:41 +0700 Subject: [PATCH 08/15] Upd. Backup Restore. Collecting a deletion error message from backup and outputting it after the remaining operations --- inc/spbc-scanner.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/inc/spbc-scanner.php b/inc/spbc-scanner.php index 36666a929..b0ab7258b 100644 --- a/inc/spbc-scanner.php +++ b/inc/spbc-scanner.php @@ -2105,9 +2105,10 @@ function spbc_restore_file_from_backup_ajax_action_handler($id) // Success: remove all data about backup try { $backup_deleted = unlink($full_backup_path); + $error_delete_backup_message = array(); if ($backup_deleted === false) { - return array('error' => esc_html__('Deleting backup error: Permissions denied.', 'security-malware-firewall')); + $error_delete_backup_message = array('error' => esc_html__('Deleting backup error: Permissions denied.', 'security-malware-firewall')); } // Remove from backup @@ -2120,7 +2121,7 @@ function spbc_restore_file_from_backup_ajax_action_handler($id) $delete = $wpdb->query($sql_prepared); if (is_null($delete)) { - return array('error' => esc_html__('Error: Something is wrong during deleting backup.', 'security-malware-firewall')); + $error_delete_backup_message = array('error' => esc_html__('Error: Something is wrong during deleting backup.', 'security-malware-firewall')); } // update cure log @@ -2149,13 +2150,18 @@ function spbc_restore_file_from_backup_ajax_action_handler($id) $backup_prev_results_state['checked_signatures'], $backup_prev_results_state['status'], $backup_prev_results_state['severity'], - $file_path) + $file_path + ) ); $updated = $wpdb->query($sql_prepared); if (is_null($updated)) { return array('error' => esc_html__('Error: Something is wrong during saving previous state of file.', 'security-malware-firewall')); } } + + if ($error_delete_backup_message) { + return $error_delete_backup_message; + } } catch (\Exception $e) { return array('error' => esc_html__('Error: Something is wrong.', 'security-malware-firewall')); } From cc29a155dd3dbfb8a4978b88507d42a82004f3dc Mon Sep 17 00:00:00 2001 From: AntonV1211 Date: Thu, 6 Feb 2025 18:55:09 +0700 Subject: [PATCH 09/15] Upd. Backup Restore. Error output, exception handling --- inc/spbc-scanner.php | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/inc/spbc-scanner.php b/inc/spbc-scanner.php index b0ab7258b..a3e98ac21 100644 --- a/inc/spbc-scanner.php +++ b/inc/spbc-scanner.php @@ -2105,10 +2105,8 @@ function spbc_restore_file_from_backup_ajax_action_handler($id) // Success: remove all data about backup try { $backup_deleted = unlink($full_backup_path); - $error_delete_backup_message = array(); - if ($backup_deleted === false) { - $error_delete_backup_message = array('error' => esc_html__('Deleting backup error: Permissions denied.', 'security-malware-firewall')); + wp_send_json_error(esc_html__('Deleting backup error: Permissions denied.', 'security-malware-firewall')); } // Remove from backup @@ -2119,12 +2117,12 @@ function spbc_restore_file_from_backup_ajax_action_handler($id) $file_path ); $delete = $wpdb->query($sql_prepared); - if (is_null($delete)) { - $error_delete_backup_message = array('error' => esc_html__('Error: Something is wrong during deleting backup.', 'security-malware-firewall')); + wp_send_json_error(esc_html__('Deleting backup error: Something is wrong during deleting backup.', 'security-malware-firewall')); } - // update cure log + + // update cure log $sql_prepared = $wpdb->prepare( 'UPDATE ' . SPBC_TBL_CURE_LOG . ' SET is_restored = 1, ' @@ -2135,11 +2133,11 @@ function spbc_restore_file_from_backup_ajax_action_handler($id) $update_cure_log = $wpdb->query($sql_prepared); if (is_null($update_cure_log)) { - return array('error' => esc_html__('Error: Something is wrong during updating cure log.', 'security-malware-firewall')); + wp_send_json_error(esc_html__('Error update cure log: Something is wrong during updating cure log.', 'security-malware-firewall')); } + // update scan results table if ($backup_prev_results_state !== null) { - // update scan results table $sql_prepared = $wpdb->prepare( 'UPDATE ' . SPBC_TBL_SCAN_FILES . ' SET weak_spots = %s, checked_heuristic = %s, checked_signatures = %s, status = %s, severity = %s' @@ -2155,15 +2153,11 @@ function spbc_restore_file_from_backup_ajax_action_handler($id) ); $updated = $wpdb->query($sql_prepared); if (is_null($updated)) { - return array('error' => esc_html__('Error: Something is wrong during saving previous state of file.', 'security-malware-firewall')); + wp_send_json_error(esc_html__('Error update scan results: Something is wrong during saving previous state of file.', 'security-malware-firewall')); } } - - if ($error_delete_backup_message) { - return $error_delete_backup_message; - } } catch (\Exception $e) { - return array('error' => esc_html__('Error: Something is wrong.', 'security-malware-firewall')); + throw new Exception(esc_html__('Error: Something is wrong.', 'security-malware-firewall')); } return array('success' => true); @@ -2175,10 +2169,7 @@ function spbc_restore_file_from_backup_ajax_action() $file_fast_hash = isset($_POST['file_fast_hash']) ? esc_sql($_POST['file_fast_hash']) : null; - $result = spbc_restore_file_from_backup_ajax_action_handler($file_fast_hash); - if (isset($result['error'])) { - wp_send_json_error($result['error']); - } + spbc_restore_file_from_backup_ajax_action_handler($file_fast_hash); wp_send_json_success(esc_html__('Success!', 'security-malware-firewall')); } From b68aab110c22818f10a6acd62d65f3a31b7c991a Mon Sep 17 00:00:00 2001 From: AntonV1211 Date: Wed, 19 Feb 2025 17:46:40 +0700 Subject: [PATCH 10/15] Mod. Backup Restore. Separation of logic after deleting backup after file recovery --- inc/spbc-scanner.php | 130 ++++++++++++++++++++++++++----------------- 1 file changed, 79 insertions(+), 51 deletions(-) diff --git a/inc/spbc-scanner.php b/inc/spbc-scanner.php index a3e98ac21..c5c7959ab 100644 --- a/inc/spbc-scanner.php +++ b/inc/spbc-scanner.php @@ -2104,63 +2104,91 @@ function spbc_restore_file_from_backup_ajax_action_handler($id) // Success: remove all data about backup try { - $backup_deleted = unlink($full_backup_path); - if ($backup_deleted === false) { - wp_send_json_error(esc_html__('Deleting backup error: Permissions denied.', 'security-malware-firewall')); - } - - // Remove from backup - $sql_prepared = $wpdb->prepare( - 'DELETE ' - . ' FROM ' . SPBC_TBL_BACKUPED_FILES - . ' WHERE real_path="%s";', - $file_path - ); - $delete = $wpdb->query($sql_prepared); - if (is_null($delete)) { - wp_send_json_error(esc_html__('Deleting backup error: Something is wrong during deleting backup.', 'security-malware-firewall')); + delete_backup_file($full_backup_path); + remove_backup_from_db($file_path); + update_cure_log($file_path); + if ($backup_prev_results_state !== null) { + update_scan_results($file_path, $backup_prev_results_state); } + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + return array('success' => true); +} +/** + * Deleting a backup file + * @param string $full_backup_path + * @throws \Exception + * @return void + */ +function delete_backup_file($full_backup_path) +{ + if (!unlink($full_backup_path)) { + throw new Exception(esc_html__('Deleting backup error: Permissions denied.', 'security-malware-firewall')); + } +} - // update cure log - $sql_prepared = $wpdb->prepare( - 'UPDATE ' . SPBC_TBL_CURE_LOG - . ' SET is_restored = 1, ' - . ' cure_status = 0 ' - . ' WHERE real_path = %s;', - array($file_path) - ); - $update_cure_log = $wpdb->query($sql_prepared); - - if (is_null($update_cure_log)) { - wp_send_json_error(esc_html__('Error update cure log: Something is wrong during updating cure log.', 'security-malware-firewall')); - } +/** + * Deleting a backup from a database + * @param string $file_path + * @throws \Exception + * @return void + */ +function remove_backup_from_db($file_path) +{ + global $wpdb; + $sql_prepared = $wpdb->prepare( + 'DELETE FROM ' . SPBC_TBL_BACKUPED_FILES . ' WHERE real_path = %s;', + $file_path + ); + if ($wpdb->query($sql_prepared) === false) { + throw new Exception(esc_html__('Deleting backup error: Something is wrong during deleting backup.', 'security-malware-firewall')); + } +} - // update scan results table - if ($backup_prev_results_state !== null) { - $sql_prepared = $wpdb->prepare( - 'UPDATE ' . SPBC_TBL_SCAN_FILES - . ' SET weak_spots = %s, checked_heuristic = %s, checked_signatures = %s, status = %s, severity = %s' - . ' WHERE path = %s;', - array( - $backup_prev_results_state['weak_spots'], - $backup_prev_results_state['checked_heuristic'], - $backup_prev_results_state['checked_signatures'], - $backup_prev_results_state['status'], - $backup_prev_results_state['severity'], - $file_path - ) - ); - $updated = $wpdb->query($sql_prepared); - if (is_null($updated)) { - wp_send_json_error(esc_html__('Error update scan results: Something is wrong during saving previous state of file.', 'security-malware-firewall')); - } - } - } catch (\Exception $e) { - throw new Exception(esc_html__('Error: Something is wrong.', 'security-malware-firewall')); +/** + * Changing the file information in the cure_log table regarding file recovery + * @param string $file_path + * @throws \Exception + * @return void + */ +function update_cure_log($file_path) +{ + global $wpdb; + $sql_prepared = $wpdb->prepare( + 'UPDATE ' . SPBC_TBL_CURE_LOG . ' SET is_restored = 1, cure_status = 0 WHERE real_path = %s;', + $file_path + ); + if ($wpdb->query($sql_prepared) === false) { + throw new Exception(esc_html__('Error update cure log: Something is wrong during updating cure log.', 'security-malware-firewall')); } +} - return array('success' => true); +/** + * Changing file information after recovery + * @param string $file_path + * @param array $backup_prev_results_state + * @throws \Exception + * @return void + */ +function update_scan_results($file_path, $backup_prev_results_state) +{ + global $wpdb; + $sql_prepared = $wpdb->prepare( + 'UPDATE ' . SPBC_TBL_SCAN_FILES . ' SET weak_spots = %s, checked_heuristic = %s, checked_signatures = %s, status = %s, severity = %s WHERE path = %s;', + array( + $backup_prev_results_state['weak_spots'], + $backup_prev_results_state['checked_heuristic'], + $backup_prev_results_state['checked_signatures'], + $backup_prev_results_state['status'], + $backup_prev_results_state['severity'], + $file_path + ) + ); + if ($wpdb->query($sql_prepared) === false) { + throw new Exception(esc_html__('Error update scan results: Something is wrong during saving previous state of file.', 'security-malware-firewall')); + } } function spbc_restore_file_from_backup_ajax_action() From 6047370d757879bc3b0916eb4591405e7257587b Mon Sep 17 00:00:00 2001 From: AntonV1211 Date: Thu, 20 Feb 2025 15:38:51 +0700 Subject: [PATCH 11/15] Upd. Backup Restore. Changing the logic of error collection and output --- inc/spbc-scanner.php | 121 ++++++++++++++--------- js/spbc-settings_tab--scanner.min.js | 2 +- js/spbc-settings_tab--scanner.min.js.map | 2 +- js/src/spbc-settings_tab--scanner.js | 6 +- 4 files changed, 77 insertions(+), 54 deletions(-) diff --git a/inc/spbc-scanner.php b/inc/spbc-scanner.php index c5c7959ab..1a1ff1ff2 100644 --- a/inc/spbc-scanner.php +++ b/inc/spbc-scanner.php @@ -2103,92 +2103,111 @@ function spbc_restore_file_from_backup_ajax_action_handler($id) } // Success: remove all data about backup - try { - delete_backup_file($full_backup_path); - remove_backup_from_db($file_path); - update_cure_log($file_path); - if ($backup_prev_results_state !== null) { - update_scan_results($file_path, $backup_prev_results_state); + $error_msg = array( + spbct_delete_backup_file($full_backup_path), + spbct_remove_backup_from_db($file_path), + spbct_update_cure_log($file_path), + spbct_update_scan_results($file_path, $backup_prev_results_state) + ); + + foreach ($error_msg as $value) { + if (array_key_exists('error', $value)) { + return $value; } - } catch (Exception $e) { - throw new Exception($e->getMessage()); } + return array('success' => true); } /** * Deleting a backup file * @param string $full_backup_path - * @throws \Exception - * @return void + * @return array */ -function delete_backup_file($full_backup_path) +function spbct_delete_backup_file($full_backup_path) { - if (!unlink($full_backup_path)) { - throw new Exception(esc_html__('Deleting backup error: Permissions denied.', 'security-malware-firewall')); + if ($full_backup_path) { + if (!unlink($full_backup_path)) { + return array('error' => esc_html__('Deleting backup error: Permissions denied.', 'security-malware-firewall')); + } + } else { + return array('error' => esc_html__('Deleting backup error: Incorrect backup file path.', 'security-malware-firewall')); } + return array(); } /** * Deleting a backup from a database * @param string $file_path - * @throws \Exception - * @return void + * @return array */ -function remove_backup_from_db($file_path) +function spbct_remove_backup_from_db($file_path) { global $wpdb; - $sql_prepared = $wpdb->prepare( - 'DELETE FROM ' . SPBC_TBL_BACKUPED_FILES . ' WHERE real_path = %s;', - $file_path - ); - if ($wpdb->query($sql_prepared) === false) { - throw new Exception(esc_html__('Deleting backup error: Something is wrong during deleting backup.', 'security-malware-firewall')); + if ($file_path) { + $sql_prepared = $wpdb->prepare( + 'DELETE FROM ' . SPBC_TBL_BACKUPED_FILES . ' WHERE real_path = %s;', + $file_path + ); + if ($wpdb->query($sql_prepared) === false) { + return array('error' => esc_html__('Deleting backup error: Something is wrong during deleting backup.', 'security-malware-firewall')); + } + } else { + return array('error' => esc_html__('Deleting backup error: Incorrect backup file path for the database query.', 'security-malware-firewall')); } + return array(); } /** * Changing the file information in the cure_log table regarding file recovery * @param string $file_path - * @throws \Exception - * @return void + * @return array */ -function update_cure_log($file_path) +function spbct_update_cure_log($file_path) { global $wpdb; - $sql_prepared = $wpdb->prepare( - 'UPDATE ' . SPBC_TBL_CURE_LOG . ' SET is_restored = 1, cure_status = 0 WHERE real_path = %s;', - $file_path - ); - if ($wpdb->query($sql_prepared) === false) { - throw new Exception(esc_html__('Error update cure log: Something is wrong during updating cure log.', 'security-malware-firewall')); + if ($file_path) { + $sql_prepared = $wpdb->prepare( + 'UPDATE ' . SPBC_TBL_CURE_LOG . ' SET is_restored = 1, cure_status = 0 WHERE real_path = %s;', + $file_path + ); + if ($wpdb->query($sql_prepared) === false) { + return array('error' => esc_html__('Error update cure log: Something is wrong during updating cure log.', 'security-malware-firewall')); + } + } else { + return array('error' => esc_html__('Error update cure log: Incorrect backup file path for the database query.', 'security-malware-firewall')); } + return array(); } /** * Changing file information after recovery * @param string $file_path * @param array $backup_prev_results_state - * @throws \Exception - * @return void + * @return array */ -function update_scan_results($file_path, $backup_prev_results_state) +function spbct_update_scan_results($file_path, $backup_prev_results_state) { global $wpdb; - $sql_prepared = $wpdb->prepare( - 'UPDATE ' . SPBC_TBL_SCAN_FILES . ' SET weak_spots = %s, checked_heuristic = %s, checked_signatures = %s, status = %s, severity = %s WHERE path = %s;', - array( - $backup_prev_results_state['weak_spots'], - $backup_prev_results_state['checked_heuristic'], - $backup_prev_results_state['checked_signatures'], - $backup_prev_results_state['status'], - $backup_prev_results_state['severity'], - $file_path - ) - ); - if ($wpdb->query($sql_prepared) === false) { - throw new Exception(esc_html__('Error update scan results: Something is wrong during saving previous state of file.', 'security-malware-firewall')); + if ($file_path && $backup_prev_results_state !== null) { + $sql_prepared = $wpdb->prepare( + 'UPDATE ' . SPBC_TBL_SCAN_FILES . ' SET weak_spots = %s, checked_heuristic = %s, checked_signatures = %s, status = %s, severity = %s WHERE path = %s;', + array( + $backup_prev_results_state['weak_spots'], + $backup_prev_results_state['checked_heuristic'], + $backup_prev_results_state['checked_signatures'], + $backup_prev_results_state['status'], + $backup_prev_results_state['severity'], + $file_path + ) + ); + if ($wpdb->query($sql_prepared) === false) { + return array('error' => esc_html__('Error update scan results: Something is wrong during saving previous state of file.', 'security-malware-firewall')); + } + } else { + return array('error' => esc_html__('Error update scan results: Incorrect data for changing the recovery results about the file', 'security-malware-firewall')); } + return array(); } function spbc_restore_file_from_backup_ajax_action() @@ -2197,9 +2216,13 @@ function spbc_restore_file_from_backup_ajax_action() $file_fast_hash = isset($_POST['file_fast_hash']) ? esc_sql($_POST['file_fast_hash']) : null; - spbc_restore_file_from_backup_ajax_action_handler($file_fast_hash); + $restore_result = spbc_restore_file_from_backup_ajax_action_handler($file_fast_hash); - wp_send_json_success(esc_html__('Success!', 'security-malware-firewall')); + if (isset($restore_result['success'])) { + wp_send_json_success(esc_html__('Success!', 'security-malware-firewall')); + } elseif (isset($restore_result['error'])) { + wp_send_json_error($restore_result['error']); + } } /** diff --git a/js/spbc-settings_tab--scanner.min.js b/js/spbc-settings_tab--scanner.min.js index 2d5b227a0..eb51b077e 100644 --- a/js/spbc-settings_tab--scanner.min.js +++ b/js/spbc-settings_tab--scanner.min.js @@ -1,2 +1,2 @@ -function spbcPopupTipShow(e){var t=e.attr("spbc_tip_title")||null,n=e.attr("spbc_tip_text")||null;function o(e){void 0!==e&&0!=jQuery(e.target).parent(".spbc_popup_tip--wrapper").length&&!jQuery(e.target).hasClass("spbc_popup_tip--icon---cancel")||(jQuery(".spbc_popup_tip--wrapper").hide(),jQuery(document).off("click",o))}o(),e.after("
");var c=jQuery(".spbc_popup_tip--wrapper");c.empty().append("
").css({top:e.position().top-2,left:e.position().left+25}),c.append("").append("

"+t+"

").append("

"+n+"

"),jQuery(document).on("click",o),e.parents("tr").on("mouseout",o)}function spbcScannerButtonFileViewEvent(e){var e=jQuery(e),t={action:"spbc_scanner_file_view",file_id:e.parents(".row-actions").attr("uid")},e={spinner:e.parent().siblings(".tbl-preloader--tiny"),callback:spbcScannerButtonViewCallback,errorOutput:function(e){spbcModal.open().putError(e),document.addEventListener("spbcModalClosed",function(e){spbcReloadAccordion()})}};spbcSendAJAXRequest(t,e)}function spbcScannerAnalysisLogDeleteFromLog(e){let n=[];var t=jQuery(e);let o;if(jQuery(e).hasClass("tbl-row_action"))n.push(t.parents(".row-actions").attr("uid")),o=t.parent().siblings(".tbl-preloader--tiny");else{e=t.closest("#spbc_tbl__scanner_analysis_log").find(".cb-select:checked");if(0===e.length)return void alert("Please, select elements.");e.each(function(e,t){t=jQuery(t).val();n.push(t)}),o=t.children(".tbl-preloader--small")}e={action:"spbc_scanner_analysis_log_delete_from_log",file_ids:n},t={spinner:o,callback:function(){window.location.reload()}};spbcSendAJAXRequest(e,t)}function spbcScannerButtonPageViewEvent(e){var e=jQuery(e),t={action:"spbc_scanner_page_view",page_url:e.parents(".row-actions").attr("uid")},e={spinner:e.parent().siblings(".tbl-preloader--tiny"),callback:spbcScannerButtonViewCallback,errorOutput:function(e){spbcModal.open().putError(e)}},n=jQuery("#wpwrap"),o=jQuery("#spbc_dialog"),c=(o.dialog({modal:!0,title:"Loading..",position:{my:"center top",at:"center top+100px",of:window},width:n.width()/100*90,show:{effect:"blind",duration:500},draggable:!1,resizable:!1,closeText:"X",classes:{"ui-dialog":"spbc---top"},open:function(e,t){e.target.style.overflow="auto",jQuery("#spbc_dialog").height(document.documentElement.clientHeight/100*25)},beforeClose:function(e,t){document.body.style.overflow="auto",jQuery("#spbc_dialog").empty()}}),o.append('Wait for downloading'),jQuery("#spbc_file_view_preloader")),n=4e-4*n.width();c.height(128*n),c.width(128*n),c.css({left:o.width()/2-128*n/2}),c.css({top:o.height()/2-128*n/2}),spbcSendAJAXRequest(t,e)}function spbcScannerButtonViewCallback(e){var t,n=jQuery("#spbc_dialog"),o=(n.empty(),jQuery("#spbc_file_view_preloader").css({display:"none"}),'
%s');for(t in o+='

%s


',e.file)n.append(o.printf(t,e.file[t]));var c=19*Object.keys(e.file).length<76?76:19*Object.keys(e.file).length,s=document.documentElement.clientHeight/100*75;let a=c%s


','
'),i=(r=r+'%s'+'

%s


',[]),p=[];for(c in t.weak_spots=JSON.parse(t.weak_spots),t.weak_spots)i[c]=Object.keys(t.weak_spots[c]);for(key in o=Object.keys(i).sort())p[o[key]]=i[o[key]];for(s in p){var l,u="spbc-dialog-row-header-"+s.toLowerCase(),_='',d=(_+=s+" weakspots:",jQuery("#spbc_dialog")),_=(d.append(a.printf("",_)),d.append(a.printf("...","...")),d.find("#"+u));for(l in _.parent().parent().css("text-align","center"),_.parent().parent().css("border","1px dotted"),_.parent().parent().css("background","darkgrey"),i[s]){l=[...new Set(l)].sort();var b,f=+i[s][l];for(let e=f-2;e<=2+f;e++)void 0!==t.file[e]&&(b=f===e?'
%s

%s


':a,d.append(b.printf(e,t.file[e])));d.append(a.printf("...","..."))}}jQuery("#spbc_dialog div").last().remove();var r=19*jQuery("#spbc_dialog div").length<76?76:19*jQuery("#spbc_dialog div").length,y=document.documentElement.clientHeight/100*75;let g=r{};if(1==c.success){console.log(c);var s,a='
%s

%s


';let o=[];for(s in c.weak_spots=JSON.parse(c.weak_spots),c.weak_spots)o=o.concat(Object.keys(c.weak_spots[s]));o=[...new Set(o)].sort();var r,i=new Map(Object.entries(c.weak_spots.CRITICAL));for(r in o)if(0!=r||!i.get(o[r]).toLowerCase().includes("doctype")){var p=+o[r];for(let n=p-2;n<=2+p;n++)if(void 0!==c.file[n]){var l=p===n;let e,t;e=l?'
%s

%s


':a,t=l&&!c.file[n].includes("iframe")?e.printf(n,i.get(o[r])):e.printf(n,c.file[n]),jQuery("#spbc_dialog").append(t)}jQuery("#spbc_dialog").append(a.printf("","")),jQuery("#spbc_dialog div").last().remove()}}else jQuery("#spbc_dialog").append('
%s
'.printf(c.content)),n=()=>{document.location.reload()};var o=19*jQuery("#spbc_dialog div").length<76?76:19*jQuery("#spbc_dialog div").length,u=document.documentElement.clientHeight/100*75;let _=o{document.getElementById("spbc_scanner__last_scan_info").innerText=e.data}})}function spbcScannerButtonCureFileAjaxHandler(e){e={action:"spbc_file_cure_ajax_action",file_fast_hash:jQuery(e).parents(".row-actions").attr("uid"),security:spbcSettings.ajax_nonce};jQuery.ajax({type:"POST",async:!0,url:spbcSettings.ajaxurl,data:e,success:function(e){e.success?(spbcModal.open().put(e.data),document.addEventListener("spbcModalClosed",function(e){document.location.reload()})):spbcModal.open().putError(e.data)}})}function spbcScannerButtonRestoreFromBackupAjaxHandler(e){e={action:"spbc_restore_file_from_backup_ajax_action",file_fast_hash:jQuery(e).parents(".row-actions").attr("uid"),security:spbcSettings.ajax_nonce};jQuery.ajax({type:"POST",async:!0,url:spbcSettings.ajaxurl,data:e,success:function(e){e.success?(spbcModal.open().put(e.data),document.addEventListener("spbcModalClosed",function(e){document.location.reload()})):spbcModal.open().putError(e.data)}})}function spbcScannerButtonClearScanResults(){confirm("Do you confirm to clear the scan results?")&&(console.log("CLEAR"),spbcSendAJAXRequest({action:"spbc_scanner_clear"},{type:"GET",successCallback:function(){document.location=document.location},complete:null,errorOutput:null,context:this,timeout:4e4,success:function(){document.location.reload()}}))}function spbcScannerCopyLogToClipboardHint(e){jQuery("#spbc_scanner_copy_log_to_clipboard_hint").text(e),jQuery("#spbc_scanner_copy_log_to_clipboard_hint").show(),jQuery("#spbc_scanner_copy_log_to_clipboard_hint").animate({opacity:0},3e3,function(){jQuery(this).hide(),jQuery(this).css("opacity",1)})}jQuery(document).ready(function(){spbcTblBulkActionsListen(),spbcTblRowActionsListen(),spbcTblPaginationListen(),spbcTblSortListen(),spbcStartShowHide(),jQuery("#spbc_scaner_progress_bar").progressbar({value:0,create:function(e,t){e.target.style.position="relative",e.target.style.marginBottom="12px"},change:function(e,t){jQuery(".spbc_progressbar_counter span").text(jQuery(e.target).progressbar("option","value")+" %")}}),jQuery("#spbc_scan_accordion").accordion({header:"h3",heightStyle:"content",collapsible:!0,active:!1,activate:function(e,t){jQuery("#spbc_scan_accordion").accordion("option","classes.ui-accordion-content","ui-corner-bottom spbc-overflow--visible")},beforeActivate:function(e,t){jQuery("#spbc_scan_accordion").accordion("option","classes.ui-accordion-content","ui-corner-bottom")}}),window.spbcScanner=new SpbcMalwareScanner({settings:spbcScaner.settings,states:spbcScaner.states,button:jQuery("#spbc_perform_scan"),spinner:jQuery("#spbc_perform_scan").next(),callback:null,progress_overall:jQuery("#spbc_scaner_progress_overall"),progressbar:jQuery("#spbc_scaner_progress_bar"),progressbar_text:jQuery(".spbc_progressbar_counter span"),wrapper:document.getElementsByClassName("spbc_unchecked_file_list"),warnings:{long_scan:jQuery(".spbc_hint_warning__long_scan"),outdated:jQuery(".spbc_hint_warning__outdated")}}),jQuery(document).on("click",".spbc_popup_tip--icon---show",function(){spbcPopupTipShow(jQuery(this))}),jQuery("#spbc_perform_scan").on("click",function(){jQuery("#spbcscan-results-log-module").remove(),spbcScanner.actionControl(),jQuery(".spbc_log-wrapper .panel-body").length||jQuery(".spbc_log-wrapper").append('
'),jQuery(".spbc_log-wrapper").resizable({handles:"n, s",containment:"document"})}),jQuery("#spbcscan-results-log-module").resizable({handles:"n, s",containment:"document"}),jQuery("#spbc_scanner_clear").on("click",function(){confirm("Do you confirm to clear the scan results?")&&(console.log("CLEAR"),spbcSendAJAXRequest({action:"spbc_scanner_clear"},{type:"GET",successCallback:function(){document.location=document.location},complete:null,errorOutput:null,context:this,timeout:4e4,success:function(){document.location.reload()}}))}),jQuery("#spbc_scanner_save_to_pdf").on("click",function(){jQuery.ajax({url:spbcSettings.ajaxurl,type:"POST",data:{action:"spbc_scanner_save_to_pdf",security:spbcSettings.ajax_nonce,no_cache:Math.random()},xhrFields:{responseType:"blob"},success:function(o){jQuery.ajax({url:spbcSettings.ajaxurl,type:"POST",data:{action:"spbc_scanner_get_pdf_file_name",security:spbcSettings.ajax_nonce,no_cache:Math.random()},xhrFields:{responseType:"text"},success:function(e){var t=new Blob([o]),n=document.createElement("a");n.href=window.URL.createObjectURL(t),n.download=e.data,n.click()}})}})}),jQuery("#spbc_load_more_scan_logs").on("click",function(e){e.preventDefault(),jQuery.ajax({url:spbcSettings.ajaxurl,type:"POST",data:{action:"spbc_scanner_load_more_scan_logs",security:spbcSettings.ajax_nonce,no_cache:Math.random(),offset:jQuery(this).data("offset")+100},xhrFields:{responseType:"text"},success:function(e){e.success&&jQuery("#spbcscan-results-log-module .panel-body").append(e.data)}})}),jQuery("#spbc_scanner_copy_log_to_clipboard").length&&jQuery("#spbc_scanner_copy_log_to_clipboard").on("click",function(e){if(e.preventDefault(),navigator.clipboard){let e=jQuery("#spbcscan-results-log-module .panel-body").html().replace(//g,"").replace(/<\/b>/g,"");e=e.replace(/

/g,"\n").replace(/<\/p>/g,""),navigator.clipboard.writeText(e).then(()=>{spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint)}).catch(e=>{spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_failed)})}else spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_unsupported)})}); +function spbcPopupTipShow(e){var t=e.attr("spbc_tip_title")||null,n=e.attr("spbc_tip_text")||null;function o(e){void 0!==e&&0!=jQuery(e.target).parent(".spbc_popup_tip--wrapper").length&&!jQuery(e.target).hasClass("spbc_popup_tip--icon---cancel")||(jQuery(".spbc_popup_tip--wrapper").hide(),jQuery(document).off("click",o))}o(),e.after("

");var c=jQuery(".spbc_popup_tip--wrapper");c.empty().append("
").css({top:e.position().top-2,left:e.position().left+25}),c.append("").append("

"+t+"

").append("

"+n+"

"),jQuery(document).on("click",o),e.parents("tr").on("mouseout",o)}function spbcScannerButtonFileViewEvent(e){var e=jQuery(e),t={action:"spbc_scanner_file_view",file_id:e.parents(".row-actions").attr("uid")},e={spinner:e.parent().siblings(".tbl-preloader--tiny"),callback:spbcScannerButtonViewCallback,errorOutput:function(e){spbcModal.open().putError(e),document.addEventListener("spbcModalClosed",function(e){spbcReloadAccordion()})}};spbcSendAJAXRequest(t,e)}function spbcScannerAnalysisLogDeleteFromLog(e){let n=[];var t=jQuery(e);let o;if(jQuery(e).hasClass("tbl-row_action"))n.push(t.parents(".row-actions").attr("uid")),o=t.parent().siblings(".tbl-preloader--tiny");else{e=t.closest("#spbc_tbl__scanner_analysis_log").find(".cb-select:checked");if(0===e.length)return void alert("Please, select elements.");e.each(function(e,t){t=jQuery(t).val();n.push(t)}),o=t.children(".tbl-preloader--small")}e={action:"spbc_scanner_analysis_log_delete_from_log",file_ids:n},t={spinner:o,callback:function(){window.location.reload()}};spbcSendAJAXRequest(e,t)}function spbcScannerButtonPageViewEvent(e){var e=jQuery(e),t={action:"spbc_scanner_page_view",page_url:e.parents(".row-actions").attr("uid")},e={spinner:e.parent().siblings(".tbl-preloader--tiny"),callback:spbcScannerButtonViewCallback,errorOutput:function(e){spbcModal.open().putError(e)}},n=jQuery("#wpwrap"),o=jQuery("#spbc_dialog"),c=(o.dialog({modal:!0,title:"Loading..",position:{my:"center top",at:"center top+100px",of:window},width:n.width()/100*90,show:{effect:"blind",duration:500},draggable:!1,resizable:!1,closeText:"X",classes:{"ui-dialog":"spbc---top"},open:function(e,t){e.target.style.overflow="auto",jQuery("#spbc_dialog").height(document.documentElement.clientHeight/100*25)},beforeClose:function(e,t){document.body.style.overflow="auto",jQuery("#spbc_dialog").empty()}}),o.append('Wait for downloading'),jQuery("#spbc_file_view_preloader")),n=4e-4*n.width();c.height(128*n),c.width(128*n),c.css({left:o.width()/2-128*n/2}),c.css({top:o.height()/2-128*n/2}),spbcSendAJAXRequest(t,e)}function spbcScannerButtonViewCallback(e){var t,n=jQuery("#spbc_dialog"),o=(n.empty(),jQuery("#spbc_file_view_preloader").css({display:"none"}),'
%s');for(t in o+='

%s


',e.file)n.append(o.printf(t,e.file[t]));var c=19*Object.keys(e.file).length<76?76:19*Object.keys(e.file).length,s=document.documentElement.clientHeight/100*75;let a=c%s


','
'),i=(r=r+'%s'+'

%s


',[]),p=[];for(c in t.weak_spots=JSON.parse(t.weak_spots),t.weak_spots)i[c]=Object.keys(t.weak_spots[c]);for(key in o=Object.keys(i).sort())p[o[key]]=i[o[key]];for(s in p){var l,u="spbc-dialog-row-header-"+s.toLowerCase(),_='',d=(_+=s+" weakspots:",jQuery("#spbc_dialog")),_=(d.append(a.printf("",_)),d.append(a.printf("...","...")),d.find("#"+u));for(l in _.parent().parent().css("text-align","center"),_.parent().parent().css("border","1px dotted"),_.parent().parent().css("background","darkgrey"),i[s]){l=[...new Set(l)].sort();var b,f=+i[s][l];for(let e=f-2;e<=2+f;e++)void 0!==t.file[e]&&(b=f===e?'
%s

%s


':a,d.append(b.printf(e,t.file[e])));d.append(a.printf("...","..."))}}jQuery("#spbc_dialog div").last().remove();var r=19*jQuery("#spbc_dialog div").length<76?76:19*jQuery("#spbc_dialog div").length,y=document.documentElement.clientHeight/100*75;let g=r{};if(1==c.success){console.log(c);var s,a='
%s

%s


';let o=[];for(s in c.weak_spots=JSON.parse(c.weak_spots),c.weak_spots)o=o.concat(Object.keys(c.weak_spots[s]));o=[...new Set(o)].sort();var r,i=new Map(Object.entries(c.weak_spots.CRITICAL));for(r in o)if(0!=r||!i.get(o[r]).toLowerCase().includes("doctype")){var p=+o[r];for(let n=p-2;n<=2+p;n++)if(void 0!==c.file[n]){var l=p===n;let e,t;e=l?'
%s

%s


':a,t=l&&!c.file[n].includes("iframe")?e.printf(n,i.get(o[r])):e.printf(n,c.file[n]),jQuery("#spbc_dialog").append(t)}jQuery("#spbc_dialog").append(a.printf("","")),jQuery("#spbc_dialog div").last().remove()}}else jQuery("#spbc_dialog").append('
%s
'.printf(c.content)),n=()=>{document.location.reload()};var o=19*jQuery("#spbc_dialog div").length<76?76:19*jQuery("#spbc_dialog div").length,u=document.documentElement.clientHeight/100*75;let _=o{document.getElementById("spbc_scanner__last_scan_info").innerText=e.data}})}function spbcScannerButtonCureFileAjaxHandler(e){e={action:"spbc_file_cure_ajax_action",file_fast_hash:jQuery(e).parents(".row-actions").attr("uid"),security:spbcSettings.ajax_nonce};jQuery.ajax({type:"POST",async:!0,url:spbcSettings.ajaxurl,data:e,success:function(e){e.success?(spbcModal.open().put(e.data),document.addEventListener("spbcModalClosed",function(e){document.location.reload()})):spbcModal.open().putError(e.data)}})}function spbcScannerButtonRestoreFromBackupAjaxHandler(e){e={action:"spbc_restore_file_from_backup_ajax_action",file_fast_hash:jQuery(e).parents(".row-actions").attr("uid"),security:spbcSettings.ajax_nonce};jQuery.ajax({type:"POST",async:!0,url:spbcSettings.ajaxurl,data:e,success:function(e){e.success?spbcModal.open().put(e.data):spbcModal.open().putError(e.data),document.addEventListener("spbcModalClosed",function(e){document.location.reload()})}})}function spbcScannerButtonClearScanResults(){confirm("Do you confirm to clear the scan results?")&&(console.log("CLEAR"),spbcSendAJAXRequest({action:"spbc_scanner_clear"},{type:"GET",successCallback:function(){document.location=document.location},complete:null,errorOutput:null,context:this,timeout:4e4,success:function(){document.location.reload()}}))}function spbcScannerCopyLogToClipboardHint(e){jQuery("#spbc_scanner_copy_log_to_clipboard_hint").text(e),jQuery("#spbc_scanner_copy_log_to_clipboard_hint").show(),jQuery("#spbc_scanner_copy_log_to_clipboard_hint").animate({opacity:0},3e3,function(){jQuery(this).hide(),jQuery(this).css("opacity",1)})}jQuery(document).ready(function(){spbcTblBulkActionsListen(),spbcTblRowActionsListen(),spbcTblPaginationListen(),spbcTblSortListen(),spbcStartShowHide(),jQuery("#spbc_scaner_progress_bar").progressbar({value:0,create:function(e,t){e.target.style.position="relative",e.target.style.marginBottom="12px"},change:function(e,t){jQuery(".spbc_progressbar_counter span").text(jQuery(e.target).progressbar("option","value")+" %")}}),jQuery("#spbc_scan_accordion").accordion({header:"h3",heightStyle:"content",collapsible:!0,active:!1,activate:function(e,t){jQuery("#spbc_scan_accordion").accordion("option","classes.ui-accordion-content","ui-corner-bottom spbc-overflow--visible")},beforeActivate:function(e,t){jQuery("#spbc_scan_accordion").accordion("option","classes.ui-accordion-content","ui-corner-bottom")}}),window.spbcScanner=new SpbcMalwareScanner({settings:spbcScaner.settings,states:spbcScaner.states,button:jQuery("#spbc_perform_scan"),spinner:jQuery("#spbc_perform_scan").next(),callback:null,progress_overall:jQuery("#spbc_scaner_progress_overall"),progressbar:jQuery("#spbc_scaner_progress_bar"),progressbar_text:jQuery(".spbc_progressbar_counter span"),wrapper:document.getElementsByClassName("spbc_unchecked_file_list"),warnings:{long_scan:jQuery(".spbc_hint_warning__long_scan"),outdated:jQuery(".spbc_hint_warning__outdated")}}),jQuery(document).on("click",".spbc_popup_tip--icon---show",function(){spbcPopupTipShow(jQuery(this))}),jQuery("#spbc_perform_scan").on("click",function(){jQuery("#spbcscan-results-log-module").remove(),spbcScanner.actionControl(),jQuery(".spbc_log-wrapper .panel-body").length||jQuery(".spbc_log-wrapper").append('
'),jQuery(".spbc_log-wrapper").resizable({handles:"n, s",containment:"document"})}),jQuery("#spbcscan-results-log-module").resizable({handles:"n, s",containment:"document"}),jQuery("#spbc_scanner_clear").on("click",function(){confirm("Do you confirm to clear the scan results?")&&(console.log("CLEAR"),spbcSendAJAXRequest({action:"spbc_scanner_clear"},{type:"GET",successCallback:function(){document.location=document.location},complete:null,errorOutput:null,context:this,timeout:4e4,success:function(){document.location.reload()}}))}),jQuery("#spbc_scanner_save_to_pdf").on("click",function(){jQuery.ajax({url:spbcSettings.ajaxurl,type:"POST",data:{action:"spbc_scanner_save_to_pdf",security:spbcSettings.ajax_nonce,no_cache:Math.random()},xhrFields:{responseType:"blob"},success:function(o){jQuery.ajax({url:spbcSettings.ajaxurl,type:"POST",data:{action:"spbc_scanner_get_pdf_file_name",security:spbcSettings.ajax_nonce,no_cache:Math.random()},xhrFields:{responseType:"text"},success:function(e){var t=new Blob([o]),n=document.createElement("a");n.href=window.URL.createObjectURL(t),n.download=e.data,n.click()}})}})}),jQuery("#spbc_load_more_scan_logs").on("click",function(e){e.preventDefault(),jQuery.ajax({url:spbcSettings.ajaxurl,type:"POST",data:{action:"spbc_scanner_load_more_scan_logs",security:spbcSettings.ajax_nonce,no_cache:Math.random(),offset:jQuery(this).data("offset")+100},xhrFields:{responseType:"text"},success:function(e){e.success&&jQuery("#spbcscan-results-log-module .panel-body").append(e.data)}})}),jQuery("#spbc_scanner_copy_log_to_clipboard").length&&jQuery("#spbc_scanner_copy_log_to_clipboard").on("click",function(e){if(e.preventDefault(),navigator.clipboard){let e=jQuery("#spbcscan-results-log-module .panel-body").html().replace(//g,"").replace(/<\/b>/g,"");e=e.replace(/

/g,"\n").replace(/<\/p>/g,""),navigator.clipboard.writeText(e).then(()=>{spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint)}).catch(e=>{spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_failed)})}else spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_unsupported)})}); //# sourceMappingURL=spbc-settings_tab--scanner.min.js.map diff --git a/js/spbc-settings_tab--scanner.min.js.map b/js/spbc-settings_tab--scanner.min.js.map index a47cf151d..e43153522 100644 --- a/js/spbc-settings_tab--scanner.min.js.map +++ b/js/spbc-settings_tab--scanner.min.js.map @@ -1 +1 @@ -{"version":3,"file":"spbc-settings_tab--scanner.min.js","sources":["spbc-settings_tab--scanner.js"],"sourcesContent":["/**\n * Show popup tip\n *\n * @param {object} showIcon\n */\nfunction spbcPopupTipShow(showIcon) { // eslint-disable-line no-unused-vars\n let tipTitle = showIcon.attr('spbc_tip_title') || null;\n let tipText = showIcon.attr('spbc_tip_text') || null;\n let removeDescFunc = function(e) {\n if (\n typeof e === 'undefined' ||\n (\n jQuery(e.target).parent('.spbc_popup_tip--wrapper').length == 0 ||\n jQuery(e.target).hasClass('spbc_popup_tip--icon---cancel')\n )\n ) {\n jQuery('.spbc_popup_tip--wrapper').hide();\n jQuery(document).off('click', removeDescFunc);\n }\n };\n\n removeDescFunc();\n\n showIcon.after('

');\n\n let obj = jQuery('.spbc_popup_tip--wrapper');\n\n obj.empty()\n .append('
')\n .css({\n top: showIcon.position().top - 2,\n left: showIcon.position().left + 25,\n });\n obj.append('')\n .append('

' + tipTitle + '

')\n .append('

' + tipText + '

');\n\n jQuery(document).on('click', removeDescFunc);\n showIcon.parents('tr').on('mouseout', removeDescFunc);\n}\n\n/**\n * View file in the scanner\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonFileViewEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_file_view',\n file_id: self.parents('.row-actions').attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n document.addEventListener('spbcModalClosed', function( e ) {\n spbcReloadAccordion();\n });\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Delete file from analysis log\n *\n * @param {object} obj\n */\nfunction spbcScannerAnalysisLogDeleteFromLog(obj) { // eslint-disable-line no-unused-vars\n let fileIds = [];\n const self = jQuery(obj);\n let spinner;\n\n if ( jQuery(obj).hasClass('tbl-row_action') ) {\n fileIds.push(self.parents('.row-actions').attr('uid'));\n spinner = self.parent().siblings('.tbl-preloader--tiny');\n } else {\n const selectedItems = self.closest('#spbc_tbl__scanner_analysis_log').find('.cb-select:checked');\n if (selectedItems.length === 0) {\n alert('Please, select elements.');\n return;\n }\n\n selectedItems.each(function(index, element) {\n const elementId = jQuery(element).val();\n fileIds.push(elementId);\n });\n spinner = self.children('.tbl-preloader--small');\n }\n\n const data = {\n action: 'spbc_scanner_analysis_log_delete_from_log',\n file_ids: fileIds,\n };\n\n let params = {\n spinner: spinner,\n callback: function() {\n window.location.reload();\n },\n };\n\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * View page in the scanner\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonPageViewEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_page_view',\n page_url: self.parents('.row-actions').attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n },\n };\n\n let wpWrap = jQuery('#wpwrap');\n let dialogWindow = jQuery('#spbc_dialog');\n\n dialogWindow.dialog({\n modal: true,\n title: 'Loading..',\n position: {my: 'center top', at: 'center top+100px', of: window},\n width: +(wpWrap.width() / 100 * 90),\n show: {effect: 'blind', duration: 500},\n draggable: false,\n resizable: false,\n closeText: 'X',\n classes: {'ui-dialog': 'spbc---top'},\n open: function(event, ui) {\n event.target.style.overflow = 'auto';\n jQuery('#spbc_dialog').height((document.documentElement.clientHeight) / 100 * 25);\n },\n beforeClose: function(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n });\n\n dialogWindow.append('\"Wait');\n\n let spinner = jQuery('#spbc_file_view_preloader');\n let sizeMultiplier = (wpWrap.width() * 0.0004);\n\n spinner.height(128 * sizeMultiplier);\n spinner.width(128 * sizeMultiplier);\n spinner.css({left: dialogWindow.width()/2 - (128 * sizeMultiplier / 2)});\n spinner.css({top: dialogWindow.height()/2 - (128 * sizeMultiplier / 2)});\n\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Callback for file view\n *\n * @param {object} result\n */\nfunction spbcScannerButtonViewCallback(result) { // eslint-disable-line no-unused-vars\n let dialogWindow = jQuery('#spbc_dialog');\n dialogWindow.empty();\n\n jQuery('#spbc_file_view_preloader').css({display: 'none'});\n\n let rowTemplate = '
%s';\n rowTemplate += '

%s


';\n\n /* eslint-disable guard-for-in */\n for (let row in result.file) {\n dialogWindow.append(rowTemplate.printf(row, result.file[row]));\n }\n\n let contentHeight = Object.keys(result.file).length * 19 < 76 ? 76 : Object.keys(result.file).length * 19;\n let visibleHeight = (document.documentElement.clientHeight) / 100 * 75;\n let overflow = contentHeight < visibleHeight ? 'hidden' : 'scroll';\n let height = overflow === 'scroll' ? visibleHeight : contentHeight;\n\n dialogWindow.css({\n height: height,\n overflow: overflow,\n });\n\n dialogWindow.dialog({\n modal: true,\n title: ('Loaded: ' + result.file_path),\n position: {my: 'center top', at: 'center top+100px', of: window},\n width: +(jQuery('#wpwrap').width() / 100 * 90),\n show: {effect: 'blind', duration: 500},\n draggable: true,\n resizable: false,\n height: height,\n closeText: 'X',\n classes: {'ui-dialog': 'spbc---top'},\n open: function(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function() {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n });\n\n console.log('FILE_VIEWED');\n}\n\n/**\n * Event for file view bad\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonFileViewBadEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_file_view',\n file_id: self.parents('.row-actions').attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewBadFileCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Event for page view bad\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonPageViewBadEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_page_view',\n page_url: self.parent().attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewBadCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Callback for file view bad\n *\n * @param {object} result\n * @param {object} data\n * @param {object} params\n */\nfunction spbcScannerButtonViewBadFileCallback(result, data, params) { // eslint-disable-line no-unused-vars\n console.log('FILE_VIEWED_BAD_CODE_FILE');\n jQuery('#spbc_dialog').empty();\n\n let rowTemplate = '
%s';\n rowTemplate += '

%s


';\n let rowTemplateBad = '
';\n rowTemplateBad += '%s';\n rowTemplateBad += '

%s


';\n let severityParts = [];\n let severityPartsSorted = [];\n let severityKeysSorted = [];\n\n result.weak_spots = JSON.parse(result.weak_spots);\n /* eslint-disable guard-for-in */\n for (let severity in result.weak_spots) {\n severityParts[severity] = Object.keys(result.weak_spots[severity]);\n }\n\n severityKeysSorted = Object.keys(severityParts).sort();\n\n /* eslint-disable guard-for-in */\n for (key in severityKeysSorted) {\n severityPartsSorted[severityKeysSorted[key]] = severityParts[severityKeysSorted[key]];\n }\n\n /* eslint-disable guard-for-in */\n for (let severityPart in severityPartsSorted) {\n let headerName = 'spbc-dialog-row-header-' + severityPart.toLowerCase();\n let headerHtml = '';\n headerHtml += severityPart + ' weakspots:';\n const dialog = jQuery('#spbc_dialog');\n\n dialog.append(rowTemplate.printf('', headerHtml));\n dialog.append(rowTemplate. printf('...', '...'));\n\n let header = dialog.find('#' + headerName);\n header.parent().parent().css('text-align', 'center');\n header.parent().parent().css('border', '1px dotted');\n header.parent().parent().css('background', 'darkgrey');\n\n /* eslint-disable guard-for-in */\n for (let strNum in severityParts[severityPart]) {\n // Sort bad line\n strNum = [...new Set(strNum)].sort();\n\n let row = +severityParts[severityPart][strNum];\n let displayDepth = 2;\n let temp;\n // Display only existing lines of file\n for (let currRow = row - displayDepth; currRow <= row + displayDepth; currRow++ ) {\n if ( typeof result.file[currRow] !== 'undefined' ) {\n temp = row === currRow ? rowTemplateBad : rowTemplate;\n dialog.append(temp.printf(currRow, result.file[currRow]));\n }\n }\n\n // Placing an empty string between results\n dialog.append(rowTemplate. printf('...', '...'));\n }\n }\n\n // Removing last empty string\n jQuery('#spbc_dialog div').last().remove();\n\n let contentHeight = jQuery('#spbc_dialog div').length * 19 < 76 ? 76 : jQuery('#spbc_dialog div').length * 19;\n let visibleHeight = (document.documentElement.clientHeight) / 100 * 75;\n let overflow = contentHeight < visibleHeight ? 'no_scroll' : 'scroll';\n let height = overflow === 'scroll' ? visibleHeight : contentHeight;\n\n jQuery('#spbc_dialog').dialog({\n modal: true,\n title: result.file_path,\n position: {my: 'center top', at: 'center top+100px', of: window},\n width: +(jQuery('#wpwrap').width() / 100 * 90),\n show: {effect: 'blind', duration: 500},\n draggable: true,\n resizable: false,\n closeText: 'X',\n classes: {'ui-dialog': 'spbc---top'},\n open: function(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function() {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n });\n}\n\n/**\n * Callback for file view bad\n *\n * @param {object} result\n * @param {object} data\n * @param {object} params\n */\nfunction spbcScannerButtonViewBadCallback(result, data, params) { // eslint-disable-line no-unused-vars\n console.log('FILE_VIEWED_BAD_CODE');\n\n let afterClose = () => {};\n\n if ( result.success == true ) {\n console.log(result);\n let rowTemplate = '
' +\n '%s' +\n '

%s

' +\n '
';\n let rowTemplateBad = '
' +\n '%s' +\n '

%s

' +\n '
';\n let strNums = [];\n\n result.weak_spots = JSON.parse(result.weak_spots);\n /* eslint-disable guard-for-in */\n for (let severity in result.weak_spots) {\n strNums = strNums.concat(Object.keys(result.weak_spots[severity]));\n }\n\n strNums = [...new Set(strNums)].sort(); // Sort bad line\n // get a map of bad strings\n // TODO: Probably there can get something else except CRITICAL in the future\n let badStringsMap = new Map(Object.entries(result.weak_spots.CRITICAL));\n /* eslint-disable guard-for-in */\n for (let strNum in strNums) {\n if (strNum == 0 && badStringsMap.get(strNums[strNum]).toLowerCase().includes('doctype')) {\n continue;\n }\n\n let row = +strNums[strNum];\n let displayDepth = 2;\n\n // Display only existing lines of file\n for (let currRow = row - displayDepth; currRow <= row + displayDepth; currRow++ ) {\n if ( typeof result.file[currRow] !== 'undefined' ) {\n let isBadString = (row === currRow);\n let unformattedRow;\n let highlitedRow;\n if (isBadString) {\n unformattedRow = rowTemplateBad;\n } else {\n unformattedRow = rowTemplate;\n }\n if (isBadString && !result.file[currRow].includes('iframe')) {\n highlitedRow = unformattedRow.printf(currRow, badStringsMap.get(strNums[strNum]));\n } else {\n highlitedRow = unformattedRow.printf(currRow, result.file[currRow]);\n }\n jQuery('#spbc_dialog').append(highlitedRow);\n }\n }\n\n // Placing an empty string between results\n jQuery('#spbc_dialog').append(rowTemplate. printf('', ''));\n\n // Removing last empty string\n jQuery('#spbc_dialog div').last().remove();\n }\n } else {\n let wrapperElement = '
%s
';\n jQuery('#spbc_dialog').append(wrapperElement.printf(result.content));\n afterClose = () => {\n document.location.reload();\n };\n }\n\n let contentHeight = jQuery('#spbc_dialog div').length * 19 < 76 ? 76 : jQuery('#spbc_dialog div').length * 19;\n let visibleHeight = (document.documentElement.clientHeight) / 100 * 75;\n let height = 'auto';\n let overflow = contentHeight < visibleHeight ? 'no_scroll' : 'scroll';\n\n jQuery('#spbc_dialog').dialog({\n modal: true,\n title: result.file_path,\n position: {my: 'center top', at: 'center top+100px', of: window},\n width: +(jQuery('#wpwrap').width() / 100 * 90),\n show: {effect: 'blind', duration: 500},\n draggable: true,\n resizable: false,\n closeText: 'X',\n classes: {'ui-dialog': 'spbc---top'},\n open: function(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function() {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n close: afterClose,\n });\n}\n\n/**\n * Reloads last scan info\n */\nfunction spbcScannerReloadScanInfo() { // eslint-disable-line no-unused-vars\n jQuery('.spbc_hint__last_scan_title').text(spbcScaner.look_below_for_scan_res);\n const data = {\n action: 'spbc_scanner__last_scan_info',\n };\n const params = {\n callback: (result) => {\n document.getElementById('spbc_scanner__last_scan_info').innerText = result.data;\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Cure file\n * @param {object} obj\n */\nfunction spbcScannerButtonCureFileAjaxHandler(obj) { // eslint-disable-line no-unused-vars\n const self = jQuery(obj);\n const fileFastHash = self.parents('.row-actions').attr('uid');\n\n let data = {\n action: 'spbc_file_cure_ajax_action',\n file_fast_hash: fileFastHash,\n security: spbcSettings.ajax_nonce,\n };\n\n jQuery.ajax({\n type: 'POST',\n async: true,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function(result) {\n if (result.success) {\n spbcModal.open().put(result.data);\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n } else {\n spbcModal.open().putError(result.data);\n }\n },\n });\n}\n\n/**\n * Restore file from backup\n * @param {object} obj\n */\nfunction spbcScannerButtonRestoreFromBackupAjaxHandler(obj) { // eslint-disable-line no-unused-vars\n const self = jQuery(obj);\n const fileFastHash = self.parents('.row-actions').attr('uid');\n\n let data = {\n action: 'spbc_restore_file_from_backup_ajax_action',\n file_fast_hash: fileFastHash,\n security: spbcSettings.ajax_nonce,\n };\n\n jQuery.ajax({\n type: 'POST',\n async: true,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function(result) {\n if (result.success) {\n spbcModal.open().put(result.data);\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n } else {\n spbcModal.open().putError(result.data);\n }\n },\n });\n}\n\n/**\n * Clear scan results\n * @return {void}\n */\nfunction spbcScannerButtonClearScanResults() { // eslint-disable-line no-unused-vars\n if ( ! confirm('Do you confirm to clear the scan results?') ) {\n return;\n }\n\n console.log('CLEAR');\n\n spbcSendAJAXRequest(\n {action: 'spbc_scanner_clear'},\n {\n type: 'GET',\n successCallback: function() {\n document.location = document.location;\n },\n complete: null,\n errorOutput: null,\n context: this,\n timeout: 40000,\n success: function() {\n document.location.reload();\n },\n },\n );\n}\n\n/**\n * Show copy log to clipboard hint\n * @param {string} text\n */\nfunction spbcScannerCopyLogToClipboardHint(text) {\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').text(text);\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').show();\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').animate({opacity: 0}, 3000, function() {\n jQuery(this).hide();\n jQuery(this).css('opacity', 1);\n });\n}\n\njQuery(document).ready(function() {\n // EVENT HADLING\n spbcTblBulkActionsListen(); // Table. Row bulk handler\n spbcTblRowActionsListen(); // Table. Row actions handler\n spbcTblPaginationListen(); // Table. Pagination handler\n spbcTblSortListen(); // Table. Sort handler\n\n spbcStartShowHide();\n\n // Preparing progressbar\n jQuery('#spbc_scaner_progress_bar').progressbar({\n value: 0,\n create: function( event, ui ) {\n event.target.style.position = 'relative';\n event.target.style.marginBottom = '12px';\n },\n change: function(event, ui) {\n jQuery('.spbc_progressbar_counter span').text(jQuery(event.target).progressbar('option', 'value') + ' %');\n },\n });\n\n // Preparing accordion\n jQuery('#spbc_scan_accordion').accordion({\n header: 'h3',\n heightStyle: 'content',\n collapsible: true,\n active: false,\n activate: function( event, ui ) {\n jQuery('#spbc_scan_accordion')\n .accordion('option', 'classes.ui-accordion-content', 'ui-corner-bottom spbc-overflow--visible');\n },\n beforeActivate: function( event, ui ) {\n jQuery('#spbc_scan_accordion').accordion('option', 'classes.ui-accordion-content', 'ui-corner-bottom');\n },\n });\n\n // Init scanner plugin\n window.spbcScanner = new SpbcMalwareScanner({\n settings: spbcScaner.settings,\n states: spbcScaner.states,\n button: jQuery('#spbc_perform_scan'),\n spinner: jQuery('#spbc_perform_scan').next(),\n callback: null,\n progress_overall: jQuery('#spbc_scaner_progress_overall'),\n progressbar: jQuery('#spbc_scaner_progress_bar'),\n progressbar_text: jQuery('.spbc_progressbar_counter span'),\n wrapper: document.getElementsByClassName('spbc_unchecked_file_list'),\n warnings: {\n long_scan: jQuery('.spbc_hint_warning__long_scan'),\n outdated: jQuery('.spbc_hint_warning__outdated'),\n },\n });\n\n jQuery(document).on('click', '.spbc_popup_tip--icon---show', function() {\n spbcPopupTipShow( jQuery( this ) );\n });\n\n jQuery('#spbc_perform_scan').on('click', function() {\n jQuery('#spbcscan-results-log-module').remove();\n spbcScanner.actionControl();\n\n if (!jQuery('.spbc_log-wrapper .panel-body').length) {\n jQuery('.spbc_log-wrapper').append('
');\n }\n\n jQuery('.spbc_log-wrapper').resizable({\n handles: 'n, s',\n containment: 'document',\n });\n });\n\n jQuery('#spbcscan-results-log-module').resizable({\n handles: 'n, s',\n containment: 'document',\n });\n\n // Clear scanner's tables\n jQuery('#spbc_scanner_clear').on('click', function() {\n if ( ! confirm('Do you confirm to clear the scan results?') ) {\n return;\n }\n\n console.log('CLEAR');\n\n spbcSendAJAXRequest(\n {action: 'spbc_scanner_clear'},\n {\n type: 'GET',\n successCallback: function() {\n document.location = document.location;\n },\n complete: null,\n errorOutput: null,\n context: this,\n timeout: 40000,\n success: function() {\n document.location.reload();\n },\n },\n );\n });\n\n jQuery('#spbc_scanner_save_to_pdf').on('click', function() {\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_save_to_pdf',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random(),\n },\n xhrFields: {\n responseType: 'blob',\n },\n success: function(data) {\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_get_pdf_file_name',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random(),\n },\n xhrFields: {\n responseType: 'text',\n },\n success: function(filename) {\n let blob=new Blob([data]);\n let link=document.createElement('a');\n link.href=window.URL.createObjectURL(blob);\n link.download=filename.data;\n link.click();\n },\n },\n );\n },\n });\n });\n\n jQuery('#spbc_load_more_scan_logs').on('click', function(e) {\n e.preventDefault();\n\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_load_more_scan_logs',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random(),\n offset: jQuery(this).data('offset') + 100,\n },\n xhrFields: {\n responseType: 'text',\n },\n success: function(data) {\n if (data.success) {\n jQuery('#spbcscan-results-log-module .panel-body').append(data.data);\n }\n },\n });\n });\n\n if (jQuery('#spbc_scanner_copy_log_to_clipboard').length) {\n jQuery('#spbc_scanner_copy_log_to_clipboard').on('click', function(e) {\n e.preventDefault();\n if (navigator.clipboard) {\n let log = jQuery('#spbcscan-results-log-module .panel-body').html();\n let formattedLog = log.replace(//g, '').replace(/<\\/b>/g, '');\n formattedLog = formattedLog.replace(/

/g, '\\n').replace(/<\\/p>/g, '');\n navigator.clipboard.writeText(formattedLog).then(() => {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint);\n }).catch((err) => {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_failed);\n });\n } else {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_unsupported);\n }\n });\n }\n});\n"],"names":["spbcPopupTipShow","showIcon","let","tipTitle","attr","tipText","removeDescFunc","e","jQuery","target","parent","length","hasClass","hide","document","off","after","obj","empty","append","css","top","position","left","on","parents","spbcScannerButtonFileViewEvent","self","data","action","file_id","params","spinner","siblings","callback","spbcScannerButtonViewCallback","errorOutput","msg","spbcModal","open","putError","addEventListener","spbcReloadAccordion","spbcSendAJAXRequest","spbcScannerAnalysisLogDeleteFromLog","fileIds","push","selectedItems","closest","find","alert","each","index","element","elementId","val","children","file_ids","window","location","reload","spbcScannerButtonPageViewEvent","page_url","wpWrap","dialogWindow","dialog","modal","title","my","at","of","width","show","effect","duration","draggable","resizable","closeText","classes","ui-dialog","event","ui","style","overflow","height","documentElement","beforeClose","body","sizeMultiplier","result","row","rowTemplate","display","file","printf","contentHeight","Object","keys","visibleHeight","file_path","console","log","spbcScannerButtonFileViewBadEvent","spbcScannerButtonViewBadFileCallback","spbcScannerButtonPageViewBadEvent","spbcScannerButtonViewBadCallback","severityKeysSorted","severity","severityPart","rowTemplateBad","severityParts","severityPartsSorted","weak_spots","JSON","parse","key","sort","strNum","headerName","toLowerCase","headerHtml","header","Set","temp","currRow","last","remove","afterClose","success","strNums","concat","badStringsMap","Map","entries","CRITICAL","get","includes","isBadString","unformattedRow","highlitedRow","content","close","spbcScannerReloadScanInfo","text","spbcScaner","look_below_for_scan_res","getElementById","innerText","spbcScannerButtonCureFileAjaxHandler","file_fast_hash","security","spbcSettings","ajax_nonce","ajax","type","async","url","ajaxurl","put","spbcScannerButtonRestoreFromBackupAjaxHandler","spbcScannerButtonClearScanResults","confirm","successCallback","complete","context","this","timeout","spbcScannerCopyLogToClipboardHint","animate","opacity","ready","spbcTblBulkActionsListen","spbcTblRowActionsListen","spbcTblPaginationListen","spbcTblSortListen","spbcStartShowHide","progressbar","value","create","marginBottom","change","accordion","heightStyle","collapsible","active","activate","beforeActivate","spbcScanner","SpbcMalwareScanner","settings","states","button","next","progress_overall","progressbar_text","wrapper","getElementsByClassName","warnings","long_scan","outdated","actionControl","handles","containment","no_cache","Math","random","xhrFields","responseType","filename","blob","Blob","link","createElement","href","URL","createObjectURL","download","click","preventDefault","offset","navigator","clipboard","formattedLog","html","replace","writeText","then","copy_log_to_clipboard_hint","catch","copy_log_to_clipboard_hint_failed","copy_log_to_clipboard_hint_unsupported"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"spbc-settings_tab--scanner.min.js","sources":["spbc-settings_tab--scanner.js"],"sourcesContent":["/**\n * Show popup tip\n *\n * @param {object} showIcon\n */\nfunction spbcPopupTipShow(showIcon) { // eslint-disable-line no-unused-vars\n let tipTitle = showIcon.attr('spbc_tip_title') || null;\n let tipText = showIcon.attr('spbc_tip_text') || null;\n let removeDescFunc = function(e) {\n if (\n typeof e === 'undefined' ||\n (\n jQuery(e.target).parent('.spbc_popup_tip--wrapper').length == 0 ||\n jQuery(e.target).hasClass('spbc_popup_tip--icon---cancel')\n )\n ) {\n jQuery('.spbc_popup_tip--wrapper').hide();\n jQuery(document).off('click', removeDescFunc);\n }\n };\n\n removeDescFunc();\n\n showIcon.after('

');\n\n let obj = jQuery('.spbc_popup_tip--wrapper');\n\n obj.empty()\n .append('
')\n .css({\n top: showIcon.position().top - 2,\n left: showIcon.position().left + 25,\n });\n obj.append('')\n .append('

' + tipTitle + '

')\n .append('

' + tipText + '

');\n\n jQuery(document).on('click', removeDescFunc);\n showIcon.parents('tr').on('mouseout', removeDescFunc);\n}\n\n/**\n * View file in the scanner\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonFileViewEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_file_view',\n file_id: self.parents('.row-actions').attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n document.addEventListener('spbcModalClosed', function( e ) {\n spbcReloadAccordion();\n });\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Delete file from analysis log\n *\n * @param {object} obj\n */\nfunction spbcScannerAnalysisLogDeleteFromLog(obj) { // eslint-disable-line no-unused-vars\n let fileIds = [];\n const self = jQuery(obj);\n let spinner;\n\n if ( jQuery(obj).hasClass('tbl-row_action') ) {\n fileIds.push(self.parents('.row-actions').attr('uid'));\n spinner = self.parent().siblings('.tbl-preloader--tiny');\n } else {\n const selectedItems = self.closest('#spbc_tbl__scanner_analysis_log').find('.cb-select:checked');\n if (selectedItems.length === 0) {\n alert('Please, select elements.');\n return;\n }\n\n selectedItems.each(function(index, element) {\n const elementId = jQuery(element).val();\n fileIds.push(elementId);\n });\n spinner = self.children('.tbl-preloader--small');\n }\n\n const data = {\n action: 'spbc_scanner_analysis_log_delete_from_log',\n file_ids: fileIds,\n };\n\n let params = {\n spinner: spinner,\n callback: function() {\n window.location.reload();\n },\n };\n\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * View page in the scanner\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonPageViewEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_page_view',\n page_url: self.parents('.row-actions').attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n },\n };\n\n let wpWrap = jQuery('#wpwrap');\n let dialogWindow = jQuery('#spbc_dialog');\n\n dialogWindow.dialog({\n modal: true,\n title: 'Loading..',\n position: {my: 'center top', at: 'center top+100px', of: window},\n width: +(wpWrap.width() / 100 * 90),\n show: {effect: 'blind', duration: 500},\n draggable: false,\n resizable: false,\n closeText: 'X',\n classes: {'ui-dialog': 'spbc---top'},\n open: function(event, ui) {\n event.target.style.overflow = 'auto';\n jQuery('#spbc_dialog').height((document.documentElement.clientHeight) / 100 * 25);\n },\n beforeClose: function(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n });\n\n dialogWindow.append('\"Wait');\n\n let spinner = jQuery('#spbc_file_view_preloader');\n let sizeMultiplier = (wpWrap.width() * 0.0004);\n\n spinner.height(128 * sizeMultiplier);\n spinner.width(128 * sizeMultiplier);\n spinner.css({left: dialogWindow.width()/2 - (128 * sizeMultiplier / 2)});\n spinner.css({top: dialogWindow.height()/2 - (128 * sizeMultiplier / 2)});\n\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Callback for file view\n *\n * @param {object} result\n */\nfunction spbcScannerButtonViewCallback(result) { // eslint-disable-line no-unused-vars\n let dialogWindow = jQuery('#spbc_dialog');\n dialogWindow.empty();\n\n jQuery('#spbc_file_view_preloader').css({display: 'none'});\n\n let rowTemplate = '
%s';\n rowTemplate += '

%s


';\n\n /* eslint-disable guard-for-in */\n for (let row in result.file) {\n dialogWindow.append(rowTemplate.printf(row, result.file[row]));\n }\n\n let contentHeight = Object.keys(result.file).length * 19 < 76 ? 76 : Object.keys(result.file).length * 19;\n let visibleHeight = (document.documentElement.clientHeight) / 100 * 75;\n let overflow = contentHeight < visibleHeight ? 'hidden' : 'scroll';\n let height = overflow === 'scroll' ? visibleHeight : contentHeight;\n\n dialogWindow.css({\n height: height,\n overflow: overflow,\n });\n\n dialogWindow.dialog({\n modal: true,\n title: ('Loaded: ' + result.file_path),\n position: {my: 'center top', at: 'center top+100px', of: window},\n width: +(jQuery('#wpwrap').width() / 100 * 90),\n show: {effect: 'blind', duration: 500},\n draggable: true,\n resizable: false,\n height: height,\n closeText: 'X',\n classes: {'ui-dialog': 'spbc---top'},\n open: function(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function() {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n });\n\n console.log('FILE_VIEWED');\n}\n\n/**\n * Event for file view bad\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonFileViewBadEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_file_view',\n file_id: self.parents('.row-actions').attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewBadFileCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Event for page view bad\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonPageViewBadEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_page_view',\n page_url: self.parent().attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewBadCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Callback for file view bad\n *\n * @param {object} result\n * @param {object} data\n * @param {object} params\n */\nfunction spbcScannerButtonViewBadFileCallback(result, data, params) { // eslint-disable-line no-unused-vars\n console.log('FILE_VIEWED_BAD_CODE_FILE');\n jQuery('#spbc_dialog').empty();\n\n let rowTemplate = '
%s';\n rowTemplate += '

%s


';\n let rowTemplateBad = '
';\n rowTemplateBad += '%s';\n rowTemplateBad += '

%s


';\n let severityParts = [];\n let severityPartsSorted = [];\n let severityKeysSorted = [];\n\n result.weak_spots = JSON.parse(result.weak_spots);\n /* eslint-disable guard-for-in */\n for (let severity in result.weak_spots) {\n severityParts[severity] = Object.keys(result.weak_spots[severity]);\n }\n\n severityKeysSorted = Object.keys(severityParts).sort();\n\n /* eslint-disable guard-for-in */\n for (key in severityKeysSorted) {\n severityPartsSorted[severityKeysSorted[key]] = severityParts[severityKeysSorted[key]];\n }\n\n /* eslint-disable guard-for-in */\n for (let severityPart in severityPartsSorted) {\n let headerName = 'spbc-dialog-row-header-' + severityPart.toLowerCase();\n let headerHtml = '';\n headerHtml += severityPart + ' weakspots:';\n const dialog = jQuery('#spbc_dialog');\n\n dialog.append(rowTemplate.printf('', headerHtml));\n dialog.append(rowTemplate. printf('...', '...'));\n\n let header = dialog.find('#' + headerName);\n header.parent().parent().css('text-align', 'center');\n header.parent().parent().css('border', '1px dotted');\n header.parent().parent().css('background', 'darkgrey');\n\n /* eslint-disable guard-for-in */\n for (let strNum in severityParts[severityPart]) {\n // Sort bad line\n strNum = [...new Set(strNum)].sort();\n\n let row = +severityParts[severityPart][strNum];\n let displayDepth = 2;\n let temp;\n // Display only existing lines of file\n for (let currRow = row - displayDepth; currRow <= row + displayDepth; currRow++ ) {\n if ( typeof result.file[currRow] !== 'undefined' ) {\n temp = row === currRow ? rowTemplateBad : rowTemplate;\n dialog.append(temp.printf(currRow, result.file[currRow]));\n }\n }\n\n // Placing an empty string between results\n dialog.append(rowTemplate. printf('...', '...'));\n }\n }\n\n // Removing last empty string\n jQuery('#spbc_dialog div').last().remove();\n\n let contentHeight = jQuery('#spbc_dialog div').length * 19 < 76 ? 76 : jQuery('#spbc_dialog div').length * 19;\n let visibleHeight = (document.documentElement.clientHeight) / 100 * 75;\n let overflow = contentHeight < visibleHeight ? 'no_scroll' : 'scroll';\n let height = overflow === 'scroll' ? visibleHeight : contentHeight;\n\n jQuery('#spbc_dialog').dialog({\n modal: true,\n title: result.file_path,\n position: {my: 'center top', at: 'center top+100px', of: window},\n width: +(jQuery('#wpwrap').width() / 100 * 90),\n show: {effect: 'blind', duration: 500},\n draggable: true,\n resizable: false,\n closeText: 'X',\n classes: {'ui-dialog': 'spbc---top'},\n open: function(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function() {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n });\n}\n\n/**\n * Callback for file view bad\n *\n * @param {object} result\n * @param {object} data\n * @param {object} params\n */\nfunction spbcScannerButtonViewBadCallback(result, data, params) { // eslint-disable-line no-unused-vars\n console.log('FILE_VIEWED_BAD_CODE');\n\n let afterClose = () => {};\n\n if ( result.success == true ) {\n console.log(result);\n let rowTemplate = '
' +\n '%s' +\n '

%s

' +\n '
';\n let rowTemplateBad = '
' +\n '%s' +\n '

%s

' +\n '
';\n let strNums = [];\n\n result.weak_spots = JSON.parse(result.weak_spots);\n /* eslint-disable guard-for-in */\n for (let severity in result.weak_spots) {\n strNums = strNums.concat(Object.keys(result.weak_spots[severity]));\n }\n\n strNums = [...new Set(strNums)].sort(); // Sort bad line\n // get a map of bad strings\n // TODO: Probably there can get something else except CRITICAL in the future\n let badStringsMap = new Map(Object.entries(result.weak_spots.CRITICAL));\n /* eslint-disable guard-for-in */\n for (let strNum in strNums) {\n if (strNum == 0 && badStringsMap.get(strNums[strNum]).toLowerCase().includes('doctype')) {\n continue;\n }\n\n let row = +strNums[strNum];\n let displayDepth = 2;\n\n // Display only existing lines of file\n for (let currRow = row - displayDepth; currRow <= row + displayDepth; currRow++ ) {\n if ( typeof result.file[currRow] !== 'undefined' ) {\n let isBadString = (row === currRow);\n let unformattedRow;\n let highlitedRow;\n if (isBadString) {\n unformattedRow = rowTemplateBad;\n } else {\n unformattedRow = rowTemplate;\n }\n if (isBadString && !result.file[currRow].includes('iframe')) {\n highlitedRow = unformattedRow.printf(currRow, badStringsMap.get(strNums[strNum]));\n } else {\n highlitedRow = unformattedRow.printf(currRow, result.file[currRow]);\n }\n jQuery('#spbc_dialog').append(highlitedRow);\n }\n }\n\n // Placing an empty string between results\n jQuery('#spbc_dialog').append(rowTemplate. printf('', ''));\n\n // Removing last empty string\n jQuery('#spbc_dialog div').last().remove();\n }\n } else {\n let wrapperElement = '
%s
';\n jQuery('#spbc_dialog').append(wrapperElement.printf(result.content));\n afterClose = () => {\n document.location.reload();\n };\n }\n\n let contentHeight = jQuery('#spbc_dialog div').length * 19 < 76 ? 76 : jQuery('#spbc_dialog div').length * 19;\n let visibleHeight = (document.documentElement.clientHeight) / 100 * 75;\n let height = 'auto';\n let overflow = contentHeight < visibleHeight ? 'no_scroll' : 'scroll';\n\n jQuery('#spbc_dialog').dialog({\n modal: true,\n title: result.file_path,\n position: {my: 'center top', at: 'center top+100px', of: window},\n width: +(jQuery('#wpwrap').width() / 100 * 90),\n show: {effect: 'blind', duration: 500},\n draggable: true,\n resizable: false,\n closeText: 'X',\n classes: {'ui-dialog': 'spbc---top'},\n open: function(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function() {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n close: afterClose,\n });\n}\n\n/**\n * Reloads last scan info\n */\nfunction spbcScannerReloadScanInfo() { // eslint-disable-line no-unused-vars\n jQuery('.spbc_hint__last_scan_title').text(spbcScaner.look_below_for_scan_res);\n const data = {\n action: 'spbc_scanner__last_scan_info',\n };\n const params = {\n callback: (result) => {\n document.getElementById('spbc_scanner__last_scan_info').innerText = result.data;\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Cure file\n * @param {object} obj\n */\nfunction spbcScannerButtonCureFileAjaxHandler(obj) { // eslint-disable-line no-unused-vars\n const self = jQuery(obj);\n const fileFastHash = self.parents('.row-actions').attr('uid');\n\n let data = {\n action: 'spbc_file_cure_ajax_action',\n file_fast_hash: fileFastHash,\n security: spbcSettings.ajax_nonce,\n };\n\n jQuery.ajax({\n type: 'POST',\n async: true,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function(result) {\n if (result.success) {\n spbcModal.open().put(result.data);\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n } else {\n spbcModal.open().putError(result.data);\n }\n },\n });\n}\n\n/**\n * Restore file from backup\n * @param {object} obj\n */\nfunction spbcScannerButtonRestoreFromBackupAjaxHandler(obj) { // eslint-disable-line no-unused-vars\n const self = jQuery(obj);\n const fileFastHash = self.parents('.row-actions').attr('uid');\n\n let data = {\n action: 'spbc_restore_file_from_backup_ajax_action',\n file_fast_hash: fileFastHash,\n security: spbcSettings.ajax_nonce,\n };\n\n jQuery.ajax({\n type: 'POST',\n async: true,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function(result) {\n if (result.success) {\n spbcModal.open().put(result.data);\n } else {\n spbcModal.open().putError(result.data);\n }\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n },\n });\n}\n\n/**\n * Clear scan results\n * @return {void}\n */\nfunction spbcScannerButtonClearScanResults() { // eslint-disable-line no-unused-vars\n if ( ! confirm('Do you confirm to clear the scan results?') ) {\n return;\n }\n\n console.log('CLEAR');\n\n spbcSendAJAXRequest(\n {action: 'spbc_scanner_clear'},\n {\n type: 'GET',\n successCallback: function() {\n document.location = document.location;\n },\n complete: null,\n errorOutput: null,\n context: this,\n timeout: 40000,\n success: function() {\n document.location.reload();\n },\n },\n );\n}\n\n/**\n * Show copy log to clipboard hint\n * @param {string} text\n */\nfunction spbcScannerCopyLogToClipboardHint(text) {\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').text(text);\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').show();\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').animate({opacity: 0}, 3000, function() {\n jQuery(this).hide();\n jQuery(this).css('opacity', 1);\n });\n}\n\njQuery(document).ready(function() {\n // EVENT HADLING\n spbcTblBulkActionsListen(); // Table. Row bulk handler\n spbcTblRowActionsListen(); // Table. Row actions handler\n spbcTblPaginationListen(); // Table. Pagination handler\n spbcTblSortListen(); // Table. Sort handler\n\n spbcStartShowHide();\n\n // Preparing progressbar\n jQuery('#spbc_scaner_progress_bar').progressbar({\n value: 0,\n create: function( event, ui ) {\n event.target.style.position = 'relative';\n event.target.style.marginBottom = '12px';\n },\n change: function(event, ui) {\n jQuery('.spbc_progressbar_counter span').text(jQuery(event.target).progressbar('option', 'value') + ' %');\n },\n });\n\n // Preparing accordion\n jQuery('#spbc_scan_accordion').accordion({\n header: 'h3',\n heightStyle: 'content',\n collapsible: true,\n active: false,\n activate: function( event, ui ) {\n jQuery('#spbc_scan_accordion')\n .accordion('option', 'classes.ui-accordion-content', 'ui-corner-bottom spbc-overflow--visible');\n },\n beforeActivate: function( event, ui ) {\n jQuery('#spbc_scan_accordion').accordion('option', 'classes.ui-accordion-content', 'ui-corner-bottom');\n },\n });\n\n // Init scanner plugin\n window.spbcScanner = new SpbcMalwareScanner({\n settings: spbcScaner.settings,\n states: spbcScaner.states,\n button: jQuery('#spbc_perform_scan'),\n spinner: jQuery('#spbc_perform_scan').next(),\n callback: null,\n progress_overall: jQuery('#spbc_scaner_progress_overall'),\n progressbar: jQuery('#spbc_scaner_progress_bar'),\n progressbar_text: jQuery('.spbc_progressbar_counter span'),\n wrapper: document.getElementsByClassName('spbc_unchecked_file_list'),\n warnings: {\n long_scan: jQuery('.spbc_hint_warning__long_scan'),\n outdated: jQuery('.spbc_hint_warning__outdated'),\n },\n });\n\n jQuery(document).on('click', '.spbc_popup_tip--icon---show', function() {\n spbcPopupTipShow( jQuery( this ) );\n });\n\n jQuery('#spbc_perform_scan').on('click', function() {\n jQuery('#spbcscan-results-log-module').remove();\n spbcScanner.actionControl();\n\n if (!jQuery('.spbc_log-wrapper .panel-body').length) {\n jQuery('.spbc_log-wrapper').append('
');\n }\n\n jQuery('.spbc_log-wrapper').resizable({\n handles: 'n, s',\n containment: 'document',\n });\n });\n\n jQuery('#spbcscan-results-log-module').resizable({\n handles: 'n, s',\n containment: 'document',\n });\n\n // Clear scanner's tables\n jQuery('#spbc_scanner_clear').on('click', function() {\n if ( ! confirm('Do you confirm to clear the scan results?') ) {\n return;\n }\n\n console.log('CLEAR');\n\n spbcSendAJAXRequest(\n {action: 'spbc_scanner_clear'},\n {\n type: 'GET',\n successCallback: function() {\n document.location = document.location;\n },\n complete: null,\n errorOutput: null,\n context: this,\n timeout: 40000,\n success: function() {\n document.location.reload();\n },\n },\n );\n });\n\n jQuery('#spbc_scanner_save_to_pdf').on('click', function() {\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_save_to_pdf',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random(),\n },\n xhrFields: {\n responseType: 'blob',\n },\n success: function(data) {\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_get_pdf_file_name',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random(),\n },\n xhrFields: {\n responseType: 'text',\n },\n success: function(filename) {\n let blob=new Blob([data]);\n let link=document.createElement('a');\n link.href=window.URL.createObjectURL(blob);\n link.download=filename.data;\n link.click();\n },\n },\n );\n },\n });\n });\n\n jQuery('#spbc_load_more_scan_logs').on('click', function(e) {\n e.preventDefault();\n\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_load_more_scan_logs',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random(),\n offset: jQuery(this).data('offset') + 100,\n },\n xhrFields: {\n responseType: 'text',\n },\n success: function(data) {\n if (data.success) {\n jQuery('#spbcscan-results-log-module .panel-body').append(data.data);\n }\n },\n });\n });\n\n if (jQuery('#spbc_scanner_copy_log_to_clipboard').length) {\n jQuery('#spbc_scanner_copy_log_to_clipboard').on('click', function(e) {\n e.preventDefault();\n if (navigator.clipboard) {\n let log = jQuery('#spbcscan-results-log-module .panel-body').html();\n let formattedLog = log.replace(//g, '').replace(/<\\/b>/g, '');\n formattedLog = formattedLog.replace(/

/g, '\\n').replace(/<\\/p>/g, '');\n navigator.clipboard.writeText(formattedLog).then(() => {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint);\n }).catch((err) => {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_failed);\n });\n } else {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_unsupported);\n }\n });\n }\n});\n"],"names":["spbcPopupTipShow","showIcon","let","tipTitle","attr","tipText","removeDescFunc","e","jQuery","target","parent","length","hasClass","hide","document","off","after","obj","empty","append","css","top","position","left","on","parents","spbcScannerButtonFileViewEvent","self","data","action","file_id","params","spinner","siblings","callback","spbcScannerButtonViewCallback","errorOutput","msg","spbcModal","open","putError","addEventListener","spbcReloadAccordion","spbcSendAJAXRequest","spbcScannerAnalysisLogDeleteFromLog","fileIds","push","selectedItems","closest","find","alert","each","index","element","elementId","val","children","file_ids","window","location","reload","spbcScannerButtonPageViewEvent","page_url","wpWrap","dialogWindow","dialog","modal","title","my","at","of","width","show","effect","duration","draggable","resizable","closeText","classes","ui-dialog","event","ui","style","overflow","height","documentElement","beforeClose","body","sizeMultiplier","result","row","rowTemplate","display","file","printf","contentHeight","Object","keys","visibleHeight","file_path","console","log","spbcScannerButtonFileViewBadEvent","spbcScannerButtonViewBadFileCallback","spbcScannerButtonPageViewBadEvent","spbcScannerButtonViewBadCallback","severityKeysSorted","severity","severityPart","rowTemplateBad","severityParts","severityPartsSorted","weak_spots","JSON","parse","key","sort","strNum","headerName","toLowerCase","headerHtml","header","Set","temp","currRow","last","remove","afterClose","success","strNums","concat","badStringsMap","Map","entries","CRITICAL","get","includes","isBadString","unformattedRow","highlitedRow","content","close","spbcScannerReloadScanInfo","text","spbcScaner","look_below_for_scan_res","getElementById","innerText","spbcScannerButtonCureFileAjaxHandler","file_fast_hash","security","spbcSettings","ajax_nonce","ajax","type","async","url","ajaxurl","put","spbcScannerButtonRestoreFromBackupAjaxHandler","spbcScannerButtonClearScanResults","confirm","successCallback","complete","context","this","timeout","spbcScannerCopyLogToClipboardHint","animate","opacity","ready","spbcTblBulkActionsListen","spbcTblRowActionsListen","spbcTblPaginationListen","spbcTblSortListen","spbcStartShowHide","progressbar","value","create","marginBottom","change","accordion","heightStyle","collapsible","active","activate","beforeActivate","spbcScanner","SpbcMalwareScanner","settings","states","button","next","progress_overall","progressbar_text","wrapper","getElementsByClassName","warnings","long_scan","outdated","actionControl","handles","containment","no_cache","Math","random","xhrFields","responseType","filename","blob","Blob","link","createElement","href","URL","createObjectURL","download","click","preventDefault","offset","navigator","clipboard","formattedLog","html","replace","writeText","then","copy_log_to_clipboard_hint","catch","copy_log_to_clipboard_hint_failed","copy_log_to_clipboard_hint_unsupported"],"mappings":"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"} \ No newline at end of file diff --git a/js/src/spbc-settings_tab--scanner.js b/js/src/spbc-settings_tab--scanner.js index 030c0beb1..4a398362e 100644 --- a/js/src/spbc-settings_tab--scanner.js +++ b/js/src/spbc-settings_tab--scanner.js @@ -542,12 +542,12 @@ function spbcScannerButtonRestoreFromBackupAjaxHandler(obj) { // eslint-disable- success: function(result) { if (result.success) { spbcModal.open().put(result.data); - document.addEventListener('spbcModalClosed', function( e ) { - document.location.reload(); - }); } else { spbcModal.open().putError(result.data); } + document.addEventListener('spbcModalClosed', function( e ) { + document.location.reload(); + }); }, }); } From 5461ef701940a578bdcb418d7601fdf46a96028c Mon Sep 17 00:00:00 2001 From: AntonV1211 Date: Mon, 24 Feb 2025 21:08:00 +0700 Subject: [PATCH 12/15] Mod. GetKeyAuto. Checking the query result code --- inc/spbc-settings.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/inc/spbc-settings.php b/inc/spbc-settings.php index fe3971ef4..47c06a9ea 100644 --- a/inc/spbc-settings.php +++ b/inc/spbc-settings.php @@ -5013,6 +5013,12 @@ function spbc_get_key_auto($direct_call = false) 'reload' => false, 'msg' => $result['error'] ); + } elseif (isset($result['error_no']) && $result['error_no'] == '403') { + $out = array( + 'success' => true, + 'reload' => false, + 'error' => __('Our service is not available in your region.', 'cleantalk-spam-protect'), + ); } elseif ( ! isset($result['auth_key'])) { $out = array( 'success' => true, From a1d6765bda923b2fb411de3eb9c8ed441fdd47ee Mon Sep 17 00:00:00 2001 From: AntonV1211 Date: Wed, 26 Feb 2025 13:56:32 +0700 Subject: [PATCH 13/15] Fix. GetKeyAuto. Removed localization --- inc/spbc-settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/spbc-settings.php b/inc/spbc-settings.php index 47c06a9ea..63e1b85e6 100644 --- a/inc/spbc-settings.php +++ b/inc/spbc-settings.php @@ -5017,7 +5017,7 @@ function spbc_get_key_auto($direct_call = false) $out = array( 'success' => true, 'reload' => false, - 'error' => __('Our service is not available in your region.', 'cleantalk-spam-protect'), + 'error' => isset($result['error_message']) ? esc_html($result['error_message']) : esc_html('Our service is not available in your region.'), ); } elseif ( ! isset($result['auth_key'])) { $out = array( From b25ec951bc9be35424cbe413421f5f4d1f52e577 Mon Sep 17 00:00:00 2001 From: AntonV1211 Date: Mon, 24 Feb 2025 21:31:02 +0700 Subject: [PATCH 14/15] Version 2.152.99-dev --- security-malware-firewall.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security-malware-firewall.php b/security-malware-firewall.php index 4e13aee05..c01de887f 100644 --- a/security-malware-firewall.php +++ b/security-malware-firewall.php @@ -5,7 +5,7 @@ Plugin URI: https://wordpress.org/plugins/security-malware-firewall/ Description: Security & Malware scan by CleanTalk to protect your website from online threats and viruses. IP/Country FireWall, Web application FireWall. Detailed stats and logs to have full control. Author: CleanTalk Security -Version: 2.152.99-fix +Version: 2.152.99-dev Author URI: https://cleantalk.org Text Domain: security-malware-firewall Domain Path: /i18n From 8af56346500cec7a0c5bcdd7de7f2923dc387c2a Mon Sep 17 00:00:00 2001 From: Viktor Date: Mon, 3 Mar 2025 16:04:51 +0300 Subject: [PATCH 15/15] Fix. Http. Hard coded cleantalk IPs removed. (#481) --- lib/CleantalkSP/Common/Helpers/IP.php | 64 ------------------------ lib/CleantalkSP/SpbctWP/Helpers/HTTP.php | 38 +++++++------- security-malware-firewall.php | 2 +- tests/Common/Helpers/HelperHTTPTest.php | 2 +- 4 files changed, 22 insertions(+), 84 deletions(-) diff --git a/lib/CleantalkSP/Common/Helpers/IP.php b/lib/CleantalkSP/Common/Helpers/IP.php index 248923a5a..eac7edb69 100644 --- a/lib/CleantalkSP/Common/Helpers/IP.php +++ b/lib/CleantalkSP/Common/Helpers/IP.php @@ -49,34 +49,6 @@ class IP ), ); - /** - * @var array Set of CleanTalk servers - */ - public static $cleantalks_servers = array( - // MODERATE - 'moderate1.cleantalk.org' => '162.243.144.175', - 'moderate2.cleantalk.org' => '159.203.121.181', - 'moderate3.cleantalk.org' => '88.198.153.60', - 'moderate4.cleantalk.org' => '159.69.51.30', - 'moderate5.cleantalk.org' => '95.216.200.119', - 'moderate6.cleantalk.org' => '138.68.234.8', - // APIX - 'apix1.cleantalk.org' => '35.158.52.161', - 'apix2.cleantalk.org' => '18.206.49.217', - 'apix3.cleantalk.org' => '3.18.23.246', - 'apix4.cleantalk.org' => '44.227.90.42', - 'apix5.cleantalk.org' => '15.188.198.212', - 'apix6.cleantalk.org' => '54.219.94.72', - 'apix7.cleantalk.org' => '54.219.94.72', - 'apix8.cleantalk.org' => '148.251.84.122', - 'apix9.cleantalk.org' => '135.148.237.215', - 'apix10.cleantalk.org' => '5.9.221.172', - 'apix11.cleantalk.org' => '88.198.99.241', - //ns - 'netserv2.cleantalk.org' => '178.63.60.214', - 'netserv4.cleantalk.org' => '51.81.55.252', - ); - /** * Getting arrays of IP (REMOTE_ADDR, X-Forwarded-For, X-Real-Ip, Cf_Connecting_Ip) * @@ -560,42 +532,6 @@ public static function calculateMaskForIPs($ip, $mask_start, $mask_end) return $out; } - /** - * Get URL form IP. Check if it's belong to cleantalk. - * - * @param string $ip - * - * @return bool|false - * @psalm-suppress PossiblyUnusedMethod - */ - public static function isIPCleantalks($ip) - { - if (self::validate($ip)) { - $url = array_search($ip, self::$cleantalks_servers, true); - return (bool) $url; - } - - return false; - } - - /** - * Get URL form IP. Check if it's belong to cleantalk. - * - * @param $ip - * - * @return false|int|string - * @psalm-suppress PossiblyUnusedMethod - */ - public static function resolveCleantalks($ip) - { - if (self::validate($ip)) { - $url = array_search($ip, self::$cleantalks_servers, true); - return $url ?: self::resolve($ip); - } - - return $ip; - } - /** * Get URL form IP * diff --git a/lib/CleantalkSP/SpbctWP/Helpers/HTTP.php b/lib/CleantalkSP/SpbctWP/Helpers/HTTP.php index 5d5b259da..05d6c810a 100644 --- a/lib/CleantalkSP/SpbctWP/Helpers/HTTP.php +++ b/lib/CleantalkSP/SpbctWP/Helpers/HTTP.php @@ -18,39 +18,41 @@ class HTTP extends \CleantalkSP\Common\Helpers\HTTP { /** - * Sort CleanTalks API servers by response time - * Wrapper for self::sortHostsByResponseTime() + * Get CleanTalk API servers from DNS * * @return array */ - public static function getCleantalksAPIServersOrderedByResponseTime() + public static function getCleantalksAPIServersFromDNS() { - return static::sortHostsByResponseTime( - // Get only apix*.cleantalk.org domains from cleantalk servers - array_filter( - IP::$cleantalks_servers, - static function ($key) { - return (bool)preg_match('/^apix\d\d?\.cleantalk\.org$/', $key); - }, - ARRAY_FILTER_USE_KEY - ) - ); + $servers = []; + $dns_records = dns_get_record('api.cleantalk.org', DNS_A); + + foreach ($dns_records as $record) { + if (isset($record['ip'])) { + $server_host = gethostbyaddr($record['ip']); + if ( $server_host !== false && $server_host !== $record['ip'] ) { + $servers[$server_host] = $record['ip']; + } + } + } + + return $servers; } /** - * Sort CleanTalks moderate servers by response time + * Sort CleanTalks API servers by response time * Wrapper for self::sortHostsByResponseTime() * * @return array */ - public static function getCleantalksModerateServersOrderedByResponseTime() + public static function getCleantalksAPIServersOrderedByResponseTime() { return static::sortHostsByResponseTime( - // Get only moderate*.cleantalk.org domains from cleantalk servers + // Get only apix*.cleantalk.org domains from cleantalk servers array_filter( - IP::$cleantalks_servers, + static::getCleantalksAPIServersFromDNS(), static function ($key) { - return (bool)preg_match('/^moderate\d\d?\.cleantalk\.org$/', $key); + return (bool)preg_match('/^apix\d\d?\.cleantalk\.org$/', $key); }, ARRAY_FILTER_USE_KEY ) diff --git a/security-malware-firewall.php b/security-malware-firewall.php index c01de887f..9d1e8ab14 100644 --- a/security-malware-firewall.php +++ b/security-malware-firewall.php @@ -1344,7 +1344,7 @@ function spbc_test_connection($urls_to_test = array()) { $out = array(); - $urls_to_test = $urls_to_test ?: array_keys(\CleantalkSP\SpbctWP\Helpers\IP::$cleantalks_servers); + $urls_to_test = $urls_to_test ?: array_keys(HTTP::getCleantalksAPIServersFromDNS()); foreach ( $urls_to_test as $url ) { $start = microtime(true); diff --git a/tests/Common/Helpers/HelperHTTPTest.php b/tests/Common/Helpers/HelperHTTPTest.php index cf7deb931..765ddbb64 100644 --- a/tests/Common/Helpers/HelperHTTPTest.php +++ b/tests/Common/Helpers/HelperHTTPTest.php @@ -62,7 +62,7 @@ public function testPingMethods() public function testPingCurl() { $hosts = array_filter( - IP::$cleantalks_servers, + HTTP::getCleantalksAPIServersFromDNS(), static function ($key) { return (bool)preg_match('/^apix\d\d?\.cleantalk\.org$/', $key); },