use factory

pull/257/head
corbosman 10 years ago
parent 4df4ab5007
commit b4be89bdac

@ -521,49 +521,18 @@ class rcube
ini_set('session.use_only_cookies', 1); ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_httponly', 1); ini_set('session.cookie_httponly', 1);
// use database for storing session data // get storage driver from config
$storage = $this->config->get('session_storage', 'db'); // $storage = $this->config->get('session_storage', 'db');
$this->session = $this->get_session($storage);
// register default gc handler // get session driver instance
$this->session->register_gc_handler(array($this, 'gc')); $this->session = rcube_session::factory($this->config);
$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'));
}
// start PHP session (if not in CLI mode) // start PHP session (if not in CLI mode)
if ($_SERVER['REMOTE_ADDR']) { 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 * Garbage collector - cache/temp cleaner
*/ */

@ -15,6 +15,7 @@
+-----------------------------------------------------------------------+ +-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> | | Author: Thomas Bruederli <roundcube@gmail.com> |
| Author: Aleksander Machniak <alec@alec.pl> | | Author: Aleksander Machniak <alec@alec.pl> |
| Author: Cor Bosman <cor@roundcu.be> |
+-----------------------------------------------------------------------+ +-----------------------------------------------------------------------+
*/ */
@ -43,6 +44,7 @@ abstract class rcube_session
protected $secret = ''; protected $secret = '';
protected $ip_check = false; protected $ip_check = false;
protected $logging = false; protected $logging = false;
protected $config;
/** /**
* Blocks session data from being written to database. * Blocks session data from being written to database.
@ -50,7 +52,55 @@ abstract class rcube_session
* @var boolean * @var boolean
*/ */
public $nowrite = false; 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 * register session handler
*/ */
@ -73,13 +123,13 @@ abstract class rcube_session
/** /**
* Wrapper for session_start() * Wrapper for session_start()
*/ */
public function start($config) public function start()
{ {
$this->start = microtime(true); $this->start = microtime(true);
$this->ip = rcube_utils::remote_addr(); $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); $this->set_lifetime($lifetime);
session_start(); session_start();
@ -105,8 +155,9 @@ abstract class rcube_session
*/ */
public function sess_write($key, $vars) public function sess_write($key, $vars)
{ {
if ($this->nowrite) if ($this->nowrite) {
return true; return true;
}
// check cache // check cache
$oldvars = $this->get_cache($key); $oldvars = $this->get_cache($key);
@ -201,12 +252,6 @@ abstract class rcube_session
protected function gc_shutdown() protected function gc_shutdown()
{ {
if ($this->gc_enabled) { 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) { foreach ($this->gc_handlers as $fct) {
call_user_func($fct); call_user_func($fct);
} }

@ -33,8 +33,13 @@ class rcube_session_db extends rcube_session
private $db; private $db;
private $table_name; private $table_name;
public function __construct() /**
* @param Object $config
*/
public function __construct($config)
{ {
parent::__construct($config);
// get db instance // get db instance
$this->db = rcube::get_instance()->get_dbh(); $this->db = rcube::get_instance()->get_dbh();

@ -15,7 +15,7 @@
+-----------------------------------------------------------------------+ +-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> | | Author: Thomas Bruederli <roundcube@gmail.com> |
| Author: Aleksander Machniak <alec@alec.pl> | | 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; private $memcache;
public function __construct() /**
* @param Object $config
*/
public function __construct($config)
{ {
parent::__construct($config);
$this->memcache = rcube::get_instance()->get_memcache(); $this->memcache = rcube::get_instance()->get_memcache();
if(! $this->memcache) { if (!$this->memcache) {
rcube::raise_error(array('code' => 604, 'type' => 'db', rcube::raise_error(array('code' => 604, 'type' => 'db',
'line' => __LINE__, 'file' => __FILE__, 'line' => __LINE__, 'file' => __FILE__,
'message' => "Failed to connect to memcached. Please check configuration"), 'message' => "Failed to connect to memcached. Please check configuration"),
@ -45,7 +50,6 @@ class rcube_session_memcache extends rcube_session
// register sessions handler // register sessions handler
$this->register_session_handler(); $this->register_session_handler();
} }
/** /**

@ -30,7 +30,6 @@
*/ */
class rcube_session_php extends rcube_session { class rcube_session_php extends rcube_session {
/** /**
* native php sessions don't need a save handler * native php sessions don't need a save handler
* we do need to define abstract function implementations but they are not used. * 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 write($key, $vars) {}
public function update($key, $newvars, $oldvars) {} public function update($key, $newvars, $oldvars) {}
/**
* @param Object $config
*/
public function __construct($config)
{
parent::__construct($config);
}
/** /**
* Wrapper for session_write_close() * Wrapper for session_write_close()
@ -58,9 +64,9 @@ class rcube_session_php extends rcube_session {
/** /**
* Wrapper for session_start() * Wrapper for session_start()
*/ */
public function start($config) public function start()
{ {
parent::start($config); parent::start();
$this->key = session_id(); $this->key = session_id();
$this->ip = $_SESSION['__IP']; $this->ip = $_SESSION['__IP'];

@ -13,8 +13,6 @@
| PURPOSE: | | PURPOSE: |
| Provide database supported session management | | Provide database supported session management |
+-----------------------------------------------------------------------+ +-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
| Author: Aleksander Machniak <alec@alec.pl> |
| Author: Cor Bosman <cor@roundcu.be> | | Author: Cor Bosman <cor@roundcu.be> |
+-----------------------------------------------------------------------+ +-----------------------------------------------------------------------+
*/ */
@ -30,12 +28,17 @@ class rcube_session_redis extends rcube_session {
private $redis; private $redis;
public function __construct() /**
* @param Object $config
*/
public function __construct($config)
{ {
parent::__construct($config);
// instantiate Redis object // instantiate Redis object
$this->redis = new Redis(); $this->redis = new Redis();
if (! $this->redis) { if (!$this->redis) {
rcube::raise_error(array('code' => 604, 'type' => 'session', rcube::raise_error(array('code' => 604, 'type' => 'session',
'line' => __LINE__, 'file' => __FILE__, 'line' => __LINE__, 'file' => __FILE__,
'message' => "Failed to find Redis. Make sure php-redis is included"), '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 // get config instance
$hosts = rcube::get_instance()->config->get('redis_hosts', array()); $hosts = $this->config->get('redis_hosts', array('localhost'));
// host config is wrong // host config is wrong
if (!is_array($hosts) || empty($hosts) ) { if (!is_array($hosts) || empty($hosts)) {
rcube::raise_error(array('code' => 604, 'type' => 'session', rcube::raise_error(array('code' => 604, 'type' => 'session',
'line' => __LINE__, 'file' => __FILE__, 'line' => __LINE__, 'file' => __FILE__,
'message' => "Redis host not configured"), 'message' => "Redis host not configured"),
@ -61,9 +64,9 @@ class rcube_session_redis extends rcube_session {
true, true); true, true);
} }
foreach($hosts as $config) { foreach ($hosts as $host) {
// explode individual fields // 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 // set default values if not set
$host = ($host !== null) ? $host : '127.0.0.1'; $host = ($host !== null) ? $host : '127.0.0.1';
@ -115,7 +118,6 @@ class rcube_session_redis extends rcube_session {
// register sessions handler // register sessions handler
$this->register_session_handler(); $this->register_session_handler();
} }
/** /**

Loading…
Cancel
Save