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 | 73 +++++++++++++++++++++++++----------- 1 files changed, 50 insertions(+), 23 deletions(-) diff --git a/program/include/rcmail.php b/program/include/rcmail.php index fe2d994..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(); /** @@ -377,6 +378,7 @@ * * @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) @@ -384,6 +386,10 @@ $contacts = null; $ldap_config = (array)$this->config->get('ldap_public'); $abook_type = strtolower($this->config->get('address_book_type')); + + // 'sql' is the alias for '0' used by autocomplete + if ($id == 'sql') + $id = '0'; // use existing instance if (isset($this->address_books[$id]) && is_a($this->address_books[$id], 'rcube_addressbook') && (!$writeable || !$this->address_books[$id]->readonly)) { @@ -402,18 +408,23 @@ if ($plugin['instance'] instanceof rcube_addressbook) { $contacts = $plugin['instance']; } - 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; - } + // 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 @@ -428,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) @@ -442,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) ); @@ -454,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) ); } @@ -824,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); @@ -832,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); } @@ -1142,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(); } @@ -1161,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(); } @@ -1183,6 +1197,19 @@ /** + * 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; + } + + + /** * Generate a unique token to be used in a form request * * @return string The request token -- Gitblit v1.9.1