CI =& get_instance(); log_message('debug', "Session Class Initialized"); $this->sess_run(); } // -------------------------------------------------------------------- /** * 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->CI->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->CI->config->item('sess_expiration'); if (is_numeric($expiration)) { if ($expiration > 0) { $this->sess_length = $this->CI->config->item('sess_expiration'); } else { $this->sess_length = (60*60*24*365*2); } } // Do we need encryption? $this->encryption = $this->CI->config->item('sess_encrypt_cookie'); if ($this->encryption == TRUE) { $this->CI->load->library('encrypt'); } // Are we using a database? if ($this->CI->config->item('sess_use_database') === TRUE AND $this->CI->config->item('sess_table_name') != '') { $this->use_database = TRUE; $this->session_table = $this->CI->config->item('sess_table_name'); $this->CI->load->database(); } // Set the cookie name if ($this->CI->config->item('sess_cookie_name') != FALSE) { $this->sess_cookie = $this->CI->config->item('cookie_prefix').$this->CI->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 { $this->sess_fetch(); } // Delete expired sessions if necessary if ($this->use_database === TRUE) { $this->sess_gc(); } } // -------------------------------------------------------------------- /** * Fetch the current session data if it exists * * @access public * @return bool } */ function sess_read() { // Fetch the session ID $session_id = get_cookie('ci_session'); if ($session_id === FALSE) { return FALSE; } $this->CI->db->from('ci_sessions')->where('session_id', $session_id); $query = $this->CI->db->get(); // No valid session in the db if (count($query->result() == 0)) { $this->sess_destroy(); return false; } $session_data = $query->result(); $session_data = $session_data[0]; $session_data = unserialize($session_data->extras); echo "sess_read():
" . print_r($session_data, true) . ""; // Is the session current? if (($session_data['extras'] + $this->sess_length) < $this->now) { echo "not current session"; die; $this->sess_destroy(); return FALSE; } // Does the IP Match? if ($session_data['ip_address'] != $this->CI->input->ip_address()) { echo "no ip match"; die; $this->sess_destroy(); return FALSE; } // Does the User Agent Match? if ($session_data['user_agent'] != substr($this->CI->input->user_agent(), 0, 50)) { echo "no user agent match"; die; $this->sess_destroy(); return FALSE; } $this->userdata = $session_data; echo "set_userdata: " . $this->CI->input->cookie($this->sess_cookie); return true; } // -------------------------------------------------------------------- /** * Write the session cookie * * @access public * @return void */ function sess_write($session_id) { $cookie = array( 'name' => 'ci_session', 'value' => $session_id, 'expire'=> 0, 'domain'=> $this->CI->config->item('cookie_domain')); set_cookie($cookie); echo "created new session"; } /** * Write the session data * * @access public * @return void */ function sess_write_data() { unset($this->userdata['session_id']); $this->CI->db->update('ci_sessions', $this->userdata, array('session_id' => get_cookie($this->CI->config->item('sess_cookie_name')))); } // -------------------------------------------------------------------- /** * Create a new empty session * * @access public * @return void */ function sess_create() { $this->CI->load->library('user_agent'); $sessid = ''; while (strlen($sessid) < 32) { $sessid .= mt_rand(0, mt_getrandmax()); } $session_id = sha1(uniqid($sessid, TRUE)); $this->userdata = array( 'session_id' => $session_id, 'extras' => serialize(array('ip_address' => $this->CI->input->ip_address(), 'user_agent' => $this->CI->agent->agent_string(), 'last_activity' => time())) ); // Save the session in the DB $this->CI->db->insert('ci_sessions', $this->userdata); // Write the cookie $this->sess_write($session_id); } // -------------------------------------------------------------------- /** * Assign the session values to userdata * * @access public * @return void */ function sess_fetch() { echo "sess_fetch: " . $this->CI->input->cookie($this->sess_cookie); $this->CI->db->from('ci_sessions')->where('session_id', $this->CI->input->cookie($this->sess_cookie)); $session_data = $this->CI->db->get(); $session_data = $session_data->result(); $session_data = $session_data[0]; foreach (unserialize($session_data->extras) as $key => $value) $this->userdata[$key] = $value; } // -------------------------------------------------------------------- /** * Destroy the current session * * @access public * @return void */ function sess_destroy() { setcookie( $this->sess_cookie, addslashes(serialize(array())), ($this->now - 31500000), $this->CI->config->item('cookie_path'), $this->CI->config->item('cookie_domain'), 0 ); } // -------------------------------------------------------------------- /** * 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->CI->db->where("last_activity < {$expire}"); $this->CI->db->delete($this->session_table); log_message('debug', 'Session garbage collection performed.'); } } // -------------------------------------------------------------------- /** * Fetch a specific item (or all items) form the session array * * @access public * @param string * @return string or array */ function userdata($item = null) { echo "userdata: " . $this->CI->input->cookie($this->sess_cookie); if ($item == null) return unserialize($this->userdata['extras']); else return ( ! isset($this->userdata[$item])) ? FALSE : $this->userdata[$item]; } // -------------------------------------------------------------------- /** * Add or change data in the "userdata" array * * @access public * @param mixed * @param string * @return void */ function set_userdata($newdata = array(), $newval = '') { echo "set_userdata: " . $this->CI->input->cookie($this->sess_cookie); if (is_string($newdata)) { $newdata = array($newdata => $newval); } if (count($newdata) > 0) { foreach ($newdata as $key => $val) { $this->userdata['extras'][$key] = $val; } } $this->sess_write_data(); } // -------------------------------------------------------------------- /** * 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(); } // -------------------------------------------------------------------- /** * 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 Session Class ?>