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; } }