src/EventSubscriber/UserAuthenticatedSubscriber.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Controller\Api\ApiMessages;
  4. use App\Controller\Api\AssessmentController;
  5. use App\Controller\UserAuthenticatedController;
  6. use App\Enum\CsrfToken as TokenNames;
  7. use App\Model\Common\ResponseModel;
  8. use App\Response\ApiResponse;
  9. use App\Service\Config\ConfigLoader;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  14. use Symfony\Component\HttpKernel\KernelEvents;
  15. use Symfony\Component\Security\Core\Security;
  16. use Symfony\Component\Security\Csrf\CsrfToken;
  17. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  18. class UserAuthenticatedSubscriber implements EventSubscriberInterface
  19. {
  20.     private $security;
  21.     private $csrfTokenManager;
  22.     private $configLoader;
  23.     public function __construct(Security $securityCsrfTokenManagerInterface $csrfTokenManagerConfigLoader $configLoader)
  24.     {
  25.         $this->security $security;
  26.         $this->csrfTokenManager $csrfTokenManager;
  27.         $this->configLoader $configLoader;
  28.     }
  29.     public function onKernelController(ControllerEvent $event)
  30.     {
  31.         $controllers $event->getController();
  32.         if (!is_array($controllers) || !$controllers[0] instanceof UserAuthenticatedController) {
  33.             return;
  34.         }
  35.         if (isset($_ENV['MAINTENANCE_MODE']) && $_ENV['MAINTENANCE_MODE']) {
  36.             $event->setController(
  37.                 function () {
  38.                     $response          = new ResponseModel();
  39.                     $response->success false;
  40.                     $response->message ApiMessages::UNAUTHENTICATED;
  41.                     return new JsonResponse($responseResponse::HTTP_UNAUTHORIZED);
  42.                 }
  43.             );
  44.         }
  45.         if (!$this->checkAuthenticated()) {
  46.             $response          = new ResponseModel();
  47.             $response->success false;
  48.             $response->message ApiMessages::UNAUTHENTICATED;
  49.             $event->setController(
  50.                 function () use ($response) {
  51.                     return new JsonResponse($responseResponse::HTTP_UNAUTHORIZED);
  52.                 }
  53.             );
  54.         }
  55.         if (!$this->checkCsrfToken($event)) {
  56.             $event->setController(
  57.                 function () {
  58.                     return ApiResponse::error(ApiMessages::INVALID_CSRF_TOKEN0Response::HTTP_FORBIDDEN);
  59.                 }
  60.             );
  61.         }
  62.         if ($controllers[0] instanceof AssessmentController) {
  63.             if (!$this->configLoader->getValue("core_feature_assessment")) {
  64.                 $event->setController(
  65.                     function () {
  66.                         return ApiResponse::error(ApiMessages::ACTION_NOT_ALLOWED0Response::HTTP_FORBIDDEN);
  67.                     }
  68.                 );
  69.             }
  70.         }
  71.     }
  72.     private function checkAuthenticated(): bool
  73.     {
  74.         return $this->security->isGranted('IS_AUTHENTICATED_FULLY');
  75.     }
  76.     private function checkCsrfToken($event): bool
  77.     {
  78.         $method $event->getRequest()->getMethod();
  79.         $stateChangingMethods = ['post''put''patch''delete'];
  80.         if (!in_array(strtolower($method), $stateChangingMethods)) {
  81.             return true;
  82.         }
  83.         $tokenValue $event->getRequest()->headers->get("x-csrf-token");
  84.         $csrfToken = new CsrfToken(TokenNames::API_TOKEN$tokenValue);
  85.         return $this->csrfTokenManager->isTokenValid($csrfToken);
  86.     }
  87.     public static function getSubscribedEvents(): array
  88.     {
  89.         return [
  90.             KernelEvents::CONTROLLER => 'onKernelController',
  91.         ];
  92.     }
  93. }