src/Controller/SecurityController.php line 63

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Form\FormError;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\Security\Core\Security;
  9. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  10. use Symfony\Component\Validator\Constraints\Email as EmailConstraint;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\Validator\Validator\ValidatorInterface;
  13. use App\Entity\Aide;
  14. use App\Entity\ParametrageTexte;
  15. use App\Entity\RefRole;
  16. use App\Entity\UtilisateurInformation;
  17. use App\Form\Type\FirstConnectionType;
  18. use App\Form\Type\LoginType;
  19. use App\Form\Type\ReinitializeType;
  20. use App\Form\Type\UpdatePasswordType;
  21. use Doctrine\Persistence\ManagerRegistry;
  22. use Symfony\Component\Mailer\MailerInterface;
  23. use Symfony\Component\Mime\Email;
  24. use Twig\Environment;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\Validator\Validation;
  27. /**
  28.  * Description of SecurityController
  29.  * @author Maxime Dequant
  30.  */
  31. class SecurityController extends AbstractController
  32. {
  33.     private ManagerRegistry $doctrine;
  34.     private $twig;
  35.     private MailerInterface $mailer;
  36.     private ValidatorInterface $validator;
  37.     public function __construct(ManagerRegistry $doctrineEnvironment $twigMailerInterface $mailerValidatorInterface $validator)
  38.     {
  39.         $this->doctrine $doctrine;
  40.         $this->twig $twig;
  41.         $this->mailer $mailer;
  42.         $this->validator $validator;
  43.     }
  44.     #[Route(path'/login'name'ctsweb_front_login')]
  45.     public function login(Request $requestAuthenticationUtils $authenticationUtils): \Symfony\Component\HttpFoundation\Response
  46.     {
  47.         $session $request->getSession();
  48.         $user $authenticationUtils->getLastUsername();
  49.         $error '';
  50.         $dateNow = new \DateTime();
  51.         $em $this->doctrine->getManager();
  52.         $uiRep $em->getRepository(UtilisateurInformation::class);
  53.         $userInfo $uiRep->getUserInfoByLogin($user);
  54.         if ($session->has('expired')) {
  55.             // $error = "Votre compte a expiré";
  56.             $error "La date de fin de droit d’accès à votre compte est dépassée. Veuillez contacter l’administrateur";
  57.             $session->remove('expired');
  58.         } elseif (!empty($userInfo) && $userInfo['utilisateurActif'] == true && $dateNow <= $userInfo['dateBlocage']) {
  59.             $error "Votre compte est bloqué pendant 30 minutes, suite à un trop grand nombre de tentatives de connexion.";
  60.         } elseif ($session->has('disabled_user') || (!empty($userInfo) && $userInfo['utilisateurActif'] == false)) {
  61.             $error "Votre compte a été désactivé, Veuillez contacter l'administrateur national";
  62.             $session->remove('disabled_user');
  63.         } elseif ($session->has('disabled_fede')) {
  64.             $error "Votre fédération a été désactivée, Veuillez contacter l'administrateur national";
  65.             $session->remove('disabled_fede');
  66.         } else {
  67.             if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
  68.                 $error $request->attributes->get(Security::AUTHENTICATION_ERROR);
  69.             } else {
  70.                 if ($session->get(Security::AUTHENTICATION_ERROR)) {
  71.                     $uiRep->addTentative($user);
  72.                     $error "Authentification échouée";
  73.                     $session->remove(Security::AUTHENTICATION_ERROR);
  74.                 }
  75.             }
  76.         }
  77.         $form $this->createForm(LoginType::class);
  78.         $form->handleRequest($request);
  79.         $mail_contact null;
  80.         $mail_contact_info $em->getRepository(ParametrageTexte::class)->getByCode('COURRIEL_CONTACT_INFO');
  81.         if ((is_countable($mail_contact_info) ? count($mail_contact_info) : 0) > 0)
  82.             $mail_contact $mail_contact_info[0]->getTexte();
  83.         $texte_login null;
  84.         $texte_login_info $em->getRepository(ParametrageTexte::class)->getByCode('LOGIN_INFO');
  85.         if ((is_countable($texte_login_info) ? count($texte_login_info) : 0) > 0)
  86.             $texte_login $texte_login_info[0]->getTexte();
  87.         $urlAide null;
  88.         $aide $em->getRepository(Aide::class)->findOneBy(['type' => 'login']);
  89.         if (isset($aide)) {
  90.             $urlAide $this->getParameter('dir_file_aide') . $aide->getPath();
  91.         }
  92.         return $this->render(
  93.             'Security/login.html.twig',
  94.             ['form' => $form->createView(), 'request' => $request'error' => $error'texte_login' => $texte_login'mail_contact' => $mail_contact'url_aide' => $urlAide'version' => $this->getParameter('version')]
  95.         );
  96.     }
  97.     #[Route(path'/first_connection'name'ctsweb_front_first_connection')]
  98.     public function firstConnection(Request $request)
  99.     {
  100.         $form $this->createForm(FirstConnectionType::class);
  101.         $form->handleRequest($request);
  102.         $error "";
  103.         $requestForm $request->request->get('first_connection');
  104.         $user $this->getUser();
  105.         $em $this->doctrine->getManager();
  106.         $repository $em->getRepository(UtilisateurInformation::class);
  107.         if ($form->isSubmitted() && $form->isValid()) {
  108.             if (
  109.                 preg_match(
  110.                     '/^(?=(.*[a-z]){1,})(?=(.*[A-Z]){1,})(?=(.*[\d]){1,})(?=(.*[\W]){1,})(?!.*\s).{12,}$/',
  111.                     (string) $requestForm['password']['first']
  112.                 )
  113.             ) {
  114.                 $result $repository->changePassword($requestForm$user->getIdUtilisateur());
  115.                 if (isset($result['error']) && $result['error'] == 0) {
  116.                     $dateConnexion = new \DateTime();
  117.                     $dateConnexion->setTimezone(new \DateTimeZone('Europe/Paris'));
  118.                     $dateConnexion->format('Y-m-d H:i:s');
  119.                     $user->getUtilisateur()->setCourriel($requestForm['email']);
  120.                     $user->getUtilisateur()->setDateConnexion($dateConnexion->format('Y-m-d H:i:s'));
  121.                     $user->setJetonMdp(null);
  122.                     $em->flush();
  123.                     return match ($user->getUtilisateur()->getIdRole()) {
  124.                         RefRole::ROLE_DS_ADMINRefRole::ROLE_DS_INVITERefRole::ROLE_DRRefRole::ROLE_FEDERefRole::ROLE_FEDE_INVITERefRole::ROLE_DS_SIGNATAIRERefRole::ROLE_DR_SIGNATAIRERefRole::ROLE_LECTEUR => new RedirectResponse('/v2/gerer-cts/actualites/liste-actualites'),
  125.                         RefRole::ROLE_CTS => new RedirectResponse('/v2/mon-activite/actualites'),
  126.                         RefRole::ROLE_GCRRefRole::ROLE_GCS => new RedirectResponse('/v2/gerer-cts/gerer-conges/en-attente'),
  127.                         default => new RedirectResponse('/v2/mon-activite/actualites'),
  128.                     };
  129.                 } else {
  130.                     $error $result['retour'];
  131.                 }
  132.             } else {
  133.                 $error "Votre mot de passe doit avoir une longueur de 12 caractères minimum, contenant au moins un chiffre, une lettre minuscule, une lettre majuscule et un caractère spécial";
  134.             }
  135.         } else {
  136.             if ($repository->findFirstConnection($user->getIdUtilisateur()) != "") {
  137.             } else {
  138.                 return $this->render(
  139.                     'Security/first_connection.html.twig',
  140.                     ['form' => $form->createView(), 'error' => $error'version' => $this->getParameter('version')]
  141.                 );
  142.             }
  143.         }
  144.         return $this->render(
  145.             'Security/first_connection.html.twig',
  146.             ['form' => $form->createView(), 'error' => $error'version' => $this->getParameter('version')]
  147.         );
  148.     }
  149.     #[Route(path'/reinitialize'name'ctsweb_front_reinitialize_pwd')]
  150.     public function reinitialize(Request $request): \Symfony\Component\HttpFoundation\Response
  151.     {
  152.         $error "";
  153.         $info "";
  154.         $errorList = [];
  155.         $requestForm $request->request->get('reinitialize');
  156.         $repository $this->doctrine->getManager()->getRepository(UtilisateurInformation::class);
  157.         $session $request->getSession();
  158.         $hasPasswordExpired $session->get('has_password_expired'false);
  159.         $form $this->createForm(ReinitializeType::class);
  160.         $form->handleRequest($request);
  161.         if ((is_countable($errorList) ? count($errorList) : 0) != 0) {
  162.             $errorMessage = new FormError($errorList[0]->getMessage());
  163.             $form->addError($errorMessage);
  164.         }
  165.         if ($form->isSubmitted() && $form->isValid()) {
  166.             $result $repository->findUserReinitialize($requestForm);
  167.             if (isset($result['error']) && $result['error'] == 0) {
  168.                 $host $this->getParameter('host');
  169.                 $token $result['user']['tokenUpdatePwd'];
  170.                 $linkUpdatePwd sprintf('update_password/%s'$token);
  171.                 $mail_contact null;
  172.                 $mail_ass_info $this->doctrine->getManager()->getRepository(ParametrageTexte::class)->getByCode('COURRIEL_ASSISTANCE_INFO');
  173.                 if ((is_countable($mail_ass_info) ? count($mail_ass_info) : 0) > 0)
  174.                     $mail_contact $mail_ass_info[0]->getTexte();
  175.                 try {
  176.                     $email = (new Email())
  177.                         ->from($mail_contact)
  178.                         ->to($result['user']['email'])
  179.                         ->subject('CTS-WEB : Réinitialisation de votre mot de passe')
  180.                         ->html($this->twig->render(
  181.                             'Security/email_reinitialize.html.twig',
  182.                             [
  183.                                 'host' => $host,
  184.                                 'username' => $result['user']['username'],
  185.                                 'password' => $result['user']['password'],
  186.                                 'nom' => $result['user']['nom'],
  187.                                 'prenom' => $result['user']['prenom'],
  188.                                 'date' => $result['user']['date'],
  189.                                 'linkUpdatePwd' => $linkUpdatePwd,
  190.                                 'from' => $mail_contact,
  191.                                 'hasPasswordExpired' => $hasPasswordExpired
  192.                             ]
  193.                         ));
  194.                     $this->mailer->send($email);
  195.                     $info "Un courriel vous a été envoyé pour réinitialiser votre mot de passe. En cas de difficulté, veuillez contacter la direction des sports, centre de gestion opérationnelle des CTS.";
  196.                 } catch (\Exception) {
  197.                     $error "Erreur lors de l'envoi du mail";
  198.                 }
  199.             } else {
  200.                 $error $result['message'];
  201.             }
  202.         }
  203.         return $this->render(
  204.             'Security/reinitialize.html.twig',
  205.             ['form' => $form->createView(), 'request' => $request'error' => $error'info' => $info,'hasPasswordExpired' => $hasPasswordExpired'version' => $this->getParameter('version')]
  206.         );
  207.     }
  208.    
  209.     #[Route(path'/update_password/{token}'name'ctsweb_front_update_password')]
  210.     public function updatePassword(Request $request$token)
  211.     {
  212.         $form $this->createForm(UpdatePasswordType::class);
  213.         $form->handleRequest($request);
  214.         $result null;
  215.         $requestForm $request->request->get('update_password');
  216.         $uiRep $this->doctrine->getManager()->getRepository(UtilisateurInformation::class);
  217.         if ($form->isSubmitted() && $form->isValid()) {
  218.             if (
  219.                 preg_match(
  220.                     '/^(?=(.*[a-z]){1,})(?=(.*[A-Z]){1,})(?=(.*[\d]){1,})(?=(.*[\W]){1,})(?!.*\s).{12,}$/',
  221.                     (string) $requestForm['password']['first']
  222.                 )
  223.             ) {
  224.                 //Mettre à jour le mot de passe
  225.                 $result $uiRep->updatePassword($requestForm$token);
  226.             } else {
  227.                 $message "Votre mot de passe doit avoir une longueur de 12 caractères minimum, contenant au moins un chiffre, une lettre minuscule, une lettre majuscule et un caractère spécial";
  228.                 $errorMessage = new FormError($message);
  229.                 $form->addError($errorMessage);
  230.             }
  231.         } else if (empty($token) || !$uiRep->isValidToken($token)) {
  232.             //Rédirection vers la page login
  233.             return new RedirectResponse('/login');
  234.         }
  235.         return $this->render(
  236.             'Security/update_password.html.twig',
  237.             ['form' => $form->createView(), 'error' => (isset($result['error']) && $result['error']) ? $result['message'] : '''info' => (isset($result['error']) && !$result['error']) ? $result['message'] : '''version' => $this->getParameter('version')]
  238.         );
  239.     }
  240.     #[Route(path'/retrieve_login'name'ctsweb_front_retrieve_login')]
  241.     public function retrieveLogin(Request $request): Response
  242.     {
  243.         $error "";
  244.         $info "";
  245.         $requestForm $request->request->get('reinitialize');
  246.         $repository $this->doctrine->getManager()->getRepository(UtilisateurInformation::class);
  247.         $form $this->createForm(ReinitializeType::class);
  248.         $form->handleRequest($request);
  249.         $data $form->getData();
  250.         $email $data['courriel'] ?? '';
  251.         $emailConstraint = new EmailConstraint();
  252.         $emailConstraint->message 'Adresse e-mail incorrecte';
  253.         $errorList $this->validator->validate($email$emailConstraint);
  254.         if ((is_countable($errorList) ? count($errorList) : 0) != 0) {
  255.             $errorMessage = new FormError($errorList[0]->getMessage());
  256.             $form->addError($errorMessage);
  257.         }
  258.         $mail_contact null;
  259.         $mail_ass_info $this->doctrine->getManager()->getRepository(ParametrageTexte::class)->getByCode('COURRIEL_ASSISTANCE_INFO');
  260.         if ((is_countable($mail_ass_info) ? count($mail_ass_info) : 0) > 0) {
  261.             $mail_contact $mail_ass_info[0]->getTexte();
  262.         }
  263.         if ($form->isSubmitted() && $form->isValid()) {
  264.             $result $repository->retrieveUserLogin($requestForm);
  265.             if (isset($result['error']) && $result['error'] == 0) {
  266.                 try {
  267.                     $host $this->getParameter('host');
  268.                     $mail_contact null;
  269.                     $mail_ass_info $this->doctrine->getManager()->getRepository(ParametrageTexte::class)->getByCode('COURRIEL_ASSISTANCE_INFO');
  270.                     if ((is_countable($mail_ass_info) ? count($mail_ass_info) : 0) > 0)
  271.                         $mail_contact $mail_ass_info[0]->getTexte();
  272.                     $linkUpdatePwd 'reinitialize';
  273.                     $email = (new Email())
  274.                         ->from('cts-web.assistance@sports.gouv.fr')
  275.                         ->to($email)
  276.                         ->subject('CTS-WEB : Identifiant perdu')
  277.                         ->html($this->twig->render(
  278.                             'Security/email_retreive_login.html.twig',
  279.                             ['host' => $host'from' => $mail_contact'linkUpdatePwd' => $linkUpdatePwd'username' => $result['message']]
  280.                         ));
  281.                     $this->mailer->send($email);
  282.                     $info "Un courriel vous a été envoyé pour réinitialiser votre mot de passe. En cas de difficulté, veuillez contacter la direction des sports, centre de gestion opérationnelle des CTS.";
  283.                 } catch (\Exception) {
  284.                     $error "Erreur lors de l'envoi du mail";
  285.                 }
  286.             } else {
  287.                 $error $result['message'];
  288.             }
  289.         }
  290.         $content $this->twig->render(
  291.             'Security/retrieve_login.html.twig',
  292.             ['form' => $form->createView(), 'error' => $error'info' => $info'version' => $this->getParameter('version')]
  293.         );
  294.         return new Response($content);
  295.     }
  296.     #[Route(path'/login_check'name'login_check')]
  297.     public function check(): never
  298.     {
  299.         throw new \RuntimeException('You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.');
  300.     }
  301.     #[Route(path'/logout'name'logout'methods: ['GET'])]
  302.     public function logout(): never
  303.     {
  304.         throw new \RuntimeException('You must activate the logout in your security firewall configuration.');
  305.     }
  306.     #[Route(path'/api/isConnected'name'ctsweb_is_connected')]
  307.     public function isConnected()
  308.     {
  309.         try {
  310.             $user $this->getUser();
  311.             if (is_null($user) || is_null($user->getIdUtilisateur())) {
  312.                 return new JsonResponse(
  313.                     ['success' => true'isConnected' => false]
  314.                 );
  315.             }
  316.             return new JsonResponse(
  317.                 ['success' => true'isConnected' => true]
  318.             );
  319.         } catch (\Exception $e) {
  320.             return new JsonResponse(
  321.                 ['success' => false'data' => $e->getMessage()]
  322.             );
  323.         }
  324.     }
  325. }