update(); $this->load_all_options(); $this->plugin_dir = dirname( $plugin_file ); $this->plugin_slug = plugin_basename( $plugin_file ); add_action( 'template_redirect', array( $this, 'template_redirect' ) ); add_action( 'init', array( &$this, 'check_login' ), 1 ); add_action( 'init', array( &$this, 'parse_init' ), 9999 ); add_action( 'admin_menu', array( &$this, 'admin_menu' ) ); add_action( 'admin_init', array( &$this, 'admin_init' ) ); add_action( 'admin_head', array( &$this, 'admin_head' ) ); add_action( 'init', array( &$this, 'localization' ), 33 ); add_action( 'pre_current_active_plugins', array( MainWP_Child_Updates::get_instance(), 'detect_premium_themesplugins_updates' ) ); // to support detect premium plugins update. add_action( 'core_upgrade_preamble', array( MainWP_Child_Updates::get_instance(), 'detect_premium_themesplugins_updates' ) ); // to support detect premium themes. if ( is_admin() ) { MainWP_Helper::update_option( 'mainwp_child_plugin_version', self::$version, 'yes' ); } $this->check_other_auth(); MainWP_Clone::get()->init(); MainWP_Child_Server_Information::init(); MainWP_Client_Report::instance()->init(); MainWP_Child_Plugins_Check::instance(); MainWP_Child_Themes_Check::instance(); $this->run_saved_snippets(); if ( ! get_option( 'mainwp_child_pubkey' ) ) { MainWP_Child_Branding::instance()->save_branding_options( 'branding_disconnected', 'yes' ); } add_action( 'admin_notices', array( &$this, 'admin_notice' ) ); add_filter( 'plugin_row_meta', array( &$this, 'plugin_row_meta' ), 10, 2 ); if ( defined( 'DOING_CRON' ) && DOING_CRON ) { if ( isset( $_GET['mainwp_child_run'] ) && ! empty( $_GET['mainwp_child_run'] ) ) { add_action( 'init', array( $this, 'cron_active' ), PHP_INT_MAX ); } } } public function load_all_options() { global $wpdb; if ( ! defined( 'WP_INSTALLING' ) || ! is_multisite() ) { $alloptions = wp_cache_get( 'alloptions', 'options' ); } else { $alloptions = false; } if ( ! defined( 'WP_INSTALLING' ) || ! is_multisite() ) { $notoptions = wp_cache_get( 'notoptions', 'options' ); } else { $notoptions = false; } if ( ! isset( $alloptions['mainwp_db_version'] ) ) { $suppress = $wpdb->suppress_errors(); $options = array( 'mainwp_child_auth', 'mainwp_branding_plugin_header', 'mainwp_child_reports_db', 'mainwp_child_fix_htaccess', 'mainwp_child_pluginDir', 'mainwp_updraftplus_hide_plugin', 'mainwp_backwpup_ext_enabled', 'mainwpKeywordLinks', 'mainwp_child_server', 'mainwp_kwl_options', 'mainwp_kwl_keyword_links', 'mainwp_keyword_links_htaccess_set', 'mainwp_pagespeed_hide_plugin', 'mainwp_kwl_enable_statistic', 'mainwp_child_clone_permalink', 'mainwp_child_restore_permalink', 'mainwp_ext_snippets_enabled', 'mainwp_child_pubkey', 'mainwp_child_nossl', 'mainwp_security', 'mainwp_backupwordpress_ext_enabled', 'mainwp_branding_button_contact_label', 'mainwp_branding_extra_settings', 'mainwp_branding_child_hide', 'mainwp_branding_ext_enabled', 'mainwp_pagespeed_ext_enabled', 'mainwp_linkschecker_ext_enabled', 'mainwp_child_branding_settings', 'mainwp_child_plugintheme_days_outdate', ); $query = "SELECT option_name, option_value FROM $wpdb->options WHERE option_name in ("; foreach ( $options as $option ) { $query .= "'" . $option . "', "; } $query = substr( $query, 0, strlen( $query ) - 2 ); $query .= ")"; // phpcs:ignore $alloptions_db = $wpdb->get_results( $query ); // phpcs:ignore -- safe query $wpdb->suppress_errors( $suppress ); if ( ! is_array( $alloptions ) ) { $alloptions = array(); } if ( is_array( $alloptions_db ) ) { foreach ( (array) $alloptions_db as $o ) { $alloptions[ $o->option_name ] = $o->option_value; unset( $options[ array_search( $o->option_name, $options ) ] ); } foreach ( $options as $option ) { $notoptions[ $option ] = true; } if ( ! defined( 'WP_INSTALLING' ) || ! is_multisite() ) { wp_cache_set( 'alloptions', $alloptions, 'options' ); wp_cache_set( 'notoptions', $notoptions, 'options' ); } } } return $alloptions; } public function update() { $update_version = get_option( 'mainwp_child_update_version' ); if ( $update_version === $this->update_version ) { return; } if ( false === $update_version ) { $options = array( 'mainwp_child_legacy', 'mainwp_child_auth', 'mainwp_child_uniqueId', 'mainwp_child_htaccess_set', 'mainwp_child_fix_htaccess', 'mainwp_child_pubkey', 'mainwp_child_server', 'mainwp_child_nonce', 'mainwp_child_nossl', 'mainwp_child_nossl_key', 'mainwp_child_remove_wp_version', 'mainwp_child_remove_rsd', 'mainwp_child_remove_wlw', 'mainwp_child_remove_core_updates', 'mainwp_child_remove_plugin_updates', 'mainwp_child_remove_theme_updates', 'mainwp_child_remove_php_reporting', 'mainwp_child_remove_scripts_version', 'mainwp_child_remove_styles_version', 'mainwp_child_remove_readme', 'mainwp_child_clone_sites', 'mainwp_child_pluginDir', 'mainwp_premium_updates', 'mainwp_child_activated_once', 'mainwp_maintenance_opt_alert_404', 'mainwp_maintenance_opt_alert_404_email', 'mainwp_ext_code_snippets', 'mainwp_ext_snippets_enabled', 'mainwp_temp_clone_plugins', 'mainwp_temp_clone_themes', 'mainwp_child_click_data', 'mainwp_child_clone_from_server_last_folder', 'mainwp_child_clone_permalink', 'mainwp_child_restore_permalink', 'mainwp_keyword_links_htaccess_set', 'mainwp_kwl_options', 'mainwp_kwl_keyword_links', 'mainwp_kwl_click_statistic_data', 'mainwp_kwl_statistic_data_', 'mainwp_kwl_enable_statistic', 'mainwpKeywordLinks', ); foreach ( $options as $option ) { MainWP_Helper::fix_option( $option ); } } elseif ( ( '1.0' === $update_version ) || ( '1.1' === $update_version ) ) { $options = array( 'mainwp_child_pubkey', 'mainwp_child_update_version', 'mainwp_child_auth', 'mainwp_child_clone_permalink', 'mainwp_child_restore_permalink', 'mainwp_ext_snippets_enabled', 'mainwp_child_fix_htaccess', 'mainwp_child_pluginDir', 'mainwp_child_htaccess_set', 'mainwp_child_nossl', 'mainwp_updraftplus_ext_enabled', 'mainwpKeywordLinks', 'mainwp_keyword_links_htaccess_set', 'mainwp_pagespeed_ext_enabled', 'mainwp_linkschecker_ext_enabled', 'mainwp_maintenance_opt_alert_404', ); foreach ( $options as $option ) { MainWP_Helper::fix_option( $option, 'yes' ); } if ( ! is_array( get_option( 'mainwp_security' ) ) ) { $securityOptions = array( 'wp_version' => 'mainwp_child_remove_wp_version', 'rsd' => 'mainwp_child_remove_rsd', 'wlw' => 'mainwp_child_remove_wlw', 'core_updates' => 'mainwp_child_remove_core_updates', 'plugin_updates' => 'mainwp_child_remove_plugin_updates', 'theme_updates' => 'mainwp_child_remove_theme_updates', 'php_reporting' => 'mainwp_child_remove_php_reporting', 'scripts_version' => 'mainwp_child_remove_scripts_version', 'styles_version' => 'mainwp_child_remove_styles_version', 'readme' => 'mainwp_child_remove_readme', ); $security = array(); foreach ( $securityOptions as $option => $old ) { $value = get_option( $old ); $security[ $option ] = ( 'T' === $value ); } MainWP_Helper::update_option( 'mainwp_security', $security, 'yes' ); } } if ( ! empty( $update_version ) && version_compare( $update_version, '1.4', '<=' ) ) { if ( ! is_array( get_option( 'mainwp_child_branding_settings' ) ) ) { $brandingOptions = array( 'hide' => 'mainwp_branding_child_hide', 'extra_settings' => 'mainwp_branding_extra_settings', 'preserve_branding' => 'mainwp_branding_preserve_branding', 'branding_header' => 'mainwp_branding_plugin_header', 'support_email' => 'mainwp_branding_support_email', 'support_message' => 'mainwp_branding_support_message', 'remove_restore' => 'mainwp_branding_remove_restore', 'remove_setting' => 'mainwp_branding_remove_setting', 'remove_server_info' => 'mainwp_branding_remove_server_info', 'remove_connection_detail' => 'mainwp_branding_remove_connection_detail', 'remove_wp_tools' => 'mainwp_branding_remove_wp_tools', 'remove_wp_setting' => 'mainwp_branding_remove_wp_setting', 'remove_permalink' => 'mainwp_branding_remove_permalink', 'contact_label' => 'mainwp_branding_button_contact_label', 'email_message' => 'mainwp_branding_send_email_message', 'message_return_sender' => 'mainwp_branding_message_return_sender', 'submit_button_title' => 'mainwp_branding_submit_button_title', 'disable_wp_branding' => 'mainwp_branding_disable_wp_branding', 'show_support' => 'mainwp_branding_show_support', 'disable_change' => 'mainwp_branding_disable_change', 'disable_switching_theme' => 'mainwp_branding_disable_switching_theme', 'branding_ext_enabled' => 'mainwp_branding_ext_enabled', ); $convertBranding = array(); foreach ( $brandingOptions as $option => $old ) { $value = get_option( $old ); $convertBranding[ $option ] = $value; } MainWP_Helper::update_option( 'mainwp_child_branding_settings', $convertBranding ); } } MainWP_Helper::update_option( 'mainwp_child_update_version', $this->update_version, 'yes' ); } public function cron_active() { if ( ! defined( 'DOING_CRON' ) || ! DOING_CRON ) { return; } if ( empty( $_GET['mainwp_child_run'] ) || 'test' !== $_GET['mainwp_child_run'] ) { return; } session_write_close(); header( 'Content-Type: text/html; charset=' . get_bloginfo( 'charset' ), true ); header( 'X-Robots-Tag: noindex, nofollow', true ); header( 'X-MainWP-Child-Version: ' . self::$version, true ); nocache_headers(); if ( 'test' == $_GET['mainwp_child_run'] ) { die( 'MainWP Test' ); } die( '' ); } public function admin_notice() { // Admin Notice... if ( ! get_option( 'mainwp_child_pubkey' ) && MainWP_Helper::is_admin() && is_admin() ) { $branding_opts = MainWP_Child_Branding::instance()->get_branding_options(); $child_name = ( '' === $branding_opts['branding_preserve_title'] ) ? 'MainWP Child' : $branding_opts['branding_preserve_title']; $dashboard_name = ( '' === $branding_opts['branding_preserve_title'] ) ? 'MainWP Dashboard' : $branding_opts['branding_preserve_title'] . ' Dashboard'; $msg = '

'; $msg .= __( 'Attention!', 'mainwp-child' ); $msg .= '

'; $msg .= __( 'Please add this site to your ', 'mainwp-child' ) . $dashboard_name . ' ' . __( 'NOW or deactivate the ', 'mainwp-child' ) . $child_name . __( ' plugin until you are ready to connect this site to your Dashboard in order to avoid unexpected security issues.', 'mainwp-child' ); $msg .= '

'; $msg .= '

'; $msg .= __( 'If you are not sure how to add this site to your Dashboard, please review these instructions.', 'mainwp-child' ); $msg .= '

'; if ( ! MainWP_Child_Branding::instance()->is_branding() ) { $msg .= '

'; $msg .= __( 'You can also turn on the unique security ID option in ', 'mainwp-child' ) . $child_name . __( ' settings if you would like extra security and additional time to add this site to your Dashboard.
Find out more in this help document How do I use the child unique security ID?', 'mainwp-child' ); $msg .= '

'; } $msg .= '
'; echo wp_kses_post( $msg ); } MainWP_Child_Server_Information::show_warnings(); } public function localization() { load_plugin_textdomain( 'mainwp-child', false, dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/' ); } public function check_other_auth() { $auths = get_option( 'mainwp_child_auth' ); if ( ! $auths ) { $auths = array(); } if ( ! isset( $auths['last'] ) || $auths['last'] < mktime( 0, 0, 0, date( 'm' ), date( 'd' ), date( 'Y' ) ) ) { // phpcs:ignore -- local time. // Generate code for today. for ( $i = 0; $i < $this->maxHistory; $i ++ ) { if ( ! isset( $auths[ $i + 1 ] ) ) { continue; } $auths[ $i ] = $auths[ $i + 1 ]; } $newI = $this->maxHistory + 1; while ( isset( $auths[ $newI ] ) ) { unset( $auths[ $newI ++ ] ); } $auths[ $this->maxHistory ] = md5( MainWP_Helper::rand_string( 14 ) ); $auths['last'] = time(); MainWP_Helper::update_option( 'mainwp_child_auth', $auths, 'yes' ); } } public function is_valid_auth( $key ) { $auths = get_option( 'mainwp_child_auth' ); if ( ! $auths ) { return false; } for ( $i = 0; $i <= $this->maxHistory; $i ++ ) { if ( isset( $auths[ $i ] ) && ( $auths[ $i ] === $key ) ) { return true; } } return false; } public function template_redirect() { $this->maintenance_alert_404(); } public function plugin_row_meta( $plugin_meta, $plugin_file ) { if ( $this->plugin_slug !== $plugin_file ) { return $plugin_meta; } return apply_filters( 'mainwp_child_plugin_row_meta', $plugin_meta, $plugin_file, $this->plugin_slug ); } public function admin_menu() { $branding_opts = MainWP_Child_Branding::instance()->get_branding_options(); $is_hide = isset( $branding_opts['hide'] ) ? $branding_opts['hide'] : ''; $cancelled_branding = $branding_opts['cancelled_branding']; if ( isset( $branding_opts['remove_wp_tools'] ) && $branding_opts['remove_wp_tools'] && ! $cancelled_branding ) { remove_menu_page( 'tools.php' ); $pos = stripos( $_SERVER['REQUEST_URI'], 'tools.php' ) || stripos( $_SERVER['REQUEST_URI'], 'import.php' ) || stripos( $_SERVER['REQUEST_URI'], 'export.php' ); if ( false !== $pos ) { wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' ); } } // if preserve branding and do not remove menus. if ( isset( $branding_opts['remove_wp_setting'] ) && $branding_opts['remove_wp_setting'] && ! $cancelled_branding ) { remove_menu_page( 'options-general.php' ); $pos = stripos( $_SERVER['REQUEST_URI'], 'options-general.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-writing.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-reading.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-discussion.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-media.php' ) || stripos( $_SERVER['REQUEST_URI'], 'options-permalink.php' ); if ( false !== $pos ) { wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' ); exit(); } } if ( isset( $branding_opts['remove_permalink'] ) && $branding_opts['remove_permalink'] && ! $cancelled_branding ) { remove_submenu_page( 'options-general.php', 'options-permalink.php' ); $pos = stripos( $_SERVER['REQUEST_URI'], 'options-permalink.php' ); if ( false !== $pos ) { wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' ); exit(); } } $remove_all_child_menu = false; if ( isset( $branding_opts['remove_setting'] ) && isset( $branding_opts['remove_restore'] ) && isset( $branding_opts['remove_server_info'] ) && $branding_opts['remove_setting'] && $branding_opts['remove_restore'] && $branding_opts['remove_server_info'] ) { $remove_all_child_menu = true; } // if preserve branding and do not hide menus. if ( ( ! $remove_all_child_menu && 'T' !== $is_hide ) || $cancelled_branding ) { $branding_header = isset( $branding_opts['branding_header'] ) ? $branding_opts['branding_header'] : array(); if ( ( is_array( $branding_header ) && ! empty( $branding_header['name'] ) ) && ! $cancelled_branding ) { self::$brandingTitle = stripslashes( $branding_header['name'] ); $child_menu_title = stripslashes( $branding_header['name'] ); $child_page_title = $child_menu_title . ' Settings'; } else { $child_menu_title = 'MainWP Child'; $child_page_title = 'MainWPSettings'; } $settingsPage = add_submenu_page( 'options-general.php', $child_menu_title, $child_menu_title, 'manage_options', 'mainwp_child_tab', array( &$this, 'render_pages' ) ); add_action( 'admin_print_scripts-' . $settingsPage, array( MainWP_Clone::get_class_name(), 'print_scripts' ) ); $subpageargs = array( 'child_slug' => 'options-general.php', 'branding' => ( null === self::$brandingTitle ) ? 'MainWP' : self::$brandingTitle, 'parent_menu' => $settingsPage, ); do_action_deprecated( 'mainwp-child-subpages', array( $subpageargs ), '4.0.7.1', 'mainwp_child_subpages' ); do_action( 'mainwp_child_subpages', $subpageargs ); $sub_pages = array(); $all_subpages = apply_filters_deprecated( 'mainwp-child-init-subpages', array( array() ), '4.0.7.1', 'mainwp_child_init_subpages' ); $all_subpages = apply_filters( 'mainwp_child_init_subpages', $all_subpages ); if ( ! is_array( $all_subpages ) ) { $all_subpages = array(); } if ( ! self::$subPagesLoaded ) { foreach ( $all_subpages as $page ) { $slug = isset( $page['slug'] ) ? $page['slug'] : ''; if ( empty( $slug ) ) { continue; } $subpage = array(); $subpage['slug'] = $slug; $subpage['title'] = $page['title']; $subpage['page'] = 'mainwp-' . str_replace( ' ', '-', strtolower( str_replace( '-', ' ', $slug ) ) ); if ( isset( $page['callback'] ) ) { $subpage['callback'] = $page['callback']; $created_page = add_submenu_page( 'options-general.php', $subpage['title'], '
' . $subpage['title'] . '
', 'manage_options', $subpage['page'], $subpage['callback'] ); if ( isset( $page['load_callback'] ) ) { $subpage['load_callback'] = $page['load_callback']; add_action( 'load-' . $created_page, $subpage['load_callback'] ); } } $sub_pages[] = $subpage; } self::$subPages = $sub_pages; self::$subPagesLoaded = true; } add_action( 'mainwp-child-pageheader', array( __CLASS__, 'render_header' ) ); add_action( 'mainwp-child-pagefooter', array( __CLASS__, 'render_footer' ) ); global $submenu; if ( isset( $submenu['options-general.php'] ) ) { foreach ( $submenu['options-general.php'] as $index => $item ) { if ( 'mainwp-reports-page' === $item[2] || 'mainwp-reports-settings' === $item[2] ) { unset( $submenu['options-general.php'][ $index ] ); } } } } } public function render_pages( $shownPage ) { $shownPage = ''; if ( isset( $_GET['tab'] ) ) { $shownPage = $_GET['tab']; } $branding_opts = MainWP_Child_Branding::instance()->get_branding_options(); $hide_settings = isset( $branding_opts['remove_setting'] ) && $branding_opts['remove_setting'] ? true : false; $hide_restore = isset( $branding_opts['remove_restore'] ) && $branding_opts['remove_restore'] ? true : false; $hide_server_info = isset( $branding_opts['remove_server_info'] ) && $branding_opts['remove_server_info'] ? true : false; $hide_connection_detail = isset( $branding_opts['remove_connection_detail'] ) && $branding_opts['remove_connection_detail'] ? true : false; $hide_style = 'style="display:none"'; if ( '' == $shownPage ) { if ( ! $hide_settings ) { $shownPage = 'settings'; } elseif ( ! $hide_restore ) { $shownPage = 'restore-clone'; } elseif ( ! $hide_server_info ) { $shownPage = 'server-info'; } elseif ( ! $hide_connection_detail ) { $shownPage = 'connection-detail'; } } if ( ! $hide_restore ) { if ( '' === session_id() ) { session_start(); } } self::render_header( $shownPage, false ); ?>
> render_settings(); ?>
>
>
>
get_branding_options(); $hide_settings = isset( $branding_opts['remove_setting'] ) && $branding_opts['remove_setting'] ? true : false; $hide_restore = isset( $branding_opts['remove_restore'] ) && $branding_opts['remove_restore'] ? true : false; $hide_server_info = isset( $branding_opts['remove_server_info'] ) && $branding_opts['remove_server_info'] ? true : false; $hide_connection_detail = isset( $branding_opts['remove_connection_detail'] ) && $branding_opts['remove_connection_detail'] ? true : false; $sitesToClone = get_option( 'mainwp_child_clone_sites' ); ?>


init_ajax(); } } public function admin_head() { if ( isset( $_GET['page'] ) && 'mainwp_child_tab' == $_GET['page'] ) { ?>

/>
' . esc_html__( 'Your unique security ID is:', 'mainwp-child' ) . ' ' . esc_html( get_option( 'mainwp_child_uniqueId' ) ) . ''; } ?>

maxHistory; } public function mod_rewrite_rules( $pRules ) { $home_root = wp_parse_url( home_url() ); if ( isset( $home_root['path'] ) ) { $home_root = trailingslashit( $home_root['path'] ); } else { $home_root = '/'; } $rules = "\n"; $rules .= "RewriteEngine On\n"; $rules .= "RewriteBase $home_root\n"; // add in the rules that don't redirect to WP's index.php (and thus shouldn't be handled by WP at all). foreach ( $pRules as $match => $query ) { // Apache 1.3 does not support the reluctant (non-greedy) modifier. $match = str_replace( '.+?', '.+', $match ); $rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n"; } $rules .= "\n"; return $rules; } public function update_htaccess( $hard = false ) { if ( ! $hard && defined( 'DOING_CRON' ) && DOING_CRON ) { return; } if ( $hard ) { include_once ABSPATH . '/wp-admin/includes/misc.php'; $home_path = ABSPATH; $htaccess_file = $home_path . '.htaccess'; if ( function_exists( 'save_mod_rewrite_rules' ) ) { $rules = explode( "\n", '' ); insert_with_markers( $htaccess_file, 'MainWP', $rules ); } } } public function check_login() { if ( ! isset( $_POST['mainwpsignature'] ) || empty( $_POST['mainwpsignature'] ) ) { return false; } $file = ''; if ( isset( $_REQUEST['f'] ) ) { $file = $_REQUEST['f']; } elseif ( isset( $_REQUEST['file'] ) ) { $file = $_REQUEST['file']; } elseif ( isset( $_REQUEST['fdl'] ) ) { $file = $_REQUEST['fdl']; } $auth = $this->auth( isset( $_POST['mainwpsignature'] ) ? rawurldecode( $_POST['mainwpsignature'] ) : '', isset( $_POST['function'] ) ? $_POST['function'] : rawurldecode( ( isset( $_REQUEST['where'] ) ? $_REQUEST['where'] : $file ) ), isset( $_POST['nonce'] ) ? $_POST['nonce'] : '', isset( $_POST['nossl'] ) ? $_POST['nossl'] : 0 ); if ( ! $auth ) { MainWP_Helper::error( __( 'Authentication failed! Please deactivate and re-activate the MainWP Child plugin on this site.', 'mainwp-child' ) ); } $auth_user = false; if ( $auth ) { // disable duo auth for mainwp. remove_action( 'init', 'duo_verify_auth', 10 ); // Check if the user exists & is an administrator. if ( isset( $_POST['function'] ) && isset( $_POST['user'] ) ) { $user = null; if ( isset( $_POST['alt_user'] ) && ! empty( $_POST['alt_user'] ) ) { if ( $this->check_login_as( $_POST['alt_user'] ) ) { $auth_user = $_POST['alt_user']; $user = get_user_by( 'login', $auth_user ); } } // if not valid alternative admin. if ( ! $user ) { // check connected admin existed. $user = get_user_by( 'login', $_POST['user'] ); $auth_user = $_POST['user']; } if ( ! $user ) { MainWP_Helper::error( __( 'That administrator username was not found on this child site. Please verify that it is an existing administrator.', 'mainwp-child' ) ); } if ( 10 != $user->wp_user_level && ( ! isset( $user->user_level ) || 10 != $user->user_level ) && ! $user->has_cap( 'level_10' ) ) { MainWP_Helper::error( __( 'That user is not an administrator. Please use an administrator user to establish the connection.', 'mainwp-child' ) ); } $this->login( $auth_user ); } if ( isset( $_POST['function'] ) && 'visitPermalink' === $_POST['function'] ) { if ( empty( $auth_user ) ) { $auth_user = $_POST['user']; } if ( $this->login( $auth_user, true ) ) { return; } else { exit(); } } // Redirect to the admin part if needed. if ( isset( $_POST['admin'] ) && '1' === $_POST['admin'] ) { wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/' ); die(); } } } public function parse_init() { if ( isset( $_REQUEST['cloneFunc'] ) ) { if ( ! isset( $_REQUEST['key'] ) ) { return; } if ( ! isset( $_REQUEST['f'] ) || ( '' === $_REQUEST['f'] ) ) { return; } if ( ! $this->is_valid_auth( $_REQUEST['key'] ) ) { return; } if ( 'dl' === $_REQUEST['cloneFunc'] ) { $this->upload_file( $_REQUEST['f'] ); exit; } elseif ( 'deleteCloneBackup' === $_POST['cloneFunc'] ) { $dirs = MainWP_Helper::get_mainwp_dir( 'backup' ); $backupdir = $dirs[0]; $result = glob( $backupdir . $_POST['f'] ); if ( 0 === count( $result ) ) { return; } unlink( $result[0] ); mainwp_child_helper()->write( array( 'result' => 'ok' ) ); } elseif ( 'createCloneBackupPoll' === $_POST['cloneFunc'] ) { $dirs = MainWP_Helper::get_mainwp_dir( 'backup' ); $backupdir = $dirs[0]; $result = glob( $backupdir . 'backup-' . $_POST['f'] . '-*' ); $archiveFile = false; foreach ( $result as $file ) { if ( MainWP_Helper::is_archive( $file, 'backup-' . $_POST['f'] . '-' ) ) { $archiveFile = $file; break; } } if ( false === $archiveFile ) { return; } mainwp_child_helper()->write( array( 'size' => filesize( $archiveFile ) ) ); } elseif ( 'createCloneBackup' === $_POST['cloneFunc'] ) { MainWP_Helper::end_session(); $files = glob( WP_CONTENT_DIR . '/dbBackup*.sql' ); foreach ( $files as $file ) { unlink( $file ); } if ( file_exists( ABSPATH . 'clone/config.txt' ) ) { unlink( ABSPATH . 'clone/config.txt' ); } if ( MainWP_Helper::is_dir_empty( ABSPATH . 'clone' ) ) { rmdir( ABSPATH . 'clone' ); } $wpversion = $_POST['wpversion']; global $wp_version; $includeCoreFiles = ( $wpversion !== $wp_version ); $excludes = ( isset( $_POST['exclude'] ) ? explode( ',', $_POST['exclude'] ) : array() ); $excludes[] = str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '/uploads/mainwp'; $uploadDir = MainWP_Helper::get_mainwp_dir(); $uploadDir = $uploadDir[0]; $excludes[] = str_replace( ABSPATH, '', $uploadDir ); $excludes[] = str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '/object-cache.php'; if ( version_compare( phpversion(), '5.3.0' ) >= 0 || ! ini_get( 'safe_mode' ) ) { set_time_limit( 6000 ); } $newExcludes = array(); foreach ( $excludes as $exclude ) { $newExcludes[] = rtrim( $exclude, '/' ); } $method = ( ! isset( $_POST['zipmethod'] ) ? 'tar.gz' : $_POST['zipmethod'] ); if ( 'tar.gz' === $method && ! function_exists( 'gzopen' ) ) { $method = 'zip'; } $res = MainWP_Backup::get()->create_full_backup( $newExcludes, ( isset( $_POST['f'] ) ? $_POST['f'] : $_POST['file'] ), true, $includeCoreFiles, 0, false, false, false, false, $method ); if ( ! $res ) { $information['backup'] = false; } else { $information['backup'] = $res['file']; $information['size'] = $res['filesize']; } $plugins = array(); $dir = WP_CONTENT_DIR . '/plugins/'; $fh = opendir( $dir ); $entry = readdir( $fh ); while ( $entry ) { if ( ! is_dir( $dir . $entry ) ) { continue; } if ( ( '.' === $entry ) || ( '..' === $entry ) ) { continue; } $plugins[] = $entry; } closedir( $fh ); $information['plugins'] = $plugins; $themes = array(); $dir = WP_CONTENT_DIR . '/themes/'; $fh = opendir( $dir ); while ( $entry = readdir( $fh ) ) { if ( ! is_dir( $dir . $entry ) ) { continue; } if ( ( '.' === $entry ) || ( '..' === $entry ) ) { continue; } $themes[] = $entry; } closedir( $fh ); $information['themes'] = $themes; mainwp_child_helper()->write( $information ); } } global $wp_rewrite; $snPluginDir = basename( $this->plugin_dir ); if ( isset( $wp_rewrite->non_wp_rules[ 'wp-content/plugins/' . $snPluginDir . '/([^js\/]*)$' ] ) ) { unset( $wp_rewrite->non_wp_rules[ 'wp-content/plugins/' . $snPluginDir . '/([^js\/]*)$' ] ); } if ( isset( $wp_rewrite->non_wp_rules[ 'wp-content/plugins/' . $snPluginDir . '/(.*)$' ] ) ) { unset( $wp_rewrite->non_wp_rules[ 'wp-content/plugins/' . $snPluginDir . '/(.*)$' ] ); } if ( get_option( 'mainwp_child_fix_htaccess' ) === false ) { include_once ABSPATH . '/wp-admin/includes/misc.php'; $wp_rewrite->flush_rules(); MainWP_Helper::update_option( 'mainwp_child_fix_htaccess', 'yes', 'yes' ); } $this->update_htaccess(); global $current_user; if ( isset( $_REQUEST['login_required'] ) && ( '1' === $_REQUEST['login_required'] ) && isset( $_REQUEST['user'] ) ) { $alter_login_required = false; $username = rawurldecode( $_REQUEST['user'] ); if ( isset( $_REQUEST['alt_user'] ) && ! empty( $_REQUEST['alt_user'] ) ) { $alter_login_required = $this->check_login_as( $_REQUEST['alt_user'] ); if ( $alter_login_required ) { $username = rawurldecode( $_REQUEST['alt_user'] ); } } if ( is_user_logged_in() ) { global $current_user; if ( 10 !== $current_user->wp_user_level && ( ! isset( $current_user->user_level ) || 10 !== $current_user->user_level ) && ! current_user_can( 'level_10' ) ) { do_action( 'wp_logout' ); } } $signature = rawurldecode( isset( $_REQUEST['mainwpsignature'] ) ? $_REQUEST['mainwpsignature'] : '' ); $file = ''; if ( isset( $_REQUEST['f'] ) ) { $file = $_REQUEST['f']; } elseif ( isset( $_REQUEST['file'] ) ) { $file = $_REQUEST['file']; } elseif ( isset( $_REQUEST['fdl'] ) ) { $file = $_REQUEST['fdl']; } $auth = $this->auth( $signature, rawurldecode( ( isset( $_REQUEST['where'] ) ? $_REQUEST['where'] : $file ) ), isset( $_REQUEST['nonce'] ) ? $_REQUEST['nonce'] : '', isset( $_REQUEST['nossl'] ) ? $_REQUEST['nossl'] : 0 ); if ( ! $auth ) { return; } if ( ! is_user_logged_in() || $username !== $current_user->user_login ) { if ( ! $this->login( $username ) ) { return; } global $current_user; if ( 10 !== $current_user->wp_user_level && ( ! isset( $current_user->user_level ) || 10 !== $current_user->user_level ) && ! current_user_can( 'level_10' ) ) { // if is not alternative admin login. // it is connected admin login. if ( ! $alter_login_required ) { // log out if connected admin is not admin level 10. do_action( 'wp_logout' ); return; } } } if ( isset( $_REQUEST['fdl'] ) ) { if ( stristr( $_REQUEST['fdl'], '..' ) ) { return; } $this->upload_file( $_REQUEST['fdl'], isset( $_REQUEST['foffset'] ) ? $_REQUEST['foffset'] : 0 ); exit; } $where = isset( $_REQUEST['where'] ) ? $_REQUEST['where'] : ''; if ( isset( $_POST['f'] ) || isset( $_POST['file'] ) ) { $file = ''; if ( isset( $_POST['f'] ) ) { $file = $_POST['f']; } elseif ( isset( $_POST['file'] ) ) { $file = $_POST['file']; } $where = 'admin.php?page=mainwp_child_tab&tab=restore-clone'; if ( '' === session_id() ) { session_start(); } $_SESSION['file'] = $file; $_SESSION['size'] = $_POST['size']; } // to support open not wp-admin url. $open_location = isset( $_REQUEST['open_location'] ) ? $_REQUEST['open_location'] : ''; if ( ! empty( $open_location ) ) { $open_location = base64_decode( $open_location ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. $_vars = MainWP_Helper::parse_query( $open_location ); $_path = wp_parse_url( $open_location, PHP_URL_PATH ); if ( isset( $_vars['_mwpNoneName'] ) && isset( $_vars['_mwpNoneValue'] ) ) { $_vars[ $_vars['_mwpNoneName'] ] = wp_create_nonce( $_vars['_mwpNoneValue'] ); unset( $_vars['_mwpNoneName'] ); unset( $_vars['_mwpNoneValue'] ); $open_url = ''; foreach ( $_vars as $key => $value ) { $open_url .= $key . '=' . $value . '&'; } $open_url = rtrim( $open_url, '&' ); $open_location = '/wp-admin/' . $_path . '?' . $open_url; } else { if ( strpos( $open_location, 'nonce=child_temp_nonce' ) !== false ) { $open_location = str_replace( 'nonce=child_temp_nonce', 'nonce=' . wp_create_nonce( 'wp-ajax' ), $open_location ); } } wp_safe_redirect( site_url() . $open_location ); exit(); } wp_safe_redirect( admin_url( $where ) ); exit(); } /** * Security */ MainWP_Security::fix_all(); MainWP_Debug::process( $this ); // Register does not require auth, so we register here. if ( isset( $_POST['function'] ) && 'register' === $_POST['function'] ) { define( 'DOING_CRON', true ); self::fix_for_custom_themes(); $this->register_site(); } $auth = $this->auth( isset( $_POST['mainwpsignature'] ) ? $_POST['mainwpsignature'] : '', isset( $_POST['function'] ) ? $_POST['function'] : '', isset( $_POST['nonce'] ) ? $_POST['nonce'] : '', isset( $_POST['nossl'] ) ? $_POST['nossl'] : 0 ); if ( ! $auth && isset( $_POST['mainwpsignature'] ) ) { MainWP_Helper::error( __( 'Authentication failed! Please deactivate & re-activate the MainWP Child plugin on this site and try again.', 'mainwp-child' ) ); } if ( ! $auth && isset( $_POST['function'] ) ) { $func = $_POST['function']; $callable = MainWP_Child_Callable::get_instance()->is_callable_function( $func ); $callable_no_auth = MainWP_Child_Callable::get_instance()->is_callable_function_no_auth( $func ); if ( $callable && ! $callable_no_auth ) { MainWP_Helper::error( __( 'Authentication failed! Please deactivate & re-activate the MainWP Child plugin on this site and try again.', 'mainwp-child' ) ); } } $auth_user = false; if ( $auth ) { // Check if the user exists & is an administrator. if ( isset( $_POST['function'] ) && isset( $_POST['user'] ) ) { $user = null; if ( isset( $_POST['alt_user'] ) && ! empty( $_POST['alt_user'] ) ) { if ( $this->check_login_as( $_POST['alt_user'] ) ) { $auth_user = $_POST['alt_user']; $user = get_user_by( 'login', $auth_user ); } } // if alternative admin not existed. if ( ! $user ) { // check connected admin existed. $user = get_user_by( 'login', $_POST['user'] ); $auth_user = $_POST['user']; } if ( ! $user ) { MainWP_Helper::error( __( 'Unexising administrator username. Please verify that it is an existing administrator.', 'mainwp-child' ) ); } if ( 10 != $user->wp_user_level && ( ! isset( $user->user_level ) || 10 != $user->user_level ) && ! $user->has_cap( 'level_10' ) ) { MainWP_Helper::error( __( 'Invalid user. Please verify that the user has administrator privileges.', 'mainwp-child' ) ); } $this->login( $auth_user ); } if ( isset( $_POST['function'] ) && 'visitPermalink' === $_POST['function'] ) { if ( empty( $auth_user ) ) { $auth_user = $_POST['user']; } if ( $this->login( $auth_user, true ) ) { return; } else { exit(); } } // Redirect to the admin part if needed. if ( isset( $_POST['admin'] ) && '1' === $_POST['admin'] ) { wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/' ); die(); } } // Init extensions. // Handle fatal errors for those init if needed. \MainWP_Child_IThemes_Security::instance()->ithemes_init(); \MainWP_Child_Updraft_Plus_Backups::instance()->updraftplus_init(); \MainWP_Child_Back_Up_WordPress::instance()->init(); \MainWP_Child_WP_Rocket::instance()->init(); \MainWP_Child_Back_WP_Up::instance()->init(); \MainWP_Child_Back_Up_Buddy::instance(); \MainWP_Child_Wordfence::instance()->wordfence_init(); \MainWP_Child_Timecapsule::instance()->init(); MainWP_Child_Staging::instance()->init(); MainWP_Child_Branding::instance()->branding_init(); MainWP_Client_Report::instance()->creport_init(); \MainWP_Child_Pagespeed::instance()->init(); \MainWP_Child_Links_Checker::instance()->init(); \MainWP_Child_WPvivid_BackupRestore::instance()->init(); global $_wp_submenu_nopriv; if ( null === $_wp_submenu_nopriv ) { $_wp_submenu_nopriv = array(); // phpcs:ignore -- to fix warning. } $callable = false; $func_auth = false; $callable_no_auth = false; $func_no_auth = false; if ( isset( $_POST['function'] ) ) { $func = $_POST['function']; $callable = MainWP_Child_Callable::get_instance()->is_callable_function( $func ); if ( $callable ) { $func_auth = $func; } if ( ! $callable ) { $callable_no_auth = MainWP_Child_Callable::get_instance()->is_callable_function_no_auth( $func ); if ( $callable_no_auth ) { $func_no_auth = $func; } } } // Call the function required. if ( $auth && isset( $_POST['function'] ) && $callable ) { define( 'DOING_CRON', true ); MainWP_Helper::handle_fatal_error(); self::fix_for_custom_themes(); MainWP_Child_Callable::get_instance()->call_function( $func_auth ); } elseif ( isset( $_POST['function'] ) && $callable_no_auth ) { define( 'DOING_CRON', true ); self::fix_for_custom_themes(); MainWP_Child_Callable::get_instance()->call_function_no_auth( $func_no_auth ); } elseif ( isset( $_POST['function'] ) && isset( $_POST['mainwpsignature'] ) && ! $callable && ! $callable_no_auth ) { MainWP_Helper::error( __( 'Required version has not been detected. Please, make sure that you are using the latest version of the MainWP Child plugin on your site.', 'mainwp-child' ) ); } if ( 1 === (int) get_option( 'mainwpKeywordLinks' ) ) { new MainWP_Keyword_Links(); if ( ! is_admin() ) { add_filter( 'the_content', array( MainWP_Keyword_Links::instance(), 'filter_content' ), 100 ); } MainWP_Keyword_Links::instance()->update_htaccess(); MainWP_Keyword_Links::instance()->redirect_cloak(); } elseif ( 'yes' === get_option( 'mainwp_keyword_links_htaccess_set' ) ) { MainWP_Keyword_Links::clear_htaccess(); } } // Check to support login by alternative admin. // return false will login by connected admin user. // return true will try to login as alternative user. public function check_login_as( $alter_login ) { if ( ! empty( $alter_login ) ) { // check alternative admin existed. $user = get_user_by( 'login', $alter_login ); if ( ! $user ) { // That administrator username was not found on this child site. return false; } if ( 10 != $user->wp_user_level && ( ! isset( $user->user_level ) || 10 != $user->user_level ) && ! $user->has_cap( 'level_10' ) ) { // That user is not an administrator. return false; } return true; // ok, will try to login by alternative user. } return false; } public function auth( $signature, $func, $nonce, $pNossl ) { if ( empty( $signature ) || ! isset( $func ) || ( ! get_option( 'mainwp_child_pubkey' ) && ! get_option( 'mainwp_child_nossl_key' ) ) ) { $auth = false; } else { $nossl = get_option( 'mainwp_child_nossl' ); $serverNoSsl = ( isset( $pNossl ) && 1 === (int) $pNossl ); if ( ( 1 === (int) $nossl ) || $serverNoSsl ) { $nossl_key = get_option( 'mainwp_child_nossl_key' ); $auth = hash_equals( md5( $func . $nonce . $nossl_key ), base64_decode( $signature ) ); // // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. } else { $auth = openssl_verify( $func . $nonce, base64_decode( $signature ), base64_decode( get_option( 'mainwp_child_pubkey' ) ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. if ( 1 !== $auth ) { $auth = false; } } } return $auth; } // Login. public function login( $username, $doAction = false ) { global $current_user; // Logout if required. if ( isset( $current_user->user_login ) ) { if ( $current_user->user_login === $username ) { // to fix issue multi user session. $user_id = wp_validate_auth_cookie(); if ( $user_id && $user_id === $current_user->ID ) { return true; } wp_set_auth_cookie( $current_user->ID ); return true; } do_action( 'wp_logout' ); } $user = get_user_by( 'login', $username ); if ( $user ) { wp_set_current_user( $user->ID ); wp_set_auth_cookie( $user->ID ); if ( $doAction ) { do_action( 'wp_login', $user->user_login ); } return ( is_user_logged_in() && $current_user->user_login === $username ); } return false; } // This will register the current wp - thus generating the public key etc. public function register_site() { global $current_user; $information = array(); // Check if the user is valid & login. if ( ! isset( $_POST['user'] ) || ! isset( $_POST['pubkey'] ) ) { MainWP_Helper::error( __( 'Invalid request!', 'mainwp-child' ) ); } // Already added - can't readd. Deactivate plugin. if ( get_option( 'mainwp_child_pubkey' ) ) { // set disconnect status to yes here, it will empty after reconnected. MainWP_Child_Branding::instance()->save_branding_options( 'branding_disconnected', 'yes' ); MainWP_Helper::error( __( 'Public key already set. Please deactivate & reactivate the MainWP Child plugin and try again.', 'mainwp-child' ) ); } if ( '' != get_option( 'mainwp_child_uniqueId' ) ) { if ( ! isset( $_POST['uniqueId'] ) || ( '' === $_POST['uniqueId'] ) ) { MainWP_Helper::error( __( 'This child site is set to require a unique security ID. Please enter it before the connection can be established.', 'mainwp-child' ) ); } elseif ( get_option( 'mainwp_child_uniqueId' ) !== $_POST['uniqueId'] ) { MainWP_Helper::error( __( 'The unique security ID mismatch! Please correct it before the connection can be established.', 'mainwp-child' ) ); } } // Check SSL Requirement. if ( ! MainWP_Helper::is_ssl_enabled() && ( ! defined( 'MAINWP_ALLOW_NOSSL_CONNECT' ) || ! MAINWP_ALLOW_NOSSL_CONNECT ) ) { MainWP_Helper::error( __( 'SSL is required on the child site to set up a secure connection.', 'mainwp-child' ) ); } // Login. if ( isset( $_POST['user'] ) ) { if ( ! $this->login( $_POST['user'] ) ) { $hint_miss_user = __( 'That administrator username was not found on this child site. Please verify that it is an existing administrator.', 'mainwp-child' ) . '
' . __( 'Hint: Check if the administrator user exists on the child site, if not, you need to use an existing administrator.', 'mainwp-child' ); MainWP_Helper::error( $hint_miss_user ); } if ( 10 !== $current_user->wp_user_level && ( ! isset( $current_user->user_level ) || 10 !== $current_user->user_level ) && ! $current_user->has_cap( 'level_10' ) ) { MainWP_Helper::error( __( 'That user is not an administrator. Please use an administrator user to establish the connection.', 'mainwp-child' ) ); } } MainWP_Helper::update_option( 'mainwp_child_pubkey', base64_encode( $_POST['pubkey'] ), 'yes' ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions -- base64_encode function is used for begin reasons. MainWP_Helper::update_option( 'mainwp_child_server', $_POST['server'] ); // Save the public key. MainWP_Helper::update_option( 'mainwp_child_nonce', 0 ); // Save the nonce. MainWP_Helper::update_option( 'mainwp_child_nossl', ( '-1' === $_POST['pubkey'] || ! MainWP_Helper::is_ssl_enabled() ? 1 : 0 ), 'yes' ); $information['nossl'] = ( '-1' === $_POST['pubkey'] || ! MainWP_Helper::is_ssl_enabled() ? 1 : 0 ); if ( function_exists( 'random_bytes' ) ) { $nossl_key = random_bytes( 32 ); $nossl_key = bin2hex( $nossl_key ); } else { $nossl_key = uniqid( '', true ); } MainWP_Helper::update_option( 'mainwp_child_nossl_key', $nossl_key, 'yes' ); $information['nosslkey'] = $nossl_key; $information['register'] = 'OK'; $information['uniqueId'] = get_option( 'mainwp_child_uniqueId', '' ); $information['user'] = $_POST['user']; MainWP_Child_Stats::get_instance()->get_site_stats( $information ); } public function maintenance_alert_404() { if ( ! is_404() ) { return; } if ( 1 !== (int) get_option( 'mainwp_maintenance_opt_alert_404' ) ) { return; } $email = get_option( 'mainwp_maintenance_opt_alert_404_email' ); if ( empty( $email ) || ! preg_match( '/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/is', $email ) ) { return; } // set status. header( 'HTTP/1.1 404 Not Found' ); header( 'Status: 404 Not Found' ); // site info. $blog = get_bloginfo( 'name' ); $site = get_bloginfo( 'url' ) . '/'; $from_email = get_bloginfo( 'admin_email' ); // referrer. if ( isset( $_SERVER['HTTP_REFERER'] ) ) { $referer = MainWP_Helper::clean( $_SERVER['HTTP_REFERER'] ); } else { $referer = 'undefined'; } $protocol = isset( $_SERVER['HTTPS'] ) && strcasecmp( $_SERVER['HTTPS'], 'off' ) ? 'https://' : 'http://'; // request URI. if ( isset( $_SERVER['REQUEST_URI'] ) && isset( $_SERVER['HTTP_HOST'] ) ) { $request = MainWP_Helper::clean( $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ); } else { $request = 'undefined'; } // query string. if ( isset( $_SERVER['QUERY_STRING'] ) ) { $string = MainWP_Helper::clean( $_SERVER['QUERY_STRING'] ); } else { $string = 'undefined'; } // IP address. if ( isset( $_SERVER['REMOTE_ADDR'] ) ) { $address = MainWP_Helper::clean( $_SERVER['REMOTE_ADDR'] ); } else { $address = 'undefined'; } // user agent. if ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) { $agent = MainWP_Helper::clean( $_SERVER['HTTP_USER_AGENT'] ); } else { $agent = 'undefined'; } // identity. if ( isset( $_SERVER['REMOTE_IDENT'] ) ) { $remote = MainWP_Helper::clean( $_SERVER['REMOTE_IDENT'] ); } else { $remote = 'undefined'; } // log time. $time = MainWP_Helper::clean( date( 'F jS Y, h:ia', time() ) ); // phpcs:ignore -- local time. $mail = '
404 alert
' . '
TIME: ' . $time . '
' . '
*404: ' . $request . '
' . '
SITE: ' . $site . '
' . '
REFERRER: ' . $referer . '
' . '
QUERY STRING: ' . $string . '
' . '
REMOTE ADDRESS: ' . $address . '
' . '
REMOTE IDENTITY: ' . $remote . '
' . '
USER AGENT: ' . $agent . '
'; wp_mail( $email, 'MainWP - 404 Alert: ' . $blog, MainWP_Helper::format_email( $email, $mail ), array( 'content-type: text/html', ) ); } public function upload_file( $file, $offset = 0 ) { $dirs = MainWP_Helper::get_mainwp_dir( 'backup' ); $backupdir = $dirs[0]; header( 'Content-Description: File Transfer' ); header( 'Content-Description: File Transfer' ); if ( MainWP_Helper::ends_with( $file, '.tar.gz' ) ) { header( 'Content-Type: application/x-gzip' ); header( 'Content-Encoding: gzip' ); } else { header( 'Content-Type: application/octet-stream' ); } header( 'Content-Disposition: attachment; filename="' . basename( $file ) . '"' ); header( 'Expires: 0' ); header( 'Cache-Control: must-revalidate' ); header( 'Pragma: public' ); header( 'Content-Length: ' . filesize( $backupdir . $file ) ); while ( ob_end_flush() ) {; // phpcs:ignore } $this->readfile_chunked( $backupdir . $file, $offset ); } public function readfile_chunked( $filename, $offset ) { $chunksize = 1024; // how many bytes per chunk? $handle = fopen( $filename, 'rb' ); if ( false === $handle ) { return false; } fseek( $handle, $offset ); while ( ! feof( $handle ) ) { $buffer = fread( $handle, $chunksize ); echo $buffer; ob_flush(); flush(); $buffer = null; } return fclose( $handle ); } public function run_saved_snippets() { $action = null; if ( isset( $_POST['action'] ) ) { $action = $_POST['action']; } if ( 'run_snippet' === $action || 'save_snippet' === $action || 'delete_snippet' === $action ) { return; } // do not run saved snippets if in do action snippet if ( get_option( 'mainwp_ext_snippets_enabled' ) ) { $snippets = get_option( 'mainwp_ext_code_snippets' ); if ( is_array( $snippets ) && count( $snippets ) > 0 ) { foreach ( $snippets as $code ) { MainWP_Helper::execute_snippet( $code ); } } } } /* * hook to deactivation child plugin action */ public function deactivation( $deact = true ) { $mu_plugin_enabled = apply_filters( 'mainwp_child_mu_plugin_enabled', false ); if ( $mu_plugin_enabled ) { return; } $to_delete = array( 'mainwp_child_pubkey', 'mainwp_child_nonce', 'mainwp_child_nossl', 'mainwp_child_nossl_key', 'mainwp_security', 'mainwp_child_server', ); $to_delete[] = 'mainwp_ext_snippets_enabled'; $to_delete[] = 'mainwp_ext_code_snippets'; foreach ( $to_delete as $delete ) { if ( get_option( $delete ) ) { delete_option( $delete ); wp_cache_delete( $delete, 'options' ); } } if ( $deact ) { do_action( 'mainwp_child_deactivation' ); } } /* * hook to activation child plugin action */ public function activation() { $mu_plugin_enabled = apply_filters( 'mainwp_child_mu_plugin_enabled', false ); if ( $mu_plugin_enabled ) { return; } $to_delete = array( 'mainwp_child_pubkey', 'mainwp_child_nonce', 'mainwp_child_nossl', 'mainwp_child_nossl_key', ); foreach ( $to_delete as $delete ) { if ( get_option( $delete ) ) { delete_option( $delete ); } } MainWP_Helper::update_option( 'mainwp_child_activated_once', true ); // delete bad data if existed. $to_delete = array( 'mainwp_ext_snippets_enabled', 'mainwp_ext_code_snippets' ); foreach ( $to_delete as $delete ) { delete_option( $delete ); } } public static function fix_for_custom_themes() { if ( file_exists( ABSPATH . '/wp-admin/includes/screen.php' ) ) { include_once ABSPATH . '/wp-admin/includes/screen.php'; } if ( function_exists( 'et_register_updates_component' ) ) { et_register_updates_component(); } } }