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

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\AbstractObject;
  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\KernelEvents;
  16. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  17. use Symfony\Component\Routing\RouterInterface;
  18. class ForbiddenRouteListener implements EventSubscriberInterface
  19. {
  20.     use PimcoreContextAwareTrait;
  21.     /**
  22.      * @var RestrictionManagerInterface
  23.      */
  24.     protected $restrictionManager;
  25.     /**
  26.      * @var RouterInterface
  27.      */
  28.     protected $router;
  29.     /**
  30.      * @var RequestHelper
  31.      */
  32.     private $requestHelper;
  33.     /**
  34.      * ForbiddenRouteListener constructor.
  35.      *
  36.      * @param RestrictionManagerInterface $restrictionManager
  37.      * @param RouterInterface             $router
  38.      * @param RequestHelper               $requestHelper
  39.      */
  40.     public function __construct(RestrictionManagerInterface $restrictionManagerRouterInterface $routerRequestHelper $requestHelper)
  41.     {
  42.         $this->restrictionManager $restrictionManager;
  43.         $this->router $router;
  44.         $this->requestHelper $requestHelper;
  45.     }
  46.     /**
  47.      * @return array
  48.      */
  49.     public static function getSubscribedEvents()
  50.     {
  51.         return [
  52.             KernelEvents::REQUEST => ['onKernelRequest'//before head meta listener
  53.         ];
  54.     }
  55.     /**
  56.      * @param GetResponseEvent $event
  57.      */
  58.     public function onKernelRequest(GetResponseEvent $event)
  59.     {
  60.         if (!$event->isMasterRequest()) {
  61.             return;
  62.         }
  63.         if (!$this->requestHelper->isFrontendRequest($event->getRequest())) {
  64.             return;
  65.         }
  66.         if (!$this->matchesPimcoreContext($event->getRequest(), PimcoreContextResolver::CONTEXT_DEFAULT)) {
  67.             return;
  68.         }
  69.         $restriction false;
  70.         if (strpos($event->getRequest()->attributes->get('_route'), 'document_') !== false) {
  71.             $document $event->getRequest()->get(DynamicRouter::CONTENT_KEYnull);
  72.             $restriction $this->restrictionManager->getElementRestrictionStatus($document);
  73.         } elseif ($event->getRequest()->attributes->get('pimcore_request_source') === 'staticroute') {
  74.             $routeEvent = new StaticRouteEvent($event->getRequest(), $event->getRequest()->attributes->get('_route'));
  75.             \Pimcore::getEventDispatcher()->dispatch(
  76.                 MembersEvents::RESTRICTION_CHECK_STATICROUTE,
  77.                 $routeEvent
  78.             );
  79.             $restrictionObject $routeEvent->getStaticRouteObject();
  80.             if ($restrictionObject instanceof AbstractObject) {
  81.                 $restriction $this->restrictionManager->getElementRestrictionStatus($restrictionObject);
  82.             }
  83.         }
  84.         if ($restriction !== false) {
  85.             $event->getRequest()->attributes->set(RestrictionManager::REQUEST_RESTRICTION_STORAGE$restriction);
  86.             $restrictionRoute $this->getRouteForRestriction($restriction);
  87.             if ($restrictionRoute !== false) {
  88.                 $parameters $restrictionRoute === 'members_user_security_login' ? ['_target_path' => $event->getRequest()->getUri()] : [];
  89.                 $response = new RedirectResponse($this->router->generate($restrictionRoute$parameters));
  90.                 $event->setResponse($response);
  91.             }
  92.         }
  93.     }
  94.     /**
  95.      * @param ElementRestriction $elementRestriction
  96.      *
  97.      * @return bool|string
  98.      */
  99.     private function getRouteForRestriction(ElementRestriction $elementRestriction)
  100.     {
  101.         if ($elementRestriction->getSection() == RestrictionManager::RESTRICTION_SECTION_ALLOWED) {
  102.             //section allowed
  103.             return false;
  104.         } elseif ($elementRestriction->getState() === RestrictionManager::RESTRICTION_STATE_NOT_LOGGED_IN
  105.             && $elementRestriction->getSection() === RestrictionManager::RESTRICTION_SECTION_NOT_ALLOWED
  106.         ) {
  107.             //not allowed
  108.             return 'members_user_security_login';
  109.         } elseif ($elementRestriction->getState() === RestrictionManager::RESTRICTION_STATE_LOGGED_IN
  110.             && $elementRestriction->getSection() === RestrictionManager::RESTRICTION_SECTION_NOT_ALLOWED
  111.         ) {
  112.             //logged in but no allowed.
  113.             return 'members_user_restriction_refused';
  114.         }
  115.         return false;
  116.     }
  117. }