| | |
| | | /* |
| | | +-----------------------------------------------------------------------+ |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2008-2012, The Roundcube Dev Team | |
| | | | Copyright (C) 2008-2013, The Roundcube Dev Team | |
| | | | | |
| | | | Licensed under the GNU General Public License version 3 or | |
| | | | any later version with exceptions for skins & plugins. | |
| | |
| | | const DEFAULT_SKIN = 'larry'; |
| | | |
| | | private $env = ''; |
| | | private $basedir = 'config/'; |
| | | private $paths = array(); |
| | | private $prop = array(); |
| | | private $errors = array(); |
| | | private $userprefs = array(); |
| | |
| | | public function __construct($env = '') |
| | | { |
| | | $this->env = $env; |
| | | $this->basedir = RCUBE_CONFIG_DIR; |
| | | |
| | | if ($paths = getenv('RCUBE_CONFIG_PATH')) { |
| | | $this->paths = explode(PATH_SEPARATOR, $paths); |
| | | // make all paths absolute |
| | | foreach ($this->paths as $i => $path) { |
| | | if (!$this->_is_absolute($path)) { |
| | | if ($realpath = realpath(RCUBE_INSTALL_PATH . $path)) { |
| | | $this->paths[$i] = unslashify($realpath) . '/'; |
| | | } |
| | | else { |
| | | unset($this->paths[$i]); |
| | | } |
| | | } |
| | | else { |
| | | $this->paths[$i] = unslashify($path) . '/'; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (defined('RCUBE_CONFIG_DIR') && !in_array(RCUBE_CONFIG_DIR, $this->paths)) { |
| | | $this->paths[] = RCUBE_CONFIG_DIR; |
| | | } |
| | | |
| | | if (empty($this->paths)) { |
| | | $this->paths[] = RCUBE_INSTALL_PATH . 'config/'; |
| | | } |
| | | |
| | | $this->load(); |
| | | |
| | |
| | | */ |
| | | public function load_from_file($file) |
| | | { |
| | | $fpath = $this->resolve_path($file); |
| | | $success = false; |
| | | |
| | | foreach ($this->resolve_paths($file) as $fpath) { |
| | | if ($fpath && is_file($fpath) && is_readable($fpath)) { |
| | | // use output buffering, we don't need any output here |
| | | ob_start(); |
| | |
| | | |
| | | if (is_array($config)) { |
| | | $this->merge($config); |
| | | return true; |
| | | $success = true; |
| | | } |
| | | // deprecated name of config variable |
| | | else if (is_array($rcmail_config)) { |
| | | $this->merge($rcmail_config); |
| | | return true; |
| | | $success = true; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return false; |
| | | return $success; |
| | | } |
| | | |
| | | /** |
| | | * Helper method to resolve the absolute path to the given config file. |
| | | * Helper method to resolve absolute paths to the given config file. |
| | | * This also takes the 'env' property into account. |
| | | * |
| | | * @param string Filename or absolute file path |
| | | * @param boolean Return -$env file path if exists |
| | | * @return array List of candidates in config dir path(s) |
| | | */ |
| | | public function resolve_path($file, $use_env = true) |
| | | private function resolve_paths($file, $use_env = true) |
| | | { |
| | | if (strpos($file, '/') === false) { |
| | | $file = realpath($this->basedir . '/' . $file); |
| | | } |
| | | $files = array(); |
| | | $abs_path = $this->_is_absolute($file); |
| | | |
| | | foreach ($this->paths as $basepath) { |
| | | $realpath = $abs_path ? $file : realpath($basepath . '/' . $file); |
| | | |
| | | // check if <file>-env.ini exists |
| | | if ($file && $use_env && !empty($this->env)) { |
| | | $envfile = preg_replace('/\.(inc.php)$/', '-' . $this->env . '.\\1', $file); |
| | | if ($realpath && $use_env && !empty($this->env)) { |
| | | $envfile = preg_replace('/\.(inc.php)$/', '-' . $this->env . '.\\1', $realpath); |
| | | if (is_file($envfile)) |
| | | return $envfile; |
| | | $realpath = $envfile; |
| | | } |
| | | |
| | | return $file; |
| | | if ($realpath) { |
| | | $files[] = $realpath; |
| | | |
| | | // no need to continue the loop if an absolute file path is given |
| | | if ($abs_path) { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return $files; |
| | | } |
| | | |
| | | /** |
| | | * Determine whether the given file path is absolute or relative |
| | | */ |
| | | private function _is_absolute($path) |
| | | { |
| | | return $path[0] == DIRECTORY_SEPARATOR || preg_match('!^[a-z]:[\\\\/]!i', $path); |
| | | } |
| | | |
| | | /** |
| | | * Getter for a specific config parameter |