]> git.donarmstrong.com Git - roundcube.git/blob - program/include/session.inc
9efded03c40c1786e8b1eb69326160fc9f30c155
[roundcube.git] / program / include / session.inc
1 <?php
2
3 /*
4  +-----------------------------------------------------------------------+
5  | program/include/session.inc                                           |
6  |                                                                       |
7  | This file is part of the RoundCube Webmail client                     |
8  | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
9  | Licensed under the GNU GPL                                            |
10  |                                                                       |
11  | PURPOSE:                                                              |
12  |   Provide database supported session management                       |
13  |                                                                       |
14  +-----------------------------------------------------------------------+
15  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
16  +-----------------------------------------------------------------------+
17
18  $Id: session.inc 2084 2008-11-23 13:24:49Z thomasb $
19
20 */
21
22
23 function rcube_sess_open($save_path, $session_name)
24 {
25   return true;
26 }
27
28
29 function rcube_sess_close()
30 {
31   return true;
32 }
33
34
35 // read session data
36 function rcube_sess_read($key)
37 {
38   global $SESS_CHANGED, $SESS_CLIENT_IP;
39   
40   $DB = rcmail::get_instance()->get_dbh();
41   
42   if ($DB->is_error()) {
43     return false;
44   }
45   
46   $sql_result = $DB->query(
47     "SELECT vars, ip, " . $DB->unixtimestamp('changed') . " AS changed
48      FROM " . get_table_name('session') . "
49      WHERE  sess_id=?",
50     $key);
51
52   if ($sql_arr = $DB->fetch_assoc($sql_result)) {
53     $SESS_CHANGED = $sql_arr['changed'];
54     $SESS_CLIENT_IP = $sql_arr['ip'];
55
56     if (strlen($sql_arr['vars']))
57       return $sql_arr['vars'];
58   }
59
60   return false;
61 }
62   
63
64 // save session data
65 function rcube_sess_write($key, $vars)
66 {
67   $DB = rcmail::get_instance()->get_dbh();
68   
69   if ($DB->is_error()) {
70     return false;
71   }
72
73   $sql_result = $DB->query(
74     "SELECT 1 FROM " . get_table_name('session') . "
75      WHERE  sess_id=?",
76     $key);
77
78   $now = $DB->fromunixtime(time());
79
80   if ($DB->num_rows($sql_result)) {
81     $DB->query(
82       "UPDATE " . get_table_name('session') . "
83        SET    vars=?, changed= " . $now . "
84        WHERE  sess_id=?",
85       $vars,
86       $key);
87   }
88   else {
89     $DB->query(
90       "INSERT INTO " . get_table_name('session') . "
91        (sess_id, vars, ip, created, changed)
92        VALUES (?, ?, ?, " . $now . ", " . $now .")",
93       $key,
94       $vars,
95       (string)$_SERVER['REMOTE_ADDR']);
96   }
97
98   return true;
99 }
100
101
102 // handler for session_destroy()
103 function rcube_sess_destroy($key)
104 {
105   $rcmail = rcmail::get_instance();
106   $DB = $rcmail->get_dbh();
107   
108   if ($DB->is_error()) {
109     return false;
110   }
111
112   $DB->query("DELETE FROM " . get_table_name('session') . " WHERE sess_id=?", $key);
113
114   return true;
115 }
116
117
118 // garbage collecting function
119 function rcube_sess_gc($maxlifetime)
120 {
121   $rcmail = rcmail::get_instance();
122   $DB = $rcmail->get_dbh();
123
124   if ($DB->is_error()) {
125     return false;
126   }
127
128   // just delete all expired sessions
129   $DB->query("DELETE FROM " . get_table_name('session') . "
130     WHERE changed < " . $DB->fromunixtime(time() - $maxlifetime));
131
132   if ($rcmail->config->get('enable_caching'))
133     rcmail_cache_gc();
134
135   rcmail_temp_gc();
136
137   return true;
138 }
139
140
141 function rcube_sess_regenerate_id()
142 {
143   $randval = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
144
145   for ($random = "", $i=1; $i <= 32; $i++) {
146     $random .= substr($randval, rand(0,(strlen($randval) - 1)), 1);
147   }
148
149   // use md5 value for id or remove capitals from string $randval
150   $random = md5($random);
151
152   // delete old session record
153   rcube_sess_destroy(session_id());
154
155   session_id($random);
156
157   $cookie   = session_get_cookie_params();
158   $lifetime = $cookie['lifetime'] ? time() + $cookie['lifetime'] : 0;
159
160   rcmail::setcookie(session_name(), $random, $lifetime);
161
162   return true;
163 }
164
165
166 // set custom functions for PHP session management
167 session_set_save_handler('rcube_sess_open', 'rcube_sess_close', 'rcube_sess_read', 'rcube_sess_write', 'rcube_sess_destroy', 'rcube_sess_gc');
168
169 ?>