<?php
namespace App\EventSubscriber;
use App\Controller\__Contact\cms_api\PersonalSpaceController;
use App\Controller\__Contact\cms_api\UserCMSController;
use App\Controller\__Contact\cms_api\ProcessController;
use App\Controller\__Sale\LegalTextController;
use App\Controller\Account\BookingController;
use App\Controller\Contact\BookletDownloadController;
use App\Controller\PaymentMode\PaymentModeController;
use App\Repository\User\UserCmsRepository;
use Croisiland\CommonBundle\Helper\CmsErpApiHelper;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
class KernelControllerSubscriber implements EventSubscriberInterface
{
public const USERCMS_ALLOWED_ROUTES = [
'contact_cms_api_user_cms_login',
'contact_cms_api_user_cms_logout',
'contact_cms_api_user_cms_register',
'contact_cms_api_user_cms_check_email',
'contact_cms_api_get_reset_password_token',
'contact_cms_api_user_cms_change_password',
];
public const BOOKING_ROUTES_TO_CONTROL = [
'account_booking_get_booking_complete_payments_view',
'account_booking_get_booking_complete_documents_view',
'account_booking_payment_is_split',
'account_booking_change_validate',
'account_booking__planned_payment_list',
'account_booking__payment_list',
'account_booking_amendment_validate',
'account_booking__passenger_information_request',
'account_booking__passenger_formality_request',
'account_booking__upload_document',
'account_booking__delete_document',
'account_booking_complete',
'contact_cms_api_process_new_quote',
'contact_cms_api_process_edit_quote',
];
public const LEGAL_TEXT_ROUTES_TO_CONTROL = [
'sale_legal_text_cms_api_view',
'sale_legal_text_cms_api_list'
];
protected RequestStack $requestStack;
protected UserCmsRepository $userCmsRepository;
protected CmsErpApiHelper $cmsErpApiHelper;
public function __construct(RequestStack $requestStack,
UserCmsRepository $userCmsRepository,
CmsErpApiHelper $cmsErpApiHelper)
{
$this->requestStack = $requestStack;
$this->userCmsRepository = $userCmsRepository;
$this->cmsErpApiHelper = $cmsErpApiHelper;
}
public function onKernelController(ControllerEvent $event): void
{
$request = $this->requestStack->getCurrentRequest();
if ($this->controlRequired($event)) {
$userToken = null;
if (null !== $request->request->get('userToken')) {
$userToken = $request->request->get('userToken');
}
elseif (null !== $request->query->get('userToken')) {
$userToken = $request->query->get('userToken');
}
elseif (null !== $request->request->get('token')) {
$userToken = $request->request->get('token');
}
elseif (null !== $request->query->get('token')) {
$userToken = $request->query->get('token');
}
try {
$userCMS = $userToken === null ? null : $this->userCmsRepository->findOneByAccountToken($userToken);
}
catch (\Exception $e) {
$userCMS = null;
}
if ($userCMS === null) {
$event->setController(
function() {
return new JsonResponse(['error' => 'Connexion non autorisée'], Response::HTTP_FORBIDDEN);
}
);
}
else {
$request->attributes->set('userCms', $userCMS);
}
}
elseif ($this->globalControlRequired($event)) {
$token = $request->get('_access_token');
if ($token !== $this->cmsErpApiHelper->getToken()) {
$event->setController(
function() {
return new JsonResponse(['error' => 'Connexion non autorisée'], Response::HTTP_FORBIDDEN);
}
);
}
}
}
private function controlRequired(ControllerEvent $event): bool
{
$controller = is_array($event->getController()) ? $event->getController()[0] : $event->getController();
$request = $this->requestStack->getCurrentRequest();
$routeName = $request->get('_route');
if (get_class($controller) === UserCMSController::class && !in_array($routeName, self::USERCMS_ALLOWED_ROUTES)) {
return true;
}
if (get_class($controller) === BookingController::class && in_array($routeName, self::BOOKING_ROUTES_TO_CONTROL)) {
return true;
}
if (get_class($controller) === ProcessController::class) {
return true;
}
if (get_class($controller) === PersonalSpaceController::class) {
return true;
}
if (get_class($controller) === BookletDownloadController::class) {
return true;
}
return false;
}
private function globalControlRequired(ControllerEvent $event): bool
{
$controller = is_array($event->getController()) ? $event->getController()[0] : $event->getController();
$request = $this->requestStack->getCurrentRequest();
$routeName = $request->get('_route');
if (strstr($routeName, 'contact_cms_api_') !== false) {
return true;
}
if (get_class($controller) === LegalTextController::class && in_array($routeName, self::LEGAL_TEXT_ROUTES_TO_CONTROL)) {
return true;
}
return false;
}
public static function getSubscribedEvents(): array
{
return [
'kernel.controller' => 'onKernelController',
];
}
}