From 3cacf941fa30e8c02f3f7aebcc8747036d0d8d20 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Wed, 01 Jun 2011 09:44:51 -0400
Subject: [PATCH] - Add popup with basic fields selection for addressbook search
---
program/include/rcmail.php | 197 +++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 189 insertions(+), 8 deletions(-)
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 0e2928f..e93d546 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -5,7 +5,7 @@
| program/include/rcmail.php |
| |
| This file is part of the Roundcube Webmail client |
- | Copyright (C) 2008-2010, The Roundcube Dev Team |
+ | Copyright (C) 2008-2011, The Roundcube Dev Team |
| Licensed under the GNU GPL |
| |
| PURPOSE: |
@@ -64,6 +64,13 @@
public $db;
/**
+ * Instace of Memcache class.
+ *
+ * @var rcube_mdb2
+ */
+ public $memcache;
+
+ /**
* Instace of rcube_session class.
*
* @var rcube_session
@@ -115,6 +122,7 @@
private $texts;
private $address_books = array();
+ private $caches = array();
private $action_map = array();
@@ -310,6 +318,58 @@
return $this->db;
}
+
+
+ /**
+ * Get global handle for memcache access
+ *
+ * @return object Memcache
+ */
+ public function get_memcache()
+ {
+ if (!isset($this->memcache)) {
+ // no memcache support in PHP
+ if (!class_exists('Memcache')) {
+ $this->memcache = false;
+ return false;
+ }
+
+ $this->memcache = new Memcache;
+ $mc_available = 0;
+ 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));
+ }
+
+ if (!$mc_available)
+ $this->memcache = false;
+ }
+
+ return $this->memcache;
+ }
+
+
+ /**
+ * 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 bool $packed Enables/disables data serialization
+ *
+ * @return rcube_cache Cache object
+ */
+ 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, $packed);
+ }
+
+ return $this->caches[$name];
+ }
/**
@@ -492,14 +552,22 @@
if (is_object($this->imap))
return;
- $this->imap = new rcube_imap($this->db);
+ $this->imap = new rcube_imap();
$this->imap->debug_level = $this->config->get('debug_level');
$this->imap->skip_deleted = $this->config->get('skip_deleted');
// enable caching of imap data
- if ($this->config->get('enable_caching')) {
- $this->imap->set_caching(true);
+ $imap_cache = $this->config->get('imap_cache');
+ $messages_cache = $this->config->get('messages_cache');
+ // for backward compatybility
+ if ($imap_cache === null && $messages_cache === null && $this->config->get('enable_caching')) {
+ $imap_cache = 'db';
+ $messages_cache = true;
}
+ if ($imap_cache)
+ $this->imap->set_caching($imap_cache);
+ if ($messages_cache)
+ $this->imap->set_messages_caching(true);
// set pagesize from config
$this->imap->set_pagesize($this->config->get('pagesize', 50));
@@ -570,13 +638,12 @@
if (session_id())
return;
- $lifetime = $this->config->get('session_lifetime', 0) * 60;
-
// set session domain
if ($domain = $this->config->get('session_domain')) {
ini_set('session.cookie_domain', $domain);
}
// set session garbage collecting time according to session_lifetime
+ $lifetime = $this->config->get('session_lifetime', 0) * 60;
if ($lifetime) {
ini_set('session.gc_maxlifetime', $lifetime * 2);
}
@@ -588,7 +655,7 @@
ini_set('session.serialize_handler', 'php');
// use database for storing session data
- $this->session = new rcube_session($this->get_dbh(), $lifetime);
+ $this->session = new rcube_session($this->get_dbh(), $this->config);
$this->session->register_gc_handler('rcmail_temp_gc');
if ($this->config->get('enable_caching'))
@@ -736,9 +803,13 @@
// user already registered -> update user's record
if (is_object($user)) {
+ // fix some old settings according to namespace prefix
+ $this->fix_namespace_settings($user);
+
// create default folders on first login
if (!$user->data['last_login'] && $config['create_default_folders'])
$this->imap->create_default_folders();
+ // update last login timestamp
$user->touch();
}
// create new system user
@@ -783,7 +854,7 @@
$_SESSION['timezone'] = floatval($_REQUEST['_timezone']);
// force reloading complete list of subscribed mailboxes
- $this->imap->clear_cache('mailboxes');
+ $this->imap->clear_cache('mailboxes', true);
return true;
}
@@ -1055,6 +1126,11 @@
if ($config['logout_expunge']) {
$this->imap->expunge('INBOX');
}
+
+ // Try to save unsaved user preferences
+ if (!empty($_SESSION['preferences'])) {
+ $this->user->save_prefs(unserialize($_SESSION['preferences']));
+ }
}
@@ -1072,6 +1148,11 @@
$book = $this->get_address_book($book['id']);
if (is_a($book, 'rcube_addressbook'))
$book->close();
+ }
+
+ foreach ($this->caches as $cache) {
+ if (is_object($cache))
+ $cache->close();
}
if (is_object($this->imap))
@@ -1454,4 +1535,104 @@
return strtr($this->action, '-', '_') . '.inc';
}
+ /**
+ * Fixes some user preferences according to namespace handling change.
+ * Old Roundcube versions were using folder names with removed namespace prefix.
+ * Now we need to add the prefix on servers where personal namespace has prefix.
+ *
+ * @param rcube_user $user User object
+ */
+ private function fix_namespace_settings($user)
+ {
+ $prefix = $this->imap->get_namespace('prefix');
+ $prefix_len = strlen($prefix);
+
+ if (!$prefix_len)
+ return;
+
+ $prefs = $user->get_prefs();
+ if (empty($prefs) || $prefs['namespace_fixed'])
+ return;
+
+ // Build namespace prefix regexp
+ $ns = $this->imap->get_namespace();
+ $regexp = array();
+
+ foreach ($ns as $entry) {
+ if (!empty($entry)) {
+ foreach ($entry as $item) {
+ if (strlen($item[0])) {
+ $regexp[] = preg_quote($item[0], '/');
+ }
+ }
+ }
+ }
+ $regexp = '/^('. implode('|', $regexp).')/';
+
+ // Fix preferences
+ $opts = array('drafts_mbox', 'junk_mbox', 'sent_mbox', 'trash_mbox', 'archive_mbox');
+ foreach ($opts as $opt) {
+ if ($value = $prefs[$opt]) {
+ if ($value != 'INBOX' && !preg_match($regexp, $value)) {
+ $prefs[$opt] = $prefix.$value;
+ }
+ }
+ }
+
+ if (!empty($prefs['default_imap_folders'])) {
+ foreach ($prefs['default_imap_folders'] as $idx => $name) {
+ if ($name != 'INBOX' && !preg_match($regexp, $name)) {
+ $prefs['default_imap_folders'][$idx] = $prefix.$name;
+ }
+ }
+ }
+
+ if (!empty($prefs['search_mods'])) {
+ $folders = array();
+ foreach ($prefs['search_mods'] as $idx => $value) {
+ if ($idx != 'INBOX' && $idx != '*' && !preg_match($regexp, $idx)) {
+ $idx = $prefix.$idx;
+ }
+ $folders[$idx] = $value;
+ }
+ $prefs['search_mods'] = $folders;
+ }
+
+ if (!empty($prefs['message_threading'])) {
+ $folders = array();
+ foreach ($prefs['message_threading'] as $idx => $value) {
+ if ($idx != 'INBOX' && !preg_match($regexp, $idx)) {
+ $idx = $prefix.$idx;
+ }
+ $folders[$prefix.$idx] = $value;
+ }
+ $prefs['message_threading'] = $folders;
+ }
+
+ if (!empty($prefs['collapsed_folders'])) {
+ $folders = explode('&&', $prefs['collapsed_folders']);
+ $count = count($folders);
+ $folders_str = '';
+
+ if ($count) {
+ $folders[0] = substr($folders[0], 1);
+ $folders[$count-1] = substr($folders[$count-1], 0, -1);
+ }
+
+ foreach ($folders as $value) {
+ if ($value != 'INBOX' && !preg_match($regexp, $value)) {
+ $value = $prefix.$value;
+ }
+ $folders_str .= '&'.$value.'&';
+ }
+ $prefs['collapsed_folders'] = $folders_str;
+ }
+
+ $prefs['namespace_fixed'] = true;
+
+ // save updated preferences and reset imap settings (default folders)
+ $user->save_prefs($prefs);
+ $this->set_imap_prop();
+ }
+
}
--
Gitblit v1.9.1