/** * Execute scheduled scans during plugins_loaded * * @since 4.3 * * @return mixed false on error or void */ public function plugins_loaded() { global $itsec_globals, $itsec_malware, $itsec_files; if ($itsec_files->get_file_lock('maleware-scheduling')) { $last_scans = get_site_option('itsec_malware_scheduling_last_scans'); $scan_executed = false; //Flag to prevent multiple executions per page load (reduce API overage) //build the full array of last scans $last_scans_count = isset($last_scans['count']) ? $last_scans['count'] : 0; $scan_resources = array(); $scan_meta = array(); for ($i = 0; $i < $last_scans_count + 1; $i++) { $scans = get_site_option('itsec_malware_scheduling_last_scans_' . $i); if (is_array($scans)) { $scan_resources = array_merge($scans, $scan_resources); } delete_site_option('itsec_malware_scheduling_last_scans_' . $i); } //Always make sure last scans and standard scans are arrays if (!is_array($last_scans)) { $last_scans = array(); } if (!isset($last_scans['overall']) || $last_scans['overall'] < $itsec_globals['current_time_gmt'] - 30) { //only allow 1 scan every 30 seconds $queued = get_site_option('itsec_malware_scheduling_report_queue'); if ($queued === false) { $queued = array(); } if (sizeof($queued) > 0) { $reverse_queued = array_reverse($queued); $resource = array_pop($reverse_queued); $report = $itsec_malware->scan_report($resource); $queued = array_reverse($reverse_queued); } //process individual scans first if (isset($this->settings['individual']) && is_array($this->settings['individual'])) { foreach ($this->settings['individual'] as $item) { if (isset($item['resource']) && strlen($item['resource']) > 0 && $scan_executed === false && isset($last_scans[$item['resource']]) && $last_scans[$item['resource']] < $itsec_globals['current_time_gmt'] - 604800) { $scan = $itsec_malware->scheduled_scan($item['type'], $item['resource']); if (isset($scan['response_code']) && $scan['response_code'] === 1) { //Don't request a report if it isn't ready $report = $itsec_malware->scan_report($scan['resource']); } else { //Queue result for later $queued[] = $scan['resource']; } $scan_executed = true; $scan_resources[$item['resource']] = $itsec_globals['current_time_gmt']; } } } //Standard scheduled scan if ($scan_executed === false) { $standard_period = isset($this->settings['standard_interval']) ? absint($this->settings['standard_interval']) * 60 * 60 : 3600; //get interval in minutes $resource = ITSEC_Lib::get_current_url(); if (isset($this->settings['standard']) && $this->settings['standard'] === true) { if (!isset($last_scans['standard']) || !isset($scan_resources[$resource]) || $last_scans['standard'] < $itsec_globals['current_time_gmt'] - $standard_period && $scan_resources[$resource] < $itsec_globals['current_time_gmt'] - 604800) { $scan = $itsec_malware->scheduled_scan(0, $resource); if (isset($scan['response_code']) && $scan['response_code'] === 1) { //Don't request a report if it isn't ready $report = $itsec_malware->scan_report($scan['resource']); } else { //Queue result for later if (isset($scan['resource'])) { $queued[] = $scan['resource']; } elseif (ITSEC_Lib::validate_url($resource) === true) { $queued[] = $resource; } } $scan_meta['standard'] = $itsec_globals['current_time_gmt']; $scan_resources[$resource] = $itsec_globals['current_time_gmt']; } } } //Update scan time and save last scans $scan_meta['overall'] = $itsec_globals['current_time_gmt']; $chunk = array_chunk($scan_resources, 100, true); for ($i = 0; $i < sizeof($chunk); $i++) { if (is_multisite()) { update_site_option('itsec_malware_scheduling_last_scans_' . $i, $chunk[$i]); } else { add_option('itsec_malware_scheduling_last_scans_' . $i, $chunk[$i], '', false); } } $scan_meta['count'] = sizeof($chunk); update_site_option('itsec_malware_scheduling_last_scans', $scan_meta); if (sizeof($queued) > 0) { update_site_option('itsec_malware_scheduling_report_queue', $queued); } else { delete_site_option('itsec_malware_scheduling_report_queue'); } } $itsec_files->release_file_lock('maleware-scheduling'); } }