upgrade to codeigniter 1.7.2 for f12
[www-register-wizard.git] / libraries / Session.php
index 1191308..5e0ce48 100644 (file)
@@ -6,7 +6,7 @@
  *
  * @package            CodeIgniter
  * @author             ExpressionEngine Dev Team
- * @copyright  Copyright (c) 2008, EllisLab, Inc.
+ * @copyright  Copyright (c) 2008 - 2009, EllisLab, Inc.
  * @license            http://codeigniter.com/user_guide/license.html
  * @link               http://codeigniter.com
  * @since              Version 1.0
@@ -50,21 +50,21 @@ class CI_Session {
         *
         * The constructor runs the session routines automatically
         * whenever the class is instantiated.
-        */             
+        */
        function CI_Session($params = array())
        {
                log_message('debug', "Session Class Initialized");
 
                // Set the super object to a local variable for use throughout the class
                $this->CI =& get_instance();
-               
-               // Set all the session preferences, which can either be set 
+
+               // Set all the session preferences, which can either be set
                // manually via the $params array above or via the config file
                foreach (array('sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', 'cookie_domain', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key') as $key)
                {
                        $this->$key = (isset($params[$key])) ? $params[$key] : $this->CI->config->item($key);
-               }               
-       
+               }
+
                // Load the string helper so we can use the strip_slashes() function
                $this->CI->load->helper('string');
 
@@ -90,24 +90,24 @@ class CI_Session {
                {
                        $this->sess_expiration = (60*60*24*365*2);
                }
-                                               
+                
                // Set the cookie name
                $this->sess_cookie_name = $this->cookie_prefix.$this->sess_cookie_name;
-       
-               // Run the Session routine. If a session doesn't exist we'll 
+
+               // Run the Session routine. 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_update();
                }
-               
+
                // Delete 'old' flashdata (from last request)
                $this->_flashdata_sweep();
-               
+
                // Mark all new flashdata as old (data will be deleted before next request)
                $this->_flashdata_mark();
 
@@ -116,34 +116,34 @@ class CI_Session {
 
                log_message('debug', "Session routines successfully run");
        }
-       
+
        // --------------------------------------------------------------------
-       
+
        /**
         * Fetch the current session data if it exists
         *
         * @access      public
-        * @return      void
+        * @return      bool
         */
        function sess_read()
-       {       
+       {
                // Fetch the cookie
                $session = $this->CI->input->cookie($this->sess_cookie_name);
-               
+
                // No cookie?  Goodbye cruel world!...
                if ($session === FALSE)
                {
                        log_message('debug', 'A session cookie was not found.');
                        return FALSE;
                }
-               
+
                // Decrypt the cookie data
                if ($this->sess_encrypt_cookie == TRUE)
                {
                        $session = $this->CI->encrypt->decode($session);
                }
                else
-               {       
+               {
                        // encryption was not used, so we need to check the md5 hash
                        $hash    = substr($session, strlen($session)-32); // get last 32 chars
                        $session = substr($session, 0, strlen($session)-32);
@@ -156,17 +156,17 @@ class CI_Session {
                                return FALSE;
                        }
                }
-               
+
                // Unserialize the session array
                $session = $this->_unserialize($session);
-               
+
                // Is the session data we unserialized an array with the correct format?
                if ( ! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity']))
                {
                        $this->sess_destroy();
                        return FALSE;
                }
-               
+
                // Is the session current?
                if (($session['last_activity'] + $this->sess_expiration) < $this->now)
                {
@@ -180,19 +180,19 @@ class CI_Session {
                        $this->sess_destroy();
                        return FALSE;
                }
-               
+
                // Does the User Agent Match?
                if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 50)))
                {
                        $this->sess_destroy();
                        return FALSE;
                }
-               
+
                // Is there a corresponding session in the DB?
                if ($this->sess_use_database === TRUE)
                {
                        $this->CI->db->where('session_id', $session['session_id']);
-                                       
+
                        if ($this->sess_match_ip == TRUE)
                        {
                                $this->CI->db->where('ip_address', $session['ip_address']);
@@ -202,7 +202,7 @@ class CI_Session {
                        {
                                $this->CI->db->where('user_agent', $session['user_agent']);
                        }
-                       
+
                        $query = $this->CI->db->get($this->sess_table_name);
 
                        // No result?  Kill it!
@@ -225,18 +225,18 @@ class CI_Session {
                                                $session[$key] = $val;
                                        }
                                }
-                       }                               
+                       }
                }
-       
+
                // Session is valid!
                $this->userdata = $session;
                unset($session);
-               
+
                return TRUE;
        }
-       
+
        // --------------------------------------------------------------------
-       
+
        /**
         * Write the session data
         *
@@ -255,7 +255,7 @@ class CI_Session {
                // set the custom userdata, the session data we will set in a second
                $custom_userdata = $this->userdata;
                $cookie_userdata = array();
-               
+
                // Before continuing, we need to determine if there is any custom data to deal with.
                // Let's determine this by removing the default indexes to see if there's anything left in the array
                // and set the session data while we're at it
@@ -264,7 +264,7 @@ class CI_Session {
                        unset($custom_userdata[$val]);
                        $cookie_userdata[$val] = $this->userdata[$val];
                }
-               
+
                // Did we find any custom data?  If not, we turn the empty array into a string
                // since there's no reason to serialize and store an empty array in the DB
                if (count($custom_userdata) === 0)
@@ -272,23 +272,23 @@ class CI_Session {
                        $custom_userdata = '';
                }
                else
-               {       
+               {
                        // Serialize the custom data array so we can store it
                        $custom_userdata = $this->_serialize($custom_userdata);
                }
-               
+
                // Run the update query
                $this->CI->db->where('session_id', $this->userdata['session_id']);
                $this->CI->db->update($this->sess_table_name, array('last_activity' => $this->userdata['last_activity'], 'user_data' => $custom_userdata));
 
                // Write the cookie.  Notice that we manually pass the cookie data array to the
-               // _set_cookie() function. Normally that function will store $this->userdata, but 
+               // _set_cookie() function. Normally that function will store $this->userdata, but
                // in this case that array contains custom data, which we do not want in the cookie.
                $this->_set_cookie($cookie_userdata);
        }
-       
+
        // --------------------------------------------------------------------
-       
+
        /**
         * Create a new session
         *
@@ -296,36 +296,36 @@ class CI_Session {
         * @return      void
         */
        function sess_create()
-       {       
+       {
                $sessid = '';
                while (strlen($sessid) < 32)
                {
                        $sessid .= mt_rand(0, mt_getrandmax());
                }
-               
+
                // To make the session ID even more secure we'll combine it with the user's IP
                $sessid .= $this->CI->input->ip_address();
-       
+
                $this->userdata = array(
                                                        'session_id'    => md5(uniqid($sessid, TRUE)),
                                                        'ip_address'    => $this->CI->input->ip_address(),
                                                        'user_agent'    => substr($this->CI->input->user_agent(), 0, 50),
                                                        'last_activity' => $this->now
                                                        );
-               
-               
+
+
                // Save the data to the DB if needed
                if ($this->sess_use_database === TRUE)
                {
                        $this->CI->db->query($this->CI->db->insert_string($this->sess_table_name, $this->userdata));
                }
-                       
+
                // Write the cookie
                $this->_set_cookie();
        }
-       
+
        // --------------------------------------------------------------------
-       
+
        /**
         * Update an existing session
         *
@@ -339,8 +339,8 @@ class CI_Session {
                {
                        return;
                }
-       
-               // Save the old session id so we know which record to 
+
+               // Save the old session id so we know which record to
                // update in the database if we need it
                $old_sessid = $this->userdata['session_id'];
                $new_sessid = '';
@@ -348,21 +348,21 @@ class CI_Session {
                {
                        $new_sessid .= mt_rand(0, mt_getrandmax());
                }
-               
+
                // To make the session ID even more secure we'll combine it with the user's IP
                $new_sessid .= $this->CI->input->ip_address();
-               
+
                // Turn it into a hash
                $new_sessid = md5(uniqid($new_sessid, TRUE));
-               
+
                // Update the session data in the session data array
                $this->userdata['session_id'] = $new_sessid;
                $this->userdata['last_activity'] = $this->now;
-               
+
                // _set_cookie() will handle this for us if we aren't using database sessions
                // by pushing all userdata to the cookie.
                $cookie_data = NULL;
-               
+
                // Update the session ID and last_activity field in the DB if needed
                if ($this->sess_use_database === TRUE)
                {
@@ -372,16 +372,16 @@ class CI_Session {
                        {
                                $cookie_data[$val] = $this->userdata[$val];
                        }
-                       
+
                        $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));
                }
-               
+
                // Write the cookie
                $this->_set_cookie($cookie_data);
        }
-       
+
        // --------------------------------------------------------------------
-       
+
        /**
         * Destroy the current session
         *
@@ -389,14 +389,14 @@ class CI_Session {
         * @return      void
         */
        function sess_destroy()
-       {       
+       {
                // Kill the session DB row
                if ($this->sess_use_database === TRUE AND isset($this->userdata['session_id']))
                {
                        $this->CI->db->where('session_id', $this->userdata['session_id']);
                        $this->CI->db->delete($this->sess_table_name);
                }
-       
+
                // Kill the cookie
                setcookie(
                                        $this->sess_cookie_name,
@@ -407,36 +407,36 @@ class CI_Session {
                                        0
                                );
        }
-       
+
        // --------------------------------------------------------------------
-       
+
        /**
         * Fetch a specific item from the session array
         *
         * @access      public
         * @param       string
         * @return      string
-        */             
+        */
        function userdata($item)
        {
                return ( ! isset($this->userdata[$item])) ? FALSE : $this->userdata[$item];
        }
 
        // --------------------------------------------------------------------
-       
+
        /**
         * Fetch all session data
         *
         * @access      public
         * @return      mixed
-        */     
+        */
        function all_userdata()
        {
                return ( ! isset($this->userdata)) ? FALSE : $this->userdata;
        }
-       
+
        // --------------------------------------------------------------------
-       
+
        /**
         * Add or change data in the "userdata" array
         *
@@ -444,14 +444,14 @@ class CI_Session {
         * @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)
@@ -462,22 +462,22 @@ class CI_Session {
 
                $this->sess_write();
        }
-       
+
        // --------------------------------------------------------------------
-       
+
        /**
         * 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)
@@ -485,10 +485,10 @@ class CI_Session {
                                unset($this->userdata[$key]);
                        }
                }
-       
+
                $this->sess_write();
        }
-       
+
        // ------------------------------------------------------------------------
 
        /**
@@ -506,7 +506,7 @@ class CI_Session {
                {
                        $newdata = array($newdata => $newval);
                }
-               
+
                if (count($newdata) > 0)
                {
                        foreach ($newdata as $key => $val)
@@ -515,8 +515,8 @@ class CI_Session {
                                $this->set_userdata($flashdata_key, $val);
                        }
                }
-       } 
-       
+       }
+
        // ------------------------------------------------------------------------
 
        /**
@@ -528,9 +528,9 @@ class CI_Session {
         */
        function keep_flashdata($key)
        {
-               // 'old' flashdata gets removed.  Here we mark all 
+               // 'old' flashdata gets removed.  Here we mark all
                // flashdata as 'new' to preserve it from _flashdata_sweep()
-               // Note the function will return FALSE if the $key 
+               // Note the function will return FALSE if the $key
                // provided cannot be found
                $old_flashdata_key = $this->flashdata_key.':old:'.$key;
                $value = $this->userdata($old_flashdata_key);
@@ -538,7 +538,7 @@ class CI_Session {
                $new_flashdata_key = $this->flashdata_key.':new:'.$key;
                $this->set_userdata($new_flashdata_key, $value);
        }
-       
+
        // ------------------------------------------------------------------------
 
        /**
@@ -547,7 +547,7 @@ class CI_Session {
         * @access      public
         * @param       string
         * @return      string
-        */     
+        */
        function flashdata($key)
        {
                $flashdata_key = $this->flashdata_key.':old:'.$key;
@@ -601,7 +601,7 @@ class CI_Session {
        }
 
        // --------------------------------------------------------------------
-       
+
        /**
         * Get the "now" time
         *
@@ -619,12 +619,12 @@ class CI_Session {
                {
                        $time = time();
                }
-       
+
                return $time;
        }
 
        // --------------------------------------------------------------------
-       
+
        /**
         * Write the session cookie
         *
@@ -637,10 +637,10 @@ class CI_Session {
                {
                        $cookie_data = $this->userdata;
                }
-       
+
                // Serialize the userdata for the cookie
                $cookie_data = $this->_serialize($cookie_data);
-               
+
                if ($this->sess_encrypt_cookie == TRUE)
                {
                        $cookie_data = $this->CI->encrypt->encode($cookie_data);
@@ -650,7 +650,7 @@ class CI_Session {
                        // if encryption is not used, we provide an md5 hash to prevent userside tampering
                        $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
                }
-               
+
                // Set the cookie
                setcookie(
                                        $this->sess_cookie_name,
@@ -663,7 +663,7 @@ class CI_Session {
        }
 
        // --------------------------------------------------------------------
-       
+
        /**
         * Serialize an array
         *
@@ -673,7 +673,7 @@ class CI_Session {
         * @access      private
         * @param       array
         * @return      string
-        */     
+        */
        function _serialize($data)
        {
                if (is_array($data))
@@ -687,12 +687,12 @@ class CI_Session {
                {
                        $data = str_replace('\\', '{{slash}}', $data);
                }
-               
+
                return serialize($data);
        }
 
        // --------------------------------------------------------------------
-       
+
        /**
         * Unserialize
         *
@@ -702,26 +702,26 @@ class CI_Session {
         * @access      private
         * @param       array
         * @return      string
-        */             
+        */
        function _unserialize($data)
        {
                $data = @unserialize(strip_slashes($data));
-               
+
                if (is_array($data))
                {
                        foreach ($data as $key => $val)
                        {
                                $data[$key] = str_replace('{{slash}}', '\\', $val);
                        }
-                       
+
                        return $data;
                }
-               
+
                return str_replace('{{slash}}', '\\', $data);
        }
 
        // --------------------------------------------------------------------
-       
+
        /**
         * Garbage collection
         *
@@ -737,12 +737,12 @@ class CI_Session {
                {
                        return;
                }
-               
+
                srand(time());
                if ((rand() % 100) < $this->gc_probability)
                {
                        $expire = $this->now - $this->sess_expiration;
-                       
+
                        $this->CI->db->where("last_activity < {$expire}");
                        $this->CI->db->delete($this->sess_table_name);
 
@@ -750,7 +750,7 @@ class CI_Session {
                }
        }
 
-       
+
 }
 // END Session Class