From ae81a2b3641473cbe0d78beec53e88394136a29a Mon Sep 17 00:00:00 2001 From: tbrehm <t.brehm@ispconfig.org> Date: Fri, 24 Sep 2010 20:38:38 +0000 Subject: [PATCH] Added a session handler class for mysql based session storage. --- install/sql/incremental/upd_0002.sql | 8 ++ install/sql/ispconfig3.sql | 15 ++++ interface/lib/app.inc.php | 9 ++ interface/lib/classes/session.inc.php | 116 ++++++++++++++++++++++++++ 4 files changed, 148 insertions(+) create mode 100644 install/sql/incremental/upd_0002.sql create mode 100644 interface/lib/classes/session.inc.php diff --git a/install/sql/incremental/upd_0002.sql b/install/sql/incremental/upd_0002.sql new file mode 100644 index 0000000000..bebbcc2ced --- /dev/null +++ b/install/sql/incremental/upd_0002.sql @@ -0,0 +1,8 @@ +CREATE TABLE `sys_session` ( + `session_id` varchar(32) NOT NULL default '', + `date_created` datetime NOT NULL default '0000-00-00 00:00:00', + `last_updated` datetime NOT NULL default '0000-00-00 00:00:00', + `session_data` longtext, + PRIMARY KEY (`session_id`), + KEY `last_updated` (`last_updated`) +) ENGINE=MyISAM; \ No newline at end of file diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 3394449bc7..46c21baeb4 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1066,6 +1066,21 @@ CREATE TABLE `sys_user` ( -- -------------------------------------------------------- +-- +-- Table structure for table `sys_session` +-- + +CREATE TABLE `sys_session` ( + `session_id` varchar(32) NOT NULL default '', + `date_created` datetime NOT NULL default '0000-00-00 00:00:00', + `last_updated` datetime NOT NULL default '0000-00-00 00:00:00', + `session_data` longtext, + PRIMARY KEY (`session_id`), + KEY `last_updated` (`last_updated`) +) ENGINE=MyISAM; + +-- -------------------------------------------------------- + -- -- Table structure for table `web_domain` -- diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php index 76a3cd2305..a70b25c6bc 100644 --- a/interface/lib/app.inc.php +++ b/interface/lib/app.inc.php @@ -56,6 +56,15 @@ class app { //* Start the session if($this->_conf['start_session'] == true) { + + $this->uses('session'); + session_set_save_handler( array($this->session, 'open'), + array($this->session, 'close'), + array($this->session, 'read'), + array($this->session, 'write'), + array($this->session, 'destroy'), + array($this->session, 'gc')); + session_start(); //* Initialize session variables diff --git a/interface/lib/classes/session.inc.php b/interface/lib/classes/session.inc.php new file mode 100644 index 0000000000..11224c89ad --- /dev/null +++ b/interface/lib/classes/session.inc.php @@ -0,0 +1,116 @@ +<?php + +/* +Copyright (c) 2010, Till Brehm, projektfarm Gmbh +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class session { + + private $session_array = array(); + private $db; + + function __construct() { + $this->db = new db; + } + + function open ($save_path, $session_name) { + return true; + } + + function close () { + if (!empty($this->fieldarray)) { + $result = $this->gc(ini_get('session.gc_maxlifetime')); + return $result; + } + return false; + } + + function read ($session_id) { + + $rec = $this->db->queryOneRecord("SELECT * FROM sys_session WHERE session_id = '".$this->db->quote($session_id)."'"); + + if (is_array($rec)) { + $this->session_array = $rec; + return $this->session_array['session_data']; + } else { + return ''; + } + } + + function write ($session_id, $session_data) { + + if (!empty($this->session_array) && $this->session_array['session_id'] != $session_id) { + $this->session_array = array(); + } + + if ($this->session_array['session_id'] == '') { + $session_id = $this->db->quote($session_id); + $date_created = date('Y-m-d H:i:s'); + $last_updated = date('Y-m-d H:i:s'); + $session_data = $this->db->quote($session_data); + $sql = "INSERT INTO sys_session (session_id,date_created,last_updated,session_data) VALUES ('$session_id','$date_created','$last_updated','$session_data')"; + $this->db->query($sql); + } else { + $session_id = $this->db->quote($session_id); + $last_updated = date('Y-m-d H:i:s'); + $session_data = $this->db->quote($session_data); + $sql = "UPDATE sys_session SET last_updated = '$last_updated', session_data = '$session_data' WHERE session_id = '$session_id'"; + $this->db->query($sql); + } + + return true; + } + + function destroy ($session_id) { + + $session_id = $this->db->quote($session_id); + $sql = "DELETE FROM sys_session WHERE session_id = '$session_id'"; + $this->db->query($sql); + + return true; + } + + function gc ($max_lifetime) { + + $real_now = date('Y-m-d H:i:s'); + $dt1 = strtotime("$real_now -$max_lifetime seconds"); + $dt2 = date('Y-m-d H:i:s', $dt1); + + $sql = "DELETE FROM sys_session WHERE last_updated < '$dt2'"; + $this->db->query($sql); + + return true; + + } + + function __destruct () { + @session_write_close(); + + } +} + +?> \ No newline at end of file -- GitLab