input = Input::instance(); if (Session::$instance === NULL) { Session::$config = Kohana::config('session'); Session::$protect = array_combine(Session::$protect, Session::$protect); ini_set('session.gc_probability', (int) Session::$config['gc_probability']); ini_set('session.gc_divisor', 100); ini_set('session.gc_maxlifetime', (Session::$config['expiration'] == 0) ? 86400 : Session::$config['expiration']); $this->create(); if (Session::$config['regenerate'] > 0 AND ($_SESSION['total_hits'] % Session::$config['regenerate']) === 0) { $this->regenerate(); } else { cookie::set(Session::$config['name'], $_SESSION['session_id'], Session::$config['expiration']); } Event::add('system.send_headers', array($this, 'write_close')); register_shutdown_function(array($this, 'write_close')); Session::$instance = $this; } Kohana::log('debug', 'Session Library initialized'); } public function id() { return $_SESSION['session_id']; } public function create($vars = NULL) { $this->destroy(); if (Session::$config['driver'] !== 'native') { $driver = 'Session_'.ucfirst(Session::$config['driver']).'_Driver'; if ( ! Kohana::auto_load($driver)) throw new Kohana_Exception('core.driver_not_found', Session::$config['driver'], get_class($this)); Session::$driver = new $driver(); if ( ! (Session::$driver instanceof Session_Driver)) throw new Kohana_Exception('core.driver_implements', Session::$config['driver'], get_class($this), 'Session_Driver'); session_set_save_handler ( array(Session::$driver, 'open'), array(Session::$driver, 'close'), array(Session::$driver, 'read'), array(Session::$driver, 'write'), array(Session::$driver, 'destroy'), array(Session::$driver, 'gc') ); } if ( ! preg_match('~^(?=.*[a-z])[a-z0-9_]++$~iD', Session::$config['name'])) throw new Kohana_Exception('session.invalid_session_name', Session::$config['name']); session_name(Session::$config['name']); session_set_cookie_params ( Session::$config['expiration'], Kohana::config('cookie.path'), Kohana::config('cookie.domain'), Kohana::config('cookie.secure'), Kohana::config('cookie.httponly') ); session_start(); $_SESSION['session_id'] = session_id(); if ( ! isset($_SESSION['_kf_flash_'])) { $_SESSION['total_hits'] = 0; $_SESSION['_kf_flash_'] = array(); $_SESSION['user_agent'] = Kohana::$user_agent; $_SESSION['ip_address'] = $this->input->ip_address(); } Session::$flash =& $_SESSION['_kf_flash_']; $_SESSION['total_hits'] += 1; if ($_SESSION['total_hits'] > 1) { foreach (Session::$config['validate'] as $valid) { switch ($valid) { case 'user_agent': if ($_SESSION[$valid] !== Kohana::$user_agent) return $this->create(); break; case 'ip_address': if ($_SESSION[$valid] !== $this->input->$valid()) return $this->create(); break; case 'expiration': if (time() - $_SESSION['last_activity'] > ini_get('session.gc_maxlifetime')) return $this->create(); break; } } } $this->expire_flash(); $_SESSION['last_activity'] = time(); Session::set($vars); } public function regenerate() { if (Session::$config['driver'] === 'native') { session_regenerate_id(TRUE); $_SESSION['session_id'] = session_id(); } else { $_SESSION['session_id'] = Session::$driver->regenerate(); } $name = session_name(); if (isset($_COOKIE[$name])) { $_COOKIE[$name] = $_SESSION['session_id']; } } public function destroy() { if (session_id() !== '') { $name = session_name(); session_destroy(); $_SESSION = array(); cookie::delete($name); } } public function write_close() { static $run; if ($run === NULL) { $run = TRUE; Event::run('system.session_write'); $this->expire_flash(); session_write_close(); } } public function set($keys, $val = FALSE) { if (empty($keys)) return FALSE; if ( ! is_array($keys)) { $keys = array($keys => $val); } foreach ($keys as $key => $val) { if (isset(Session::$protect[$key])) continue; $_SESSION[$key] = $val; } } public function set_flash($keys, $val = FALSE) { if (empty($keys)) return FALSE; if ( ! is_array($keys)) { $keys = array($keys => $val); } foreach ($keys as $key => $val) { if ($key == FALSE) continue; Session::$flash[$key] = 'new'; Session::set($key, $val); } } public function keep_flash($keys = NULL) { $keys = ($keys === NULL) ? array_keys(Session::$flash) : func_get_args(); foreach ($keys as $key) { if (isset(Session::$flash[$key])) { Session::$flash[$key] = 'new'; } } } public function expire_flash() { static $run; if ($run === TRUE) return; if ( ! empty(Session::$flash)) { foreach (Session::$flash as $key => $state) { if ($state === 'old') { unset(Session::$flash[$key], $_SESSION[$key]); } else { Session::$flash[$key] = 'old'; } } } $run = TRUE; } public function get($key = FALSE, $default = FALSE) { if (empty($key)) return $_SESSION; $result = isset($_SESSION[$key]) ? $_SESSION[$key] : Kohana::key_string($_SESSION, $key); return ($result === NULL) ? $default : $result; } public function get_once($key, $default = FALSE) { $return = Session::get($key, $default); Session::delete($key); return $return; } public function delete($keys) { $args = func_get_args(); foreach ($args as $key) { if (isset(Session::$protect[$key])) continue; unset($_SESSION[$key]); } } }