28 #require_once 'Zend/Session/Abstract.php'; 33 #require_once 'Zend/Session/Namespace.php'; 38 #require_once 'Zend/Session/SaveHandler/Interface.php'; 71 private static $_sessionStarted =
false;
83 private static $_regenerateIdState = 0;
93 private static $_defaultOptions = array(
96 'save_handler' =>
null,
98 'gc_probability' =>
null,
100 'gc_maxlifetime' =>
null,
101 'serialize_handler' =>
null,
102 'cookie_lifetime' =>
null,
103 'cookie_path' =>
null,
104 'cookie_domain' =>
null,
105 'cookie_secure' =>
null,
106 'cookie_httponly' =>
null,
107 'use_cookies' =>
null,
108 'use_only_cookies' =>
'on',
109 'referer_check' =>
null,
110 'entropy_file' =>
null,
111 'entropy_length' =>
null,
112 'cache_limiter' =>
null,
113 'cache_expire' =>
null,
114 'use_trans_sid' =>
null,
115 'bug_compat_42' =>
null,
116 'bug_compat_warn' =>
null,
117 'hash_function' =>
null,
118 'hash_bits_per_character' =>
null 128 private static $_localOptions = array(
129 'strict' =>
'_strict',
130 'remember_me_seconds' =>
'_rememberMeSeconds',
131 'throw_startup_exceptions' =>
'_throwStartupExceptions' 139 private static $_writeClosed =
false;
146 private static $_sessionCookieDeleted =
false;
153 private static $_destroyed =
false;
160 private static $_strict =
false;
167 private static $_rememberMeSeconds = 1209600;
174 private static $_defaultOptionsSet =
false;
181 private static $_saveHandler =
null;
199 public static function setOptions(array $userOptions = array())
202 if (!self::$_defaultOptionsSet) {
203 foreach (self::$_defaultOptions as $defaultOptionName => $defaultOptionValue) {
204 if (isset(self::$_defaultOptions[$defaultOptionName])) {
205 ini_set(
"session.$defaultOptionName", $defaultOptionValue);
209 self::$_defaultOptionsSet =
true;
213 foreach ($userOptions as $userOptionName => $userOptionValue) {
215 $userOptionName = strtolower($userOptionName);
218 if (array_key_exists($userOptionName, self::$_defaultOptions)) {
219 ini_set(
"session.$userOptionName", $userOptionValue);
221 elseif (isset(self::$_localOptions[$userOptionName])) {
222 self::${self::$_localOptions[$userOptionName]} = $userOptionValue;
226 #require_once 'Zend/Session/Exception.php'; 241 foreach (ini_get_all(
'session') as $sysOptionName => $sysOptionValues) {
242 $options[substr($sysOptionName, 8)] = $sysOptionValues[
'local_value'];
244 foreach (self::$_localOptions as $localOptionName => $localOptionMemberName) {
245 $options[$localOptionName] =
self::${$localOptionMemberName};
249 if (array_key_exists($optionName,
$options)) {
267 self::$_saveHandler = $saveHandler;
269 if (self::$_unitTestEnabled) {
274 array(&$saveHandler,
'open'),
275 array(&$saveHandler,
'close'),
276 array(&$saveHandler,
'read'),
277 array(&$saveHandler,
'write'),
278 array(&$saveHandler,
'destroy'),
279 array(&$saveHandler,
'gc')
295 return self::$_saveHandler;
309 if (!self::$_unitTestEnabled &&
headers_sent($filename, $linenum)) {
311 #require_once 'Zend/Session/Exception.php'; 313 "() before any output has been sent to the browser; output started in {$filename}/{$linenum}");
316 if ( !self::$_sessionStarted ) {
317 self::$_regenerateIdState = -1;
319 if (!self::$_unitTestEnabled) {
322 self::$_regenerateIdState = 1;
337 $seconds = (int) $seconds;
338 $seconds = ($seconds > 0) ? $seconds : self::$_rememberMeSeconds;
365 if (self::$_unitTestEnabled) {
370 $cookieParams = session_get_cookie_params();
372 session_set_cookie_params(
374 $cookieParams[
'path'],
375 $cookieParams[
'domain'],
376 $cookieParams[
'secure']
391 if ((
bool)
ini_get(
'session.use_cookies') ==
true && isset($_COOKIE[session_name()])) {
393 }
elseif ((
bool)
ini_get(
'session.use_only_cookies') ==
false && isset($_REQUEST[session_name()])) {
395 }
elseif (self::$_unitTestEnabled) {
410 return self::$_destroyed;
424 if ( self::getId() && !self::_checkId(self::getId()) ) {
428 self::$_regenerateIdState = -1;
431 if (self::$_sessionStarted && self::$_destroyed) {
432 #require_once 'Zend/Session/Exception.php'; 433 throw new Zend_Session_Exception(
'The session was explicitly destroyed during this request, attempting to re-start is not allowed.');
436 if (self::$_sessionStarted) {
441 if (!self::$_defaultOptionsSet) {
446 if (self::$_strict &&
$options ===
true) {
448 #require_once 'Zend/Session/Exception.php'; 449 throw new Zend_Session_Exception(
'You must explicitly start the session with Zend_Session::start() when session options are set to strict.');
452 $filename = $linenum =
null;
453 if (!self::$_unitTestEnabled &&
headers_sent($filename, $linenum)) {
455 #require_once 'Zend/Session/Exception.php'; 456 throw new Zend_Session_Exception(
"Session must be started before any output has been sent to the browser;" 457 .
" output started in {$filename}/{$linenum}");
461 if (!self::$_unitTestEnabled && defined(
'SID')) {
463 #require_once 'Zend/Session/Exception.php'; 464 throw new Zend_Session_Exception(
'session has already been started by session.auto-start or session_start()');
472 $errorLevel = (is_int(self::$_throwStartupExceptions)) ? self::$_throwStartupExceptions : E_ALL;
475 if (!self::$_unitTestEnabled) {
477 if (self::$_throwStartupExceptions) {
478 #require_once 'Zend/Session/Exception.php'; 479 set_error_handler(array(
'Zend_Session_Exception',
'handleSessionStartError'), $errorLevel);
482 $startedCleanly = session_start();
484 if (self::$_throwStartupExceptions) {
485 restore_error_handler();
489 if (self::$_throwStartupExceptions) {
490 set_error_handler(array(
'Zend_Session_Exception',
'handleSilentWriteClose'), $errorLevel);
492 session_write_close();
493 if (self::$_throwStartupExceptions) {
494 restore_error_handler();
500 parent::$_readable =
true;
501 parent::$_writable =
true;
502 self::$_sessionStarted =
true;
503 if (self::$_regenerateIdState === -1) {
508 if (isset($_SESSION[
'__ZF'][
'VALID'])) {
509 self::_processValidators();
512 self::_processStartupMetadataGlobal();
523 $saveHandler =
ini_get(
'session.save_handler');
524 if ($saveHandler ==
'cluster') {
525 $dashPos = strrpos(
$id,
'-');
527 $id = substr(
$id, $dashPos + 1);
531 $hashBitsPerChar =
ini_get(
'session.hash_bits_per_character');
532 if (!$hashBitsPerChar) {
533 $hashBitsPerChar = 5;
535 switch($hashBitsPerChar) {
536 case 4:
$pattern =
'^[0-9a-f]*$';
break;
537 case 5:
$pattern =
'^[0-9a-v]*$';
break;
538 case 6:
$pattern =
'^[0-9a-zA-Z-,]*$';
break;
550 private static function _processStartupMetadataGlobal()
553 if (isset($_SESSION[
'__ZF'])) {
556 foreach ($_SESSION[
'__ZF'] as $namespace => $namespace_metadata) {
559 if (isset($namespace_metadata[
'ENT']) && ($namespace_metadata[
'ENT'] > 0) && (
time() > $namespace_metadata[
'ENT']) ) {
560 unset($_SESSION[$namespace]);
561 unset($_SESSION[
'__ZF'][$namespace]);
565 if (isset($_SESSION[
'__ZF'][$namespace]) && isset($namespace_metadata[
'ENGH']) && $namespace_metadata[
'ENGH'] >= 1) {
567 $_SESSION[
'__ZF'][$namespace][
'ENGH']--;
569 if ($_SESSION[
'__ZF'][$namespace][
'ENGH'] === 0) {
570 if (isset($_SESSION[$namespace])) {
571 parent::$_expiringData[$namespace] = $_SESSION[$namespace];
572 unset($_SESSION[$namespace]);
574 unset($_SESSION[
'__ZF'][$namespace]);
579 if (isset($namespace_metadata[
'ENVT'])) {
580 foreach ($namespace_metadata[
'ENVT'] as
$variable => $time) {
581 if (
time() > $time) {
583 unset($_SESSION[
'__ZF'][$namespace][
'ENVT'][
$variable]);
586 if (empty($_SESSION[
'__ZF'][$namespace][
'ENVT'])) {
587 unset($_SESSION[
'__ZF'][$namespace][
'ENVT']);
592 if (isset($namespace_metadata[
'ENVGH'])) {
593 foreach ($namespace_metadata[
'ENVGH'] as
$variable => $hops) {
594 $_SESSION[
'__ZF'][$namespace][
'ENVGH'][
$variable]--;
596 if ($_SESSION[
'__ZF'][$namespace][
'ENVGH'][
$variable] === 0) {
597 if (isset($_SESSION[$namespace][
$variable])) {
601 unset($_SESSION[
'__ZF'][$namespace][
'ENVGH'][
$variable]);
604 if (empty($_SESSION[
'__ZF'][$namespace][
'ENVGH'])) {
605 unset($_SESSION[
'__ZF'][$namespace][
'ENVGH']);
609 if (isset($namespace) && empty($_SESSION[
'__ZF'][$namespace])) {
610 unset($_SESSION[
'__ZF'][$namespace]);
615 if (isset($_SESSION[
'__ZF']) && empty($_SESSION[
'__ZF'])) {
616 unset($_SESSION[
'__ZF']);
628 return self::$_sessionStarted;
640 return ( (self::$_regenerateIdState > 0) ?
true :
false );
664 if (!self::$_unitTestEnabled && defined(
'SID')) {
666 #require_once 'Zend/Session/Exception.php'; 667 throw new Zend_Session_Exception(
'The session has already been started. The session id must be set first.');
670 if (!self::$_unitTestEnabled &&
headers_sent($filename, $linenum)) {
672 #require_once 'Zend/Session/Exception.php'; 674 "() before any output has been sent to the browser; output started in {$filename}/{$linenum}");
677 if (!is_string(
$id) ||
$id ===
'') {
679 #require_once 'Zend/Session/Exception.php'; 707 parent::$_writable =
false;
720 if (self::$_unitTestEnabled) {
724 if (self::$_writeClosed) {
729 parent::$_writable =
false;
732 session_write_close();
733 self::$_writeClosed =
true;
744 public static function destroy($remove_cookie =
true, $readonly =
true)
746 if (self::$_unitTestEnabled) {
750 if (self::$_destroyed) {
755 parent::$_writable =
false;
759 self::$_destroyed =
true;
761 if ($remove_cookie) {
774 if (self::$_unitTestEnabled) {
778 if (self::$_sessionCookieDeleted) {
782 self::$_sessionCookieDeleted =
true;
784 if (isset($_COOKIE[session_name()])) {
785 $cookie_params = session_get_cookie_params();
791 $cookie_params[
'path'],
792 $cookie_params[
'domain'],
793 $cookie_params[
'secure']
805 private static function _processValidators()
807 foreach ($_SESSION[
'__ZF'][
'VALID'] as $validator_name => $valid_data) {
809 #require_once 'Zend/Loader.php'; 812 $validator =
new $validator_name;
813 if ($validator->validate() ===
false) {
815 #require_once 'Zend/Session/Validator/Exception.php'; 830 return parent::_namespaceIsset($namespace);
843 parent::_namespaceUnset($namespace);
857 return parent::_namespaceGetAll($namespace);
870 if (parent::$_readable ===
false) {
872 #require_once 'Zend/Session/Exception.php'; 877 if (isset($_SESSION)) {
878 $spaces = array_keys($_SESSION);
879 foreach($spaces as $key => $space) {
880 if (!strncmp($space,
'__', 2) || !is_array($_SESSION[$space])) {
881 unset($spaces[$key]);
886 return new ArrayObject(array_merge($spaces, array_keys(parent::$_expiringData)));
897 return parent::$_writable;
908 return parent::$_readable;
static setSaveHandler(Zend_Session_SaveHandler_Interface $saveHandler)
static rememberUntil($seconds=0)
static $_throwStartupExceptions
static namespaceGet($namespace)
static registerValidator(Zend_Session_Validator_Interface $validator)
ini_set($varName, $newValue)
session_set_save_handler()
elseif(isset( $params[ 'redirect_parent']))
static loadClass($class, $dirs=null)
static writeClose($readonly=true)
static expireSessionCookie()
static namespaceIsset($namespace)
setcookie($name, $value, $expiry, $path, $domain, $secure, $httpOnly)
static rememberMe($seconds=null)
static getOptions($optionName=null)
static start($options=false)
session_regenerate_id($var)
static setOptions(array $userOptions=array())
static destroy($remove_cookie=true, $readonly=true)
static $sessionStartError
static namespaceUnset($namespace)
static resetSingleInstance($namespaceName=null)