'" . time() . "'"; $db_results = Dba::read($sql); if ($results = Dba::fetch_assoc($db_results)) { return $results[$column]; } debug_event('session', 'Unable to read session from key ' . $key . ' no data found', 5); return ''; } /** * username * * This returns the username associated with a session ID, if any */ public static function username($key) { return self::_read($key, 'user'); } /** * create * This is called when you want to create a new session * it takes care of setting the initial cookie, and inserting the first * chunk of data, nifty ain't it! */ public static function create($data) { // Regenerate the session ID to prevent fixation switch ($data['type']) { case 'xml-rpc': case 'api': $key = md5(uniqid(rand(), true)); break; case 'mysql': default: session_regenerate_id(); // Before refresh we don't have the cookie so we // have to use session ID $key = session_id(); break; } // end switch on data type $username = Dba::escape($data['username']); $ip = $_SERVER['REMOTE_ADDR'] ? Dba::escape(inet_pton($_SERVER['REMOTE_ADDR'])) : '0'; $type = Dba::escape($data['type']); $value = Dba::escape($data['value']); $agent = Dba::escape(substr($_SERVER['HTTP_USER_AGENT'], 0, 254)); $expire = Dba::escape(time() + Config::get('session_length')); if (!strlen($value)) { $value = ' '; } /* Insert the row */ $sql = "INSERT INTO `session` (`id`,`username`,`ip`,`type`,`agent`,`value`,`expire`) " . " VALUES ('$key','$username','$ip','$type','$agent','$value','$expire')"; $db_results = Dba::write($sql); if (!$db_results) { debug_event('session', 'Session creation failed', 1); return false; } debug_event('session', 'Session created:' . $key, 5); return $key; } /** * check * * This checks for an existing session. If it's still valid we go ahead * and start it and return true. */ public static function check() { $session_name = Config::get('session_name'); // No cookie no go! if (!isset($_COOKIE[$session_name])) { return false; } // Check for a remember me if (isset($_COOKIE[$session_name . '_remember'])) { self::create_remember_cookie(); } // Set up the cookie params before we start the session. // This is vital session_set_cookie_params( Config::get('cookie_life'), Config::get('cookie_path'), Config::get('cookie_domain'), Config::get('cookie_secure')); // Set name session_name($session_name); // Ungimp IE and go self::ungimp_ie(); session_start(); return true; } /** * exists * * This checks to see if the specified session of the specified type * exists, it also provides an array of keyed data that may be required * based on the type. */ public static function exists($type, $key, $data=array()) { // Switch on the type they pass switch ($type) { case 'xml-rpc': case 'api': $key = Dba::escape($key); $time = time(); $sql = "SELECT * FROM `session` WHERE " . "`id`='$key' AND `expire` > '$time' " . "AND `type`='$type'"; $db_results = Dba::read($sql); if (Dba::num_rows($db_results)) { return true; } break; case 'interface': $key = Dba::escape($key); $time = time(); // Build a list of enabled authentication types $types = Config::get('auth_methods'); if (!Config::get('use_auth')) { $types[] = ''; } $enabled_types = implode("','", $types); $sql = "SELECT * FROM `session` WHERE " . "`id`='$key' AND `expire` > '$time' " . "AND `type` IN('$enabled_types')"; $db_results = Dba::read($sql); if (Dba::num_rows($db_results)) { return true; } break; case 'stream': $key = Dba::escape($key); $ip = Dba::escape(inet_pton($data['ip'])); $agent = Dba::escape($data['agent']); $sql = "SELECT * FROM `session_stream` WHERE " . "`id`='$key' AND `expire` > '$time' " . "AND `ip`='$ip' AND `agent`='$agent'"; $db_results = Dba::read($sql); if (Dba::num_rows($db_results)) { return true; } break; default: return false; break; } // type // Default to false return false; } /** * extend * * This takes a SID and extends its expiration. */ public static function extend($sid) { $time = time(); $sid = Dba::escape($sid); $expire = isset($_COOKIE[Config::get('session_name') . '_remember']) ? $time + Config::get('remember_length') : $time + Config::get('session_length'); $sql = "UPDATE `session` SET `expire`='$expire' WHERE `id`='$sid'"; if ($db_results = Dba::write($sql)) { debug_event('session', $sid . ' has been extended to ' . date('r', $expire) . ' extension length ' . ($expire - $time), 5); } return $db_results; } /** * _auto_init * This function is called when the object is included, this sets up the * session_save_handler */ public static function _auto_init() { if (!function_exists('session_start')) { header("Location:" . Config::get('web_path') . "/test.php"); exit; } session_set_save_handler( array('Session', 'open'), array('Session', 'close'), array('Session', 'read'), array('Session', 'write'), array('Session', 'destroy'), array('Session', 'gc')); } /** * create_cookie * * This is separated into its own function because of some flaws in * specific webservers *cough* IIS *cough* which prevent us from setting * a cookie at the same time as a header redirect. As such on view of a * login a cookie is set with the proper name */ public static function create_cookie() { // Set up the cookie prefs before we throw down, this is very important $cookie_life = Config::get('cookie_life'); $cookie_path = Config::get('cookie_path'); $cookie_domain = false; $cookie_secure = Config::get('cookie_secure'); session_set_cookie_params($cookie_life,$cookie_path,$cookie_domain,$cookie_secure); session_name(Config::get('session_name')); /* Start the session */ self::ungimp_ie(); session_start(); } /** * create_remember_cookie * * This function just creates the remember me cookie, nothing special */ public static function create_remember_cookie() { $remember_length = Config::get('remember_length'); $session_name = Config::get('session_name'); Config::set('cookie_life', $remember_length, true); setcookie($session_name . '_remember',"Rappelez-vous, rappelez-vous le 27 mars", time() + $remember_length, '/'); } /** * ungimp_ie * This function sets the cache limiting to public if you are running * some flavor of IE. The detection used here is very conservative so * feel free to fix it. This only has to be done if we're rolling HTTPS. */ public static function ungimp_ie() { // If no https, no ungimpage required if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'on') { return true; } // Try to detect IE $agent = trim($_SERVER['HTTP_USER_AGENT']); if ((strpos($agent, 'MSIE') !== false) || (strpos($agent,'Internet Explorer/') !== false)) { session_cache_limiter('public'); } return true; } // ungimp_ie } ?>