diff --git a/.gitignore b/.gitignore
index 51a7bdd..bea9a88 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@
.idea/vcs.xml
.idea/dictionaries/keith.xml
.idea/dictionaries/keith.xml
+.idea/inspectionProfiles/Project_Default.xml
diff --git a/class/class-mainwp-child-back-wp-up.php b/class/class-mainwp-child-back-wp-up.php
index 17cb023..246b4a4 100644
--- a/class/class-mainwp-child-back-wp-up.php
+++ b/class/class-mainwp-child-back-wp-up.php
@@ -1,5 +1,9 @@
array(
- 'cronminutes',
- 'cronhours',
- 'cronmday',
- 'cronmon',
- 'cronwday',
- 'moncronminutes',
- 'moncronhours',
- 'moncronmday',
- 'weekcronminutes',
- 'weekcronhours',
- 'weekcronwday',
- 'daycronminutes',
- 'daycronhours',
- 'hourcronminutes',
- 'cronbtype',
- ),
- 'dest-EMAIL' => array( 'emailpass' ),
- 'dest-DBDUMP' => array( 'dbdumpspecialsetalltables' ),
- 'dest-FTP' => array( 'ftppass' ),
- 'dest-S3' => array( 's3secretkey' ),
- 'dest-MSAZURE' => array( 'msazurekey' ),
- 'dest-SUGARSYNC' => array( 'sugaremail', 'sugarpass', 'sugarrefreshtoken' ),
- 'dest-GDRIVE' => array( 'gdriverefreshtoken' ),
- 'dest-RSC' => array( 'rscapikey' ),
- 'dest-GLACIER' => array( 'glaciersecretkey' ),
- );
-
- public static function instance() {
- if ( null == self::$instance ) {
- self::$instance = new self();
- }
-
- return self::$instance;
- }
-
- public function __construct() {
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
-
- try {
-
- if ( is_plugin_active( 'backwpup-pro/backwpup.php' ) && file_exists( plugin_dir_path( __FILE__ ) . '../../backwpup-pro/backwpup.php' ) ) {
- $file_path1 = plugin_dir_path( __FILE__ ) . '../../backwpup-pro/backwpup.php';
- $file_path2 = plugin_dir_path( __FILE__ ) . '../../backwpup-pro/inc/Pro/class-pro.php';
-
- if ( ! file_exists( $file_path2 ) ) {
- $file_path2 = plugin_dir_path( __FILE__ ) . '../../backwpup-pro/inc/pro/class-pro.php';
- }
-
- MainWP_Helper::check_files_exists( array( $file_path1, $file_path2 ) );
- require_once $file_path1;
- require_once $file_path2;
- $this->is_backwpup_installed = true;
- $this->is_backwpup_pro = true;
- } elseif ( is_plugin_active( 'backwpup/backwpup.php' ) && file_exists( plugin_dir_path( __FILE__ ) . '../../backwpup/backwpup.php' ) ) {
- $file_path = plugin_dir_path( __FILE__ ) . '../../backwpup/backwpup.php';
- MainWP_Helper::check_files_exists( array( $file_path ) );
- require_once $file_path;
- $this->is_backwpup_installed = true;
- }
-
- if ( $this->is_backwpup_installed ) {
- MainWP_Helper::check_classes_exists( '\BackWPup' );
- MainWP_Helper::check_methods( 'get_instance' );
- \BackWPup::get_instance();
-
- add_action( 'admin_init', array( $this, 'init_download_backup' ) );
- add_filter( 'mainwp_site_sync_others_data', array( $this, 'sync_others_data' ), 10, 2 );
- }
- } catch ( \Exception $e ) {
- $this->is_backwpup_installed = false;
- }
- }
-
- function mainwp_backwpup_handle_fatal_error() {
- $error = error_get_last();
- $info = self::$information;
- if ( isset( $error['type'] ) && E_ERROR === $error['type'] && isset( $error['message'] ) ) {
- MainWP_Helper::write( array( 'error' => 'MainWP_Child fatal error : ' . $error['message'] . ' Line: ' . $error['line'] . ' File: ' . $error['file'] ) );
- } elseif ( ! empty( $info ) ) {
- MainWP_Helper::write( self::$information );
- } else {
- MainWP_Helper::write( array( 'error' => 'Missing information array inside fatal_error' ) );
- }
- }
-
- public function action() {
- if ( ! $this->is_backwpup_installed ) {
- MainWP_Helper::write( array( 'error' => __( 'Please install BackWPup plugin on child website', 'mainwp-child' ) ) );
- return;
- }
- register_shutdown_function( 'self::mainwp_backwpup_handle_fatal_error' );
-
- $information = array();
-
- if ( ! isset( $_POST['action'] ) ) {
- $information = array( 'error' => __( 'Missing action.', 'mainwp-child' ) );
- } else {
-
- switch ( $_POST['action'] ) {
- case 'backwpup_update_settings':
- $information = $this->update_settings();
- break;
-
- case 'backwpup_insert_or_update_jobs':
- $information = $this->insert_or_update_jobs();
- break;
-
- case 'backwpup_insert_or_update_jobs_global':
- $information = $this->insert_or_update_jobs_global();
- break;
-
- case 'backwpup_get_child_tables':
- $information = $this->get_child_tables();
- break;
-
- case 'backwpup_get_job_files':
- $information = $this->get_job_files();
- break;
-
- case 'backwpup_destination_email_check_email':
- $information = $this->destination_email_check_email();
- break;
-
- case 'backwpup_backup_now':
- $information = $this->backup_now();
- break;
-
- case 'backwpup_ajax_working':
- $information = $this->ajax_working();
- break;
-
- case 'backwpup_backup_abort':
- $information = $this->backup_abort();
- break;
-
- case 'backwpup_tables':
- $information = $this->tables();
- break;
-
- case 'backwpup_view_log':
- $information = $this->view_log();
- break;
-
- case 'backwpup_delete_log':
- $information = $this->delete_log();
- break;
-
- case 'backwpup_delete_job':
- $information = $this->delete_job();
- break;
-
- case 'backwpup_delete_backup':
- $information = $this->delete_backup();
- break;
-
- case 'backwpup_information':
- $information = $this->information();
- break;
-
- case 'backwpup_wizard_system_scan':
- $information = $this->wizard_system_scan();
- break;
-
- case 'backwpup_is_pro':
- $information = array( 'is_pro' => $this->is_backwpup_pro );
- break;
-
- case 'backwpup_show_hide':
- $information = $this->show_hide();
- break;
-
- default:
- $information = array( 'error' => __( 'Wrong action.', 'mainwp-child' ) );
- }
- }
-
- self::$information = $information;
- exit();
- }
-
- public function init() {
-
- if ( ! $this->is_backwpup_installed ) {
- return;
- }
-
- add_action( 'mainwp_child_site_stats', array( $this, 'do_site_stats' ) );
-
- if ( get_option( 'mainwp_backwpup_hide_plugin' ) === 'hide' ) {
- add_filter( 'all_plugins', array( $this, 'all_plugins' ) );
- add_action( 'admin_menu', array( $this, 'remove_menu' ) );
- }
- }
-
- public function do_site_stats() {
- if ( has_action( 'mainwp_child_reports_log' ) ) {
- do_action( 'mainwp_child_reports_log', 'backwpup' );
- } else {
- $this->do_reports_log( 'backwpup' );
- }
- }
-
- public function do_reports_log( $ext = '' ) {
- if ( 'backwpup' !== $ext ) {
- return;
- }
- if ( ! $this->is_backwpup_installed ) {
- return;
- }
-
- try {
-
- MainWP_Helper::check_classes_exists( array( '\BackWPup_File', '\BackWPup_Job' ) );
- MainWP_Helper::check_methods( '\BackWPup_File', array( 'get_absolute_path' ) );
- MainWP_Helper::check_methods( '\BackWPup_Job', array( 'read_logheader' ) );
- $lasttime_logged = MainWP_Utility::get_lasttime_backup( 'backwpup' );
- $log_folder = get_site_option( 'backwpup_cfg_logfolder' );
- $log_folder = \BackWPup_File::get_absolute_path( $log_folder );
- $log_folder = untrailingslashit( $log_folder );
-
- $logfiles = array();
- $dir = opendir( $log_folder );
- if ( is_readable( $log_folder ) && $dir ) {
- while ( ( $file = readdir( $dir ) ) !== false ) {
- $log_file = $log_folder . '/' . $file;
- if ( is_file( $log_file ) && is_readable( $log_file ) && false !== strpos( $file, 'backwpup_log_' ) && false !== strpos( $file, '.html' ) ) {
- $logfiles[] = $file;
- }
- }
- closedir( $dir );
- }
-
- $log_items = array();
- foreach ( $logfiles as $mtime => $logfile ) {
- $meta = \BackWPup_Job::read_logheader( $log_folder . '/' . $logfile );
- if ( ! isset( $meta['logtime'] ) || $meta['logtime'] < $lasttime_logged ) {
- continue;
- }
-
- if ( isset( $meta['errors'] ) && ! empty( $meta['errors'] ) ) {
- continue;
- }
-
- $log_items[ $mtime ] = $meta;
- $log_items[ $mtime ]['file'] = $logfile;
- }
-
- if ( ! empty( $log_items ) ) {
- $job_types = array(
- 'DBDUMP' => __( 'Database backup', 'mainwp-child' ),
- 'FILE' => __( 'File backup', 'mainwp-child' ),
- 'WPEXP' => __( 'WordPress XML export', 'mainwp-child' ),
- 'WPPLUGIN' => __( 'Installed plugins list', 'mainwp-child' ),
- 'DBCHECK' => __( 'Check database tables', 'mainwp-child' ),
- );
-
- $new_lasttime_logged = $lasttime_logged;
-
- foreach ( $log_items as $log ) {
- $backup_time = $log['logtime'];
- if ( $backup_time < $lasttime_logged ) {
- continue;
- }
- $job_job_types = explode( '+', $log['type'] );
- $backup_type = '';
- foreach ( $job_job_types as $typeid ) {
- if ( isset( $job_types[ $typeid ] ) ) {
- $backup_type .= ' + ' . $job_types[ $typeid ];
- }
- }
-
- if ( empty( $backup_type ) ) {
- continue;
- } else {
- $backup_type = ltrim( $backup_type, ' + ' );
- }
- $message = 'BackWPup backup finished (' . $backup_type . ')';
- do_action( 'mainwp_reports_backwpup_backup', $message, $backup_type, $backup_time );
-
- if ( $new_lasttime_logged < $backup_time ) {
- $new_lasttime_logged = $backup_time;
- }
- }
-
- if ( $new_lasttime_logged > $lasttime_logged ) {
- MainWP_Utility::update_lasttime_backup( 'backwpup', $new_lasttime_logged ); // to support backup before update feature.
- }
- }
- } catch ( \Exception $ex ) {
- // ok!
- }
- }
-
- public function sync_others_data( $information, $data = array() ) {
- if ( isset( $data['syncBackwpupData'] ) && $data['syncBackwpupData'] ) {
- try {
- $lastbackup = MainWP_Utility::get_lasttime_backup( 'backwpup' );
- $information['syncBackwpupData'] = array(
- 'lastbackup' => $lastbackup,
- );
- } catch ( \Exception $e ) {
- // ok!
- }
- }
- return $information;
- }
-
- public function get_destinations_list() {
- MainWP_Helper::check_classes_exists( array( '\BackWPup', '\BackWPup_Option' ) );
- MainWP_Helper::check_methods( '\BackWPup', array( 'get_registered_destinations', 'get_destination' ) );
- MainWP_Helper::check_methods( '\BackWPup_Option', array( 'get_job_ids', 'get' ) );
-
- $jobdest = array();
- $jobids = \BackWPup_Option::get_job_ids();
- $destinations = \BackWPup::get_registered_destinations();
- foreach ( $jobids as $jobid ) {
- if ( \BackWPup_Option::get( $jobid, 'backuptype' ) === 'sync' ) {
- continue;
- }
- $dests = \BackWPup_Option::get( $jobid, 'destinations' );
- foreach ( $dests as $dest ) {
- if ( ! $destinations[ $dest ]['class'] ) {
- continue;
- }
-
- $dest_class = \BackWPup::get_destination( $dest );
- if ( $dest_class && method_exists( $dest_class, 'file_get_list' ) ) {
- $can_do_dest = $dest_class->file_get_list( $jobid . '_' . $dest );
- if ( ! empty( $can_do_dest ) ) {
- $jobdest[] = $jobid . '_' . $dest;
- }
- }
- }
- }
-
- return $jobdest;
- }
-
- public function all_plugins( $plugins ) {
- foreach ( $plugins as $key => $value ) {
- $plugin_slug = basename( $key, '.php' );
- if ( 'backwpup' === $plugin_slug ) {
- unset( $plugins[ $key ] );
- }
- }
-
- return $plugins;
- }
-
- public function remove_menu() {
- global $submenu;
-
- if ( isset( $submenu['backwpup'] ) ) {
- unset( $submenu['backwpup'] );
- }
-
- remove_menu_page( 'backwpup' );
-
- $pos = stripos( $_SERVER['REQUEST_URI'], 'admin.php?page=backwpup' );
- if ( false !== $pos ) {
- wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' );
- exit();
- }
- }
-
- protected function show_hide() {
-
- $hide = isset( $_POST['show_hide'] ) && ( '1' === $_POST['show_hide'] ) ? 'hide' : '';
-
- MainWP_Helper::instance()->update_option( 'mainwp_backwpup_hide_plugin', $hide, 'yes' );
-
- return array( 'success' => 1 );
- }
-
- protected function information() {
- global $wpdb;
- // Copied from BackWPup_Page_Settings.
- ob_start();
- echo '
';
- echo '' . __( 'Setting', 'mainwp-child' ) . ' | ' . __( 'Value', 'mainwp-child' ) . ' |
';
- echo '' . __( 'Setting', 'mainwp-child' ) . ' | ' . __( 'Value', 'mainwp-child' ) . ' |
';
- echo '' . __( 'WordPress version', 'mainwp-child' ) . ' | ' . esc_html( \BackWPup::get_plugin_data( 'wp_version' ) ) . ' |
';
- if ( ! class_exists( '\BackWPup_Pro', false ) ) {
- echo '' . __( 'BackWPup version', 'mainwp-child' ) . ' | ' . esc_html( \BackWPup::get_plugin_data( 'Version' ) ) . ' ' . __( 'Get pro.', 'mainwp-child' ) . ' |
';
- } else {
- echo '' . __( 'BackWPup Pro version', 'mainwp-child' ) . ' | ' . esc_html( \BackWPup::get_plugin_data( 'Version' ) ) . ' |
';
- }
-
- echo '' . __( 'PHP version', 'mainwp-child' ) . ' | ' . esc_html( PHP_VERSION ) . ' |
';
- echo '' . __( 'MySQL version', 'mainwp-child' ) . ' | ' . esc_html( $wpdb->get_var( 'SELECT VERSION() AS version' ) ) . ' |
';
- if ( function_exists( 'curl_version' ) ) {
- $curlversion = curl_version();
- echo '' . __( 'cURL version', 'mainwp-child' ) . ' | ' . esc_html( $curlversion['version'] ) . ' |
';
- echo '' . __( 'cURL SSL version', 'mainwp-child' ) . ' | ' . esc_html( $curlversion['ssl_version'] ) . ' |
';
- } else {
- echo '' . __( 'cURL version', 'mainwp-child' ) . ' | ' . __( 'unavailable', 'mainwp-child' ) . ' |
';
- }
- echo '' . __( 'WP-Cron url:', 'mainwp-child' ) . ' | ' . esc_html( site_url( 'wp-cron.php' ) ) . ' |
';
-
- echo '' . __( 'Server self connect:', 'mainwp-child' ) . ' | ';
- $raw_response = \BackWPup_Job::get_jobrun_url( 'test' );
- $test_result = '';
- if ( is_wp_error( $raw_response ) ) {
- $test_result .= sprintf( __( 'The HTTP response test get an error "%s"', 'mainwp-child' ), esc_html( $raw_response->get_error_message() ) );
- } elseif ( 200 !== (int) wp_remote_retrieve_response_code( $raw_response ) && 204 !== (int) wp_remote_retrieve_response_code( $raw_response ) ) {
- $test_result .= sprintf( __( 'The HTTP response test get a false http status (%s)', 'mainwp-child' ), esc_html( wp_remote_retrieve_response_code( $raw_response ) ) );
- }
- $headers = wp_remote_retrieve_headers( $raw_response );
- if ( isset( $headers['x-backwpup-ver'] ) && \BackWPup::get_plugin_data( 'version' ) !== $headers['x-backwpup-ver'] ) {
- $test_result .= sprintf( __( 'The BackWPup HTTP response header returns a false value: "%s"', 'mainwp-child' ), esc_html( $headers['x-backwpup-ver'] ) );
- }
-
- if ( empty( $test_result ) ) {
- esc_html_e( 'Response Test O.K.', 'mainwp-child' );
- } else {
- echo esc_html( $test_result );
- }
- echo ' |
';
-
- echo '' . __( 'Temp folder:', 'mainwp-child' ) . ' | ';
- if ( ! is_dir( \BackWPup::get_plugin_data( 'TEMP' ) ) ) {
- echo sprintf( __( 'Temp folder %s doesn\'t exist.', 'mainwp-child' ), esc_html( \BackWPup::get_plugin_data( 'TEMP' ) ) );
- } elseif ( ! is_writable( \BackWPup::get_plugin_data( 'TEMP' ) ) ) {
- echo sprintf( __( 'Temporary folder %s is not writable.', 'mainwp-child' ), esc_html( \BackWPup::get_plugin_data( 'TEMP' ) ) );
- } else {
- echo esc_html( \BackWPup::get_plugin_data( 'TEMP' ) );
- }
- echo ' |
';
-
- echo '' . __( 'Log folder:', 'mainwp-child' ) . ' | ';
-
- $log_folder = \BackWPup_File::get_absolute_path( get_site_option( 'backwpup_cfg_logfolder' ) );
-
- if ( ! is_dir( $log_folder ) ) {
- echo sprintf( __( 'Logs folder %s not exist.', 'mainwp-child' ), esc_html( $log_folder ) );
- } elseif ( ! is_writable( $log_folder ) ) {
- echo sprintf( __( 'Log folder %s is not writable.', 'mainwp-child' ), esc_html( $log_folder ) );
- } else {
- echo esc_html( $log_folder );
- }
- echo ' |
';
- echo '' . __( 'Server', 'mainwp-child' ) . ' | ' . esc_html( $_SERVER['SERVER_SOFTWARE'] ) . ' |
';
- echo '' . __( 'Operating System', 'mainwp-child' ) . ' | ' . esc_html( PHP_OS ) . ' |
';
- echo '' . __( 'PHP SAPI', 'mainwp-child' ) . ' | ' . esc_html( PHP_SAPI ) . ' |
';
- echo '' . __( 'Current PHP user', 'mainwp-child' ) . ' | ' . esc_html( get_current_user() ) . ' |
';
- $text = version_compare( phpversion(), '5.3.0' ) < 0 && (bool) ini_get( 'safe_mode' ) ? __( 'On', 'mainwp-child' ) : __( 'Off', 'mainwp-child' );
- echo '' . __( 'Safe Mode', 'mainwp-child' ) . ' | ' . $text . ' |
';
- echo '' . __( 'Maximum execution time', 'mainwp-child' ) . ' | ' . ini_get( 'max_execution_time' ) . ' ' . __( 'seconds', 'mainwp-child' ) . ' |
';
- if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) {
- echo '' . __( 'Alternative WP Cron', 'mainwp-child' ) . ' | ' . __( 'On', 'mainwp-child' ) . ' |
';
- } else {
- echo '' . __( 'Alternative WP Cron', 'mainwp-child' ) . ' | ' . __( 'Off', 'mainwp-child' ) . ' |
';
- }
- if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
- echo '' . __( 'Disabled WP Cron', 'mainwp-child' ) . ' | ' . __( 'On', 'mainwp-child' ) . ' |
';
- } else {
- echo '' . __( 'Disabled WP Cron', 'mainwp-child' ) . ' | ' . __( 'Off', 'mainwp-child' ) . ' |
';
- }
- if ( defined( 'FS_CHMOD_DIR' ) ) {
- echo '' . __( 'CHMOD Dir', 'mainwp-child' ) . ' | ' . FS_CHMOD_DIR . ' |
';
- } else {
- echo '' . __( 'CHMOD Dir', 'mainwp-child' ) . ' | 0755 |
';
- }
-
- $now = localtime( time(), true );
- echo '' . __( 'Server Time', 'mainwp-child' ) . ' | ' . esc_html( $now['tm_hour'] ) . ':' . esc_html( $now['tm_min'] ) . ' |
';
- echo '' . __( 'Blog Time', 'mainwp-child' ) . ' | ' . esc_html( date_i18n( 'H:i' ) ) . ' |
';
- echo '' . __( 'Blog Timezone', 'mainwp-child' ) . ' | ' . esc_html( get_option( 'timezone_string' ) ) . ' |
';
- echo '' . __( 'Blog Time offset', 'mainwp-child' ) . ' | ' . sprintf( __( '%s hours', 'mainwp-child' ), esc_html( get_option( 'gmt_offset' ) ) ) . ' |
';
- echo '' . __( 'Blog language', 'mainwp-child' ) . ' | ' . esc_html( get_bloginfo( 'language' ) ) . ' |
';
- echo '' . __( 'MySQL Client encoding', 'mainwp-child' ) . ' | ';
- echo defined( 'DB_CHARSET' ) ? esc_html( DB_CHARSET ) : '';
- echo ' |
';
- echo '' . __( 'Blog charset', 'mainwp-child' ) . ' | ' . esc_html( get_bloginfo( 'charset' ) ) . ' |
';
- echo '' . __( 'PHP Memory limit', 'mainwp-child' ) . ' | ' . esc_html( ini_get( 'memory_limit' ) ) . ' |
';
- echo '' . __( 'WP memory limit', 'mainwp-child' ) . ' | ' . esc_html( WP_MEMORY_LIMIT ) . ' |
';
- echo '' . __( 'WP maximum memory limit', 'mainwp-child' ) . ' | ' . esc_html( WP_MAX_MEMORY_LIMIT ) . ' |
';
- echo '' . __( 'Memory in use', 'mainwp-child' ) . ' | ' . esc_html( size_format( memory_get_usage( true ), 2 ) ) . ' |
';
-
- $disabled = ini_get( 'disable_functions' );
- if ( ! empty( $disabled ) ) {
- $disabledarry = explode( ',', $disabled );
- echo '' . __( 'Disabled PHP Functions:', 'mainwp-child' ) . ' | ';
- echo esc_html( implode( ', ', $disabledarry ) );
- echo ' |
';
- }
-
- echo '' . __( 'Loaded PHP Extensions:', 'mainwp-child' ) . ' | ';
- $extensions = get_loaded_extensions();
- sort( $extensions );
- echo esc_html( implode( ', ', $extensions ) );
- echo ' |
';
- echo '
';
-
- $output = ob_get_contents();
-
- ob_end_clean();
-
- return array(
- 'success' => 1,
- 'response' => $output,
- );
- }
-
- protected function delete_log() {
- if ( ! isset( $_POST['settings']['logfile'] ) || ! is_array( $_POST['settings']['logfile'] ) ) {
- return array( 'error' => __( 'Missing logfile.', 'mainwp-child' ) );
- }
-
- $dir = get_site_option( 'backwpup_cfg_logfolder' );
- $dir = \BackWPup_File::get_absolute_path( $dir );
-
- foreach ( $_POST['settings']['logfile'] as $logfile ) {
- $logfile = basename( $logfile );
-
- if ( ! is_writeable( $dir ) ) {
- return array( 'error' => __( 'Directory not writable:', 'mainwp-child' ) . $dir );
- }
- if ( ! is_file( $dir . $logfile ) ) {
- return array( 'error' => __( 'Not file:', 'mainwp-child' ) . $dir . $logfile );
- }
-
- unlink( $dir . $logfile );
-
- }
-
- return array( 'success' => 1 );
- }
-
- protected function delete_job() {
- if ( ! isset( $_POST['job_id'] ) ) {
- return array( 'error' => __( 'Missing job_id.', 'mainwp-child' ) );
- }
-
- $job_id = (int) $_POST['job_id'];
-
- wp_clear_scheduled_hook( 'backwpup_cron', array( 'id' => $job_id ) );
- if ( ! \BackWPup_Option::delete_job( $job_id ) ) {
- return array( 'error' => __( 'Cannot delete job', 'mainwp-child' ) );
- }
-
- return array( 'success' => 1 );
- }
-
- protected function delete_backup() {
- if ( ! isset( $_POST['settings']['backupfile'] ) ) {
- return array( 'error' => __( 'Missing backupfile.', 'mainwp-child' ) );
- }
-
- if ( ! isset( $_POST['settings']['dest'] ) ) {
- return array( 'error' => __( 'Missing dest.', 'mainwp-child' ) );
- }
-
- $backupfile = $_POST['settings']['backupfile'];
- $dest = $_POST['settings']['dest'];
-
- list( $dest_id, $dest_name ) = explode( '_', $dest );
-
- $dest_class = \BackWPup::get_destination( $dest_name );
-
- if ( is_null( $dest_class ) ) {
- return array( 'error' => __( 'Invalid dest class.', 'mainwp-child' ) );
- }
-
- $files = $dest_class->file_get_list( $dest );
-
- foreach ( $files as $file ) {
- if ( is_array( $file ) && $file['file'] == $backupfile ) {
- $dest_class->file_delete( $dest, $backupfile );
-
- return array(
- 'success' => 1,
- 'response' => 'DELETED',
- );
- }
- }
-
- return array(
- 'success' => 1,
- 'response' => 'Not found',
- );
- }
-
- protected function view_log() {
- if ( ! isset( $_POST['settings']['logfile'] ) ) {
- return array( 'error' => __( 'Missing logfile.', 'mainwp-child' ) );
- }
-
- $log_folder = get_site_option( 'backwpup_cfg_logfolder' );
- $log_folder = \BackWPup_File::get_absolute_path( $log_folder );
- $log_file = $log_folder . basename( $_POST['settings']['logfile'] );
-
- if ( ! is_readable( $log_file ) && ! is_readable( $log_file . '.gz' ) && ! is_readable( $log_file . '.bz2' ) ) {
- $output = __( 'Log file doesn\'t exists', 'mainwp-child' );
- } else {
- if ( ! file_exists( $log_file ) && file_exists( $log_file . '.gz' ) ) {
- $log_file = $log_file . '.gz';
- }
-
- if ( ! file_exists( $log_file ) && file_exists( $log_file . '.bz2' ) ) {
- $log_file = $log_file . '.bz2';
- }
-
- if ( '.gz' == substr( $log_file, - 3 ) ) {
- $output = file_get_contents( 'compress.zlib://' . $log_file, false );
- } else {
- $output = file_get_contents( $log_file, false );
- }
- }
-
- return array(
- 'success' => 1,
- 'response' => $output,
- );
- }
-
- protected function tables() {
- if ( ! isset( $_POST['settings']['type'] ) ) {
- return array( 'error' => __( 'Missing type.', 'mainwp-child' ) );
- }
-
- if ( ! isset( $_POST['settings']['website_id'] ) ) {
- return array( 'error' => __( 'Missing website id.', 'mainwp-child' ) );
- }
-
- $type = $_POST['settings']['type'];
- $website_id = $_POST['settings']['website_id'];
-
- $this->wp_list_table_dependency();
-
- $array = array();
-
- switch ( $type ) {
- case 'logs':
- $log_folder = get_site_option( 'backwpup_cfg_logfolder' );
- $log_folder = \BackWPup_File::get_absolute_path( $log_folder );
- $log_folder = untrailingslashit( $log_folder );
-
- if ( ! is_dir( $log_folder ) ) {
- return array(
- 'success' => 1,
- 'response' => $array,
- );
- }
- update_user_option( get_current_user_id(), 'backwpuplogs_per_page', 99999999 );
- $output = new \BackWPup_Page_Logs();
- $output->prepare_items();
- break;
-
- case 'backups':
- update_user_option( get_current_user_id(), 'backwpupbackups_per_page', 99999999 );
- $output = new \BackWPup_Page_Backups();
- $output->items = array();
-
- $jobids = \BackWPup_Option::get_job_ids();
-
- if ( ! empty( $jobids ) ) {
- foreach ( $jobids as $jobid ) {
- if ( \BackWPup_Option::get( $jobid, 'backuptype' ) == 'sync' ) {
- continue;
- }
-
- $dests = \Option::get( $jobid, 'destinations' );
- foreach ( $dests as $dest ) {
- $dest_class = \BackWPup::get_destination( $dest );
- if ( is_null( $dest_class ) ) {
- continue;
- }
- $items = $dest_class->file_get_list( $jobid . '_' . $dest );
- if ( ! empty( $items ) ) {
- foreach ( $items as $item ) {
- $temp_single_item = $item;
- $temp_single_item['dest'] = $jobid . '_' . $dest;
- $temp_single_item['timeloc'] = sprintf( __( '%1$s at %2$s', 'mainwp-child' ), date_i18n( get_option( 'date_format' ), $temp_single_item['time'], true ), date_i18n( get_option( 'time_format' ), $temp_single_item['time'], true ) );
- $output->items[] = $temp_single_item;
- }
- }
- }
- }
- }
-
- break;
-
- case 'jobs':
- $output = new \BackWPup_Page_Jobs();
- $output->prepare_items();
- break;
- }
-
- if ( is_array( $output->items ) ) {
- if ( 'jobs' == $type ) {
- foreach ( $output->items as $key => $val ) {
- $temp_array = array();
- $temp_array['id'] = $val;
- $temp_array['name'] = \BackWPup_Option::get( $val, 'name' );
- $temp_array['type'] = \BackWPup_Option::get( $val, 'type' );
- $temp_array['destinations'] = \BackWPup_Option::get( $val, 'destinations' );
-
- if ( $this->is_backwpup_pro ) {
- $temp_array['export'] = str_replace( '&', '&', wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupjobs&action=export&jobs[]=' . $val, 'bulk-jobs' ) );
- }
-
- if ( \BackWPup_Option::get( $val, 'activetype' ) == 'wpcron' ) {
- $nextrun = wp_next_scheduled( 'backwpup_cron', array( 'id' => $val ) );
- if ( $nextrun + ( get_option( 'gmt_offset' ) * 3600 ) ) {
- $temp_array['nextrun'] = sprintf( __( '%1$s at %2$s by WP-Cron', 'mainwp-child' ), date_i18n( get_option( 'date_format' ), $nextrun, true ), date_i18n( get_option( 'time_format' ), $nextrun, true ) );
- } else {
- $temp_array['nextrun'] = __( 'Not scheduled!', 'mainwp-child' );
- }
- } else {
- $temp_array['nextrun'] = __( 'Inactive', 'mainwp-child' );
- }
- if ( \BackWPup_Option::get( $val, 'lastrun' ) ) {
- $lastrun = \BackWPup_Option::get( $val, 'lastrun' );
- $temp_array['lastrun'] = sprintf( __( '%1$s at %2$s', 'mainwp-child' ), date_i18n( get_option( 'date_format' ), $lastrun, true ), date_i18n( get_option( 'time_format' ), $lastrun, true ) );
- if ( \BackWPup_Option::get( $val, 'lastruntime' ) ) {
- $temp_array['lastrun'] .= ' ' . sprintf( __( 'Runtime: %d seconds', 'mainwp-child' ), \BackWPup_Option::get( $val, 'lastruntime' ) );
- }
- } else {
- $temp_array['lastrun'] = __( 'not yet', 'mainwp-child' );
- }
-
- $temp_array['website_id'] = $website_id;
- $array[] = $temp_array;
- }
- } elseif ( 'backups' == $type ) {
- $without_dupes = array();
- foreach ( $output->items as $key ) {
- $temp_array = $key;
- $temp_array['downloadurl'] = str_replace(
- array(
- '&',
- network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=',
- ),
- array(
- '&',
- admin_url( 'admin-ajax.php' ) . '?action=mainwp_backwpup_download_backup&type=',
- ),
- $temp_array['downloadurl'] . '&_wpnonce=' . $this->create_nonce_without_session( 'mainwp_download_backup' )
- );
-
- $temp_array['downloadurl_id'] = '/wp-admin/admin.php?page=backwpupbackups';
- if ( preg_match( '/.*&jobid=([^&]+)&.*/is', $temp_array['downloadurl'], $matches ) ) {
- if ( ! empty( $matches[1] ) && is_numeric( $matches[1] ) ) {
- $temp_array['downloadurl_id'] .= '&download_click_id=' . $matches[1];
- }
- }
-
- $temp_array['website_id'] = $website_id;
-
- if ( ! isset( $without_dupes[ $temp_array['file'] ] ) ) {
- $array[] = $temp_array;
- $without_dupes[ $temp_array['file'] ] = 1;
- }
- }
- } else {
- foreach ( $output->items as $key => $val ) {
- $array[] = $val;
- }
- }
- }
-
- return array(
- 'success' => 1,
- 'response' => $array,
- );
- }
-
- public function init_download_backup() {
- if ( ! isset( $_GET['page'] ) || 'backwpupbackups' !== $_GET['page'] || ! isset( $_GET['download_click_id'] ) || empty( $_GET['download_click_id'] ) ) {
- return;
- }
- ?>
-
- verify_nonce_without_session( $_GET['_wpnonce'], 'mainwp_download_backup' ) ) {
- die( '-3' );
- }
-
- $dest = strtoupper( str_replace( 'download', '', $_GET['type'] ) );
- if ( ! empty( $dest ) && strstr( $_GET['type'], 'download' ) ) {
- $dest_class = \BackWPup::get_destination( $dest );
- if ( is_null( $dest_class ) ) {
- die( '-4' );
- }
-
- $dest_class->file_download( (int) $_GET['jobid'], $_GET['file'] );
- } else {
- die( '-5' );
- }
-
- die();
- }
-
- protected function create_nonce_without_session( $action = - 1 ) {
- $user = wp_get_current_user();
- $uid = (int) $user->ID;
- if ( ! $uid ) {
- $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
- }
-
- $i = wp_nonce_tick();
-
- return substr( wp_hash( $i . '|' . $action . '|' . $uid, 'nonce' ), - 12, 10 );
- }
-
- protected function verify_nonce_without_session( $nonce, $action = - 1 ) {
- $nonce = (string) $nonce;
- $user = wp_get_current_user();
- $uid = (int) $user->ID;
- if ( ! $uid ) {
- $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
- }
-
- if ( empty( $nonce ) ) {
- return false;
- }
-
- $i = wp_nonce_tick();
-
- $expected = substr( wp_hash( $i . '|' . $action . '|' . $uid, 'nonce' ), - 12, 10 );
- if ( hash_equals( $expected, $nonce ) ) {
- return 1;
- }
-
- $expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid, 'nonce' ), - 12, 10 );
- if ( hash_equals( $expected, $nonce ) ) {
- return 2;
- }
-
- return false;
- }
-
- protected function ajax_working() {
-
- if ( ! isset( $_POST['settings'] ) || ! is_array( $_POST['settings'] ) || ! isset( $_POST['settings']['logfile'] ) || ! isset( $_POST['settings']['logpos'] ) ) {
- return array( 'error' => __( 'Missing logfile or logpos.', 'mainwp-child' ) );
- }
-
- $_GET['logfile'] = $_POST['settings']['logfile'];
- $_GET['logpos'] = $_POST['settings']['logpos'];
- $_REQUEST['_wpnonce'] = wp_create_nonce( 'backwpupworking_ajax_nonce' );
-
- $this->wp_list_table_dependency();
-
- function mainwp_backwpup_wp_die_ajax_handler( $message ) {
- return 'mainwp_backwpup_wp_die_ajax_handler';
- }
-
- // We do this in order to not die when using wp_die.
- if ( ! defined( 'DOING_AJAX' ) ) {
- define( 'DOING_AJAX', true );
- }
-
- add_filter( 'wp_die_ajax_handler', 'mainwp_backwpup_wp_die_ajax_handler' );
- remove_filter( 'wp_die_ajax_handler', '_ajax_wp_die_handler' );
-
- ob_start();
- \BackWPup_Page_Jobs::ajax_working();
-
- $output = ob_get_contents();
-
- ob_end_clean();
-
- return array(
- 'success' => 1,
- 'response' => $output,
- );
- }
-
- protected function backup_now() {
-
- if ( ! isset( $_POST['settings']['job_id'] ) ) {
- return array( 'error' => __( 'Missing job_id', 'mainwp-child' ) );
- }
-
- // Simulate http://wp/wp-admin/admin.php?jobid=1&page=backwpupjobs&action=runnow.
- $_GET['jobid'] = $_POST['settings']['job_id'];
-
- $_REQUEST['action'] = 'runnow';
- $_REQUEST['_wpnonce'] = wp_create_nonce( 'backwpup_job_run-runnowlink' );
-
- update_site_option( 'backwpup_messages', array() );
-
- $this->wp_list_table_dependency();
-
- ob_start();
- \BackWPup_Page_Jobs::load();
- ob_end_clean();
-
- $output = $this->check_backwpup_messages();
-
- if ( isset( $output['error'] ) ) {
- return array( 'error' => '\BackWPup_Page_Jobs::load fail: ' . $output['error'] );
- } else {
- $job_object = \BackWPup_Job::get_working_data();
- if ( is_object( $job_object ) ) {
- return array(
- 'success' => 1,
- 'response' => $output['message'],
- 'logfile' => basename( $job_object->logfile ),
- );
- } else {
- return array(
- 'success' => 1,
- 'response' => $output['message'],
- );
- }
- }
- }
-
- protected function backup_abort() {
- $_REQUEST['action'] = 'abort';
- $_REQUEST['_wpnonce'] = wp_create_nonce( 'abort-job' );
-
- update_site_option( 'backwpup_messages', array() );
-
- $this->wp_list_table_dependency();
-
- ob_start();
- \BackWPup_Page_Jobs::load();
- ob_end_clean();
-
- $output = $this->check_backwpup_messages();
-
- if ( isset( $output['error'] ) ) {
- return array( 'error' => 'Cannot abort: ' . $output['error'] );
- } else {
- return array(
- 'success' => 1,
- 'response' => $output['message'],
- );
- }
- }
-
- protected function wp_list_table_dependency() {
- if ( ! function_exists( 'convert_to_screen' ) ) {
- // We need this because BackWPup_Page_Jobs extends WP_List_Table which uses convert_to_screen.
- function convert_to_screen( $hook_name ) {
- return new MainWP_Fake_Wp_Screen();
- }
- }
-
- if ( ! function_exists( 'add_screen_option' ) ) {
- function add_screen_option( $option, $args = array() ) {
- }
- }
-
- if ( ! class_exists( '\WP_List_Table' ) ) {
- require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
- }
- }
-
- protected function wizard_system_scan() {
- if ( class_exists( '\BackWPup_Pro_Wizard_SystemTest' ) ) {
- ob_start();
-
- $system_test = new \BackWPup_Pro_Wizard_SystemTest();
- $system_test->execute( null );
-
- $output = ob_get_contents();
-
- ob_end_clean();
-
- return array(
- 'success' => 1,
- 'response' => $output,
- );
- } else {
- return array( 'error' => 'Missing BackWPup_Pro_Wizard_SystemTest' );
- }
- }
-
- protected function destination_email_check_email() {
- $settings = $_POST['settings'];
-
- $message = '';
-
- $emailmethod = ( isset( $settings['emailmethod'] ) ? $settings['emailmethod'] : '' );
- $emailsendmail = ( isset( $settings['emailsendmail'] ) ? $settings['emailsendmail'] : '' );
- $emailhost = ( isset( $settings['emailhost'] ) ? $settings['emailhost'] : '' );
- $emailhostport = ( isset( $settings['emailhostport'] ) ? $settings['emailhostport'] : '' );
- $emailsecure = ( isset( $settings['emailsecure'] ) ? $settings['emailsecure'] : '' );
- $emailuser = ( isset( $settings['emailuser'] ) ? $settings['emailuser'] : '' );
- $emailpass = ( isset( $settings['emailpass'] ) ? $settings['emailpass'] : '' );
-
- if ( ! isset( $settings['emailaddress'] ) || strlen( $settings['emailaddress'] ) < 2 ) {
- $message = __( 'Missing email address.', 'mainwp-child' );
- } else {
- if ( $emailmethod ) {
- global $phpmailer;
- if ( ! is_object( $phpmailer ) || ! $phpmailer instanceof PHPMailer ) {
- require_once ABSPATH . WPINC . '/class-phpmailer.php';
- require_once ABSPATH . WPINC . '/class-smtp.php';
- $phpmailer = new PHPMailer( true ); // phpcs:ignore -- to custom init PHP mailer
- }
- if ( is_object( $phpmailer ) ) {
- do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );
- $emailmethod = $phpmailer->Mailer;
- $emailsendmail = $phpmailer->Sendmail;
- $emailhost = $phpmailer->Host;
- $emailhostport = $phpmailer->Port;
- $emailsecure = $phpmailer->SMTPSecure;
- $emailuser = $phpmailer->Username;
- $emailpass = $phpmailer->Password;
- }
- }
-
- if ( ! class_exists( '\Swift', false ) ) {
- require \BackWPup::get_plugin_data( 'plugindir' ) . '/vendor/SwiftMailer/swift_required.php';
- }
-
- if ( function_exists( 'mb_internal_encoding' ) && ( (int) ini_get( 'mbstring.func_overload' ) ) & 2 ) {
- $mbEncoding = mb_internal_encoding();
- mb_internal_encoding( 'ASCII' );
- }
-
- try {
- // Create the Transport.
- if ( 'smtp' == $emailmethod ) {
- $transport = Swift_SmtpTransport::newInstance( $emailhost, $emailhostport );
- $transport->setUsername( $emailuser );
- $transport->setPassword( $emailpass );
- if ( 'ssl' == $emailsecure ) {
- $transport->setEncryption( 'ssl' );
- }
- if ( 'tls' == $emailsecure ) {
- $transport->setEncryption( 'tls' );
- }
- } elseif ( 'sendmail' == $emailmethod ) {
- $transport = Swift_SendmailTransport::newInstance( $emailsendmail );
- } else {
- $transport = Swift_MailTransport::newInstance();
- }
- $emailer = Swift_Mailer::newInstance( $transport );
-
- $message = Swift_Message::newInstance( __( 'BackWPup archive sending TEST Message', 'mainwp-child' ) );
- $message->setFrom( array( ( isset( $settings['emailsndemail'] ) ? $settings['emailsndemail'] : 'from@example.com' ) => isset( $settings['emailsndemailname'] ) ? $settings['emailsndemailname'] : '' ) );
- $message->setTo( array( $settings['emailaddress'] ) );
- $message->setBody( __( 'If this message reaches your inbox, sending backup archives via email should work for you.', 'mainwp-child' ) );
-
- $result = $emailer->send( $message );
- } catch ( \Exception $e ) {
- $message = 'Swift Mailer: ' . $e->getMessage();
- }
-
- if ( isset( $mbEncoding ) ) {
- mb_internal_encoding( $mbEncoding );
- }
-
- if ( ! isset( $result ) || ! $result ) {
- $message = __( 'Error while sending email!', 'mainwp-child' );
- } else {
- $message = __( 'Email sent.', 'mainwp-child' );
- }
- }
-
- return array(
- 'success' => 1,
- 'message' => $message,
- );
- }
-
- protected function get_job_files() {
- // From BackWPup_JobType_File::get_exclude_dirs.
- function mainwp_backwpup_get_exclude_dirs( $folder ) {
- $folder = trailingslashit( str_replace( '\\', '/', realpath( $folder ) ) );
- $exclude_dir_array = array();
-
- if ( false !== strpos( trailingslashit( str_replace( '\\', '/', realpath( ABSPATH ) ) ), $folder ) && trailingslashit( str_replace( '\\', '/', realpath( ABSPATH ) ) ) != $folder ) {
- $exclude_dir_array[] = trailingslashit( str_replace( '\\', '/', realpath( ABSPATH ) ) );
- }
- if ( false !== strpos( trailingslashit( str_replace( '\\', '/', realpath( WP_CONTENT_DIR ) ) ), $folder ) && trailingslashit( str_replace( '\\', '/', realpath( WP_CONTENT_DIR ) ) ) != $folder ) {
- $exclude_dir_array[] = trailingslashit( str_replace( '\\', '/', realpath( WP_CONTENT_DIR ) ) );
- }
- if ( false !== strpos( trailingslashit( str_replace( '\\', '/', realpath( WP_PLUGIN_DIR ) ) ), $folder ) && trailingslashit( str_replace( '\\', '/', realpath( WP_PLUGIN_DIR ) ) ) != $folder ) {
- $exclude_dir_array[] = trailingslashit( str_replace( '\\', '/', realpath( WP_PLUGIN_DIR ) ) );
- }
- if ( false !== strpos( trailingslashit( str_replace( '\\', '/', realpath( get_theme_root() ) ) ), $folder ) && trailingslashit( str_replace( '\\', '/', realpath( get_theme_root() ) ) ) != $folder ) {
- $exclude_dir_array[] = trailingslashit( str_replace( '\\', '/', realpath( get_theme_root() ) ) );
- }
- if ( false !== strpos( trailingslashit( str_replace( '\\', '/', realpath( \BackWPup_File::get_upload_dir() ) ) ), $folder ) && trailingslashit( str_replace( '\\', '/', realpath( \BackWPup_File::get_upload_dir() ) ) ) != $folder ) {
- $exclude_dir_array[] = trailingslashit( str_replace( '\\', '/', realpath( \BackWPup_File::get_upload_dir() ) ) );
- }
-
- return array_unique( $exclude_dir_array );
- }
-
- $return = array();
-
- $folders = array(
- 'abs' => ABSPATH,
- 'content' => WP_CONTENT_DIR,
- 'plugin' => WP_PLUGIN_DIR,
- 'theme' => get_theme_root(),
- 'upload' => \BackWPup_File::get_upload_dir(),
- );
-
- foreach ( $folders as $key => $folder ) {
- $return_temp = array();
- $main_folder_name = realpath( $folder );
-
- if ( $main_folder_name ) {
- $main_folder_name = untrailingslashit( str_replace( '\\', '/', $main_folder_name ) );
- $main_folder_size = '(' . size_format( \BackWPup_File::get_folder_size( $main_folder_name, false ), 2 ) . ')';
-
- $dir = opendir( $main_folder_name );
- if ( $dir ) {
- while ( false !== ( $file = readdir( $dir ) ) ) {
- if ( ! in_array( $file, array( '.', '..' ) ) && is_dir( $main_folder_name . '/' . $file ) && ! in_array( trailingslashit( $main_folder_name . '/' . $file ), mainwp_backwpup_get_exclude_dirs( $main_folder_name ) ) ) {
- $folder_size = ' (' . size_format( \BackWPup_File::get_folder_size( $main_folder_name . '/' . $file ), 2 ) . ')';
- $return_temp[] = array(
- 'size' => $folder_size,
- 'name' => $file,
- );
-
- }
- }
-
- closedir( $dir );
- }
-
- $return[ $key ] = array(
- 'size' => $main_folder_size,
- 'name' => $folder,
- 'folders' => $return_temp,
- );
- }
- }
-
- return array(
- 'success' => 1,
- 'folders' => $return,
- );
- }
-
- protected function get_child_tables() {
- global $wpdb;
-
- $return = array();
-
- $settings = $_POST['settings'];
-
- if ( ! empty( $settings['dbhost'] ) && ! empty( $settings['dbuser'] ) ) {
- $mysqli = new mysqli( $settings['dbhost'], $settings['dbuser'], ( isset( $settings['dbpassword'] ) ? $settings['dbpassword'] : '' ) ); // phpcs:ignore -- third party code.
-
- if ( $mysqli->connect_error ) {
- $return['message'] = $mysqli->connect_error;
- } else {
- if ( ! empty( $settings['dbname'] ) ) {
- $res = $mysqli->query( 'SHOW FULL TABLES FROM `' . $mysqli->real_escape_string( $settings['dbname'] ) . '`' );
- if ( $res ) {
- $tables_temp = array();
- while ( $table = $res->fetch_array( MYSQLI_NUM ) ) { // phpcs:ignore -- third party code.
- $tables_temp[] = $table[0];
- }
-
- $res->close();
- $return['tables'] = $tables_temp;
- }
- }
-
- if ( empty( $settings['dbname'] ) || ! empty( $settings['first'] ) ) {
- $res = $mysqli->query( 'SHOW DATABASES' );
- if ( $res ) {
- $databases_temp = array();
- while ( $db = $res->fetch_array() ) {
- $databases_temp[] = $db['Database'];
- }
-
- $res->close();
- $return['databases'] = $databases_temp;
- }
- }
- }
- $mysqli->close();
- } else {
- $tables_temp = array();
-
- $tables = $wpdb->get_results( 'SHOW FULL TABLES FROM `' . DB_NAME . '`', ARRAY_N ); // phpcs:ignore -- safe query.
- foreach ( $tables as $table ) {
- $tables_temp[] = $table[0];
- }
-
- $return['tables'] = $tables_temp;
- }
-
- if ( isset( $settings['job_id'] ) ) {
- $return['dbdumpexclude'] = \BackWPup_Option::get( $settings['job_id'], 'dbdumpexclude' );
- }
- return array(
- 'success' => 1,
- 'return' => $return,
- );
- }
-
- protected function insert_or_update_jobs_global() {
- $settings = $_POST['settings'];
-
- if ( ! is_array( $settings ) ) {
- return array( 'error' => __( 'Missing array settings', 'mainwp-child' ) );
- }
-
- if ( ! isset( $settings['job_id'] ) ) {
- return array( 'error' => __( 'Missing job_id', 'mainwp-child' ) );
- }
-
- if ( $settings['job_id'] > 0 ) {
- $new_job_id = intval( $settings['job_id'] );
- } else {
- $new_job_id = null;
- }
-
- $changes_array = array();
- $message_array = array();
-
- foreach ( $settings['value'] as $key => $val ) {
- $temp_array = array();
- $temp_array['tab'] = $key;
- $temp_array['value'] = $val;
- if ( ! is_null( $new_job_id ) ) {
- $temp_array['job_id'] = $new_job_id;
- } else {
- $temp_array['job_id'] = $settings['job_id'];
- }
-
- $_POST['settings'] = $temp_array;
- $return = $this->insert_or_update_jobs();
-
- if ( is_null( $new_job_id ) ) {
- if ( ! isset( $return['job_id'] ) ) {
- return array( 'error' => __( 'Missing new job_id', 'mainwp-child' ) );
- }
-
- $new_job_id = $return['job_id'];
- }
-
- // We want to exit gracefully.
- if ( isset( $return['error_message'] ) ) {
- $message_array[ $return['error_message'] ] = 1;
- }
-
- if ( isset( $return['changes'] ) ) {
- $changes_array = array_merge( $changes_array, $return['changes'] );
- }
-
- if ( isset( $return['message'] ) ) {
- foreach ( $return['message'] as $message ) {
- if ( ! isset( $message_array[ $message ] ) ) {
- $message_array[ $message ] = 1;
- }
- }
- }
- }
-
- return array(
- 'success' => 1,
- 'job_id' => $new_job_id,
- 'changes' => $changes_array,
- 'message' => array_keys( $message_array ),
- );
- }
-
- // From BackWPup_JobType_File::edit_form_post_save with some tweaks.
- public function edit_form_post_save( $post_data, $id ) {
- // Parse and save files to exclude.
- $exclude_input = $post_data['fileexclude'];
- $to_exclude_list = $exclude_input ? str_replace( array( "\r\n", "\r" ), ',', $exclude_input ) : array();
- if ( $to_exclude_list ) {
- $to_exclude_list = sanitize_text_field( stripslashes( $to_exclude_list ) );
- }
- $to_exclude = $to_exclude_list ? explode( ',', $to_exclude_list ) : array();
- $to_exclude_parsed = array();
- foreach ( $to_exclude as $key => $value ) {
- $normalized = wp_normalize_path( trim( $value ) );
- if ( $normalized ) {
- $to_exclude_parsed[ $key ] = $normalized;
- }
- }
- sort( $to_exclude_parsed );
- \BackWPup_Option::update( $id, 'fileexclude', implode( ',', $to_exclude_parsed ) );
- unset( $exclude_input, $to_exclude_list, $to_exclude, $to_exclude_parsed, $normalized );
-
- // Parse and save folders to include.
- $include_input = $post_data['dirinclude'];
- $include_list = $include_input ? str_replace( array( "\r\n", "\r" ), ',', $include_input ) : array();
- $to_include = $include_list ? explode( ',', $include_list ) : array();
- $to_include_parsed = array();
- foreach ( $to_include as $key => $value ) {
- $normalized = trailingslashit( wp_normalize_path( trim( $value ) ) );
- if ( $normalized ) {
- $normalized = filter_var( $normalized, FILTER_SANITIZE_URL );
- }
- $realpath = $normalized && '/' !== $normalized ? realpath( $normalized ) : false;
- if ( $realpath ) {
- $to_include_parsed[ $key ] = $realpath;
- }
- }
- sort( $to_include_parsed );
- \BackWPup_Option::update( $id, 'dirinclude', implode( ',', $to_include_parsed ) );
- unset( $include_input, $include_list, $to_include, $to_include_parsed, $normalized, $realpath );
-
- // Parse and save boolean fields.
- $boolean_fields_def = array(
- 'backupexcludethumbs' => FILTER_VALIDATE_BOOLEAN,
- 'backupspecialfiles' => FILTER_VALIDATE_BOOLEAN,
- 'backuproot' => FILTER_VALIDATE_BOOLEAN,
- 'backupabsfolderup' => FILTER_VALIDATE_BOOLEAN,
- 'backupcontent' => FILTER_VALIDATE_BOOLEAN,
- 'backupplugins' => FILTER_VALIDATE_BOOLEAN,
- 'backupthemes' => FILTER_VALIDATE_BOOLEAN,
- 'backupuploads' => FILTER_VALIDATE_BOOLEAN,
- );
-
- foreach ( $boolean_fields_def as $key => $value ) {
- \BackWPup_Option::update( $id, $key, ! empty( $post_data[ $key ] ) );
- }
- // Parse and save directories to exclude.
- $exclude_dirs_def = array(
- 'backuprootexcludedirs' => array(
- 'filter' => FILTER_SANITIZE_URL,
- 'flags' => FILTER_FORCE_ARRAY,
- ),
- 'backuppluginsexcludedirs' => array(
- 'filter' => FILTER_SANITIZE_URL,
- 'flags' => FILTER_FORCE_ARRAY,
- ),
- 'backupcontentexcludedirs' => array(
- 'filter' => FILTER_SANITIZE_URL,
- 'flags' => FILTER_FORCE_ARRAY,
- ),
- 'backupthemesexcludedirs' => array(
- 'filter' => FILTER_SANITIZE_URL,
- 'flags' => FILTER_FORCE_ARRAY,
- ),
- 'backupuploadsexcludedirs' => array(
- 'filter' => FILTER_SANITIZE_URL,
- 'flags' => FILTER_FORCE_ARRAY,
- ),
- );
- foreach ( $exclude_dirs_def as $key => $filter ) {
- $value = ! empty( $post_data[ $key ] ) && is_array( $post_data[ $key ] ) ? $post_data[ $key ] : array();
- \BackWPup_Option::update( $id, $key, $value );
- }
- }
-
- protected function insert_or_update_jobs() {
-
- $settings = $_POST['settings'];
-
- if ( ! is_array( $settings ) || ! isset( $settings['value'] ) ) {
- return array( 'error' => __( 'Missing array settings', 'mainwp-child' ) );
- }
-
- if ( ! isset( $settings['tab'] ) ) {
- return array( 'error' => __( 'Missing tab', 'mainwp-child' ) );
- }
-
- if ( ! isset( $settings['job_id'] ) ) {
- return array( 'error' => __( 'Missing job_id', 'mainwp-child' ) );
- }
-
- if ( ! class_exists( '\BackWPup' ) ) {
- return array( 'error' => __( 'Install BackWPup on child website', 'mainwp-child' ) );
- }
-
- if ( $settings['job_id'] > 0 ) {
- $job_id = intval( $settings['job_id'] );
- } else {
- // generate jobid if not exists.
- $newjobid = \BackWPup_Option::get_job_ids();
- sort( $newjobid );
- $job_id = end( $newjobid ) + 1;
- }
-
- update_site_option( 'backwpup_messages', array() );
-
- if ( isset( $settings['value']['backupdir'] ) && empty( $settings['value']['backupdir'] ) ) {
- $backupdir = \BackWPup_Option::get( (int) $job_id, 'backupdir' );
- if ( ! empty( $backupdir ) ) {
- $settings['value']['backupdir'] = $backupdir;
- }
- }
-
- foreach ( $settings['value'] as $key => $val ) {
- $_POST[ $key ] = $val;
- }
-
- if ( 'jobtype-FILE' == $settings['tab'] ) {
- $this->edit_form_post_save( $settings['value'], $job_id );
- $messages = \BackWPup_Admin::get_messages();
- if ( empty( $messages['error'] ) ) {
- $url = \BackWPup_Job::get_jobrun_url( 'runnowlink', $job_id );
- \BackWPup_Admin::message( sprintf( __( 'Changes for job ';
+ echo '' . __( 'Setting', 'mainwp-child' ) . ' | ' . __( 'Value', 'mainwp-child' ) . ' |
';
+ echo '' . __( 'Setting', 'mainwp-child' ) . ' | ' . __( 'Value', 'mainwp-child' ) . ' |
';
+ echo '' . __( 'WordPress version', 'mainwp-child' ) . ' | ' . esc_html( \BackWPup::get_plugin_data( 'wp_version' ) ) . ' |
';
+ if ( ! class_exists( '\BackWPup_Pro', false ) ) {
+ echo '' . __( 'BackWPup version', 'mainwp-child' ) . ' | ' . esc_html( \BackWPup::get_plugin_data( 'Version' ) ) . ' ' . __( 'Get pro.', 'mainwp-child' ) . ' |
';
+ } else {
+ echo '' . __( 'BackWPup Pro version', 'mainwp-child' ) . ' | ' . esc_html( \BackWPup::get_plugin_data( 'Version' ) ) . ' |
';
+ }
+
+ echo '' . __( 'PHP version', 'mainwp-child' ) . ' | ' . esc_html( PHP_VERSION ) . ' |
';
+ echo '' . __( 'MySQL version', 'mainwp-child' ) . ' | ' . esc_html( $wpdb->get_var( 'SELECT VERSION() AS version' ) ) . ' |
';
+ if ( function_exists( 'curl_version' ) ) {
+ $curlversion = curl_version();
+ echo '' . __( 'cURL version', 'mainwp-child' ) . ' | ' . esc_html( $curlversion['version'] ) . ' |
';
+ echo '' . __( 'cURL SSL version', 'mainwp-child' ) . ' | ' . esc_html( $curlversion['ssl_version'] ) . ' |
';
+ } else {
+ echo '' . __( 'cURL version', 'mainwp-child' ) . ' | ' . __( 'unavailable', 'mainwp-child' ) . ' |
';
+ }
+ echo '' . __( 'WP-Cron url:', 'mainwp-child' ) . ' | ' . esc_html( site_url( 'wp-cron.php' ) ) . ' |
';
+
+ echo '' . __( 'Server self connect:', 'mainwp-child' ) . ' | ';
+ $raw_response = \BackWPup_Job::get_jobrun_url( 'test' );
+ $test_result = '';
+ if ( is_wp_error( $raw_response ) ) {
+ $test_result .= sprintf( __( 'The HTTP response test get an error "%s"', 'mainwp-child' ), esc_html( $raw_response->get_error_message() ) );
+ } elseif ( 200 !== (int) wp_remote_retrieve_response_code( $raw_response ) && 204 !== (int) wp_remote_retrieve_response_code( $raw_response ) ) {
+ $test_result .= sprintf( __( 'The HTTP response test get a false http status (%s)', 'mainwp-child' ), esc_html( wp_remote_retrieve_response_code( $raw_response ) ) );
+ }
+ $headers = wp_remote_retrieve_headers( $raw_response );
+ if ( isset( $headers['x-backwpup-ver'] ) && \BackWPup::get_plugin_data( 'version' ) !== $headers['x-backwpup-ver'] ) {
+ $test_result .= sprintf( __( 'The BackWPup HTTP response header returns a false value: "%s"', 'mainwp-child' ), esc_html( $headers['x-backwpup-ver'] ) );
+ }
+
+ if ( empty( $test_result ) ) {
+ esc_html_e( 'Response Test O.K.', 'mainwp-child' );
+ } else {
+ echo esc_html( $test_result );
+ }
+ echo ' |
';
+
+ echo '' . __( 'Temp folder:', 'mainwp-child' ) . ' | ';
+ if ( ! is_dir( \BackWPup::get_plugin_data( 'TEMP' ) ) ) {
+ echo sprintf( __( 'Temp folder %s doesn\'t exist.', 'mainwp-child' ), esc_html( \BackWPup::get_plugin_data( 'TEMP' ) ) );
+ } elseif ( ! is_writable( \BackWPup::get_plugin_data( 'TEMP' ) ) ) {
+ echo sprintf( __( 'Temporary folder %s is not writable.', 'mainwp-child' ), esc_html( \BackWPup::get_plugin_data( 'TEMP' ) ) );
+ } else {
+ echo esc_html( \BackWPup::get_plugin_data( 'TEMP' ) );
+ }
+ echo ' |
';
+
+ echo '' . __( 'Log folder:', 'mainwp-child' ) . ' | ';
+
+ $log_folder = \BackWPup_File::get_absolute_path( get_site_option( 'backwpup_cfg_logfolder' ) );
+
+ if ( ! is_dir( $log_folder ) ) {
+ echo sprintf( __( 'Logs folder %s not exist.', 'mainwp-child' ), esc_html( $log_folder ) );
+ } elseif ( ! is_writable( $log_folder ) ) {
+ echo sprintf( __( 'Log folder %s is not writable.', 'mainwp-child' ), esc_html( $log_folder ) );
+ } else {
+ echo esc_html( $log_folder );
+ }
+ echo ' |
';
+ echo '' . __( 'Server', 'mainwp-child' ) . ' | ' . esc_html( $_SERVER['SERVER_SOFTWARE'] ) . ' |
';
+ echo '' . __( 'Operating System', 'mainwp-child' ) . ' | ' . esc_html( PHP_OS ) . ' |
';
+ echo '' . __( 'PHP SAPI', 'mainwp-child' ) . ' | ' . esc_html( PHP_SAPI ) . ' |
';
+ echo '' . __( 'Current PHP user', 'mainwp-child' ) . ' | ' . esc_html( get_current_user() ) . ' |
';
+ $text = version_compare( phpversion(), '5.3.0' ) < 0 && (bool) ini_get( 'safe_mode' ) ? __( 'On', 'mainwp-child' ) : __( 'Off', 'mainwp-child' );
+ echo '' . __( 'Safe Mode', 'mainwp-child' ) . ' | ' . $text . ' |
';
+ echo '' . __( 'Maximum execution time', 'mainwp-child' ) . ' | ' . ini_get( 'max_execution_time' ) . ' ' . __( 'seconds', 'mainwp-child' ) . ' |
';
+ if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) {
+ echo '' . __( 'Alternative WP Cron', 'mainwp-child' ) . ' | ' . __( 'On', 'mainwp-child' ) . ' |
';
+ } else {
+ echo '' . __( 'Alternative WP Cron', 'mainwp-child' ) . ' | ' . __( 'Off', 'mainwp-child' ) . ' |
';
+ }
+ if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
+ echo '' . __( 'Disabled WP Cron', 'mainwp-child' ) . ' | ' . __( 'On', 'mainwp-child' ) . ' |
';
+ } else {
+ echo '' . __( 'Disabled WP Cron', 'mainwp-child' ) . ' | ' . __( 'Off', 'mainwp-child' ) . ' |
';
+ }
+ if ( defined( 'FS_CHMOD_DIR' ) ) {
+ echo '' . __( 'CHMOD Dir', 'mainwp-child' ) . ' | ' . FS_CHMOD_DIR . ' |
';
+ } else {
+ echo '' . __( 'CHMOD Dir', 'mainwp-child' ) . ' | 0755 |
';
+ }
+
+ $now = localtime( time(), true );
+ echo '' . __( 'Server Time', 'mainwp-child' ) . ' | ' . esc_html( $now['tm_hour'] ) . ':' . esc_html( $now['tm_min'] ) . ' |
';
+ echo '' . __( 'Blog Time', 'mainwp-child' ) . ' | ' . esc_html( date_i18n( 'H:i' ) ) . ' |
';
+ echo '' . __( 'Blog Timezone', 'mainwp-child' ) . ' | ' . esc_html( get_option( 'timezone_string' ) ) . ' |
';
+ echo '' . __( 'Blog Time offset', 'mainwp-child' ) . ' | ' . sprintf( __( '%s hours', 'mainwp-child' ), esc_html( get_option( 'gmt_offset' ) ) ) . ' |
';
+ echo '' . __( 'Blog language', 'mainwp-child' ) . ' | ' . esc_html( get_bloginfo( 'language' ) ) . ' |
';
+ echo '' . __( 'MySQL Client encoding', 'mainwp-child' ) . ' | ';
+ echo defined( 'DB_CHARSET' ) ? esc_html( DB_CHARSET ) : '';
+ echo ' |
';
+ echo '' . __( 'Blog charset', 'mainwp-child' ) . ' | ' . esc_html( get_bloginfo( 'charset' ) ) . ' |
';
+ echo '' . __( 'PHP Memory limit', 'mainwp-child' ) . ' | ' . esc_html( ini_get( 'memory_limit' ) ) . ' |
';
+ echo '' . __( 'WP memory limit', 'mainwp-child' ) . ' | ' . esc_html( WP_MEMORY_LIMIT ) . ' |
';
+ echo '' . __( 'WP maximum memory limit', 'mainwp-child' ) . ' | ' . esc_html( WP_MAX_MEMORY_LIMIT ) . ' |
';
+ echo '' . __( 'Memory in use', 'mainwp-child' ) . ' | ' . esc_html( size_format( memory_get_usage( true ), 2 ) ) . ' |
';
+
+ $disabled = ini_get( 'disable_functions' );
+ if ( ! empty( $disabled ) ) {
+ $disabledarry = explode( ',', $disabled );
+ echo '' . __( 'Disabled PHP Functions:', 'mainwp-child' ) . ' | ';
+ echo esc_html( implode( ', ', $disabledarry ) );
+ echo ' |
';
+ }
+
+ echo '' . __( 'Loaded PHP Extensions:', 'mainwp-child' ) . ' | ';
+ $extensions = get_loaded_extensions();
+ sort( $extensions );
+ echo esc_html( implode( ', ', $extensions ) );
+ echo ' |
';
+ echo '
';
+
+ $output = ob_get_contents();
+
+ ob_end_clean();
+
+ return array(
+ 'success' => 1,
+ 'response' => $output,
+ );
+ }
+
+ /**
+ * Delete BackWPup Log.
+ *
+ * @uses \BackWPup_File::get_absolute_path()
+ *
+ * @return int[]|string[] On success return success[1] & error[] message on failure.
+ */
+ protected function delete_log() {
+ if ( ! isset( $_POST['settings']['logfile'] ) || ! is_array( $_POST['settings']['logfile'] ) ) {
+ return array( 'error' => __( 'Missing logfile.', 'mainwp-child' ) );
+ }
+
+ $dir = get_site_option( 'backwpup_cfg_logfolder' );
+ $dir = \BackWPup_File::get_absolute_path( $dir );
+
+ foreach ( $_POST['settings']['logfile'] as $logfile ) {
+ $logfile = basename( $logfile );
+
+ if ( ! is_writeable( $dir ) ) {
+ return array( 'error' => __( 'Directory not writable:', 'mainwp-child' ) . $dir );
+ }
+ if ( ! is_file( $dir . $logfile ) ) {
+ return array( 'error' => __( 'Not file:', 'mainwp-child' ) . $dir . $logfile );
+ }
+
+ unlink( $dir . $logfile );
+
+ }
+
+ return array( 'success' => 1 );
+ }
+
+ /**
+ * Delete backup job.
+ *
+ * @uses \BackWPup_Option::delete_job()
+ *
+ * @return array|int[]|string[] On success return success[1] & error['message'] on failure.
+ */
+ protected function delete_job() {
+ if ( ! isset( $_POST['job_id'] ) ) {
+ return array( 'error' => __( 'Missing job_id.', 'mainwp-child' ) );
+ }
+
+ $job_id = (int) $_POST['job_id'];
+
+ wp_clear_scheduled_hook( 'backwpup_cron', array( 'id' => $job_id ) );
+ if ( ! \BackWPup_Option::delete_job( $job_id ) ) {
+ return array( 'error' => __( 'Cannot delete job', 'mainwp-child' ) );
+ }
+
+ return array( 'success' => 1 );
+ }
+
+ /**
+ * Delete backup.
+ *
+ * @uses \BackWPup::get_destination()
+ * @uses \BackWPup::get_destination::file_get_list()
+ * @uses \BackWPup::get_destination::file_delete()
+ *
+ * @return array|int[]|string[] On success return success[1] response['DELETED'] & error['message'] on failure.
+ */
+ protected function delete_backup() {
+ if ( ! isset( $_POST['settings']['backupfile'] ) ) {
+ return array( 'error' => __( 'Missing backupfile.', 'mainwp-child' ) );
+ }
+
+ if ( ! isset( $_POST['settings']['dest'] ) ) {
+ return array( 'error' => __( 'Missing dest.', 'mainwp-child' ) );
+ }
+
+ $backupfile = $_POST['settings']['backupfile'];
+ $dest = $_POST['settings']['dest'];
+
+ list( $dest_id, $dest_name ) = explode( '_', $dest );
+
+ $dest_class = \BackWPup::get_destination( $dest_name );
+
+ if ( is_null( $dest_class ) ) {
+ return array( 'error' => __( 'Invalid dest class.', 'mainwp-child' ) );
+ }
+
+ $files = $dest_class->file_get_list( $dest );
+
+ foreach ( $files as $file ) {
+ if ( is_array( $file ) && $file['file'] == $backupfile ) {
+ $dest_class->file_delete( $dest, $backupfile );
+
+ return array(
+ 'success' => 1,
+ 'response' => 'DELETED',
+ );
+ }
+ }
+
+ return array(
+ 'success' => 1,
+ 'response' => 'Not found',
+ );
+ }
+
+ /**
+ * View BackWPup log.
+ *
+ * @return array|int[]|string[] On success return $output[] & error['message'] on failure.
+ */
+ protected function view_log() {
+ if ( ! isset( $_POST['settings']['logfile'] ) ) {
+ return array( 'error' => __( 'Missing logfile.', 'mainwp-child' ) );
+ }
+
+ $log_folder = get_site_option( 'backwpup_cfg_logfolder' );
+ $log_folder = \BackWPup_File::get_absolute_path( $log_folder );
+ $log_file = $log_folder . basename( $_POST['settings']['logfile'] );
+
+ if ( ! is_readable( $log_file ) && ! is_readable( $log_file . '.gz' ) && ! is_readable( $log_file . '.bz2' ) ) {
+ $output = __( 'Log file doesn\'t exists', 'mainwp-child' );
+ } else {
+ if ( ! file_exists( $log_file ) && file_exists( $log_file . '.gz' ) ) {
+ $log_file = $log_file . '.gz';
+ }
+
+ if ( ! file_exists( $log_file ) && file_exists( $log_file . '.bz2' ) ) {
+ $log_file = $log_file . '.bz2';
+ }
+
+ if ( '.gz' == substr( $log_file, - 3 ) ) {
+ $output = file_get_contents( 'compress.zlib://' . $log_file, false );
+ } else {
+ $output = file_get_contents( $log_file, false );
+ }
+ }
+
+ return array(
+ 'success' => 1,
+ 'response' => $output,
+ );
+ }
+
+ /**
+ * Build Tables.
+ *
+ * @uses MainWP_Child_Back_WP_Up::wp_list_table_dependency()
+ * @uses \BackWPup_File::get_absolute_path()
+ * @uses \BackWPup_Page_Logs()
+ * @uses \BackWPup_Page_Backups()
+ * @uses \BackWPup_Option::get_job_ids()
+ * @uses \BackWPup_Option::get()
+ * @uses \BackWPup::get_destination()
+ * @uses \BackWPup::get_destination::file_get_list()
+ * @uses \Option::get()
+ *
+ * @return array Return table array or error['message'] on failure.
+ */
+ protected function tables() {
+ if ( ! isset( $_POST['settings']['type'] ) ) {
+ return array( 'error' => __( 'Missing type.', 'mainwp-child' ) );
+ }
+
+ if ( ! isset( $_POST['settings']['website_id'] ) ) {
+ return array( 'error' => __( 'Missing website id.', 'mainwp-child' ) );
+ }
+
+ $type = $_POST['settings']['type'];
+ $website_id = $_POST['settings']['website_id'];
+
+ $this->wp_list_table_dependency();
+
+ $array = array();
+
+ switch ( $type ) {
+ case 'logs':
+ $log_folder = get_site_option( 'backwpup_cfg_logfolder' );
+ $log_folder = \BackWPup_File::get_absolute_path( $log_folder );
+ $log_folder = untrailingslashit( $log_folder );
+
+ if ( ! is_dir( $log_folder ) ) {
+ return array(
+ 'success' => 1,
+ 'response' => $array,
+ );
+ }
+ update_user_option( get_current_user_id(), 'backwpuplogs_per_page', 99999999 );
+ $output = new \BackWPup_Page_Logs();
+ $output->prepare_items();
+ break;
+
+ case 'backups':
+ update_user_option( get_current_user_id(), 'backwpupbackups_per_page', 99999999 );
+ $output = new \BackWPup_Page_Backups();
+ $output->items = array();
+
+ $jobids = \BackWPup_Option::get_job_ids();
+
+ if ( ! empty( $jobids ) ) {
+ foreach ( $jobids as $jobid ) {
+ if ( \BackWPup_Option::get( $jobid, 'backuptype' ) == 'sync' ) {
+ continue;
+ }
+
+ $dests = \Option::get( $jobid, 'destinations' );
+ foreach ( $dests as $dest ) {
+ $dest_class = \BackWPup::get_destination( $dest );
+ if ( is_null( $dest_class ) ) {
+ continue;
+ }
+ $items = $dest_class->file_get_list( $jobid . '_' . $dest );
+ if ( ! empty( $items ) ) {
+ foreach ( $items as $item ) {
+ $temp_single_item = $item;
+ $temp_single_item['dest'] = $jobid . '_' . $dest;
+ $temp_single_item['timeloc'] = sprintf( __( '%1$s at %2$s', 'mainwp-child' ), date_i18n( get_option( 'date_format' ), $temp_single_item['time'], true ), date_i18n( get_option( 'time_format' ), $temp_single_item['time'], true ) );
+ $output->items[] = $temp_single_item;
+ }
+ }
+ }
+ }
+ }
+
+ break;
+
+ case 'jobs':
+ $output = new \BackWPup_Page_Jobs();
+ $output->prepare_items();
+ break;
+ }
+
+ if ( is_array( $output->items ) ) {
+ if ( 'jobs' == $type ) {
+ foreach ( $output->items as $key => $val ) {
+ $temp_array = array();
+ $temp_array['id'] = $val;
+ $temp_array['name'] = \BackWPup_Option::get( $val, 'name' );
+ $temp_array['type'] = \BackWPup_Option::get( $val, 'type' );
+ $temp_array['destinations'] = \BackWPup_Option::get( $val, 'destinations' );
+
+ if ( $this->is_backwpup_pro ) {
+ $temp_array['export'] = str_replace( '&', '&', wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupjobs&action=export&jobs[]=' . $val, 'bulk-jobs' ) );
+ }
+
+ if ( \BackWPup_Option::get( $val, 'activetype' ) == 'wpcron' ) {
+ $nextrun = wp_next_scheduled( 'backwpup_cron', array( 'id' => $val ) );
+ if ( $nextrun + ( get_option( 'gmt_offset' ) * 3600 ) ) {
+ $temp_array['nextrun'] = sprintf( __( '%1$s at %2$s by WP-Cron', 'mainwp-child' ), date_i18n( get_option( 'date_format' ), $nextrun, true ), date_i18n( get_option( 'time_format' ), $nextrun, true ) );
+ } else {
+ $temp_array['nextrun'] = __( 'Not scheduled!', 'mainwp-child' );
+ }
+ } else {
+ $temp_array['nextrun'] = __( 'Inactive', 'mainwp-child' );
+ }
+ if ( \BackWPup_Option::get( $val, 'lastrun' ) ) {
+ $lastrun = \BackWPup_Option::get( $val, 'lastrun' );
+ $temp_array['lastrun'] = sprintf( __( '%1$s at %2$s', 'mainwp-child' ), date_i18n( get_option( 'date_format' ), $lastrun, true ), date_i18n( get_option( 'time_format' ), $lastrun, true ) );
+ if ( \BackWPup_Option::get( $val, 'lastruntime' ) ) {
+ $temp_array['lastrun'] .= ' ' . sprintf( __( 'Runtime: %d seconds', 'mainwp-child' ), \BackWPup_Option::get( $val, 'lastruntime' ) );
+ }
+ } else {
+ $temp_array['lastrun'] = __( 'not yet', 'mainwp-child' );
+ }
+
+ $temp_array['website_id'] = $website_id;
+ $array[] = $temp_array;
+ }
+ } elseif ( 'backups' == $type ) {
+ $without_dupes = array();
+ foreach ( $output->items as $key ) {
+ $temp_array = $key;
+ $temp_array['downloadurl'] = str_replace(
+ array(
+ '&',
+ network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=',
+ ),
+ array(
+ '&',
+ admin_url( 'admin-ajax.php' ) . '?action=mainwp_backwpup_download_backup&type=',
+ ),
+ $temp_array['downloadurl'] . '&_wpnonce=' . $this->create_nonce_without_session( 'mainwp_download_backup' )
+ );
+
+ $temp_array['downloadurl_id'] = '/wp-admin/admin.php?page=backwpupbackups';
+ if ( preg_match( '/.*&jobid=([^&]+)&.*/is', $temp_array['downloadurl'], $matches ) ) {
+ if ( ! empty( $matches[1] ) && is_numeric( $matches[1] ) ) {
+ $temp_array['downloadurl_id'] .= '&download_click_id=' . $matches[1];
+ }
+ }
+
+ $temp_array['website_id'] = $website_id;
+
+ if ( ! isset( $without_dupes[ $temp_array['file'] ] ) ) {
+ $array[] = $temp_array;
+ $without_dupes[ $temp_array['file'] ] = 1;
+ }
+ }
+ } else {
+ foreach ( $output->items as $key => $val ) {
+ $array[] = $val;
+ }
+ }
+ }
+
+ return array(
+ 'success' => 1,
+ 'response' => $array,
+ );
+ }
+
+ /**
+ * Initiate download link.
+ */
+ public function init_download_backup() {
+ if ( ! isset( $_GET['page'] ) || 'backwpupbackups' !== $_GET['page'] || ! isset( $_GET['download_click_id'] ) || empty( $_GET['download_click_id'] ) ) {
+ return;
+ }
+ ?>
+
+ verify_nonce_without_session( $_GET['_wpnonce'], 'mainwp_download_backup' ) ) {
+ die( '-3' );
+ }
+
+ $dest = strtoupper( str_replace( 'download', '', $_GET['type'] ) );
+ if ( ! empty( $dest ) && strstr( $_GET['type'], 'download' ) ) {
+ $dest_class = \BackWPup::get_destination( $dest );
+ if ( is_null( $dest_class ) ) {
+ die( '-4' );
+ }
+
+ $dest_class->file_download( (int) $_GET['jobid'], $_GET['file'] );
+ } else {
+ die( '-5' );
+ }
+
+ die();
+ }
+
+ /**
+ * Create security nounce without session.
+ *
+ * @param int $action Action performing.
+ *
+ * @return string|false Return nonce or FALSE on failure.
+ */
+ protected function create_nonce_without_session( $action = - 1 ) {
+ $user = wp_get_current_user();
+ $uid = (int) $user->ID;
+ if ( ! $uid ) {
+ $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
+ }
+
+ $i = wp_nonce_tick();
+
+ return substr( wp_hash( $i . '|' . $action . '|' . $uid, 'nonce' ), - 12, 10 );
+ }
+
+ /**
+ * Verify nonce without session.
+ *
+ * @param string $nonce Nonce to verify.
+ * @param int $action Action to perform.
+ *
+ * @return bool|int FALSE on failure. 1 or 2 on success.
+ */
+ protected function verify_nonce_without_session($nonce, $action = - 1 ) {
+ $nonce = (string) $nonce;
+ $user = wp_get_current_user();
+ $uid = (int) $user->ID;
+ if ( ! $uid ) {
+ $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
+ }
+
+ if ( empty( $nonce ) ) {
+ return false;
+ }
+
+ $i = wp_nonce_tick();
+
+ $expected = substr( wp_hash( $i . '|' . $action . '|' . $uid, 'nonce' ), - 12, 10 );
+ if ( hash_equals( $expected, $nonce ) ) {
+ return 1;
+ }
+
+ $expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid, 'nonce' ), - 12, 10 );
+ if ( hash_equals( $expected, $nonce ) ) {
+ return 2;
+ }
+
+ return false;
+ }
+
+ /**
+ * BackWPup Ajax Working.
+ *
+ * @uses MainWP_Child_Back_WP_Up::wp_list_table_dependency()
+ * @uses \BackWPup_Page_Jobs::ajax_working()
+ *
+ * @return array Return success array[ success, response ]
+ */
+ protected function ajax_working() {
+
+ if ( ! isset( $_POST['settings'] ) || ! is_array( $_POST['settings'] ) || ! isset( $_POST['settings']['logfile'] ) || ! isset( $_POST['settings']['logpos'] ) ) {
+ return array( 'error' => __( 'Missing logfile or logpos.', 'mainwp-child' ) );
+ }
+
+ $_GET['logfile'] = $_POST['settings']['logfile'];
+ $_GET['logpos'] = $_POST['settings']['logpos'];
+ $_REQUEST['_wpnonce'] = wp_create_nonce( 'backwpupworking_ajax_nonce' );
+
+ $this->wp_list_table_dependency();
+
+ /**
+ * MainWP BackWPup WP Die ajax handler.
+ *
+ * @param string $message Error message container.
+ * @return string Error message.
+ */
+ function mainwp_backwpup_wp_die_ajax_handler( $message ) {
+ return 'mainwp_backwpup_wp_die_ajax_handler';
+ }
+
+ // We do this in order to not die when using wp_die.
+ if ( ! defined( 'DOING_AJAX' ) ) {
+ define( 'DOING_AJAX', true );
+ }
+
+ add_filter( 'wp_die_ajax_handler', 'mainwp_backwpup_wp_die_ajax_handler' );
+ remove_filter( 'wp_die_ajax_handler', '_ajax_wp_die_handler' );
+
+ ob_start();
+ \BackWPup_Page_Jobs::ajax_working();
+
+ $output = ob_get_contents();
+
+ ob_end_clean();
+
+ return array(
+ 'success' => 1,
+ 'response' => $output,
+ );
+ }
+
+ /**
+ * Backup now.
+ *
+ * @uses MainWP_Child_Back_WP_Up::wp_list_table_dependency()
+ * @uses MainWP_Child_Back_WP_Up::check_backwpup_messages()
+ * @uses \BackWPup_Page_Jobs::load()
+ * @uses \BackWPup_Job::get_working_data()
+ *
+ * @return array Response array[ success, response, logfile ] or array[ error ]
+ */
+ protected function backup_now() {
+
+ if ( ! isset( $_POST['settings']['job_id'] ) ) {
+ return array( 'error' => __( 'Missing job_id', 'mainwp-child' ) );
+ }
+
+ // Simulate http://wp/wp-admin/admin.php?jobid=1&page=backwpupjobs&action=runnow.
+ $_GET['jobid'] = $_POST['settings']['job_id'];
+
+ $_REQUEST['action'] = 'runnow';
+ $_REQUEST['_wpnonce'] = wp_create_nonce( 'backwpup_job_run-runnowlink' );
+
+ update_site_option( 'backwpup_messages', array() );
+
+ $this->wp_list_table_dependency();
+
+ ob_start();
+ \BackWPup_Page_Jobs::load();
+ ob_end_clean();
+
+ $output = $this->check_backwpup_messages();
+
+ if ( isset( $output['error'] ) ) {
+ return array( 'error' => '\BackWPup_Page_Jobs::load fail: ' . $output['error'] );
+ } else {
+ $job_object = \BackWPup_Job::get_working_data();
+ if ( is_object( $job_object ) ) {
+ return array(
+ 'success' => 1,
+ 'response' => $output['message'],
+ 'logfile' => basename( $job_object->logfile ),
+ );
+ } else {
+ return array(
+ 'success' => 1,
+ 'response' => $output['message'],
+ );
+ }
+ }
+ }
+
+ /**
+ * Abort backup.
+ *
+ * @uses MainWP_Child_Back_WP_Up::wp_list_table_dependency()
+ * @uses MainWP_Child_Back_WP_Up::check_backwpup_messages()
+ * @uses \BackWPup_Page_Jobs::load()
+ *
+ * @return array|string[] Return array or error[message] on failure.
+ */
+ protected function backup_abort() {
+ $_REQUEST['action'] = 'abort';
+ $_REQUEST['_wpnonce'] = wp_create_nonce( 'abort-job' );
+
+ update_site_option( 'backwpup_messages', array() );
+
+ $this->wp_list_table_dependency();
+
+ ob_start();
+ \BackWPup_Page_Jobs::load();
+ ob_end_clean();
+
+ $output = $this->check_backwpup_messages();
+
+ if ( isset( $output['error'] ) ) {
+ return array( 'error' => 'Cannot abort: ' . $output['error'] );
+ } else {
+ return array(
+ 'success' => 1,
+ 'response' => $output['message'],
+ );
+ }
+ }
+
+ /**
+ * WordPress list table dependency.
+ *
+ * @uses MainWP_Child_Back_WP_Up::MainWP_Fake_Wp_Screen()
+ */
+ protected function wp_list_table_dependency() {
+ if ( ! function_exists( 'convert_to_screen' ) ) {
+
+ /**
+ * Convert to screen
+ *
+ * We need this because BackWPup_Page_Jobs extends WP_List_Table
+ * which uses convert_to_screen.
+ *
+ * @param $hook_name Hook name.
+ * @return MainWP_Fake_Wp_Screen
+ */
+ function convert_to_screen( $hook_name ) {
+ return new MainWP_Fake_Wp_Screen();
+ }
+ }
+
+ if ( ! function_exists( 'add_screen_option' ) ) {
+ /**
+ * Adds the WP Fake Screen option.
+ *
+ * @param mixed $option Options.
+ * @param array $args Arguments.
+ */
+ function add_screen_option( $option, $args = array() ) {
+ }
+ }
+
+ if ( ! class_exists( '\WP_List_Table' ) ) {
+ require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
+ }
+ }
+
+ /**
+ * Wizard system scan.
+ *
+ * @uses \BackWPup_Pro_Wizard_SystemTest()
+ *
+ * @return array|string[] Return array or error[message] on failure.
+ */
+ protected function wizard_system_scan() {
+ if ( class_exists( '\BackWPup_Pro_Wizard_SystemTest' ) ) {
+ ob_start();
+
+ $system_test = new \BackWPup_Pro_Wizard_SystemTest();
+ $system_test->execute( null );
+
+ $output = ob_get_contents();
+
+ ob_end_clean();
+
+ return array(
+ 'success' => 1,
+ 'response' => $output,
+ );
+ } else {
+ return array( 'error' => 'Missing BackWPup_Pro_Wizard_SystemTest' );
+ }
+ }
+
+ /**
+ * Check destination email.
+ *
+ * @uses PHPMailer()
+ * @uses \BackWPup::get_plugin_data()
+ * @uses Swift_SmtpTransport::newInstance()
+ * @uses Swift_SendmailTransport::newInstance()
+ * @uses Swift_MailTransport::newInstance()
+ * @uses Swift_Mailer::newInstance()
+ * @uses Swift_Message::newInstance()
+ * @uses \Exception
+ *
+ * @return array|\Exception Return response array.
+ */
+ protected function destination_email_check_email() {
+ $settings = $_POST['settings'];
+
+ $message = '';
+
+ $emailmethod = ( isset( $settings['emailmethod'] ) ? $settings['emailmethod'] : '' );
+ $emailsendmail = ( isset( $settings['emailsendmail'] ) ? $settings['emailsendmail'] : '' );
+ $emailhost = ( isset( $settings['emailhost'] ) ? $settings['emailhost'] : '' );
+ $emailhostport = ( isset( $settings['emailhostport'] ) ? $settings['emailhostport'] : '' );
+ $emailsecure = ( isset( $settings['emailsecure'] ) ? $settings['emailsecure'] : '' );
+ $emailuser = ( isset( $settings['emailuser'] ) ? $settings['emailuser'] : '' );
+ $emailpass = ( isset( $settings['emailpass'] ) ? $settings['emailpass'] : '' );
+
+ if ( ! isset( $settings['emailaddress'] ) || strlen( $settings['emailaddress'] ) < 2 ) {
+ $message = __( 'Missing email address.', 'mainwp-child' );
+ } else {
+ if ( $emailmethod ) {
+ global $phpmailer;
+ if ( ! is_object( $phpmailer ) || ! $phpmailer instanceof PHPMailer ) {
+ require_once ABSPATH . WPINC . '/class-phpmailer.php';
+ require_once ABSPATH . WPINC . '/class-smtp.php';
+ $phpmailer = new PHPMailer( true ); // phpcs:ignore -- to custom init PHP mailer
+ }
+ if ( is_object( $phpmailer ) ) {
+ do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );
+ $emailmethod = $phpmailer->Mailer;
+ $emailsendmail = $phpmailer->Sendmail;
+ $emailhost = $phpmailer->Host;
+ $emailhostport = $phpmailer->Port;
+ $emailsecure = $phpmailer->SMTPSecure;
+ $emailuser = $phpmailer->Username;
+ $emailpass = $phpmailer->Password;
+ }
+ }
+
+ if ( ! class_exists( '\Swift', false ) ) {
+ require \BackWPup::get_plugin_data( 'plugindir' ) . '/vendor/SwiftMailer/swift_required.php';
+ }
+
+ if ( function_exists( 'mb_internal_encoding' ) && ( (int) ini_get( 'mbstring.func_overload' ) ) & 2 ) {
+ $mbEncoding = mb_internal_encoding();
+ mb_internal_encoding( 'ASCII' );
+ }
+
+ try {
+ // Create the Transport.
+ if ( 'smtp' == $emailmethod ) {
+ $transport = Swift_SmtpTransport::newInstance( $emailhost, $emailhostport );
+ $transport->setUsername( $emailuser );
+ $transport->setPassword( $emailpass );
+ if ( 'ssl' == $emailsecure ) {
+ $transport->setEncryption( 'ssl' );
+ }
+ if ( 'tls' == $emailsecure ) {
+ $transport->setEncryption( 'tls' );
+ }
+ } elseif ( 'sendmail' == $emailmethod ) {
+ $transport = Swift_SendmailTransport::newInstance( $emailsendmail );
+ } else {
+ $transport = Swift_MailTransport::newInstance();
+ }
+ $emailer = Swift_Mailer::newInstance( $transport );
+
+ $message = Swift_Message::newInstance( __( 'BackWPup archive sending TEST Message', 'mainwp-child' ) );
+ $message->setFrom( array( ( isset( $settings['emailsndemail'] ) ? $settings['emailsndemail'] : 'from@example.com' ) => isset( $settings['emailsndemailname'] ) ? $settings['emailsndemailname'] : '' ) );
+ $message->setTo( array( $settings['emailaddress'] ) );
+ $message->setBody( __( 'If this message reaches your inbox, sending backup archives via email should work for you.', 'mainwp-child' ) );
+
+ $result = $emailer->send( $message );
+ } catch ( \Exception $e ) {
+ $message = 'Swift Mailer: ' . $e->getMessage();
+ }
+
+ if ( isset( $mbEncoding ) ) {
+ mb_internal_encoding( $mbEncoding );
+ }
+
+ if ( ! isset( $result ) || ! $result ) {
+ $message = __( 'Error while sending email!', 'mainwp-child' );
+ } else {
+ $message = __( 'Email sent.', 'mainwp-child' );
+ }
+ }
+
+ return array(
+ 'success' => 1,
+ 'message' => $message,
+ );
+ }
+
+ /**
+ * Get job files.
+ *
+ * @uses BackWPup_File::get_upload_dir()
+ * @uses BackWPup_File::get_folder_size()
+ * @return array Response array containing folder locations and size.
+ */
+ protected function get_job_files() {
+ /**
+ * Taken from BackWPup_JobType_File::get_exclude_dirs.
+ *
+ * @param array $folder Folders to exclude.
+ * @return array Return folders list.
+ */
+ function mainwp_backwpup_get_exclude_dirs( $folder ) {
+ $folder = trailingslashit( str_replace( '\\', '/', realpath( $folder ) ) );
+ $exclude_dir_array = array();
+
+ if ( false !== strpos( trailingslashit( str_replace( '\\', '/', realpath( ABSPATH ) ) ), $folder ) && trailingslashit( str_replace( '\\', '/', realpath( ABSPATH ) ) ) != $folder ) {
+ $exclude_dir_array[] = trailingslashit( str_replace( '\\', '/', realpath( ABSPATH ) ) );
+ }
+ if ( false !== strpos( trailingslashit( str_replace( '\\', '/', realpath( WP_CONTENT_DIR ) ) ), $folder ) && trailingslashit( str_replace( '\\', '/', realpath( WP_CONTENT_DIR ) ) ) != $folder ) {
+ $exclude_dir_array[] = trailingslashit( str_replace( '\\', '/', realpath( WP_CONTENT_DIR ) ) );
+ }
+ if ( false !== strpos( trailingslashit( str_replace( '\\', '/', realpath( WP_PLUGIN_DIR ) ) ), $folder ) && trailingslashit( str_replace( '\\', '/', realpath( WP_PLUGIN_DIR ) ) ) != $folder ) {
+ $exclude_dir_array[] = trailingslashit( str_replace( '\\', '/', realpath( WP_PLUGIN_DIR ) ) );
+ }
+ if ( false !== strpos( trailingslashit( str_replace( '\\', '/', realpath( get_theme_root() ) ) ), $folder ) && trailingslashit( str_replace( '\\', '/', realpath( get_theme_root() ) ) ) != $folder ) {
+ $exclude_dir_array[] = trailingslashit( str_replace( '\\', '/', realpath( get_theme_root() ) ) );
+ }
+ if ( false !== strpos( trailingslashit( str_replace( '\\', '/', realpath( \BackWPup_File::get_upload_dir() ) ) ), $folder ) && trailingslashit( str_replace( '\\', '/', realpath( \BackWPup_File::get_upload_dir() ) ) ) != $folder ) {
+ $exclude_dir_array[] = trailingslashit( str_replace( '\\', '/', realpath( \BackWPup_File::get_upload_dir() ) ) );
+ }
+
+ return array_unique( $exclude_dir_array );
+ }
+
+ $return = array();
+
+ $folders = array(
+ 'abs' => ABSPATH,
+ 'content' => WP_CONTENT_DIR,
+ 'plugin' => WP_PLUGIN_DIR,
+ 'theme' => get_theme_root(),
+ 'upload' => \BackWPup_File::get_upload_dir(),
+ );
+
+ foreach ( $folders as $key => $folder ) {
+ $return_temp = array();
+ $main_folder_name = realpath( $folder );
+
+ if ( $main_folder_name ) {
+ $main_folder_name = untrailingslashit( str_replace( '\\', '/', $main_folder_name ) );
+ $main_folder_size = '(' . size_format( \BackWPup_File::get_folder_size( $main_folder_name, false ), 2 ) . ')';
+
+ $dir = opendir( $main_folder_name );
+ if ( $dir ) {
+ while ( false !== ( $file = readdir( $dir ) ) ) {
+ if ( ! in_array( $file, array( '.', '..' ) ) && is_dir( $main_folder_name . '/' . $file ) && ! in_array( trailingslashit( $main_folder_name . '/' . $file ), mainwp_backwpup_get_exclude_dirs( $main_folder_name ) ) ) {
+ $folder_size = ' (' . size_format( \BackWPup_File::get_folder_size( $main_folder_name . '/' . $file ), 2 ) . ')';
+ $return_temp[] = array(
+ 'size' => $folder_size,
+ 'name' => $file,
+ );
+
+ }
+ }
+
+ closedir( $dir );
+ }
+
+ $return[ $key ] = array(
+ 'size' => $main_folder_size,
+ 'name' => $folder,
+ 'folders' => $return_temp,
+ );
+ }
+ }
+
+ return array(
+ 'success' => 1,
+ 'folders' => $return,
+ );
+ }
+
+ /**
+ * Get Child Site Tables.
+ *
+ * @uses BackWPup_Option::get()
+ *
+ * @return array Query response containing the tables.
+ */
+ protected function get_child_tables() {
+
+ /** @global $wpdb wpdb */
+ global $wpdb;
+
+ $return = array();
+
+ $settings = $_POST['settings'];
+
+ if ( ! empty( $settings['dbhost'] ) && ! empty( $settings['dbuser'] ) ) {
+ $mysqli = new mysqli( $settings['dbhost'], $settings['dbuser'], ( isset( $settings['dbpassword'] ) ? $settings['dbpassword'] : '' ) ); // phpcs:ignore -- third party code.
+
+ if ( $mysqli->connect_error ) {
+ $return['message'] = $mysqli->connect_error;
+ } else {
+ if ( ! empty( $settings['dbname'] ) ) {
+ $res = $mysqli->query( 'SHOW FULL TABLES FROM `' . $mysqli->real_escape_string( $settings['dbname'] ) . '`' );
+ if ( $res ) {
+ $tables_temp = array();
+ while ( $table = $res->fetch_array( MYSQLI_NUM ) ) { // phpcs:ignore -- third party code.
+ $tables_temp[] = $table[0];
+ }
+
+ $res->close();
+ $return['tables'] = $tables_temp;
+ }
+ }
+
+ if ( empty( $settings['dbname'] ) || ! empty( $settings['first'] ) ) {
+ $res = $mysqli->query( 'SHOW DATABASES' );
+ if ( $res ) {
+ $databases_temp = array();
+ while ( $db = $res->fetch_array() ) {
+ $databases_temp[] = $db['Database'];
+ }
+
+ $res->close();
+ $return['databases'] = $databases_temp;
+ }
+ }
+ }
+ $mysqli->close();
+ } else {
+ $tables_temp = array();
+
+ $tables = $wpdb->get_results( 'SHOW FULL TABLES FROM `' . DB_NAME . '`', ARRAY_N ); // phpcs:ignore -- safe query.
+ foreach ( $tables as $table ) {
+ $tables_temp[] = $table[0];
+ }
+
+ $return['tables'] = $tables_temp;
+ }
+
+ if ( isset( $settings['job_id'] ) ) {
+ $return['dbdumpexclude'] = \BackWPup_Option::get( $settings['job_id'], 'dbdumpexclude' );
+ }
+ return array(
+ 'success' => 1,
+ 'return' => $return,
+ );
+ }
+
+ /**
+ * Insert or update global jobs.
+ *
+ * @uses MainWP_Child_Back_WP_Up::insert_or_update_jobs()
+ *
+ * @return array Response array containing job_id, changes & message array.
+ */
+ protected function insert_or_update_jobs_global() {
+ $settings = $_POST['settings'];
+
+ if ( ! is_array( $settings ) ) {
+ return array( 'error' => __( 'Missing array settings', 'mainwp-child' ) );
+ }
+
+ if ( ! isset( $settings['job_id'] ) ) {
+ return array( 'error' => __( 'Missing job_id', 'mainwp-child' ) );
+ }
+
+ if ( $settings['job_id'] > 0 ) {
+ $new_job_id = intval( $settings['job_id'] );
+ } else {
+ $new_job_id = null;
+ }
+
+ $changes_array = array();
+ $message_array = array();
+
+ foreach ( $settings['value'] as $key => $val ) {
+ $temp_array = array();
+ $temp_array['tab'] = $key;
+ $temp_array['value'] = $val;
+ if ( ! is_null( $new_job_id ) ) {
+ $temp_array['job_id'] = $new_job_id;
+ } else {
+ $temp_array['job_id'] = $settings['job_id'];
+ }
+
+ $_POST['settings'] = $temp_array;
+ $return = $this->insert_or_update_jobs();
+
+ if ( is_null( $new_job_id ) ) {
+ if ( ! isset( $return['job_id'] ) ) {
+ return array( 'error' => __( 'Missing new job_id', 'mainwp-child' ) );
+ }
+
+ $new_job_id = $return['job_id'];
+ }
+
+ // We want to exit gracefully.
+ if ( isset( $return['error_message'] ) ) {
+ $message_array[ $return['error_message'] ] = 1;
+ }
+
+ if ( isset( $return['changes'] ) ) {
+ $changes_array = array_merge( $changes_array, $return['changes'] );
+ }
+
+ if ( isset( $return['message'] ) ) {
+ foreach ( $return['message'] as $message ) {
+ if ( ! isset( $message_array[ $message ] ) ) {
+ $message_array[ $message ] = 1;
+ }
+ }
+ }
+ }
+
+ return array(
+ 'success' => 1,
+ 'job_id' => $new_job_id,
+ 'changes' => $changes_array,
+ 'message' => array_keys( $message_array ),
+ );
+ }
+
+ /**
+ * Edit form post save.
+ *
+ * Parses & saves files, folders, boolean fields excluding any unwanted files or directories.
+ * [Taken from BackWPup_JobType_File::edit_form_post_save with some tweaks].
+ *
+ * @uses BackWPup_Option::update()
+ *
+ * @param $post_data Post data to save.
+ * @param $id Post ID.
+ */
+ public function edit_form_post_save($post_data, $id ) {
+ // Parse and save files to exclude.
+ $exclude_input = $post_data['fileexclude'];
+ $to_exclude_list = $exclude_input ? str_replace( array( "\r\n", "\r" ), ',', $exclude_input ) : array();
+ if ( $to_exclude_list ) {
+ $to_exclude_list = sanitize_text_field( stripslashes( $to_exclude_list ) );
+ }
+ $to_exclude = $to_exclude_list ? explode( ',', $to_exclude_list ) : array();
+ $to_exclude_parsed = array();
+ foreach ( $to_exclude as $key => $value ) {
+ $normalized = wp_normalize_path( trim( $value ) );
+ if ( $normalized ) {
+ $to_exclude_parsed[ $key ] = $normalized;
+ }
+ }
+ sort( $to_exclude_parsed );
+ \BackWPup_Option::update( $id, 'fileexclude', implode( ',', $to_exclude_parsed ) );
+ unset( $exclude_input, $to_exclude_list, $to_exclude, $to_exclude_parsed, $normalized );
+
+ // Parse and save folders to include.
+ $include_input = $post_data['dirinclude'];
+ $include_list = $include_input ? str_replace( array( "\r\n", "\r" ), ',', $include_input ) : array();
+ $to_include = $include_list ? explode( ',', $include_list ) : array();
+ $to_include_parsed = array();
+ foreach ( $to_include as $key => $value ) {
+ $normalized = trailingslashit( wp_normalize_path( trim( $value ) ) );
+ if ( $normalized ) {
+ $normalized = filter_var( $normalized, FILTER_SANITIZE_URL );
+ }
+ $realpath = $normalized && '/' !== $normalized ? realpath( $normalized ) : false;
+ if ( $realpath ) {
+ $to_include_parsed[ $key ] = $realpath;
+ }
+ }
+ sort( $to_include_parsed );
+ \BackWPup_Option::update( $id, 'dirinclude', implode( ',', $to_include_parsed ) );
+ unset( $include_input, $include_list, $to_include, $to_include_parsed, $normalized, $realpath );
+
+ // Parse and save boolean fields.
+ $boolean_fields_def = array(
+ 'backupexcludethumbs' => FILTER_VALIDATE_BOOLEAN,
+ 'backupspecialfiles' => FILTER_VALIDATE_BOOLEAN,
+ 'backuproot' => FILTER_VALIDATE_BOOLEAN,
+ 'backupabsfolderup' => FILTER_VALIDATE_BOOLEAN,
+ 'backupcontent' => FILTER_VALIDATE_BOOLEAN,
+ 'backupplugins' => FILTER_VALIDATE_BOOLEAN,
+ 'backupthemes' => FILTER_VALIDATE_BOOLEAN,
+ 'backupuploads' => FILTER_VALIDATE_BOOLEAN,
+ );
+
+ foreach ( $boolean_fields_def as $key => $value ) {
+ \BackWPup_Option::update( $id, $key, ! empty( $post_data[ $key ] ) );
+ }
+ // Parse and save directories to exclude.
+ $exclude_dirs_def = array(
+ 'backuprootexcludedirs' => array(
+ 'filter' => FILTER_SANITIZE_URL,
+ 'flags' => FILTER_FORCE_ARRAY,
+ ),
+ 'backuppluginsexcludedirs' => array(
+ 'filter' => FILTER_SANITIZE_URL,
+ 'flags' => FILTER_FORCE_ARRAY,
+ ),
+ 'backupcontentexcludedirs' => array(
+ 'filter' => FILTER_SANITIZE_URL,
+ 'flags' => FILTER_FORCE_ARRAY,
+ ),
+ 'backupthemesexcludedirs' => array(
+ 'filter' => FILTER_SANITIZE_URL,
+ 'flags' => FILTER_FORCE_ARRAY,
+ ),
+ 'backupuploadsexcludedirs' => array(
+ 'filter' => FILTER_SANITIZE_URL,
+ 'flags' => FILTER_FORCE_ARRAY,
+ ),
+ );
+ foreach ( $exclude_dirs_def as $key => $filter ) {
+ $value = ! empty( $post_data[ $key ] ) && is_array( $post_data[ $key ] ) ? $post_data[ $key ] : array();
+ \BackWPup_Option::update( $id, $key, $value );
+ }
+ }
+
+ /**
+ * Insert or update jobs.
+ *
+ * @uses BackWPup_Option::get_job_ids()
+ * @uses BackWPup_Option::get()
+ * @uses BackWPup_Option::update()
+ * @uses BackWPup_Admin::get_messages()
+ * @uses BackWPup_Admin::message()
+ * @uses BackWPup_Job::get_jobrun_url()
+ * @uses BackWPup_Page_Editjob::save_post_form()
+ * @uses MainWP_Child_Back_WP_Up::edit_form_post_save()
+ * @uses MainWP_Child_Back_WP_Up::check_backwpup_messages()
+ *
+ * @return array Response array containing job_id, changes & message array.
+ */
+ protected function insert_or_update_jobs() {
+
+ $settings = $_POST['settings'];
+
+ if ( ! is_array( $settings ) || ! isset( $settings['value'] ) ) {
+ return array( 'error' => __( 'Missing array settings', 'mainwp-child' ) );
+ }
+
+ if ( ! isset( $settings['tab'] ) ) {
+ return array( 'error' => __( 'Missing tab', 'mainwp-child' ) );
+ }
+
+ if ( ! isset( $settings['job_id'] ) ) {
+ return array( 'error' => __( 'Missing job_id', 'mainwp-child' ) );
+ }
+
+ if ( ! class_exists( '\BackWPup' ) ) {
+ return array( 'error' => __( 'Install BackWPup on child website', 'mainwp-child' ) );
+ }
+
+ if ( $settings['job_id'] > 0 ) {
+ $job_id = intval( $settings['job_id'] );
+ } else {
+ // generate jobid if not exists.
+ $newjobid = \BackWPup_Option::get_job_ids();
+ sort( $newjobid );
+ $job_id = end( $newjobid ) + 1;
+ }
+
+ update_site_option( 'backwpup_messages', array() );
+
+ if ( isset( $settings['value']['backupdir'] ) && empty( $settings['value']['backupdir'] ) ) {
+ $backupdir = \BackWPup_Option::get( (int) $job_id, 'backupdir' );
+ if ( ! empty( $backupdir ) ) {
+ $settings['value']['backupdir'] = $backupdir;
+ }
+ }
+
+ foreach ( $settings['value'] as $key => $val ) {
+ $_POST[ $key ] = $val;
+ }
+
+ if ( 'jobtype-FILE' == $settings['tab'] ) {
+ $this->edit_form_post_save( $settings['value'], $job_id );
+ $messages = \BackWPup_Admin::get_messages();
+ if ( empty( $messages['error'] ) ) {
+ $url = \BackWPup_Job::get_jobrun_url( 'runnowlink', $job_id );
+ \BackWPup_Admin::message( sprintf( __( 'Changes for job