X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FSession.php;h=57939665f424113bdca304c9484f20885b2c403b;hb=d8c1f86a82922cc8accf1b6e3f5d2b8f62efab3d;hp=7ca6a46ead2587973f289598fc769743869e9f17;hpb=c19426b6cd66fabbb6256dd4b229dba00101111c;p=civicrm-core.git diff --git a/CRM/Core/Session.php b/CRM/Core/Session.php index 7ca6a46ead..57939665f4 100644 --- a/CRM/Core/Session.php +++ b/CRM/Core/Session.php @@ -41,13 +41,6 @@ class CRM_Core_Session { */ protected $_session = NULL; - /** - * Current php Session ID : needed to detect if the session is changed - * - * @var string - */ - protected $sessionID; - /** * We only need one instance of this object. So we use the singleton * pattern and cache the instance in this variable @@ -86,6 +79,39 @@ class CRM_Core_Session { return self::$_singleton; } + /** + * Replace the session object with a fake session. + */ + public static function useFakeSession() { + self::$_singleton = new class() extends CRM_Core_Session { + + public function initialize($isRead = FALSE) { + if ($isRead) { + return; + } + + if (!isset($this->_session)) { + $this->_session = []; + } + + if (!isset($this->_session[$this->_key]) || !is_array($this->_session[$this->_key])) { + $this->_session[$this->_key] = []; + } + } + + public function isEmpty() { + return empty($this->_session); + } + + }; + self::$_singleton->_session = NULL; + // This is not a revocable proposition. Should survive, even with things 'System.flush'. + if (!defined('_CIVICRM_FAKE_SESSION')) { + define('_CIVICRM_FAKE_SESSION', TRUE); + } + return self::$_singleton; + } + /** * Creates an array in the session. * @@ -95,10 +121,9 @@ class CRM_Core_Session { * Is this a read operation, in this case, the session will not be touched. */ public function initialize($isRead = FALSE) { - // remove $_SESSION reference if session is changed - if (($sid = session_id()) !== $this->sessionID) { - $this->_session = NULL; - $this->sessionID = $sid; + // reset $this->_session in case if it is no longer a reference to $_SESSION; + if (isset($_SESSION) && isset($this->_session) && $_SESSION !== $this->_session) { + unset($this->_session); } // lets initialize the _session variable just before we need it // hopefully any bootstrapping code will actually load the session from the CMS @@ -138,9 +163,9 @@ class CRM_Core_Session { unset($this->_session[$this->_key]); } else { - $this->_session = []; + $this->_session[$this->_key] = []; + unset($this->_session); } - } /** @@ -530,7 +555,7 @@ class CRM_Core_Session { if (!is_numeric($session->get('userID'))) { return NULL; } - return $session->get('userID'); + return (int) $session->get('userID'); } /**