Welcome Guest, Not a member yet? Register   Sign In
Dynamically set configuration on session expire doesn't work
#6

[eluser]nlogachev[/eluser]
I needed to do the same thing, and figured out how while still keeping the Session library in the autoload.php config.

Two parts to this.

1: Overload the Session Library. What the following code does is it adds an extra check for the 'new_expiration' key in the custom userdata. Apart from that and moving the sess_expiration check to the bottom, it is the same as the built-in function.

Note: I used the database for sessions, but I assume this shouldn't make a difference...



Code:
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Session extends CI_Session
{

    function MY_Session($params=array())
    {
        parent::CI_Session($params);
    }
    
    /**
     * Fetch the current session data if it exists
     *
     * @access    public
     * @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);

            // Does the md5 hash match?  This is to prevent manipulation of session data in userspace
            if ($hash !==  md5($session.$this->encryption_key))
            {
                log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.');
                $this->sess_destroy();
                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;
        }

        // Does the IP Match?
        if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI->input->ip_address())
        {
            $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']);
            }

            if ($this->sess_match_useragent == TRUE)
            {
                $this->CI->db->where('user_agent', $session['user_agent']);
            }

            $query = $this->CI->db->get($this->sess_table_name);

            // No result?  Kill it!
            if ($query->num_rows() == 0)
            {
                $this->sess_destroy();
                return FALSE;
            }

            // Is there custom data?  If so, add it to the main session array
            $row = $query->row();
            if (isset($row->user_data) AND $row->user_data != '')
            {
                $custom_data = $this->_unserialize($row->user_data);

                if (is_array($custom_data))
                {
                    foreach ($custom_data as $key => $val)
                    {
                        $session[$key] = $val;
                    }
                }
            }
        }
        
        /**
         * ADDED TO ALLOW CUSTOM EXPIRATION DATES
         */
        if ( isset($session['new_expiration']) )
        {
            $this->sess_expiration = $session['new_expiration'];
        }

        /**
         * MOVED THIS DOWN HERE TO ENABLE THIS NEW FEATURE
         */
        // Is the session current?
        if (($session['last_activity'] + $this->sess_expiration) < $this->now)
        {
            $this->sess_destroy();
            return FALSE;
        }

        /**
         * END NEW
         */

        // Session is valid!
        $this->userdata = $session;
        unset($session);

        return TRUE;
    }

}

?&gt;


Step 2:

In your login logic you need to add the following wherever appropriate (e.g., after checking that the keep_logged_in variable is 1, true, or whatever from the POST data...



Code:
$this->session->set_userdata('new_expiration',1209600); //2 weeks
$this->session->sess_update(); //force the session to update the cookie and/or database



Hope this helps! Smile


Messages In This Thread
Dynamically set configuration on session expire doesn't work - by El Forum - 06-23-2010, 07:56 AM



Theme © iAndrew 2016 - Forum software by © MyBB