From ef4998c11084b2c99f8af9976f9860d5f7709a0f Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Thu, 22 Sep 2011 04:48:05 -0400 Subject: [PATCH] Fix compose command from other tasks than mail and address book; skip common request parameters --- program/include/rcmail.php | 109 +++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 82 insertions(+), 27 deletions(-) diff --git a/program/include/rcmail.php b/program/include/rcmail.php index d38f771..edda07c 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -6,6 +6,7 @@ | | | 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 | | | | PURPOSE: | @@ -336,20 +337,41 @@ } $this->memcache = new Memcache; - $mc_available = 0; + $this->mc_available = 0; + + // add alll configured hosts to pool + $pconnect = $this->config->get('memcache_pconnect', true); foreach ($this->config->get('memcache_hosts', array()) as $host) { list($host, $port) = explode(':', $host); if (!$port) $port = 11211; - // add server and attempt to connect if not already done yet - if ($this->memcache->addServer($host, $port) && !$mc_available) - $mc_available += intval($this->memcache->connect($host, $port)); + $this->mc_available += intval($this->memcache->addServer($host, $port, $pconnect, 1, 1, 15, false, array($this, 'memcache_failure'))); } + + // test connection and failover (will result in $this->mc_available == 0 on complete failure) + $this->memcache->increment('__CONNECTIONTEST__', 1); // NOP if key doesn't exist - if (!$mc_available) + if (!$this->mc_available) $this->memcache = false; } return $this->memcache; + } + + /** + * Callback for memcache failure + */ + public function memcache_failure($host, $port) + { + static $seen = array(); + + // only report once + if (!$seen["$host:$port"]++) { + $this->mc_available--; + raise_error(array('code' => 604, 'type' => 'db', + 'line' => __LINE__, 'file' => __FILE__, + 'message' => "Memcache failure on host $host:$port"), + true, false); + } } @@ -392,7 +414,10 @@ $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)) { + if (isset($this->address_books[$id]) && is_object($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]) { @@ -421,7 +446,7 @@ if (!$contacts) { raise_error(array( - 'code' => 600, 'type' => 'php', + 'code' => 700, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Addressbook source ($id) not found!"), true, true); @@ -439,6 +464,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) @@ -453,11 +479,12 @@ 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) + 'autocomplete' => in_array('sql', $autocomplete), + 'undelete' => $this->address_books['0']->undelete && $this->config->get('undo_timeout'), ); } @@ -465,11 +492,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) ); } @@ -588,7 +616,7 @@ // Setting root and delimiter before establishing the connection // can save time detecting them using NAMESPACE and LIST $options = array( - 'auth_method' => $this->config->get('imap_auth_type', 'check'), + 'auth_type' => $this->config->get('imap_auth_type', 'check'), 'auth_cid' => $this->config->get('imap_auth_cid'), 'auth_pw' => $this->config->get('imap_auth_pw'), 'debug' => (bool) $this->config->get('imap_debug', 0), @@ -829,13 +857,17 @@ else if ($config['auto_create_user']) { if ($created = rcube_user::create($username, $host)) { $user = $created; + + // fix default settings according to namespace prefix + $this->fix_namespace_settings($user); + // create default folders on first login if ($config['create_default_folders']) $this->imap->create_default_folders(); } 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); @@ -843,9 +875,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); } @@ -943,7 +975,9 @@ /** * Get localized text in the desired language * - * @param mixed Named parameters array or label name + * @param mixed $attrib Named parameters array or label name + * @param string $domain Label domain (plugin) name + * * @return string Localized text */ public function gettext($attrib, $domain=null) @@ -958,7 +992,7 @@ $nr = is_numeric($attrib['nr']) ? $attrib['nr'] : 1; $name = $attrib['name'] ? $attrib['name'] : ''; - + // attrib contain text values: use them from now if (($setval = $attrib[strtolower($_SESSION['language'])]) || ($setval = $attrib['en_us'])) $this->texts[$name] = $setval; @@ -1014,19 +1048,40 @@ /** - * Check if the given text lable exists + * Check if the given text label exists * - * @param string Label name + * @param string $name Label name + * @param string $domain Label domain (plugin) name or '*' for all domains + * @param string $ref_domain Sets domain name if label is found + * * @return boolean True if text exists (either in the current language or in en_US) */ - public function text_exists($name, $domain=null) + public function text_exists($name, $domain = null, &$ref_domain = null) { // load localization files if not done yet if (empty($this->texts)) $this->load_language(); - // check for text with domain first - return ($domain && isset($this->texts[$domain.'.'.$name])) || isset($this->texts[$name]); + if (isset($this->texts[$name])) { + $ref_domain = ''; + return true; + } + + // any of loaded domains (plugins) + if ($domain == '*') { + foreach ($this->plugins->loaded_plugins() as $domain) + if (isset($this->texts[$domain.'.'.$name])) { + $ref_domain = $domain; + return true; + } + } + // specified domain + else if ($domain) { + $ref_domain = $domain; + return isset($this->texts[$domain.'.'.$name]); + } + + return false; } /** @@ -1160,7 +1215,7 @@ $this->smtp->disconnect(); foreach ($this->address_books as $book) { - if (is_a($book, 'rcube_addressbook')) + if (is_object($book) && is_a($book, 'rcube_addressbook')) $book->close(); } -- Gitblit v1.9.1