Current File : /home/pacjaorg/public_html/copp/copp/wp-content/plugins/backwpup/inc/class-option.php |
<?php
use Base32\Base32;
/**
* Class for options.
*/
final class BackWPup_Option
{
/**
* add filter for Site option defaults.
*/
public static function default_site_options() {
// global.
add_site_option( 'backwpup_version', '0.0.0' );
// job default.
add_site_option( 'backwpup_jobs', [] );
// general.
add_site_option( 'backwpup_cfg_showadminbar', true );
add_site_option( 'backwpup_cfg_showfoldersize', false );
add_site_option( 'backwpup_cfg_protectfolders', true );
add_site_option( 'backwpup_cfg_keepplugindata', false );
// job.
add_site_option( 'backwpup_cfg_jobmaxexecutiontime', 30 );
add_site_option( 'backwpup_cfg_jobstepretry', 3 );
add_site_option( 'backwpup_cfg_jobrunauthkey', BackWPup::get_generated_hash( 8 ) );
add_site_option( 'backwpup_cfg_loglevel', 'normal_translated' );
add_site_option( 'backwpup_cfg_jobwaittimems', 0 );
add_site_option( 'backwpup_cfg_jobdooutput', 0 );
add_site_option( 'backwpup_cfg_windows', 0 );
// Logs.
add_site_option( 'backwpup_cfg_maxlogs', 30 );
add_site_option( 'backwpup_cfg_gzlogs', 0 );
$upload_dir = wp_upload_dir( null, false, true );
$logs_dir = trailingslashit(
str_replace(
'\\',
'/',
$upload_dir['basedir']
)
) . 'backwpup/' . BackWPup::get_plugin_data( 'hash' ) . '/logs/';
$content_path = trailingslashit( str_replace( '\\', '/', (string) WP_CONTENT_DIR ) );
$logs_dir = str_replace( $content_path, '', $logs_dir );
add_site_option( 'backwpup_cfg_logfolder', $logs_dir );
// Network Auth.
add_site_option( 'backwpup_cfg_httpauthuser', '' );
add_site_option( 'backwpup_cfg_httpauthpassword', '' );
// Network plugin activation time.
add_site_option( 'backwpup_activation_time', time() );
}
/**
* Update a BackWPup option.
*
* @param int $jobid the job id
* @param string $option Option key
* @param mixed $value the value to store
*
* @return bool if option save or not
*/
public static function update($jobid, $option, $value)
{
$jobid = (int) $jobid;
$option = sanitize_key(trim($option));
if (empty($jobid) || empty($option)) {
return false;
}
//Update option
$jobs_options = self::jobs_options(false);
$jobs_options[$jobid][$option] = $value;
return self::update_jobs_options($jobs_options);
}
/**
* Load BackWPup Options.
*
* @param bool $use_cache
*
* @return array of options
*/
private static function jobs_options($use_cache = true)
{
global $current_site;
//remove from cache
if (!$use_cache) {
if (is_multisite()) {
$network_id = $current_site->id;
$cache_key = "{$network_id}:backwpup_jobs";
wp_cache_delete($cache_key, 'site-options');
} else {
wp_cache_delete('backwpup_jobs', 'options');
$alloptions = wp_cache_get('alloptions', 'options');
if (isset($alloptions['backwpup_jobs'])) {
unset($alloptions['backwpup_jobs']);
wp_cache_set('alloptions', $alloptions, 'options');
}
}
}
return get_site_option('backwpup_jobs', []);
}
/**
* Update BackWPup Options.
*
* @param array $options The options array to save
*
* @return bool updated or not
*/
private static function update_jobs_options($options)
{
return update_site_option('backwpup_jobs', $options);
}
/**
* Get a BackWPup Option.
*
* @param int $jobid Option the job id
* @param string $option Option key
* @param mixed $default returned if no value, if null the the default BackWPup option will get
* @param bool $use_cache USe the cache
*
* @return bool|mixed false if nothing can get else the option value
*/
public static function get($jobid, $option, $default = null, $use_cache = true)
{
$jobid = (int) $jobid;
$option = sanitize_key(trim($option));
if (empty($jobid) || empty($option)) {
return false;
}
$jobs_options = self::jobs_options($use_cache);
if (isset($jobs_options[$jobid], $jobs_options[$jobid]['archivename'])) {
$jobs_options[$jobid]['archivenamenohash'] = $jobs_options[$jobid]['archivename'];
}
if (!isset($jobs_options[$jobid][$option]) && $default !== null) {
return $default;
}
if (!isset($jobs_options[$jobid][$option])) {
if ($option === 'archivename') {
return self::normalize_archive_name(self::defaults_job($option), $jobid);
}
return self::defaults_job($option);
}
// Ensure archive name formatted properly
if ($option === 'archivename') {
return self::normalize_archive_name($jobs_options[$jobid][$option], $jobid, true);
}
if ($option === 'archivenamenohash') {
return self::normalize_archive_name($jobs_options[$jobid]['archivename'], $jobid, false);
}
$option_value = $jobs_options[$jobid][$option];
switch ($option) {
case 'archiveformat':
if ($option_value === '.tar.bz2') {
$option_value = '.tar.gz';
}
break;
case 'pluginlistfilecompression':
case 'wpexportfilecompression':
if ($option_value === '.bz2') {
$option_value = '.gz';
}
break;
}
return $option_value;
}
/**
* Get default option for BackWPup option.
*
* @param string $key Option key
*
* @internal param int $id The job id
*
* @return bool|mixed
*/
public static function defaults_job($key = '')
{
$key = sanitize_key(trim($key));
//set defaults
$default = [];
$default['type'] = ['DBDUMP', 'FILE', 'WPPLUGIN'];
$default['destinations'] = [];
$default['name'] = __('New Job', 'backwpup');
$default['activetype'] = '';
$default['logfile'] = '';
$default['lastbackupdownloadurl'] = '';
$default['cronselect'] = 'basic';
$default['cron'] = '0 3 * * *';
$default['mailaddresslog'] = sanitize_email( get_bloginfo( 'admin_email' ) );
$default['mailaddresssenderlog'] = 'BackWPup ' . get_bloginfo( 'name' ) . ' <' . sanitize_email( get_bloginfo( 'admin_email' ) ) . '>';
$default['mailerroronly'] = true;
$default['backuptype'] = 'archive';
$default['archiveformat'] = '.tar';
$default['archivename'] = '%Y-%m-%d_%H-%i-%s_%hash%';
$default['archivenamenohash'] = '%Y-%m-%d_%H-%i-%s_%hash%';
// defaults vor destinations.
foreach ( BackWPup::get_registered_destinations() as $dest_key => $dest ) {
if ( ! empty( $dest['class'] ) ) {
$dest_object = BackWPup::get_destination( $dest_key );
$default = array_merge( $default, $dest_object->option_defaults() );
}
}
//defaults vor job types
foreach (BackWPup::get_job_types() as $job_type) {
$default = array_merge($default, $job_type->option_defaults());
}
//return all
if (empty($key)) {
return $default;
}
//return one default setting
if (isset($default[$key])) {
return $default[$key];
}
return false;
}
/**
* BackWPup Job Options.
*
* @param int $id The job id
* @param bool $use_cache
*
* @return array of all job options
*/
public static function get_job($id, $use_cache = true)
{
if (!is_numeric($id)) {
return false;
}
$id = intval($id);
$jobs_options = self::jobs_options($use_cache);
if (isset($jobs_options[$id]['archivename'])) {
$jobs_options[$id]['archivename'] = self::normalize_archive_name(
$jobs_options[$id]['archivename'],
$id,
true
);
}
$options = wp_parse_args($jobs_options[$id], self::defaults_job());
if (isset($options['archiveformat']) && $options['archiveformat'] === '.tar.bz2') {
$options['archiveformat'] = '.tar.gz';
}
if (isset($options['pluginlistfilecompression']) && $options['pluginlistfilecompression'] === '.bz2') {
$options['pluginlistfilecompression'] = '.gz';
}
if (isset($options['wpexportfilecompression']) && $options['wpexportfilecompression'] === '.bz2') {
$options['wpexportfilecompression'] = '.gz';
}
return $options;
}
/**
* Delete a BackWPup Option.
*
* @param int $jobid the job id
* @param string $option Option key
*
* @return bool deleted or not
*/
public static function delete($jobid, $option)
{
$jobid = (int) $jobid;
$option = sanitize_key(trim($option));
if (empty($jobid) || empty($option)) {
return false;
}
//delete option
$jobs_options = self::jobs_options(false);
unset($jobs_options[$jobid][$option]);
return self::update_jobs_options($jobs_options);
}
/**
* Delete a BackWPup Job.
*
* @param int $id The job id
*
* @return bool deleted or not
*/
public static function delete_job($id)
{
if (!is_numeric($id)) {
return false;
}
$id = intval($id);
$jobs_options = self::jobs_options(false);
unset($jobs_options[$id]);
return self::update_jobs_options($jobs_options);
}
/**
* get the id's of jobs.
*
* @param string|null $key Option key or null for getting all id's
* @param bool $value Value that the option must have to get the id
*
* @return array job id's
*/
public static function get_job_ids($key = null, $value = false)
{
$key = sanitize_key(trim((string) $key));
$jobs_options = self::jobs_options(false);
if (empty($jobs_options)) {
return [];
}
//get option job ids
if (empty($key)) {
return array_keys($jobs_options);
}
//get option ids for option with the defined value
$new_option_job_ids = [];
foreach ($jobs_options as $id => $option) {
if (isset($option[$key]) && $value == $option[$key]) {
$new_option_job_ids[] = (int) $id;
}
}
sort($new_option_job_ids);
return $new_option_job_ids;
}
/**
* Gets the next available job id.
*
* @return int
*/
public static function next_job_id()
{
$ids = self::get_job_ids();
sort($ids);
return end($ids) + 1;
}
/**
* Normalizes the archive name.
*
* The archive name should include the hash to identify this site, and the job id to identify this job.
*
* This allows backup files belonging to this job to be tracked.
*
* @param string $archive_name
* @param int $jobid
*
* @return string The normalized archive name
*/
public static function normalize_archive_name($archive_name, $jobid, $substitute_hash = true)
{
$hash = BackWPup::get_plugin_data('hash');
$generated_hash = self::get_generated_hash($jobid);
// Does the string contain %hash%?
if (strpos($archive_name, '%hash%') !== false) {
if ($substitute_hash == true) {
return str_replace('%hash%', $generated_hash, $archive_name);
}
// Nothing needs to be done since we don't have to substitute it.
return $archive_name;
}
// %hash% not included, so check for old style archive name pre-3.4.3
// If name starts with 'backwpup', then we can try to parse
if (substr($archive_name, 0, 8) == 'backwpup') {
$parts = explode('_', $archive_name);
// Decode hash part if hash not found (from 3.4.2)
if (strpos($parts[1], $hash) === false) {
$parts[1] = is_numeric($parts[1]) ? base_convert($parts[1], 36, 16) : $parts[1];
}
// Search again
if (strpos($parts[1], $hash) !== false) {
$parts[1] = '%hash%';
} else {
// Hash not included, so insert
array_splice($parts, 1, 0, '%hash%');
}
$archive_name = implode('_', $parts);
if ($substitute_hash == true) {
return str_replace('%hash%', $generated_hash, $archive_name);
}
return $archive_name;
}
// But otherwise, just append the hash
if ($substitute_hash == true) {
return $archive_name . '_' . $generated_hash;
}
return $archive_name . '_%hash%';
}
/**
* Generate a hash including random bytes and job ID.
*
* @return string
*/
public static function get_generated_hash($jobid)
{
return Base32::encode(pack(
'H*',
sprintf(
'%02x%06s%02x',
random_int(0, 255),
BackWPup::get_plugin_data('hash'),
random_int(0, 255)
)
)) .
sprintf('%02d', $jobid);
}
/**
* Return the decoded hash and the job ID.
*
* If the hash is not found in the given code, then false is returned.
*
* @param string $code The string to decode
*
* @return array|bool An array with hash and job ID, or false otherwise
*/
public static function decode_hash($code)
{
$hash = BackWPup::get_plugin_data('hash');
// Try base 32 first
$decoded = bin2hex(Base32::decode(substr($code, 0, 8)));
if (substr($decoded, 2, 6) == $hash) {
return [substr($decoded, 2, 6), intval(substr($code, -2))];
}
// Try base 36
$decoded = is_numeric($code) ? base_convert($code, 36, 16) : $code;
if (substr($decoded, 2, 6) == $hash) {
return [substr($decoded, 2, 6), intval(substr($decoded, -2))];
}
// Check style prior to 3.4.1
if (substr($code, 0, 6) == $hash) {
return [substr($code, 0, 6), intval(substr($code, -2))];
}
// Tried everything, now return failure
return false;
}
/**
* Substitute date variables in archive name.
*
* @param string $archivename the name of the archive
*
* @return string the archive name with substituted variables
*/
public static function substitute_date_vars($archivename)
{
$current_time = current_time('timestamp');
$datevars = [
'%d',
'%j',
'%m',
'%n',
'%Y',
'%y',
'%a',
'%A',
'%B',
'%g',
'%G',
'%h',
'%H',
'%i',
'%s',
];
$datevalues = [
date('d', $current_time),
date('j', $current_time),
date('m', $current_time),
date('n', $current_time),
date('Y', $current_time),
date('y', $current_time),
date('a', $current_time),
date('A', $current_time),
date('B', $current_time),
date('g', $current_time),
date('G', $current_time),
date('h', $current_time),
date('H', $current_time),
date('i', $current_time),
date('s', $current_time),
];
// Temporarily replace %hash% with [hash]
$archivename = str_replace('%hash%', '[hash]', $archivename);
$archivename = str_replace(
$datevars,
$datevalues,
$archivename
);
$archivename = str_replace('[hash]', '%hash%', $archivename);
return BackWPup_Job::sanitize_file_name($archivename);
}
}