corbosman
2015-02-27 b4be89bdac46af2b1370ea25268159c2cf2cc632
use factory
6 files modified
159 ■■■■■ changed files
program/lib/Roundcube/rcube.php 41 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_session.php 67 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_session_db.php 7 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_session_memcache.php 12 ●●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_session_php.php 12 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_session_redis.php 20 ●●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube.php
@@ -521,48 +521,17 @@
        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
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 @@
    protected $secret = '';
    protected $ip_check = false;
    protected $logging = false;
    protected $config;
    /**
     * Blocks session data from being written to database.
@@ -50,7 +52,55 @@
     * @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 @@
    /**
     * 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 @@
     */
    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 @@
    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);
            }
program/lib/Roundcube/rcube_session_db.php
@@ -33,8 +33,13 @@
    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();
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 @@
{
    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 @@
        // register sessions handler
        $this->register_session_handler();
    }
    /**
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 @@
    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 @@
    /**
     * Wrapper for session_start()
     */
    public function start($config)
    public function start()
    {
        parent::start($config);
        parent::start();
        $this->key     = session_id();
        $this->ip      = $_SESSION['__IP'];
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 @@
    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 @@
        }
        // 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 @@
                               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 @@
        // register sessions handler
        $this->register_session_handler();
    }
    /**