new approach to logging database access and upgraded adodb
[openemr.git] / library / adodb / session / old / adodb-cryptsession.php
blob992712be89fd8df240eaf43a0bde3178e85b7589
1 <?php
2 /*
3 V5.14 8 Sept 2011 (c) 2000-2011 John Lim (jlim#natsoft.com). All rights reserved.
4 Released under both BSD license and Lesser GPL library license.
5 Whenever there is any discrepancy between the two licenses,
6 the BSD license will take precedence.
7 Made table name configurable - by David Johnson djohnson@inpro.net
8 Encryption by Ari Kuorikoski <ari.kuorikoski@finebyte.com>
10 Set tabs to 4 for best viewing.
12 Latest version of ADODB is available at http://php.weblogs.com/adodb
13 ======================================================================
15 This file provides PHP4 session management using the ADODB database
16 wrapper library.
18 Example
19 =======
21 include('adodb.inc.php');
22 #---------------------------------#
23 include('adodb-cryptsession.php');
24 #---------------------------------#
25 session_start();
26 session_register('AVAR');
27 $_SESSION['AVAR'] += 1;
28 print "
29 -- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
32 Installation
33 ============
34 1. Create a new database in MySQL or Access "sessions" like
35 so:
37 create table sessions (
38 SESSKEY char(32) not null,
39 EXPIRY int(11) unsigned not null,
40 EXPIREREF varchar(64),
41 DATA CLOB,
42 primary key (sesskey)
45 2. Then define the following parameters. You can either modify
46 this file, or define them before this file is included:
48 $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';
49 $ADODB_SESSION_CONNECT='server to connect to';
50 $ADODB_SESSION_USER ='user';
51 $ADODB_SESSION_PWD ='password';
52 $ADODB_SESSION_DB ='database';
53 $ADODB_SESSION_TBL = 'sessions'
55 3. Recommended is PHP 4.0.2 or later. There are documented
56 session bugs in earlier versions of PHP.
61 include_once('crypt.inc.php');
63 if (!defined('_ADODB_LAYER')) {
64 include (dirname(__FILE__).'/adodb.inc.php');
67 /* if database time and system time is difference is greater than this, then give warning */
68 define('ADODB_SESSION_SYNCH_SECS',60);
70 if (!defined('ADODB_SESSION')) {
72 define('ADODB_SESSION',1);
74 GLOBAL $ADODB_SESSION_CONNECT,
75 $ADODB_SESSION_DRIVER,
76 $ADODB_SESSION_USER,
77 $ADODB_SESSION_PWD,
78 $ADODB_SESSION_DB,
79 $ADODB_SESS_CONN,
80 $ADODB_SESS_LIFE,
81 $ADODB_SESS_DEBUG,
82 $ADODB_SESS_INSERT,
83 $ADODB_SESSION_EXPIRE_NOTIFY,
84 $ADODB_SESSION_TBL;
86 //$ADODB_SESS_DEBUG = true;
88 /* SET THE FOLLOWING PARAMETERS */
89 if (empty($ADODB_SESSION_DRIVER)) {
90 $ADODB_SESSION_DRIVER='mysql';
91 $ADODB_SESSION_CONNECT='localhost';
92 $ADODB_SESSION_USER ='root';
93 $ADODB_SESSION_PWD ='';
94 $ADODB_SESSION_DB ='xphplens_2';
97 if (empty($ADODB_SESSION_TBL)){
98 $ADODB_SESSION_TBL = 'sessions';
101 if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) {
102 $ADODB_SESSION_EXPIRE_NOTIFY = false;
105 function ADODB_Session_Key()
107 $ADODB_CRYPT_KEY = 'CRYPTED ADODB SESSIONS ROCK!';
109 /* USE THIS FUNCTION TO CREATE THE ENCRYPTION KEY FOR CRYPTED SESSIONS */
110 /* Crypt the used key, $ADODB_CRYPT_KEY as key and session_ID as SALT */
111 return crypt($ADODB_CRYPT_KEY, session_ID());
114 $ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime');
115 if ($ADODB_SESS_LIFE <= 1) {
116 // bug in PHP 4.0.3 pl 1 -- how about other versions?
117 //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>";
118 $ADODB_SESS_LIFE=1440;
121 function adodb_sess_open($save_path, $session_name)
123 GLOBAL $ADODB_SESSION_CONNECT,
124 $ADODB_SESSION_DRIVER,
125 $ADODB_SESSION_USER,
126 $ADODB_SESSION_PWD,
127 $ADODB_SESSION_DB,
128 $ADODB_SESS_CONN,
129 $ADODB_SESS_DEBUG;
131 $ADODB_SESS_INSERT = false;
133 if (isset($ADODB_SESS_CONN)) return true;
135 $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER);
136 if (!empty($ADODB_SESS_DEBUG)) {
137 $ADODB_SESS_CONN->debug = true;
138 print" conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB ";
140 return $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT,
141 $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
145 function adodb_sess_close()
147 global $ADODB_SESS_CONN;
149 if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close();
150 return true;
153 function adodb_sess_read($key)
155 $Crypt = new MD5Crypt;
156 global $ADODB_SESS_CONN,$ADODB_SESS_INSERT,$ADODB_SESSION_TBL;
157 $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time());
158 if ($rs) {
159 if ($rs->EOF) {
160 $ADODB_SESS_INSERT = true;
161 $v = '';
162 } else {
163 // Decrypt session data
164 $v = rawurldecode($Crypt->Decrypt(reset($rs->fields), ADODB_Session_Key()));
166 $rs->Close();
167 return $v;
169 else $ADODB_SESS_INSERT = true;
171 return '';
174 function adodb_sess_write($key, $val)
176 $Crypt = new MD5Crypt;
177 global $ADODB_SESS_INSERT,$ADODB_SESS_CONN, $ADODB_SESS_LIFE, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
179 $expiry = time() + $ADODB_SESS_LIFE;
181 // encrypt session data..
182 $val = $Crypt->Encrypt(rawurlencode($val), ADODB_Session_Key());
184 $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val);
185 if ($ADODB_SESSION_EXPIRE_NOTIFY) {
186 $var = reset($ADODB_SESSION_EXPIRE_NOTIFY);
187 global $$var;
188 $arr['expireref'] = $$var;
190 $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,
191 $arr,
192 'sesskey',$autoQuote = true);
194 if (!$rs) {
195 ADOConnection::outp( '
196 -- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'</p>',false);
197 } else {
198 // bug in access driver (could be odbc?) means that info is not commited
199 // properly unless select statement executed in Win2000
201 if ($ADODB_SESS_CONN->databaseType == 'access') $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'");
203 return isset($rs);
206 function adodb_sess_destroy($key)
208 global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
210 if ($ADODB_SESSION_EXPIRE_NOTIFY) {
211 reset($ADODB_SESSION_EXPIRE_NOTIFY);
212 $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
213 $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
214 $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
215 $ADODB_SESS_CONN->SetFetchMode($savem);
216 if ($rs) {
217 $ADODB_SESS_CONN->BeginTrans();
218 while (!$rs->EOF) {
219 $ref = $rs->fields[0];
220 $key = $rs->fields[1];
221 $fn($ref,$key);
222 $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
223 $rs->MoveNext();
225 $ADODB_SESS_CONN->CommitTrans();
227 } else {
228 $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'";
229 $rs = $ADODB_SESS_CONN->Execute($qry);
231 return $rs ? true : false;
235 function adodb_sess_gc($maxlifetime) {
236 global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY,$ADODB_SESS_DEBUG;
238 if ($ADODB_SESSION_EXPIRE_NOTIFY) {
239 reset($ADODB_SESSION_EXPIRE_NOTIFY);
240 $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
241 $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
242 $t = time();
243 $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t");
244 $ADODB_SESS_CONN->SetFetchMode($savem);
245 if ($rs) {
246 $ADODB_SESS_CONN->BeginTrans();
247 while (!$rs->EOF) {
248 $ref = $rs->fields[0];
249 $key = $rs->fields[1];
250 $fn($ref,$key);
251 //$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
252 $rs->MoveNext();
254 $rs->Close();
256 $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < $t");
257 $ADODB_SESS_CONN->CommitTrans();
259 } else {
260 $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time();
261 $ADODB_SESS_CONN->Execute($qry);
264 // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
265 if (defined('ADODB_SESSION_OPTIMIZE'))
267 global $ADODB_SESSION_DRIVER;
269 switch( $ADODB_SESSION_DRIVER ) {
270 case 'mysql':
271 case 'mysqlt':
272 $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL;
273 break;
274 case 'postgresql':
275 case 'postgresql7':
276 $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL;
277 break;
281 if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL;
282 else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL;
284 $rs = $ADODB_SESS_CONN->SelectLimit($sql,1);
285 if ($rs && !$rs->EOF) {
287 $dbts = reset($rs->fields);
288 $rs->Close();
289 $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts);
290 $t = time();
291 if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) {
292 $msg =
293 __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)";
294 error_log($msg);
295 if ($ADODB_SESS_DEBUG) ADOConnection::outp("
296 -- $msg</p>");
300 return true;
303 session_module_name('user');
304 session_set_save_handler(
305 "adodb_sess_open",
306 "adodb_sess_close",
307 "adodb_sess_read",
308 "adodb_sess_write",
309 "adodb_sess_destroy",
310 "adodb_sess_gc");
313 /* TEST SCRIPT -- UNCOMMENT */
315 if (0) {
317 session_start();
318 session_register('AVAR');
319 $_SESSION['AVAR'] += 1;
320 print "
321 -- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";