<?php
/*******************************************************************************
 * Copyright (c) 2007 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Paul Colton (Aptana)- initial API and implementation
 *    Eclipse Foundation
*******************************************************************************/

class Session {
	public $_id         = '';
	public $_userid     = '';
	public $_gid		= '';
	public $_subnet     = '';
	public $_updated_at = '';

	function validate() {
		$cookie = (isset($_COOKIE[COOKIE_REMEMBER]) ? $_COOKIE[COOKIE_REMEMBER] : "");
		$rValue = 0;
		if ($cookie != "") {
			if ( (!$this->load($cookie))
				|| $this->getSubnet() != $this->_subnet) {
				# Failed - no such session, or session no match.  Need to relogin
				setcookie(COOKIE_REMEMBER, "", -36000, "/");
			}
			else {
				# Update the session updated_at
				$this->touch();
				$this->maintenance();
				$rValue = 1;
			}
		}
		return $rValue;
	}
	
	function load($_gid) {
		$rValue = false;
		global $dbh;
		$_gid = sqlSanitize($_gid, $dbh);
		
		$sql = "SELECT id, userid, gid, subnet, updated_at FROM sessions WHERE gid = " . returnQuotedString($_gid);
		
		$result = mysqli_query($dbh, $sql);
		if($result && mysqli_num_rows($result) > 0) {
			$rValue = true;
			$myrow = mysqli_fetch_assoc($result);
			$this->_id			= $myrow['id'];
			$this->_userid		= $myrow['userid'];
			$this->_gid			= $myrow['gid'];
			$this->_subnet		= $myrow['subnet'];
			$this->updated_at	= $myrow['updated_at'];
		}
		else {
			$GLOBALS['g_ERRSTRS'][1] = mysqli_error($dbh);
		}
		
		return $rValue;
	}
	
	function touch() {
		global $dbh;
		$_gid = sqlSanitize($this->_gid, $dbh);
		
		$sql = "UPDATE sessions SET updated_at = NOW() WHERE gid = " . returnQuotedString($_gid);
		
		mysqli_query($dbh, $sql);
	}

	function destroy() {
		$cookie = (isset($_COOKIE[COOKIE_REMEMBER]) ? $_COOKIE[COOKIE_REMEMBER] : "");
		if($cookie != "" && $this->load($cookie)) {
			global $dbh;
			$sql = "DELETE FROM sessions WHERE userid = " . $this->_userid;
			mysqli_query($dbh, $sql);
		}
		setcookie(COOKIE_REMEMBER, "", -36000, "/");
		session_destroy();
	}
	
	function create($_userid, $_remember) {
		global $dbh;
		$this->_userid 	= sqlSanitize($_userid, $dbh);
		$this->_gid 	= $this->guidNbr();
		$this->_subnet 	= $this->getSubnet();
		$this->_updated_at = getCURDATE();

		$sql = "INSERT INTO sessions (
				id,
				userid,
				gid,
				subnet,
				updated_at) VALUES (
				NULL,
				" . $this->_userid . ",
				" . returnQuotedString($this->_gid) . ",
				" . returnQuotedString($this->_subnet) . ",
				NOW())";
		mysqli_query($dbh, $sql);
		$cookieTime = 0;
		if($_remember) {
			$cookieTime = time()+3600*24*365;
		}
		setcookie(COOKIE_REMEMBER, $this->_gid, $cookieTime, "/");
		
		$this->maintenance();
	}
	
	function maintenance() {
		# Delete sessions older than 14 days
		# and sessions where the same subnet,user has different gids
		global $dbh;
		$sql = "DELETE FROM sessions 
				WHERE updated_at < DATE_SUB(NOW(), INTERVAL 14 DAY) 
					OR (userid = " . $this->_userid . "
						AND subnet = " . returnQuotedString($this->getSubnet()) . "
						AND gid <> " . returnQuotedString($this->_gid) . ")";
		mysqli_query($dbh, $sql);
	}
		
	function getSubnet() {
		# return class-c subnet
		return substr($_SERVER['REMOTE_ADDR'], 0, strrpos($_SERVER['REMOTE_ADDR'], ".")) . ".0";
	}
	
	function guidNbr() {
  		return md5(uniqid(rand(),true));
	}
}
?>