From fbe54043cf598b19a753dc2b21a7ed558d23fd15 Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Thu, 18 Aug 2011 13:40:07 -0400 Subject: [PATCH] Fix folders drop-down list: descend into root folder (e.g. INBOX) even if part of the exception list --- program/include/rcmail.php | 105 +++++++++++++++++++++++++++++++++------------------- 1 files changed, 67 insertions(+), 38 deletions(-) diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 8198c3e..e013c75 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -124,6 +124,7 @@ private $address_books = array(); private $caches = array(); private $action_map = array(); + private $shutdown_functions = array(); /** @@ -355,16 +356,17 @@ /** * Initialize and get cache object * - * @param string $name Cache identifier - * @param string $type Cache type ('db', 'apc' or 'memcache') - * @param int $ttl Expiration time for cache items in seconds + * @param string $name Cache identifier + * @param string $type Cache type ('db', 'apc' or 'memcache') + * @param int $ttl Expiration time for cache items in seconds + * @param bool $packed Enables/disables data serialization * * @return rcube_cache Cache object */ - public function get_cache($name, $type='db', $ttl=0) + public function get_cache($name, $type='db', $ttl=0, $packed=true) { if (!isset($this->caches[$name])) { - $this->caches[$name] = new rcube_cache($type, $_SESSION['user_id'], $name, $ttl); + $this->caches[$name] = new rcube_cache($type, $_SESSION['user_id'], $name, $ttl, $packed); } return $this->caches[$name]; @@ -376,22 +378,21 @@ * * @param string Address book identifier * @param boolean True if the address book needs to be writeable + * * @return rcube_contacts Address book object */ public function get_address_book($id, $writeable = false) { - $contacts = null; + $contacts = null; $ldap_config = (array)$this->config->get('ldap_public'); - $abook_type = strtolower($this->config->get('address_book_type')); + $abook_type = strtolower($this->config->get('address_book_type')); - $plugin = $this->plugins->exec_hook('addressbook_get', array('id' => $id, 'writeable' => $writeable)); + // 'sql' is the alias for '0' used by autocomplete + if ($id == 'sql') + $id = '0'; - // plugin returned instance of a rcube_addressbook - if ($plugin['instance'] instanceof rcube_addressbook) { - $contacts = $plugin['instance']; - } // use existing instance - else if (isset($this->address_books[$id]) && is_a($this->address_books[$id], 'rcube_addressbook') && (!$writeable || !$this->address_books[$id]->readonly)) { + if (isset($this->address_books[$id]) && is_a($this->address_books[$id], 'rcube_addressbook') && (!$writeable || !$this->address_books[$id]->readonly)) { $contacts = $this->address_books[$id]; } else if ($id && $ldap_config[$id]) { @@ -400,17 +401,30 @@ else if ($id === '0') { $contacts = new rcube_contacts($this->db, $this->user->ID); } - else if ($abook_type == 'ldap') { - // Use the first writable LDAP address book. - foreach ($ldap_config as $id => $prop) { - if (!$writeable || $prop['writable']) { - $contacts = new rcube_ldap($prop, $this->config->get('ldap_debug'), $this->config->mail_domain($_SESSION['imap_host'])); - break; + else { + $plugin = $this->plugins->exec_hook('addressbook_get', array('id' => $id, 'writeable' => $writeable)); + + // plugin returned instance of a rcube_addressbook + if ($plugin['instance'] instanceof rcube_addressbook) { + $contacts = $plugin['instance']; + } + // get first source from the list + else if (!$id) { + $source = reset($this->get_address_sources($writeable)); + if (!empty($source)) { + $contacts = $this->get_address_book($source['id']); + if ($contacts) + $id = $source['id']; } } } - else { // $id == 'sql' - $contacts = new rcube_contacts($this->db, $this->user->ID); + + if (!$contacts) { + raise_error(array( + 'code' => 700, 'type' => 'php', + 'file' => __FILE__, 'line' => __LINE__, + 'message' => "Addressbook source ($id) not found!"), + true, true); } // add to the 'books' array for shutdown function @@ -425,6 +439,7 @@ * Return address books list * * @param boolean True if the address book needs to be writeable + * * @return array Address books array */ public function get_address_sources($writeable = false) @@ -439,9 +454,9 @@ if (!isset($this->address_books['0'])) $this->address_books['0'] = new rcube_contacts($this->db, $this->user->ID); $list['0'] = array( - 'id' => '0', - 'name' => rcube_label('personaladrbook'), - 'groups' => $this->address_books['0']->groups, + 'id' => '0', + 'name' => rcube_label('personaladrbook'), + 'groups' => $this->address_books['0']->groups, 'readonly' => $this->address_books['0']->readonly, 'autocomplete' => in_array('sql', $autocomplete) ); @@ -451,11 +466,12 @@ $ldap_config = (array) $ldap_config; foreach ($ldap_config as $id => $prop) $list[$id] = array( - 'id' => $id, - 'name' => $prop['name'], - 'groups' => is_array($prop['groups']), + 'id' => $id, + 'name' => $prop['name'], + 'groups' => is_array($prop['groups']), 'readonly' => !$prop['writable'], - 'autocomplete' => in_array('sql', $autocomplete) + 'hidden' => $prop['hidden'], + 'autocomplete' => in_array($id, $autocomplete) ); } @@ -504,7 +520,7 @@ $this->output->set_env('comm_path', $this->comm_path); $this->output->set_charset(RCMAIL_CHARSET); - // add some basic label to client + // add some basic labels to client $this->output->add_label('loading', 'servererror'); return $this->output; @@ -821,7 +837,7 @@ } else { raise_error(array( - 'code' => 600, 'type' => 'php', + 'code' => 620, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Failed to create a user record. Maybe aborted by a plugin?" ), true, false); @@ -829,9 +845,9 @@ } else { raise_error(array( - 'code' => 600, 'type' => 'php', + 'code' => 621, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Acces denied for new user $username. 'auto_create_user' is disabled" + 'message' => "Access denied for new user $username. 'auto_create_user' is disabled" ), true, false); } @@ -1139,12 +1155,13 @@ */ public function shutdown() { + foreach ($this->shutdown_functions as $function) + call_user_func($function); + if (is_object($this->smtp)) $this->smtp->disconnect(); foreach ($this->address_books as $book) { - if (!is_object($book)) // maybe an address book instance wasn't fetched using get_address_book() yet - $book = $this->get_address_book($book['id']); if (is_a($book, 'rcube_addressbook')) $book->close(); } @@ -1158,7 +1175,7 @@ $this->imap->close(); // before closing the database connection, write session data - if ($_SERVER['REMOTE_ADDR']) { + if ($_SERVER['REMOTE_ADDR'] && is_object($this->session)) { $this->session->cleanup(); session_write_close(); } @@ -1176,6 +1193,19 @@ else console($log); } + } + + + /** + * Registers shutdown function to be executed on shutdown. + * The functions will be executed before destroying any + * objects like smtp, imap, session, etc. + * + * @param callback Function callback + */ + public function add_shutdown_function($function) + { + $this->shutdown_functions[] = $function; } @@ -1370,9 +1400,8 @@ $url = './'; $delm = '?'; - foreach (array_reverse($p) as $key => $val) - { - if (!empty($val)) { + foreach (array_reverse($p) as $key => $val) { + if ($val !== '') { $par = $key[0] == '_' ? $key : '_'.$key; $url .= $delm.urlencode($par).'='.urlencode($val); $delm = '&'; -- Gitblit v1.9.1