file_object = new OnecomCheckFiles(); } public function init() { $fixes = new OnecomFixes(); add_action( 'wp_ajax_ocsh_mark_resolved', array( $this, 'ocsh_mark_resolved' ) ); add_action( 'wp_ajax_onecom_unignore', array( $this, 'unignore' ) ); add_action( 'wp_ajax_ocsh_reset_checks', array( $this, 'reset_checks' ) ); $this->add_check_callbacks(); $fixes->init(); $this->add_undo_callbacks(); } /** * Add AJAX callbacks for checks */ public function add_check_callbacks(): void { add_action( 'wp_ajax_ocsh_check_php_updates', array( $this, 'php_updates' ) ); add_action( 'wp_ajax_ocsh_check_plugin_updates', array( $this, 'plugin_updates' ) ); add_action( 'wp_ajax_ocsh_check_theme_updates', array( $this, 'theme_updates' ) ); add_action( 'wp_ajax_ocsh_check_wp_updates', array( $this, 'wp_updates' ) ); add_action( 'wp_ajax_ocsh_check_wp_connection', array( $this, 'wp_connection' ) ); add_action( 'wp_ajax_ocsh_check_core_updates', array( $this, 'core_updates' ) ); add_action( 'wp_ajax_ocsh_check_ssl', array( $this, 'check_ssl' ) ); add_action( 'wp_ajax_ocsh_check_file_execution', array( $this, 'file_execution' ) ); add_action( 'wp_ajax_ocsh_check_file_permissions', array( $this, 'file_permissions' ) ); add_action( 'wp_ajax_ocsh_check_DB', array( $this, 'database' ) ); add_action( 'wp_ajax_ocsh_check_file_edit', array( $this, 'file_edit' ) ); add_action( 'wp_ajax_ocsh_check_usernames', array( $this, 'usernames' ) ); add_action( 'wp_ajax_ocsh_check_dis_plugin', array( $this, 'dis_plugin' ) ); add_action( 'wp_ajax_ocsh_save_result', array( $this, 'save_result_cb' ) ); add_action( 'wp_ajax_ocsh_check_uploads_index', array( $this, 'uploads_index_cb' ) ); add_action( 'wp_ajax_ocsh_check_woocommerce_sessions', array( $this, 'woocommerce_session' ) ); add_action( 'wp_ajax_ocsh_check_options_table_count', array( $this, 'options_table_count' ) ); add_action( 'wp_ajax_ocsh_check_staging_time', array( $this, 'staging_time' ) ); add_action( 'wp_ajax_ocsh_check_backup_zips', array( $this, 'backup_zips' ) ); add_action( 'wp_ajax_ocsh_check_performance_cache', array( $this, 'performance_cache' ) ); add_action( 'wp_ajax_ocsh_check_updated_long_ago', array( $this, 'updated_long_ago' ) ); add_action( 'wp_ajax_ocsh_check_pingbacks', array( $this, 'pingbacks' ) ); add_action( 'wp_ajax_ocsh_check_logout_duration', array( $this, 'logout_duration' ) ); add_action( 'wp_ajax_ocsh_check_xmlrpc', array( $this, 'xmlrpc' ) ); add_action( 'wp_ajax_ocsh_check_spam_protection', array( $this, 'spam_protection' ) ); add_action( 'wp_ajax_ocsh_check_login_attempts', array( $this, 'login_attempts' ) ); add_action( 'wp_ajax_ocsh_check_login_recaptcha', array( $this, 'login_recaptcha' ) ); add_action( 'wp_ajax_ocsh_check_asset_minification', array( $this, 'asset_minification' ) ); add_action( 'wp_ajax_ocsh_check_error_reporting', array( $this, 'error_reporting' ) ); add_action( 'wp_ajax_ocsh_check_debug_enabled', array( $this, 'debug_enabled' ) ); add_action( 'wp_ajax_ocsh_check_debug_log_size', array( $this, 'debug_log_size' ) ); add_action( 'wp_ajax_ocsh_check_user_enumeration', array( $this, 'user_enumeration' ) ); add_action( 'wp_ajax_ocsh_check_optimize_uploaded_images', array( $this, 'optimize_uploaded_images' ) ); add_action( 'wp_ajax_ocsh_check_enable_cdn', array( $this, 'enable_cdn' ) ); add_action( 'wp_ajax_ocsh_check_inactive_plugins', array( $this, 'inactive_plugins' ) ); add_action( 'wp_ajax_ocsh_check_inactive_themes', array( $this, 'inactive_themes' ) ); } public function add_undo_callbacks(): void { add_action( 'wp_ajax_ocsh_undo_check_pingbacks', array( $this, 'undo_check_pingbacks' ) ); add_action( 'wp_ajax_ocsh_undo_check_performance_cache', array( $this, 'undo_check_performance_cache' ) ); add_action( 'wp_ajax_ocsh_undo_enable_cdn', array( $this, 'undo_enable_cdn' ) ); add_action( 'wp_ajax_ocsh_undo_logout_duration', array( $this, 'undo_check_logout_duration' ) ); add_action( 'wp_ajax_ocsh_undo_xmlrpc', array( $this, 'undo_fix_xmlrpc' ) ); add_action( 'wp_ajax_ocsh_undo_login_recaptcha', array( $this, 'undo_login_recaptcha' ) ); add_action( 'wp_ajax_ocsh_undo_login_attempts', array( $this, 'undo_login_attempts' ) ); } /** * Response format based on type of request */ public function send_json( array $result, string $check = '' ) { // add "html" key if not present if ( ! isset( $result['html'] ) ) { $result['html'] = $this->get_html( $check, $result ); } $prev_result = get_site_transient( 'ocsh_site_previous_scan' ); if ( ! $prev_result ) { $prev_result = array(); } // Added to remove the ALP audit from HM if ( isset( $prev_result['login_protection'] ) ) { unset( $prev_result['login_protection'] ); } $prev_result[ $check ] = $result; unset( $prev_result[ $check ]['html'] ); if ( 0 !== $result[ $this->status_key ] && $this->is_ignored( $check ) ) { $result[ $this->status_key ] = 3; } elseif ( 0 === $result[ $this->status_key ] && $this->is_ignored( $check ) ) { $this->remove_ignored_check( $check ); } set_site_transient( 'ocsh_site_previous_scan', $prev_result ); if ( ! ( defined( 'REST_REQUEST' ) || defined( 'DOING_CRON' ) ) ) { wp_send_json( $result ); } return $result; } public function php_updates() { $php_update = new OnecomCheckUpdates(); $result = $php_update->php_updates(); parent::save_result( 'php_updates', $result['status'] ); self::send_json( $result, 'php_updates' ); } public function plugin_updates() { $php_update = new OnecomCheckUpdates(); $result = $php_update->plugin_updates(); parent::save_result( 'plugin_updates', $result['status'] ); self::send_json( $result, 'plugin_updates' ); } public function theme_updates() { $php_update = new OnecomCheckUpdates(); $result = $php_update->theme_updates(); parent::save_result( 'theme_updates', $result['status'] ); self::send_json( $result, 'theme_updates' ); } public function wp_updates() { $updates = new OnecomCheckUpdates(); $result = $updates->check_wp_updates(); parent::save_result( 'wp_updates', $result['status'] ); self::send_json( $result, 'wp_updates' ); } public function wp_connection() { $updates = new OnecomCheckUpdates(); $result = $updates->check_wp_connection(); parent::save_result( 'wp_connection', $result['status'] ); self::send_json( $result, 'wp_connection' ); } public function core_updates() { $updates = new OnecomCheckUpdates(); $result = $updates->check_auto_updates(); parent::save_result( 'core_updates', $result['status'] ); self::send_json( $result, 'core_updates' ); } public function check_ssl() { $ssl = new OnecomCheckSsl(); $result = $ssl->oc_sh_check_ssl(); parent::save_result( 'ssl', $result['status'] ); self::send_json( $result, 'ssl' ); } public function file_execution() { $result = $this->file_object->check_execution(); $result['fix'] = true; $result['revert'] = true; parent::save_result( 'file_execution', $result['status'] ); self::send_json( $result, 'file_execution' ); } public function file_permissions() { $result = $this->file_object->check_permission(); parent::save_result( 'file_permissions', $result['status'] ); self::send_json( $result, 'file_permissions' ); } public function database() { $db = new OnecomCheckDB(); $result = $db->check_db_security(); parent::save_result( 'DB', $result['status'] ); self::send_json( $result, 'DB' ); } public function file_edit() { $file = new OnecomCheckFiles(); $result = $file->check_file_editing(); parent::save_result( 'file_edit', $result['status'] ); self::send_json( $result, 'file_edit' ); } public function usernames() { $usernames = new OnecomCheckUsername(); $result = $usernames->check_usernames(); parent::save_result( 'usernames', $result['status'] ); self::send_json( $result, 'usernames' ); } public function dis_plugin() { $plugins = new OnecomCheckPlugins(); $result = $plugins->check_discouraged_plugins(); parent::save_result( 'dis_plugin', $result['status'] ); self::send_json( $result, 'dis_plugin' ); } public function save_result_cb(): float { // return floatval($_POST['osch_Result']); $scan_result = get_site_transient( 'ocsh_site_scan_result' ); $last_scan_time = $scan_result['time'] ?? __( 'No scan available', 'onecom-wp' ); /* Format the last scan date time as per WP date-time settings */ if ( is_numeric( $last_scan_time ) && function_exists( 'wp_date' ) ) { $frmt = 'l ' . get_site_option( 'date_format' ) . ' ' . get_site_option( 'time_format' ); $tz = get_site_option( 'timezone_string' ) && ! empty( get_site_option( 'timezone_string' ) ) ? get_site_option( 'timezone_string' ) : 'UTC'; $last_scan_time_localised = wp_date( $frmt, $last_scan_time, new DateTimeZone( $tz ) ); } else { $last_scan_time_localised = __( 'No scan available', 'onecom-wp' ); } return wp_send_json( array( 'last_scan_time' => $last_scan_time_localised ) ); } public function uploads_index_cb() { $fs = new OnecomCheckFiles(); $result = $fs->check_index(); $result['html'] = $this->get_html( 'uploads_index', $result ); parent::save_result( 'uploads_index', $result['status'] ); self::send_json( $result, 'uploads_index' ); } public function woocommerce_session() { $db = new OnecomCheckDB(); $result = $db->check_woocommerce_session(); $result['fix'] = true; $result['html'] = $this->get_html( 'woocommerce_sessions', $result ); parent::save_result( 'woocommerce_sessions', $result['status'] ); self::send_json( $result, 'woocommerce_sessions' ); } public function options_table_count() { $db = new OnecomCheckDB(); $result = $db->check_options_table(); $result['html'] = $this->get_html( 'options_table_count', $result ); parent::save_result( 'options_table_count', $result['status'] ); self::send_json( $result, 'options_table_count' ); } public function staging_time() { $stg = new OnecomCheckStaging(); $result = $stg->check_staging_time(); $result['fix'] = true; $result['fix_text'] = 'Review staging'; $result['fix_url'] = admin_url( 'admin.php?page=onecom-wp-staging' ); $result['html'] = $this->get_html( 'check_staging_time', $result ); parent::save_result( 'check_staging_time', $result['status'] ); self::send_json( $result, 'check_staging_time' ); } public function backup_zips() { $fs = new OnecomCheckFiles(); $result = $fs->check_backup_zips(); $result['delete-link'] = true; $result['html'] = $this->get_html( 'check_backup_zip', $result ); parent::save_result( 'check_backup_zip', $result['status'] ); self::send_json( $result, 'check_backup_zip' ); } public function performance_cache() { $plugins = new OnecomCheckPlugins(); $result = $plugins->check_performance_cache(); $result['fix'] = true; $result['undo'] = true; if ( isset( $result['activate_plugin'] ) && $result['activate_plugin'] ) { $result['fix_url'] = admin_url( 'plugins.php?plugin_status=inactive' ); } $result['html'] = $this->get_html( 'check_performance_cache', $result ); parent::save_result( 'performance_cache', $result['status'] ); self::send_json( $result, 'performance_cache' ); } public function updated_long_ago() { $plugins = new OnecomCheckPlugins(); $result = $plugins->check_plugins_last_update(); $result['html'] = $this->get_html( 'check_updated_long_ago', $result ); parent::save_result( 'check_updated_long_ago', $result['status'] ); self::send_json( $result, 'check_updated_long_ago' ); } public function pingbacks() { $pingback = new OnecomPingback(); $result = $pingback->check_pingbacks(); $result['fix'] = true; $result['undo'] = true; $result['fix_text'] = 'Disable pingback'; $result['html'] = $this->get_html( 'check_pingbacks', $result ); parent::save_result( 'check_pingbacks', $result['status'] ); self::send_json( $result, 'check_pingbacks' ); } public function inactive_plugins() { $plugins = new OnecomCheckPlugins(); $result = $plugins->check_inactive_plugins(); $result['fix'] = true; $result['fix_url'] = admin_url( 'plugins.php?plugin_status=inactive' ); $result['html'] = $this->get_html( 'inactive_plugins', $result ); parent::save_result( 'inactive_plugins', $result['status'] ); self::send_json( $result, 'inactive_plugins' ); } public function inactive_themes() { $plugins = new OnecomCheckPlugins(); $result = $plugins->check_inactive_themes(); $result['fix'] = true; $result['fix_url'] = admin_url( 'themes.php' ); $result['html'] = $this->get_html( 'inactive_themes', $result ); parent::save_result( 'inactive_themes', $result['status'] ); self::send_json( $result, 'inactive_themes' ); } /** * Ignore a check from future scans */ public function ocsh_mark_resolved() { $check = strip_tags( $_POST['check'] ); $check = str_replace( 'check_', '', $check ); $marked_as_resolved = $this->ignored; if ( empty( $marked_as_resolved ) ) { $marked_as_resolved = array(); } if ( ! in_array( $check, $marked_as_resolved ) ) { $marked_as_resolved[] = $check; } $result = update_option( 'oc_marked_resolved', $marked_as_resolved, 'no' ); $this->push_stats( 'ignore', $check ); if ( $result ) { wp_send_json( $this->format_result( $this->flag_resolved, __( 'Ignored in future scans', 'onecom-wp' ) ) ); } else { wp_send_json( $this->format_result( $this->flag_open, __( 'Could not ignore from future scans', 'onecom-wp' ) ) ); } } /** * Remove a check from ignore list */ public function unignore(): void { $check = sanitize_text_field( $_POST['check'] ); $check = str_replace( 'check_', '', $check ); $marked_as_resolved = $this->ignored; if ( empty( $marked_as_resolved ) ) { $marked_as_resolved = array(); } if ( ( $key = array_search( $check, $marked_as_resolved ) ) !== false ) { unset( $marked_as_resolved[ $key ] ); } $this->push_stats( 'unignore', $check ); $result = update_option( 'oc_marked_resolved', $marked_as_resolved, 'no' ); if ( $result ) { wp_send_json( $this->format_result( $this->flag_resolved, __( 'Unignored from future scans', 'onecom-wp' ) ) ); } else { wp_send_json( $this->format_result( $this->flag_open, __( 'Could not remove from ignored list', 'onecom-wp' ) ) ); } } /** * Reset the list of ignored checks * * @todo not used, removed */ public function reset_checks() { $result = delete_option( $this->resolved_option ); if ( $result ) { wp_send_json( $this->format_result( $this->flag_resolved, __( 'Success', 'onecom-wp' ) ) ); } else { wp_send_json( $this->format_result( $this->flag_open, __( 'Failed', 'onecom-wp' ) ) ); } } public function undo_check_pingbacks() { $pingbacks = new OnecomPingback(); $result = $pingbacks->undo(); $this->update_previous_scan( 'check_pingbacks', 1 ); $this->push_stats( 'revert', 'pingbacks' ); wp_send_json( $result ); } public function undo_check_performance_cache() { $pc = new OnecomCheckPlugins(); $result = $pc->undo_check_performance_cache(); $this->update_previous_scan( 'performance_cache', 1 ); $this->push_stats( 'revert', 'performance_cache' ); wp_send_json( $result ); } public function logout_duration() { $pc = new OnecomCheckLogin(); $result = $pc->check_logout_time(); $result['fix'] = true; $result['undo'] = true; $result['fix_text'] = sprintf( __( 'Change logout time to %s hours', 'onecom-wp' ), '4' ); $result['html'] = $this->get_html( 'logout_duration', $result ); parent::save_result( 'logout_duration', $result['status'] ); self::send_json( $result, 'logout_duration' ); } public function undo_check_logout_duration() { $logout = new OnecomCheckLogin(); $this->push_stats( 'revert', 'logout_duration' ); wp_send_json( $logout->undo_check_logout_time() ); } public function xmlrpc() { $xmlrpc = new OnecomXmlRpc(); $result = $xmlrpc->check_xmlrpc(); $result['fix'] = true; $result['undo'] = true; $result['html'] = $this->get_html( 'xmlrpc', $result ); parent::save_result( 'xmlrpc', $result['status'] ); self::send_json( $result, 'xmlrpc' ); } public function undo_fix_xmlrpc() { $xmlrpc = new OnecomXmlRpc(); $result = $xmlrpc->undo_check_xmlrpc(); $this->update_previous_scan( 'xmlrpc', 1 ); $this->push_stats( 'revert', 'xmlrpc' ); wp_send_json( $result ); } public function spam_protection() { $spam = new OnecomCheckSpam(); $result = $spam->check_spam_protection(); if ( $result[ $this->status_key ] === $this->flag_open ) { $theme_result = $spam->is_onecom_theme(); $result['fix'] = true; if ( $theme_result['onecom_theme'] && $theme_result['url'] !== '' ) { $result['fix_url'] = $theme_result['url']; $result['fix_text'] = __( 'Enable spam protection', 'onecom-wp' ); } } $result['html'] = $this->get_html( 'spam_protection', $result ); parent::save_result( 'spam_protection', $result['status'] ); self::send_json( $result, 'spam_protection' ); } public function login_attempts( $is_login_check = false ) { $login = new OnecomCheckSpam(); $result = $login->check_login_attempts(); $result['fix'] = true; $result['undo'] = true; $result['html'] = $this->get_html( 'login_attempts', $result ); if ( isset( $_POST['action'] ) && ( ( $_POST['action'] === 'ocsh_check_login_attempts' ) || $is_login_check ) ) { parent::save_result( 'login_attempts', $result['status'] ); self::send_json( $result, 'login_attempts' ); } else { parent::save_result( 'spam_protection', $result['status'] ); self::send_json( $result, 'spam_protection' ); } } public function undo_login_attempts() { $login = new OnecomCheckSpam(); $result = $login->undo_spam_protection(); $this->update_previous_scan( 'login_attempts', 1 ); $this->push_stats( 'revert', 'login_attempts' ); wp_send_json( $result ); } /** * @todo remove this unused function reset_failed_login */ public function reset_failed_login() { $login = new OnecomCheckLogin(); wp_send_json( $login->reset_failed_login_data() ); } public function login_recaptcha() { $login = new OnecomCheckLogin(); $result = $login->login_recaptcha(); $result['fix'] = true; $result['undo'] = true; $result['fix_text'] = __( 'Enable recaptcha', 'onecom-wp' ); $result['input_fields'] = array( array( 'name' => 'oc_hm_site_key', 'type' => 'text', 'label' => __( 'Site key', 'onecom-wp' ), ), array( 'name' => 'oc_hm_site_secret', 'type' => 'text', 'label' => __( 'Site secret', 'onecom-wp' ), ), ); $result['info_text'] = sprintf( __( 'You can obtain these values here', 'onecom-wp' ), 'https://www.google.com/recaptcha/admin/create' ); $result['html'] = $this->get_html( 'login_recaptcha', $result ); parent::save_result( 'login_recaptcha', $result['status'] ); self::send_json( $result, 'login_recaptcha' ); } public function undo_login_recaptcha() { $login = new OnecomCheckLogin(); $this->push_stats( 'revert', 'login_recaptcha' ); wp_send_json( $login->undo_login_recaptcha() ); } public function asset_minification() { $minification = new OnecomCheckAssetMinification(); $result = $minification->check_minification(); $result['html'] = $this->get_html( 'asset_minification', $result ); parent::save_result( 'asset_minification', $result['status'] ); self::send_json( $result, 'asset_minification' ); } public function error_reporting() { $err = new OnecomDebugMode(); $result = $err->check_error_reporting(); $result['html'] = $this->get_html( 'error_reporting', $result ); parent::save_result( 'error_reporting', $result['status'] ); self::send_json( $result, 'error_reporting' ); } public function debug_enabled() { $err = new OnecomDebugMode(); $result = $err->check_debug_enabled(); $result['html'] = $this->get_html( 'debug_enabled', $result ); parent::save_result( 'debug_enabled', $result['status'] ); self::send_json( $result, 'debug_enabled' ); } public function debug_log_size() { $err = new OnecomDebugMode(); $result = $err->check_debug_log_size(); $result['fix'] = true; $result['html'] = $this->get_html( 'debug_log_size', $result ); parent::save_result( 'debug_log_size', $result['status'] ); self::send_json( $result, 'debug_log_size' ); } public function user_enumeration() { $usr = new OnecomCheckUsername(); $result = $usr->check_user_enumeration(); $result['fix'] = true; $result['html'] = $this->get_html( 'user_enumeration', $result ); parent::save_result( 'user_enumeration', $result['status'] ); self::send_json( $result, 'user_enumeration' ); } public function optimize_uploaded_images() { $plugin = new OnecomCheckPlugins(); $result = $plugin->is_imagify_setup(); $result['fix'] = true; $result['html'] = $this->get_html( 'optimize_uploaded_images', $result ); parent::save_result( 'optimize_uploaded_images', $result['status'] ); self::send_json( $result, 'optimize_uploaded_images' ); } public function enable_cdn() { $plugins = new OnecomCheckPlugins(); $result = $plugins->check_cdn(); $result['fix'] = true; $result['undo'] = true; if ( isset( $result['activate_plugin'] ) && $result['activate_plugin'] ) { $result['fix_text'] = 'Activate Performance cache'; $result['fix_url'] = admin_url( 'plugins.php?plugin_status=inactive' ); } $result['html'] = $this->get_html( 'enable_cdn', $result ); parent::save_result( 'enable_cdn', $result['status'] ); self::send_json( $result, 'enable_cdn' ); } public function undo_enable_cdn() { $pc = new OnecomCheckPlugins(); $result = $pc->undo_check_performance_cdn(); $this->update_previous_scan( 'enable_cdn', 1 ); $this->push_stats( 'revert', 'enable_cdn' ); wp_send_json( $result ); } /** * @param $check * function to remove the check from ignored list * @return void */ public function remove_ignored_check( $check ) { $check = str_replace( array( 'ocsh_fix_', 'ocsh_fix_check_', 'check_' ), '', $check ); $marked_as_resolved = $this->ignored; if ( empty( $marked_as_resolved ) ) { $marked_as_resolved = array(); } if ( ( $key = array_search( $check, $marked_as_resolved ) ) !== false ) { unset( $marked_as_resolved[ $key ] ); } update_option( 'oc_marked_resolved', $marked_as_resolved, 'no' ); } }