/[dtapublic]/to_be_filed/webprojs/php_libraries/php_library/fboprime/sess.inc
ViewVC logotype

Contents of /to_be_filed/webprojs/php_libraries/php_library/fboprime/sess.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 35 - (show annotations) (download)
Sat Oct 8 23:35:33 2016 UTC (7 years, 5 months ago) by dashley
File size: 44243 byte(s)
Initial commit.
1 <?php
2 //$Header: /hl/cvsroots/gpl01/gpl01/webprojs/fboprime/sw/phplib/sess.inc,v 1.25 2006/11/05 18:26:05 dashley Exp $
3 //--------------------------------------------------------------------------------------------------------------
4 //sess.inc--FboPrime Session and Authentication Management Functions and Constants
5 //Copyright (C) 2006 David T. Ashley
6 //
7 //This program is free software; you can redistribute it and/or
8 //modify it under the terms of the GNU General Public License
9 //as published by the Free Software Foundation; either version 2
10 //of the License, or (at your option) any later version.
11 //
12 //This program is distributed in the hope that it will be useful,
13 //but WITHOUT ANY WARRANTY; without even the implied warranty of
14 //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 //GNU General Public License for more details.
16 //
17 //You should have received a copy of the GNU General Public License
18 //along with this program; if not, write to the Free Software
19 //Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 //********************************************************************************
21 //Implement session and authentication functions.
22 //--------------------------------------------------------------------------------------------------------------
23 require_once("global.inc");
24 require_once("log.inc");
25 require_once("passwd.inc");
26 require_once("perm.inc");
27 require_once("sguid.inc");
28 require_once("sid.inc");
29 require_once("strfunc.inc");
30 require_once("usrs.inc");
31 require_once("utime.inc");
32 //
33 //--------------------------------------------------------------------------------------------------------------
34 //Constants for database storage, software internals, function parameters, and function return values of
35 //this module.
36 //
37 //Session reap time, in seconds. This is how old an inactive session must be in order to reap it by
38 //nightly cron job.
39 //
40 define("SESS_REAP_INACTIVE_TIME", 172800 ); //48 hours, in seconds.
41 //
42 //
43 //Function return values.
44 define("SESS_RCODE_SUCCESS", 0 ); //Successful action.
45 define("SESS_RCODE_SUCCESS_TEMP_PASSWORD", 1 ); //Authentication action was successful, but
46 //authentication was performed based on the
47 //temporary password. The user should be
48 //prompted to change their password as soon as
49 //possible.
50 define("SESS_RCODE_FAIL_USERID_EXPIRED_INACTIVE", 2 ); //Intended action failed because the userid
51 //and password specified authenticated
52 //properly, but the underlying userid is either
53 //expired or inactive. The user should be
54 //granted no privileges and instructed to contact
55 //the FBO.
56 define("SESS_RCODE_FAIL_USERID_NOEXIST", 3 ); //Intended action failed because specified
57 //userid does not exist.
58 define("SESS_RCODE_FAIL_PASSWD", 4 ); //Intended action failed because the password
59 //supplied was incorrect.
60 //
61 //Session constants for the logical page currently being visited.
62 //
63 define("SESS_LPAGE_UNDEFINED", 0); //Not yet defined or invalid SQL query
64 //result.
65 define("SESS_LPAGE_SCHEDDAYVIEW", 1); //Day view scheduler.
66 define("SESS_LPAGE_SCHEDWEEKVIEW", 2); //Week view scheduler.
67 define("SESS_LPAGE_SCHEDMONTHVIEW", 3); //Month view scheduler.
68 define("SESS_LPAGE_LOGRESOURCESCHEDULER", 4); //Log file viewing.
69 define("SESS_LPAGE_DBSTATS", 5); //Database statistics.
70 define("SESS_LPAGE_RESOURCELIST", 6); //Resource list (or all resources).
71 define("SESS_LPAGE_RESOURCERENUMBER", 7); //Resource list.
72 define("SESS_LPAGE_RESOURCEVIEW", 8); //Resource view (of individual resource).
73 define("SESS_LPAGE_RESOURCEEDIT", 9); //Resource edit (of individual resource).
74 define("SESS_LPAGE_RESOURCEADD", 10); //Resource edit (of individual resource).
75 define("SESS_LPAGE_USERSACTIVELIST", 11); //Users list (active).
76 define("SESS_LPAGE_USERSINACTIVELIST", 12); //Users list (active).
77 define("SESS_LPAGE_USERSVIEW", 13); //User view.
78 define("SESS_LPAGE_USERSEDIT", 14); //User edit.
79 define("SESS_LPAGE_USERSADD", 15); //User add.
80 define("SESS_LPAGE_MYRESERVATIONSLIST", 16); //Self-reservations list.
81 //
82 //
83 //--------------------------------------------------------------------------------------------------------------
84 //Eats the session identifier cookie, if any exists on the browser side.
85 //
86 function SESS_eat_fbopsid_cookie()
87 {
88 setcookie("fbopsid", //Cookie name.
89 FALSE, //Value. FALSE means eat the cookie.
90 0, //Expire when browser closes. The PHP documentation
91 //suggests to set this to a time well before the current
92 //time, but I don't believe this is necessary to eat a cookie.
93 CONFIG_URL_FSPATH . "/", //Path within the domain.
94 CONFIG_URL_DOMAIN, //Domain.
95 0); //Don't require secure connection.
96 }
97 //
98 //--------------------------------------------------------------------------------------------------------------
99 //Issues the SID to the browser.
100 //
101 function SESS_issue_fbopsid_cookie($sid)
102 {
103 setcookie("fbopsid", //Cookie name.
104 $sid, //Value. FALSE means eat the cookie.
105 0, //Value. 0 (according to the manual) means to keep cookie
106 //until browser closed.
107 CONFIG_URL_FSPATH . "/", //Path within the domain.
108 CONFIG_URL_DOMAIN, //Domain.
109 0); //Don't require secure connection.
110 }
111 //
112 //--------------------------------------------------------------------------------------------------------------
113 //Inserts a new record into the SESS database, using the passed associative array to assign the fields.
114 //Each element of the associative array is indexed by a field name.
115 //
116 //The function returns the integer index of the record added.
117 //
118 //This operation cannot fail. The autoincrement index is the primary key, so no duplicates or other
119 //error conditions are meaningful.
120 //
121 function SESS_insert($arg)
122 {
123 global $GLOBAL_dbhandle;
124 global $GLOBAL_dblocked;
125
126 //Build the query string with each successive parameter.
127 //
128 //sguid
129 //-----
130 if (! isset($arg["sguid"]))
131 $pushval = "";
132 else
133 $pushval = $arg["sguid"];
134 $query_string = "INSERT INTO sess SET sguid=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"";
135 //
136 //ip
137 //------
138 if (! isset($arg["ip"]))
139 $pushval = "";
140 else
141 $pushval = $arg["ip"];
142 $query_string .= (", ip=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
143 //
144 //sid
145 //---
146 if (! isset($arg["sid"]))
147 $pushval = "";
148 else
149 $pushval = $arg["sid"];
150 $query_string .= (", sid=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
151 //
152 //revaltime
153 //---------
154 if (! isset($arg["revaltime"]))
155 $pushval = "";
156 else
157 $pushval = $arg["revaltime"];
158 $query_string .= (", revaltime=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
159 //
160 //lifetime
161 //--------
162 if (! isset($arg["lifetime"]))
163 $pushval = 0;
164 else
165 $pushval = $arg["lifetime"];
166 $query_string .= (", lifetime=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
167 //
168 //usrsidx
169 //-------
170 if (! isset($arg["usrsidx"]))
171 $pushval = 0;
172 else
173 $pushval = $arg["usrsidx"];
174 $query_string .= (", usrsidx=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
175 //
176 //menulvl
177 //-------
178 if (! isset($arg["menulvl"]))
179 $pushval = 0;
180 else
181 $pushval = $arg["menulvl"];
182 $query_string .= (", menulvl=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
183 //
184 //pagereloadtime
185 //--------------
186 if (! isset($arg["pagereloadtime"]))
187 $pushval = 0;
188 else
189 $pushval = $arg["pagereloadtime"];
190 $query_string .= (", pagereloadtime=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
191 //
192 //sddt
193 //----
194 if (! isset($arg["sddt"]))
195 $pushval = "";
196 else
197 $pushval = $arg["sddt"];
198 $query_string .= (", sddt=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
199 //
200 //sdtim
201 //-----
202 if (! isset($arg["sdtim"]))
203 $pushval = "";
204 else
205 $pushval = $arg["sdtim"];
206 $query_string .= (", sdtim=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
207 //
208 //logicalpage
209 //-----------
210 if (! isset($arg["logicalpage"]))
211 $pushval = 0;
212 else
213 $pushval = $arg["logicalpage"];
214 $query_string .= (", logicalpage=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
215 //
216 //curuser
217 //-------
218 if (! isset($arg["curuser"]))
219 $pushval = 0;
220 else
221 $pushval = $arg["curuser"];
222 $query_string .= (", curuser=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
223 //
224 //curresource
225 //-----------
226 if (! isset($arg["curresource"]))
227 $pushval = 0;
228 else
229 $pushval = $arg["curresource"];
230 $query_string .= (", curresource=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
231 //
232 //curreservation
233 //--------------
234 if (! isset($arg["curreservation"]))
235 $pushval = 0;
236 else
237 $pushval = $arg["curreservation"];
238 $query_string .= (", curreservation=\"" . mysql_real_escape_string ($pushval, $GLOBAL_dbhandle) . "\"");
239 //
240 //Execute the query to insert the record.
241 $result = mysql_query($query_string, $GLOBAL_dbhandle);
242 //
243 //If the insert failed, our caller gets FALSE.
244 if ($result == FALSE)
245 {
246 $rv = FALSE;
247 }
248 else
249 {
250 //The insert was successful. Figure out the index that was assigned.
251 $result = mysql_query("SELECT LAST_INSERT_ID()");
252
253 //If we have a failure, the caller gets FALSE, otherwise the caller gets the
254 //index.
255 if ($result === FALSE)
256 {
257 $rv = FALSE;
258 }
259 else
260 {
261 //Pick apart the result.
262 $row = mysql_fetch_array($result, MYSQL_NUM);
263
264 //Extract the integer.
265 $rv = $row[0];
266
267 //Free the result memory.
268 mysql_free_result($result);
269 }
270 }
271
272 //Return the result.
273 return($rv);
274 }
275 //
276 //--------------------------------------------------------------------------------------------------------------
277 //Retrieves a two dimensional associative array corresponding to the SESS record with
278 //the passed SID, or FALSE if the record does not exist.
279 //
280 function SESS_retrieve_by_sid($sid)
281 {
282 global $GLOBAL_dbhandle;
283
284 //Form the query string.
285 $query_string = "SELECT * FROM sess WHERE sid=\""
286 .
287 mysql_real_escape_string($sid, $GLOBAL_dbhandle)
288 .
289 "\"";
290
291 //Execute the query.
292 $result = mysql_query($query_string, $GLOBAL_dbhandle);
293
294 if ($result === FALSE)
295 {
296 //Unknown query failure. Return FALSE to the caller. No need to free,
297 //as this is not a result.
298 $rv = FALSE;
299 }
300 else
301 {
302 //Figure out how many rows in the result.
303 $nrows = mysql_num_rows($result);
304
305 if ($nrows == 0)
306 {
307 //No rows in the result. The query failed to give us a record, but still
308 //we need to free the result set.
309
310 //Free the result.
311 mysql_free_result($result);
312
313 //The caller gets FALSE. No record with that SID.
314 $rv = FALSE;
315 }
316 else
317 {
318 //We have at least one record. Assume just one, because the SID is supposed
319 //to be unique.
320 $rv = mysql_fetch_assoc($result); //Get the associative record.
321
322 //Free the result.
323 mysql_free_result($result);
324 }
325
326 //Return the value to the caller.
327 return($rv);
328 }
329 }
330 //
331 //--------------------------------------------------------------------------------------------------------------
332 //Deletes the server-side session information corresponding to the passed SID, if it exists in the
333 //SESS table. Returns TRUE if at least one record is deleted, or FALSE otherwise.
334 //
335 function SESS_delete_by_sid($sid)
336 {
337 global $GLOBAL_dbhandle;
338
339 //Form the query string.
340 $query_string = "DELETE FROM sess WHERE sid=\""
341 .
342 mysql_real_escape_string($sid, $GLOBAL_dbhandle)
343 .
344 "\"";
345
346 //Execute the query.
347 mysql_query($query_string, $GLOBAL_dbhandle);
348
349 //Figure out how many rows were affected.
350 $ar = mysql_affected_rows($GLOBAL_dbhandle);
351
352 //Return the right value to the caller.
353 if ($ar <= 0)
354 return(FALSE);
355 else
356 return(TRUE);
357 }
358 //
359 //--------------------------------------------------------------------------------------------------------------
360 //Description:
361 // Authenticates a supplied password against the non-temporary password hash stored with the supplied
362 // database record from the user information. There is also a possibility that the non-temporary
363 // hash field is the empty string, which means that no password will authenticate.
364 //
365 // Returns TRUE if the authentication was successful or FALSE otherwise.
366 //
367 function SESS_nontemppwauth($userinfo, $password)
368 {
369 if (PASSWD_pwd_hash_auth($userinfo["pwhash"], $password) == 1)
370 return(TRUE);
371 else
372 return(FALSE);
373 }
374 //
375 //--------------------------------------------------------------------------------------------------------------
376 //Description:
377 // Authenticates a supplied password against the temporary password hash stored with the supplied
378 // database record from the user information. In order to authenticate, the the temporary
379 // password also must not be expired.
380 //
381 // Returns TRUE if the authentication was successful or FALSE otherwise.
382 //
383 function SESS_temppwauth($userinfo, $password)
384 {
385 global $GLOBAL_utime_ut;
386
387 if (!strlen($userinfo["lostpwgentime"]) || !strlen($userinfo["lostpwhash"]))
388 {
389 return(FALSE);
390 }
391 else
392 {
393 if (
394 UTIME_time_diff_coarse_28($GLOBAL_utime_ut, $userinfo["lostpwgentime"])
395 > //Waiting time elapsed.
396 (CONFIG_LOGIN_REC_TEMP_PW_LIFETIME * 60) //*60 because constant in minutes.
397 )
398 {
399 return(FALSE); //Temporary password has expired, so can't authenticate.
400 }
401 else
402 {
403 if (PASSWD_pwd_hash_auth($userinfo["lostpwhash"], $password) == 1)
404 return(TRUE);
405 }
406 }
407
408 //If we're lost and get here, authentication failed.
409 return(FALSE);
410 }
411 //
412 //--------------------------------------------------------------------------------------------------------------
413 //Description:
414 // Opens a new session on the server based on the passed user information and returns the
415 // SID.
416 //
417 function SESS_open_new_uinfo($userinfo)
418 {
419 global $GLOBAL_client_ip;
420 global $GLOBAL_utime_ut;
421
422 //Populate the SGUID.
423 $sess["sguid"] = SGUID_sguid();
424
425 //Populate the IP address.
426 $sess["ip"] = $GLOBAL_client_ip;
427
428 //Populate the session identifier.
429 $sid = SID_sid();
430 $sess["sid"] = $sid;
431
432 //Populate the revalidation time.
433 $sess["revaltime"] = $GLOBAL_utime_ut;
434
435 //Populate the lifetime. The lifetime is either the value stored in the permission string (if it
436 //exists there), or else the default value.
437 $sess["lifetime"] = PERM_get_val_from_string($userinfo["perm"], "sesslifetimedefault");
438 if ($sess["lifetime"] === FALSE) //If that permission/attribute does not exist.
439 $sess["lifetime"] = CONFIG_SESS_LIFETIME_DEFAULT;
440
441 //Populate the index of the relevant user.
442 $sess["usrsidx"] = $userinfo["idx"];
443
444 //Insert the record into the database.
445 SESS_insert($sess);
446
447 //Return the session ID to the caller.
448 return($sid);
449 }
450 //
451 //--------------------------------------------------------------------------------------------------------------
452 //Description:
453 // Authenticates a supplied userid and password, and returns result information to the caller.
454 // If the userid/password authenticate, retract the old cookie, open a new session on the server side,
455 // and issue a new cookie.
456 //
457 // This function is called from the main scheduling page when a userid/password is entered.
458 //
459 // If the userid supplied corresponds to a non-existent account:
460 //
461 // a)Destroy any existing server-side session information based on the current SID cookie.
462 // b)Eat the current SID cookie, if any, on the client side.
463 // c)Set the $curuserinfo to FALSE.
464 // d)Set the $cursessioninfo to FALSE.
465 // e)Set the $rcode to SESS_RCODE_FAIL_USERID_NOEXIST.
466 //
467 // Else if the userid exists and the password authenticates:
468 //
469 // If the account is inactive or expired:
470 //
471 // a)Destroy any existing server-side session information based on the current SID
472 // cookie.
473 // b)Eat the current SID cookie, if any, on the client side.
474 // c)Set the $curuserinfo to FALSE.
475 // d)Set the $cursessioninfo to FALSE.
476 // e)Set the $rcode to SESS_RCODE_FAIL_USERID_EXPIRED_INACTIVE.
477 //
478 // Else if authentication was successful based on a temporary password:
479 //
480 // a)Destroy any existing server-side session information based on the current SID
481 // cookie.
482 // b)Open a new session on the server side.
483 // c)Issue a new SID cookie to the client.
484 // d)Set the $curuserinfo to the user specified.
485 // e)Set the $cursessioninfo to the newly-created session.
486 // f)Set the $rcode to SESS_RCODE_SUCCESS_TEMP_PASSWORD.
487 //
488 // Else if authentication was successful:
489 //
490 // a)Destroy any existing server-side session information based on the current SID
491 // cookie.
492 // b)Open a new session on the server side.
493 // c)Issue a new SID cookie to the client.
494 // d)Set the $curuserinfo to the user specified.
495 // e)Set the $cursessioninfo to the newly-created session.
496 // f)Set the $rcode to SESS_RCODE_SUCCESS.
497 //
498 // Else if the userid exists but the password does not authenticate:
499 //
500 // a)Destroy any existing server-side session information based on the current SID
501 // cookie.
502 // b)Eat the current SID cookie, if any, on the client side.
503 // c)Set the $curuserinfo to FALSE.
504 // d)Set the $cursessioninfo to FALSE.
505 // e)Set the $rcode to SESS_RCODE_FAIL_PASSWD.
506 //
507 //Return Value:
508 // $rcode : Set to a constant defined at the start of this file to indicate
509 // what occurred.
510 // $curuserinfo : Set to an associative array containing full user information
511 // about a user who logs in, or FALSE if no user has successfully
512 // authenticated.
513 // $cursessioninfo : An associative array containing the complete record for the now
514 // active session, or FALSE if no session is active.
515 //
516 function SESS_userid_pwd_authenticate_open_session($userid, $password, &$rcode, &$curuserinfo, &$cursessioninfo)
517 {
518 global $PAR_fbopsid;
519 global $GLOBAL_stime_string;
520 global $GLOBAL_client_ip;
521
522 //Condition the userid to exclude forbidden characters.
523 $userid = STRFUNC_force_into_subset($userid, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
524
525 //Convert the userid to all lower-case. This is the canonical form for userids.
526 $userid = StrToLower($userid);
527
528 //Remove all invalid characters from the password. However, don't convert it to lower-case. Passwords are
529 //case-sensitive.
530 $password = STRFUNC_force_into_subset($password, "-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
531
532 //Try to obtain the user information from the database corresponding to the userid.
533 $curuserinfo = USRS_retrieve_by_userid($userid);
534
535 //print_r($curuserinfo);
536 //return;
537
538 //If the userid does not exist, return the correct error code.
539 if ($curuserinfo === FALSE)
540 {
541 //Log the authentication failure.
542 LOG_log(LOG_ET_LOGIN_FAIL,
543 $GLOBAL_stime_string,
544 $GLOBAL_client_ip,
545 "",
546 ($PAR_fbopsid === FALSE) ? ("") : ($PAR_fbopsid),
547 $_SERVER["PHP_SELF"],
548 "",
549 __FILE__,
550 __LINE__,
551 "Password authentication failure, non-existent userid=\"" . $userid . "\".");
552
553 //Destroy any existing server-side session information based on the current SID cookie.
554 if ($PAR_fbopsid !== FALSE)
555 SESS_delete_by_sid($PAR_fbopsid);
556
557 //Eat the client-side cookie.
558 SESS_eat_fbopsid_cookie();
559
560 //Set the $curuserinfo to FALSE.
561 $curuserinfo = FALSE;
562
563 //Set the $cursessioninfo to FALSE.
564 $cursessioninfo = FALSE;
565
566 //Set the $rcode to SESS_RCODE_FAIL_USERID_NOEXIST.
567 $rcode = SESS_RCODE_FAIL_USERID_NOEXIST;
568
569 return;
570 }
571
572 //If the userid exists but is not active, refuse the authentication.
573 if ($curuserinfo["status"] != USRS_STATUS_ACTIVE)
574 {
575 //Log the authentication failure.
576 LOG_log(LOG_ET_LOGIN_FAIL,
577 $GLOBAL_stime_string,
578 $GLOBAL_client_ip,
579 "",
580 ($PAR_fbopsid === FALSE) ? ("") : ($PAR_fbopsid),
581 $_SERVER["PHP_SELF"],
582 "",
583 __FILE__,
584 __LINE__,
585 "Password authentication failure, expired or inactive userid=\"" . $userid . "\".");
586
587 //Destroy any existing server-side session information based on the current SID cookie.
588 if ($PAR_fbopsid !== FALSE)
589 SESS_delete_by_sid($PAR_fbopsid);
590
591 //Eat the client-side cookie.
592 SESS_eat_fbopsid_cookie();
593
594 //Set the $curuserinfo to FALSE.
595 $curuserinfo = FALSE;
596
597 //Set the $cursessioninfo to FALSE.
598 $cursessioninfo = FALSE;
599
600 //Set the $rcode to SESS_RCODE_FAIL_USERID_EXPIRED_INACTIVE.
601 $rcode = SESS_RCODE_FAIL_USERID_EXPIRED_INACTIVE;
602
603 return;
604 }
605
606 //The user exists and the user's status is active. Figure out if the password is consistent
607 //with the stored non-temporary password.
608 //
609 if (SESS_nontemppwauth($curuserinfo, $password))
610 {
611 //The password supplied matches the non-temporary password hash in the database.
612 //
613 //Open a new session on the server side.
614 $sid = SESS_open_new_uinfo($curuserinfo);
615 //
616 //Log the authentication success.
617 LOG_log(LOG_ET_LOGIN_OK,
618 $GLOBAL_stime_string,
619 $GLOBAL_client_ip,
620 $userid,
621 $sid,
622 $_SERVER["PHP_SELF"],
623 "",
624 __FILE__,
625 __LINE__,
626 "Password authentication.");
627 //
628 //Issue the new cookie to the browser. It isn't necessary to replace any existing old,
629 //as this one will just replace it.
630 SESS_issue_fbopsid_cookie($sid);
631 //
632 //The current user information has already been obtained. Pull the
633 //session information.
634 $cursessioninfo = SESS_retrieve_by_sid($sid);
635 //
636 //Set the return code.
637 $rcode = SESS_RCODE_SUCCESS;
638 //
639 return;
640 }
641
642
643 //The user exists and the user's status is active. Figure out if the password is consistent
644 //with the stored temporary password.
645 //
646 if (SESS_temppwauth($curuserinfo, $password))
647 {
648 //The password supplied matches the temporary password hash in the database.
649 //
650 //Open a new session on the server side.
651 $sid = SESS_open_new_uinfo($curuserinfo);
652 //
653 //Log the authentication success.
654 LOG_log(LOG_ET_LOGIN_OK,
655 $GLOBAL_stime_string,
656 $GLOBAL_client_ip,
657 $userid,
658 $sid,
659 $_SERVER["PHP_SELF"],
660 "",
661 __FILE__,
662 __LINE__,
663 "Temporary password authentication.");
664 //
665 //Issue the new cookie to the browser. It isn't necessary to replace any existing old,
666 //as this one will just replace it.
667 SESS_issue_fbopsid_cookie($sid);
668 //
669 //The current user information has already been obtained. Pull the
670 //session information.
671 $cursessioninfo = SESS_retrieve_by_sid($sid);
672 //
673 //Set the return code.
674 $rcode = SESS_RCODE_SUCCESS_TEMP_PASSWORD;
675 //
676 return;
677 }
678
679 //If we're here, the userid was OK, but the password was wrong.
680 //Log the authentication failure.
681 LOG_log(LOG_ET_LOGIN_FAIL,
682 $GLOBAL_stime_string,
683 $GLOBAL_client_ip,
684 $userid,
685 ($PAR_fbopsid === FALSE) ? ("") : ($PAR_fbopsid),
686 $_SERVER["PHP_SELF"],
687 "",
688 __FILE__,
689 __LINE__,
690 "Password authentication failure, bad password.");
691
692 //Destroy any existing server-side session information based on the current SID cookie.
693 if ($PAR_fbopsid !== FALSE)
694 SESS_delete_by_sid($PAR_fbopsid);
695
696 //Eat the client-side cookie.
697 SESS_eat_fbopsid_cookie();
698
699 //Set the $curuserinfo to FALSE.
700 $curuserinfo = FALSE;
701
702 //Set the $cursessioninfo to FALSE.
703 $cursessioninfo = FALSE;
704
705 //Set the $rcode to indicate simple password failure.
706 $rcode = SESS_RCODE_FAIL_PASSWD;
707 }
708 //
709 //--------------------------------------------------------------------------------------------------------------
710 //Logs out the user implied by the current SID cookie. The specific actions are:
711 // a)Destroy any existing server-side session information.
712 // b)Eat the client side SID cookie.
713 //
714 //Return Values:
715 // $curuserinfo : By the definition of this what this function does, FALSE.
716 // $cursessioninfo : By the definition of this what this function does, FALSE.
717 //
718 function SESS_logout(&$curuserinfo, &$cursessioninfo)
719 {
720 global $PAR_fbopsid;
721 global $GLOBAL_stime_string;
722 global $GLOBAL_client_ip;
723
724 //Save the $sid cookie, so we can log it.
725 $log_sid = $PAR_fbopsid;
726
727 //Look up the session table entry.
728 $cursessioninfo = SESS_retrieve_by_sid($log_sid);
729
730 //Look up the user information based on the index stored with
731 //the session.
732 if ($cursessioninfo !== FALSE)
733 {
734 $curuserinfo = USRS_retrieve_by_idx($cursessioninfo["usrsidx"]);
735 }
736 else
737 {
738 $curuserinfo = FALSE;
739 }
740
741 //Swallow any session cookie.
742 SESS_eat_fbopsid_cookie();
743
744 //Destroy the server-side session state, if any.
745 if ($PAR_fbopsid !== FALSE)
746 SESS_delete_by_sid($PAR_fbopsid);
747
748 //Log the voluntary logout.
749 LOG_log(LOG_ET_LOGOUT_VOL,
750 $GLOBAL_stime_string,
751 $GLOBAL_client_ip,
752 ($curuserinfo !== FALSE) ? ($curuserinfo["userid"]) : (""),
753 ($log_sid === FALSE) ? ("") : ($log_sid),
754 $_SERVER["PHP_SELF"],
755 "",
756 __FILE__,
757 __LINE__,
758 "Logout.");
759
760
761 //Return values are, by definition, FALSE.
762 $curuserinfo = FALSE;
763 $cursessioninfo = FALSE;
764 }
765 //
766 //--------------------------------------------------------------------------------------------------------------
767 //Revalidates the session using the current SID cookie. The specific actions are:
768 //
769 // If the SID does not exist on the server side:
770 // a)Eat the current client SID cookie.
771 // Else if the session has expired due to inactivity:
772 // a)Destroy the server-side session state.
773 // b)Eat the client-side SID cookie.
774 // Else [if the session is still active]:
775 // Obtain the user information.
776 // If the user does not exist or is inactive:
777 // a)Destroy the server-side session state.
778 // b)Eat the client-side SID cookie.
779 // Else
780 // If the privilege escalation period has expired
781 // Lower the privelege escalation level.
782 // Update the revalidation time.
783 //
784 //Return Values:
785 // $curuserinfo : An associative array containing the complete record for the currently
786 // authenticated user, or FALSE if no user is authenticated.
787 // $cursessioninfo : An associative array containing the complete record for the currently
788 // active session, or FALSE if no session is active.
789 //
790 function SESS_revalidate(&$curuserinfo, &$cursessioninfo)
791 {
792 global $GLOBAL_dbhandle;
793 global $GLOBAL_dblocked;
794 global $PAR_fbopsid;
795 global $GLOBAL_stime_string;
796 global $GLOBAL_client_ip;
797 global $GLOBAL_utime_ut;
798
799 $cursessioninfo = FALSE;
800 $curuserinfo = FALSE;
801
802 //If the SID isn't defined, no user and no session.
803 if ($PAR_fbopsid === FALSE)
804 {
805 $curuserinfo = FALSE;
806 $cursessioninfo = FALSE;
807 return;
808 }
809
810 //Try to look up the session in the database. If it does not exist
811 //in the database, this is a bit suspicious but not impossible. The database
812 //could have been reaped while somebody left their browser open for a long time.
813 //If this is the case, no session and no user.
814 //
815 $cursessioninfo = SESS_retrieve_by_sid($PAR_fbopsid);
816 //
817 if ($cursessioninfo === FALSE)
818 {
819 //It is suspicious. Log it.
820 LOG_log(LOG_ET_SEC_SID_FORGED,
821 $GLOBAL_stime_string,
822 $GLOBAL_client_ip,
823 "",
824 $PAR_fbopsid,
825 $_SERVER["PHP_SELF"],
826 "",
827 __FILE__,
828 __LINE__,
829 "SID cookie value does not exist in server database, and was possibly forged.");
830
831 //Return value is no session and no user.
832 $curuserinfo = FALSE;
833 $cursessioninfo = FALSE;
834 return;
835 }
836
837 //Session exists. Try to look up the user identified in the session. If the user does not
838 //exist, this is also suspicious. The only scenario under which this might happen is if a
839 //user is expired or deleted during a session.
840 //
841 $curuserinfo = USRS_retrieve_by_idx($cursessioninfo["usrsidx"]);
842 //
843 if ($curuserinfo === FALSE)
844 {
845 //It is suspicious. Log it.
846 LOG_log(LOG_ET_SEC_SID_FORGED,
847 $GLOBAL_stime_string,
848 $GLOBAL_client_ip,
849 "",
850 $PAR_fbopsid,
851 $_SERVER["PHP_SELF"],
852 "",
853 __FILE__,
854 __LINE__,
855 "User index pointed to by SID record does not exist (idx=" . (string)$cursessioninfo["usrsidx"] . ").");
856
857 //Return value is no session and no user.
858 $curuserinfo = FALSE;
859 $cursessioninfo = FALSE;
860 return;
861 }
862
863 //If the user pointed to by the session isn't active, this probably means that
864 //the user was expired or had the status changed manually during a session.
865 //Destroy the server-side and client side session state, log it, and indicate
866 //to the caller no user and no session.
867 //If the userid exists but is not active, refuse the authentication.
868 if ($curuserinfo["status"] != USRS_STATUS_ACTIVE)
869 {
870 //It is suspicious. Log it.
871 LOG_log(LOG_ET_SEC_SID_FORGED,
872 $GLOBAL_stime_string,
873 $GLOBAL_client_ip,
874 "",
875 $PAR_fbopsid,
876 $_SERVER["PHP_SELF"],
877 "",
878 __FILE__,
879 __LINE__,
880 "User pointed to by SID record has inactive status (idx=" . (string)$cursessioninfo["usrsidx"] . ").");
881
882 //Destroy any existing server-side session information based on the current SID cookie.
883 if ($PAR_fbopsid !== FALSE)
884 SESS_delete_by_sid($PAR_fbopsid);
885
886 //Eat the client-side cookie.
887 SESS_eat_fbopsid_cookie();
888
889 //Return value is no session and no user.
890 $curuserinfo = FALSE;
891 $cursessioninfo = FALSE;
892 return;
893 }
894
895 //If the session has expired due to time, then log it and force the user out.
896 //
897 if (UTIME_time_diff_coarse_28($GLOBAL_utime_ut, $cursessioninfo["revaltime"]) > (int)$cursessioninfo["lifetime"])
898 {
899 //Log it.
900 LOG_log(LOG_ET_LOGOUT_TIME,
901 $GLOBAL_stime_string,
902 $GLOBAL_client_ip,
903 $curuserinfo["userid"],
904 $PAR_fbopsid,
905 $_SERVER["PHP_SELF"],
906 "",
907 __FILE__,
908 __LINE__,
909 "Session expired due to inactive time.");
910
911 //Destroy any existing server-side session information based on the current SID cookie.
912 if ($PAR_fbopsid !== FALSE)
913 SESS_delete_by_sid($PAR_fbopsid);
914
915 //Eat the client-side cookie.
916 SESS_eat_fbopsid_cookie();
917
918 //Return value is no session and no user.
919 $curuserinfo = FALSE;
920 $cursessioninfo = FALSE;
921 return;
922 }
923
924 //If the connecting IP of the session has changed, this is bad news and probably some type of
925 //security issue.
926 //
927 if ($cursessioninfo["ip"] != $GLOBAL_client_ip)
928 {
929 //Log it.
930 LOG_log(LOG_ET_SEC_LOGOUT_IP,
931 $GLOBAL_stime_string,
932 $GLOBAL_client_ip,
933 $curuserinfo["userid"],
934 $PAR_fbopsid,
935 $_SERVER["PHP_SELF"],
936 "",
937 __FILE__,
938 __LINE__,
939 "Stored session IP:" . $cursessioninfo["ip"] . " Current connection IP:" . $GLOBAL_client_ip . ".");
940
941 //Destroy any existing server-side session information based on the current SID cookie.
942 if ($PAR_fbopsid !== FALSE)
943 SESS_delete_by_sid($PAR_fbopsid);
944
945 //Eat the client-side cookie.
946 SESS_eat_fbopsid_cookie();
947
948 //Return value is no session and no user.
949 $curuserinfo = FALSE;
950 $cursessioninfo = FALSE;
951 return;
952 }
953
954 //All the error conditions have been ruled out. Give the session a newer timestamp, log it, and return the
955 //correct user and session information.
956 mysql_query("UPDATE sess SET revaltime=\""
957 . mysql_real_escape_string($GLOBAL_utime_ut, $GLOBAL_dbhandle)
958 . "\" WHERE sid=\""
959 . mysql_real_escape_string($PAR_fbopsid, $GLOBAL_dbhandle)
960 . "\"",
961 $GLOBAL_dbhandle);
962 //
963 LOG_log(LOG_ET_REVAL_OK,
964 $GLOBAL_stime_string,
965 $GLOBAL_client_ip,
966 $curuserinfo["userid"],
967 $PAR_fbopsid,
968 $_SERVER["PHP_SELF"],
969 "",
970 __FILE__,
971 __LINE__,
972 "Session revalidation.");
973
974 //The $curuserinfo and $cursessioninfo values are OK for return.
975 }
976 //
977 //--------------------------------------------------------------------------------------------------------------
978 //Decrements the current menu level, stores it in the correct session record of the database,
979 //and returns the new level, clipped to [0, 2].
980 //
981 //No mutual exclusion should be necessary, as a session is tied to one terminal IP--unless a user
982 //has multiple browsers open and is doing something unusual, there should be nothing noticeable.
983 //Even then it is iffy and there will be no ill effects.
984 //
985 function SESS_menulevel_decrement($sid_in, $menulevel_current)
986 {
987 global $GLOBAL_dbhandle;
988
989 //Adjust the menulevel to be one smaller.
990 if ($menulevel_current == 2)
991 $menulevel_new = 1;
992 else if ($menulevel_current == 1)
993 $menulevel_new = 0;
994 else
995 $menulevel_new = 0;
996
997 //Form a query to reflect assigning the new menu level to the session ID
998 //record.
999 $query_string = "UPDATE sess SET menulvl=\"" . (string)$menulevel_new . "\" WHERE sid=\"" . $sid_in . "\"";
1000
1001 //Run the query. We don't much care whether it fails or succeeds (nothing to be done, anyway).
1002 mysql_query($query_string, $GLOBAL_dbhandle);
1003
1004 //Return the new value.
1005 return($menulevel_new);
1006 }
1007 //
1008 //--------------------------------------------------------------------------------------------------------------
1009 //Increments the current menu level, stores it in the correct session record of the database,
1010 //and returns the new level, clipped to [0, 2].
1011 //
1012 //No mutual exclusion should be necessary, as a session is tied to one terminal IP--unless a user
1013 //has multiple browsers open and is doing something unusual, there should be nothing noticeable.
1014 //Even then it is iffy and there will be no ill effects.
1015 //
1016 function SESS_menulevel_increment($sid_in, $menulevel_current)
1017 {
1018 global $GLOBAL_dbhandle;
1019
1020 //Adjust the menulevel to be one larger.
1021 if ($menulevel_current == 0)
1022 $menulevel_new = 1;
1023 else if ($menulevel_current == 1)
1024 $menulevel_new = 2;
1025 else
1026 $menulevel_new = 2;
1027
1028 //Form a query to reflect assigning the new menu level to the session ID
1029 //record.
1030 $query_string = "UPDATE sess SET menulvl=\"" . (string)$menulevel_new . "\" WHERE sid=\"" . $sid_in . "\"";
1031
1032 //Run the query. We don't much care whether it fails or succeeds (nothing to be done, anyway).
1033 mysql_query($query_string, $GLOBAL_dbhandle);
1034
1035 //Return the new value.
1036 return($menulevel_new);
1037 }
1038 //
1039 //--------------------------------------------------------------------------------------------------------------
1040 //Updates the SDDT and SDTIM associated with the session, session identifier passed.
1041 //
1042 //To update only SDDT or SDTIM, set the other parameter FALSE.
1043 //
1044 //If both parameters are FALSE, nothing will be updated.
1045 //
1046 function SESS_update_sddt_sdtim($sid_in, $sddt_in, $sdtim_in)
1047 {
1048 global $GLOBAL_dbhandle;
1049
1050 //echo "<pre>\n";
1051 //print_r($sid_in);
1052 //print_r($sddt_in);
1053 //print_r($sdtim_in);
1054 //echo "</pre>\n";
1055
1056 if (($sddt_in !== FALSE) && ($sdtim_in !== FALSE))
1057 {
1058 //Both parameters are specified, the most common case.
1059 $query_string = "UPDATE sess SET sddt=\""
1060 .
1061 mysql_real_escape_string ((string)$sddt_in, $GLOBAL_dbhandle)
1062 .
1063 "\", sdtim=\""
1064 .
1065 mysql_real_escape_string ((string)$sdtim_in, $GLOBAL_dbhandle)
1066 .
1067 "\" WHERE sid=\""
1068 .
1069 $sid_in
1070 .
1071 "\"";
1072
1073 //Run the query. We don't much care whether it fails or succeeds (nothing to be done, anyway).
1074 mysql_query($query_string, $GLOBAL_dbhandle);
1075 }
1076 else if (($sddt_in === FALSE) && ($sdtim_in !== FALSE))
1077 {
1078 //Only time is specified.
1079 $query_string = "UPDATE sess SET sdtim=\""
1080 .
1081 mysql_real_escape_string ((string)$sdtim_in, $GLOBAL_dbhandle)
1082 .
1083 "\" WHERE sid=\""
1084 .
1085 $sid_in
1086 .
1087 "\"";
1088
1089 //Run the query. We don't much care whether it fails or succeeds (nothing to be done, anyway).
1090 mysql_query($query_string, $GLOBAL_dbhandle);
1091 }
1092 else if (($sddt_in !== FALSE) && ($sdtim_in === FALSE))
1093 {
1094 //Only date is specified.
1095 $query_string = "UPDATE sess SET sddt=\""
1096 .
1097 mysql_real_escape_string ((string)$sddt_in, $GLOBAL_dbhandle)
1098 .
1099 "\" WHERE sid=\""
1100 .
1101 $sid_in
1102 .
1103 "\"";
1104
1105 //Run the query. We don't much care whether it fails or succeeds (nothing to be done, anyway).
1106 mysql_query($query_string, $GLOBAL_dbhandle);
1107 }
1108 else
1109 {
1110 //Do nothing. Neither parameter is specified.
1111 }
1112 }
1113 //
1114 //--------------------------------------------------------------------------------------------------------------
1115 //Updates the logicalpage associated with a session.
1116 //
1117 function SESS_logicalpage_set($sid_in, $logicalpage_in)
1118 {
1119 global $GLOBAL_dbhandle;
1120
1121 $query_string = "UPDATE sess SET logicalpage=\""
1122 .
1123 mysql_real_escape_string ((string)$logicalpage_in, $GLOBAL_dbhandle)
1124 .
1125 "\" WHERE sid=\""
1126 .
1127 $sid_in
1128 .
1129 "\"";
1130
1131 //Run the query. We don't much care whether it fails or succeeds (nothing to be done, anyway).
1132 mysql_query($query_string, $GLOBAL_dbhandle);
1133 }
1134 //
1135 //--------------------------------------------------------------------------------------------------------------
1136 //Gets the logicalpage integer associated with a session. Returns SESS_LPAGE_UNDEFINED if can't figure
1137 //out what that is.
1138 //
1139 function SESS_logicalpage_get($sid_in)
1140 {
1141 global $GLOBAL_dbhandle;
1142
1143 //Form the query string.
1144 $query_string = "SELECT logicalpage FROM sess WHERE sid=\""
1145 .
1146 mysql_real_escape_string($sid_in, $GLOBAL_dbhandle)
1147 .
1148 "\"";
1149
1150 //Execute the query.
1151 $result = mysql_query($query_string, $GLOBAL_dbhandle);
1152
1153 if ($result === FALSE)
1154 {
1155 //Unknown query failure. Return a result code to the caller indicating
1156 //don't know.
1157 return(SESS_LPAGE_UNDEFINED);
1158 }
1159 else
1160 {
1161 //Get the integer result.
1162 $row = mysql_fetch_array($result, MYSQL_NUM);
1163
1164 $rv = $row[0];
1165
1166 //Free the result.
1167 mysql_free_result($result);
1168
1169 //Return the appropriate.
1170 if($rv > 0)
1171 return($rv);
1172 else
1173 return(SESS_LPAGE_UNDEFINED);
1174 }
1175 }
1176 //
1177 //--------------------------------------------------------------------------------------------------------------
1178 //End of $RCSfile: sess.inc,v $.
1179 //--------------------------------------------------------------------------------------------------------------
1180 ?>

dashley@gmail.com
ViewVC Help
Powered by ViewVC 1.1.25