vendor/dachcom-digital/members/src/MembersBundle/EventListener/ForbiddenRouteListener.php line 43

Open in your IDE?
  1. <?php
  2. namespace MembersBundle\EventListener;
  3. use MembersBundle\Event\StaticRouteEvent;
  4. use MembersBundle\Manager\RestrictionManager;
  5. use MembersBundle\Manager\RestrictionManagerInterface;
  6. use MembersBundle\MembersEvents;
  7. use MembersBundle\Restriction\ElementRestriction;
  8. use Pimcore\Bundle\CoreBundle\EventListener\Traits\PimcoreContextAwareTrait;
  9. use Pimcore\Http\RequestHelper;
  10. use Pimcore\Model\DataObject;
  11. use Pimcore\Http\Request\Resolver\PimcoreContextResolver;
  12. use Symfony\Cmf\Bundle\RoutingBundle\Routing\DynamicRouter;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. use Symfony\Component\HttpKernel\Event\RequestEvent;
  16. use Symfony\Component\HttpKernel\KernelEvents;
  17. use Symfony\Component\Routing\RouterInterface;
  18. class ForbiddenRouteListener implements EventSubscriberInterface
  19. {
  20.     use PimcoreContextAwareTrait;
  21.     protected RestrictionManagerInterface $restrictionManager;
  22.     protected RouterInterface $router;
  23.     protected RequestHelper $requestHelper;
  24.     public function __construct(RestrictionManagerInterface $restrictionManagerRouterInterface $routerRequestHelper $requestHelper)
  25.     {
  26.         $this->restrictionManager $restrictionManager;
  27.         $this->router $router;
  28.         $this->requestHelper $requestHelper;
  29.     }
  30.     public static function getSubscribedEvents(): array
  31.     {
  32.         return [
  33.             KernelEvents::REQUEST => ['onKernelRequest'//before head meta listener
  34.         ];
  35.     }
  36.     public function onKernelRequest(RequestEvent $event): void
  37.     {
  38.         $restriction null;
  39.         if (!$event->isMainRequest()) {
  40.             return;
  41.         }
  42.         if (!$this->requestHelper->isFrontendRequest($event->getRequest())) {
  43.             return;
  44.         }
  45.         if (!$this->matchesPimcoreContext($event->getRequest(), PimcoreContextResolver::CONTEXT_DEFAULT)) {
  46.             return;
  47.         }
  48.         if (str_starts_with($event->getRequest()->attributes->get('_route'), 'document_')) {
  49.             $document $event->getRequest()->get(DynamicRouter::CONTENT_KEYnull);
  50.             $restriction $this->restrictionManager->getElementRestrictionStatus($document);
  51.         } elseif ($event->getRequest()->attributes->get('pimcore_request_source') === 'staticroute') {
  52.             $routeEvent = new StaticRouteEvent($event->getRequest(), $event->getRequest()->attributes->get('_route'));
  53.             \Pimcore::getEventDispatcher()->dispatch($routeEventMembersEvents::RESTRICTION_CHECK_STATICROUTE);
  54.             $restrictionObject $routeEvent->getStaticRouteObject();
  55.             if ($restrictionObject instanceof DataObject) {
  56.                 $restriction $this->restrictionManager->getElementRestrictionStatus($restrictionObject);
  57.             }
  58.         }
  59.         if ($restriction === null) {
  60.             return;
  61.         }
  62.         $event->getRequest()->attributes->set(RestrictionManager::REQUEST_RESTRICTION_STORAGE$restriction);
  63.         $restrictionRoute $this->getRouteForRestriction($restriction);
  64.         if ($restrictionRoute !== false) {
  65.             $parameters $restrictionRoute === 'members_user_security_login' ? ['_target_path' => $event->getRequest()->getPathInfo()] : [];
  66.             $response = new RedirectResponse($this->router->generate($restrictionRoute$parameters));
  67.             $event->setResponse($response);
  68.         }
  69.     }
  70.     private function getRouteForRestriction(ElementRestriction $elementRestriction): bool|string
  71.     {
  72.         if ($elementRestriction->getSection() === RestrictionManager::RESTRICTION_SECTION_ALLOWED) {
  73.             //section allowed
  74.             return false;
  75.         }
  76.         if ($elementRestriction->getState() === RestrictionManager::RESTRICTION_STATE_NOT_LOGGED_IN && $elementRestriction->getSection() === RestrictionManager::RESTRICTION_SECTION_NOT_ALLOWED) {
  77.             //not allowed
  78.             return 'members_user_security_login';
  79.         }
  80.         if ($elementRestriction->getState() === RestrictionManager::RESTRICTION_STATE_LOGGED_IN && $elementRestriction->getSection() === RestrictionManager::RESTRICTION_SECTION_NOT_ALLOWED) {
  81.             //logged in but not allowed.
  82.             return 'members_user_restriction_refused';
  83.         }
  84.         return false;
  85.     }
  86. }