summaryrefslogtreecommitdiff
path: root/program/lib
diff options
context:
space:
mode:
authorcorbosman <cor@xs4all.net>2015-02-27 15:03:58 +0100
committercorbosman <cor@xs4all.net>2015-02-27 15:03:58 +0100
commitb4be89bdac46af2b1370ea25268159c2cf2cc632 (patch)
tree00065bb8a6c38012bdc5dec1b0cce809e6f7349f /program/lib
parent4df4ab500788f0792b75baf1fa98e4647d713ed1 (diff)
use factory
Diffstat (limited to 'program/lib')
-rw-r--r--program/lib/Roundcube/rcube.php41
-rw-r--r--program/lib/Roundcube/rcube_session.php67
-rw-r--r--program/lib/Roundcube/rcube_session_db.php7
-rw-r--r--program/lib/Roundcube/rcube_session_memcache.php12
-rw-r--r--program/lib/Roundcube/rcube_session_php.php12
-rw-r--r--program/lib/Roundcube/rcube_session_redis.php20
6 files changed, 95 insertions, 64 deletions
diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php
index 42d880763..f15ae840a 100644
--- a/program/lib/Roundcube/rcube.php
+++ b/program/lib/Roundcube/rcube.php
@@ -521,50 +521,19 @@ class rcube
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_httponly', 1);
- // use database for storing session data
- $storage = $this->config->get('session_storage', 'db');
- $this->session = $this->get_session($storage);
+ // get storage driver from config
+ // $storage = $this->config->get('session_storage', 'db');
- // register default gc handler
- $this->session->register_gc_handler(array($this, 'gc'));
-
- $this->session->set_secret($this->config->get('des_key') . dirname($_SERVER['SCRIPT_NAME']));
- $this->session->set_ip_check($this->config->get('ip_check'));
-
- if ($this->config->get('session_auth_name')) {
- $this->session->set_cookiename($this->config->get('session_auth_name'));
- }
+ // get session driver instance
+ $this->session = rcube_session::factory($this->config);
// start PHP session (if not in CLI mode)
if ($_SERVER['REMOTE_ADDR']) {
- $this->session->start($this->config);
+ $this->session->start();
}
}
/**
- * get an rcube_session instance
- *
- * @return rcube_session
- */
- private function get_session($storage)
- {
- // class name for this storage
- $class = "rcube_session_" . $storage;
-
- // try to instantiate class
- if(class_exists($class)) {
- return new $class();
- }
-
- // no storage found, raise error
- rcube::raise_error(array('code' => 604, 'type' => 'session',
- 'line' => __LINE__, 'file' => __FILE__,
- 'message' => "Failed to find session driver. Check session_storage config option"),
- true, true);
- }
-
-
- /**
* Garbage collector - cache/temp cleaner
*/
public function gc()
diff --git a/program/lib/Roundcube/rcube_session.php b/program/lib/Roundcube/rcube_session.php
index 08a9dc302..fc1d87150 100644
--- a/program/lib/Roundcube/rcube_session.php
+++ b/program/lib/Roundcube/rcube_session.php
@@ -15,6 +15,7 @@
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
| Author: Aleksander Machniak <alec@alec.pl> |
+ | Author: Cor Bosman <cor@roundcu.be> |
+-----------------------------------------------------------------------+
*/
@@ -43,6 +44,7 @@ abstract class rcube_session
protected $secret = '';
protected $ip_check = false;
protected $logging = false;
+ protected $config;
/**
* Blocks session data from being written to database.
@@ -50,7 +52,55 @@ abstract class rcube_session
* @var boolean
*/
public $nowrite = false;
-
+
+ /**
+ * Factory, returns driver-specific instance of the class
+ *
+ * @param object $config
+ * @return Object rcube_session
+ */
+ public static function factory($config)
+ {
+ // get session storage driver
+ $storage = $config->get('session_storage', 'db');
+
+ // class name for this storage
+ $class = "rcube_session_" . $storage;
+
+ // try to instantiate class
+ if (class_exists($class)) {
+ return new $class($config);
+ }
+
+ // no storage found, raise error
+ rcube::raise_error(array('code' => 604, 'type' => 'session',
+ 'line' => __LINE__, 'file' => __FILE__,
+ 'message' => "Failed to find session driver. Check session_storage config option"),
+ true, true);
+ }
+
+ /**
+ * @param Object $config
+ */
+ public function __construct($config)
+ {
+ $this->config = $config;
+
+ // register default gc handler
+ $this->register_gc_handler(array($this, 'gc'));
+
+ // set secret
+ $this->set_secret($this->config->get('des_key') . dirname($_SERVER['SCRIPT_NAME']));
+
+ // set ip check
+ $this->set_ip_check($this->config->get('ip_check'));
+
+ // set cookie name
+ if ($this->config->get('session_auth_name')) {
+ $this->set_cookiename($this->config->get('session_auth_name'));
+ }
+ }
+
/**
* register session handler
*/
@@ -73,13 +123,13 @@ abstract class rcube_session
/**
* Wrapper for session_start()
*/
- public function start($config)
+ public function start()
{
$this->start = microtime(true);
$this->ip = rcube_utils::remote_addr();
- $this->logging = $config->get('log_session', false);
+ $this->logging = $this->config->get('log_session', false);
- $lifetime = $config->get('session_lifetime', 1) * 60;
+ $lifetime = $this->config->get('session_lifetime', 1) * 60;
$this->set_lifetime($lifetime);
session_start();
@@ -105,8 +155,9 @@ abstract class rcube_session
*/
public function sess_write($key, $vars)
{
- if ($this->nowrite)
+ if ($this->nowrite) {
return true;
+ }
// check cache
$oldvars = $this->get_cache($key);
@@ -201,12 +252,6 @@ abstract class rcube_session
protected function gc_shutdown()
{
if ($this->gc_enabled) {
- // just delete all expired sessions
- if ($this->storage == 'db') {
- $this->db->query("DELETE FROM {$this->table_name}"
- . " WHERE `changed` < " . $this->db->now(-$this->gc_enabled));
- }
-
foreach ($this->gc_handlers as $fct) {
call_user_func($fct);
}
diff --git a/program/lib/Roundcube/rcube_session_db.php b/program/lib/Roundcube/rcube_session_db.php
index 93d5c2b66..feba2e083 100644
--- a/program/lib/Roundcube/rcube_session_db.php
+++ b/program/lib/Roundcube/rcube_session_db.php
@@ -33,8 +33,13 @@ class rcube_session_db extends rcube_session
private $db;
private $table_name;
- public function __construct()
+ /**
+ * @param Object $config
+ */
+ public function __construct($config)
{
+ parent::__construct($config);
+
// get db instance
$this->db = rcube::get_instance()->get_dbh();
diff --git a/program/lib/Roundcube/rcube_session_memcache.php b/program/lib/Roundcube/rcube_session_memcache.php
index 85a4aa617..732d5fb7a 100644
--- a/program/lib/Roundcube/rcube_session_memcache.php
+++ b/program/lib/Roundcube/rcube_session_memcache.php
@@ -15,7 +15,7 @@
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
| Author: Aleksander Machniak <alec@alec.pl> |
- | Author: Cor Bosman <cor@roundcu.be> |
+ | Author: Cor Bosman <cor@roundcu.bet> |
+-----------------------------------------------------------------------+
*/
@@ -32,11 +32,16 @@ class rcube_session_memcache extends rcube_session
{
private $memcache;
- public function __construct()
+ /**
+ * @param Object $config
+ */
+ public function __construct($config)
{
+ parent::__construct($config);
+
$this->memcache = rcube::get_instance()->get_memcache();
- if(! $this->memcache) {
+ if (!$this->memcache) {
rcube::raise_error(array('code' => 604, 'type' => 'db',
'line' => __LINE__, 'file' => __FILE__,
'message' => "Failed to connect to memcached. Please check configuration"),
@@ -45,7 +50,6 @@ class rcube_session_memcache extends rcube_session
// register sessions handler
$this->register_session_handler();
-
}
/**
diff --git a/program/lib/Roundcube/rcube_session_php.php b/program/lib/Roundcube/rcube_session_php.php
index 73a889259..2f7085fc7 100644
--- a/program/lib/Roundcube/rcube_session_php.php
+++ b/program/lib/Roundcube/rcube_session_php.php
@@ -30,7 +30,6 @@
*/
class rcube_session_php extends rcube_session {
-
/**
* native php sessions don't need a save handler
* we do need to define abstract function implementations but they are not used.
@@ -43,6 +42,13 @@ class rcube_session_php extends rcube_session {
public function write($key, $vars) {}
public function update($key, $newvars, $oldvars) {}
+ /**
+ * @param Object $config
+ */
+ public function __construct($config)
+ {
+ parent::__construct($config);
+ }
/**
* Wrapper for session_write_close()
@@ -58,9 +64,9 @@ class rcube_session_php extends rcube_session {
/**
* Wrapper for session_start()
*/
- public function start($config)
+ public function start()
{
- parent::start($config);
+ parent::start();
$this->key = session_id();
$this->ip = $_SESSION['__IP'];
diff --git a/program/lib/Roundcube/rcube_session_redis.php b/program/lib/Roundcube/rcube_session_redis.php
index 07a91cc45..bc545ca95 100644
--- a/program/lib/Roundcube/rcube_session_redis.php
+++ b/program/lib/Roundcube/rcube_session_redis.php
@@ -13,8 +13,6 @@
| PURPOSE: |
| Provide database supported session management |
+-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com> |
- | Author: Aleksander Machniak <alec@alec.pl> |
| Author: Cor Bosman <cor@roundcu.be> |
+-----------------------------------------------------------------------+
*/
@@ -30,12 +28,17 @@ class rcube_session_redis extends rcube_session {
private $redis;
- public function __construct()
+ /**
+ * @param Object $config
+ */
+ public function __construct($config)
{
+ parent::__construct($config);
+
// instantiate Redis object
$this->redis = new Redis();
- if (! $this->redis) {
+ if (!$this->redis) {
rcube::raise_error(array('code' => 604, 'type' => 'session',
'line' => __LINE__, 'file' => __FILE__,
'message' => "Failed to find Redis. Make sure php-redis is included"),
@@ -43,10 +46,10 @@ class rcube_session_redis extends rcube_session {
}
// get config instance
- $hosts = rcube::get_instance()->config->get('redis_hosts', array());
+ $hosts = $this->config->get('redis_hosts', array('localhost'));
// host config is wrong
- if (!is_array($hosts) || empty($hosts) ) {
+ if (!is_array($hosts) || empty($hosts)) {
rcube::raise_error(array('code' => 604, 'type' => 'session',
'line' => __LINE__, 'file' => __FILE__,
'message' => "Redis host not configured"),
@@ -61,9 +64,9 @@ class rcube_session_redis extends rcube_session {
true, true);
}
- foreach($hosts as $config) {
+ foreach ($hosts as $host) {
// explode individual fields
- list($host, $port, $database, $password) = array_pad(explode(':', $config, 4), 4, null);
+ list($host, $port, $database, $password) = array_pad(explode(':', $host, 4), 4, null);
// set default values if not set
$host = ($host !== null) ? $host : '127.0.0.1';
@@ -115,7 +118,6 @@ class rcube_session_redis extends rcube_session {
// register sessions handler
$this->register_session_handler();
-
}
/**