Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
wp-content
/
plugins
/
backup
/
src
/
JetBackup
/
Config
:
Config.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php namespace JetBackup\Config; if (!defined( '__JETBACKUP__')) die('Direct access is not allowed'); use JetBackup\Alert\Alert; use JetBackup\Data\ReflectionObject; use JetBackup\Encryption\Crypt; use JetBackup\Entities\Util; use JetBackup\Exception\FieldsValidationException; use JetBackup\Exception\IOException; use JetBackup\Exception\LicenseException; use JetBackup\Factory; use JetBackup\JetBackup; use JetBackup\License\License; use JetBackup\License\LicenseLocalKey; use JetBackup\Wordpress\Helper; use JetBackup\Wordpress\Wordpress; class Config extends ReflectionObject { const CONFIG_FILE = JetBackup::CONFIG_PATH . JetBackup::SEP . 'config.php'; const MAIN_DATA_FOLDER = 'MAIN_DATA_FOLDER'; const DB_MAIN_FOLDER = 'DB_MAIN_FOLDER'; const BACKUPS_TEMP_FOLDER = 'BACKUPS_TEMP_FOLDER'; const CRON_TOKEN = 'CRON_TOKEN'; const LOGS_FOLDER = 'LOGS_FOLDER'; const BACKUPS_FOLDER = 'BACKUPS_FOLDER'; const DOWNLOADS_FOLDER = 'DOWNLOADS_FOLDER'; const SYSTEM_CRON_DAILY_LAST_RUN = 'SYSTEM_CRON_DAILY_LAST_RUN'; const SYSTEM_CRON_HOURLY_LAST_RUN = 'SYSTEM_CRON_HOURLY_LAST_RUN'; const ENCRYPTION_KEY = 'ENCRYPTION_KEY'; const UNIQUE_ID = 'UNIQUE_ID'; const SGB_LEGACY_CONVERTED = 'SGB_LEGACY_CONVERTED'; const CURRENT_VERSION = 'CURRENT_VERSION'; const ALTERNATE_DATA_FOLDER = 'ALTERNATE_DATA_FOLDER'; const LICENSE_KEY = 'LICENSE_KEY'; const LICENSE_LOCAL_KEY = 'LICENSE_LOCAL_KEY'; const LICENSE_NEXT_CHECK = 'LICENSE_NEXT_CHECK'; const LICENSE_LAST_CHECK = 'LICENSE_LAST_CHECK'; const LICENSE_NOTIFY_DATE = 'LICENSE_NOTIFY_DATE'; const SUPPORT_USERNAME = 'SUPPORT_USERNAME'; const WP_DB_CONFIG_PREFIX = 'jetbackup_config'; public function __construct() { parent::__construct(self::CONFIG_FILE, 'JetConfigDefines'); if(!$this->getDataDirectory()) $this->setDataDirectory( 'jetbackup-' . Util::generateRandomString()); if(!$this->getBackupsDirectory()) $this->setBackupsDirectory( 'backups-' . Util::generateRandomString()); if(!$this->getTempDirectory()) $this->setTempDirectory( 'temp-' . Util::generateRandomString()); if(!$this->getDatabaseDirectory()) $this->setDatabaseDirectory( 'db-' . Util::generateRandomString()); if(!$this->getLogsDirectory()) $this->setLogsDirectory( 'logs-' . Util::generateRandomString()); if(!$this->getDownloadsDirectory()) $this->setDownloadsDirectory( 'downloads-' . Util::generateRandomString()); if(!$this->getEncryptionKey()) $this->setEncryptionKey(Util::generateRandomString()); if(!$this->getUniqueID()) $this->setUniqueID(Util::generateRandomString()); if(!$this->getCronToken()) $this->setCronToken(Util::generateRandomString()); if($this->getDiff()) $this->save(); } public function set($key, $value) { if(is_string($value)) $value = htmlspecialchars($value); parent::set($key, $value); } public function getDataDirectory():string { return $this->get(self::MAIN_DATA_FOLDER); } public function setDataDirectory($value):void { $this->set(self::MAIN_DATA_FOLDER, $value); } public function getDatabaseDirectory():string { return $this->get(self::DB_MAIN_FOLDER); } public function setDatabaseDirectory($value):void { $this->set(self::DB_MAIN_FOLDER, $value); } public function getLogsDirectory():string { return $this->get(self::LOGS_FOLDER); } public function setLogsDirectory($value):void { $this->set(self::LOGS_FOLDER, $value); } public function getBackupsDirectory():string { return $this->get(self::BACKUPS_FOLDER); } public function setBackupsDirectory($value):void { $this->set(self::BACKUPS_FOLDER, $value); } public function getDownloadsDirectory():string { return $this->get(self::DOWNLOADS_FOLDER); } public function setDownloadsDirectory($value):void { $this->set(self::DOWNLOADS_FOLDER, $value); } public function getTempDirectory():string { return $this->get(self::BACKUPS_TEMP_FOLDER); } public function setTempDirectory($value):void { $this->set(self::BACKUPS_TEMP_FOLDER, $value); } public function getSystemCronDailyLastRun():int { return (int) $this->get(self::SYSTEM_CRON_DAILY_LAST_RUN, 0); } public function setSystemCronDailyLastRun(?int $value=null):void { $this->set(self::SYSTEM_CRON_DAILY_LAST_RUN, $value ?? time()); } public function getSystemCronHourlyLastRun():int { return (int) $this->get(self::SYSTEM_CRON_HOURLY_LAST_RUN, 0); } public function setSystemCronHourlyLastRun(?int $value=null):void { $this->set(self::SYSTEM_CRON_HOURLY_LAST_RUN, $value ?? time()); } public function getEncryptionKey():string { return $this->get(self::ENCRYPTION_KEY); } public function setEncryptionKey($value):void { $this->set(self::ENCRYPTION_KEY, $value); } public function getUniqueID():string { return $this->get(self::UNIQUE_ID); } public function setUniqueID($value):void { $this->set(self::UNIQUE_ID, $value); } public function getCronToken():string { return $this->get(self::CRON_TOKEN); } public function setCronToken($value):void { $this->set(self::CRON_TOKEN, $value); } public function isSGBLegacyConverted():bool { return !!$this->get(self::SGB_LEGACY_CONVERTED, false); } public function setSGBLegacyConverted(bool $value):void { $this->set(self::SGB_LEGACY_CONVERTED, !!$value); } public function getCurrentVersion():string { return $this->get(self::CURRENT_VERSION); } public function setCurrentVersion($value):void { $this->set(self::CURRENT_VERSION, $value); } /** * @return string */ public function getAlternateDataFolder():string { return $this->get(self::ALTERNATE_DATA_FOLDER); } /** * @param $value * * @return void */ public function setAlternateDataFolder($value):void { $this->set(self::ALTERNATE_DATA_FOLDER, $value); } /** * @return string */ public function getLicenseKey():string { return $this->get(self::LICENSE_KEY); } /** * @param $value * * @return void */ public function setLicenseKey($value):void { $this->set(self::LICENSE_KEY, $value); } /** * @return string */ public function getLicenseLocalKey():string { return $this->get(self::LICENSE_LOCAL_KEY); } /** * @param $value * * @return void */ public function setLicenseLocalKey($value):void { $this->set(self::LICENSE_LOCAL_KEY, $value); } /** * @param int $next_check * * @return void */ public function setLicenseNextCheck(int $next_check=0):void { $this->set(self::LICENSE_NEXT_CHECK, $next_check); } /** * @return int */ public function getLicenseNextCheck():int { return (int) $this->get(self::LICENSE_NEXT_CHECK, 0); } /** * @param int $last_check * * @return void */ public function setLicenseLastCheck(int $last_check=0):void { $this->set(self::LICENSE_LAST_CHECK, $last_check); } /** * @return int */ public function getLicenseLastCheck():int { return (int) $this->get(self::LICENSE_LAST_CHECK, 0); } public function getSupportUsername():string { return $this->get(self::SUPPORT_USERNAME, ''); } public function setSupportUsername($username):void { $this->set(self::SUPPORT_USERNAME, $username); } /** * @param int $notify_date * * @return void */ public function setLicenseNotifyDate(int $notify_date=0):void { $this->set(self::LICENSE_NOTIFY_DATE, $notify_date); } /** * @return int */ public function getLicenseNotifyDate():int { return (int) $this->get(self::LICENSE_NOTIFY_DATE, 0); } /** * @param string $message * @param LicenseLocalKey $localKey * * @return void */ public function setLocalKeyInvalid(string $message, LicenseLocalKey $localKey):void { $this->setLicenseLocalKey("{$localKey->getSigned()}|{$localKey->getSignedStatus()}|Invalid|$message"); } /** * @return void */ public function loadFromDatabase():void { parent::loadFromDatabase(); $jetbackup_config = Wordpress::getOption(self::WP_DB_CONFIG_PREFIX); $data = $jetbackup_config ? unserialize(Crypt::decrypt($jetbackup_config, DB_PASSWORD)) : []; $new_data = []; foreach($data as $key => $value) { if(str_starts_with($key, 'JET_') && $key != 'JET_2FA_ENABLED') $key = substr($key, 4); $new_data[$key] = $value; } $this->setData($new_data); // in case we migrate wordpress and there are config left overs in the db, the alternate folder might // be in non-accessible location, we need to reset it if($this->getAlternateDataFolder() && !is_writable($this->getAlternateDataFolder())) { $this->setAlternateDataFolder(''); } } /** * @return void */ private function _saveToDatabase():void { Wordpress::setOption(self::WP_DB_CONFIG_PREFIX, Crypt::encrypt(serialize($this->getData()), DB_PASSWORD)); } public function save():void { $this->_saveToDatabase(); parent::save(); } /** * @return void * @throws LicenseException * @throws IOException */ public function validateLicense():void { License::retrieveLocalKey($this->getLicenseKey()); } /** * @return void * @throws FieldsValidationException */ public function validateAltDataDir():void { $alternate_folder = trim($this->getAlternateDataFolder()) ?? null; if($alternate_folder) { $alternate_folder = rtrim(trim($alternate_folder), JetBackup::SEP); if (!System::isAlternateFolderSecured($alternate_folder)) { $homedir = Helper::getUserHomedir() ?? dirname(Wordpress::getAbsPath()); throw new FieldsValidationException( "Data folder $alternate_folder cannot be outside of " . $homedir); } if(!@is_writable(dirname($alternate_folder))) throw new FieldsValidationException(sprintf("Data folder location '%s' is not writable.", dirname($alternate_folder))); } } /** * @throws FieldsValidationException */ public function moveDataDir() : void { if (Factory::getLocations()->getDataDir() == self::getAlternateDataFolder()) return; if (file_exists(self::getAlternateDataFolder())) throw new FieldsValidationException("Target folder " . self::getAlternateDataFolder() . " already exists."); if (!@rename(Factory::getLocations()->getDataDir(), self::getAlternateDataFolder())) { throw new FieldsValidationException("Failed moving " . Factory::getLocations()->getDataDir() . " to " . self::getAlternateDataFolder()); } } }