alecpl
2010-07-26 3a4c9f424bff7fc937334ac230217ffe5b2e246c
installer/rcube_install.php
@@ -40,15 +40,8 @@
    'addrbook_show_images' => 'show_images',
  );
  
  // these config options are optional or can be set to null
  var $optional_config = array(
    'log_driver', 'syslog_id', 'syslog_facility', 'imap_auth_type',
    'smtp_helo_host', 'smtp_auth_type', 'sendmail_delay', 'double_auth',
    'language', 'mail_header_delimiter', 'create_default_folders',
    'quota_zero_as_unlimited', 'spellcheck_uri', 'spellcheck_languages',
    'http_received_header', 'session_domain', 'mime_magic', 'log_logins',
    'enable_installer', 'skin_include_php', 'imap_root', 'imap_delimiter',
    'virtuser_file', 'virtuser_query', 'dont_override');
  // these config options are required for a working system
  var $required_config = array('db_dsnw', 'db_table_contactgroups', 'db_table_contactgroupmembers', 'des_key');
  
  /**
   * Constructor
@@ -230,7 +223,7 @@
      return null;
    
    $out = $seen = array();
    $optional = array_flip($this->optional_config);
    $required = array_flip($this->required_config);
    
    // iterate over the current configuration
    foreach ($this->config as $prop => $value) {
@@ -246,19 +239,19 @@
    
    // iterate over default config
    foreach ($defaults as $prop => $value) {
      if (!$seen[$prop] && !isset($this->config[$prop]) && !isset($optional[$prop]))
      if (!isset($seen[$prop]) && !isset($this->config[$prop]) && isset($required[$prop]))
        $out['missing'][] = array('prop' => $prop);
    }
    // check config dependencies and contradictions
    if ($this->config['enable_spellcheck'] && $this->config['spellcheck_engine'] == 'pspell') {
      if (!extension_loaded('pspell')) {
        $out['dependencies'][] = array('prop' => 'spellcheck_engine',
          'explain' => 'This requires the <tt>pspell</tt> extension which could not be loaded.');
      }
      if (!empty($this->config['spellcheck_languages'])) {
      else if (!empty($this->config['spellcheck_languages'])) {
        foreach ($this->config['spellcheck_languages'] as $lang => $descr)
     if (!pspell_new($lang))
          if (!pspell_new($lang))
            $out['dependencies'][] = array('prop' => 'spellcheck_languages',
              'explain' => "You are missing pspell support for language $lang ($descr)");
      }
@@ -332,6 +325,44 @@
    }
  }
  
  /**
   * Compare the local database schema with the reference schema
   * required for this version of RoundCube
   *
   * @param boolean True if the schema schould be updated
   * @return boolean True if the schema is up-to-date, false if not or an error occured
   */
  function db_schema_check($DB, $update = false)
  {
    if (!$this->configured)
      return false;
    // simple ad hand-made db schema
    $db_schema = array(
      'users' => array(),
      'identities' => array(),
      'contacts' => array(),
      'contactgroups' => array(),
      'contactgroupmembers' => array(),
      'cache' => array(),
      'messages' => array(),
      'session' => array(),
    );
    $errors = array();
    // check list of tables
    $existing_tables = $DB->list_tables();
    foreach ($db_schema as $table => $cols) {
      $table = !empty($this->config['db_table_'.$table]) ? $this->config['db_table_'.$table] : $table;
      if (!in_array($table, $existing_tables))
        $errors[] = "Missing table ".$table;
      // TODO: check cols and indices
    }
    return !empty($errors) ? $errors : false;
  }
  
  /**
   * Compare the local database schema with the reference schema
@@ -340,7 +371,7 @@
   * @param boolean True if the schema schould be updated
   * @return boolean True if the schema is up-to-date, false if not or an error occured
   */
  function db_schema_check($update = false)
  function mdb2_schema_check($update = false)
  {
    if (!$this->configured)
      return false;
@@ -355,7 +386,8 @@
      'portability' => true
    );
    
    $schema =& MDB2_Schema::factory($this->config['db_dsnw'], $options);
    $dsnw = $this->config['db_dsnw'];
    $schema = MDB2_Schema::factory($dsnw, $options);
    $schema->db->supported['transactions'] = false;
    
    if (PEAR::isError($schema)) {
@@ -372,10 +404,11 @@
      }
      
      // load reference schema
      $dsn = MDB2::parseDSN($this->config['db_dsnw']);
      $ref_schema = INSTALL_PATH . 'SQL/' . $dsn['phptype'] . '.schema.xml';
      $dsn_arr = MDB2::parseDSN($this->config['db_dsnw']);
      $ref_schema = INSTALL_PATH . 'SQL/' . $dsn_arr['phptype'] . '.schema.xml';
      
      if (is_file($ref_schema)) {
      if (is_readable($ref_schema)) {
        $reference = $schema->parseDatabaseDefinition($ref_schema, false, array(), $schema->options['fail_on_invalid_names']);
        
        if (PEAR::isError($reference)) {
@@ -433,7 +466,7 @@
    
    foreach ($default_hosts as $key => $name) {
      if (!empty($name))
        $out[] = is_numeric($key) ? $name : $key;
        $out[] = rcube_parse_host(is_numeric($key) ? $name : $key);
    }
    
    return $out;