is_demo_website( $website ) ) { return; } if ( 0 < preg_match( '/(.*)<\/mainwp>/', $data, $results ) ) { $result = $results[1]; $result_data = MainWP_System_Utility::get_child_response( base64_decode( $result ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode used for http encoding compatible. unset( $results ); if ( isset( $result_data['error'] ) ) { $output->errors[ $website->id ] = MainWP_Error_Helper::get_error_message( new MainWP_Exception( $result_data['error'], $website->url ) ); //phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped return; } $plugins = isset( $result_data['data'] ) && is_array( $result_data['data'] ) ? $result_data['data'] : array(); $not_found = true; foreach ( $plugins as $plugin ) { if ( ! isset( $plugin['name'] ) ) { continue; } $plugin['websiteid'] = $website->id; $plugin['websiteurl'] = $website->url; $plugin['websitename'] = $website->name; $output->plugins[] = $plugin; $not_found = false; } if ( 'not_installed' === $output->status && $not_found ) { $installed = isset( $result_data['installed_plugins'] ) && is_array( $result_data['installed_plugins'] ) ? $result_data['installed_plugins'] : array(); foreach ( $installed as $plugin ) { if ( ! isset( $plugin['name'] ) ) { continue; } $plugin['websiteid'] = $website->id; $plugin['websiteurl'] = $website->url; $plugin['websitename'] = $website->name; $output->plugins_installed[] = $plugin; } } if ( ! empty( $website->rollback_updates_data ) ) { $output->roll_items[ $website->id ] = MainWP_Updates_Helper::get_roll_update_plugintheme_items( 'plugin', $website->rollback_updates_data ); } unset( $plugins ); } else { $output->errors[ $website->id ] = MainWP_Error_Helper::get_error_message( new MainWP_Exception( 'NOMAINWP', $website->url ) ); } } /** Activate Plugin. */ public static function activate_plugins() { static::action( 'activate' ); } /** Deactivate Plugin */ public static function deactivate_plugins() { static::action( 'deactivate' ); } /** Delete Plugin. */ public static function delete_plugins() { static::action( 'delete' ); } /** * Ignore Plugin. * * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id() * @uses \MainWP\Dashboard\MainWP_DB::update_website_values() * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website() */ public static function ignore_updates() { // phpcs:disable WordPress.Security.NonceVerification $websiteId = isset( $_POST['websiteId'] ) ? intval( $_POST['websiteId'] ) : false; if ( empty( $websiteId ) ) { die( wp_json_encode( array( 'error' => esc_html__( 'Site ID not found. Please reload the page and try again.', 'mainwp' ) ) ) ); } $website = MainWP_DB::instance()->get_website_by_id( $websiteId ); if ( ! MainWP_System_Utility::can_edit_website( $website ) ) { die( wp_json_encode( array( 'error' => esc_html__( 'You are not allowed to edit this website.', 'mainwp' ) ) ) ); } $plugins = isset( $_POST['plugins'] ) ? wp_unslash( $_POST['plugins'] ) : false; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $names = isset( $_POST['names'] ) ? wp_unslash( $_POST['names'] ) : array(); //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized // phpcs:enable $decodedIgnoredPlugins = json_decode( $website->ignored_plugins, true ); if ( ! is_array( $decodedIgnoredPlugins ) ) { $decodedIgnoredPlugins = array(); } if ( is_array( $plugins ) ) { $_count = count( $plugins ); for ( $i = 0; $i < $_count; $i++ ) { $slug = $plugins[ $i ]; $name = $names[ $i ]; if ( ! isset( $decodedIgnoredPlugins[ $slug ] ) ) { $decodedIgnoredPlugins[ $slug ] = array( 'name' => urldecode( $name ) ); } } /** * Action: mainwp_before_plugin_ignore * * Fires before plugin ignore. * * @since 4.1 */ do_action( 'mainwp_before_plugin_ignore', $decodedIgnoredPlugins, $website ); MainWP_DB::instance()->update_website_values( $website->id, array( 'ignored_plugins' => wp_json_encode( $decodedIgnoredPlugins ) ) ); /** * Action: mainwp_after_plugin_ignore * * Fires after plugin ignore. * * @since 4.1 */ do_action( 'mainwp_after_plugin_ignore', $decodedIgnoredPlugins, $website ); } die( wp_json_encode( array( 'result' => true ) ) ); } /** * Plugin Action handler. * * @param mixed $pAction activate|deactivate|delete. * * @return mixed error|true * * @uses \MainWP\Dashboard\MainWP_Connect::fetch_url_authed() * @uses \MainWP\Dashboard\MainWP_Error_Helper::get_error_message() * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id() * @uses \MainWP\Dashboard\MainWP_Exception * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website() */ public static function action( $pAction ) { // phpcs:disable WordPress.Security.NonceVerification $websiteId = isset( $_POST['websiteId'] ) ? intval( $_POST['websiteId'] ) : false; if ( empty( $websiteId ) ) { die( wp_json_encode( array( 'error' => esc_html__( 'Site ID not found. Please reload the page and try again.', 'mainwp' ) ) ) ); } $website = MainWP_DB::instance()->get_website_by_id( $websiteId ); if ( ! MainWP_System_Utility::can_edit_website( $website ) ) { die( wp_json_encode( array( 'error' => esc_html__( 'You are not allowed to edit this website.', 'mainwp' ) ) ) ); } if ( MainWP_System_Utility::is_suspended_site( $website ) ) { die( wp_json_encode( array( 'error' => esc_html__( 'Suspended site.', 'mainwp' ), 'errorCode' => 'SUSPENDED_SITE', ) ) ); } try { $plugins = isset( $_POST['plugins'] ) ? wp_unslash( $_POST['plugins'] ) : array(); //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $plugin = implode( '||', $plugins ); $plugin = urldecode( $plugin ); /** * Action: mainwp_before_plugin_action * * Fires before plugin activate/deactivate/delete actions. * * @since 4.1 */ do_action( 'mainwp_before_plugin_action', $pAction, $plugin, $website ); $information = MainWP_Connect::fetch_url_authed( $website, 'plugin_action', array( 'action' => $pAction, 'plugin' => $plugin, ) ); /** * Action: mainwp_after_plugin_action * * Fires after plugin activate/deactivate/delete actions. * * @since 4.1 */ do_action( 'mainwp_after_plugin_action', $information, $pAction, $plugin, $website ); } catch ( MainWP_Exception $e ) { die( wp_json_encode( array( 'error' => MainWP_Error_Helper::get_error_message( $e ) ) ) ); } // phpcs:enable if ( ! isset( $information['status'] ) || ( 'SUCCESS' !== $information['status'] ) ) { die( wp_json_encode( array( 'error' => esc_html__( 'Unexpected error. Please try again.', 'mainwp' ) ) ) ); } die( wp_json_encode( array( 'result' => true ) ) ); } /** * Trust Plugin $_POST. * * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension() * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension() */ public static function trust_post() { // phpcs:ignore -- NOSONAR - complex. $userExtension = MainWP_DB_Common::instance()->get_user_extension(); $trustedPlugins = json_decode( $userExtension->trusted_plugins, true ); if ( ! is_array( $trustedPlugins ) ) { $trustedPlugins = array(); } // phpcs:disable WordPress.Security.NonceVerification $action = isset( $_POST['do'] ) ? sanitize_text_field( wp_unslash( $_POST['do'] ) ) : ''; $slugs = isset( $_POST['slugs'] ) && is_array( $_POST['slugs'] ) ? wp_unslash( $_POST['slugs'] ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized // phpcs:enable if ( ! is_array( $slugs ) ) { return; } if ( 'trust' !== $action && 'untrust' !== $action ) { return; } if ( 'trust' === $action ) { foreach ( $slugs as $slug ) { $idx = array_search( urldecode( $slug ), $trustedPlugins ); if ( false === $idx ) { $trustedPlugins[] = urldecode( $slug ); } } } elseif ( 'untrust' === $action ) { foreach ( $slugs as $slug ) { if ( in_array( urldecode( $slug ), $trustedPlugins ) ) { $trustedPlugins = array_diff( $trustedPlugins, array( urldecode( $slug ) ) ); } } } $userExtension->trusted_plugins = wp_json_encode( $trustedPlugins ); MainWP_DB_Common::instance()->update_user_extension( $userExtension ); } /** * Update Trusted Plugin list. * * @param mixed $slug Plugin Slug. * * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension() * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension() */ public static function trust_plugin( $slug ) { $userExtension = MainWP_DB_Common::instance()->get_user_extension(); $trustedPlugins = json_decode( $userExtension->trusted_plugins, true ); if ( ! is_array( $trustedPlugins ) ) { $trustedPlugins = array(); } $idx = array_search( urldecode( $slug ), $trustedPlugins ); if ( false === $idx ) { $trustedPlugins[] = urldecode( $slug ); } $userExtension->trusted_plugins = wp_json_encode( $trustedPlugins ); MainWP_DB_Common::instance()->update_user_extension( $userExtension ); } /** * Check if automatic daily updates is on and * the plugin is on the trusted list. * * @param mixed $slug Plugin Slug. * * @return boolean true|false. * * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension() * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension() */ public static function check_auto_update_plugin( $slug ) { if ( 1 !== (int) get_option( 'mainwp_pluginAutomaticDailyUpdate' ) ) { return false; } $userExtension = MainWP_DB_Common::instance()->get_user_extension(); $trustedPlugins = json_decode( $userExtension->trusted_plugins, true ); if ( is_array( $trustedPlugins ) && in_array( $slug, $trustedPlugins ) ) { return true; } return false; } /** * * Save the trusted plugin note. * * @return string Escaped note. */ public static function save_trusted_plugin_note() { // phpcs:disable WordPress.Security.NonceVerification $slug = isset( $_POST['slug'] ) ? urldecode( wp_unslash( $_POST['slug'] ) ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $note = isset( $_POST['note'] ) ? wp_unslash( $_POST['note'] ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized // phpcs:enable $esc_note = MainWP_Utility::esc_content( $note ); $userExtension = MainWP_DB_Common::instance()->get_user_extension(); $trustedPluginsNotes = json_decode( $userExtension->trusted_plugins_notes, true ); if ( ! is_array( $trustedPluginsNotes ) ) { $trustedPluginsNotes = array(); } $trustedPluginsNotes[ $slug ] = $esc_note; $userExtension->trusted_plugins_notes = wp_json_encode( $trustedPluginsNotes ); MainWP_DB_Common::instance()->update_user_extension( $userExtension ); return $esc_note; } }