Edit File by line
/home/zeestwma/ajeebong.../wp-conte.../plugins/litespee.../src
File: import.preset.cls.php
<?php
[0] Fix | Delete
// phpcs:ignoreFile
[1] Fix | Delete
/**
[2] Fix | Delete
* The preset class.
[3] Fix | Delete
*
[4] Fix | Delete
* @since 5.3.0
[5] Fix | Delete
*/
[6] Fix | Delete
namespace LiteSpeed;
[7] Fix | Delete
[8] Fix | Delete
defined('WPINC') || exit();
[9] Fix | Delete
[10] Fix | Delete
class Preset extends Import {
[11] Fix | Delete
[12] Fix | Delete
protected $_summary;
[13] Fix | Delete
[14] Fix | Delete
const MAX_BACKUPS = 10;
[15] Fix | Delete
[16] Fix | Delete
const TYPE_APPLY = 'apply';
[17] Fix | Delete
const TYPE_RESTORE = 'restore';
[18] Fix | Delete
[19] Fix | Delete
const STANDARD_DIR = LSCWP_DIR . 'data/preset';
[20] Fix | Delete
const BACKUP_DIR = LITESPEED_STATIC_DIR . '/auto-backup';
[21] Fix | Delete
[22] Fix | Delete
/**
[23] Fix | Delete
* Returns sorted backup names
[24] Fix | Delete
*
[25] Fix | Delete
* @since 5.3.0
[26] Fix | Delete
* @access public
[27] Fix | Delete
*/
[28] Fix | Delete
public static function get_backups() {
[29] Fix | Delete
self::init_filesystem();
[30] Fix | Delete
global $wp_filesystem;
[31] Fix | Delete
[32] Fix | Delete
$backups = array_map(
[33] Fix | Delete
function ( $path ) {
[34] Fix | Delete
return self::basename($path['name']);
[35] Fix | Delete
},
[36] Fix | Delete
$wp_filesystem->dirlist(self::BACKUP_DIR) ?: array()
[37] Fix | Delete
);
[38] Fix | Delete
rsort($backups);
[39] Fix | Delete
[40] Fix | Delete
return $backups;
[41] Fix | Delete
}
[42] Fix | Delete
[43] Fix | Delete
/**
[44] Fix | Delete
* Removes extra backup files
[45] Fix | Delete
*
[46] Fix | Delete
* @since 5.3.0
[47] Fix | Delete
* @access public
[48] Fix | Delete
*/
[49] Fix | Delete
public static function prune_backups() {
[50] Fix | Delete
$backups = self::get_backups();
[51] Fix | Delete
global $wp_filesystem;
[52] Fix | Delete
[53] Fix | Delete
foreach (array_slice($backups, self::MAX_BACKUPS) as $backup) {
[54] Fix | Delete
$path = self::get_backup($backup);
[55] Fix | Delete
$wp_filesystem->delete($path);
[56] Fix | Delete
Debug2::debug('[Preset] Deleted old backup from ' . $backup);
[57] Fix | Delete
}
[58] Fix | Delete
}
[59] Fix | Delete
[60] Fix | Delete
/**
[61] Fix | Delete
* Returns a settings file's extensionless basename given its filesystem path
[62] Fix | Delete
*
[63] Fix | Delete
* @since 5.3.0
[64] Fix | Delete
* @access public
[65] Fix | Delete
*/
[66] Fix | Delete
public static function basename( $path ) {
[67] Fix | Delete
return basename($path, '.data');
[68] Fix | Delete
}
[69] Fix | Delete
[70] Fix | Delete
/**
[71] Fix | Delete
* Returns a standard preset's path given its extensionless basename
[72] Fix | Delete
*
[73] Fix | Delete
* @since 5.3.0
[74] Fix | Delete
* @access public
[75] Fix | Delete
*/
[76] Fix | Delete
public static function get_standard( $name ) {
[77] Fix | Delete
return path_join(self::STANDARD_DIR, $name . '.data');
[78] Fix | Delete
}
[79] Fix | Delete
[80] Fix | Delete
/**
[81] Fix | Delete
* Returns a backup's path given its extensionless basename
[82] Fix | Delete
*
[83] Fix | Delete
* @since 5.3.0
[84] Fix | Delete
* @access public
[85] Fix | Delete
*/
[86] Fix | Delete
public static function get_backup( $name ) {
[87] Fix | Delete
return path_join(self::BACKUP_DIR, $name . '.data');
[88] Fix | Delete
}
[89] Fix | Delete
[90] Fix | Delete
/**
[91] Fix | Delete
* Initializes the global $wp_filesystem object and clears stat cache
[92] Fix | Delete
*
[93] Fix | Delete
* @since 5.3.0
[94] Fix | Delete
*/
[95] Fix | Delete
static function init_filesystem() {
[96] Fix | Delete
require_once ABSPATH . '/wp-admin/includes/file.php';
[97] Fix | Delete
\WP_Filesystem();
[98] Fix | Delete
clearstatcache();
[99] Fix | Delete
}
[100] Fix | Delete
[101] Fix | Delete
/**
[102] Fix | Delete
* Init
[103] Fix | Delete
*
[104] Fix | Delete
* @since 5.3.0
[105] Fix | Delete
*/
[106] Fix | Delete
public function __construct() {
[107] Fix | Delete
Debug2::debug('[Preset] Init');
[108] Fix | Delete
$this->_summary = self::get_summary();
[109] Fix | Delete
}
[110] Fix | Delete
[111] Fix | Delete
/**
[112] Fix | Delete
* Applies a standard preset's settings given its extensionless basename
[113] Fix | Delete
*
[114] Fix | Delete
* @since 5.3.0
[115] Fix | Delete
* @access public
[116] Fix | Delete
*/
[117] Fix | Delete
public function apply( $preset ) {
[118] Fix | Delete
$this->make_backup($preset);
[119] Fix | Delete
[120] Fix | Delete
$path = self::get_standard($preset);
[121] Fix | Delete
$result = $this->import_file($path) ? $preset : 'error';
[122] Fix | Delete
[123] Fix | Delete
$this->log($result);
[124] Fix | Delete
}
[125] Fix | Delete
[126] Fix | Delete
/**
[127] Fix | Delete
* Restores settings from the backup file with the given timestamp, then deletes the file
[128] Fix | Delete
*
[129] Fix | Delete
* @since 5.3.0
[130] Fix | Delete
* @access public
[131] Fix | Delete
*/
[132] Fix | Delete
public function restore( $timestamp ) {
[133] Fix | Delete
$backups = array();
[134] Fix | Delete
foreach (self::get_backups() as $backup) {
[135] Fix | Delete
if (preg_match('/^backup-' . $timestamp . '(-|$)/', $backup) === 1) {
[136] Fix | Delete
$backups[] = $backup;
[137] Fix | Delete
}
[138] Fix | Delete
}
[139] Fix | Delete
[140] Fix | Delete
if (empty($backups)) {
[141] Fix | Delete
$this->log('error');
[142] Fix | Delete
return;
[143] Fix | Delete
}
[144] Fix | Delete
[145] Fix | Delete
$backup = $backups[0];
[146] Fix | Delete
$path = self::get_backup($backup);
[147] Fix | Delete
[148] Fix | Delete
if (!$this->import_file($path)) {
[149] Fix | Delete
$this->log('error');
[150] Fix | Delete
return;
[151] Fix | Delete
}
[152] Fix | Delete
[153] Fix | Delete
self::init_filesystem();
[154] Fix | Delete
global $wp_filesystem;
[155] Fix | Delete
[156] Fix | Delete
$wp_filesystem->delete($path);
[157] Fix | Delete
Debug2::debug('[Preset] Deleted most recent backup from ' . $backup);
[158] Fix | Delete
[159] Fix | Delete
$this->log('backup');
[160] Fix | Delete
}
[161] Fix | Delete
[162] Fix | Delete
/**
[163] Fix | Delete
* Saves current settings as a backup file, then prunes extra backup files
[164] Fix | Delete
*
[165] Fix | Delete
* @since 5.3.0
[166] Fix | Delete
* @access public
[167] Fix | Delete
*/
[168] Fix | Delete
public function make_backup( $preset ) {
[169] Fix | Delete
$backup = 'backup-' . time() . '-before-' . $preset;
[170] Fix | Delete
$data = $this->export(true);
[171] Fix | Delete
[172] Fix | Delete
$path = self::get_backup($backup);
[173] Fix | Delete
File::save($path, $data, true);
[174] Fix | Delete
Debug2::debug('[Preset] Backup saved to ' . $backup);
[175] Fix | Delete
[176] Fix | Delete
self::prune_backups();
[177] Fix | Delete
}
[178] Fix | Delete
[179] Fix | Delete
/**
[180] Fix | Delete
* Tries to import from a given settings file
[181] Fix | Delete
*
[182] Fix | Delete
* @since 5.3.0
[183] Fix | Delete
*/
[184] Fix | Delete
function import_file( $path ) {
[185] Fix | Delete
$debug = function ( $result, $name ) {
[186] Fix | Delete
$action = $result ? 'Applied' : 'Failed to apply';
[187] Fix | Delete
Debug2::debug('[Preset] ' . $action . ' settings from ' . $name);
[188] Fix | Delete
return $result;
[189] Fix | Delete
};
[190] Fix | Delete
[191] Fix | Delete
$name = self::basename($path);
[192] Fix | Delete
$contents = file_get_contents($path);
[193] Fix | Delete
[194] Fix | Delete
if (false === $contents) {
[195] Fix | Delete
Debug2::debug('[Preset] ❌ Failed to get file contents');
[196] Fix | Delete
return $debug(false, $name);
[197] Fix | Delete
}
[198] Fix | Delete
[199] Fix | Delete
$parsed = array();
[200] Fix | Delete
try {
[201] Fix | Delete
// Check if the data is v4+
[202] Fix | Delete
if (strpos($contents, '["_version",') === 0) {
[203] Fix | Delete
$contents = explode("\n", $contents);
[204] Fix | Delete
foreach ($contents as $line) {
[205] Fix | Delete
$line = trim($line);
[206] Fix | Delete
if (empty($line)) {
[207] Fix | Delete
continue;
[208] Fix | Delete
}
[209] Fix | Delete
list($key, $value) = \json_decode($line, true);
[210] Fix | Delete
$parsed[$key] = $value;
[211] Fix | Delete
}
[212] Fix | Delete
} else {
[213] Fix | Delete
$parsed = \json_decode(base64_decode($contents), true);
[214] Fix | Delete
}
[215] Fix | Delete
} catch (\Exception $ex) {
[216] Fix | Delete
Debug2::debug('[Preset] ❌ Failed to parse serialized data');
[217] Fix | Delete
return $debug(false, $name);
[218] Fix | Delete
}
[219] Fix | Delete
[220] Fix | Delete
if (empty($parsed)) {
[221] Fix | Delete
Debug2::debug('[Preset] ❌ Nothing to apply');
[222] Fix | Delete
return $debug(false, $name);
[223] Fix | Delete
}
[224] Fix | Delete
[225] Fix | Delete
$this->cls('Conf')->update_confs($parsed);
[226] Fix | Delete
[227] Fix | Delete
return $debug(true, $name);
[228] Fix | Delete
}
[229] Fix | Delete
[230] Fix | Delete
/**
[231] Fix | Delete
* Updates the log
[232] Fix | Delete
*
[233] Fix | Delete
* @since 5.3.0
[234] Fix | Delete
*/
[235] Fix | Delete
function log( $preset ) {
[236] Fix | Delete
$this->_summary['preset'] = $preset;
[237] Fix | Delete
$this->_summary['preset_timestamp'] = time();
[238] Fix | Delete
self::save_summary();
[239] Fix | Delete
}
[240] Fix | Delete
[241] Fix | Delete
/**
[242] Fix | Delete
* Handles all request actions from main cls
[243] Fix | Delete
*
[244] Fix | Delete
* @since 5.3.0
[245] Fix | Delete
* @access public
[246] Fix | Delete
*/
[247] Fix | Delete
public function handler() {
[248] Fix | Delete
$type = Router::verify_type();
[249] Fix | Delete
[250] Fix | Delete
switch ($type) {
[251] Fix | Delete
case self::TYPE_APPLY:
[252] Fix | Delete
$this->apply(!empty($_GET['preset']) ? $_GET['preset'] : false);
[253] Fix | Delete
break;
[254] Fix | Delete
[255] Fix | Delete
case self::TYPE_RESTORE:
[256] Fix | Delete
$this->restore(!empty($_GET['timestamp']) ? $_GET['timestamp'] : false);
[257] Fix | Delete
break;
[258] Fix | Delete
[259] Fix | Delete
default:
[260] Fix | Delete
break;
[261] Fix | Delete
}
[262] Fix | Delete
[263] Fix | Delete
Admin::redirect();
[264] Fix | Delete
}
[265] Fix | Delete
}
[266] Fix | Delete
[267] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function