123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- <?php
-
- /**
- +-----------------------------------------------------------------------+
- | This file is part of the Roundcube Webmail client |
- | Copyright (C) 2005-2014, The Roundcube Dev Team |
- | Copyright (C) 2011, Kolab Systems AG |
- | |
- | 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: |
- | Provide database supported session management |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com> |
- | Author: Aleksander Machniak <alec@alec.pl> |
- | Author: Cor Bosman <cor@roundcu.be> |
- +-----------------------------------------------------------------------+
- */
-
- /**
- * Class to provide database session storage
- *
- * @package Framework
- * @subpackage Core
- * @author Thomas Bruederli <roundcube@gmail.com>
- * @author Aleksander Machniak <alec@alec.pl>
- * @author Cor Bosman <cor@roundcu.be>
- */
- class rcube_session_db extends rcube_session
- {
- private $db;
- private $table_name;
-
- /**
- * @param Object $config
- */
- public function __construct($config)
- {
- parent::__construct($config);
-
- // get db instance
- $this->db = rcube::get_instance()->get_dbh();
-
- // session table name
- $this->table_name = $this->db->table_name('session', true);
-
- // register sessions handler
- $this->register_session_handler();
-
- // register db gc handler
- $this->register_gc_handler(array($this, 'gc_db'));
- }
-
- /**
- * @param $save_path
- * @param $session_name
- * @return bool
- */
- public function open($save_path, $session_name)
- {
- return true;
- }
-
- /**
- * @return bool
- */
- public function close()
- {
- return true;
- }
-
- /**
- * Handler for session_destroy()
- *
- * @param $key
- * @return bool
- */
- public function destroy($key)
- {
- if ($key) {
- $this->db->query("DELETE FROM {$this->table_name} WHERE `sess_id` = ?", $key);
- }
-
- return true;
- }
-
- /**
- * Read session data from database
- *
- * @param string Session ID
- *
- * @return string Session vars
- */
- public function read($key)
- {
- $sql_result = $this->db->query(
- "SELECT `vars`, `ip`, `changed`, " . $this->db->now() . " AS ts"
- . " FROM {$this->table_name} WHERE `sess_id` = ?", $key);
-
- if ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) {
- $this->time_diff = time() - strtotime($sql_arr['ts']);
- $this->changed = strtotime($sql_arr['changed']);
- $this->ip = $sql_arr['ip'];
- $this->vars = base64_decode($sql_arr['vars']);
- $this->key = $key;
-
- return !empty($this->vars) ? (string) $this->vars : '';
- }
-
- return '';
- }
-
- /**
- * insert new data into db session store
- *
- * @param $key
- * @param $vars
- * @return bool
- */
- public function write($key, $vars)
- {
- $now = $this->db->now();
-
- $this->db->query("INSERT INTO {$this->table_name}"
- . " (`sess_id`, `vars`, `ip`, `created`, `changed`)"
- . " VALUES (?, ?, ?, $now, $now)",
- $key, base64_encode($vars), (string)$this->ip);
-
- return true;
- }
-
- /**
- * update session data
- *
- * @param $key
- * @param $newvars
- * @param $oldvars
- *
- * @return bool
- */
- public function update($key, $newvars, $oldvars)
- {
- $now = $this->db->now();
- $ts = microtime(true);
-
- // if new and old data are not the same, update data
- // else update expire timestamp only when certain conditions are met
- if ($newvars !== $oldvars) {
- $this->db->query("UPDATE {$this->table_name} "
- . "SET `changed` = $now, `vars` = ? WHERE `sess_id` = ?",
- base64_encode($newvars), $key);
- }
- else if ($ts - $this->changed + $this->time_diff > $this->lifetime / 2) {
- $this->db->query("UPDATE {$this->table_name} SET `changed` = $now"
- . " WHERE `sess_id` = ?", $key);
- }
-
- return true;
- }
-
- /**
- * Clean up db sessions.
- */
- public function gc_db()
- {
- // just clean all old sessions when this GC is called
- $this->db->query("DELETE FROM " . $this->db->table_name('session')
- . " WHERE changed < " . $this->db->now(-$this->gc_enabled));
-
- $this->log("Session GC (DB): remove records < "
- . date('Y-m-d H:i:s', time() - $this->gc_enabled)
- . '; rows = ' . intval($this->db->affected_rows()));
- }
- }
|