<?php defined('BASEPATH') OR exit('No direct script access allowed');
/**
* CodeIgniter Session Class Extension
*
* Allow for namespacing of session data. Useful within portals.
*
* Set namespace in config/config.php
* $config['sess_namespace'] = 'MyNamespace';
*
* Defaults namespace to 'public'
*
* @package CodeIgniter
* @subpackage Libraries
* @category Sessions
*
* @author Andrey Andreev
* @author Sean Benoit
**/
class MY_Session extends CI_Session {
public function __construct(array $params = array())
{
if(NULL === ($default_namespace = config_item('sess_namespace')))
{
$default_namespace = 'public';
}
isset($params['namespace']) OR $params['namespace'] = $default_namespace;
parent::__construct($params);
}
protected function _ci_init_vars()
{
if ( ! empty($_SESSION['__ci_vars']) && !empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
{
$current_time = time();
foreach ($_SESSION['__ci_vars'][$this->_config['namespace']] as $key => &$value)
{
if ($value === 'new')
{
$_SESSION['__ci_vars'][$this->_config['namespace']][$key] = 'old';
}
// Hacky, but 'old' will (implicitly) always be less than time() ;)
// DO NOT move this above the 'new' check!
elseif ($value < $current_time)
{
unset($_SESSION[$key], $_SESSION[$this->_config['namespace']][$key], $_SESSION['__ci_vars'][$this->_config['namespace']][$key]);
}
}
if (empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
{
unset($_SESSION['__ci_vars'][$this->_config['namespace']]);
}
if (empty($_SESSION['__ci_vars']))
{
unset($_SESSION['__ci_vars']);
}
}
$this->userdata =& $_SESSION;
}
public function __isset($key)
{
if ($key === 'session_id')
{
return (session_status() === PHP_SESSION_ACTIVE);
}
return isset($_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]);
}
public function __set($key, $value)
{
if( ! isset($_SESSION[$this->_config['namespace']]))
{
$_SESSION[$key][$this->_config['namespace']] = array();
}
$_SESSION[$this->_config['namespace']][$key] = $value;
}
public function __get($key)
{
// Note: Keep this order the same, just in case somebody wants to
// use 'session_id' as a session data key, for whatever reason
if (isset($_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]))
{
return $_SESSION[$this->_config['namespace']][$key];
}
elseif ($key === 'session_id')
{
return session_id();
}
return NULL;
}
public function mark_as_temp($key, $ttl = 300)
{
$ttl += time();
if (is_array($key))
{
$temp = array();
foreach ($key as $k => $v)
{
// Do we have a key => ttl pair, or just a key?
if (is_int($k))
{
$k = $v;
$v = $ttl;
}
else
{
$v += time();
}
if ( ! isset($_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$k]))
{
return FALSE;
}
$temp[$k] = $v;
}
$_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? $_SESSION['__ci_vars'] : array();
$_SESSION['__ci_vars'][$this->_config['namespace']] = isset($_SESSION['__ci_vars'][$this->_config['namespace']])
? array_merge($_SESSION['__ci_vars'][$this->_config['namespace']], $temp)
: $temp;
return TRUE;
}
if ( ! isset($_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]))
{
return FALSE;
}
$_SESSION['__ci_vars'][$this->_config['namespace']][$key] = $ttl;
return TRUE;
}
public function get_temp_keys()
{
if ( ! isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$this->_config['namespace']]))
{
return array();
}
$keys = array();
foreach (array_keys($_SESSION['__ci_vars'][$this->_config['namespace']]) as $key)
{
is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$key]) && $keys[] = $key;
}
return $keys;
}
public function userdata($key = NULL)
{
if (isset($key))
{
return isset($_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]) ? $_SESSION[$this->_config['namespace']][$key] : NULL;
}
elseif (empty($_SESSION) || empty($_SESSION[$this->_config['namespace']]))
{
return array();
}
$userdata = array();
$_exclude = array_merge(
array('__ci_vars'),
$this->get_flash_keys(),
$this->get_temp_keys()
);
foreach (array_keys($_SESSION[$this->_config['namespace']]) as $key)
{
if ( ! in_array($key, $_exclude, TRUE))
{
$userdata[$key] = $_SESSION[$this->_config['namespace']][$key];
}
}
return $userdata;
}
public function &get_userdata()
{
if(!isset($_SESSION[$this->_config['namespace']]))
{
return array();
}
return $_SESSION[$this->_config['namespace']];
}
public function set_userdata($data, $value = NULL)
{
if( ! isset($_SESSION[$this->_config['namespace']]))
{
$_SESSION[$this->_config['namespace']] = array();
}
if (is_array($data))
{
foreach ($data as $key => &$value)
{
$_SESSION[$this->_config['namespace']][$key] = $value;
}
return;
}
$_SESSION[$this->_config['namespace']][$data] = $value;
}
public function unset_userdata($key)
{
if( ! isset($_SESSION[$this->_config['namespace']]))
{
return;
}
if (is_array($key))
{
foreach ($key as $k)
{
unset($_SESSION[$this->_config['namespace']][$k]);
}
return;
}
unset($_SESSION[$this->_config['namespace']][$key]);
}
public function has_userdata($key)
{
return isset($_SESSION[$this->_config['namespace']]) && isset($_SESSION[$key]);
}
public function flashdata($key = NULL)
{
if (isset($key))
{
return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$this->_config['namespace']], $_SESSION['__ci_vars'][$this->_config['namespace']][$key], $_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]) && ! is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$key]))
? $_SESSION[$this->_config['namespace']][$key]
: NULL;
}
$flashdata = array();
if ( ! empty($_SESSION['__ci_vars']) && ! empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
{
foreach ($_SESSION['__ci_vars'][$this->_config['namespace']] as $key => &$value)
{
is_int($value) OR $flashdata[$key] = $_SESSION[$this->_config['namespace']][$key];
}
}
return $flashdata;
}
public function set_flashdata($data, $value = NULL)
{
$this->set_userdata($data, $value);
$this->mark_as_flash(is_array($data) ? array_keys($data) : $data);
}
public function mark_as_flash($key)
{
if (is_array($key))
{
for ($i = 0, $c = count($key); $i < $c; $i++)
{
if ( ! isset($_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key[$i]]))
{
return FALSE;
}
}
$new = array_fill_keys($key, 'new');
$_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? $_SESSION['__ci_vars'] : array();
$_SESSION['__ci_vars'][$this->_config['namespace']] = isset($_SESSION['__ci_vars'][$this->_config['namespace']])
? array_merge($_SESSION['__ci_vars'][$this->_config['namespace']], $new)
: $new;
return TRUE;
}
if ( ! isset($_SESSION[$this->_config['namespace']], $_SESSION[$this->_config['namespace']][$key]))
{
return FALSE;
}
$_SESSION['__ci_vars'][$this->_config['namespace']][$key] = 'new';
return TRUE;
}
public function unmark_flash($key)
{
if (empty($_SESSION['__ci_vars']) || empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
{
return;
}
is_array($key) OR $key = array($key);
foreach ($key as $k)
{
if (isset($_SESSION['__ci_vars'][$this->_config['namespace']], $_SESSION['__ci_vars'][$this->_config['namespace']][$k]) && ! is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$k]))
{
unset($_SESSION['__ci_vars'][$this->_config['namespace']][$k]);
}
}
if (empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
{
unset($_SESSION['__ci_vars'][$this->_config['namespace']]);
}
if (empty($_SESSION['__ci_vars']))
{
unset($_SESSION['__ci_vars']);
}
}
public function get_flash_keys()
{
if ( ! isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$this->_config['namespace']]))
{
return array();
}
$keys = array();
foreach (array_keys($_SESSION['__ci_vars'][$this->_config['namespace']]) as $key)
{
is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$key]) OR $keys[] = $key;
}
return $keys;
}
public function sess_destory() {
unset($_SESSION[$this->_config['namespace']]);
if(empty($_SESSION))
{
session_destroy();
}
}
public function tempdata($key = NULL)
{
if (isset($key))
{
return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$this->_config['namespace']], $_SESSION['__ci_vars'][$this->_config['namespace']][$key], $_SESSION[$key]) && is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$key]))
? $_SESSION[$this->_config['namespace']][$key]
: NULL;
}
$tempdata = array();
if ( ! empty($_SESSION['__ci_vars']) && ! empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
{
foreach ($_SESSION['__ci_vars'][$this->_config['namespace']] as $key => &$value)
{
is_int($value) && $tempdata[$key] = $_SESSION[$this->_config['namespace']][$key];
}
}
return $tempdata;
}
public function unmark_temp($key)
{
if (empty($_SESSION['__ci_vars']) || empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
{
return;
}
is_array($key) OR $key = array($key);
foreach ($key as $k)
{
if (isset($_SESSION['__ci_vars'][$this->_config['namespace']], $_SESSION['__ci_vars'][$this->_config['namespace']][$k]) && is_int($_SESSION['__ci_vars'][$this->_config['namespace']][$k]))
{
unset($_SESSION['__ci_vars'][$this->_config['namespace']][$k]);
}
}
if (empty($_SESSION['__ci_vars'][$this->_config['namespace']]))
{
unset($_SESSION['__ci_vars'][$this->_config['namespace']]);
}
if (empty($_SESSION['__ci_vars']))
{
unset($_SESSION['__ci_vars']);
}
}
}