From da10377b3c263d96a46cf9101c202554343d2cd0 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 29 May 2016 16:10:32 +0200 Subject: Rename configuration keys and fix GLOBALS in templates --- application/ApplicationUtils.php | 19 ++++----- application/PageBuilder.php | 25 ++++++----- application/Updater.php | 21 ++++++--- application/config/ConfigJson.php | 33 +++++++------- application/config/ConfigManager.php | 83 +++++++++++++++++++++++------------- application/config/ConfigPhp.php | 45 +++++++++++++++++++ 6 files changed, 150 insertions(+), 76 deletions(-) (limited to 'application') diff --git a/application/ApplicationUtils.php b/application/ApplicationUtils.php index ed9abc39..37deb4b3 100644 --- a/application/ApplicationUtils.php +++ b/application/ApplicationUtils.php @@ -144,20 +144,19 @@ class ApplicationUtils 'application', 'inc', 'plugins', - $conf->get('config.RAINTPL_TPL'), + $conf->get('path.raintpl_tpl'), ) as $path) { if (! is_readable(realpath($path))) { $errors[] = '"'.$path.'" directory is not readable'; } } - $datadir = $conf->get('config.DATADIR'); // Check cache and data directories are readable and writeable foreach (array( - $conf->get('config.CACHEDIR'), - $datadir, - $conf->get('config.PAGECACHE'), - $conf->get('config.RAINTPL_TMP'), + $conf->get('path.thumbnails_cache'), + $conf->get('path.data_dir'), + $conf->get('path.page_cache'), + $conf->get('path.raintpl_tmp'), ) as $path) { if (! is_readable(realpath($path))) { $errors[] = '"'.$path.'" directory is not readable'; @@ -170,10 +169,10 @@ class ApplicationUtils // Check configuration files are readable and writeable foreach (array( $conf->getConfigFile(), - $conf->get('config.DATASTORE'), - $conf->get('config.IPBANS_FILENAME'), - $conf->get('config.LOG_FILE'), - $conf->get('config.UPDATECHECK_FILENAME'), + $conf->get('path.datastore'), + $conf->get('path.ban_file'), + $conf->get('path.log'), + $conf->get('path.update_check'), ) as $path) { if (! is_file(realpath($path))) { # the file may not exist yet diff --git a/application/PageBuilder.php b/application/PageBuilder.php index 1d3ba9e8..04454865 100644 --- a/application/PageBuilder.php +++ b/application/PageBuilder.php @@ -34,17 +34,17 @@ class PageBuilder try { $version = ApplicationUtils::checkUpdate( shaarli_version, - $conf->get('config.UPDATECHECK_FILENAME'), - $conf->get('config.UPDATECHECK_INTERVAL'), - $conf->get('config.ENABLE_UPDATECHECK'), + $conf->get('path.update_check'), + $conf->get('general.check_updates_interval'), + $conf->get('general.check_updates'), isLoggedIn(), - $conf->get('config.UPDATECHECK_BRANCH') + $conf->get('general.check_updates_branch') ); $this->tpl->assign('newVersion', escape($version)); $this->tpl->assign('versionError', ''); } catch (Exception $exc) { - logm($conf->get('config.LOG_FILE'), $_SERVER['REMOTE_ADDR'], $exc->getMessage()); + logm($conf->get('path.log'), $_SERVER['REMOTE_ADDR'], $exc->getMessage()); $this->tpl->assign('newVersion', ''); $this->tpl->assign('versionError', escape($exc->getMessage())); } @@ -63,20 +63,19 @@ class PageBuilder $this->tpl->assign('scripturl', index_url($_SERVER)); $this->tpl->assign('pagetitle', 'Shaarli'); $this->tpl->assign('privateonly', !empty($_SESSION['privateonly'])); // Show only private links? - if ($conf->exists('title')) { - $this->tpl->assign('pagetitle', $conf->get('title')); + if ($conf->exists('general.title')) { + $this->tpl->assign('pagetitle', $conf->get('general.title')); } - if ($conf->exists('titleLink')) { - $this->tpl->assign('titleLink', $conf->get('titleLink')); + if ($conf->exists('general.header_link')) { + $this->tpl->assign('titleLink', $conf->get('general.header_link')); } if ($conf->exists('pagetitle')) { $this->tpl->assign('pagetitle', $conf->get('pagetitle')); } $this->tpl->assign('shaarlititle', $conf->get('title', 'Shaarli')); - $this->tpl->assign('openshaarli', $conf->get('config.OPEN_SHAARLI', false)); - $this->tpl->assign('showatom', $conf->get('config.SHOW_ATOM', false)); - $this->tpl->assign('hide_timestamps', $conf->get('config.HIDE_TIMESTAMPS', false)); - // FIXME! Globals + $this->tpl->assign('openshaarli', $conf->get('extras.open_shaarli', false)); + $this->tpl->assign('showatom', $conf->get('extras.show_atom', false)); + $this->tpl->assign('hide_timestamps', $conf->get('extras.hide_timestamps', false)); if (!empty($GLOBALS['plugin_errors'])) { $this->tpl->assign('plugin_errors', $GLOBALS['plugin_errors']); } diff --git a/application/Updater.php b/application/Updater.php index 8552850c..31630ff5 100644 --- a/application/Updater.php +++ b/application/Updater.php @@ -109,8 +109,8 @@ class Updater { $conf = ConfigManager::getInstance(); - if (is_file($conf->get('config.DATADIR') . '/options.php')) { - include $conf->get('config.DATADIR') . '/options.php'; + if (is_file($conf->get('path.data_dir') . '/options.php')) { + include $conf->get('path.data_dir') . '/options.php'; // Load GLOBALS into config $allowedKeys = array_merge(ConfigPhp::$ROOT_KEYS); @@ -121,7 +121,7 @@ class Updater } } $conf->write($this->isLoggedIn); - unlink($conf->get('config.DATADIR').'/options.php'); + unlink($conf->get('path.data_dir').'/options.php'); } return true; @@ -139,14 +139,15 @@ class Updater $link['tags'] = implode(' ', array_unique(LinkFilter::tagsStrToArray($link['tags'], true))); $this->linkDB[$link['linkdate']] = $link; } - $this->linkDB->savedb($conf->get('config.PAGECACHE')); + $this->linkDB->savedb($conf->get('path.page_cache')); return true; } /** * Move old configuration in PHP to the new config system in JSON format. * - * Will rename 'config.php' into 'config.save.php' and create 'config.json'. + * Will rename 'config.php' into 'config.save.php' and create 'config.json.php'. + * It will also convert legacy setting keys to the new ones. */ public function updateMethodConfigToJson() { @@ -164,15 +165,21 @@ class Updater $conf->setConfigIO($configJson); $conf->reload(); + $legacyMap = array_flip(ConfigPhp::$LEGACY_KEYS_MAPPING); foreach (ConfigPhp::$ROOT_KEYS as $key) { - $conf->set($key, $oldConfig[$key]); + $conf->set($legacyMap[$key], $oldConfig[$key]); } // Set sub config keys (config and plugins) $subConfig = array('config', 'plugins'); foreach ($subConfig as $sub) { foreach ($oldConfig[$sub] as $key => $value) { - $conf->set($sub .'.'. $key, $value); + if (isset($legacyMap[$sub .'.'. $key])) { + $configKey = $legacyMap[$sub .'.'. $key]; + } else { + $configKey = $sub .'.'. $key; + } + $conf->set($configKey, $value); } } diff --git a/application/config/ConfigJson.php b/application/config/ConfigJson.php index cbafbf6d..94693c86 100644 --- a/application/config/ConfigJson.php +++ b/application/config/ConfigJson.php @@ -7,30 +7,16 @@ */ class ConfigJson implements ConfigIO { - /** - * The JSON data is wrapped in a PHP file for security purpose. - * This way, even if the file is accessible, credentials and configuration won't be exposed. - * - * @var string PHP start tag and comment tag. - */ - public static $PHP_HEADER; - - public function __construct() - { - // The field can't be initialized directly with concatenation before PHP 5.6. - self::$PHP_HEADER = 'configIO instanceof ConfigPhp && isset(ConfigPhp::$LEGACY_KEYS_MAPPING[$setting])) { + $setting = ConfigPhp::$LEGACY_KEYS_MAPPING[$setting]; + } + $settings = explode('.', $setting); $value = self::getConfig($settings, $this->loadedConfig); if ($value === self::$NOT_FOUND) { @@ -142,6 +147,11 @@ class ConfigManager throw new Exception('Invalid setting key parameter. String expected, got: '. gettype($setting)); } + // During the ConfigIO transition, map legacy settings to the new ones. + if ($this->configIO instanceof ConfigPhp && isset(ConfigPhp::$LEGACY_KEYS_MAPPING[$setting])) { + $setting = ConfigPhp::$LEGACY_KEYS_MAPPING[$setting]; + } + $settings = explode('.', $setting); self::setConfig($settings, $value, $this->loadedConfig); if ($write) { @@ -160,6 +170,11 @@ class ConfigManager */ public function exists($setting) { + // During the ConfigIO transition, map legacy settings to the new ones. + if ($this->configIO instanceof ConfigPhp && isset(ConfigPhp::$LEGACY_KEYS_MAPPING[$setting])) { + $setting = ConfigPhp::$LEGACY_KEYS_MAPPING[$setting]; + } + $settings = explode('.', $setting); $value = self::getConfig($settings, $this->loadedConfig); if ($value === self::$NOT_FOUND) { @@ -183,8 +198,15 @@ class ConfigManager { // These fields are required in configuration. $mandatoryFields = array( - 'login', 'hash', 'salt', 'timezone', 'title', 'titleLink', - 'redirector', 'disablesessionprotection', 'privateLinkByDefault' + 'credentials.login', + 'credentials.hash', + 'credentials.salt', + 'security.session_protection_disabled', + 'general.timezone', + 'general.title', + 'general.header_link', + 'general.default_private_links', + 'extras.redirector', ); // Only logged in user can alter config. @@ -265,75 +287,78 @@ class ConfigManager protected function setDefaultValues() { // Data subdirectory - $this->setEmpty('config.DATADIR', 'data'); + $this->setEmpty('path.data_dir', 'data'); // Main configuration file - $this->setEmpty('config.CONFIG_FILE', 'data/config.php'); + $this->setEmpty('path.config', 'data/config.php'); // Link datastore - $this->setEmpty('config.DATASTORE', 'data/datastore.php'); + $this->setEmpty('path.datastore', 'data/datastore.php'); // Banned IPs - $this->setEmpty('config.IPBANS_FILENAME', 'data/ipbans.php'); + $this->setEmpty('path.ban_file', 'data/ipbans.php'); // Processed updates file. - $this->setEmpty('config.UPDATES_FILE', 'data/updates.txt'); + $this->setEmpty('path.updates', 'data/updates.txt'); // Access log - $this->setEmpty('config.LOG_FILE', 'data/log.txt'); + $this->setEmpty('path.log', 'data/log.txt'); // For updates check of Shaarli - $this->setEmpty('config.UPDATECHECK_FILENAME', 'data/lastupdatecheck.txt'); + $this->setEmpty('path.update_check', 'data/lastupdatecheck.txt'); // Set ENABLE_UPDATECHECK to disabled by default. - $this->setEmpty('config.ENABLE_UPDATECHECK', false); + $this->setEmpty('general.check_updates', false); // RainTPL cache directory (keep the trailing slash!) - $this->setEmpty('config.RAINTPL_TMP', 'tmp/'); + $this->setEmpty('path.raintpl_tmp', 'tmp/'); // Raintpl template directory (keep the trailing slash!) - $this->setEmpty('config.RAINTPL_TPL', 'tpl/'); + $this->setEmpty('path.raintpl_tpl', 'tpl/'); // Thumbnail cache directory - $this->setEmpty('config.CACHEDIR', 'cache'); + $this->setEmpty('path.thumbnails_cache', 'cache'); // Atom & RSS feed cache directory - $this->setEmpty('config.PAGECACHE', 'pagecache'); + $this->setEmpty('path.page_cache', 'pagecache'); // Ban IP after this many failures - $this->setEmpty('config.BAN_AFTER', 4); + $this->setEmpty('security.ban_after', 4); // Ban duration for IP address after login failures (in seconds) - $this->setEmpty('config.BAN_DURATION', 1800); + $this->setEmpty('security.ban_after', 1800); // Feed options // Enable RSS permalinks by default. // This corresponds to the default behavior of shaarli before this was added as an option. - $this->setEmpty('config.ENABLE_RSS_PERMALINKS', true); + $this->setEmpty('general.rss_permalinks', true); // If true, an extra "ATOM feed" button will be displayed in the toolbar - $this->setEmpty('config.SHOW_ATOM', false); + $this->setEmpty('extras.show_atom', false); // Link display options - $this->setEmpty('config.HIDE_PUBLIC_LINKS', false); - $this->setEmpty('config.HIDE_TIMESTAMPS', false); - $this->setEmpty('config.LINKS_PER_PAGE', 20); + $this->setEmpty('extras.hide_public_links', false); + $this->setEmpty('extras.hide_timestamps', false); + $this->setEmpty('general.links_per_page', 20); + + // Private checkbox is checked by default + $this->setEmpty('general.default_private_links', false); // Open Shaarli (true): anyone can add/edit/delete links without having to login - $this->setEmpty('config.OPEN_SHAARLI', false); + $this->setEmpty('extras.open_shaarli', false); // Thumbnails // Display thumbnails in links - $this->setEmpty('config.ENABLE_THUMBNAILS', true); + $this->setEmpty('general.enable_thumbnails', true); // Store thumbnails in a local cache - $this->setEmpty('config.ENABLE_LOCALCACHE', true); + $this->setEmpty('general.enable_localcache', true); // Update check frequency for Shaarli. 86400 seconds=24 hours - $this->setEmpty('config.UPDATECHECK_BRANCH', 'stable'); - $this->setEmpty('config.UPDATECHECK_INTERVAL', 86400); + $this->setEmpty('general.check_updates_branch', 'stable'); + $this->setEmpty('general.check_updates_interval', 86400); - $this->setEmpty('redirector', ''); - $this->setEmpty('config.REDIRECTOR_URLENCODE', true); + $this->setEmpty('extras.redirector', ''); + $this->setEmpty('extras.redirector_encode_url', true); // Enabled plugins. - $this->setEmpty('config.ENABLED_PLUGINS', array('qrcode')); + $this->setEmpty('general.enabled_plugins', array('qrcode')); // Initialize plugin parameters array. $this->setEmpty('plugins', array()); diff --git a/application/config/ConfigPhp.php b/application/config/ConfigPhp.php index f99073af..b122f4f1 100644 --- a/application/config/ConfigPhp.php +++ b/application/config/ConfigPhp.php @@ -23,6 +23,51 @@ class ConfigPhp implements ConfigIO 'privateLinkByDefault', ); + /** + * Map legacy config keys with the new ones. + * If ConfigPhp is used, getting will actually look for . + * The Updater will use this array to transform keys when switching to JSON. + * + * @var array current key => legacy key. + */ + public static $LEGACY_KEYS_MAPPING = array( + 'credentials.login' => 'login', + 'credentials.hash' => 'hash', + 'credentials.salt' => 'salt', + 'path.data_dir' => 'config.DATADIR', + 'path.config' => 'config.CONFIG_FILE', + 'path.datastore' => 'config.DATASTORE', + 'path.updates' => 'config.UPDATES_FILE', + 'path.log' => 'config.LOG_FILE', + 'path.update_check' => 'config.UPDATECHECK_FILENAME', + 'path.raintpl_tpl' => 'config.RAINTPL_TPL', + 'path.raintpl_tmp' => 'config.RAINTPL_TMP', + 'path.thumbnails_cache' => 'config.CACHEDIR', + 'path.page_cache' => 'config.PAGECACHE', + 'path.ban_file' => 'config.IPBANS_FILENAME', + 'security.session_protection_disabled' => 'disablesessionprotection', + 'security.ban_after' => 'config.BAN_AFTER', + 'security.ban_duration' => 'config.BAN_DURATION', + 'general.title' => 'title', + 'general.timezone' => 'timezone', + 'general.header_link' => 'titleLink', + 'general.check_updates' => 'config.ENABLE_UPDATECHECK', + 'general.check_updates_branch' => 'config.UPDATECHECK_BRANCH', + 'general.check_updates_interval' => 'config.UPDATECHECK_INTERVAL', + 'general.default_private_links' => 'privateLinkByDefault', + 'general.rss_permalinks' => 'config.ENABLE_RSS_PERMALINKS', + 'general.links_per_page' => 'config.LINKS_PER_PAGE', + 'general.enable_thumbnails' => 'config.ENABLE_THUMBNAILS', + 'general.enable_localcache' => 'config.ENABLE_LOCALCACHE', + 'general.enabled_plugins' => 'config.ENABLED_PLUGINS', + 'extras.redirector' => 'redirector', + 'extras.redirector_encode_url' => 'config.REDIRECTOR_URLENCODE', + 'extras.show_atom' => 'config.SHOW_ATOM', + 'extras.hide_public_links' => 'config.HIDE_PUBLIC_LINKS', + 'extras.hide_timestamps' => 'config.HIDE_TIMESTAMPS', + 'extras.open_shaarli' => 'config.OPEN_SHAARLI', + ); + /** * @inheritdoc */ -- cgit v1.2.3