<?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <[email protected]> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\Security\Core\Authentication\Token\Storage;use Psr\Container\ContainerInterface;use Symfony\Component\HttpFoundation\RequestStack;use Symfony\Component\HttpFoundation\Session\SessionInterface;use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;use Symfony\Contracts\Service\ServiceSubscriberInterface;/** * A token storage that increments the session usage index when the token is accessed. * * @author Nicolas Grekas <[email protected]> */final class UsageTrackingTokenStorage implements TokenStorageInterface, ServiceSubscriberInterface{    private $storage;    private $container;    private $enableUsageTracking = false;    public function __construct(TokenStorageInterface $storage, ContainerInterface $container)    {        $this->storage = $storage;        $this->container = $container;    }    /**     * {@inheritdoc}     */    public function getToken(): ?TokenInterface    {        if ($this->shouldTrackUsage()) {            // increments the internal session usage index            $this->getSession()->getMetadataBag();        }        return $this->storage->getToken();    }    /**     * {@inheritdoc}     */    public function setToken(?TokenInterface $token = null): void    {        $this->storage->setToken($token);        if ($token && $this->shouldTrackUsage()) {            // increments the internal session usage index            $this->getSession()->getMetadataBag();        }    }    public function enableUsageTracking(): void    {        $this->enableUsageTracking = true;    }    public function disableUsageTracking(): void    {        $this->enableUsageTracking = false;    }    public static function getSubscribedServices(): array    {        return [            'request_stack' => RequestStack::class,        ];    }    private function getSession(): SessionInterface    {        // BC for symfony/security-bundle < 5.3        if ($this->container->has('session')) {            trigger_deprecation('symfony/security-core', '5.3', 'Injecting the "session" in "%s" is deprecated, inject the "request_stack" instead.', __CLASS__);            return $this->container->get('session');        }        return $this->container->get('request_stack')->getSession();    }    private function shouldTrackUsage(): bool    {        if (!$this->enableUsageTracking) {            return false;        }        // BC for symfony/security-bundle < 5.3        if ($this->container->has('session')) {            return true;        }        if (!$this->container->get('request_stack')->getMainRequest()) {            return false;        }        return true;    }}