38217-vm/wp-content/plugins/mainwp/class/class-mainwp-post-backup-handler.php
2026-02-05 17:08:59 +03:00

621 lines
25 KiB
PHP

<?php
/**
* This class handles the MainWP Post Backups.
*
* @package MainWP/Dashboard
*/
namespace MainWP\Dashboard;
/**
* Class MainWP_Post_Backup_Handler
*
* Handle Backup Post.
*
* @package MainWP\Dashboard
*
* @uses \MainWP\Dashboard\MainWP_Post_Base_Handler
*/
class MainWP_Post_Backup_Handler extends MainWP_Post_Base_Handler { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
/**
* Instance class.
*
* @var $instance Singleton MainWP_Post_Backup_Handler.
*/
private static $instance = null;
/**
* Create public static instance.
*
* @static
* @return self $instance MainWP_Post_Backup_Handler.
*/
public static function instance() {
if ( null === static::$instance ) {
static::$instance = new self();
}
return static::$instance;
}
/**
* Init backups actions
*/
public function init() {
// Page: ManageBackups.
$this->add_action( 'mainwp_addbackup', array( &$this, 'mainwp_addbackup' ) );
if ( \mainwp_current_user_can( 'dashboard', 'edit_backup_tasks' ) ) {
$this->add_action( 'mainwp_updatebackup', array( &$this, 'mainwp_updatebackup' ) );
}
if ( \mainwp_current_user_can( 'dashboard', 'delete_backup_tasks' ) ) {
$this->add_action( 'mainwp_removebackup', array( &$this, 'mainwp_removebackup' ) );
}
$this->add_action( 'mainwp_pausebackup', array( &$this, 'mainwp_pausebackup' ) );
$this->add_action( 'mainwp_resumebackup', array( &$this, 'mainwp_resumebackup' ) );
$this->add_action( 'mainwp_backuptask_get_sites', array( &$this, 'mainwp_backuptask_get_sites' ) );
if ( \mainwp_current_user_can( 'dashboard', 'run_backup_tasks' ) ) {
$this->add_action( 'mainwp_backuptask_run_site', array( &$this, 'mainwp_backuptask_run_site' ) );
}
$this->add_action( 'mainwp_backup_upload_file', array( &$this, 'mainwp_backup_upload_file' ) );
// Page: backup.
if ( \mainwp_current_user_can( 'dashboard', 'run_backup_tasks' ) ) {
$this->add_action( 'mainwp_backup_run_site', array( &$this, 'mainwp_backup_run_site' ) );
}
if ( \mainwp_current_user_can( 'dashboard', 'execute_backups' ) ) {
$this->add_action( 'mainwp_backup', array( &$this, 'ajax_mainwp_backup' ) );
}
$this->add_action( 'mainwp_checkbackups', array( &$this, 'mainwp_checkbackups' ) );
$this->add_action( 'mainwp_backup_checkpid', array( &$this, 'mainwp_backup_checkpid' ) );
$this->add_action( 'mainwp_createbackup_getfilesize', array( &$this, 'mainwp_createbackup_getfilesize' ) );
$this->add_action( 'mainwp_backup_download_file', array( &$this, 'ajax_mainwp_backup_download_file' ) );
$this->add_action( 'mainwp_backup_delete_file', array( &$this, 'mainwp_backup_delete_file' ) );
$this->add_action( 'mainwp_backup_getfilesize', array( &$this, 'mainwp_backup_getfilesize' ) );
$this->add_action( 'mainwp_backup_upload_getprogress', array( &$this, 'mainwp_backup_upload_getprogress' ) );
$this->add_action( 'mainwp_backup_upload_checkstatus', array( &$this, 'mainwp_backup_upload_checkstatus' ) );
}
/*
* Page: Backup
*/
/**
* Method mainwp_backup_run_site()
*
* Run backup task of site
*
* @throws MainWP_Exception On errors.
*
* @uses \MainWP\Dashboard\MainWP_Backup_Handler::backup()
* @uses \MainWP\Dashboard\MainWP_Exception
*/
public function mainwp_backup_run_site() {
$this->secure_request( 'mainwp_backup_run_site' );
$site_id = isset( $_POST['site_id'] ) ? intval( $_POST['site_id'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
try {
if ( ! $site_id ) {
throw new MainWP_Exception( 'Site ID not found. Please reload the page and try again.', 'mainwp' );
}
$ret = array( 'result' => MainWP_Backup_Handler::backup( $site_id, 'full', '', '', 1, 1, 1, 1 ) );
wp_send_json( $ret );
} catch ( MainWP_Exception $e ) {
die(
wp_json_encode(
array(
'error' => array(
'message' => $e->getMessage(),
'extra' => $e->get_message_extra(),
),
)
)
);
}
}
/**
* Method mainwp_backup()
*
* Run backup task
*
* @throws MainWP_Exception On errors.
*
* @uses \MainWP\Dashboard\MainWP_Backup_Handler::backup()
* @uses \MainWP\Dashboard\MainWP_Exception
*/
public function ajax_mainwp_backup() {
$this->secure_request( 'mainwp_backup' );
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$site_id = isset( $_POST['site_id'] ) ? intval( $_POST['site_id'] ) : false;
try {
if ( ! $site_id ) {
throw new MainWP_Exception( 'Site ID not found. Please reload the page and try again.', 'mainwp' );
}
$excludedFolder = isset( $_POST['exclude'] ) ? trim( wp_unslash( $_POST['exclude'] ), "\n" ) : '';
$excludedFolder = explode( "\n", $excludedFolder );
$excludedFolder = array_map( array( MainWP_Utility::get_class_name(), 'trim_slashes' ), $excludedFolder );
$excludedFolder = array_map( 'htmlentities', $excludedFolder );
$excludedFolder = implode( ',', $excludedFolder );
$type = isset( $_POST['type'] ) ? sanitize_text_field( wp_unslash( $_POST['type'] ) ) : '';
$subfolder = isset( $_POST['subfolder'] ) ? sanitize_text_field( wp_unslash( $_POST['subfolder'] ) ) : '';
$excludebackup = isset( $_POST['excludebackup'] ) ? sanitize_text_field( wp_unslash( $_POST['excludebackup'] ) ) : '';
$excludecache = isset( $_POST['excludecache'] ) ? sanitize_text_field( wp_unslash( $_POST['excludecache'] ) ) : '';
$excludenonwp = isset( $_POST['excludenonwp'] ) ? sanitize_text_field( wp_unslash( $_POST['excludenonwp'] ) ) : '';
$excludezip = isset( $_POST['excludezip'] ) ? sanitize_text_field( wp_unslash( $_POST['excludezip'] ) ) : '';
$filename = isset( $_POST['filename'] ) ? sanitize_text_field( wp_unslash( $_POST['filename'] ) ) : '';
$fileNameUID = isset( $_POST['fileNameUID'] ) ? sanitize_text_field( wp_unslash( $_POST['fileNameUID'] ) ) : '';
$archiveFormat = isset( $_POST['archiveFormat'] ) ? sanitize_text_field( wp_unslash( $_POST['archiveFormat'] ) ) : '';
$maximumFileDescriptorsOverride = isset( $_POST['maximumFileDescriptorsOverride'] ) ? intval( $_POST['maximumFileDescriptorsOverride'] ) : false;
$maximumFileDescriptorsAuto = isset( $_POST['maximumFileDescriptorsAuto'] ) ? intval( $_POST['maximumFileDescriptorsAuto'] ) : false;
$maximumFileDescriptors = isset( $_POST['maximumFileDescriptors'] ) ? sanitize_text_field( wp_unslash( $_POST['maximumFileDescriptors'] ) ) : '';
$loadFilesBeforeZip = isset( $_POST['loadFilesBeforeZip'] ) ? sanitize_text_field( wp_unslash( $_POST['loadFilesBeforeZip'] ) ) : false;
$pid = isset( $_POST['pid'] ) ? intval( $_POST['pid'] ) : false;
$append = isset( $_POST['append'] ) ? intval( $_POST['append'] ) : false;
$result = MainWP_Backup_Handler::backup( $site_id, $type, $subfolder, $excludedFolder, $excludebackup, $excludecache, $excludenonwp, $excludezip, $filename, $fileNameUID, $archiveFormat, $maximumFileDescriptorsOverride, $maximumFileDescriptorsAuto, $maximumFileDescriptors, $loadFilesBeforeZip, $pid, $append );
wp_send_json( array( 'result' => $result ) );
} catch ( MainWP_Exception $e ) {
die(
wp_json_encode(
array(
'error' => array(
'message' => $e->getMessage(),
'extra' => $e->get_message_extra(),
),
)
)
);
}
// phpcs:enable
}
/**
* Method mainwp_backup_checkpid()
*
* Check backup task
*
* @throws MainWP_Exception On errors.
*
* @uses \MainWP\Dashboard\MainWP_Backup_Handler::backup_check_pid()
* @uses \MainWP\Dashboard\MainWP_Exception
*/
public function mainwp_backup_checkpid() {
$this->secure_request( 'mainwp_backup_checkpid' );
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$site_id = isset( $_POST['site_id'] ) ? intval( $_POST['site_id'] ) : false;
try {
if ( ! $site_id ) {
throw new MainWP_Exception( 'Site ID not found. Please reload the page and try again.', 'mainwp' );
}
$pid = isset( $_POST['pid'] ) ? intval( $_POST['pid'] ) : false;
$type = isset( $_POST['type'] ) ? sanitize_text_field( wp_unslash( $_POST['type'] ) ) : '';
$subfolder = isset( $_POST['subfolder'] ) ? sanitize_text_field( wp_unslash( $_POST['subfolder'] ) ) : '';
$filename = isset( $_POST['filename'] ) ? sanitize_text_field( wp_unslash( $_POST['filename'] ) ) : '';
wp_send_json( MainWP_Backup_Handler::backup_check_pid( $site_id, $pid, $type, $subfolder, $filename ) );
} catch ( MainWP_Exception $e ) {
die(
wp_json_encode(
array(
'error' => array(
'message' => $e->getMessage(),
'extra' => $e->get_message_extra(),
),
)
)
);
}
// phpcs:enable
}
/**
* Method mainwp_backup_download_file()
*
* Download backup file
*
* @throws MainWP_Exception On errors.
*
* @uses \MainWP\Dashboard\MainWP_Backup_Handler::backup_download_file()
* @uses \MainWP\Dashboard\MainWP_Exception
*/
public function ajax_mainwp_backup_download_file() {
$this->secure_request( 'mainwp_backup_download_file' );
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$site_id = isset( $_POST['site_id'] ) ? intval( $_POST['site_id'] ) : false;
try {
if ( ! $site_id ) {
throw new MainWP_Exception( 'Site ID not found. Please reload the page and try again.', 'mainwp' );
}
$type = isset( $_POST['type'] ) ? sanitize_text_field( wp_unslash( $_POST['type'] ) ) : '';
$url = isset( $_POST['url'] ) ? sanitize_text_field( wp_unslash( $_POST['url'] ) ) : '';
$local = isset( $_POST['local'] ) ? sanitize_text_field( wp_unslash( $_POST['local'] ) ) : '';
die( wp_json_encode( array( 'result' => MainWP_Backup_Handler::backup_download_file( $site_id, $type, $url, $local ) ) ) );
} catch ( MainWP_Exception $e ) {
die(
wp_json_encode(
array(
'error' => array(
'message' => $e->getMessage(),
'extra' => $e->get_message_extra(),
),
)
)
);
}
// phpcs:enable
}
/**
* Method mainwp_backup_delete_file()
*
* Delete backup file
*
* @throws MainWP_Exception On errors.
*
* @uses \MainWP\Dashboard\MainWP_Backup_Handler::backup_delete_file()
* @uses \MainWP\Dashboard\MainWP_Exception
*/
public function mainwp_backup_delete_file() {
$this->secure_request( 'mainwp_backup_delete_file' );
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$site_id = isset( $_POST['site_id'] ) ? intval( $_POST['site_id'] ) : false;
try {
if ( ! $site_id ) {
throw new MainWP_Exception( esc_html__( 'Site ID not found. Please reload the page and try again.', 'mainwp' ) );
}
$site_id = isset( $_POST['site_id'] ) ? intval( $_POST['site_id'] ) : 0;
$file = isset( $_POST['file'] ) ? sanitize_text_field( wp_unslash( $_POST['file'] ) ) : '';
die( wp_json_encode( array( 'result' => MainWP_Backup_Handler::backup_delete_file( $site_id, $file ) ) ) );
} catch ( MainWP_Exception $e ) {
die(
wp_json_encode(
array(
'error' => array(
'message' => $e->getMessage(),
'extra' => $e->get_message_extra(),
),
)
)
);
}
// phpcs:enable
}
/**
* Method mainwp_createbackup_getfilesize()
*
* Get create backup file size.
*
* @throws \MainWP_Exception On errors.
*
* @uses \MainWP\Dashboard\MainWP_Connect::fetch_url_authed()
* @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
* @uses \MainWP\Dashboard\MainWP_Utility::end_session()
* @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
*/
public function mainwp_createbackup_getfilesize() {
$this->secure_request( 'mainwp_createbackup_getfilesize' );
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
try {
if ( ! isset( $_POST['siteId'] ) ) {
throw new MainWP_Exception( esc_html__( 'No site selected!', 'mainwp' ) );
}
$siteId = isset( $_POST['siteId'] ) ? intval( $_POST['siteId'] ) : '';
$fileName = isset( $_POST['fileName'] ) ? sanitize_text_field( wp_unslash( $_POST['fileName'] ) ) : '';
$fileNameUID = isset( $_POST['fileNameUID'] ) ? sanitize_text_field( wp_unslash( $_POST['fileNameUID'] ) ) : '';
$type = isset( $_POST['type'] ) ? sanitize_text_field( wp_unslash( $_POST['type'] ) ) : '';
$website = MainWP_DB::instance()->get_website_by_id( $siteId );
if ( ! $website ) {
throw new MainWP_Exception( esc_html__( 'No site selected!', 'mainwp' ) );
}
MainWP_Utility::end_session();
// Send request to the childsite!
$result = MainWP_Connect::fetch_url_authed(
$website,
'createBackupPoll',
array(
'fileName' => $fileName,
'fileNameUID' => $fileNameUID,
'type' => $type,
)
);
if ( ! isset( $result['size'] ) ) {
throw new MainWP_Exception( esc_html__( 'Invalid response!', 'mainwp' ) );
}
if ( MainWP_Utility::ctype_digit( $result['size'] ) ) {
$output = array( 'size' => $result['size'] );
} else {
$output = array();
}
} catch ( \Exception $e ) {
$output = array( 'error' => $e->getMessage() );
}
// phpcs:enable
die( wp_json_encode( $output ) );
}
/**
* Method mainwp_backup_getfilesize()
*
* Get backup file size
*
* @uses \MainWP\Dashboard\MainWP_Exception
* @uses \MainWP\Dashboard\MainWP_Manage_Sites::backup_get_file_size()
*/
public function mainwp_backup_getfilesize() {
$this->secure_request( 'mainwp_backup_getfilesize' );
try {
$local = isset( $_POST['local'] ) ? sanitize_text_field( wp_unslash( $_POST['local'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
die( wp_json_encode( array( 'result' => MainWP_Backup_Handler::backup_get_file_size( $local ) ) ) );
} catch ( MainWP_Exception $e ) {
die(
wp_json_encode(
array(
'error' => array(
'message' => $e->getMessage(),
'extra' => $e->get_message_extra(),
),
)
)
);
}
}
/**
* Method mainwp_backup_upload_checkstatus()
*
* Check upload status
*
* @throws MainWP_Exception On errors.
*
* @uses \MainWP\Dashboard\MainWP_Exception
*/
public function mainwp_backup_upload_checkstatus() {
$this->secure_request( 'mainwp_backup_upload_checkstatus' );
try {
$unique = isset( $_POST['unique'] ) ? sanitize_text_field( wp_unslash( $_POST['unique'] ) ) : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$array = get_option( 'mainwp_upload_progress' );
$info = apply_filters( 'mainwp_remote_destination_info', array(), ( isset( $_POST['remote_destination'] ) ? sanitize_text_field( wp_unslash( $_POST['remote_destination'] ) ) : '' ) ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( ! is_array( $array ) || empty( $unique ) || empty( $array[ $unique ] ) || empty( $array[ $unique ]['dts'] ) ) {
die(
wp_json_encode(
array(
'status' => 'stalled',
'info' => $info,
)
)
);
} elseif ( isset( $array[ $unique ]['finished'] ) ) {
die(
wp_json_encode(
array(
'status' => 'done',
'info' => $info,
)
)
);
} elseif ( isset( $array[ $unique ]['dts'] ) && intval( $array[ $unique ]['dts'] ) < ( time() - ( 2 * 60 ) ) ) {
// 2minutes.
die(
wp_json_encode(
array(
'status' => 'stalled',
'info' => $info,
)
)
);
} else {
die(
wp_json_encode(
array(
'status' => 'busy',
'info' => $info,
)
)
);
}
} catch ( MainWP_Exception $e ) {
die(
wp_json_encode(
array(
'error' => array(
'message' => $e->getMessage(),
'extra' => $e->get_message_extra(),
),
)
)
);
}
}
/**
* Method mainwp_backup_upload_getprogress()
*
* Get progress status.
*
* @throws MainWP_Exception On finished or errors.
*
* @uses \MainWP\Dashboard\MainWP_Exception
*/
public function mainwp_backup_upload_getprogress() {
$this->secure_request( 'mainwp_backup_upload_getprogress' );
try {
$array = get_option( 'mainwp_upload_progress' );
$unique = isset( $_POST['unique'] ) ? sanitize_text_field( wp_unslash( $_POST['unique'] ) ) : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( ! is_array( $array ) || ! isset( $array[ $unique ] ) ) {
die( wp_json_encode( array( 'result' => 0 ) ) );
} elseif ( isset( $array[ $unique ]['finished'] ) ) {
throw new MainWP_Exception( esc_html__( 'finished...', 'mainwp' ) );
} else {
wp_send_json( array( 'result' => ( isset( $array[ $unique ]['offset'] ) ? $array[ $unique ]['offset'] : $array[ $unique ] ) ) );
}
} catch ( MainWP_Exception $e ) {
die(
wp_json_encode(
array(
'error' => array(
'message' => $e->getMessage(),
'extra' => $e->get_message_extra(),
),
)
)
);
}
}
/*
* Page: ManageBackups
*/
/**
* Method mainwp_addbackup()
*
* Add task to the database.
*
* @uses \MainWP\Dashboard\MainWP_Manage_Backups_Handler::add_backup()
*/
public function mainwp_addbackup() {
$this->secure_request( 'mainwp_addbackup' );
MainWP_Manage_Backups_Handler::add_backup();
}
/**
* Method mainwp_updatebackup()
*
* Update task.
*
* @uses \MainWP\Dashboard\MainWP_Manage_Backups_Handler::update_backup()
*/
public function mainwp_updatebackup() {
$this->secure_request( 'mainwp_updatebackup' );
MainWP_Manage_Backups_Handler::update_backup();
}
/**
* Method mainwp_removebackup()
*
* Remove a task from MainWP.
*
* @uses \MainWP\Dashboard\MainWP_Manage_Backups_Handler::remove_backup()
*/
public function mainwp_removebackup() {
$this->secure_request( 'mainwp_removebackup' );
MainWP_Manage_Backups_Handler::remove_backup();
}
/**
* Method mainwp_resumebackup()
*
* Resume backup task.
*
* @uses \MainWP\Dashboard\MainWP_Manage_Backups_Handler::resume_backup()
*/
public function mainwp_resumebackup() {
$this->secure_request( 'mainwp_resumebackup' );
MainWP_Manage_Backups_Handler::resume_backup();
}
/**
* Method mainwp_pausebackup()
*
* Pause backup task.
*
* @uses \MainWP\Dashboard\MainWP_Manage_Backups_Handler::pause_backup()
*/
public function mainwp_pausebackup() {
$this->secure_request( 'mainwp_pausebackup' );
MainWP_Manage_Backups_Handler::pause_backup();
}
/**
* Method mainwp_backuptask_get_sites()
*
* Get sites of backup task.
*
* @uses \MainWP\Dashboard\MainWP_Manage_Backups_Handler::get_backup_task_sites()
*/
public function mainwp_backuptask_get_sites() {
$this->secure_request( 'mainwp_backuptask_get_sites' );
$taskID = isset( $_POST['task_id'] ) ? intval( $_POST['task_id'] ) : 0; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
wp_send_json( array( 'result' => MainWP_Manage_Backups_Handler::get_backup_task_sites( $taskID ) ) );
}
/**
* Method mainwp_backuptask_run_site()
*
* Run backup task of site.
*
* @throws MainWP_Exception On errors.
*
* @uses \MainWP\Dashboard\MainWP_Exception
* @uses \MainWP\Dashboard\MainWP_Manage_Backups_Handler::backup()
*/
public function mainwp_backuptask_run_site() {
try {
$this->secure_request( 'mainwp_backuptask_run_site' );
$site_id = isset( $_POST['site_id'] ) ? intval( $_POST['site_id'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
$task_id = isset( $_POST['task_id'] ) ? intval( $_POST['task_id'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( ! $site_id || ! $task_id ) {
throw new MainWP_Exception( esc_html__( 'Site ID or backup task ID not found. Please reload the page and try again.', 'mainwp' ) );
}
$fileNameUID = isset( $_POST['fileNameUID'] ) ? sanitize_text_field( wp_unslash( $_POST['fileNameUID'] ) ) : false; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
wp_send_json( array( 'result' => MainWP_Manage_Backups_Handler::backup( $task_id, $site_id, $fileNameUID ) ) );
} catch ( MainWP_Exception $e ) {
die(
wp_json_encode(
array(
'error' => array(
'message' => $e->getMessage(),
'extra' => $e->get_message_extra(),
),
)
)
);
}
}
/**
* Method mainwp_checkbackups()
*
* Check backup status.
*
* @throws \MainWP_Exception On errors.
*
* @uses \MainWP\Dashboard\MainWP_Updates_Overview::check_backups()
*/
public function mainwp_checkbackups() {
$this->secure_request( 'mainwp_checkbackups' );
try {
wp_send_json( array( 'result' => MainWP_Updates_Overview::check_backups() ) );
} catch ( \Exception $e ) {
die( wp_json_encode( array( 'error' => $e->getMessage() ) ) );
}
}
}