4 * SourceForge Session Module
6 * SourceForge: Breaking Down the Barriers to Open Source Development
7 * Copyright 1999-2001 (c) VA Linux Systems
8 * http://sourceforge.net
15 * A User object if user is logged in
17 * @var constant $G_SESSION
22 * session_build_session_cookie() - Construct session cookie for the user
24 * @param int User_id of the logged in user
25 * @return cookie value
27 function session_build_session_cookie($user_id) {
30 $session_serial = $user_id.'-'.time().'-'.$GLOBALS['REMOTE_ADDR'].'-'.$GLOBALS['HTTP_USER_AGENT'];
31 $td = mcrypt_module_open($GLOBALS['sys_session_cypher'], "", $GLOBALS['sys_session_cyphermode'], "");
32 $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
33 mcrypt_generic_init($td, $GLOBALS['sys_session_key'], $iv);
34 $encrypted_session_serial = mcrypt_generic($td, $session_serial);
35 mcrypt_generic_end($td);
36 $session_serial_hash = md5($encrypted_session_serial.$GLOBALS['sys_session_key']);
37 $session_serial_cookie = base64_encode($encrypted_session_serial).'-'.$session_serial_hash;
39 return $session_serial_cookie;
41 echo "<br>in session_build_session_cookie";
42 $session_serial = $user_id.'-'.time().'-'.$GLOBALS['REMOTE_ADDR'].'-'.$GLOBALS['HTTP_USER_AGENT'];
43 echo "<br>SESSION_BUILD_SESSION_COOKIE::mcrypt_module_open call";
44 $temp_sys_session_cypher=$GLOBALS['sys_session_cypher'];
45 echo "<br>--->cypher=$temp_sys_session_cypher";
46 echo "<br>--->2nd arg=\"\"";
47 $temp_sys_session_cyphermode=$GLOBALS['sys_session_cyphermode'];
48 echo "<br>--->cyphermode=$temp_sys_session_cyphermode";
49 echo "<br>--->4th arg=\"\"";
50 $td = mcrypt_module_open($GLOBALS['sys_session_cypher'], "", $GLOBALS['sys_session_cyphermode'], "");
51 echo "<br>===>returned value = $td";
52 echo "<br>SESSION_BUILD_SESSION_COOKIE::mcrypt_create_iv call";
53 echo "<br>--->1st arg = ($td)";
54 echo "<br>--->2nd arg = MCRYPT_RAND";
55 $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
56 echo "<br>===>returned value = $iv";
57 echo "<br>SESSION_BUILD_SESSION_COOKIE::mcrypt_generic_init call";
58 echo "<br>--->1st arg = $td";
59 $temp_sys_session_key=$GLOBALS['sys_session_key'];
60 echo "<br>--->session key = $temp_sys_session_key";
61 echo "<br>--->3rd arg = $iv";
62 $tempRetVal = mcrypt_generic_init($td, $GLOBALS['sys_session_key'], $iv);
63 echo "<br>===>returned value = $tempRetVal";
64 echo "<br>SESSION_BUILD_SESSION_COOKIE::mcrypt_generic call";
65 echo "<br>--->1st arg = $td";
66 echo "<br>--->serial = $session_serial";
68 $td = mcrypt_module_open("", "", "", "");
69 $encrypted_session_serial = mcrypt_generic($td, $session_serial);
70 echo "<br>===>returned value = $encrypted_session_serial";
71 echo "<br>SESSION_BUILD_SESSION_COOKIE::mcrypt_generic_end call";
72 mcrypt_generic_end($td);
73 echo "<br>SESSION_BUILD_SESSION_COOKIE::md5 call";
74 $session_serial_hash = md5($encrypted_session_serial.$GLOBALS['sys_session_key']);
75 echo "<br>SESSION_BUILD_SESSION_COOKIE::base64_encode call";
76 $session_serial_cookie = base64_encode($encrypted_session_serial).'-'.$session_serial_hash;
77 return $session_serial_cookie;
81 * session_build_username_cookie() - Construct username cookie
83 * @param string username of the logged in user
84 * @return cookie value
86 function session_build_username_cookie($username) {
88 // check if operating in plaintext or encrytped mode
90 if ($GLOBALS['sys_username_cookie_plaintext']) {
96 $td = mcrypt_module_open($GLOBALS['sys_username_cookie_cypher'], "", $GLOBALS['sys_username_cookie_cyphermode'], "");
97 $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
98 mcrypt_generic_init($td, $GLOBALS['sys_username_cookie_key'], $iv);
99 $encrypted_username = mcrypt_generic($td, $username);
100 mcrypt_generic_end($td);
101 $session_username_cookie = base64_encode($encrypted_username);
103 return $session_username_cookie;
109 * session_get_session_cookie_hash() - Get hash of session cookie
111 * This hash can be used as a key to identify session, e.g. in DB.
113 * @param string Value of the session cookie
116 function session_get_session_cookie_hash($session_cookie) {
117 list ($junk, $hash) = explode('-', $session_cookie);
122 * session_check_session_cookie() - Check that session cookie passed from user is ok
124 * @param string Value of the session cookie
125 * @return user_id if cookie is ok, false otherwise
127 function session_check_session_cookie($session_cookie) {
129 list ($encrypted_session_serial, $hash) = explode('-', $session_cookie);
130 $encrypted_session_serial = base64_decode($encrypted_session_serial);
131 $new_hash = md5($encrypted_session_serial.$GLOBALS['sys_session_key']);
133 if ($hash != $new_hash) {
137 $td = mcrypt_module_open($GLOBALS['sys_session_cypher'], "", $GLOBALS['sys_session_cyphermode'], "");
138 $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);
139 mcrypt_generic_init($td, $GLOBALS['sys_session_key'], $iv);
140 $session_serial = mdecrypt_generic($td, $encrypted_session_serial);
141 mcrypt_generic_end($td);
143 list($user_id, $time, $ip, $user_agent) = explode('-', $session_serial, 4);
145 if (!session_check_ip($ip, $GLOBALS['REMOTE_ADDR'])) {
148 if (trim($user_agent) != $GLOBALS['HTTP_USER_AGENT']) {
151 if ($time - time() >= $GLOBALS['sys_session_expire']) {
159 * session_logout() - Log the user off the system.
161 * This function destroys object associated with the current session,
162 * making user "logged out". Deletes both user and session cookies.
167 function session_logout() {
169 // delete both session and username cookies
170 // NB: cookies must be deleted with the same scope parameters they were set with
172 session_cookie('session_ser', '');
173 session_cookie('username',
175 $GLOBALS['sys_username_cookie_urlspace'],
182 * session_login_valid() - Log the user to the system.
184 * High-level function for user login. Check credentials, and if they
185 * are valid, open new session.
187 * @param string User name
188 * @param string User password (in clear text)
189 * @param bool Allow login to non-confirmed user account (only for confirmation of the very account)
190 * @return true/false, if false reason is in global $feedback
194 function session_login_valid($loginname, $passwd, $allowpending=0) {
197 if (!$loginname || !$passwd) {
198 $feedback = 'Missing Password Or users Name';
202 //get the users from the database using user_id and password
204 SELECT user_id,status
206 WHERE user_name='$loginname'
207 AND user_pw='".md5($passwd)."'
209 if (!$res || db_numrows($res) < 1) {
210 //invalid password or user_name
211 $feedback='Invalid Password or User Name';
214 // check status of this user
215 $usr = db_fetch_array($res);
217 // if allowpending (for verify.php) then allow
218 if ($allowpending && ($usr['status'] == 'P')) {
221 if ($usr['status'] == 'S') {
223 $feedback = 'Account Suspended';
226 if ($usr['status'] == 'P') {
228 $feedback = 'Account Pending';
231 if ($usr['status'] == 'D') {
233 $feedback = 'Account Deleted';
236 if ($usr['status'] != 'A') {
237 //unacceptable account flag
238 $feedback = 'Account Not Active';
242 //create a new session
243 session_set_new(db_result($res,0,'user_id'));
250 * session_check_ip() - Check 2 IP addresses for match
252 * This function checks that IP addresses match
254 * IPv4 addresses are allowed to match with some
255 * fuzz factor (within 255.255.0.0 subnet).
257 * For IPv6 addresses, no fuzz is needed since there's
258 * usually no NAT in IPv6.
260 * @param string The old IP address
261 * @param string The new IP address
265 function session_check_ip($oldip,$newip) {
266 if (strstr ($oldip, ':')) {
268 if (strstr ($newip, ':')) {
269 // New IP is IPv6 too
270 return ($oldip == $newip) ;
276 if (strstr ($newip, ':')) {
280 $eoldip = explode(".",$oldip);
281 $enewip = explode(".",$newip);
283 // require same class b subnet
284 return ( ($eoldip[0] == $enewip[0])
285 && ($eoldip[1] == $enewip[1]) ) ;
291 * session_issecure() - Check if current session is secure
296 function session_issecure() {
297 return (getenv('SERVER_PORT') == '443');
301 * session_cookie() - Set a session cookie
303 * Set a cookie with default temporal scope of the current browser session
304 * and URL space of the current webserver
306 * @param string Name of cookie
307 * @param string Value of cookie
308 * @param string Domain scope (default '')
309 * @param string Expiration time in UNIX seconds (default 0)
312 function session_cookie($name ,$value, $domain = '', $expiration = 0) {
313 setcookie($name, $value, $expiration, '/', $domain, 0);
317 * session_redirect() - Redirect browser within the site
319 * @param string Absolute path within the site
320 * @return never returns
322 function session_redirect($loc) {
323 header('Location: http' . (session_issecure()?'s':'') . '://' . getenv('HTTP_HOST') . $loc);
329 * session_require() - Convenience function to easily enforce permissions
331 * Calling page will terminate with error message if current user
334 * @param array Associative array specifying criteria
335 * @return does not return if check is failed
338 function session_require($req) {
339 if (!user_isloggedin()) {
340 exit_not_logged_in();
341 //exit_permission_denied();
345 $group =& group_get_object($req['group']);
347 if (!$group || !is_object($group)) {
348 exit_error(_('Error'),
349 _('Error creating group object'));
350 } else if ($group->isError()) {
351 exit_error(_('Error'),
352 $group->getErrorMessage());
355 $perm =& $group->getPermission( session_get_user() );
356 if (!$perm || !is_object($perm)) {
357 exit_error(_('Error'),
358 _('Error creating permission object'));
359 } else if ($perm->isError()) {
360 exit_error(_('Error'),
361 $perm->getErrorMessage());
364 if ($req['admin_flags']) {
365 //$query .= " AND admin_flags = '$req[admin_flags]'";
366 if (!$perm->isAdmin()) {
367 exit_permission_denied();
370 if (!$perm->isMember()) {
371 exit_permission_denied();
374 } else if ($req['isloggedin']) {
375 //no need to check as long as the check is present at top of function
377 exit_permission_denied();
382 * session_set_new() - Setup session for the given user
384 * This function sets up SourceForge session for the given user,
385 * making one be "logged in".
387 * @param int The user ID
390 function session_set_new($user_id) {
393 // set session cookie
395 $cookie = session_build_session_cookie($user_id);
396 session_cookie("session_ser", $cookie);
399 INSERT INTO session (session_hash, ip_addr, time, user_id)
401 '".session_get_session_cookie_hash($cookie)."',
402 '".$GLOBALS['REMOTE_ADDR']."',
408 // check uniqueness of the session_hash in the database
410 $res = session_getdata($user_id);
412 if (!$res || db_numrows($res) < 1) {
413 exit_error("ERROR","ERROR - Cannot initialize session: ".db_error());
416 //set up the new user object
418 $G_SESSION = user_get_object($user_id,$res);
420 $G_SESSION->setLoggedIn(true);
424 // set username cookie for *.hostname.tld, expiration set in local.inc
426 session_cookie('username',
427 session_build_username_cookie($G_SESSION->getUnixName()),
428 $GLOBALS['sys_username_cookie_urlspace'],
429 time() + $GLOBALS['sys_username_cookie_expiration']);
433 * Private optimization function for logins - fetches user data, language, and session
436 * @param int The user ID
439 function session_getdata($user_id) {
440 $res=db_query("SELECT
442 u.*,sl.language_id, sl.name, sl.filename, sl.classname, sl.language_code
445 supported_languages sl
446 WHERE u.language=sl.language_id
447 AND u.user_id='$user_id'
453 * session_set() - Re-initialize session for the logged in user
455 * This function checks that the user is logged in and if so, initialize
456 * internal session environment.
460 function session_set() {
462 global $session_ser, $session_key;
464 // assume bad session_hash and session. If all checks work, then allow
465 // otherwise make new session
468 // If user says he's logged in (by presenting cookie), check that
471 $user_id = session_check_session_cookie($session_ser);
475 $result = session_getdata($user_id);
477 if (db_numrows($result) > 0) {
481 } // else (hash does not exist) or (session hash is bad)
484 $G_SESSION = user_get_object($user_id, $result);
486 $G_SESSION->setLoggedIn(true);
491 // if there was bad session cookie, kill it and the user cookie
500 * session_get_user() - Wrapper function to return the User object for the logged in user.
505 function &session_get_user() {
512 * Get user_id of logged in user
515 function user_getid() {
518 return $G_SESSION->getID();
526 * See if user is logged in
528 function user_isloggedin() {
532 return $G_SESSION->isLoggedIn();
540 // c-file-style: "bsd"