| | |
| | | class rcube_install |
| | | { |
| | | var $step; |
| | | var $is_post = false; |
| | | var $failures = 0; |
| | | var $config = array(); |
| | | var $configured = false; |
| | | var $last_error = null; |
| | | var $email_pattern = '([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9])'; |
| | | var $config_props = array(); |
| | | |
| | | /** |
| | | * Constructor |
| | |
| | | function rcube_install() |
| | | { |
| | | $this->step = intval($_REQUEST['_step']); |
| | | $this->is_post = $_SERVER['REQUEST_METHOD'] == 'POST'; |
| | | } |
| | | |
| | | /** |
| | |
| | | /** |
| | | * Read the default config files and store properties |
| | | */ |
| | | function get_defaults() |
| | | function load_defaults() |
| | | { |
| | | $this->_load_config('.php.dist'); |
| | | } |
| | |
| | | */ |
| | | function load_config() |
| | | { |
| | | $this->config = array(); |
| | | $this->_load_config('.php'); |
| | | $this->configured = !empty($this->config); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | function _load_config($suffix) |
| | | { |
| | | include '../config/main.inc' . $suffix; |
| | | @include '../config/main.inc' . $suffix; |
| | | if (is_array($rcmail_config)) { |
| | | $this->config = $rcmail_config; |
| | | $this->config += $rcmail_config; |
| | | } |
| | | |
| | | @include '../config/db.inc'. $suffix; |
| | |
| | | * Getter for a certain config property |
| | | * |
| | | * @param string Property name |
| | | * @param string Default value |
| | | * @return string The property value |
| | | */ |
| | | function getprop($name) |
| | | function getprop($name, $default = '') |
| | | { |
| | | $value = isset($_REQUEST["_$name"]) ? $_REQUEST["_$name"] : $this->config[$name]; |
| | | $value = $this->is_post && (isset($_POST["_$name"]) || $this->config_props[$name]) ? $_POST["_$name"] : $this->config[$name]; |
| | | |
| | | if ($name == 'des_key' && !isset($_REQUEST["_$name"])) |
| | | $value = self::random_key(24); |
| | | $value = rcube_install::random_key(24); |
| | | |
| | | return $value; |
| | | return $value !== null && $value !== '' ? $value : $default; |
| | | } |
| | | |
| | | |
| | |
| | | return '[Warning: could not read the template file]'; |
| | | |
| | | foreach ($this->config as $prop => $default) { |
| | | $value = $_POST["_$prop"] ? $_POST["_$prop"] : $default; |
| | | $value = (isset($_POST["_$prop"]) || $this->config_props[$prop]) ? $_POST["_$prop"] : $default; |
| | | |
| | | // convert some form data |
| | | if ($prop == 'debug_level' && is_array($value)) { |
| | |
| | | $value = $val; |
| | | } |
| | | else if ($prop == 'db_dsnw' && !empty($_POST['_dbtype'])) { |
| | | $value = sprintf('%s://%s:%s@%s/%s', $_POST['_dbtype'], $_POST['_dbuser'], $_POST['_dbpass'], $_POST['_dbhost'], $_POST['_dbname']); |
| | | if ($_POST['_dbtype'] == 'sqlite') |
| | | $value = sprintf('%s://%s?mode=0646', $_POST['_dbtype'], $_POST['_dbname']{0} == '/' ? '/' . $_POST['_dbname'] : $_POST['_dbname']); |
| | | else |
| | | $value = sprintf('%s://%s:%s@%s/%s', $_POST['_dbtype'], $_POST['_dbuser'], $_POST['_dbpass'], $_POST['_dbhost'], $_POST['_dbname']); |
| | | } |
| | | else if ($prop == 'smtp_auth_type' && $value == '0') { |
| | | $value = ''; |
| | | } |
| | | else if ($prop == 'default_host' && is_array($value)) { |
| | | $value = self::_clean_array($value); |
| | | $value = rcube_install::_clean_array($value); |
| | | if (count($value) <= 1) |
| | | $value = $value[0]; |
| | | } |
| | |
| | | $value = '%p'; |
| | | } |
| | | else if (is_bool($default)) { |
| | | $value = is_numeric($value) ? (bool)$value : $value; |
| | | $value = (bool)$value; |
| | | } |
| | | else if (is_numeric($value)) { |
| | | $value = intval($value); |
| | | } |
| | | |
| | | // skip this property |
| | |
| | | $out); |
| | | } |
| | | |
| | | return $out; |
| | | return trim($out); |
| | | } |
| | | |
| | | |
| | |
| | | function get_error() |
| | | { |
| | | return $this->last_error['message']; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Return a list with all imap hosts configured |
| | | * |
| | | * @return array Clean list with imap hosts |
| | | */ |
| | | function get_hostlist() |
| | | { |
| | | $default_hosts = (array)$this->getprop('default_host'); |
| | | $out = array(); |
| | | |
| | | foreach ($default_hosts as $key => $name) { |
| | | if (!empty($name)) |
| | | $out[] = is_numeric($key) ? $name : $key; |
| | | } |
| | | |
| | | return $out; |
| | | } |
| | | |
| | | |
| | |
| | | return $out; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Initialize the database with the according schema |
| | | * |
| | | * @param object rcube_db Database connection |
| | | * @return boolen True on success, False on error |
| | | */ |
| | | function init_db($DB) |
| | | { |
| | | $db_map = array('pgsql' => 'postgres', 'mysqli' => 'mysql'); |
| | | $engine = isset($db_map[$DB->db_provider]) ? $db_map[$DB->db_provider] : $DB->db_provider; |
| | | |
| | | // find out db version |
| | | if ($engine == 'mysql') { |
| | | $DB->query('SELECT VERSION() AS version'); |
| | | $sql_arr = $DB->fetch_assoc(); |
| | | $version = floatval($sql_arr['version']); |
| | | |
| | | if ($version >= 4.1) |
| | | $engine = 'mysql5'; |
| | | } |
| | | |
| | | // read schema file from /SQL/* |
| | | $fname = "../SQL/$engine.initial.sql"; |
| | | if ($lines = @file($fname, FILE_SKIP_EMPTY_LINES)) { |
| | | $buff = ''; |
| | | foreach ($lines as $i => $line) { |
| | | if (eregi('^--', $line)) |
| | | continue; |
| | | |
| | | $buff .= $line . "\n"; |
| | | if (eregi(';$', trim($line))) { |
| | | $DB->query($buff); |
| | | $buff = ''; |
| | | } |
| | | } |
| | | } |
| | | else { |
| | | $this->fail('DB Schema', "Cannot read the schema file: $fname"); |
| | | return false; |
| | | } |
| | | |
| | | if ($err = $this->get_error()) { |
| | | $this->fail('DB Schema', "Error creating database schema: $err"); |
| | | return false; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * Handler for RoundCube errors |
| | | */ |