⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 session.php

📁 GForge 3.0 协作开发平台 支持CVS, mailing lists, bug tracking, message boards/forums, task management, perman
💻 PHP
字号:
<?php/** * SourceForge Session Module * * Copyright 1999-2001 (c) VA Linux Systems * * @version   $Id: session.php.patched,v 1.1.2.1 2002/11/30 09:57:57 cbayle Exp $ * * This file is part of GForge. * * GForge is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GForge is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GForge; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */require_once('common/include/account.php');/** * A User object if user is logged in * * @var	constant		$G_SESSION */$G_SESSION = false;/** *	session_build_session_cookie() - Construct session cookie for the user * *	@param		int		User_id of the logged in user *	@return cookie value */function session_build_session_cookie($user_id) {	$session_serial = $user_id.'-*-'.time().'-*-'.$GLOBALS['REMOTE_ADDR'].'-*-'.$GLOBALS['HTTP_USER_AGENT'];	$session_serial_hash = md5($session_serial.$GLOBALS['sys_session_key']);	$session_serial_cookie = base64_encode($session_serial).'-*-'.$session_serial_hash;	return $session_serial_cookie;}/** *	session_get_session_cookie_hash() - Get hash of session cookie * *	This hash can be used as a key to identify session, e.g. in DB. * *	@param		string	Value of the session cookie *	@return hash */function session_get_session_cookie_hash($session_cookie) {	list ($junk, $hash) = explode('-*-', $session_cookie);	return $hash;}/** *	session_check_session_cookie() - Check that session cookie passed from user is ok * *	@param		string	Value of the session cookie *	@return user_id if cookie is ok, false otherwise */function session_check_session_cookie($session_cookie) {	list ($session_serial, $hash) = explode('-*-', $session_cookie);	$session_serial = base64_decode($session_serial);	$new_hash = md5($session_serial.$GLOBALS['sys_session_key']);	if ($hash != $new_hash) {		return false;	}	list($user_id, $time, $ip, $user_agent) = explode('-*-', $session_serial, 4);	if (!session_check_ip($ip, $GLOBALS['REMOTE_ADDR'])) {		return false;	}	if (trim($user_agent) != $GLOBALS['HTTP_USER_AGENT']) {		return false;	}	if ($time - time() >= $GLOBALS['sys_session_expire']) {		return false;	}	return $user_id;}/** *	session_logout() - Log the user off the system. * *	This function destroys object associated with the current session, *	making user "logged out".  Deletes both user and session cookies. * *	@return true/false * */function session_logout() {	// delete both session and username cookies	// NB: cookies must be deleted with the same scope parameters they were set with	//	session_cookie('session_ser', '');	return true;}/** *	session_login_valid() - Log the user to the system. * *	High-level function for user login. Check credentials, and if they *	are valid, open new session. * *	@param		string	User name *	@param		string	User password (in clear text) *	@param		bool	Allow login to non-confirmed user account (only for confirmation of the very account) *	@return true/false, if false reason is in global $feedback *	@access public * */function session_login_valid($loginname, $passwd, $allowpending=0)  {	global $feedback,$Language;	if (!$loginname || !$passwd) {		$feedback = $Language->getText('session','missingpasswd');		return false;	}	//  Try to get the users from the database using user_id and (MD5) user_pw	$res = db_query("		SELECT user_id,status,unix_pw		FROM users		WHERE user_name='$loginname' 		AND user_pw='".md5($passwd)."'	");	if (!$res || db_numrows($res) < 1) {		// No user whose MD5 passwd matches the MD5 of the provided passwd		// Selecting by user_name only		$res = db_query("                       SELECT user_id,status,unix_pw                       FROM users	               WHERE user_name='$loginname'                 ");		if (!$res || db_numrows($res) < 1) {			// No user by that name			$feedback=$Language->getText('session','invalidpasswd');			return false;		} else {			// There is a user with the provided user_name, but the MD5 passwds do not match			// We'll have to try checking the (crypt) unix_pw			$usr = db_fetch_array($res);			if (crypt ($passwd, $usr['unix_pw']) != $usr['unix_pw']) {				// Even the (crypt) unix_pw does not patch				// This one has clearly typed a bas passwd				$feedback=$Language->getText('session','invalidpasswd');				return false;			}			// User exists, (crypt) unix_pw matches			// Update the (MD5) user_pw and retry authentication			// It should work, except for status errors			$res = db_query ("UPDATE users                                          SET user_pw='" . md5($passwd) . "'                                          WHERE user_id='".$usr['user_id']."'                                          ");			return session_login_valid($loginname, $passwd, $allowpending) ;		}	} else {		// If we're here, then the user has typed a password matching the (MD5) user_pw		// Let's check whether it also matches the (crypt) unix_pw		$usr = db_fetch_array($res);		if (crypt ($passwd, $usr['unix_pw']) != $usr['unix_pw']) {			// The (crypt) unix_pw does not match			if ($usr['unix_pw'] == '') {				// Empty unix_pw, we'll take the MD5 as authoritative				// Update the (crypt) unix_pw and retry authentication				// It should work, except for status errors				$res = db_query ("UPDATE users                                                  SET unix_pw='" . account_genunixpw($passwd) . "'                                                  WHERE user_id='".$usr['user_id']."'                                                  ");				return session_login_valid($loginname, $passwd, $allowpending) ;			} else {				// Invalidate (MD5) user_pw, refuse authentication				$res = db_query ("UPDATE users                                                  SET user_pw='OUT OF DATE'                                                  WHERE user_id='".$usr['user_id']."'                                                  ");				$feedback='Invalid Password Or User Name';				return false;			}		}		// Yay.  The provided password matches both fields in the database.		// Let's check the status of this user		// if allowpending (for verify.php) then allow		if ($allowpending && ($usr['status'] == 'P')) {			//1;		} else {			if ($usr['status'] == 'S') { 				//acount suspended				$feedback = $Language->getText('session','suspended');				return false;			}			if ($usr['status'] == 'P') { 				//account pending				$feedback = $Language->getText('session','pending');				return false;			} 			if ($usr['status'] == 'D') { 				//account deleted				$feedback = $Language->getText('session','deleted');				return false;			}			if ($usr['status'] != 'A') {				//unacceptable account flag				$feedback = $Language->getText('session','notactive');				return false;			}		}		//create a new session		session_set_new(db_result($res,0,'user_id'));		return true;	}}/** *	session_check_ip() - Check 2 IP addresses for match * *	This function checks that IP addresses match with the *	given fuzz factor (within 255.255.0.0 subnet). * *	@param		string	The old IP address *	@param		string	The new IP address *	@return true/false *	@access private */function session_check_ip($oldip,$newip) {	$eoldip = explode(".",$oldip);	$enewip = explode(".",$newip);	// ## require same class b subnet	if (($eoldip[0]!=$enewip[0])||($eoldip[1]!=$enewip[1])) {		return 0;	} else {		return 1;	}}/** *	session_issecure() - Check if current session is secure * *	@return true/false *	@access public */function session_issecure() {	global $HTTP_SERVER_VARS;	return ($HTTP_SERVER_VARS['SERVER_PORT'] == '443');}/** *	session_cookie() - Set a session cookie * *	Set a cookie with default temporal scope of the current browser session *	and URL space of the current webserver * *	@param		string	Name of cookie *	@param		string	Value of cookie *	@param		string	Domain scope (default '') *	@param		string	Expiration time in UNIX seconds (default 0) *	@return true/false */function session_cookie($name ,$value, $domain = '', $expiration = 0) {	setcookie($name, $value, $expiration, '/', $domain, 0);}/** *	session_redirect() - Redirect browser within the site * *	@param		string	Absolute path within the site *	@return never returns */function session_redirect($loc) {	global $HTTP_SERVER_VARS;		header('Location: http' . (session_issecure()?'s':'') . '://' . $HTTP_SERVER_VARS['HTTP_HOST'] . $loc);	print("\n\n");	exit;}/** *	session_require() - Convenience function to easily enforce permissions * *	Calling page will terminate with error message if current user *	fails checks. * *	@param		array	Associative array specifying criteria *	@return does not return if check is failed * */function session_require($req) {	if (!session_loggedin()) {		exit_not_logged_in();			//exit_permission_denied();	}	if ($req['group']) {		$group =& group_get_object($req['group']);		exit_assert_object($group,'Group');		$perm =& $group->getPermission( session_get_user() );		exit_assert_object($perm,'Permission');		if ($req['admin_flags']) {			//$query .= " AND admin_flags = '$req[admin_flags]'";				if (!$perm->isAdmin()) {				exit_permission_denied();			}		} else {			if (!$perm->isMember()) {				exit_permission_denied();			}		}	} else if ($req['isloggedin']) {		//no need to check as long as the check is present at top of function	} else {		exit_permission_denied();	}}/** *	session_set_new() - Setup session for the given user * *	This function sets up SourceForge session for the given user, *	making one be "logged in". * *	@param		int		The user ID *	@return none */function session_set_new($user_id) {	global $G_SESSION,$session_ser;	// set session cookie  //	$cookie = session_build_session_cookie($user_id);	session_cookie("session_ser", $cookie);	$session_ser=$cookie;	db_query("		INSERT INTO session (session_hash, ip_addr, time, user_id) 		VALUES (			'".session_get_session_cookie_hash($cookie)."', 			'".$GLOBALS['REMOTE_ADDR']."',			'".time()."',			$user_id		)	");	// check uniqueness of the session_hash in the database	// 	$res = session_getdata($user_id);	if (!$res || db_numrows($res) < 1) {		exit_error($Language->getText('global','error'),$Language->getText('session','cannotinit').": ".db_error());	} else {		//set up the new user object		//		$G_SESSION = user_get_object($user_id,$res);		if ($G_SESSION) {			$G_SESSION->setLoggedIn(true);		}	}}/** *	Private optimization function for logins - fetches user data, language, and session *	with one query * *  @param		int		The user ID *	@access private */function session_getdata($user_id) {	$res=db_query("SELECT		u.*,sl.language_id, sl.name, sl.filename, sl.classname, sl.language_code		FROM users u,		supported_languages sl		WHERE u.language=sl.language_id 		AND u.user_id='$user_id'	");	return $res;}/** *	session_set() - Re-initialize session for the logged in user * *	This function checks that the user is logged in and if so, initialize *	internal session environment. * *	@return none */function session_set() {	global $G_SESSION;	global $session_ser, $session_key;	// assume bad session_hash and session. If all checks work, then allow	// otherwise make new session	$id_is_good = false;	// If user says he's logged in (by presenting cookie), check that	if ($session_ser) {		$user_id = session_check_session_cookie($session_ser);		if ($user_id) {			$result = session_getdata($user_id);			if (db_numrows($result) > 0) {				$id_is_good = true;			}		}	} // else (hash does not exist) or (session hash is bad)	if ($id_is_good) {		$G_SESSION = user_get_object($user_id, $result);		if ($G_SESSION) {			$G_SESSION->setLoggedIn(true);		}	} else {		$G_SESSION=false;		// if there was bad session cookie, kill it and the user cookie		//		if ($session_ser) {			session_logout();		}	}}/** *	session_get_user() - Wrapper function to return the User object for the logged in user. *	 *	@return User *	@access public */function &session_get_user() {	global $G_SESSION;	return $G_SESSION;}/** *  user_getid() *  Get user_id of logged in user */function user_getid() {	global $G_SESSION;	if ($G_SESSION) {		return $G_SESSION->getID();	} else {		return false;	}}/** *  session_loggedin() *  See if user is logged in */function session_loggedin() {	global $G_SESSION;	if ($G_SESSION) {		return $G_SESSION->isLoggedIn();	} else {		return false;	}}?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -