| | |
| | | | 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: | |
| | |
| | | public $db; |
| | | |
| | | /** |
| | | * Instace of Memcache class. |
| | | * |
| | | * @var rcube_mdb2 |
| | | */ |
| | | public $memcache; |
| | | |
| | | /** |
| | | * Instace of rcube_session class. |
| | | * |
| | | * @var rcube_session |
| | |
| | | |
| | | private $texts; |
| | | private $address_books = array(); |
| | | private $caches = array(); |
| | | private $action_map = array(); |
| | | |
| | | |
| | |
| | | |
| | | 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') |
| | | * |
| | | * @return rcube_cache Cache object |
| | | */ |
| | | public function get_cache($name, $type) |
| | | { |
| | | if (!isset($this->caches[$name])) { |
| | | $this->caches[$name] = new rcube_cache($type, $_SESSION['user_id'], $name.'.'); |
| | | } |
| | | |
| | | return $this->caches[$name]; |
| | | } |
| | | |
| | | |
| | | /** |
| | |
| | | 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)); |
| | |
| | | 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); |
| | | } |
| | |
| | | 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')) |
| | |
| | | |
| | | // 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 |
| | |
| | | $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)) |
| | |
| | | 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(); |
| | | } |
| | | |
| | | } |