src/EventSubscriber/KernelControllerSubscriber.php line 65

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Controller\__Contact\cms_api\PersonalSpaceController;
  4. use App\Controller\__Contact\cms_api\UserCMSController;
  5. use App\Controller\__Contact\cms_api\ProcessController;
  6. use App\Controller\__Sale\LegalTextController;
  7. use App\Controller\Account\BookingController;
  8. use App\Controller\Contact\BookletDownloadController;
  9. use App\Controller\PaymentMode\PaymentModeController;
  10. use App\Repository\User\UserCmsRepository;
  11. use Croisiland\CommonBundle\Helper\CmsErpApiHelper;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  17. class KernelControllerSubscriber implements EventSubscriberInterface
  18. {
  19.     public const USERCMS_ALLOWED_ROUTES = [
  20.         'contact_cms_api_user_cms_login',
  21.         'contact_cms_api_user_cms_logout',
  22.         'contact_cms_api_user_cms_register',
  23.         'contact_cms_api_user_cms_check_email',
  24.         'contact_cms_api_get_reset_password_token',
  25.         'contact_cms_api_user_cms_change_password',
  26.     ];
  27.     public const BOOKING_ROUTES_TO_CONTROL = [
  28.         'account_booking_get_booking_complete_payments_view',
  29.         'account_booking_get_booking_complete_documents_view',
  30.         'account_booking_payment_is_split',
  31.         'account_booking_change_validate',
  32.         'account_booking__planned_payment_list',
  33.         'account_booking__payment_list',
  34.         'account_booking_amendment_validate',
  35.         'account_booking__passenger_information_request',
  36.         'account_booking__passenger_formality_request',
  37.         'account_booking__upload_document',
  38.         'account_booking__delete_document',
  39.         'account_booking_complete',
  40.         'contact_cms_api_process_new_quote',
  41.         'contact_cms_api_process_edit_quote',
  42.     ];
  43.     public const LEGAL_TEXT_ROUTES_TO_CONTROL = [
  44.         'sale_legal_text_cms_api_view',
  45.         'sale_legal_text_cms_api_list'
  46.     ];
  47.     protected RequestStack $requestStack;
  48.     protected UserCmsRepository $userCmsRepository;
  49.     protected CmsErpApiHelper $cmsErpApiHelper;
  50.     public function __construct(RequestStack $requestStack,
  51.                                 UserCmsRepository $userCmsRepository,
  52.                                 CmsErpApiHelper $cmsErpApiHelper)
  53.     {
  54.         $this->requestStack $requestStack;
  55.         $this->userCmsRepository $userCmsRepository;
  56.         $this->cmsErpApiHelper $cmsErpApiHelper;
  57.     }
  58.     public function onKernelController(ControllerEvent $event): void
  59.     {
  60.         $request $this->requestStack->getCurrentRequest();
  61.         if ($this->controlRequired($event)) {
  62.             $userToken null;
  63.             if (null !== $request->request->get('userToken')) {
  64.                 $userToken $request->request->get('userToken');
  65.             }
  66.             elseif (null !== $request->query->get('userToken')) {
  67.                 $userToken $request->query->get('userToken');
  68.             }
  69.             elseif (null !== $request->request->get('token')) {
  70.                 $userToken $request->request->get('token');
  71.             }
  72.             elseif (null !== $request->query->get('token')) {
  73.                 $userToken $request->query->get('token');
  74.             }
  75.             try {
  76.                 $userCMS $userToken === null null $this->userCmsRepository->findOneByAccountToken($userToken);
  77.             }
  78.             catch (\Exception $e) {
  79.                 $userCMS null;
  80.             }
  81.             if ($userCMS === null) {
  82.                 $event->setController(
  83.                     function() {
  84.                         return new JsonResponse(['error' => 'Connexion non autorisée'], Response::HTTP_FORBIDDEN);
  85.                     }
  86.                 );
  87.             }
  88.             else {
  89.                 $request->attributes->set('userCms'$userCMS);
  90.             }
  91.         }
  92.         elseif ($this->globalControlRequired($event)) {
  93.             $token $request->get('_access_token');
  94.             if ($token !== $this->cmsErpApiHelper->getToken()) {
  95.                 $event->setController(
  96.                     function() {
  97.                         return new JsonResponse(['error' => 'Connexion non autorisée'], Response::HTTP_FORBIDDEN);
  98.                     }
  99.                 );
  100.             }
  101.         }
  102.     }
  103.     private function controlRequired(ControllerEvent $event): bool
  104.     {
  105.         $controller is_array($event->getController()) ? $event->getController()[0] : $event->getController();
  106.         $request $this->requestStack->getCurrentRequest();
  107.         $routeName $request->get('_route');
  108.         if (get_class($controller) === UserCMSController::class && !in_array($routeNameself::USERCMS_ALLOWED_ROUTES)) {
  109.             return true;
  110.         }
  111.         if (get_class($controller) === BookingController::class && in_array($routeNameself::BOOKING_ROUTES_TO_CONTROL)) {
  112.             return true;
  113.         }
  114.         if (get_class($controller) === ProcessController::class) {
  115.             return true;
  116.         }
  117.         if (get_class($controller) === PersonalSpaceController::class) {
  118.             return true;
  119.         }
  120.         if (get_class($controller) === BookletDownloadController::class) {
  121.             return true;
  122.         }
  123.         return false;
  124.     }
  125.     private function globalControlRequired(ControllerEvent $event): bool
  126.     {
  127.         $controller is_array($event->getController()) ? $event->getController()[0] : $event->getController();
  128.         $request $this->requestStack->getCurrentRequest();
  129.         $routeName $request->get('_route');
  130.         if (strstr($routeName'contact_cms_api_') !== false) {
  131.             return true;
  132.         }
  133.         if (get_class($controller) === LegalTextController::class && in_array($routeNameself::LEGAL_TEXT_ROUTES_TO_CONTROL)) {
  134.             return true;
  135.         }
  136.         return false;
  137.     }
  138.     public static function getSubscribedEvents(): array
  139.     {
  140.         return [
  141.             'kernel.controller' => 'onKernelController',
  142.         ];
  143.     }
  144. }