X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=application%2Fconfig%2FConfigManager.php;h=99efc1567c85bd7b0f398a1d194a9200d5dc9adb;hb=refs%2Fheads%2Fgitolite_local%2Fldap;hp=86a917fb12c2fa0c23c5a4a83c99e4ab4afb44bd;hpb=b2e2aa42e288e0becaa95bf9cc3be679743fc98e;p=github%2Fshaarli%2FShaarli.git diff --git a/application/config/ConfigManager.php b/application/config/ConfigManager.php index 86a917fb..99efc156 100644 --- a/application/config/ConfigManager.php +++ b/application/config/ConfigManager.php @@ -9,8 +9,8 @@ use Shaarli\Config\Exception\UnauthorizedConfigException; * * Manages all Shaarli's settings. * See the documentation for more information on settings: - * - doc/Shaarli-configuration.html - * - https://github.com/shaarli/Shaarli/wiki/Shaarli-configuration + * - doc/md/Shaarli-configuration.md + * - https://shaarli.readthedocs.io/en/master/Shaarli-configuration/#configuration */ class ConfigManager { @@ -21,6 +21,11 @@ class ConfigManager public static $DEFAULT_PLUGINS = array('qrcode'); + /** + * @var string User space. + */ + protected $userSpace; + /** * @var string Config folder. */ @@ -41,12 +46,36 @@ class ConfigManager * * @param string $configFile Configuration file path without extension. */ - public function __construct($configFile = 'data/config') + public function __construct($configFile = null, $userSpace = null) { - $this->configFile = $configFile; + $this->userSpace = $this->findLDAPUser($userSpace); + if ($configFile !== null) { + $this->configFile = $configFile; + } else { + $this->configFile = ($this->userSpace === null) ? 'data/config' : 'data/' . $this->userSpace . '/config'; + } $this->initialize(); } + public function findLDAPUser($login, $password = null) { + $connect = ldap_connect(getenv('SHAARLI_LDAP_HOST')); + ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3); + if (!$connect || !ldap_bind($connect, getenv('SHAARLI_LDAP_DN'), getenv('SHAARLI_LDAP_PASSWORD'))) { + return false; + } + + $search_query = str_replace('%login%', ldap_escape($login), getenv('SHAARLI_LDAP_FILTER')); + + $search = ldap_search($connect, getenv('SHAARLI_LDAP_BASE'), $search_query); + $info = ldap_get_entries($connect, $search); + + if (ldap_count_entries($connect, $search) == 1 && (is_null($password) || ldap_bind($connect, $info[0]["dn"], $password))) { + return $login; + } else { + return null; + } + } + /** * Reset the ConfigManager instance. */ @@ -123,7 +152,7 @@ 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. * @@ -132,7 +161,7 @@ class ConfigManager 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. @@ -147,6 +176,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. * @@ -242,6 +298,16 @@ class ConfigManager return $this->configFile . $this->configIO->getExtension(); } + /** + * Get the current userspace. + * + * @return mixed User space. + */ + public function getUserSpace() + { + return $this->userSpace; + } + /** * Recursive function which find asked setting in the loaded config. * @@ -272,7 +338,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. */ @@ -289,33 +355,68 @@ class ConfigManager $conf[$setting] = $value; } + /** + * 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 static function removeConfig($settings, &$conf) + { + if (!is_array($settings) || count($settings) == 0) { + return self::$NOT_FOUND; + } + + $setting = array_shift($settings); + if (count($settings) > 0) { + return self::removeConfig($settings, $conf[$setting]); + } + unset($conf[$setting]); + } + /** * 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'); + if ($this->userSpace === null) { + $data = 'data'; + $tmp = 'tmp'; + $cache = 'cache'; + $pagecache = 'pagecache'; + } else { + $data = 'data/' . ($this->userSpace); + $tmp = 'tmp/' . ($this->userSpace); + $cache = 'cache/' . ($this->userSpace); + $pagecache = 'pagecache/' . ($this->userSpace); + } + + $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'); + $this->setEmpty('resource.raintpl_tmp', $tmp); + $this->setEmpty('resource.thumbnails_cache', $cache); + $this->setEmpty('resource.page_cache', $pagecache); $this->setEmpty('security.ban_after', 4); $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: '); $this->setEmpty('updates.check_updates', false); $this->setEmpty('updates.check_updates_branch', 'stable'); @@ -326,14 +427,21 @@ class ConfigManager $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); - - $this->setEmpty('thumbnail.enable_thumbnails', true); - $this->setEmpty('thumbnail.enable_localcache', true); + // default state of the 'remember me' checkbox of the login form + $this->setEmpty('privacy.remember_user_default', true); $this->setEmpty('redirector.url', ''); $this->setEmpty('redirector.encode_url', true); + $this->setEmpty('thumbnails.width', '125'); + $this->setEmpty('thumbnails.height', '90'); + + $this->setEmpty('translation.language', 'auto'); + $this->setEmpty('translation.mode', 'php'); + $this->setEmpty('translation.extensions', []); + $this->setEmpty('plugins', array()); }