class SessionProxy_Backend_Default in Session Proxy 7
Default implementation relies on a custom storage engine.
Hierarchy
- class \SessionProxy_Backend_Base implements SessionProxy_Backend_Interface
- class \SessionProxy_Backend_Default
Expanded class hierarchy of SessionProxy_Backend_Default
File
- lib/
SessionProxy/ Backend/ Default.php, line 6
View source
class SessionProxy_Backend_Default extends SessionProxy_Backend_Base {
/**
* @var SessionProxy_Storage_Interface
*/
protected $storage;
/**
* Session write proxy that will allow us to disable session writing if
* we are master of the storage.
*/
public function writeProxy($sessionId, $serializedData) {
if ($this
->isWriteEnabled()) {
return $this->storage
->write($sessionId, $serializedData);
}
}
/**
* Session destroy will require us to update the current logged in user.
*/
public function destroyProxy($sessionId) {
$this->storage
->destroy($sessionId);
$this
->deleteCurrentSessionCookie();
$this
->refreshAfterSessionChange();
}
/**
* @var int
*/
protected $uid;
protected function getSessionUid() {
return $this->storage
->getSessionUid();
}
/**
* @var bool
*/
protected $doWrite = TRUE;
public function writeDisable() {
$this->doWrite = FALSE;
}
public function writeEnable() {
$this->doWrite = TRUE;
}
public function isWriteEnabled() {
return $this->doWrite;
}
public function handleHttps() {
return variable_get('https', FALSE);
}
protected function sessionSetHandlers() {
if (FALSE === session_set_save_handler(array(
$this->storage,
'open',
), array(
$this->storage,
'close',
), array(
$this->storage,
'read',
), array(
$this,
'writeProxy',
), array(
$this,
'destroyProxy',
), array(
$this->storage,
'gc',
))) {
throw new Exception(__METHOD__ . ': unable to register the session handler');
}
}
public function regenerate() {
global $user;
// FIXME: Default backend will erase current user at session read time.
// We need to get it out of there for good and avoid this ugly hack.
if ($user->uid) {
$account = $user;
}
if (!$this
->sessionIsEmpty()) {
$currentData = $_SESSION;
}
if ($this->started) {
$this
->destroy();
}
$this
->generateSessionIdentifier();
if (isset($currentData) && !empty($currentData)) {
$_SESSION = $currentData;
}
$this
->start();
// See comment above.
if (isset($account)) {
$user = $account;
}
if ($this->started) {
// Some PHP versions won't reset correctly the cookie.
$params = session_get_cookie_params();
$expire = $params['lifetime'] ? REQUEST_TIME + $params['lifetime'] : 0;
setcookie($this->sessionName, $this->sessionIdentifier, $expire, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
}
// On session regenerate, the storage UID is set to the one read during
// the first session read attempt: we need to advertise the backend that
// future session write will be linked to a new UID.
$this->storage
->setSessionUid($user->uid);
$this
->refreshAfterSessionChange();
}
public function destroy() {
session_destroy();
// PHP 5.2 bug: When session_destroy() is called, you need to reset
// session handlers, else PHP loose them. See
// http://php.net/manual/en/function.session-set-save-handler.php#22194
$this
->sessionSetHandlers();
$this
->deleteCurrentSessionCookie();
}
public function destroyAllForUser($uid) {
$this->storage
->destroyFor(array(
'uid',
$uid,
));
}
public function __construct(SessionProxy_Storage_Interface $storage) {
$this->storage = $storage;
$this
->sessionSetHandlers();
parent::__construct();
}
}