X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=application%2Fconfig%2FConfigManager.php;h=e6c3507329dc7e39a162c6fc4ec1103da8fadff2;hb=f3d2f257946e2a3c8791c1ba99b379acbe934fec;hp=a663a0718689fb4a3e7a0d17de8d6f2216832c6b;hpb=da10377b3c263d96a46cf9101c202554343d2cd0;p=github%2Fshaarli%2FShaarli.git diff --git a/application/config/ConfigManager.php b/application/config/ConfigManager.php index a663a071..e6c35073 100644 --- a/application/config/ConfigManager.php +++ b/application/config/ConfigManager.php @@ -1,31 +1,30 @@ initialize(); - } - - return self::$instance; + $this->configFile = $configFile; + $this->initialize(); } /** * Reset the ConfigManager instance. */ - public static function reset() + public function reset() { - self::$instance = null; - return self::getInstance(); + $this->initialize(); } /** @@ -84,10 +68,10 @@ class ConfigManager */ protected function initialize() { - if (! file_exists(self::$CONFIG_FILE .'.php')) { - $this->configIO = new ConfigJson(); - } else { + if (file_exists($this->configFile . '.php')) { $this->configIO = new ConfigPhp(); + } else { + $this->configIO = new ConfigJson(); } $this->load(); } @@ -97,7 +81,11 @@ class ConfigManager */ protected function load() { - $this->loadedConfig = $this->configIO->read($this->getConfigFile()); + try { + $this->loadedConfig = $this->configIO->read($this->getConfigFileExt()); + } catch (\Exception $e) { + die($e->getMessage()); + } $this->setDefaultValues(); } @@ -135,16 +123,16 @@ class ConfigManager * Supports nested settings with dot separated keys. * * @param string $setting Asked setting, keys separated with dots. - * @param string $value Value to set. + * @param mixed $value Value to set. * @param bool $write Write the new setting in the config file, default false. * @param bool $isLoggedIn User login state, default false. * - * @throws Exception Invalid + * @throws \Exception Invalid */ public function set($setting, $value, $write = false, $isLoggedIn = false) { if (empty($setting) || ! is_string($setting)) { - throw new Exception('Invalid setting key parameter. String expected, got: '. gettype($setting)); + throw new \Exception(t('Invalid setting key parameter. String expected, got: '). gettype($setting)); } // During the ConfigIO transition, map legacy settings to the new ones. @@ -159,6 +147,33 @@ class ConfigManager } } + /** + * Remove a config element from the config file. + * + * @param string $setting Asked setting, keys separated with dots. + * @param bool $write Write the new setting in the config file, default false. + * @param bool $isLoggedIn User login state, default false. + * + * @throws \Exception Invalid + */ + public function remove($setting, $write = false, $isLoggedIn = false) + { + if (empty($setting) || ! is_string($setting)) { + throw new \Exception(t('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::removeConfig($settings, $this->loadedConfig); + if ($write) { + $this->write($isLoggedIn); + } + } + /** * Check if a settings exists. * @@ -192,7 +207,7 @@ class ConfigManager * * @throws MissingFieldConfigException: a mandatory field has not been provided in $conf. * @throws UnauthorizedConfigException: user is not authorize to change configuration. - * @throws IOException: an error occurred while writing the new config file. + * @throws \Shaarli\Exceptions\IOException: an error occurred while writing the new config file. */ public function write($isLoggedIn) { @@ -205,12 +220,12 @@ class ConfigManager 'general.timezone', 'general.title', 'general.header_link', - 'general.default_private_links', - 'extras.redirector', + 'privacy.default_private_links', + 'redirector.url', ); // Only logged in user can alter config. - if (is_file(self::$CONFIG_FILE) && !$isLoggedIn) { + if (is_file($this->getConfigFileExt()) && !$isLoggedIn) { throw new UnauthorizedConfigException(); } @@ -221,17 +236,37 @@ class ConfigManager } } - return $this->configIO->write($this->getConfigFile(), $this->loadedConfig); + return $this->configIO->write($this->getConfigFileExt(), $this->loadedConfig); } /** - * Get the configuration file path. + * Set the config file path (without extension). * - * @return string Config file path. + * @param string $configFile File path. + */ + public function setConfigFile($configFile) + { + $this->configFile = $configFile; + } + + /** + * Return the configuration file path (without extension). + * + * @return string Config path. */ public function getConfigFile() { - return self::$CONFIG_FILE . $this->configIO->getExtension(); + return $this->configFile; + } + + /** + * Get the configuration file path with its extension. + * + * @return string Config file path. + */ + public function getConfigFileExt() + { + return $this->configFile . $this->configIO->getExtension(); } /** @@ -264,7 +299,7 @@ class ConfigManager * * @param array $settings Ordered array which contains keys to find. * @param mixed $value - * @param array $conf Loaded settings, then sub-array. + * @param array $conf Loaded settings, then sub-array. * * @return mixed Found setting or NOT_FOUND flag. */ @@ -282,85 +317,80 @@ class ConfigManager } /** - * Set a bunch of default values allowing Shaarli to start without a config file. + * Recursive function which find asked setting in the loaded config and deletes it. + * + * @param array $settings Ordered array which contains keys to find. + * @param array $conf Loaded settings, then sub-array. + * + * @return mixed Found setting or NOT_FOUND flag. */ - protected function setDefaultValues() + protected static function removeConfig($settings, &$conf) { - // Data subdirectory - $this->setEmpty('path.data_dir', 'data'); - - // Main configuration file - $this->setEmpty('path.config', 'data/config.php'); - - // Link datastore - $this->setEmpty('path.datastore', 'data/datastore.php'); - - // Banned IPs - $this->setEmpty('path.ban_file', 'data/ipbans.php'); - - // Processed updates file. - $this->setEmpty('path.updates', 'data/updates.txt'); - - // Access log - $this->setEmpty('path.log', 'data/log.txt'); - - // For updates check of Shaarli - $this->setEmpty('path.update_check', 'data/lastupdatecheck.txt'); - - // Set ENABLE_UPDATECHECK to disabled by default. - $this->setEmpty('general.check_updates', false); - - // RainTPL cache directory (keep the trailing slash!) - $this->setEmpty('path.raintpl_tmp', 'tmp/'); - // Raintpl template directory (keep the trailing slash!) - $this->setEmpty('path.raintpl_tpl', 'tpl/'); + if (!is_array($settings) || count($settings) == 0) { + return self::$NOT_FOUND; + } - // Thumbnail cache directory - $this->setEmpty('path.thumbnails_cache', 'cache'); + $setting = array_shift($settings); + if (count($settings) > 0) { + return self::removeConfig($settings, $conf[$setting]); + } + unset($conf[$setting]); + } - // Atom & RSS feed cache directory - $this->setEmpty('path.page_cache', 'pagecache'); + /** + * Set a bunch of default values allowing Shaarli to start without a config file. + */ + protected function setDefaultValues() + { + $this->setEmpty('resource.data_dir', 'data'); + $this->setEmpty('resource.config', 'data/config.php'); + $this->setEmpty('resource.datastore', 'data/datastore.php'); + $this->setEmpty('resource.ban_file', 'data/ipbans.php'); + $this->setEmpty('resource.updates', 'data/updates.txt'); + $this->setEmpty('resource.log', 'data/log.txt'); + $this->setEmpty('resource.update_check', 'data/lastupdatecheck.txt'); + $this->setEmpty('resource.history', 'data/history.php'); + $this->setEmpty('resource.raintpl_tpl', 'tpl/'); + $this->setEmpty('resource.theme', 'default'); + $this->setEmpty('resource.raintpl_tmp', 'tmp/'); + $this->setEmpty('resource.thumbnails_cache', 'cache'); + $this->setEmpty('resource.page_cache', 'pagecache'); - // Ban IP after this many failures $this->setEmpty('security.ban_after', 4); - // Ban duration for IP address after login failures (in seconds) - $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('general.rss_permalinks', true); - // If true, an extra "ATOM feed" button will be displayed in the toolbar - $this->setEmpty('extras.show_atom', false); - - // Link display options - $this->setEmpty('extras.hide_public_links', false); - $this->setEmpty('extras.hide_timestamps', false); + $this->setEmpty('security.ban_duration', 1800); + $this->setEmpty('security.session_protection_disabled', false); + $this->setEmpty('security.open_shaarli', false); + $this->setEmpty('security.allowed_protocols', ['ftp', 'ftps', 'magnet']); + + $this->setEmpty('general.header_link', '?'); $this->setEmpty('general.links_per_page', 20); + $this->setEmpty('general.enabled_plugins', self::$DEFAULT_PLUGINS); + $this->setEmpty('general.default_note_title', 'Note: '); - // Private checkbox is checked by default - $this->setEmpty('general.default_private_links', false); + $this->setEmpty('updates.check_updates', false); + $this->setEmpty('updates.check_updates_branch', 'stable'); + $this->setEmpty('updates.check_updates_interval', 86400); - // Open Shaarli (true): anyone can add/edit/delete links without having to login - $this->setEmpty('extras.open_shaarli', false); + $this->setEmpty('feed.rss_permalinks', true); + $this->setEmpty('feed.show_atom', true); - // Thumbnails - // Display thumbnails in links - $this->setEmpty('general.enable_thumbnails', true); - // Store thumbnails in a local cache - $this->setEmpty('general.enable_localcache', true); + $this->setEmpty('privacy.default_private_links', false); + $this->setEmpty('privacy.hide_public_links', false); + $this->setEmpty('privacy.force_login', false); + $this->setEmpty('privacy.hide_timestamps', false); + // default state of the 'remember me' checkbox of the login form + $this->setEmpty('privacy.remember_user_default', true); - // Update check frequency for Shaarli. 86400 seconds=24 hours - $this->setEmpty('general.check_updates_branch', 'stable'); - $this->setEmpty('general.check_updates_interval', 86400); + $this->setEmpty('redirector.url', ''); + $this->setEmpty('redirector.encode_url', true); - $this->setEmpty('extras.redirector', ''); - $this->setEmpty('extras.redirector_encode_url', true); + $this->setEmpty('thumbnails.width', '125'); + $this->setEmpty('thumbnails.height', '90'); - // Enabled plugins. - $this->setEmpty('general.enabled_plugins', array('qrcode')); + $this->setEmpty('translation.language', 'auto'); + $this->setEmpty('translation.mode', 'php'); + $this->setEmpty('translation.extensions', []); - // Initialize plugin parameters array. $this->setEmpty('plugins', array()); } @@ -370,7 +400,7 @@ class ConfigManager * @param string $key Setting key. * @param mixed $value Setting value. */ - protected function setEmpty($key, $value) + public function setEmpty($key, $value) { if (! $this->exists($key)) { $this->set($key, $value); @@ -393,36 +423,3 @@ class ConfigManager $this->configIO = $configIO; } } - -/** - * Exception used if a mandatory field is missing in given configuration. - */ -class MissingFieldConfigException extends Exception -{ - public $field; - - /** - * Construct exception. - * - * @param string $field field name missing. - */ - public function __construct($field) - { - $this->field = $field; - $this->message = 'Configuration value is required for '. $this->field; - } -} - -/** - * Exception used if an unauthorized attempt to edit configuration has been made. - */ -class UnauthorizedConfigException extends Exception -{ - /** - * Construct exception. - */ - public function __construct() - { - $this->message = 'You are not authorized to alter config.'; - } -}