src/App/Event/KernelRequestEvent.php line 226

Open in your IDE?
  1. <?php
  2. namespace App\Event;
  3. use App\Doctrine\DoctrinePlatformAuthenticator;
  4. use App\Entity\Parametre\Parametre;
  5. use App\Entity\Parametre\Utilisateur;
  6. use App\Helper\UserHelper;
  7. use Doctrine\Bundle\DoctrineBundle\Registry;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. use Symfony\Component\HttpKernel\Event\RequestEvent;
  11. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
  12. use Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage;
  13. use Symfony\Contracts\Translation\TranslatorInterface;
  14. use Twig\Environment;
  15. use Webservice\Controller\AbstractWebserviceController;
  16. /**
  17.  * KernelRequestEvent.
  18.  *
  19.  * @author John Doe
  20.  * @package App\Event
  21.  */
  22. class KernelRequestEvent {
  23.     /** @var Registry */
  24.     private $doctrine;
  25.     /** @var RequestStack */
  26.     private $requestStack;
  27.     /** @var TokenStorage */
  28.     private $tokenStorage;
  29.     /** @var TranslatorInterface */
  30.     private $translator;
  31.     /** @var Environment */
  32.     private $twig;
  33.     /**
  34.      * SecurityInteractiveLogin constructor.
  35.      *
  36.      * @param Registry $doctrine
  37.      * @param RequestStack $requestStack
  38.      * @param TranslatorInterface $translator
  39.      * @param TokenStorage $tokenStorage
  40.      * @param Environment $twig
  41.      */
  42.     public function __construct(Registry $doctrineRequestStack $requestStackTranslatorInterface $translatorUsageTrackingTokenStorage $tokenStorageEnvironment $twig) {
  43.         $this->doctrine     $doctrine;
  44.         $this->requestStack $requestStack;
  45.         $this->translator   $translator;
  46.         $this->tokenStorage $tokenStorage;
  47.         $this->twig         $twig;
  48.     }
  49.     /**
  50.      * Check user session.
  51.      *
  52.      * @param Utilisateur $user
  53.      */
  54.     private function checkUserSession(Utilisateur $user) {
  55.         if ($this->requestStack->getSession()->has("_originalToken") === true) {
  56.             return;
  57.         }
  58.         // Get current session.
  59.         $now = new \DateTime();
  60.         if ("/login" === $this->requestStack->getCurrentRequest()->getRequestUri()) {
  61.             return;
  62.         }
  63.         // If need to update session user token.
  64.         if ($this->requestStack->getSession()->get("UpdateSessionToken") === 1) {
  65.             // Update user session.
  66.             $user->setSessionToken(UserHelper::generateSessionToken());
  67.             $this->em()->flush();
  68.             // Remove session.
  69.             $this->requestStack->getSession()->remove("UpdateSessionToken");
  70.         }
  71.         // Check if current session is similar with saved user session.
  72.         if ($user->getSessionToken() !== UserHelper::generateSessionToken()) {
  73.             session_destroy();
  74.             header('Location: /');
  75.             exit;
  76.         }
  77.         // If session was expired, refresh it.
  78.         if ($now->getTimestamp() > $user->getDateSessionExpiration()->getTimestamp()) {
  79.             $user->setDateSessionExpiration($now);
  80.             $user->getDateSessionExpiration()->modify("+2min");
  81.             $this->em()->flush();
  82.         }
  83.     }
  84.     /**
  85.      * @return \Doctrine\Persistence\ObjectManager
  86.      */
  87.     private function em() {
  88.         return $this->doctrine->getManager();
  89.     }
  90.     /**
  91.      * @param $name
  92.      * @return mixed|null
  93.      */
  94.     private function getHeader($name) {
  95.         $headers getallheaders();
  96.         foreach ($headers as $key => $value) {
  97.             if (strtolower($key) === strtolower($name)) {
  98.                 return $value;
  99.             }
  100.         }
  101.         return null;
  102.     }
  103.     /**
  104.      * Init platform language.
  105.      *
  106.      * @param Utilisateur|null $utilisateur
  107.      */
  108.     private function initPlatformLangage(RequestEvent $requestEventUtilisateur $utilisateur null) {
  109.         // Set default platform langage.
  110.         $defaultPlatformLangage "fr";
  111.         // Get current session lanage.
  112.         $currentSessionLangage $this->requestStack->getSession()->get('_locale');
  113.         // Get parametre repository.
  114.         $parametreRepo $this->em()->getRepository(Parametre::class);
  115.         // If locale was not defined.
  116.         if ($currentSessionLangage === null) {
  117.             $platformLangage $defaultPlatformLangage;
  118.             // If platform id was defined, get langage.
  119.             if (false !== getenv("PLATFORM_ID")) {
  120.                 // Find parameter.
  121.                 $findParameter $parametreRepo->findOneBy([
  122.                     "cle"        => "LANGUAGE",
  123.                     "platformId" => getenv("PLATFORM_ID"),
  124.                 ]);
  125.                 // If parameter was found.
  126.                 if (null !== $findParameter) {
  127.                     $platformLangage $findParameter->getValeur();
  128.                 }
  129.             }
  130.             // Set the locale.
  131.             $this->requestStack->getSession()->set('_locale'$platformLangage);
  132.             $requestEvent->getRequest()->setLocale($platformLangage);
  133.             // If lang is different, switch it and reload page.
  134.             if ($defaultPlatformLangage !== $platformLangage) {
  135.                 header("Refresh: 0");
  136.                 exit();
  137.             }
  138.         }
  139.         // If user was connected.
  140.         if (null !== $utilisateur && null !== $utilisateur->getLang()) {
  141.             $platformLangage $utilisateur->getLang();
  142.             if (null !== $platformLangage) {
  143.                 $this->requestStack->getSession()->set('_locale'$platformLangage);
  144.                 $requestEvent->getRequest()->setLocale($platformLangage);
  145.             }
  146.         }
  147.     }
  148.     /**
  149.      * @param Utilisateur $utilisateur
  150.      * @param Request $request
  151.      */
  152.     private function initVariablesEnvironment(Utilisateur $utilisateurRequest $request) {
  153.         // If platform code was not defined.
  154.         if (getenv("PLATFORM_CODE") === false) {
  155.             // Get platform code is saved into session.
  156.             $sessionPlatformCode $this->requestStack->getSession()->get("PLATFORM_CODE");
  157.             // If session was not initialized.
  158.             if (true === empty($sessionPlatformCode)) {
  159.                 // Execute request to get the platform code.
  160.                 $find DoctrinePlatformAuthenticator::queryDbPlatform("SELECT * FROM platform WHERE id = ?", [$utilisateur->getPlatformId()], true);
  161.                 // If result was found, set code into session and global variable environment.
  162.                 if (false !== $find) {
  163.                     $this->requestStack->getSession()->set("PLATFORM_CODE"$find["code"]);
  164.                 }
  165.             }
  166.             // Set value to environment variable.
  167.             putenv("PLATFORM_CODE={$this->requestStack->getSession()->get("PLATFORM_CODE")}");
  168.         }
  169.         // Set global variable platform id.
  170.         putenv("PLATFORM_ID={$utilisateur->getPlatformId()}");
  171.         $companyId null;
  172.         if ($utilisateur->getSocieteSelected() !== null) {
  173.             $companyId $utilisateur->getSocieteSelected()->getId();
  174.         } else if ($request->getSession()->has("companySelected")) {
  175.             $companyId $request->getSession()->has("companySelected");
  176.         }
  177.         putenv("COMPANY_ID=$companyId");
  178.     }
  179.     /**
  180.      * On Kernel Request.
  181.      */
  182.     public function onKernelRequest(RequestEvent $requestEvent) {
  183.         if (=== preg_match("/^\/logout/"$requestEvent->getRequest()->getRequestUri())) {
  184.             return;
  185.         }
  186.         if (=== preg_match("/^\/api/"$requestEvent->getRequest()->getRequestUri())
  187.             && === preg_match("/^\/api\/provider\//"$requestEvent->getRequest()->getRequestUri())) {
  188.             return $this->onKernelRequestWebservice($requestEvent);
  189.         }
  190.         if (true === in_array($requestEvent->getRequest()->getHost(), ["api.px.local""api.adheria.eu"])
  191.             && === preg_match("/^\/api/"$requestEvent->getRequest()->getRequestUri())) {
  192.             AbstractWebserviceController::criticalJsonResponse([
  193.                 "errorCode" => "NOT_AUTHENTICATED",
  194.             ]);
  195.         }
  196.         /** @var Utilisateur|null $user */
  197.         $user $this->tokenStorage->getToken() !== null $this->tokenStorage->getToken()->getUser() : null;
  198.         // If user is connected.
  199.         if (null !== $user) {
  200.             // Check user session.
  201.             $this->checkUserSession($user);
  202.             // Initialize variables environment.
  203.             $this->initVariablesEnvironment($user$requestEvent->getRequest());
  204.         }
  205.         // Set lang.
  206.         $this->initPlatformLangage($requestEvent$user);
  207.     }
  208.     /**
  209.      * @param RequestEvent $requestEvent
  210.      */
  211.     public function onKernelRequestWebservice(RequestEvent $requestEvent) {
  212.         // Get the client token.
  213.         $clientToken $this->getHeader("client_token");
  214.         if (null === $clientToken) {
  215.             AbstractWebserviceController::criticalJsonResponse([
  216.                 "errorCode"    => "CLIENT_TOKEN_NOT_DEFINED",
  217.                 "errorMessage" => "Client token was not defined.",
  218.             ]);
  219.         }
  220.     }
  221. }