Files
wingedit.pl/wp-content/plugins/wpvivid-backuprestore/includes/new_backup/class-wpvivid-restore-file-2.php
2026-03-11 15:57:27 +01:00

768 lines
26 KiB
PHP

<?php
if (!defined('WPVIVID_PLUGIN_DIR'))
{
die;
}
class WPvivid_Restore_File_2
{
public $log;
public function __construct($log=false)
{
$this->log=$log;
}
public function restore($sub_task,$backup_id)
{
if($sub_task['type']=='wp-core')
{
return $this->restore_core($sub_task,$backup_id);
}
$files=$sub_task['unzip_file']['files'];
$GLOBALS['wpvivid_restore_addon_type'] =$sub_task['type'];
//restore_reset
foreach ($files as $index=>$file)
{
if($file['finished']==1)
{
continue;
}
$sub_task['unzip_file']['last_action']='Unzipping';
$sub_task['unzip_file']['last_unzip_file']=$file['file_name'];
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['file_name'].'</span>';
$this->update_sub_task($sub_task);
$backup = WPvivid_Backuplist::get_backup_by_id($backup_id);
$backup_item = new WPvivid_Backup_Item($backup);
$extract_child_finished=isset($file['extract_child_finished'])?$file['extract_child_finished']:0;
if(isset($file['has_child'])&&$extract_child_finished==0)
{
$sub_task['unzip_file']['last_action']='Unzipping';
$sub_task['unzip_file']['last_unzip_file']=$file['parent_file'];
$sub_task['unzip_file']['last_unzip_file_index']=0;
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['parent_file'].'</span>';
$this->update_sub_task($sub_task);
$root_path=$backup_item->get_local_path();
if(!file_exists($root_path))
{
@mkdir($root_path);
}
$this->log->WriteLog('Extracting file:'.$file['parent_file'],'notice');
$extract_files[]=$file['file_name'];
$ret=$this->extract_ex($root_path.$file['parent_file'],$extract_files,untrailingslashit($root_path),$sub_task['options']);
if($ret['result']!='success')
{
return $ret;
}
$this->log->WriteLog('Extracting file:'.$file['parent_file'].' succeeded.','notice');
$file_name=$root_path.$file['file_name'];
$sub_task['unzip_file']['files'][$index]['extract_child_finished']=1;
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['parent_file'].' completed.</span>';
$this->update_sub_task($sub_task);
}
else
{
$root_path=$backup_item->get_local_path();
$file_name=$root_path.$file['file_name'];
}
$root_path = '';
if (isset($file['options']['root']))
{
$root_path = $this->transfer_path(get_home_path() . $file['options']['root']);
}
else if (isset($file['options']['root_flag']))
{
if ($file['options']['root_flag'] == WPVIVID_BACKUP_ROOT_WP_CONTENT)
{
$root_path = $this->transfer_path(WP_CONTENT_DIR);
}
else if ($file['options']['root_flag'] == WPVIVID_BACKUP_ROOT_CUSTOM)
{
$root_path = $this->transfer_path(WP_CONTENT_DIR . DIRECTORY_SEPARATOR . WPvivid_Setting::get_backupdir());
}
else if ($file['options']['root_flag'] == WPVIVID_BACKUP_ROOT_WP_ROOT)
{
$root_path = $this->transfer_path(ABSPATH);
}
else if($file['options']['root_flag'] == WPVIVID_BACKUP_ROOT_WP_UPLOADS)
{
$upload_dir = wp_upload_dir();
$upload_path = $upload_dir['basedir'];
$root_path = $this->transfer_path($upload_path);
}
}
if($sub_task['restore_reset'])
{
if($sub_task['restore_reset_finished']===false)
{
$sub_task['unzip_file']['last_action']='Unzipping';
$sub_task['last_msg']='<span>Cleaning folder:</span><span>'.$sub_task['type'].'</span>';
$this->update_sub_task($sub_task);
$this->log->WriteLog('Cleaning folder:'.$sub_task['type'],'notice');
$this->reset_restore($sub_task['type']);
$sub_task['restore_reset_finished']=true;
$sub_task['unzip_file']['last_action']='Unzipping';
$sub_task['last_msg']='<span>Cleaning folder:</span><span>'.$sub_task['type'].' completed.</span>';
$this->update_sub_task($sub_task);
}
}
$root_path = rtrim($root_path, '/');
$root_path = rtrim($root_path, DIRECTORY_SEPARATOR);
$restore_task=get_option('wpvivid_restore_task',array());
$restore_detail_options=$restore_task['restore_detail_options'];
$unzip_files_pre_request=$restore_detail_options['unzip_files_pre_request'];
$use_index=$restore_detail_options['use_index'];
if($use_index==false)
{
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['file_name'].'</span>';
$sub_task['unzip_file']['last_action']='Unzipping';
$sub_task['unzip_file']['last_unzip_file']=$file['file_name'];
$sub_task['unzip_file']['last_unzip_file_index']=0;
$this->update_sub_task($sub_task);
$this->log->WriteLog('Extracting file:'.$file_name,'notice');
$ret=$this->extract($file_name,untrailingslashit($root_path),$sub_task['options']);
if($ret['result']!='success')
{
return $ret;
}
$this->log->WriteLog('Extracting file:'.$file_name.' succeeded','notice');
$sub_task['unzip_file']['files'][$index]['finished']=1;
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['file_name'].' completed.</span>';
}
else
{
$sum=$this->get_zip_file_count($file_name);
$start=$file['index'];
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['file_name'].' '.$start.'/'.$sum.'</span>';
$sub_task['unzip_file']['sum']=$sum;
$sub_task['unzip_file']['start']=$start;
$sub_task['unzip_file']['last_action']='Unzipping';
$sub_task['unzip_file']['last_unzip_file']=$file['file_name'];
$sub_task['unzip_file']['last_unzip_file_index']=$start;
$this->update_sub_task($sub_task);
$this->log->WriteLog('Extracting file:'.basename($file_name).' index:'.$start,'notice');
$ret=$this->extract_by_index($file_name,untrailingslashit($root_path),$start,$start+$unzip_files_pre_request,$sub_task['options']);
if($ret['result']!='success')
{
return $ret;
}
$this->log->WriteLog('Extracting file:'.basename($file_name).' index:'.$start.' finished.','notice');
$sub_task['unzip_file']['files'][$index]['index']=$start+$unzip_files_pre_request;
$sub_task['unzip_file']['last_action']='Unzipping';
if($start+$unzip_files_pre_request>=$sum)
{
$sub_task['unzip_file']['files'][$index]['finished']=1;
$sub_task['unzip_file']['sum']=0;
$sub_task['unzip_file']['start']=0;
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['file_name'].' completed.</span>';
}
else
{
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['file_name'].' '.$sub_task['unzip_file']['files'][$index]['index'].'/'.$sum.'</span>';
}
}
break;
}
if($this->check_restore_finished($sub_task))
{
$sub_task['finished']=1;
$sub_task['unzip_file']['unzip_finished']=1;
$sub_task['unzip_file']['sum']=0;
$sub_task['unzip_file']['start']=0;
}
$ret['result']='success';
$ret['sub_task']=$sub_task;
return $ret;
}
public function restore_core($sub_task,$backup_id)
{
$files=$sub_task['unzip_file']['files'];
$GLOBALS['wpvivid_restore_addon_type'] =$sub_task['type'];
//restore_reset
foreach ($files as $index=>$file)
{
if($file['finished']==1)
{
continue;
}
$sub_task['unzip_file']['last_action']='Unzipping';
$sub_task['unzip_file']['last_unzip_file']=$file['file_name'];
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['file_name'].'</span>';
$this->update_sub_task($sub_task);
$backup = WPvivid_Backuplist::get_backup_by_id($backup_id);
$backup_item = new WPvivid_Backup_Item($backup);
$extract_child_finished=isset($file['extract_child_finished'])?$file['extract_child_finished']:0;
if(isset($file['has_child'])&&$extract_child_finished==0)
{
$sub_task['unzip_file']['last_action']='Unzipping';
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['parent_file'].'</span>';
$this->update_sub_task($sub_task);
$root_path=$backup_item->get_local_path();
if(!file_exists($root_path))
{
@mkdir($root_path);
}
$this->log->WriteLog('Extracting file:'.$file['parent_file'],'notice');
$extract_files[]=$file['file_name'];
$ret=$this->extract_ex($root_path.$file['parent_file'],$extract_files,untrailingslashit($root_path),$sub_task['options']);
if($ret['result']!='success')
{
return $ret;
}
$this->log->WriteLog('Extracting file:'.$file['parent_file'].' succeeded.','notice');
$file_name=$root_path.$file['file_name'];
$sub_task['unzip_file']['files'][$index]['extract_child_finished']=1;
$sub_task['last_msg']='<span><strong>Extracting file:</strong></span><span>'.$file['parent_file'].' completed.</span>';
$this->update_sub_task($sub_task);
}
else
{
$root_path=$backup_item->get_local_path();
$file_name=$root_path.$file['file_name'];
}
if($sub_task['restore_reset'])
{
if($sub_task['restore_reset_finished']===false)
{
$sub_task['unzip_file']['last_action']='Unzipping';
$sub_task['last_msg']='<span>Cleaning folder:</span><span>'.$sub_task['type'].'</span>';
$this->update_sub_task($sub_task);
$this->log->WriteLog('Cleaning folder:'.$sub_task['type'],'notice');
$this->reset_restore($sub_task['type']);
$sub_task['restore_reset_finished']=true;
$sub_task['unzip_file']['last_action']='Unzipping';
$sub_task['last_msg']='<span>Cleaning folder:</span><span>'.$sub_task['type'].' completed.</span>';
$this->update_sub_task($sub_task);
}
}
$root_path = $this->transfer_path(ABSPATH);
$root_path = rtrim($root_path, '/');
$root_path = rtrim($root_path, DIRECTORY_SEPARATOR);
$sub_task['last_msg']='<span><strong>Extracting Files:</strong></span><span>'.$file['file_name'].'</span>';
$sub_task['unzip_file']['last_action']='Unzipping';
$this->update_sub_task($sub_task);
$this->log->WriteLog('Extracting file:'.basename($file_name),'notice');
$ret=$this->extract($file_name,untrailingslashit($root_path),$sub_task['options']);
if($ret['result']!='success')
{
return $ret;
}
$this->log->WriteLog('Extracting file:'.basename($file_name).' succeeded.','notice');
$sub_task['unzip_file']['files'][$index]['finished']=1;
$sub_task['last_msg']='<span><strong>Extracting Files:</strong></span><span>'.$file['file_name'].' finished</span>';
$this->update_sub_task($sub_task);
}
if($this->check_restore_finished($sub_task))
{
$sub_task['finished']=1;
$sub_task['unzip_file']['unzip_finished']=1;
}
$ret['result']='success';
$ret['sub_task']=$sub_task;
return $ret;
}
public function extract($file_name,$root_path,$option)
{
if (!class_exists('WPvivid_PclZip'))
include_once WPVIVID_PLUGIN_DIR . '/includes/zip/class-wpvivid-pclzip.php';
if(!empty($option))
{
$GLOBALS['wpvivid_restore_option'] = $option;
}
if(!defined('PCLZIP_TEMPORARY_DIR'))
define(PCLZIP_TEMPORARY_DIR,dirname($root_path));
$archive = new WPvivid_PclZip($file_name);
$zip_ret = $archive->extract(WPVIVID_PCLZIP_OPT_PATH, $root_path,WPVIVID_PCLZIP_OPT_REPLACE_NEWER,WPVIVID_PCLZIP_CB_PRE_EXTRACT,'wpvivid_function_pre_extract_callback_2',WPVIVID_PCLZIP_OPT_TEMP_FILE_THRESHOLD,16);
if(!$zip_ret)
{
$ret['result']='failed';
$ret['error'] = $archive->errorInfo(true);
$this->log->WriteLog('Extracting failed. Error:'.$archive->errorInfo(true),'notice');
}
else
{
$ret['result']='success';
}
return $ret;
}
public function extract_ex($file_name,$extract_files,$root_path,$option)
{
if (!class_exists('WPvivid_PclZip'))
include_once WPVIVID_PLUGIN_DIR . '/includes/zip/class-wpvivid-pclzip.php';
if(!empty($option))
{
$GLOBALS['wpvivid_restore_option'] = $option;
}
if(!defined('PCLZIP_TEMPORARY_DIR'))
define(PCLZIP_TEMPORARY_DIR,dirname($root_path));
$archive = new WPvivid_PclZip($file_name);
$zip_ret = $archive->extract(WPVIVID_PCLZIP_OPT_BY_NAME,$extract_files,WPVIVID_PCLZIP_OPT_PATH, $root_path,WPVIVID_PCLZIP_OPT_REPLACE_NEWER,WPVIVID_PCLZIP_CB_PRE_EXTRACT,'wpvivid_function_pre_extract_callback_2',WPVIVID_PCLZIP_OPT_TEMP_FILE_THRESHOLD,16);
if(!$zip_ret)
{
$ret['result']='failed';
$ret['error'] = $archive->errorInfo(true);
$this->log->WriteLog('Extracting failed. Error:'.$archive->errorInfo(true),'notice');
}
else
{
$ret['result']='success';
}
return $ret;
}
public function extract_by_index($file_name,$root_path,$start,$end,$option)
{
$index=$start.'-'.$end;
if (!class_exists('WPvivid_PclZip'))
include_once WPVIVID_PLUGIN_DIR . '/includes/zip/class-wpvivid-pclzip.php';
if(!empty($option))
{
$GLOBALS['wpvivid_restore_option'] = $option;
}
if(!defined('PCLZIP_TEMPORARY_DIR'))
define(PCLZIP_TEMPORARY_DIR,dirname($root_path));
$archive = new WPvivid_PclZip($file_name);
$zip_ret = $archive->extractByIndex($index,WPVIVID_PCLZIP_OPT_PATH, $root_path,WPVIVID_PCLZIP_OPT_REPLACE_NEWER,WPVIVID_PCLZIP_CB_PRE_EXTRACT,'wpvivid_function_pre_extract_callback_2',WPVIVID_PCLZIP_OPT_TEMP_FILE_THRESHOLD,16);
if(!$zip_ret)
{
$ret['result']='failed';
$ret['error'] = $archive->errorInfo(true);
$this->log->WriteLog('Extracting failed. Error:'.$archive->errorInfo(true),'notice');
}
else
{
$ret['result']='success';
}
return $ret;
}
public function get_zip_file_count($file_name)
{
if (!class_exists('WPvivid_PclZip'))
include_once WPVIVID_PLUGIN_DIR . '/includes/zip/class-wpvivid-pclzip.php';
$archive = new WPvivid_PclZip($file_name);
$properties=$archive->properties();
return $properties['nb'];
}
public function check_restore_finished($sub_task)
{
$finished=true;
$files=$sub_task['unzip_file']['files'];
foreach ($files as $index=>$file)
{
if($file['finished']==1)
{
continue;
}
else
{
$finished=false;
}
}
return $finished;
}
private function transfer_path($path)
{
$path = str_replace('\\','/',$path);
$values = explode('/',$path);
return implode(DIRECTORY_SEPARATOR,$values);
}
public function update_sub_task($sub_task=false)
{
$restore_task=get_option('wpvivid_restore_task',array());
if($restore_task['do_sub_task']!==false)
{
$key=$restore_task['do_sub_task'];
$restore_task['update_time']=time();
if($sub_task!==false)
$restore_task['sub_tasks'][$key]=$sub_task;
update_option('wpvivid_restore_task',$restore_task,'no');
}
}
public function reset_restore($type)
{
if($type=='themes')
{
return $this->delete_themes();
}
else if($type=='plugin')
{
return $this->delete_plugins();
}
else if($type=='upload')
{
return $this->delete_uploads();
}
else if($type=='wp-content')
{
return $this->delete_wp_content();
}
//else if($type=='mu_plugins')
//{
// return $this->delete_mu_plugins();
//}
else if($type=='wp-core')
{
return $this->delete_core();
}
$ret['result']='success';
return $ret;
}
public function delete_themes()
{
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));
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 delete_plugins()
{
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';
$all_plugins = get_plugins();
unset($all_plugins[$wpvivid_backup_pro]);
unset($all_plugins[$wpvivid_backup]);
if (!empty($all_plugins))
{
$this->_delete_plugins(array_keys($all_plugins));
}
$ret['result']=WPVIVID_SUCCESS;
return $ret;
}
public function _delete_plugins($plugins)
{
if ( empty( $plugins ) )
{
return false;
}
$plugins_dir = trailingslashit( WP_PLUGIN_DIR );
foreach ( $plugins as $plugin_file )
{
$this_plugin_dir = trailingslashit( dirname( $plugins_dir . $plugin_file ) );
// If plugin is in its own directory, recursively delete the directory.
if ( strpos( $plugin_file, '/' ) && $this_plugin_dir != $plugins_dir )
{ //base check on if plugin includes directory separator AND that it's not the root plugin folder
$this->delete_folder($this_plugin_dir,$plugins_dir);
} else {
@wp_delete_file($plugins_dir . $plugin_file);
}
}
return true;
}
public function delete_uploads()
{
$upload_dir = wp_get_upload_dir();
$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 {
@wp_delete_file($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;
$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()
{
$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_core()
{
$ret['result']=WPVIVID_SUCCESS;
require_once( ABSPATH . 'wp-admin/includes/update-core.php' );
global $_old_files;
$wp_dir = ABSPATH;
foreach ( $_old_files as $old_file )
{
$old_file = $wp_dir . $old_file;
if ( ! file_exists( $old_file ) )
{
continue;
}
// If the file isn't deleted, try writing an empty string to the file instead.
@wp_delete_file($old_file);
}
return $ret;
}
}
function wpvivid_function_pre_extract_callback_2($p_event, &$p_header)
{
$plugins = substr(WP_PLUGIN_DIR, strpos(WP_PLUGIN_DIR, 'wp-content/'));
if ( isset( $GLOBALS['wpvivid_restore_option'] ) )
{
$option = $GLOBALS['wpvivid_restore_option'];
$type=$GLOBALS['wpvivid_restore_addon_type'];
if ($type == 'themes')
{
if (isset($option['remove_themes']))
{
foreach ($option['remove_themes'] as $slug => $themes)
{
if (empty($slug))
continue;
if(strpos($p_header['filename'],$plugins.DIRECTORY_SEPARATOR.$slug)!==false)
{
return 0;
}
}
}
}
else if ($type == 'plugin')
{
if (isset($option['remove_plugins']))
{
foreach ($option['remove_plugins'] as $slug => $plugin)
{
if (empty($slug))
continue;
if(strpos($p_header['filename'],$plugins.'/'.$slug)!==false)
{
return 0;
}
}
}
}
}
else
{
$option=array();
}
$path = str_replace('\\','/',WP_CONTENT_DIR);
$content_path = $path.'/';
if(strpos($p_header['filename'], $content_path.'advanced-cache.php')!==false)
{
return 0;
}
if(strpos($p_header['filename'], $content_path.'db.php')!==false)
{
return 0;
}
if(strpos($p_header['filename'], $content_path.'object-cache.php')!==false)
{
return 0;
}
if(strpos($p_header['filename'],$plugins.'/wpvivid-backuprestore')!==false)
{
return 0;
}
if(strpos($p_header['filename'],'wp-config.php')!==false)
{
return 0;
}
if(strpos($p_header['filename'],'wpvivid_package_info.json')!==false)
{
return 0;
}
if(isset($option['restore_htaccess'])&&$option['restore_htaccess'])
{
}
else
{
if(strpos($p_header['filename'],'.htaccess')!==false)
{
return 0;
}
}
if(strpos($p_header['filename'],'.user.ini')!==false)
{
return 0;
}
if(strpos($p_header['filename'],'wordfence-waf.php')!==false)
{
return 0;
}
if(strpos($p_header['filename'], $content_path.'mu-plugins/endurance-browser-cache.php')!==false)
{
return 0;
}
if(strpos($p_header['filename'], $content_path.'mu-plugins/endurance-page-cache.php')!==false)
{
return 0;
}
if(strpos($p_header['filename'], $content_path.'mu-plugins/endurance-php-edge.php')!==false)
{
return 0;
}
if(strpos($p_header['filename'], $content_path.'mu-plugins/wp-stack-cache.php')!==false)
{
return 0;
}
if(strpos($p_header['filename'], '.DS_Store')!==false)
{
return 0;
}
return 1;
}