thomascube
2012-02-25 40d246fff24e19f7237aef059a95e3af3b718e62
program/include/rcmail.php
@@ -129,6 +129,7 @@
  private $caches = array();
  private $action_map = array();
  private $shutdown_functions = array();
  private $expunge_cache = false;
  /**
@@ -452,6 +453,10 @@
        true, true);
    }
    // set configured sort order
    if ($sort_col = $this->config->get('addressbook_sort_col'))
        $contacts->set_sort_order($sort_col);
    // add to the 'books' array for shutdown function
    $this->address_books[$id] = $contacts;
@@ -763,8 +768,7 @@
    $this->session = new rcube_session($this->get_dbh(), $this->config);
    $this->session->register_gc_handler('rcmail_temp_gc');
    if ($this->config->get('enable_caching'))
      $this->session->register_gc_handler('rcmail_cache_gc');
    $this->session->register_gc_handler(array($this, 'cache_gc'));
    // start PHP session (if not in CLI mode)
    if ($_SERVER['REMOTE_ADDR'])
@@ -773,6 +777,10 @@
    // set initial session vars
    if (!$_SESSION['user_id'])
      $_SESSION['temp'] = true;
    // restore skin selection after logout
    if ($_SESSION['temp'] && !empty($_SESSION['skin']))
      $this->config->set('skin', $_SESSION['skin']);
  }
@@ -1020,16 +1028,21 @@
      list($user, $domain) = explode('@', get_input_value('_user', RCUBE_INPUT_POST));
      if (!empty($domain)) {
        foreach ($default_host as $storage_host => $mail_domains) {
          if (is_array($mail_domains) && in_array($domain, $mail_domains)) {
          if (is_array($mail_domains) && in_array_nocase($domain, $mail_domains)) {
            $host = $storage_host;
            break;
          }
          else if (stripos($storage_host, $domain) !== false || stripos(strval($mail_domains), $domain) !== false) {
            $host = is_numeric($storage_host) ? $mail_domains : $storage_host;
            break;
          }
        }
      }
      // take the first entry if $host is still an array
      // take the first entry if $host is still not set
      if (empty($host)) {
        $host = array_shift($default_host);
        list($key, $val) = each($default_host);
        $host = is_numeric($key) ? $val : $key;
      }
    }
    else if (empty($default_host)) {
@@ -1212,7 +1225,7 @@
    $this->plugins->exec_hook('session_destroy');
    $this->session->kill();
    $_SESSION = array('language' => $this->user->language, 'temp' => true);
    $_SESSION = array('language' => $this->user->language, 'temp' => true, 'skin' => $this->config->get('skin'));
    $this->user->reset();
  }
@@ -1269,8 +1282,11 @@
            $cache->close();
    }
    if (is_object($this->storage))
    if (is_object($this->storage)) {
        if ($this->expunge_cache)
            $this->storage->expunge_cache();
      $this->storage->close();
  }
    // before closing the database connection, write session data
    if ($_SERVER['REMOTE_ADDR'] && is_object($this->session)) {
@@ -1303,6 +1319,18 @@
  public function add_shutdown_function($function)
  {
    $this->shutdown_functions[] = $function;
  }
  /**
   * Garbage collector for cache entries.
   * Set flag to expunge caches on shutdown
   */
  function cache_gc()
  {
    // because this gc function is called before storage is initialized,
    // we just set a flag to expunge storage cache on shutdown.
    $this->expunge_cache = true;
  }
@@ -1498,7 +1526,7 @@
    $url = './';
    $delm = '?';
    foreach (array_reverse($p) as $key => $val) {
      if ($val !== '') {
      if ($val !== '' && $val !== null) {
        $par = $key[0] == '_' ? $key : '_'.$key;
        $url .= $delm.urlencode($par).'='.urlencode($val);
        $delm = '&';