vendor/ibexa/page-builder/src/lib/Event/Subscriber/SetPreAuthCookieSubscriber.php line 68

Open in your IDE?
  1. <?php
  2. /**
  3. * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. */
  6. declare(strict_types=1);
  7. namespace Ibexa\PageBuilder\Event\Subscriber;
  8. use Ibexa\Core\MVC\Symfony\Security\UserInterface;
  9. use Ibexa\PageBuilder\Security\EditorialMode\TokenManager;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpFoundation\Cookie;
  12. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  13. use Symfony\Component\HttpKernel\KernelEvents;
  14. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  15. /**
  16. * @internal
  17. */
  18. class SetPreAuthCookieSubscriber implements EventSubscriberInterface
  19. {
  20. /** @var \Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface */
  21. private $tokenStorage;
  22. /** @var \Ibexa\PageBuilder\Security\EditorialMode\TokenManager */
  23. private $tokenManager;
  24. /** @var string */
  25. private $tokenCookieName;
  26. /** @var int */
  27. private $ttl;
  28. /** @var array<string, string> */
  29. private $routesMap;
  30. /** @var bool */
  31. private $enabled;
  32. public function __construct(
  33. TokenStorageInterface $tokenStorage,
  34. TokenManager $tokenManager,
  35. string $tokenCookieName,
  36. int $ttl,
  37. array $routesMap,
  38. bool $enabled
  39. ) {
  40. $this->tokenStorage = $tokenStorage;
  41. $this->tokenManager = $tokenManager;
  42. $this->tokenCookieName = $tokenCookieName;
  43. $this->ttl = $ttl;
  44. $this->routesMap = $routesMap;
  45. $this->enabled = $enabled;
  46. }
  47. /**
  48. * @return array<string, string>
  49. */
  50. public static function getSubscribedEvents(): array
  51. {
  52. return [
  53. KernelEvents::RESPONSE => 'onResponse',
  54. ];
  55. }
  56. public function onResponse(ResponseEvent $event): void
  57. {
  58. if (!$this->enabled) {
  59. return;
  60. }
  61. $request = $event->getRequest();
  62. $response = $event->getResponse();
  63. $route = $request->attributes->get('_route');
  64. if (!in_array($route, $this->routesMap, true)) {
  65. return;
  66. }
  67. $token = $this->tokenStorage->getToken();
  68. if ($token === null || !$token->getUser() instanceof UserInterface) {
  69. return;
  70. }
  71. $jwtToken = $this->tokenManager->create($token->getUser());
  72. $expire = new \DateTime();
  73. $expire->modify(sprintf('+%d seconds', $this->ttl));
  74. $response->headers->setCookie(
  75. new Cookie(
  76. $this->tokenCookieName,
  77. $jwtToken,
  78. $expire,
  79. '/',
  80. null,
  81. true,
  82. true,
  83. false,
  84. 'None'
  85. )
  86. );
  87. }
  88. }
  89. class_alias(SetPreAuthCookieSubscriber::class, 'EzSystems\EzPlatformPageBuilder\Event\Subscriber\SetPreAuthCookieSubscriber');