Initial Import
diff --git a/system/libraries/Session.php b/system/libraries/Session.php
new file mode 100644
index 0000000..4f08cf6
--- /dev/null
+++ b/system/libraries/Session.php
@@ -0,0 +1,499 @@
+<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		Rick Ellis
+ * @copyright	Copyright (c) 2006, pMachine, Inc.
+ * @license		http://www.codeignitor.com/user_guide/license.html 
+ * @link		http://www.codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+ 
+// ------------------------------------------------------------------------
+
+/**
+ * Session Class
+ * 
+ * @package		CodeIgniter
+ * @subpackage	Libraries
+ * @category	Sessions
+ * @author		Rick Ellis
+ * @link		http://www.codeigniter.com/user_guide/libraries/sessions.html
+ */
+class CI_Session {
+
+	var $now;
+	var $encryption		= TRUE;
+	var $use_database	= FALSE;
+	var $session_table	= FALSE;
+    var $sess_length	= 7200;
+    var $sess_cookie	= 'ci_session';
+	var $userdata		= array();
+    var $gc_probability	= 5;
+    var $object;
+    
+
+	/**
+	 * Session Constructor
+	 *
+	 * The constructor runs the session routines automatically
+	 * whenever the class is instantiated.
+	 */		
+	function CI_Session()
+	{
+		$this->object =& get_instance();
+
+		log_message('debug', "Session Class Initialized");
+		$this->sess_run();
+	}
+	// END display_errors()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Run the session routines
+	 *
+	 * @access	public
+	 * @return	void
+	 */		
+	function sess_run()
+	{
+		/*
+		 *  Set the "now" time
+		 *
+		 * It can either set to GMT or time(). The pref
+		 * is set in the config file.  If the developer
+		 * is doing any sort of time localization they 
+		 * might want to set the session time to GMT so
+		 * they can offset the "last_activity" and
+		 * "last_visit" times based on each user's locale.
+		 *
+		 */
+		if (strtolower($this->object->config->item('time_reference')) == 'gmt')
+		{
+			$now = time();
+			$this->now = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now));   
+	
+			if (strlen($this->now) < 10)
+			{
+				$this->now = time();
+				log_message('error', 'The session class could not set a proper GMT timestamp so the local time() value was used.');
+			}
+		}
+		else
+		{
+			$this->now = time();
+		}
+		
+		/*
+		 *  Set the session length
+		 *
+		 * If the session expiration is set to zero in
+		 * the config file we'll set the expiration 
+		 * two years from now.
+		 *
+		 */
+		$expiration = $this->object->config->item('sess_expiration');
+		
+		if (ctype_digit($expiration))
+		{
+			if ($expiration > 0)
+			{
+				$this->sess_length = $this->object->config->item('sess_expiration');
+			}
+			else
+			{
+				$this->sess_length = (60*60*24*365*2);
+			}
+		}
+		
+		// Do we need encryption?
+		$this->encryption = $this->object->config->item('sess_encrypt_cookie');
+		
+		if ($this->encryption == TRUE)	
+		{
+			$this->object->load->library('encrypt');
+		}		
+
+		// Are we using a database?
+		if ($this->object->config->item('sess_use_database') === TRUE AND $this->object->config->item('sess_table_name') != '')
+		{
+			$this->use_database = TRUE;
+			$this->session_table = $this->object->config->item('sess_table_name');
+			$this->object->load->database();
+		}
+		
+		// Set the cookie name
+		if ($this->object->config->item('sess_cookie_name') != FALSE)
+		{
+			$this->sess_cookie = $this->object->config->item('cookie_prefix').$this->object->config->item('sess_cookie_name');
+		}
+	
+		/*
+		 *  Fetch the current session
+		 *
+		 * If a session doesn't exist we'll create
+		 * a new one.  If it does, we'll update it.
+		 *
+		 */
+		if ( ! $this->sess_read())
+		{
+			$this->sess_create();
+		}
+		else
+		{	
+			// We only update the session every five minutes
+			if (($this->userdata['last_activity'] + 300) < $this->now)
+			{
+				$this->sess_update();
+			}
+		}
+		
+		// Delete expired sessions if necessary
+		if ($this->use_database === TRUE)
+		{		
+			$this->sess_gc();
+		}	
+	}
+	// END sess_run()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Fetch the current session data if it exists
+	 *
+	 * @access	public
+	 * @return	void
+	 */
+	function sess_read()
+	{	
+		// Fetch the cookie
+		$session = $this->object->input->cookie($this->sess_cookie);
+		
+		if ($session === FALSE)
+		{
+			log_message('debug', 'A session cookie was not found.');
+			return FALSE;
+		}
+		
+		// Decrypt and unserialize the data
+		if ($this->encryption == TRUE)
+		{
+			$session = $this->object->encrypt->decode($session);
+		}
+
+		$session = @unserialize($this->strip_slashes($session));
+		
+		if ( ! is_array($session) OR ! isset($session['last_activity']))
+		{
+			log_message('error', 'The session cookie data did not contain a valid array. This could be a possible hacking attempt.');
+			return FALSE;
+		}
+		
+		// Is the session current?
+		if (($session['last_activity'] + $this->sess_length) < $this->now) 
+		{
+			$this->sess_destroy();
+			return FALSE;
+		}
+
+		// Does the IP Match?
+		if ($this->object->config->item('sess_match_ip') == TRUE AND $session['ip_address'] != $this->object->input->ip_address())
+		{
+			$this->sess_destroy();
+			return FALSE;
+		}
+		
+		// Does the User Agent Match?
+		if ($this->object->config->item('sess_match_useragent') == TRUE AND $session['user_agent'] != substr($this->object->input->user_agent(), 0, 50))
+		{
+			$this->sess_destroy();
+			return FALSE;
+		}
+		
+		// Is there a corresponding session in the DB?
+		if ($this->use_database === TRUE)
+		{
+			$this->object->db->where('session_id', $session['session_id']);
+					
+			if ($this->object->config->item('sess_match_ip') == TRUE)
+			{
+				$this->object->db->where('ip_address', $session['ip_address']);
+			}
+
+			if ($this->object->config->item('sess_match_useragent') == TRUE)
+			{
+				$this->object->db->where('user_agent', $session['user_agent']);
+			}
+			
+			$query = $this->object->db->get($this->session_table);
+
+			if ($query->num_rows() == 0)
+			{
+				$this->sess_destroy();
+				return FALSE;
+			}
+			else
+			{
+				$row = $query->row();
+				if (($row->last_activity + $this->sess_length) < $this->now) 
+				{
+					$this->object->db->where('session_id', $session['session_id']);
+					$this->object->db->delete($this->session_table);
+					$this->sess_destroy();
+					return FALSE;
+				}
+			}
+		}
+	
+		// Session is valid!
+		$this->userdata = $session;
+		unset($session);
+		
+		return TRUE;
+	}
+	// END sess_read()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Write the session cookie
+	 *
+	 * @access	public
+	 * @return	void
+	 */
+	function sess_write()
+	{								
+		$cookie_data = serialize($this->userdata);
+		
+		if ($this->encryption == TRUE)
+		{
+			$cookie_data = $this->object->encrypt->encode($cookie_data);
+		}
+
+		setcookie(
+					$this->sess_cookie, 
+					$cookie_data, 
+					$this->sess_length + $this->now, 
+					$this->object->config->item('cookie_path'), 
+					$this->object->config->item('cookie_domain'), 
+					0
+				);
+	}
+	// END sess_read()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Create a new session
+	 *
+	 * @access	public
+	 * @return	void
+	 */
+	function sess_create()
+	{	
+		$sessid = '';
+		while (strlen($sessid) < 32) 
+		{    
+			$sessid .= mt_rand(0, mt_getrandmax());
+		}
+	
+		$this->userdata = array(
+							'session_id' 	=> md5(uniqid($sessid, TRUE)),
+							'ip_address' 	=> $this->object->input->ip_address(),
+							'user_agent' 	=> substr($this->object->input->user_agent(), 0, 50),
+							'last_activity'	=> $this->now
+							);
+		
+		
+		// Save the session in the DB if needed
+		if ($this->use_database === TRUE)
+		{
+			$this->object->db->query($this->object->db->insert_string($this->session_table, $this->userdata));
+		}
+			
+		// Write the cookie
+		$this->userdata['last_visit'] = 0;		
+		$this->sess_write();
+	}
+	// END sess_read()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Update an existing session
+	 *
+	 * @access	public
+	 * @return	void
+	 */
+	function sess_update()
+	{	
+        if (($this->userdata['last_activity'] + $this->sess_length) < $this->now) 
+        {
+			$this->userdata['last_visit'] = $this->userdata['last_activity'];
+        }
+	
+		$this->userdata['last_activity'] = $this->now;
+		
+		// Update the session in the DB if needed
+		if ($this->use_database === TRUE)
+		{		
+			$this->object->db->query($this->object->db->update_string($this->session_table, array('last_activity' => $this->now), array('session_id' => $this->userdata['session_id'])));
+		}
+		
+		// Write the cookie
+		$this->sess_write();
+	}
+	// END sess_update()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Destroy the current session
+	 *
+	 * @access	public
+	 * @return	void
+	 */
+	function sess_destroy()
+	{
+		setcookie(
+					$this->sess_cookie, 
+					addslashes(serialize(array())), 
+					($this->now - 31500000), 
+					$this->object->config->item('cookie_path'), 
+					$this->object->config->item('cookie_domain'), 
+					0
+				);
+	}
+	// END sess_destroy()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Garbage collection
+	 *
+	 * This deletes expired session rows from database
+	 * if the probability percentage is met
+	 *
+	 * @access	public
+	 * @return	void
+	 */
+    function sess_gc()
+    {  
+		srand(time());
+		if ((rand() % 100) < $this->gc_probability) 
+		{  
+			$expire = $this->now - $this->sess_length;
+			
+			$this->object->db->where("last_activity < {$expire}");
+			$this->object->db->delete($this->session_table);
+
+			log_message('debug', 'Session garbage collection performed.');
+		}    
+    }
+	// END sess_destroy()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Fetch a specific item form  the session array
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	string
+	 */		
+	function userdata($item)
+	{
+    	return ( ! isset($this->userdata[$item])) ? FALSE : $this->userdata[$item];
+	}
+	// END sess_destroy()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Add or change data in the "userdata" array
+	 *
+	 * @access	public
+	 * @param	mixed
+	 * @param	string
+	 * @return	void
+	 */		
+	function set_userdata($newdata = array(), $newval = '')
+	{
+		if (is_string($newdata))
+		{
+			$newdata = array($newdata => $newval);
+		}
+	
+		if (count($newdata) > 0)
+		{
+			foreach ($newdata as $key => $val)
+			{
+				$this->userdata[$key] = $val;
+			}
+		}
+	
+    	$this->sess_write();
+	}
+	// END set_userdata()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Delete a session variable from the "userdata" array
+	 *
+	 * @access	array
+	 * @return	void
+	 */		
+	function unset_userdata($newdata = array())
+	{
+		if (is_string($newdata))
+		{
+			$newdata = array($newdata => '');
+		}
+	
+		if (count($newdata) > 0)
+		{
+			foreach ($newdata as $key => $val)
+			{
+				unset($this->userdata[$key]);
+			}
+		}
+	
+    	$this->sess_write();
+	}
+	// END set_userdata()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Strip slashes
+	 *
+	 * @access	public
+	 * @param	mixed
+	 * @return	mixed
+	 */
+     function strip_slashes($vals)
+     {
+     	if (is_array($vals))
+     	{	
+     		foreach ($vals as $key=>$val)
+     		{
+     			$vals[$key] = $this->strip_slashes($val);
+     		}
+     	}
+     	else
+     	{
+     		$vals = stripslashes($vals);
+     	}
+     	
+     	return $vals;
+	}
+	// END strip_slashes()
+}
+// END Session Class
+?>
\ No newline at end of file