38217-vm/wp-content/plugins/mainwp/modules/api-backups/classes/class-api-backups-utility.php
2026-02-05 17:08:59 +03:00

757 lines
25 KiB
PHP

<?php
/**
* Class Api_Backups_Utility
*
* @package MainWP\Dashboard
* @version 5.0
*/
namespace MainWP\Dashboard\Module\ApiBackups;
use MainWP\Dashboard\MainWP_DB;
use MainWP\Dashboard\MainWP_Logger;
use MainWP\Dashboard\MainWP_System_Utility;
/**
* Class Api_Backups_Utility
*/
class Api_Backups_Utility { //phpcs:ignore -- NOSONAR - multi methods.
/**
* Instance value.
*
* @var static Default null
*/
public static $instance = null;
/**
* Get Instance
*
* Creates public static instance.
*
* @static
*
* @return Api_Backups_Utility
*/
public static function get_instance() {
if ( null === static::$instance ) {
static::$instance = new self();
}
return static::$instance;
}
/**
* Method __construct.
*/
public function __construct() {
// contructor.
}
/**
* Method count_child_sites().
*/
public function count_child_sites() {
$websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_wp_for_current_user() );
if ( ! empty( $websites ) ) {
$sites_count = MainWP_DB::num_rows( $websites );
}
// Free result set.
Api_Backups_Helper::free_result( $websites );
return $sites_count;
}
/**
* Get timestamp.
*
* @param int $timestamp Holds Timestamp.
*
* @return float|int Return GMT offset.
*/
public static function get_timestamp( $timestamp = false ) {
if ( empty( $timestamp ) ) {
$timestamp = time();
}
$gmtOffset = get_option( 'gmt_offset' );
return $gmtOffset ? ( $gmtOffset * HOUR_IN_SECONDS ) + $timestamp : $timestamp;
}
/**
* Format timestamp.
*
* @param int $timestamp Holds Timestamp.
* @param bool $gmt Whether to set as General mountain time. Default: FALSE.
*
* @return string Return Timestamp.
*/
public static function format_timestamp( $timestamp, $gmt = false ) {
return date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $timestamp, $gmt );
}
/**
* Format datestamp.
*
* @param int $timestamp Holds Timestamp.
* @param bool $gmt Whether to set as General mountain time. Default: FALSE.
*
* @return string Return Timestamp.
*/
public static function format_datestamp( $timestamp, $gmt = false ) {
return date_i18n( get_option( 'date_format' ), $timestamp, $gmt );
}
/**
* Method map_fields()
*
* Map Site.
*
* @param mixed $website Website to map.
* @param mixed $keys Keys to map.
* @param bool $object_output Output format array|object.
*
* @return object $outputSite Mapped site.
*/
public static function map_fields( &$website, $keys, $object_output = false ) { //phpcs:ignore -- NOSONAR - complex.
$outputSite = array();
if ( ! empty( $website ) ) {
if ( is_object( $website ) ) {
foreach ( $keys as $key ) {
if ( property_exists( $website, $key ) ) {
$outputSite[ $key ] = $website->$key;
}
}
} elseif ( is_array( $website ) ) {
foreach ( $keys as $key ) {
$outputSite[ $key ] = $website[ $key ];
}
}
}
if ( $object_output ) {
return (object) $outputSite;
} else {
return $outputSite;
}
}
/**
* Method array_sort()
*
* Sort given array by given flags.
*
* @param mixed $arr Array to sort.
* @param mixed $key Array key.
* @param string $sort_flag Flags to sort by. Default = SORT_STRING.
*/
public static function array_sort( &$arr, $key, $sort_flag = SORT_STRING ) {
$sorter = array();
$ret = array();
reset( $arr );
foreach ( $arr as $ii => $val ) {
$sorter[ $ii ] = $val[ $key ];
}
asort( $sorter, $sort_flag );
foreach ( $sorter as $ii => $val ) {
$ret[ $ii ] = $arr[ $ii ];
}
$arr = $ret;
}
/**
* Debugging log info.
*
* Sets logging for debugging purpose
*
* @param string $message Log info message.
*/
public static function log_info( $message ) {
static::log_debug( $message, 2 );
}
/**
* Debugging log.
*
* Sets logging for debugging purpose.
*
* @param string $message Log debug message.
* @param int $log_color Log color.
*/
public static function log_debug( $message, $log_color = 3 ) {
if ( is_array( $message ) || is_object( $message ) ) {
$message = print_r( $message, true ); //phpcs:ignore
} elseif ( ! is_string( $message ) ) {
$message = 'undefined';
}
if ( ! in_array( $log_color, array( 0, 1, 2, 3 ) ) ) {
$log_color = 3;
}
do_action( 'mainwp_log_action', 'API Backups :: ' . $message, MainWP_Logger::API_BACKUPS_LOG_PRIORITY, $log_color );
}
/**
*
* Method save_lasttime_backup().
*
* @param int $site_id site id.
* @param int $available_backups Available backups.
* @param string $backup_api API backups provider.
*
* @return mixed
*/
public static function save_lasttime_backup( $site_id, $available_backups, $backup_api ) { //phpcs:ignore -- NOSONAR - complex method.
static::log_debug( 'save backup time :: [available backups=' . ( is_string( $available_backups ) ? $available_backups : 'is not string' ) . ']' );
if ( empty( $available_backups ) ) {
return;
}
if ( is_string( $available_backups ) ) {
$available_backups = json_decode( $available_backups );
}
$primaryBackup = MainWP_System_Utility::get_primary_backup();
$website = Api_Backups_Helper::get_website_by_id( $site_id );
$backup_method = '';
if ( is_array( $website ) && isset( $website['primary_backup_method'] ) ) {
if ( '' === $website['primary_backup_method'] || 'global' === $website['primary_backup_method'] ) {
$backup_method = $primaryBackup;
} else {
$backup_method = $website['primary_backup_method'];
}
}
if ( 'module-api-backups' !== $backup_method ) {
return;
}
$lasttime_backup = 0;
if ( 'plesk' === $backup_api ) {
$available_backups = is_object( $available_backups ) && ! empty( $available_backups->value ) ? $available_backups->value : array();
if ( is_array( $available_backups ) ) {
foreach ( $available_backups as $backup ) {
if ( is_object( $backup ) && ! empty( $backup->value->createdAt->value ) ) {
$backup_time = strtotime( $backup->value->createdAt->value );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
}
} elseif ( 'kinsta' === $backup_api ) {
$available_backups = is_array( $available_backups ) && ! empty( $available_backups ) ? $available_backups : array();
if ( is_array( $available_backups ) ) {
foreach ( $available_backups as $backup ) {
if ( is_object( $backup ) && ! empty( $backup->created_at ) ) {
$milliseconds = $backup->created_at;
$epoch = $milliseconds / 1000;
$backup_time = strtotime( $epoch );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
}
} elseif ( 'cpanel_auto' === $backup_api ) {
if ( is_object( $available_backups ) && isset( $available_backups->data ) ) {
$available_backups_automatic_list = $available_backups->data;
} else {
$available_backups_automatic_list = array();
}
if ( is_array( $available_backups_automatic_list ) ) {
foreach ( $available_backups_automatic_list as $backup ) {
if ( is_object( $backup ) && ! empty( $backup->backupID ) ) {
$backup_time = strtotime( $backup->backupID );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
}
} elseif ( 'cpanel_manual' === $backup_api ) {
$available_backups_manual_list = $available_backups;
if ( is_array( $available_backups_manual_list ) ) {
foreach ( $available_backups_manual_list as $backup ) {
if ( is_object( $backup ) && ! empty( $backup->timestamp ) ) {
$backup_time = $backup->timestamp;
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
}
} elseif ( 'cpanel_wp_toolkit' === $backup_api ) {
$available_backups_manual_list = $available_backups;
if ( is_array( $available_backups_manual_list ) ) {
foreach ( $available_backups_manual_list as $backup ) {
if ( is_object( $backup ) && ! empty( $backup->value->createdAt->value ) ) {
$backup_time = strtotime( $backup->value->createdAt->value );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
}
} elseif ( 'gridpane' === $backup_api ) {
if ( isset( $available_backups->automatic ) ) {
$available_backups_automatic_list = explode( ',', $available_backups->automatic );
} else {
$available_backups_automatic_list = array();
}
if ( isset( $available_backups->manual ) ) {
$available_backups_manual_list = explode( ',', $available_backups->manual );
} else {
$available_backups_manual_list = array();
}
// to do check date created: $api_response->backups->local.
if ( is_array( $available_backups_automatic_list ) ) {
foreach ( $available_backups_automatic_list as $backup_name ) {
$backup_time = substr( $backup_name, 0, 16 ); // get date time string in name.
$backup_time = strtotime( $backup_time );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
if ( is_array( $available_backups_manual_list ) ) {
foreach ( $available_backups_manual_list as $backup_name ) {
$backup_time = substr( $backup_name, 0, 16 ); // get date time string in name.
$backup_time = strtotime( $backup_time );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
} elseif ( 'cloudways' === $backup_api ) {
if ( isset( $available_backups->application_backup_exists ) && true === $available_backups->application_backup_exists ) {
$available_backups = $available_backups->backup_dates;
} else {
$available_backups = array();
}
if ( is_array( $available_backups ) ) {
foreach ( $available_backups as $backup ) {
$backup_time = strtotime( $backup );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
} elseif ( 'vultr' === $backup_api ) {
if ( isset( $available_backups->snapshots ) ) {
$available_snapshots_list = $available_backups->snapshots;
} else {
$available_snapshots_list = array();
}
if ( isset( $available_backups->backups ) ) {
$available_backups_list = $available_backups->backups;
} else {
$available_backups_list = array();
}
if ( is_array( $available_snapshots_list ) ) {
foreach ( $available_snapshots_list as $backup ) {
if ( is_object( $backup ) && ! empty( $backup->date_created ) ) {
$backup_time = strtotime( $backup->date_created );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
}
if ( is_array( $available_backups_list ) ) {
foreach ( $available_backups_list as $backup ) {
if ( is_object( $backup ) && ! empty( $backup->date_created ) ) {
$backup_time = strtotime( $backup->date_created );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
}
} elseif ( 'linode' === $backup_api ) {
// Automatic Backups.
if ( isset( $available_backups->automatic ) ) {
$available_backups_automatic_list = $available_backups->automatic;
} else {
$available_backups_automatic_list = array();
}
// Manual Backups.
if ( isset( $available_backups->snapshot ) ) {
$available_backups_snapshot_list = $available_backups->snapshot;
} else {
$available_backups_snapshot_list = array();
}
if ( is_array( $available_backups_automatic_list ) ) {
foreach ( $available_backups_automatic_list as $backup ) {
if ( is_object( $backup ) && ! empty( $backup->created ) ) {
$backup_time = strtotime( $backup->created );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
}
if ( is_array( $available_backups_snapshot_list ) ) {
foreach ( $available_backups_snapshot_list as $backup ) {
if ( is_object( $backup ) && ! empty( $backup->created ) ) {
$backup_time = strtotime( $backup->created );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
}
} elseif ( 'digitalocean' === $backup_api ) {
if ( isset( $available_backups->snapshots ) ) {
$available_backups = $available_backups->snapshots;
}
if ( is_array( $available_backups ) ) {
foreach ( $available_backups as $backup ) {
if ( is_object( $backup ) && ! empty( $backup->created_at ) ) {
$backup_time = strtotime( $backup->created_at );
if ( $backup_time > $lasttime_backup ) {
$lasttime_backup = $backup_time;
}
}
}
}
}
if ( empty( $lasttime_backup ) ) {
return;
}
$lastBackup = MainWP_DB::instance()->get_website_option( $site_id, 'primary_lasttime_backup' );
if ( ! empty( $lastBackup ) && $lastBackup > $lasttime_backup ) {
return;
}
static::log_debug( 'save backup time :: [site-id=' . $site_id . '] :: [backup time=' . gmdate( 'Y-m-d H:i:s', $lasttime_backup ) . '] :: [api-backups=' . $backup_api . ']' );
$site = new \stdClass();
$site->id = $site_id;
MainWP_DB::instance()->update_website_option( $site, 'primary_lasttime_backup', $lasttime_backup );
}
/**
* Show Info Messages
*
* Check whenther or not to show the MainWP Message.
*
* @param string $notice_id Notice ID.
*
* @return bool False if hidden, true to show.
*/
public static function show_mainwp_message( $notice_id ) {
$status = get_user_option( 'mainwp_notice_saved_status' );
if ( ! is_array( $status ) ) {
$status = array();
}
if ( isset( $status[ $notice_id ] ) ) {
return false;
}
return true;
}
/**
* Method human_filesize()
*
* Convert to human readable file size format,
* (B|kB|MB|GB|TB|PB|EB|ZB|YB).
*
* @param mixed $bytes File in bytes.
* @param integer $decimals Number of decimals to output.
*
* @return string Human readable file size.
*/
public static function human_filesize( $bytes, $decimals = 2 ) {
$size = array( 'B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB' );
$factor = floor( ( strlen( $bytes ) - 1 ) / 3 );
return sprintf( "%.{$decimals}f", $bytes / pow( 1024, $factor ) ) . @$size[ $factor ]; //phpcs:ignore
}
/**
* Get Color Code
*
* Returns CSS class to use correct color for the element.
*
* @param int $value value.
*
* @return string CSS class.
*/
public static function color_code( $value ) {
$color = '';
if ( 5 < $value ) {
$color = 'red';
} elseif ( 0 < $value && 5 >= $value ) {
$color = 'yellow';
} else {
$color = 'green';
}
return $color;
}
/**
* Method update_option()
*
* Update option.
*
* @param mixed $option_name Option name.
* @param mixed $option_value Option value.
*
* @return (boolean) False if value was not updated and true if value was updated.
*/
public static function update_option( $option_name, $option_value ) {
$success = add_option( $option_name, $option_value, '', 'no' );
if ( ! $success ) {
$success = update_option( $option_name, $option_value );
}
return $success;
}
/**
* Method encrypt_api_keys
*
* @param string $data data.
* @param int $siteid site id.
* @param string $file_key file key.
* @param string $service_name service name.
*
* Encrypt data.
*/
public function encrypt_api_keys( $data, $siteid = false, $file_key = false, $service_name = '' ) {
if ( is_string( $data ) ) {
$prefix = 'apibackups_';
if ( ! empty( $siteid ) ) {
$prefix = $prefix . intval( $siteid ) . '_';
}
if ( ! empty( $service_name ) && is_string( $service_name ) ) {
$prefix = $prefix . $service_name . '_';
}
$result = apply_filters( 'mainwp_encrypt_key_value', false, $data, $prefix, $file_key );
if ( is_array( $result ) && ! empty( $result['encrypted_val'] ) ) {
return $result;
}
}
return $data;
}
/**
* Method decrypt_api_keys
*
* @param mixed $encrypted_data encrypted data.
* @param string $def_val default data.
*/
public function decrypt_api_keys( $encrypted_data, $def_val = '' ) {
if ( ! empty( $encrypted_data ) && is_array( $encrypted_data ) && ! empty( $encrypted_data['encrypted_val'] ) ) { // old format.
$result = apply_filters( 'mainwp_decrypt_key_value', false, $encrypted_data, $def_val );
if ( ! empty( $result ) && is_string( $result ) ) {
return $result;
}
}
return $def_val;
}
/**
* Method get_compatible_site_api_key
*
* Encrypt data.
*
* @param string $name name data.
* @param string $def_val default data.
*/
public function get_api_key( $name, $def_val = '' ) {
$names = array(
'vultr',
'gridpane',
'linode',
'digitalocean',
'cloudways',
'cpanel',
'plesk',
'kinsta',
);
if ( ! in_array( $name, $names ) ) {
return $def_val;
}
$encrypted = get_option( 'mainwp_api_backups_' . $name . '_api_key' );
if ( is_array( $encrypted ) && ! empty( $encrypted['file_key'] ) ) {
$key = $this->decrypt_api_keys( $encrypted );
if ( ! empty( $key ) && is_string( $key ) ) {
return $key;
}
}
return $def_val;
}
/**
* Method update_compatible_site_api_key
*
* Encrypt data.
*
* @param string $name name data.
* @param string $value value data.
*/
public function update_api_key( $name, $value ) {
$names = array(
'vultr',
'gridpane',
'linode',
'digitalocean',
'cloudways',
'cpanel',
'plesk',
'kinsta',
);
if ( ! in_array( $name, $names ) ) {
return false;
}
$opt_name = 'mainwp_api_backups_' . $name . '_api_key';
$current = get_option( $opt_name );
$key_file = '';
if ( is_array( $current ) && ! empty( $current['file_key'] ) ) {
$key_file = $current['file_key'];
}
if ( empty( $value ) ) {
delete_option( $opt_name );
if ( ! empty( $key_file ) ) {
do_action( 'mainwp_delete_key_file', $key_file );
}
return true;
}
$encrypted = $this->encrypt_api_keys( $value, false, $key_file, $name );
if ( is_array( $encrypted ) && ! empty( $encrypted['file_key'] ) ) {
return update_option( $opt_name, $encrypted );
}
return false;
}
/**
* Method get child site key.
*
* Encrypt data.
*
* @param int $website_id name data.
* @param string $name name data.
* @param string $def_val default data.
*/
public function get_child_api_key( $website_id, $name, $def_val = '' ) {
$names = array(
'vultr',
'gridpane',
'linode',
'digitalocean',
'cloudways',
'cpanel',
'plesk',
'kinsta',
);
if ( ! in_array( $name, $names ) ) {
return $def_val;
}
$opt_name = 'mainwp_api_backups_' . $name . '_api_key';
$opt_encoded = Api_Backups_Helper::get_website_options( $website_id, array( $opt_name ) );
if ( array_key_exists( $opt_name, $opt_encoded ) ) {
$encrypted = json_decode( $opt_encoded[ $opt_name ], true );
} else {
$encrypted = '';
}
if ( is_array( $encrypted ) && ! empty( $encrypted['file_key'] ) ) {
$key = $this->decrypt_api_keys( $encrypted );
if ( ! empty( $key ) && is_string( $key ) ) {
return $key;
}
}
return $def_val;
}
/**
* Method update child api key.
*
* Encrypt data.
*
* @param int $website_id name data.
* @param string $name name data.
* @param string $value value data.
*/
public function update_child_api_key( $website_id, $name, $value ) {
$names = array(
'vultr',
'gridpane',
'linode',
'digitalocean',
'cloudways',
'cpanel',
'plesk',
'kinsta',
);
if ( ! in_array( $name, $names ) ) {
return false;
}
$opt_name = 'mainwp_api_backups_' . $name . '_api_key';
$opt_encoded = Api_Backups_Helper::get_website_options( $website_id, array( $opt_name ) );
if ( array_key_exists( $opt_name, $opt_encoded ) ) {
$current = json_decode( $opt_encoded[ $opt_name ], true );
} else {
$current = '';
}
$key_file = '';
if ( is_array( $current ) && ! empty( $current['file_key'] ) ) {
$key_file = $current['file_key'];
}
// If post $value is empty, delete option.
if ( empty( $value ) ) {
// Delete the site serviceapi key.
Api_Backups_Helper::update_website_option( $website_id, $opt_name, '' );
if ( ! empty( $key_file ) ) {
do_action( 'mainwp_delete_key_file', $key_file );
}
return true;
}
$encrypted = wp_json_encode( $this->encrypt_api_keys( $value, $website_id, $key_file, $name ) );
if ( ! empty( $encrypted ) ) {
return Api_Backups_Helper::update_website_option( $website_id, $opt_name, $encrypted );
}
return false;
}
}