You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
3.8 KiB
167 lines
3.8 KiB
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Component\HttpFoundation\Session\Storage;
|
|
|
|
use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
|
|
|
|
/**
|
|
* Metadata container.
|
|
*
|
|
* Adds metadata to the session.
|
|
*
|
|
* @author Drak <drak@zikula.org>
|
|
*/
|
|
class MetadataBag implements SessionBagInterface
|
|
{
|
|
public const CREATED = 'c';
|
|
public const UPDATED = 'u';
|
|
public const LIFETIME = 'l';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $name = '__metadata';
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $storageKey;
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $meta = [self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0];
|
|
|
|
/**
|
|
* Unix timestamp.
|
|
*
|
|
* @var int
|
|
*/
|
|
private $lastUsed;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
private $updateThreshold;
|
|
|
|
/**
|
|
* @param string $storageKey The key used to store bag in the session
|
|
* @param int $updateThreshold The time to wait between two UPDATED updates
|
|
*/
|
|
public function __construct(string $storageKey = '_sf2_meta', int $updateThreshold = 0)
|
|
{
|
|
$this->storageKey = $storageKey;
|
|
$this->updateThreshold = $updateThreshold;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function initialize(array &$array)
|
|
{
|
|
$this->meta = &$array;
|
|
|
|
if (isset($array[self::CREATED])) {
|
|
$this->lastUsed = $this->meta[self::UPDATED];
|
|
|
|
$timeStamp = time();
|
|
if ($timeStamp - $array[self::UPDATED] >= $this->updateThreshold) {
|
|
$this->meta[self::UPDATED] = $timeStamp;
|
|
}
|
|
} else {
|
|
$this->stampCreated();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets the lifetime that the session cookie was set with.
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getLifetime()
|
|
{
|
|
return $this->meta[self::LIFETIME];
|
|
}
|
|
|
|
/**
|
|
* Stamps a new session's metadata.
|
|
*
|
|
* @param int $lifetime Sets the cookie lifetime for the session cookie. A null value
|
|
* will leave the system settings unchanged, 0 sets the cookie
|
|
* to expire with browser session. Time is in seconds, and is
|
|
* not a Unix timestamp.
|
|
*/
|
|
public function stampNew(int $lifetime = null)
|
|
{
|
|
$this->stampCreated($lifetime);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function getStorageKey()
|
|
{
|
|
return $this->storageKey;
|
|
}
|
|
|
|
/**
|
|
* Gets the created timestamp metadata.
|
|
*
|
|
* @return int Unix timestamp
|
|
*/
|
|
public function getCreated()
|
|
{
|
|
return $this->meta[self::CREATED];
|
|
}
|
|
|
|
/**
|
|
* Gets the last used metadata.
|
|
*
|
|
* @return int Unix timestamp
|
|
*/
|
|
public function getLastUsed()
|
|
{
|
|
return $this->lastUsed;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function clear()
|
|
{
|
|
// nothing to do
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function getName()
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
/**
|
|
* Sets name.
|
|
*/
|
|
public function setName(string $name)
|
|
{
|
|
$this->name = $name;
|
|
}
|
|
|
|
private function stampCreated(int $lifetime = null): void
|
|
{
|
|
$timeStamp = time();
|
|
$this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp;
|
|
$this->meta[self::LIFETIME] = $lifetime ?? (int) ini_get('session.cookie_lifetime');
|
|
}
|
|
}
|
|
|