From 461a30d771edd8bc6606f2c92dfde363514b93b1 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Fri, 14 Jun 2013 06:09:08 -0400 Subject: [PATCH] Merge config files (#1487311). Now we have defaults.inc.php and config.inc.php. Renamed $rcmail_config to $config. Old naming and old files are supported for backward compatibility. --- installer/rcube_install.php | 198 ++++++++++++++++++++++++++++++------------------- 1 files changed, 121 insertions(+), 77 deletions(-) diff --git a/installer/rcube_install.php b/installer/rcube_install.php index 29c18d9..8165401 100644 --- a/installer/rcube_install.php +++ b/installer/rcube_install.php @@ -29,7 +29,6 @@ var $config = array(); var $configured = false; var $last_error = null; - var $db_map = array('pgsql' => 'postgres', 'mysqli' => 'mysql', 'sqlsrv' => 'mssql'); var $email_pattern = '([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9])'; var $bool_config_props = array(); @@ -43,12 +42,6 @@ 'pagesize' => 'mail_pagesize', 'default_imap_folders' => 'default_folders', 'top_posting' => 'reply_mode', - ); - - // these config options are required for a working system - var $required_config = array( - 'db_dsnw', 'db_table_contactgroups', 'db_table_contactgroupmembers', - 'des_key', 'session_lifetime', 'support_url', ); // list of supported database drivers @@ -65,7 +58,7 @@ /** * Constructor */ - function rcube_install() + function __construct() { $this->step = intval($_REQUEST['_step']); $this->is_post = $_SERVER['REQUEST_METHOD'] == 'POST'; @@ -74,7 +67,7 @@ /** * Singleton getter */ - function get_instance() + static function get_instance() { static $inst; @@ -85,42 +78,50 @@ } /** - * Read the default config files and store properties - */ - function load_defaults() - { - $this->_load_config('.php.dist'); - } - - - /** * Read the local config files and store properties */ function load_config() { - $this->config = array(); - $this->_load_config('.php'); - $this->configured = !empty($this->config); + // defaults + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'defaults.inc.php')) { + $this->config = (array) $config; + $this->defaults = $this->config; + } + + $config = null; + + // config + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'config.inc.php')) { + $this->config = array_merge($this->config, $config); + } + else { + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'main.inc.php')) { + $this->config = array_merge($this->config, $config); + } + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'db.inc.php')) { + $this->config = array_merge($this->config, $config); + } + } + + $this->configured = !empty($config); } /** * Read the default config file and store properties - * @access private */ - function _load_config($suffix) + public function load_config_file($file) { - if (is_readable($main_inc = RCUBE_CONFIG_DIR . 'main.inc' . $suffix)) { - include($main_inc); - if (is_array($rcmail_config)) - $this->config += $rcmail_config; - } - if (is_readable($db_inc = RCUBE_CONFIG_DIR . 'db.inc'. $suffix)) { - include($db_inc); - if (is_array($rcmail_config)) - $this->config += $rcmail_config; + if (is_readable($file)) { + include $file; + + // deprecated name of config variable + if (is_array($rcmail_config)) { + return $rcmail_config; + } + + return $config; } } - /** * Getter for a certain config property @@ -141,21 +142,16 @@ /** - * Take the default config file and replace the parameters - * with the submitted form data + * Create configuration file that contains parameters + * that differ from default values. * - * @param string Which config file (either 'main' or 'db') * @return string The complete config file content */ - function create_config($which, $force = false) + function create_config() { - $out = @file_get_contents(RCUBE_CONFIG_DIR . $which . '.inc.php.dist'); - - if (!$out) - return '[Warning: could not read the config template file]'; + $config = array(); foreach ($this->config as $prop => $default) { - $is_default = !isset($_POST["_$prop"]); $value = !$is_default || $this->bool_config_props[$prop] ? $_POST["_$prop"] : $default; @@ -213,20 +209,26 @@ } // skip this property - if (!$force && !$this->configured && ($value == $default)) + if (!array_key_exists($prop, $this->defaults) || ($value == $this->defaults[$prop])) { continue; + } // save change $this->config[$prop] = $value; - - // replace the matching line in config file - $out = preg_replace( - '/(\$rcmail_config\[\''.preg_quote($prop).'\'\])\s+=\s+(.+);/Uie', - "'\\1 = ' . rcube_install::_dump_var(\$value, \$prop) . ';'", - $out); + $config[$prop] = $value; } - return trim($out); + // sort by option name + ksort($config); + + $out = "<?php\n\n"; + foreach ($config as $prop => $value) { + // @TODO: copy option descriptions from defaults.inc.php file? + $out .= "\$config['$prop'] = " . rcube_install::_dump_var($value, $prop) . ";\n"; + } + $out .= "\n?>"; + + return $out; } @@ -238,16 +240,13 @@ */ function check_config() { - $this->config = array(); - $this->load_defaults(); - $defaults = $this->config; - $this->load_config(); - if (!$this->configured) + + if (!$this->configured) { return null; + } $out = $seen = array(); - $required = array_flip($this->required_config); // iterate over the current configuration foreach ($this->config as $prop => $value) { @@ -261,10 +260,9 @@ } } - // iterate over default config - foreach ($defaults as $prop => $value) { - if (!isset($seen[$prop]) && isset($required[$prop]) && !(is_bool($this->config[$prop]) || strlen($this->config[$prop]))) - $out['missing'][] = array('prop' => $prop); + // the old default mime_magic reference is obsolete + if ($this->config['mime_magic'] == '/usr/share/misc/magic') { + $out['obsolete'][] = array('prop' => 'mime_magic', 'explain' => "Set value to null in order to use system default"); } // check config dependencies and contradictions @@ -284,7 +282,7 @@ if ($this->config['log_driver'] == 'syslog') { if (!function_exists('openlog')) { $out['dependencies'][] = array('prop' => 'log_driver', - 'explain' => 'This requires the <tt>sylog</tt> extension which could not be loaded.'); + 'explain' => 'This requires the <tt>syslog</tt> extension which could not be loaded.'); } if (empty($this->config['syslog_id'])) { $out['dependencies'][] = array('prop' => 'syslog_id', @@ -314,7 +312,6 @@ { $current = $this->config; $this->config = array(); - $this->load_defaults(); foreach ($this->replaced_config as $prop => $replacement) { if (isset($current[$prop])) { @@ -342,9 +339,9 @@ } } - $this->config = array_merge($this->config, $current); + $this->config = array_merge($this->config, $current); - foreach ((array)$current['ldap_public'] as $key => $values) { + foreach (array_keys((array)$current['ldap_public']) as $key) { $this->config['ldap_public'][$key] = $current['ldap_public'][$key]; } } @@ -353,10 +350,11 @@ * Compare the local database schema with the reference schema * required for this version of Roundcube * - * @param boolean True if the schema schould be updated + * @param rcube_db Database object + * * @return boolean True if the schema is up-to-date, false if not or an error occured */ - function db_schema_check($DB, $update = false) + function db_schema_check($DB) { if (!$this->configured) return false; @@ -369,7 +367,7 @@ $existing_tables = $DB->list_tables(); foreach ($db_schema as $table => $cols) { - $table = !empty($this->config['db_table_'.$table]) ? $this->config['db_table_'.$table] : $table; + $table = $this->config['db_prefix'] . $table; if (!in_array($table, $existing_tables)) { $errors[] = "Missing table '".$table."'"; } @@ -448,11 +446,12 @@ '0.2-alpha', '0.2-beta', '0.2-stable', '0.3-stable', '0.3.1', '0.4-beta', '0.4.2', - '0.5-beta', '0.5', '0.5.1', + '0.5-beta', '0.5', '0.5.1', '0.5.2', '0.5.3', '0.5.4', '0.6-beta', '0.6', - '0.7-beta', '0.7', '0.7.1', '0.7.2', '0.7.3', - '0.8-beta', '0.8-rc', '0.8.0', '0.8.1', '0.8.2', '0.8.3', '0.8.4', - '0.9-beta', + '0.7-beta', '0.7', '0.7.1', '0.7.2', '0.7.3', '0.7.4', + '0.8-beta', '0.8-rc', '0.8.0', '0.8.1', '0.8.2', '0.8.3', '0.8.4', '0.8.5', '0.8.6', + '0.9-beta', '0.9-rc', '0.9-rc2', + // Note: Do not add newer versions here )); return $select; } @@ -558,7 +557,8 @@ } - static function _dump_var($var, $name=null) { + static function _dump_var($var, $name=null) + { // special values switch ($name) { case 'syslog_facility': @@ -571,8 +571,20 @@ if ($val = $list[$var]) return $val; break; - } + case 'mail_header_delimiter': + $var = str_replace(array("\r", "\n"), array('\r', '\n'), $var); + return '"' . $var. '"'; + break; +/* + // RCMAIL_VERSION is undefined here + case 'useragent': + if (preg_match('|^(.*)/('.preg_quote(RCMAIL_VERSION, '|').')$|i', $var, $m)) { + return '"' . addcslashes($var, '"') . '/" . RCMAIL_VERSION'; + } + break; +*/ + } if (is_array($var)) { if (empty($var)) { @@ -580,7 +592,7 @@ } else { // check if all keys are numeric $isnum = true; - foreach ($var as $key => $value) { + foreach (array_keys($var) as $key) { if (!is_numeric($key)) { $isnum = false; break; @@ -604,7 +616,7 @@ */ function init_db($DB) { - $engine = isset($this->db_map[$DB->db_provider]) ? $this->db_map[$DB->db_provider] : $DB->db_provider; + $engine = $DB->db_provider; // read schema file from /SQL/* $fname = INSTALL_PATH . "SQL/$engine.initial.sql"; @@ -634,8 +646,10 @@ */ function update_db($version) { - system(INSTALL_PATH . "bin/updatedb.sh --label=roundcube --version=" . $version - . " --dir=" . INSTALL_PATH . "SQL", $result); + system(INSTALL_PATH . "bin/updatedb.sh --package=roundcube" + . " --version=" . escapeshellarg($version) + . " --dir=" . INSTALL_PATH . "SQL" + . " 2>&1", $result); return !$result; } @@ -650,6 +664,7 @@ */ function exec_sql($sql, $DB) { + $sql = $this->fix_table_names($sql, $DB); $buff = ''; foreach (explode("\n", $sql) as $line) { if (preg_match('/^--/', $line) || trim($line) == '') @@ -669,6 +684,35 @@ /** + * Parse SQL file and fix table names according to db_prefix + * Note: This need to be a complete database initial file + */ + private function fix_table_names($sql, $DB) + { + if (empty($this->config['db_prefix'])) { + return $sql; + } + + // replace table names + if (preg_match_all('/CREATE TABLE (\[dbo\]\.|IF NOT EXISTS )?[`"\[\]]*([^`"\[\] \r\n]+)/i', $sql, $matches)) { + foreach ($matches[2] as $table) { + $real_table = $this->config['db_prefix'] . $table; + $sql = preg_replace("/([^a-zA-Z0-9_])$table([^a-zA-Z0-9_])/", "\\1$real_table\\2", $sql); + } + } + // replace sequence names + if ($DB->db_provider == 'postgres' && preg_match_all('/CREATE SEQUENCE (IF NOT EXISTS )?"?([^" \n\r]+)/i', $sql, $matches)) { + foreach ($matches[2] as $sequence) { + $real_sequence = $this->config['db_prefix'] . $sequence; + $sql = preg_replace("/([^a-zA-Z0-9_])$sequence([^a-zA-Z0-9_])/", "\\1$real_sequence\\2", $sql); + } + } + + return $sql; + } + + + /** * Handler for Roundcube errors */ function raise_error($p) -- Gitblit v1.9.1