vendor/pimcore/pimcore/bundles/AdminBundle/Security/Event/LogoutListener.php line 72

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Bundle\AdminBundle\Security\Event;
  15. use Pimcore\Event\Admin\Login\LogoutEvent as PimcoreLogoutEvent;
  16. use Pimcore\Event\AdminEvents;
  17. use Pimcore\Model\Element\Editlock;
  18. use Pimcore\Model\User;
  19. use Pimcore\Tool\Session;
  20. use Psr\Log\LoggerAwareInterface;
  21. use Psr\Log\LoggerAwareTrait;
  22. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  23. use Symfony\Component\HttpFoundation\Cookie;
  24. use Symfony\Component\HttpFoundation\RedirectResponse;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface;
  28. use Symfony\Component\Routing\RouterInterface;
  29. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  30. use Symfony\Component\Security\Http\Event\LogoutEvent;
  31. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  32. /**
  33.  * Handle logout. This was originally implemented as LogoutHandler, but wasn't triggered as the token was empty at call
  34.  * time in LogoutListener::handle was called. As the logout success handler is always triggered it is now implemented as
  35.  * success handler.
  36.  *
  37.  *
  38.  * @internal
  39.  */
  40. class LogoutListener implements EventSubscriberInterfaceLoggerAwareInterface
  41. {
  42.     use LoggerAwareTrait;
  43.     public static function getSubscribedEvents(): array
  44.     {
  45.         return [
  46.             LogoutEvent::class => 'onLogout',
  47.         ];
  48.     }
  49.     /**
  50.      * @param TokenStorageInterface $tokenStorage
  51.      * @param RouterInterface $router
  52.      * @param EventDispatcherInterface $eventDispatcher
  53.      */
  54.     public function __construct(
  55.         protected TokenStorageInterface $tokenStorage,
  56.         protected RouterInterface $router,
  57.         protected EventDispatcherInterface $eventDispatcher
  58.     ) {
  59.     }
  60.     /**
  61.      * @param LogoutEvent $event
  62.      *
  63.      * @return RedirectResponse|Response
  64.      */
  65.     public function onLogout(LogoutEvent $event): RedirectResponse|Response
  66.     {
  67.         $request $event->getRequest();
  68.         return $this->onLogoutSuccess($request);
  69.     }
  70.     /**
  71.      * @param Request $request
  72.      *
  73.      * @return RedirectResponse|Response
  74.      */
  75.     public function onLogoutSuccess(Request $request): RedirectResponse|Response
  76.     {
  77.         $this->logger->debug('Logging out');
  78.         $this->tokenStorage->setToken(null);
  79.         // clear open edit locks for this session
  80.         Editlock::clearSession(Session::getSessionId());
  81.         /** @var PimcoreLogoutEvent|null $event */
  82.         $event Session::useSession(function (AttributeBagInterface $adminSession) use ($request) {
  83.             $event null;
  84.             $user $adminSession->get('user');
  85.             if ($user && $user instanceof User) {
  86.                 $event = new PimcoreLogoutEvent($request$user);
  87.                 $this->eventDispatcher->dispatch($eventAdminEvents::LOGIN_LOGOUT);
  88.                 $adminSession->remove('user');
  89.             }
  90.             Session::invalidate();
  91.             return $event;
  92.         });
  93.         if ($event && $event->hasResponse()) {
  94.             $response $event->getResponse();
  95.         } else {
  96.             $response = new RedirectResponse($this->router->generate('pimcore_admin_index'));
  97.         }
  98.         // cleanup pimcore-cookies => 315554400 => strtotime('1980-01-01')
  99.         $response->headers->setCookie(new Cookie('pimcore_opentabs'null315554400));
  100.         // clear cookie -> we can't use $response->headers->clearCookie() because it doesn't allow $secure = null
  101.         $response->headers->setCookie(new Cookie('pimcore_admin_sid'null1));
  102.         if ($response instanceof RedirectResponse) {
  103.             $this->logger->debug('Logout succeeded, redirecting to ' $response->getTargetUrl());
  104.         }
  105.         return $response;
  106.     }
  107. }