From 609c5e9da9bb52c317eea1abbd424cca181caad9 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Mon, 11 Jul 2011 06:51:42 -0400
Subject: [PATCH] Session object can be null if db/memcache is not available
---
program/include/rcmail.php | 87 ++++++++++++++++++++++++++++---------------
1 files changed, 56 insertions(+), 31 deletions(-)
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index e2ce1bf..72f0efa 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();
/**
@@ -333,7 +334,7 @@
$this->memcache = false;
return false;
}
-
+
$this->memcache = new Memcache;
$mc_available = 0;
foreach ($this->config->get('memcache_hosts', array()) as $host) {
@@ -343,11 +344,11 @@
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;
}
@@ -355,15 +356,17 @@
/**
* Initialize and get cache object
*
- * @param string $name Cache identifier
- * @param string $type Cache type ('db' or 'memcache')
+ * @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)
+ 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.'.');
+ $this->caches[$name] = new rcube_cache($type, $_SESSION['user_id'], $name, $ttl, $packed);
}
return $this->caches[$name];
@@ -379,18 +382,12 @@
*/
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));
-
- // 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]) {
@@ -399,17 +396,25 @@
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'];
+ }
+ 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 { // $id == 'sql'
- $contacts = new rcube_contacts($this->db, $this->user->ID);
+ else { // $id == 'sql'
+ $contacts = new rcube_contacts($this->db, $this->user->ID);
+ }
}
// add to the 'books' array for shutdown function
@@ -503,7 +508,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;
@@ -852,7 +857,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;
}
@@ -1124,6 +1129,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']));
+ }
}
@@ -1133,6 +1143,9 @@
*/
public function shutdown()
{
+ foreach ($this->shutdown_functions as $function)
+ call_user_func($function);
+
if (is_object($this->smtp))
$this->smtp->disconnect();
@@ -1152,7 +1165,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();
}
@@ -1170,6 +1183,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;
}
@@ -1364,9 +1390,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