session.inc.tmp

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· TMP 代码 · 共 297 行

TMP
297
字号
<?php/** * $Id$ * * Session management class. * * KnowledgeTree Community Edition * Document Management Made Simple * Copyright (C) 2008 KnowledgeTree Inc. * Portions copyright The Jam Warehouse Software (Pty) Limited *  * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation. *  * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>. *  * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,  * California 94120-7775, or email info@knowledgetree.com. *  * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. *  * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the  * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original  * copyright notice. * Contributor( s): ______________________________________ */class Session {    var $_bNotEmpty = true;    /**     * Creates a session.     *     * @param int the id of the user to create a session for     * @return string the generated sessionID     */    function create(&$oUser) {        $iUserId = $oUser->getId();        global $default;        session_start();        // Don't need to lock a user out the web interface if KT Tools exists and has no license.        if (KTPluginUtil::pluginIsActive('ktdms.wintools')) {            if (!$oUser->isAnonymous()) {                require_once(KT_DIR .  '/plugins/wintools/baobabkeyutil.inc.php');                $res = BaobabKeyUtil::isValidUser($oUser);                if (PEAR::isError($res)) {                    return $res;                }            }        }        if ($oUser->getDisabled() == 1) {            return PEAR::raiseError(_kt("Your account has been disabled.  Please contact the system administrator for assistance."));        }        // bind user id to session        $_SESSION["userID"] = $iUserId;        $_SESSION["KTErrorMessage"] = array();        // use the PHP generated session id        $sessionID = session_id();        // retrieve client ip        $ip = $this->getClientIP();        if (KTLOG_CACHE) $default->log->debug("Session::create() new session for $iUserId, from $ip, sessionID=$sessionID");        // insert session information into db        $aParams = array(            'session_id' => $sessionID,            'user_id' => $iUserId,            'lastused' => date("Y-m-d H:i:s", time()),            'ip' => $ip,        );        $result = DBUtil::autoInsert($default->sessions_table, $aParams);        if (PEAR::isError($result)) {            die("Error creating session: " . $result->toString());        }        $_SESSION['sessionID'] = $result;        $aParams = array(            'userid' => $iUserId,            'datetime' => date("Y-m-d H:i:s", time()),            'actionnamespace' => 'ktcore.user_history.login',            'comments' => sprintf('Logged in from %s', $ip),            'sessionid' => $_SESSION['sessionID'],        );        require_once(KT_LIB_DIR . '/users/userhistory.inc.php');        $res = KTUserHistory::createFromArray($aParams);        $oUser->setLastLogin(getCurrentDateTime());        $oUser->update();        $oProvider =& KTAuthenticationUtil::getAuthenticationProviderForUser($oUser);        $oProvider->login($oUser);        return $sessionID;    }    /**     * Destroys the current session.     */    function destroy() {        global $default;        session_start();        $sSessionID = session_id();        $iUserId = $_SESSION["userID"];        // remove the session information from the database		$sTable = KTUtil::getTableName('sessions');		$res = DBUtil::whereDelete($sTable, array('session_id' => $sSessionID));        $aParams = array(            'userid' => $iUserId,            'datetime' => date("Y-m-d H:i:s", time()),            'actionnamespace' => 'ktcore.user_history.logout',            'sessionid' => $_SESSION['sessonID'],        );        require_once(KT_LIB_DIR . '/users/userhistory.inc.php');        $res = KTUserHistory::createFromArray($aParams);        // remove the php4 session		unset($_SESSION['userID']);		unset($_SESSION['sessionStatus']);        session_unset();        session_destroy();    }    /**     * Removes any stale sessions for the specified userID     *     * @param int the userID to remove stale sessions for     */    function removeStaleSessions() {        global $default;        $time = time() - $default->sessionTimeout;        $sTable = KTUtil::getTableName('sessions');        $aQuery = array(            sprintf('SELECT id, lastused, user_id FROM %s WHERE lastused <= ?', $sTable),            array(formatDateTime($time)),        );        $aSessions = DBUtil::getResultArray($aQuery);        foreach ($aSessions as $aSessionData) {            $iId = $aSessionData['id'];            $dLastUsed = $aSessionData['lastused'];            $iUserId = $aSessionData['user_id'];            $iTime = strtotime($dLastUsed);            $iTime = $iTime + $default->sessionTimeout;            $aParams = array(                'userid' => $iUserId,                'datetime' => formatDateTime($iTime),                'actionnamespace' => 'ktcore.user_history.timeout',                'comments' => 'Session timed out',                'sessionid' => $_SESSION['sessionID'],            );            require_once(KT_LIB_DIR . '/users/userhistory.inc.php');            $res = KTUserHistory::createFromArray($aParams);            DBUtil::whereDelete($sTable, array('id' => $iId));        }    }    /**     * Used to verify the current user's session.     */    function verify() {        global $default;        // this is a workaround for an SSL download bug with IE.        session_cache_limiter('none');        session_start();        header("Cache-Control: must-revalidate");        header("Expires: " . gmdate("D, d M Y H:i:s", time() - 3600) . " GMT");        $sessionID = session_id();        $version = KTUtil::getSystemSetting('databaseVersion');        if ($default->systemVersion != $version) {            if (KTLOG_CACHE) $default->log->info("Session::verify : Database not upgraded");            $_SESSION['errormessage']['login'] = sprintf(_kt('Database incompatibility error: <br> Please ensure that you have completed the database upgrade procedure. <br> Please <a href=%s>click here</a> to complete.'),'setup/upgrade.php');            return PEAR::raiseError($_SESSION['errormessage']['login']);        }        if (empty($sessionID)) {            if (KTLOG_CACHE) $default->log->info("Session::verify session not in db");            return PEAR::raiseError(_kt('You need to login to access this page'));        }        // this should be an existing session, so check the db        $aRows = DBUtil::getResultArray(array("SELECT * FROM $default->sessions_table WHERE session_id = ?", $sessionID));        $numrows = count($aRows);        // FIXME: if there aren't more rows that the max sessions for this user        if ($numrows < 1) {            // the session doesn't exist in the db            if (KTLOG_CACHE)   $default->log->info("Session::verify sessionID=$sessionID, not in db");            return PEAR::raiseError(_kt('You need to login to access this page'));            return false;        }        if (KTLOG_CACHE) $default->log->debug("Session::verify found session in db");        $aRow = $aRows[0];        $iUserID = $aRow["user_id"];        $oKTConfig = KTConfig::getSingleton();        $allowAnon = $oKTConfig->get('session/allowAnonymousLogin', false);        $ANON = -2;        if ((!$allowAnon) && ($iUserID == $ANON)) {            Session::destroy();   // delete the anonymous session - config.ini has changed under this session.            return PEAR::raiseError(_kt("Anonymous logins are no longer allowed by the system administrator.  Please login."));        }        $ipTracking = $oKTConfig->get('session/ipTracking', false);        // check that ip matches        $ip = $this->getClientIP();        if ($ipTracking && ($ip != trim($aRow["ip"]))) {            return PEAR::raiseError(_kt("You are coming from a different IP address than the session requires"));        }        if (empty($_SESSION['userID'])) {            Session::removeStaleSessions();            return PEAR::raiseError(_kt('Session timed out'));        }        // now check if the timeout has been exceeded        $lastused = $aRow["lastused"];        $diff = time() - strtotime($lastused);        if($diff <= $default->sessionTimeout) {            // update last used timestamp            $aFV = array(                'lastused' => getCurrentDateTime(),            );            $aWFV = array(                'user_id' => $iUserID,                'session_id' => $sessionID,            );            $res = DBUtil::whereUpdate($default->sessions_table, $aFV, $aWFV);            // add the array to the session            $_SESSION["sessionStatus"] = $sessionStatus;            Session::removeStaleSessions();            return true;        } else {            Session::removeStaleSessions();            return PEAR::raiseError(_kt('Session timed out'));        }        Session::removeStaleSessions();        return false;    }    /**     * Retrieves and returns the IP address of the current user     */    function getClientIP() {        // get client ip        if (getenv("REMOTE_ADDR")) {            $ip = getenv("REMOTE_ADDR");        } elseif(getenv("HTTP_X_FORWARDED_FOR")) {            $forwardedip = getenv("HTTP_X_FORWARDED_FOR");            list($ip,$ip2,$ip3,$ip4)= split (",", $forwardedip);        } elseif (getenv("HTTP_CLIENT_IP")) {            $ip = getenv("HTTP_CLIENT_IP");        }        return $ip;    }}?>

⌨️ 快捷键说明

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