From ef1e877a8dd419fcb0de772bf0c40eeca76ee7eb Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Sat, 25 Feb 2012 13:15:25 -0500
Subject: [PATCH] Connect to IMAP server before reading quota

---
 program/include/rcmail.php |   61 ++++++++++++++++++++++++------
 1 files changed, 48 insertions(+), 13 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 7c01edf..05cfefa 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -7,7 +7,10 @@
  | This file is part of the Roundcube Webmail client                     |
  | Copyright (C) 2008-2011, The Roundcube Dev Team                       |
  | Copyright (C) 2011, Kolab Systems AG                                  |
- | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | Licensed under the GNU General Public License version 3 or            |
+ | any later version with exceptions for skins & plugins.                |
+ | See the README file for a full license statement.                     |
  |                                                                       |
  | PURPOSE:                                                              |
  |   Application class providing core functions and holding              |
@@ -126,6 +129,7 @@
   private $caches = array();
   private $action_map = array();
   private $shutdown_functions = array();
+  private $expunge_cache = false;
 
 
   /**
@@ -449,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;
 
@@ -486,7 +494,11 @@
 
     if ($ldap_config) {
       $ldap_config = (array) $ldap_config;
-      foreach ($ldap_config as $id => $prop)
+      foreach ($ldap_config as $id => $prop) {
+        // handle misconfiguration
+        if (empty($prop) || !is_array($prop)) {
+          continue;
+        }
         $list[$id] = array(
           'id'       => $id,
           'name'     => $prop['name'],
@@ -495,6 +507,7 @@
           'hidden'   => $prop['hidden'],
           'autocomplete' => in_array($id, $autocomplete)
         );
+      }
     }
 
     $plugin = $this->plugins->exec_hook('addressbooks_list', array('sources' => $list));
@@ -682,12 +695,11 @@
       $options['port']     = $_SESSION['storage_port'];
       $options['ssl']      = $_SESSION['storage_ssl'];
       $options['password'] = $this->decrypt($_SESSION['password']);
+      // set 'imap_host' for backwards compatibility
+      $_SESSION[$driver.'_host'] = &$_SESSION['storage_host'];
     }
 
     $options = $this->plugins->exec_hook("storage_init", $options);
-
-    // for backward compat. (deprecated, to be removed)
-    $options = $this->plugins->exec_hook("imap_init", $options);
 
     $this->storage->set_options($options);
     $this->set_storage_prop();
@@ -756,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'])
@@ -766,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']);
   }
 
 
@@ -1013,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)) {
@@ -1205,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();
   }
 
@@ -1262,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)) {
@@ -1296,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;
   }
 
 
@@ -1491,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 = '&';

--
Gitblit v1.9.1