src/Listener/CheckCguListener.php line 45

Open in your IDE?
  1. <?php
  2.     /******************************************************************************
  3.      * Copyright (c) Echo-numeric 2020-2023.                                      *
  4.      ******************************************************************************/
  5.     namespace App\Listener;
  6.     use App\Entity\User;
  7.     use App\Services\DTV\YamlConfig\YamlReader;
  8.     use DateTime;
  9.     use Doctrine\ORM\EntityManagerInterface;
  10.     use Symfony\Component\HttpFoundation\RedirectResponse;
  11.     use Symfony\Component\HttpKernel\Event\ResponseEvent;
  12.     use Symfony\Component\Routing\RouterInterface;
  13.     use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  14.     class CheckCguListener
  15.     {
  16.         private TokenStorageInterface  $token;
  17.         private RouterInterface        $router;
  18.         private EntityManagerInterface $em;
  19.         private YamlReader             $yamlReader;
  20.         public function __construct(
  21.             TokenStorageInterface  $token,
  22.             RouterInterface        $router,
  23.             EntityManagerInterface $em,
  24.             YamlReader             $yamlReader
  25.         ) {
  26.             $this->token      $token;
  27.             $this->router     $router;
  28.             $this->em         $em;
  29.             $this->yamlReader $yamlReader;
  30.         }
  31.         /**
  32.          * @param ResponseEvent $event
  33.          *
  34.          * @return void
  35.          */
  36.         public function onKernelResponseResponseEvent $event )
  37.         {
  38.             $request $event->getRequest();
  39.             // Dans Symfony, le type de requête "1" signifie généralement une requête principale
  40.             if ( $event->getRequestType() !== ) {
  41.                 return;
  42.             }
  43.             if ( $request->isXmlHttpRequest() ) {
  44.                 return;
  45.             }
  46.             if ( !in_array(
  47.                 $request->get'_route' ),
  48.                 [
  49.                     'static_file_folder',
  50.                     'static_project_file',
  51.                     'front_common_css_custom',
  52.                     'front_user_accept_cgu_first',
  53.                     'front_user_accept_cgu_only',
  54.                 ],
  55.             ) ) {
  56.                 if ( NULL !== $this->token->getToken() ) {
  57.                     $token $this->token->getToken();
  58.                     /** @var User $user */
  59.                     $user $this->token->getToken()->getUser();
  60.                     if ($user->isDeveloper()){
  61.                         return;
  62.                     }
  63.                     if ( $user instanceof User ) {
  64.                         $this->updateUserLastActivity$user );
  65.                         // L'utilisateur est de type developer ou super-admin, on passe directement en actif
  66.                         if ( $user->isDeveloper() ) {
  67.                             if ( $user->getStatus() == 'cgu_pending' || $user->getCguAt() === NULL ) {
  68.                                 $user->setStatus'enabled' )
  69.                                      ->setCguAt( new DateTime() )
  70.                                 ;
  71.                                 $this->em->flush();
  72.                             }
  73.                         } // Sinon, on passe par la validation des CGU
  74.                         elseif ( NULL === $user->getCguAt() || $user->getStatus() === 'cgu_pending' ) {
  75.                             $event->setResponse(
  76.                                 new RedirectResponse(
  77.                                     $this->router->generate'front_user_accept_cgu_only' ),
  78.                                 ),
  79.                             );
  80.                         }
  81.                         // Code commenté suite demande daikin
  82.                         /*
  83.                         // L'utilisateur est en train d'impersonner un autre utilisateur, donc on ne fait rien
  84.                         if ( $token && in_array( 'ROLE_PREVIOUS_ADMIN', $token->getRoleNames() ) ) {
  85.                             return;
  86.                         }
  87.                         // Si le password de l'utilisateur est expiré, on le redirige vers la page de changement de mot de passe, sauf si on est déjà sur cette page
  88.                         if ( $request->get( '_route' ) !== 'front_user_password' ) {
  89.                             $now               = new DateTime();
  90.                             $passwordUpdatedAt = $user->getPasswordUpdatedAt()
  91.                                                  ?? ( new DateTime() )->modify( '-370 days' );
  92.                             $date              = $now->diff( $passwordUpdatedAt );
  93.                             $global                        = $this->yamlReader->getGlobal();
  94.                             $remainingPasswordValidityDays = $global[ 'login_security' ][ 'password_validity_days' ]
  95.                                                              ?? 365;
  96.                             $rest                          = $remainingPasswordValidityDays - $date->days;
  97.                             if ( $rest < 0 ) {
  98.                                 $event->setResponse(
  99.                                     new RedirectResponse(
  100.                                         $this->router->generate( 'front_user_password' ),
  101.                                     ),
  102.                                 );
  103.                             }
  104.                         }
  105.                         */
  106.                         // fin de code commenté suite demande daikin
  107.                     }
  108.                 }
  109.             }
  110.         }
  111.         /**
  112.          * Met à jour la date de dernière activité de l'utilisateur
  113.          *
  114.          * @param User $user Utilisateur
  115.          *
  116.          * @return void
  117.          */
  118.         private function updateUserLastActivityUser $user ): void
  119.         {
  120.             // Si la dernière activité de l'utilisateur date de moins de 1H, on ne fait rien
  121.             $now            = new DateTime();
  122.             $timestampDebut $user->getLastActivity() ? $user->getLastActivity()->getTimestamp() : 0;
  123.             $timestampFin   $now->getTimestamp();
  124.             $diff           $timestampFin $timestampDebut;
  125.             if ( $diff >= 3600 ) {
  126.                 $user->setLastActivity( new DateTime() );
  127.                 $this->em->flush();
  128.             }
  129.         }
  130.     }