* @author Froxlor team (2018-) * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * @package Classes * * @since 0.9.39 * */ /** * Class SImExporter * * Import/Export settings to JSON * * @copyright (c) the authors * @author Michael Kaufmann * @author Froxlor team (2018-) * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * @package Classes */ class SImExporter { /** * settings which are not being exported * * @var array */ private static $_no_export = [ 'panel.adminmail', 'admin.show_news_feed', 'system.lastaccountnumber', 'system.lastguid', 'system.ipaddress', 'system.last_traffic_run', 'system.hostname', 'system.mysql_access_host', 'system.lastcronrun', 'system.defaultip', 'system.last_tasks_run', 'system.last_archive_run', 'system.leprivatekey', 'system.lepublickey' ]; public static function export() { $result_stmt = Database::query(" SELECT * FROM `" . TABLE_PANEL_SETTINGS . "` ORDER BY `settingid` ASC "); $_data = array(); while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) { $index = $row['settinggroup'] . "." . $row['varname']; if (! in_array($index, self::$_no_export)) { $_data[$index] = $row['value']; } } // add checksum for validation $_data['_sha'] = sha1(var_export($_data, true)); $_export = json_encode($_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); if (! $_export) { throw new Exception("Error exporting settings: " . json_last_error_msg()); } return $_export; } public static function import($json_str = null) { // decode data $_data = json_decode($json_str, true); if ($_data) { // get validity check data $_sha = isset($_data['_sha']) ? $_data['_sha'] : false; $_version = isset($_data['panel.version']) ? $_data['panel.version'] : false; $_dbversion = isset($_data['panel.db_version']) ? $_data['panel.db_version'] : false; // check if we have everything we need if (! $_sha || ! $_version || ! $_dbversion) { throw new Exception("Invalid froxlor settings data. Unable to import."); } // validate import file unset($_data['_sha']); // compare if ($_sha != sha1(var_export($_data, true))) { throw new Exception("SHA check of import data failed. Unable to import."); } // do not import version info - but we need that to possibily update settings // when there were changes in the variable-name or similar unset($_data['panel.version']); unset($_data['panel.db_version']); // store new data foreach ($_data as $index => $value) { Settings::Set($index, $value); } // save to DB Settings::Flush(); // all good return true; } throw new Exception("Invalid JSON data: " . json_last_error_msg()); } }