diff options
-rwxr-xr-x | bin/gc.sh | 28 | ||||
-rw-r--r-- | config/main.inc.php.dist | 5 | ||||
-rw-r--r-- | program/include/rcmail.php | 2 | ||||
-rw-r--r-- | program/lib/Roundcube/rcube.php | 3 | ||||
-rw-r--r-- | program/lib/Roundcube/rcube_session.php | 40 |
5 files changed, 71 insertions, 7 deletions
diff --git a/bin/gc.sh b/bin/gc.sh new file mode 100755 index 000000000..d09961572 --- /dev/null +++ b/bin/gc.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env php +<?php +/* + +-----------------------------------------------------------------------+ + | bin/gc.sh | + | | + | This file is part of the Roundcube Webmail client | + | Copyright (C) 2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + | PURPOSE: | + | Trigger garbage collecting routines manually (e.g. via cronjob) | + | | + +-----------------------------------------------------------------------+ + | Author: Thomas Bruederli <roundcube@gmail.com> | + +-----------------------------------------------------------------------+ +*/ + +define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' ); + +require INSTALL_PATH.'program/include/clisetup.php'; + +$rcmail = rcube::get_instance(); +$rcmail->temp_gc(); +$rcmail->cache_gc(); diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index 898d96bf3..709e5cdac 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -254,9 +254,10 @@ $rcmail_config['session_name'] = null; // Session path. Defaults to PHP session.cookie_path setting. $rcmail_config['session_path'] = null; -// Backend to use for session storage. Can either be 'db' (default) or 'memcache' -// If set to memcache, a list of servers need to be specified in 'memcache_hosts' +// Backend to use for session storage. Can either be 'db' (default), 'memcache' or 'php' +// If set to 'memcache', a list of servers need to be specified in 'memcache_hosts' // Make sure the Memcache extension (http://pecl.php.net/package/memcache) version >= 2.0.0 is installed +// Setting this value to 'php' will use the default session save handler configured in PHP $rcmail_config['session_storage'] = 'db'; // Use these hosts for accessing memcached diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 89f2f9647..a7ddb1e2a 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -746,7 +746,7 @@ class rcmail extends rcube // before closing the database connection, write session data if ($_SERVER['REMOTE_ADDR'] && is_object($this->session)) { - session_write_close(); + $this->session->write_close(); } // write performance stats to logs/console diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php index 4471acec0..4e3f8fcf4 100644 --- a/program/lib/Roundcube/rcube.php +++ b/program/lib/Roundcube/rcube.php @@ -457,7 +457,6 @@ class rcube ini_set('session.name', $sess_name ? $sess_name : 'roundcube_sessid'); ini_set('session.use_cookies', 1); ini_set('session.use_only_cookies', 1); - ini_set('session.serialize_handler', 'php'); ini_set('session.cookie_httponly', 1); // use database for storing session data @@ -471,7 +470,7 @@ class rcube // start PHP session (if not in CLI mode) if ($_SERVER['REMOTE_ADDR']) { - session_start(); + $this->session->start(); } } diff --git a/program/lib/Roundcube/rcube_session.php b/program/lib/Roundcube/rcube_session.php index dedde2284..4e0682749 100644 --- a/program/lib/Roundcube/rcube_session.php +++ b/program/lib/Roundcube/rcube_session.php @@ -42,6 +42,7 @@ class rcube_session private $secret = ''; private $ip_check = false; private $logging = false; + private $storage; private $memcache; @@ -59,11 +60,14 @@ class rcube_session $this->set_lifetime($lifetime); // use memcache backend - if ($config->get('session_storage', 'db') == 'memcache') { + $this->storage = $config->get('session_storage', 'db'); + if ($this->storage == 'memcache') { $this->memcache = rcube::get_instance()->get_memcache(); // set custom functions for PHP session management if memcache is available if ($this->memcache) { + ini_set('session.serialize_handler', 'php'); + session_set_save_handler( array($this, 'open'), array($this, 'close'), @@ -79,7 +83,9 @@ class rcube_session true, true); } } - else { + else if ($this->storage != 'php') { + ini_set('session.serialize_handler', 'php'); + // set custom functions for PHP session management session_set_save_handler( array($this, 'open'), @@ -92,6 +98,22 @@ class rcube_session } + /** + * Wrapper for session_start() + */ + public function start() + { + session_start(); + + // copy some session properties to object vars + if ($this->storage == 'php') { + $this->key = session_id(); + $this->ip = $_SESSION['__IP']; + $this->changed = $_SESSION['__MTIME']; + } + } + + public function open($save_path, $session_name) { return true; @@ -116,6 +138,20 @@ class rcube_session /** + * Wrapper for session_write_close() + */ + public function write_close() + { + if ($this->storage == 'php') { + $_SESSION['__IP'] = $this->ip; + $_SESSION['__MTIME'] = time(); + } + + session_write_close(); + } + + + /** * Read session data from database * * @param string Session ID |