From 42de33c7dee0dc48e54d317eefd4dac18c317e42 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Wed, 05 Jun 2013 03:10:08 -0400
Subject: [PATCH] Add option to use PHP's native session save handlers
---
program/lib/Roundcube/rcube.php | 3 -
program/lib/Roundcube/rcube_session.php | 40 +++++++++++++++++++-
bin/gc.sh | 28 ++++++++++++++
program/include/rcmail.php | 2
config/main.inc.php.dist | 5 +-
5 files changed, 71 insertions(+), 7 deletions(-)
diff --git a/bin/gc.sh b/bin/gc.sh
new file mode 100755
index 0000000..d099615
--- /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 898d96b..709e5cd 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -254,9 +254,10 @@
// 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 89f2f96..a7ddb1e 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -746,7 +746,7 @@
// 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 4471ace..4e3f8fc 100644
--- a/program/lib/Roundcube/rcube.php
+++ b/program/lib/Roundcube/rcube.php
@@ -457,7 +457,6 @@
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 @@
// 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 dedde22..4e06827 100644
--- a/program/lib/Roundcube/rcube_session.php
+++ b/program/lib/Roundcube/rcube_session.php
@@ -42,6 +42,7 @@
private $secret = '';
private $ip_check = false;
private $logging = false;
+ private $storage;
private $memcache;
@@ -59,11 +60,14 @@
$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 @@
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'),
@@ -88,6 +94,22 @@
array($this, 'db_write'),
array($this, 'db_destroy'),
array($this, 'db_gc'));
+ }
+ }
+
+
+ /**
+ * 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'];
}
}
@@ -116,6 +138,20 @@
/**
+ * 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
--
Gitblit v1.9.1