Server : LiteSpeed System : Linux server321.web-hosting.com 4.18.0-513.18.1.lve.el8.x86_64 #1 SMP Thu Feb 22 12:55:50 UTC 2024 x86_64 User : apotdzgr ( 7060) PHP Version : 8.0.30 Disable Function : NONE Directory : /home/apotdzgr/www/wp-content/plugins/wpvivid-backuprestore/includes/ |
Upload File : |
<?php if (!defined('WPVIVID_PLUGIN_DIR')){ die; } include_once plugin_dir_path( dirname( __FILE__ ) ) .'includes/class-wpvivid-restore-database.php'; include_once plugin_dir_path( dirname( __FILE__ ) ) .'includes/class-wpvivid-restore-site.php'; include_once plugin_dir_path( dirname( __FILE__ ) ) .'includes/class-wpvivid-log.php'; include_once plugin_dir_path( dirname( __FILE__ ) ) .'includes/class-wpvivid-zipclass.php'; class WPvivid_Restore { public function restore() { $general_setting=WPvivid_Setting::get_setting(true, ""); if(isset($general_setting['options']['wpvivid_common_setting']['restore_max_execution_time'])){ $restore_max_execution_time = intval($general_setting['options']['wpvivid_common_setting']['restore_max_execution_time']); } else{ $restore_max_execution_time = WPVIVID_RESTORE_MAX_EXECUTION_TIME; } @set_time_limit($restore_max_execution_time); global $wpvivid_plugin; $next_task=$wpvivid_plugin->restore_data->get_next_restore_task(); if($next_task===false) { $wpvivid_plugin->restore_data->write_log('Restore task completed.','notice'); $wpvivid_plugin->restore_data->update_status(WPVIVID_RESTORE_COMPLETED); return array('result'=>WPVIVID_SUCCESS); } else if($next_task===WPVIVID_RESTORE_RUNNING) { $wpvivid_plugin->restore_data->write_log('A restore task is already running.','error'); return array('result'=>WPVIVID_FAILED,'error'=> 'A restore task is already running.'); } else { $result = $this -> execute_restore($next_task); $wpvivid_plugin->restore_data->update_sub_task($next_task['index'],$result); if($result['result'] != WPVIVID_SUCCESS) { $wpvivid_plugin->restore_data->update_error($result['error']); $wpvivid_plugin->restore_data->write_log($result['error'],'error'); return array('result'=>WPVIVID_FAILED,'error'=>$result['error']); } else { $wpvivid_plugin->restore_data->update_status(WPVIVID_RESTORE_WAIT); return array('result'=> WPVIVID_SUCCESS); } } } function execute_restore($restore_task) { global $wpvivid_plugin; $backup=$wpvivid_plugin->restore_data->get_backup_data(); $backup_item=new WPvivid_Backup_Item($backup); $json=$backup_item->get_file_info($restore_task['files'][0]); $option=array(); if($json!==false) { $option=$json; } $option=array_merge($option,$restore_task['option']); if(isset($restore_task['reset'])) { $wpvivid_plugin->restore_data->write_log('Start resetting '.$restore_task['reset'],'notice'); $ret= $this->reset_restore($restore_task); $wpvivid_plugin->restore_data->write_log('Finished resetting '.$restore_task['reset'],'notice'); return $ret; } $is_type_db = false; $is_type_db = apply_filters('wpvivid_check_type_database', $is_type_db, $option); if($is_type_db) { $restore_site = new WPvivid_RestoreSite(); $wpvivid_plugin->restore_data->write_log('Start restoring '.$restore_task['files'][0],'notice'); $ret= $restore_site -> restore($option,$restore_task['files']); if($ret['result']==WPVIVID_SUCCESS) { if(isset($option['is_crypt'])&&$option['is_crypt']=='1') { $sql_file = $backup_item->get_sql_file($restore_task['files'][0]); $local_path= $wpvivid_plugin->get_backup_folder(); //$backup_item->get_local_path(); $ret=$this->restore_crypt_db($sql_file,$restore_task,$option,$local_path); return $ret; } $path = $wpvivid_plugin->get_backup_folder().WPVIVID_DEFAULT_ROLLBACK_DIR.DIRECTORY_SEPARATOR.'wpvivid_old_database'.DIRECTORY_SEPARATOR; //$path = $backup_item->get_local_path().WPVIVID_DEFAULT_ROLLBACK_DIR.DIRECTORY_SEPARATOR.'wpvivid_old_database'.DIRECTORY_SEPARATOR; $sql_file = $backup_item->get_sql_file($restore_task['files'][0]); $wpvivid_plugin->restore_data->write_log('sql file: '.$sql_file,'notice'); $restore_db=new WPvivid_RestoreDB(); $check_is_remove = false; $check_is_remove = apply_filters('wpvivid_check_remove_restore_database', $check_is_remove, $option); if(!$check_is_remove) { $ret = $restore_db->restore($path, $sql_file, $option); $wpvivid_plugin->restore_data->write_log('Finished restoring '.$restore_task['files'][0],'notice'); $wpvivid_plugin->restore_data->update_need_unzip_file($restore_task['index'],$restore_task['files']); } else{ $wpvivid_plugin->restore_data->write_log('Remove file: '.$path.$sql_file, 'notice'); $wpvivid_plugin->restore_data->update_need_unzip_file($restore_task['index'],$restore_task['files']); $ret['result']=WPVIVID_SUCCESS; } return $ret; } else{ return $ret; } } else { $restore_site = new WPvivid_RestoreSite(); $files=$wpvivid_plugin->restore_data->get_need_unzip_file($restore_task); $json=$backup_item->get_file_info($files[0]); $option=array(); if($json!==false) { $option=$json; } $option=array_merge($option,$restore_task['option']); $wpvivid_plugin->restore_data->write_log('Start restoring '.$files[0],'notice'); $ret= $restore_site -> restore($option,$files); $wpvivid_plugin->restore_data->update_need_unzip_file($restore_task['index'],$files); $wpvivid_plugin->restore_data->write_log('Finished restoring '.$files[0],'notice'); return $ret; } } public function restore_crypt_db($file,$restore_task,$option,$local_path) { $general_setting=WPvivid_Setting::get_setting(true, ""); if(isset($general_setting['options']['wpvivid_common_setting']['encrypt_db'])&&$general_setting['options']['wpvivid_common_setting']['encrypt_db'] == '1') { global $wpvivid_plugin; $wpvivid_plugin->restore_data->write_log('Encrypted database detected. Start decrypting database.','notice'); $general_setting=WPvivid_Setting::get_setting(true, ""); $password=$general_setting['options']['wpvivid_common_setting']['encrypt_db_password']; if(empty($password)) { $ret['result']=WPVIVID_FAILED; $ret['error']='Failed to decrypt backup. A password was not set in the plugin settings.'; return $ret; } $crypt=new WPvivid_Crypt_File($password); $path=$local_path.WPVIVID_DEFAULT_ROLLBACK_DIR.DIRECTORY_SEPARATOR.'wpvivid_old_database'; $ret=$crypt->decrypt($path.DIRECTORY_SEPARATOR.$file); if($ret['result']=='success') { $zip = new WPvivid_ZipClass(); $all_files = array(); $all_files[] = $ret['file_path']; $file_path=$ret['file_path']; $ret= $zip -> extract($all_files,$path); if($ret['result']!=='success') { $ret['error']='Failed to unzip the file. Maybe the password is incorrect. Please check your password and try again.'; return $ret; } $wpvivid_plugin->restore_data->write_log('Decrypting database successfully. Start restoring database.','notice'); $files = $zip->list_file($file_path); unset($zip); $sql_file=$files[0]['file_name']; $wpvivid_plugin->restore_data->write_log('sql file: '.$sql_file,'notice'); $restore_db=new WPvivid_RestoreDB(); $check_is_remove = false; $check_is_remove = apply_filters('wpvivid_check_remove_restore_database', $check_is_remove, $option); if(!$check_is_remove) { $ret = $restore_db->restore($path.DIRECTORY_SEPARATOR, $sql_file, $option); @unlink($file_path); $wpvivid_plugin->restore_data->write_log('Finished restoring '.$restore_task['files'][0],'notice'); $wpvivid_plugin->restore_data->update_need_unzip_file($restore_task['index'],$restore_task['files']); } else{ @unlink($file_path); $wpvivid_plugin->restore_data->write_log('Remove file: '.$path.$sql_file, 'notice'); $wpvivid_plugin->restore_data->update_need_unzip_file($restore_task['index'],$restore_task['files']); $ret['result']=WPVIVID_SUCCESS; } return $ret; } else { return $ret; } } else { $ret['result']=WPVIVID_FAILED; $ret['error']='Failed to decrypt backup. A password was not set in the plugin settings.'; return $ret; } } public function reset_restore($restore_task) { $ret['result']=WPVIVID_SUCCESS; if($restore_task['reset']=='themes') { return $this->delete_themes(); } else if($restore_task['reset']=='deactivate_plugins') { return $this->deactivate_plugins(); } else if($restore_task['reset']=='plugins') { return $this->delete_plugins(); } else if($restore_task['reset']=='uploads') { return $this->delete_uploads(); } else if($restore_task['reset']=='wp_content') { return $this->delete_wp_content(); } else if($restore_task['reset']=='mu_plugins') { return $this->delete_mu_plugins(); } else if($restore_task['reset']=='tables') { return $this->delete_tables(); } return $ret; } public function delete_themes() { global $wpvivid_plugin; if (!function_exists('delete_theme')) { require_once ABSPATH . 'wp-admin/includes/theme.php'; } if (!function_exists('request_filesystem_credentials')) { require_once ABSPATH . 'wp-admin/includes/file.php'; } $all_themes = wp_get_themes(array('errors' => null)); $wpvivid_plugin->restore_data->write_log('Deleting all themes','notice'); foreach ($all_themes as $theme_slug => $theme_details) { delete_theme($theme_slug); } update_option('template', ''); update_option('stylesheet', ''); update_option('current_theme', ''); $ret['result']=WPVIVID_SUCCESS; return $ret; } public function deactivate_plugins() { global $wpvivid_plugin; if (!function_exists('get_plugins')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } if (!function_exists('request_filesystem_credentials')) { require_once ABSPATH . 'wp-admin/includes/file.php'; } $wpvivid_plugin->restore_data->write_log('Deactivating all plugins','notice'); $active_plugins = (array) get_option('active_plugins', array()); $wpvivid_backup_pro='wpvivid-backup-pro/wpvivid-backup-pro.php'; $wpvivid_backup='wpvivid-backuprestore/wpvivid-backuprestore.php'; $wpvivid_dashboard='wpvividdashboard/wpvividdashboard.php'; if (($key = array_search($wpvivid_backup_pro, $active_plugins)) !== false) { unset($active_plugins[$key]); } if (($key = array_search($wpvivid_backup, $active_plugins)) !== false) { unset($active_plugins[$key]); } if (($key = array_search($wpvivid_dashboard, $active_plugins)) !== false) { unset($active_plugins[$key]); } if (!empty($active_plugins)) { deactivate_plugins($active_plugins, true, false); } $ret['result']=WPVIVID_SUCCESS; return $ret; } public function delete_plugins() { global $wpvivid_plugin; if (!function_exists('get_plugins')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } if (!function_exists('request_filesystem_credentials')) { require_once ABSPATH . 'wp-admin/includes/file.php'; } $wpvivid_backup_pro='wpvivid-backup-pro/wpvivid-backup-pro.php'; $wpvivid_backup='wpvivid-backuprestore/wpvivid-backuprestore.php'; $wpvivid_dashboard='wpvividdashboard/wpvividdashboard.php'; $wpvivid_plugin->restore_data->write_log('Deleting all plugins','notice'); $all_plugins = get_plugins(); unset($all_plugins[$wpvivid_backup_pro]); unset($all_plugins[$wpvivid_backup]); unset($all_plugins[$wpvivid_dashboard]); if (!empty($all_plugins)) { delete_plugins(array_keys($all_plugins)); } $ret['result']=WPVIVID_SUCCESS; return $ret; } public function delete_uploads() { global $wpvivid_plugin; $upload_dir = wp_get_upload_dir(); $wpvivid_plugin->restore_data->write_log('Deleting uploads','notice'); $this->delete_folder($upload_dir['basedir'], $upload_dir['basedir']); $ret['result']=WPVIVID_SUCCESS; return $ret; } public function delete_folder($folder, $base_folder) { $files = array_diff(scandir($folder), array('.', '..')); foreach ($files as $file) { if (is_dir($folder . DIRECTORY_SEPARATOR . $file)) { $this->delete_folder($folder . DIRECTORY_SEPARATOR . $file, $base_folder); } else { @unlink($folder . DIRECTORY_SEPARATOR . $file); } } // foreach if ($folder != $base_folder) { $tmp = @rmdir($folder); return $tmp; } else { return true; } } public function delete_wp_content() { global $wpvivid_plugin; $wpvivid_plugin->restore_data->write_log('Deleting wp_content','notice'); $wp_content_dir = trailingslashit(WP_CONTENT_DIR); $wpvivid_backup=WPvivid_Setting::get_backupdir(); $whitelisted_folders = array('mu-plugins', 'plugins', 'themes', 'uploads',$wpvivid_backup); $dirs = glob($wp_content_dir . '*', GLOB_ONLYDIR); foreach ($dirs as $dir) { if (false == in_array(basename($dir), $whitelisted_folders)) { $this->delete_folder($dir, $dir); @rmdir($dir); } } $ret['result']=WPVIVID_SUCCESS; return $ret; } public function delete_mu_plugins() { global $wpvivid_plugin; $wpvivid_plugin->restore_data->write_log('Deleting mu_plugins','notice'); $ret['result']=WPVIVID_SUCCESS; $mu_plugins = get_mu_plugins(); if(empty($mu_plugins)) { return $ret; } $this->delete_folder(WPMU_PLUGIN_DIR, WPMU_PLUGIN_DIR); return $ret; } public function delete_tables() { global $wpvivid_plugin,$wpdb; $wpvivid_plugin->restore_data->write_log('Deleting tables','notice'); $tables = $this->get_tables(); foreach ($tables as $table_name) { $wpdb->query('SET foreign_key_checks = 0'); $wpdb->query('DROP TABLE IF EXISTS ' . $table_name); $wpvivid_plugin->restore_data->write_log('DROP TABLE:'.$table_name,'notice'); } $ret['result']=WPVIVID_SUCCESS; return $ret; } public function get_tables() { global $wpdb; $tables = array(); $core_tables=array(); $core_tables[]='commentmeta'; $core_tables[]='comments'; $core_tables[]='links'; $core_tables[]='options'; $core_tables[]='postmeta'; $core_tables[]='posts'; $core_tables[]='term_relationships'; $core_tables[]='term_taxonomy'; $core_tables[]='termmeta'; $core_tables[]='terms'; $core_tables[]='usermeta'; $core_tables[]='users'; $core_tables[]='blogs'; $core_tables[]='blogmeta'; $core_tables[]='site'; $core_tables[]='sitemeta'; $sql=$wpdb->prepare("SHOW TABLES LIKE %s;", $wpdb->esc_like($wpdb->base_prefix) . '%'); $result = $wpdb->get_results($sql, OBJECT_K); if(!empty($result)) { foreach ($result as $table_name=>$value) { if(in_array(substr($table_name, strlen($wpdb->base_prefix)),$core_tables)) { continue; } else { $tables[]=$table_name; } } } return $tables; } }