source: trunk/phpgwapi/inc/adodb/session/old/adodb-cryptsession.php @ 6065

Revision 6065, 8.7 KB checked in by marcosw, 12 years ago (diff)

Ticket #2398 - Compatibilizacao com PHP-5.3 em alguns módulos do expresso

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1<?php
2/*
3V4.94 23 Jan 2007  (c) 2000-2007 John Lim (jlim#natsoft.com.my). 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>
9       
10  Set tabs to 4 for best viewing.
11 
12  Latest version of ADODB is available at http://php.weblogs.com/adodb
13  ======================================================================
14 
15 This file provides PHP4 session management using the ADODB database
16wrapper library.
17 
18 Example
19 =======
20 
21        include('adodb.inc.php');
22        #---------------------------------#
23        include('adodb-cryptsession.php');
24        #---------------------------------#
25        session_start();
26        $_SESSION['AVAR'] += 1;
27        print "
28-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
29
30 
31 Installation
32 ============
33 1. Create a new database in MySQL or Access "sessions" like
34so:
35 
36  create table sessions (
37           SESSKEY char(32) not null,
38           EXPIRY int(11) unsigned not null,
39           EXPIREREF varchar(64),
40           DATA CLOB,
41          primary key (sesskey)
42  );
43 
44  2. Then define the following parameters. You can either modify
45     this file, or define them before this file is included:
46         
47        $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';
48        $ADODB_SESSION_CONNECT='server to connect to';
49        $ADODB_SESSION_USER ='user';
50        $ADODB_SESSION_PWD ='password';
51        $ADODB_SESSION_DB ='database';
52        $ADODB_SESSION_TBL = 'sessions'
53       
54  3. Recommended is PHP 4.0.2 or later. There are documented
55session bugs in earlier versions of PHP.
56
57*/
58
59
60include_once('crypt.inc.php');
61
62if (!defined('_ADODB_LAYER')) {
63        include (dirname(__FILE__).'/adodb.inc.php');
64}
65
66 /* if database time and system time is difference is greater than this, then give warning */
67 define('ADODB_SESSION_SYNCH_SECS',60);
68
69if (!defined('ADODB_SESSION')) {
70
71 define('ADODB_SESSION',1);
72 
73GLOBAL  $ADODB_SESSION_CONNECT,
74        $ADODB_SESSION_DRIVER,
75        $ADODB_SESSION_USER,
76        $ADODB_SESSION_PWD,
77        $ADODB_SESSION_DB,
78        $ADODB_SESS_CONN,
79        $ADODB_SESS_LIFE,
80        $ADODB_SESS_DEBUG,
81        $ADODB_SESS_INSERT,
82        $ADODB_SESSION_EXPIRE_NOTIFY,
83        $ADODB_SESSION_TBL;
84
85        //$ADODB_SESS_DEBUG = true;
86       
87        /* SET THE FOLLOWING PARAMETERS */
88if (empty($ADODB_SESSION_DRIVER)) {
89        $ADODB_SESSION_DRIVER='mysql';
90        $ADODB_SESSION_CONNECT='localhost';
91        $ADODB_SESSION_USER ='root';
92        $ADODB_SESSION_PWD ='';
93        $ADODB_SESSION_DB ='xphplens_2';
94}
95
96if (empty($ADODB_SESSION_TBL)){
97        $ADODB_SESSION_TBL = 'sessions';
98}
99
100if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) {
101        $ADODB_SESSION_EXPIRE_NOTIFY = false;
102}
103
104function ADODB_Session_Key()
105{
106$ADODB_CRYPT_KEY = 'CRYPTED ADODB SESSIONS ROCK!';
107
108        /* USE THIS FUNCTION TO CREATE THE ENCRYPTION KEY FOR CRYPTED SESSIONS  */
109        /* Crypt the used key, $ADODB_CRYPT_KEY as key and session_ID as SALT   */
110        return crypt($ADODB_CRYPT_KEY, session_ID());
111}
112
113$ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime');
114if ($ADODB_SESS_LIFE <= 1) {
115        // bug in PHP 4.0.3 pl 1  -- how about other versions?
116        //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>";
117        $ADODB_SESS_LIFE=1440;
118}
119
120function adodb_sess_open($save_path, $session_name)
121{
122GLOBAL  $ADODB_SESSION_CONNECT,
123        $ADODB_SESSION_DRIVER,
124        $ADODB_SESSION_USER,
125        $ADODB_SESSION_PWD,
126        $ADODB_SESSION_DB,
127        $ADODB_SESS_CONN,
128        $ADODB_SESS_DEBUG;
129       
130        $ADODB_SESS_INSERT = false;
131       
132        if (isset($ADODB_SESS_CONN)) return true;
133       
134        $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER);
135        if (!empty($ADODB_SESS_DEBUG)) {
136                $ADODB_SESS_CONN->debug = true;
137                print" conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB ";
138        }
139        return $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT,
140                        $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
141       
142}
143
144function adodb_sess_close()
145{
146global $ADODB_SESS_CONN;
147
148        if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close();
149        return true;
150}
151
152function adodb_sess_read($key)
153{
154$Crypt = new MD5Crypt;
155global $ADODB_SESS_CONN,$ADODB_SESS_INSERT,$ADODB_SESSION_TBL;
156        $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time());
157        if ($rs) {
158                if ($rs->EOF) {
159                        $ADODB_SESS_INSERT = true;
160                        $v = '';
161                } else {
162                        // Decrypt session data
163                        $v = rawurldecode($Crypt->Decrypt(reset($rs->fields), ADODB_Session_Key()));
164                }
165                $rs->Close();
166                return $v;
167        }
168        else $ADODB_SESS_INSERT = true;
169       
170        return '';
171}
172
173function adodb_sess_write($key, $val)
174{
175$Crypt = new MD5Crypt;
176        global $ADODB_SESS_INSERT,$ADODB_SESS_CONN, $ADODB_SESS_LIFE, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
177
178        $expiry = time() + $ADODB_SESS_LIFE;
179
180        // encrypt session data..       
181        $val = $Crypt->Encrypt(rawurlencode($val), ADODB_Session_Key());
182       
183        $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val);
184        if ($ADODB_SESSION_EXPIRE_NOTIFY) {
185                $var = reset($ADODB_SESSION_EXPIRE_NOTIFY);
186                global $$var;
187                $arr['expireref'] = $$var;
188        }
189        $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,
190            $arr,
191        'sesskey',$autoQuote = true);
192
193        if (!$rs) {
194                ADOConnection::outp( '
195-- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'</p>',false);
196        } else {
197                // bug in access driver (could be odbc?) means that info is not commited
198                // properly unless select statement executed in Win2000
199       
200        if ($ADODB_SESS_CONN->databaseType == 'access') $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'");
201        }
202        return isset($rs);
203}
204
205function adodb_sess_destroy($key)
206{
207        global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
208       
209        if ($ADODB_SESSION_EXPIRE_NOTIFY) {
210                reset($ADODB_SESSION_EXPIRE_NOTIFY);
211                $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
212                $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
213                $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
214                $ADODB_SESS_CONN->SetFetchMode($savem);
215                if ($rs) {
216                        $ADODB_SESS_CONN->BeginTrans();
217                        while (!$rs->EOF) {
218                                $ref = $rs->fields[0];
219                                $key = $rs->fields[1];
220                                $fn($ref,$key);
221                                $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
222                                $rs->MoveNext();
223                        }
224                        $ADODB_SESS_CONN->CommitTrans();
225                }
226        } else {
227                $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'";
228                $rs = $ADODB_SESS_CONN->Execute($qry);
229        }
230        return $rs ? true : false;
231}
232
233
234function adodb_sess_gc($maxlifetime) {
235        global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY,$ADODB_SESS_DEBUG;
236
237        if ($ADODB_SESSION_EXPIRE_NOTIFY) {
238                reset($ADODB_SESSION_EXPIRE_NOTIFY);
239                $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
240                $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
241                $t = time();
242                $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t");
243                $ADODB_SESS_CONN->SetFetchMode($savem);
244                if ($rs) {
245                        $ADODB_SESS_CONN->BeginTrans();
246                        while (!$rs->EOF) {
247                                $ref = $rs->fields[0];
248                                $key = $rs->fields[1];
249                                $fn($ref,$key);
250                                //$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
251                                $rs->MoveNext();
252                        }
253                        $rs->Close();
254                       
255                        $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < $t");
256                        $ADODB_SESS_CONN->CommitTrans();
257                }
258        } else {
259                $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time();
260                $ADODB_SESS_CONN->Execute($qry);
261        }
262       
263        // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
264        if (defined('ADODB_SESSION_OPTIMIZE'))
265        {
266        global $ADODB_SESSION_DRIVER;
267       
268                switch( $ADODB_SESSION_DRIVER ) {
269                        case 'mysql':
270                        case 'mysqlt':
271                                $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL;
272                                break;
273                        case 'postgresql':
274                        case 'postgresql7':
275                                $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL;       
276                                break;
277                }
278        }
279       
280        if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select  TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL;
281        else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL;
282       
283        $rs =& $ADODB_SESS_CONN->SelectLimit($sql,1);
284        if ($rs && !$rs->EOF) {
285       
286                $dbts = reset($rs->fields);
287                $rs->Close();
288                $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts);
289                $t = time();
290                if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) {
291                        $msg =
292                        __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)";
293                        error_log($msg);
294                        if ($ADODB_SESS_DEBUG) ADOConnection::outp("
295-- $msg</p>");
296                }
297        }
298       
299        return true;
300}
301
302session_module_name('user');
303session_set_save_handler(
304        "adodb_sess_open",
305        "adodb_sess_close",
306        "adodb_sess_read",
307        "adodb_sess_write",
308        "adodb_sess_destroy",
309        "adodb_sess_gc");
310}
311
312/*  TEST SCRIPT -- UNCOMMENT */
313/*
314if (0) {
315
316        session_start();
317        $_SESSION['AVAR'] += 1;
318        print "
319-- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
320}
321*/
322?>
Note: See TracBrowser for help on using the repository browser.