From b4be89bdac46af2b1370ea25268159c2cf2cc632 Mon Sep 17 00:00:00 2001
From: corbosman <cor@xs4all.net>
Date: Fri, 27 Feb 2015 09:03:58 -0500
Subject: [PATCH] use factory

---
 program/lib/Roundcube/rcube.php                  |   41 +------------
 program/lib/Roundcube/rcube_session.php          |   67 ++++++++++++++++++---
 program/lib/Roundcube/rcube_session_memcache.php |   12 ++-
 program/lib/Roundcube/rcube_session_php.php      |   12 +++-
 program/lib/Roundcube/rcube_session_db.php       |    7 ++
 program/lib/Roundcube/rcube_session_redis.php    |   20 +++---
 6 files changed, 95 insertions(+), 64 deletions(-)

diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php
index 42d8807..f15ae84 100644
--- a/program/lib/Roundcube/rcube.php
+++ b/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
diff --git a/program/lib/Roundcube/rcube_session.php b/program/lib/Roundcube/rcube_session.php
index 08a9dc3..fc1d871 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 @@
     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);
             }
diff --git a/program/lib/Roundcube/rcube_session_db.php b/program/lib/Roundcube/rcube_session_db.php
index 93d5c2b..feba2e0 100644
--- a/program/lib/Roundcube/rcube_session_db.php
+++ b/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();
 
diff --git a/program/lib/Roundcube/rcube_session_memcache.php b/program/lib/Roundcube/rcube_session_memcache.php
index 85a4aa6..732d5fb 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 @@
 {
     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();
-
     }
 
     /**
diff --git a/program/lib/Roundcube/rcube_session_php.php b/program/lib/Roundcube/rcube_session_php.php
index 73a8892..2f7085f 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 @@
     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'];
diff --git a/program/lib/Roundcube/rcube_session_redis.php b/program/lib/Roundcube/rcube_session_redis.php
index 07a91cc..bc545ca 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 @@
 
     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();
-
     }
 
     /**

--
Gitblit v1.9.1