vendor/se7enxweb/legacy-bridge/bundle/LegacyMapper/Security.php line 120

Open in your IDE?
  1. <?php
  2. /**
  3. * @copyright Copyright (C) eZ Systems AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. */
  6. namespace eZ\Bundle\EzPublishLegacyBundle\LegacyMapper;
  7. use eZ\Publish\API\Repository\Repository;
  8. use eZ\Publish\Core\MVC\ConfigResolverInterface;
  9. use eZ\Publish\Core\MVC\Legacy\Event\PostBuildKernelEvent;
  10. use eZ\Publish\Core\MVC\Legacy\Event\PreBuildKernelWebHandlerEvent;
  11. use eZ\Publish\Core\MVC\Legacy\LegacyEvents;
  12. use ezpWebBasedKernelHandler;
  13. use eZUser;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  16. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  17. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  18. /**
  19. * This listener injects current user into legacy kernel once built.
  20. */
  21. class Security implements EventSubscriberInterface
  22. {
  23. /**
  24. * @var \eZ\Publish\API\Repository\Repository
  25. */
  26. private $repository;
  27. /**
  28. * @var \eZ\Publish\Core\MVC\ConfigResolverInterface
  29. */
  30. private $configResolver;
  31. /**
  32. * @var TokenStorageInterface
  33. */
  34. private $tokenStorage;
  35. /**
  36. * @var AuthorizationCheckerInterface
  37. */
  38. private $authChecker;
  39. private $enabled = true;
  40. public function __construct(Repository $repository, ConfigResolverInterface $configResolver, TokenStorageInterface $tokenStorage, AuthorizationCheckerInterface $authChecker)
  41. {
  42. $this->repository = $repository;
  43. $this->configResolver = $configResolver;
  44. $this->tokenStorage = $tokenStorage;
  45. $this->authChecker = $authChecker;
  46. }
  47. /**
  48. * Toggles the feature.
  49. *
  50. * @param bool $enabled
  51. */
  52. public function setEnabled($enabled)
  53. {
  54. $this->enabled = (bool)$enabled;
  55. }
  56. public static function getSubscribedEvents()
  57. {
  58. return [
  59. LegacyEvents::POST_BUILD_LEGACY_KERNEL => 'onKernelBuilt',
  60. LegacyEvents::PRE_BUILD_LEGACY_KERNEL_WEB => 'onLegacyKernelWebBuild',
  61. ];
  62. }
  63. /**
  64. * Performs actions related to security once the legacy kernel has been built.
  65. *
  66. * @param PostBuildKernelEvent $event
  67. */
  68. public function onKernelBuilt(PostBuildKernelEvent $event)
  69. {
  70. // Ignore if not in web context, if legacy_mode is active or if user is not authenticated
  71. if (
  72. $this->enabled === false
  73. || !$event->getKernelHandler() instanceof ezpWebBasedKernelHandler
  74. || $this->configResolver->getParameter('legacy_mode') === true
  75. || !$this->isUserAuthenticated()
  76. ) {
  77. return;
  78. }
  79. $userId = $this->repository->getPermissionResolver()->getCurrentUserReference()->getUserId();
  80. $event->getLegacyKernel()->runCallback(
  81. static function () use ($userId) {
  82. $legacyUser = eZUser::fetch($userId);
  83. eZUser::setCurrentlyLoggedInUser($legacyUser, $legacyUser->attribute('contentobject_id'), eZUser::NO_SESSION_REGENERATE);
  84. },
  85. false,
  86. false
  87. );
  88. }
  89. /**
  90. * @return bool
  91. */
  92. private function isUserAuthenticated()
  93. {
  94. // IS_AUTHENTICATED_FULLY inherits from IS_AUTHENTICATED_REMEMBERED.
  95. // User can be either authenticated by providing credentials during current session
  96. // or by "remember me" if available.
  97. return
  98. $this->tokenStorage->getToken() instanceof TokenInterface
  99. && $this->authChecker->isGranted('IS_AUTHENTICATED_REMEMBERED');
  100. }
  101. /**
  102. * Performs actions related to security before kernel build (mainly settings injection).
  103. *
  104. * @param PreBuildKernelWebHandlerEvent $event
  105. */
  106. public function onLegacyKernelWebBuild(PreBuildKernelWebHandlerEvent $event)
  107. {
  108. if ($this->configResolver->getParameter('legacy_mode') === true) {
  109. return;
  110. }
  111. $injectedMergeSettings = $event->getParameters()->get('injected-merge-settings', []);
  112. $accessRules = [
  113. 'access;disable',
  114. 'module;user/login',
  115. 'module;user/logout',
  116. ];
  117. // Merge existing settings with the new ones if needed.
  118. if (isset($injectedMergeSettings['site.ini/SiteAccessRules/Rules'])) {
  119. $accessRules = array_merge($injectedMergeSettings['site.ini/SiteAccessRules/Rules'], $accessRules);
  120. }
  121. $injectedMergeSettings['site.ini/SiteAccessRules/Rules'] = $accessRules;
  122. $event->getParameters()->set('injected-merge-settings', $injectedMergeSettings);
  123. }
  124. }