%PDF- %PDF-
| Direktori : /www/varak.net/losik.varak.net/vendor/nette/security/src/Bridges/SecurityHttp/ |
| Current File : //www/varak.net/losik.varak.net/vendor/nette/security/src/Bridges/SecurityHttp/SessionStorage.php |
<?php
/**
* This file is part of the Nette Framework (https://nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare(strict_types=1);
namespace Nette\Bridges\SecurityHttp;
use Nette;
use Nette\Http\Session;
use Nette\Http\SessionSection;
use Nette\Security\IIdentity;
/**
* Session storage for Nette\Security\User object.
*/
final class SessionStorage implements Nette\Security\UserStorage
{
use Nette\SmartObject;
/** @var string */
private $namespace = '';
/** @var Session */
private $sessionHandler;
/** @var SessionSection */
private $sessionSection;
/** @var ?int */
private $expireTime;
/** @var bool */
private $expireIdentity = false;
public function __construct(Session $sessionHandler)
{
$this->sessionHandler = $sessionHandler;
}
public function saveAuthentication(IIdentity $identity): void
{
$section = $this->getSessionSection();
$section->set('authenticated', true);
$section->set('reason', null);
$section->set('authTime', time()); // informative value
$section->set('identity', $identity);
$this->setupExpiration();
// Session Fixation defence
$this->sessionHandler->regenerateId();
}
public function clearAuthentication(bool $clearIdentity): void
{
$section = $this->getSessionSection();
$section->set('authenticated', false);
$section->set('reason', self::LOGOUT_MANUAL);
$section->set('authTime', null);
if ($clearIdentity === true) {
$section->set('identity', null);
}
// Session Fixation defence
$this->sessionHandler->regenerateId();
}
public function getState(): array
{
$section = $this->getSessionSection();
return $section
? [(bool) $section->get('authenticated'), $section->get('identity'), $section->get('reason')]
: [false, null, null];
}
public function setExpiration(?string $time, bool $clearIdentity = false): void
{
$this->expireTime = $time ? (int) Nette\Utils\DateTime::from($time)->format('U') : null;
$this->expireIdentity = $clearIdentity;
if ($this->sessionSection && $this->sessionSection->get('authenticated')) {
$this->setupExpiration();
}
}
private function setupExpiration(): void
{
$section = $this->sessionSection;
if ($this->expireTime) {
$section->set('expireTime', $this->expireTime);
$section->set('expireDelta', $this->expireTime - time());
} else {
$section->remove(['expireTime', 'expireDelta']);
}
$section->set('expireIdentity', $this->expireIdentity);
$section->setExpiration((string) $this->expireTime, 'foo'); // time check
}
/**
* Changes namespace; allows more users to share a session.
* @return static
*/
public function setNamespace(string $namespace)
{
if ($this->namespace !== $namespace) {
$this->namespace = $namespace;
$this->sessionSection = null;
}
return $this;
}
/**
* Returns current namespace.
*/
public function getNamespace(): string
{
return $this->namespace;
}
/**
* Returns and initializes $this->sessionSection.
*/
protected function getSessionSection(): ?SessionSection
{
if ($this->sessionSection !== null) {
return $this->sessionSection;
}
$this->sessionSection = $section = $this->sessionHandler->getSection('Nette.Http.UserStorage/' . $this->namespace);
if (!$section->get('identity') instanceof IIdentity || !is_bool($section->get('authenticated'))) {
$section->remove();
}
if ($section->get('authenticated') && $section->get('expireDelta') > 0) { // check time expiration
if ($section->get('expireTime') < time()) {
$section->set('reason', self::LOGOUT_INACTIVITY);
$section->set('authenticated', false);
if ($section->get('expireIdentity')) {
$section->remove('identity');
}
}
$section->set('expireTime', time() + $section->expireDelta); // sliding expiration
}
if (!$section->get('authenticated')) {
$section->remove(['expireTime', 'expireDelta', 'expireIdentity', 'authTime']);
}
return $this->sessionSection;
}
}