diff --git a/lib/CleantalkSP/SpbctWP/Scanner/ScanRepository.php b/lib/CleantalkSP/SpbctWP/Scanner/ScanRepository.php index 7e3428926..de85655e4 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/ScanRepository.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/ScanRepository.php @@ -35,6 +35,20 @@ public static function getPendingQueueFiles() ); } + /** + * Get fast hashes of the files known to the cloud analysis + * @return array + */ + public static function getCloudAnalysisFilesFastHashes() + { + global $wpdb; + + return (array) $wpdb->get_col( + 'SELECT DISTINCT fast_hash FROM ' . SPBC_TBL_SCAN_FILES + . ' WHERE pscan_file_id IS NOT NULL AND fast_hash IS NOT NULL AND fast_hash <> ""' + ); + } + /** * Get file info by fast_hash * @return array|null diff --git a/lib/CleantalkSP/SpbctWP/Sync.php b/lib/CleantalkSP/SpbctWP/Sync.php index 5bfb2268b..38b27fef5 100644 --- a/lib/CleantalkSP/SpbctWP/Sync.php +++ b/lib/CleantalkSP/SpbctWP/Sync.php @@ -3,6 +3,8 @@ namespace CleantalkSP\SpbctWP; use CleantalkSP\SpbctWP\AdjustToEnvironmentModule\AdjustToEnvironmentHandler; +use CleantalkSP\SpbctWP\Scanner\ScannerAjaxEndpoints; +use CleantalkSP\SpbctWP\Scanner\ScanRepository; use CleantalkSP\SpbctWP\Settings\FilesScanPathExclusion; class Sync @@ -17,6 +19,7 @@ class Sync 'settings_exclusions' => 'Handling exclusions...', 'adjust_env' => 'Adjusting environment...', 'vulnerability_check' => 'Running vulnerability check...', + 'analysis_log_update' => 'Updating cloud analysis verdicts...', 'finalize' => 'Sync end...', ); @@ -101,6 +104,7 @@ public static function run() self::stepSettingsExclusions(); self::stepAdjustEnv(); self::stepVulnerabilityCheck(); + self::stepAnalysisLogUpdate($account_is_ok); $out = array( 'success' => true, @@ -179,6 +183,9 @@ public static function runCurrentStep() case 'vulnerability_check': self::stepVulnerabilityCheck(); break; + case 'analysis_log_update': + self::stepAnalysisLogUpdate($account_is_ok); + break; case 'finalize': self::stepFinalize(); @@ -392,6 +399,36 @@ private static function stepVulnerabilityCheck() Cron::updateTask('check_vulnerabilities', 'spbc_security_check_vulnerabilities', 86400, time()); } + /** + * Pull actual cloud verdicts for the scan results files. + * The cloud verdict may be changed after the file processing is done, + * so the files with the final verdict have to be re-checked too. + * + * @param bool $account_is_ok + */ + private static function stepAnalysisLogUpdate($account_is_ok) + { + global $spbc; + + if ( ! $account_is_ok || ! is_main_site() ) { + return; + } + + $file_ids = ScanRepository::getCloudAnalysisFilesFastHashes(); + + if ( empty($file_ids) ) { + return; + } + + $result = ScannerAjaxEndpoints::checkFilesAnalysisStatus(true, $file_ids); + + if ( ! empty($result['error']) ) { + $spbc->error_add('analysis_log_update', $result); + } else { + $spbc->error_delete('analysis_log_update'); + } + } + private static function stepFinalize() { global $spbc;