src/Controller/AuthentificationController.php line 86

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\utilisateur\UtilisateurProfil;
  4. use App\Entity\utilisateur\Utilisateurs;
  5. use App\Form\administration\ResetMdpFormType;
  6. use App\Form\AuthentificationFormType;
  7. use App\Form\ForgetFormType;
  8. use App\Form\ResetFormType;
  9. use App\Form\CreatePasswordFormType;
  10. use App\Helpers\Helpers;
  11. use App\Repository\administration\UtilisateurSocieteRepository;
  12. use App\Repository\administration\UtilisateursRepository;
  13. use App\Repository\Utilisateur\UtilisateurSocieteAssociationRepository;
  14. use Doctrine\ORM\Mapping as ORM;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Bundle\FrameworkBundle\Translation\Translator;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  24. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  25. use Symfony\Contracts\Translation\TranslatorInterface;
  26. use Symfony\Component\Mailer\MailerInterface;
  27. use Symfony\Component\Mime\Email;
  28. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  29. use Symfony\Component\Security\Csrf\CsrfToken;
  30. class AuthentificationController extends AbstractController
  31. {
  32.     /**
  33.      * @ORM\Column(type="string")
  34.      */
  35.     private $objectManager;
  36.     public function __construct(EntityManagerInterface $objectManager) {
  37.         $this->objectManager $objectManager;
  38.     }
  39.     public function setConnectionSessions($res$utilisateur$utilisateurSocieteAssociation$repository)
  40.     {
  41.         $token = new UsernamePasswordToken($resnull'main'$utilisateur->getRoles());
  42.         $this->get('security.token_storage')->setToken($token);
  43.         $this->get('session')->set('_security_main'serialize($token));
  44.         $utilisateurProfil = new UtilisateurProfil($res->getFkUtilisateurProfil()->getIdUtilisateurProfil(),$res->getFkUtilisateurProfil()->getLibelle());
  45.         $this->get('session')->set('profil'$res->getFkUtilisateurProfil());
  46.         $this->get('session')->set('societe'$res->getFkUtilisateurSociete());
  47.         $arrayListeSocieteAssocie = [$res->getFkUtilisateurSociete()->getIdUtilisateurSociete()];
  48.         $listeSocieteAssocie $utilisateurSocieteAssociation->findByFkUtilisateurSocieteIdParent($res->getFkUtilisateurSociete()->getIdUtilisateurSociete());
  49.         foreach($listeSocieteAssocie as $associe){
  50.             $arrayListeSocieteAssocie[] = $associe->getFkUtilisateurSocieteId()->getIdUtilisateurSociete();
  51.         }
  52.         $this->get('session')->set('ListeDeSesSociete'$arrayListeSocieteAssocie);
  53.         $menu $repository->getUtilisateurMenu($res->getIdUtilisateur(),$utilisateurProfil->getIdUtilisateurProfil());
  54.         $this->get('session')->set('menu',$menu);
  55.         $this->get('session')->set('user',$res->getIdUtilisateur());
  56.         $this->get('session')->set('accesMemo'$res->getAccesMemo());
  57.         $this->get('session')->set('accesElium'$res->getAccesElium());
  58.     }
  59.     /**
  60.      * @Route("/{_locale<%app.supported_locales%>}/login", name="login")
  61.      * @param Request $request
  62.      * @param UtilisateursRepository $repository
  63.      * @param TranslatorInterface $translator
  64.      * @param UtilisateurSocieteAssociationRepository $utilisateurSocieteAssociation
  65.      * @return Response
  66.      * @throws \Doctrine\DBAL\Driver\Exception
  67.      * @throws \Doctrine\DBAL\Exception
  68.      */
  69.     public function authentification(Request $requestUtilisateursRepository $repository,TranslatorInterface $translator,
  70.                                      UtilisateurSocieteAssociationRepository $utilisateurSocieteAssociation) : Response
  71.     {
  72.         $session $request->getSession();
  73.         $em $this->getDoctrine()->getManager();
  74.         $remainingAttemps 3;
  75.         if ($session->has('societe')) {
  76.             return $this->redirectToRoute('index');
  77.         }
  78.         $utilisateur = new Utilisateurs();
  79.         $form $this->createForm(AuthentificationFormType::class, $utilisateur);
  80.         $form->handleRequest($request);
  81.         if ($form->isSubmitted() && $form->isValid()) {
  82.             $resLogin $repository->logIn($utilisateur);
  83.             $res $resLogin[0];
  84.             $firstConnection $resLogin[1];
  85.             if ($firstConnection == true) {
  86.                 $this->get('session')->set('userTmp'$res);
  87.                 $this->getLog($request1$firstConnection true);
  88.                 return $this->redirectToRoute('reset_mdp');
  89.             } else if ($res) {
  90.                 $this->setConnectionSessions($res$utilisateur$utilisateurSocieteAssociation$repository);
  91.                 $res->setNbEssaiAvantBloquage(3);
  92.                 $em->persist($res);
  93.                 $em->flush();
  94.                 $this->getLog($request1);
  95.                 return $this->redirectToRoute('index');
  96.             } elseif ($form->isSubmitted()) {
  97.                 $userByLogin $repository->findOneBy(['identifiant' => $utilisateur->getIdentifiant()]);
  98.                 if (!empty($userByLogin)) {
  99.                     $this->getLog($request0);
  100.                     if (!empty($userByLogin) && $userByLogin->getIsVerified()) {
  101.                         $nbrEssay $userByLogin->getNbEssaiAvantBloquage();
  102.                         $remainingAttemps $nbrEssay;
  103.                         if ($nbrEssay 0) {
  104.                             $userByLogin->setNbEssaiAvantBloquage($nbrEssay 1);
  105.                             if (($nbrEssay 1) == 0) {
  106.                                 $userByLogin->setCompteDesactive(true);
  107.                             }
  108.                             $em->persist($userByLogin);
  109.                             $em->flush();
  110.                             $remainingAttemps $userByLogin->getNbEssaiAvantBloquage();
  111.                         }
  112.                         if ($userByLogin->getNbEssaiAvantBloquage() == 0) {
  113.                             $this->addFlash('danger'$translator->trans('desactivecompte.notification'));
  114.                         } else {
  115.                             if ($remainingAttemps 3) {
  116.                                 $this->addFlash('danger'$translator->trans('message.error_auth'));
  117.                                 return $this->render('authentification/index.html.twig', [
  118.                                     'form' => $form->createView(),
  119.                                     'remainingAttempts' => $remainingAttemps,
  120.                                     'accountActivated' => true,
  121.                                 ]);
  122.                             }
  123.                         }
  124.                     } else if (!empty($userByLogin) && !$userByLogin->getIsVerified()) {
  125.                         $this->addFlash('danger'$translator->trans('message.account-not-activated'));
  126.                         return $this->render('authentification/index.html.twig', [
  127.                             'form' => $form->createView(),
  128.                             'remainingAttempts' => null,
  129.                             'accountActivated' => false,
  130.                         ]);
  131.                     } else {
  132.                         $this->addFlash('danger'$translator->trans('message.error_auth'));
  133.                         return $this->render('authentification/index.html.twig', [
  134.                             'form' => $form->createView(),
  135.                             'remainingAttempts' => null,
  136.                             'accountActivated' => null,
  137.                         ]);
  138.                     }
  139.                 }
  140.             }
  141.         }
  142.         return $this->render('authentification/index.html.twig', [
  143.             'form' => $form->createView(),
  144.             'remainingAttempts' => $remainingAttemps,
  145.             'accountActivated' => null,
  146.         ]);
  147.     }
  148.     /**
  149.      * @Route("/{_locale<%app.supported_locales%>}/logout", name="app_logout", methods={"GET"})
  150.      */
  151.     public function logout()
  152.     {
  153.     }
  154.     /**
  155.      * @Route("/{_locale<%app.supported_locales%>}/forget", name="forget")
  156.      * @param Request $request
  157.      * @param UtilisateursRepository $repository
  158.      * @param TranslatorInterface $translator
  159.      * @param MailerInterface $mailer
  160.      * @return Response
  161.      */
  162.     public function forget(Request $requestUtilisateursRepository $repository,TranslatorInterface $translatorMailerInterface $mailer) : Response
  163.     {
  164.         $utilisateur = new Utilisateurs();
  165.         $form $this->createForm(ForgetFormType::class, $utilisateur);
  166.         $form->handleRequest($request);
  167.         if ($form->isSubmitted() && $form->isValid()) {
  168.             $res $repository->findOneBy(['mail' => $utilisateur->getMail()]);
  169.             if($res && $res->getIsVerified()) {
  170.                 $t $res->getIdUtilisateur().'|'.date('Y-m-d H:i');
  171.                 $t strtr(base64_encode(addslashes(serialize($t))), '+/=''-_,');
  172.                 $lien $_SERVER["SERVER_NAME"]."/".$request->getLocale()."/reset?t=".$t;
  173.                 $message = new Email();
  174.                 $message->from($_ENV['MAILER_SENDER']);
  175.                 $message->to($utilisateur->getMail());
  176.                 $message->subject($translator->trans('mail.objet.forget',[],'mail+intl-icu'));
  177.                 $corps $translator->trans('mail.forget',['%lien%' =>  $lien],'mail+intl-icu');
  178.                 $corps utf8_decode(str_replace('%lien%',$lien,$corps));
  179.                 $message->html($corps,'text/html','UTF-8');
  180.                 try{
  181.                     $mailer->send($message);
  182.                     $this->addFlash('success'$translator->trans('message.forgetsuccess'));
  183.                 } catch (TransportExceptionInterface $e) {
  184.                     $this->addFlash('danger'$translator->trans('message.forgeterror'));
  185.                 }
  186.             } else if ($res && !$res->getIsVerified()) {
  187.                 $this->addFlash('danger'$translator->trans('message.account-not-activated'));
  188.             } else {
  189.                 $this->addFlash('danger'$translator->trans('message.forgeterror'));
  190.             }
  191.         }
  192.         return $this->render('authentification/forget.html.twig', ['form' => $form->createView()]);
  193.     }
  194.     /**
  195.      * @Route("/{_locale<%app.supported_locales%>}/reset", name="reset")
  196.      * @param Request $request
  197.      * @param TranslatorInterface $translator
  198.      * @return Response
  199.      */
  200.     public function reset(Request $requestHelpers $helpersTranslatorInterface $translator) : Response
  201.     {
  202.         if(empty($_GET['t'])){
  203.             return $this->redirectToRoute('login');
  204.         } else {
  205.             $t explode('|',unserialize(stripslashes(base64_decode(strtr($_GET['t'], '-_,','+/=')))));
  206.             $id $t[0];
  207.             $date $t[1];
  208.             if((strtotime(date('Y-m-d H:i')) - strtotime($date))/ 60 60){
  209.                 throw new AccessDeniedException('');
  210.             } else {
  211.                 $utilisateur = new Utilisateurs();
  212.                 $utilisateur->setIdUtilisateur($id);
  213.                 $form $this->createForm(ResetFormType::class, $utilisateur);
  214.                 $form->handleRequest($request);
  215.                 if($form->isSubmitted() && $form->isValid()) {
  216.                     $resetMdpForm $request->get('reset_form');
  217.                     //Si le mot de passe est valide
  218.                     $validationMdp $helpers->checkMdp(null$resetMdpForm['newmotdepasse'], $resetMdpForm['confirmmotdepasse'], 14false);
  219.                     if($validationMdp) {
  220.                         $entityManager $this->getDoctrine()->getManager();
  221.                         $utilisateur $entityManager->getRepository(Utilisateurs::class)->find($form->get('idUtilisateur')->getData());
  222.                         $utilisateur->setMotDePasse(sha1($form->get('confirmmotdepasse')->getData()));
  223.                         $entityManager->flush();
  224.                         return $this->redirectToRoute('login');
  225.                     }
  226.                     else {
  227.                         $this->addFlash('danger'$translator->trans('message.error_auth'));
  228.                     }
  229.                 }
  230.                 return $this->render('authentification/reset.html.twig', ['form' => $form->createView()]);
  231.             }
  232.         }
  233.     }
  234.     /**
  235.      * Méthode pour reset mdp 1er connexion
  236.      *
  237.      * @Route("/{_locale<%app.supported_locales%>}/reset_mdp", name="reset_mdp")
  238.      */
  239.     public function resetMdp(Request $requestHelpers $helpersTranslatorInterface $translatorUtilisateursRepository $utilisateurRepoUtilisateurSocieteAssociationRepository $utilisateurSocieteAssociationRepoUtilisateurSocieteRepository $utilisateurSocieteRepo)
  240.     {
  241.         $dateConnexion = new \DateTime();
  242.         $em $this->getDoctrine()->getManager();
  243.         $form $this->createForm(ResetMdpFormType::class);
  244.         $form->handleRequest($request);
  245.         //Si pas de connexion, mais accès direct via l'URL, on fait une redirection vers la page de login
  246.         if(empty($this->get('session')->get('userTmp'))) {
  247.             return $this->redirectToRoute('login');
  248.         }
  249.         if ($form->isSubmitted()) {
  250.             $resetMdpForm $request->get('reset_mdp_form');
  251.             //Si le mot de passe est valide
  252.             $validationMdp $helpers->checkMdp($resetMdpForm['identifiant'], $resetMdpForm['motdepasse'], $resetMdpForm['motdepasse2'], 14);
  253.             if($validationMdp) {
  254.                 $userTmp $this->get('session')->get('userTmp');
  255.                 $user $utilisateurRepo->findOneBy(['idUtilisateur' => $userTmp->getIdUtilisateur()]);
  256.                 $user->setIdentifiant($resetMdpForm['identifiant']);
  257.                 $user->setMail($resetMdpForm['identifiant']);
  258.                 $user->setMotDePasse(sha1($resetMdpForm['motdepasse']));
  259.                 $user->setDerniereConnexion($dateConnexion);
  260.                 $user->setAncienMotDePasse(NULL);
  261.                 $em->persist($user);
  262.                 $em->flush();
  263.                 //Création tous les sessions de connexion
  264.                 $utilisateur = new Utilisateurs();
  265.                 $this->setConnectionSessions($user$utilisateur$utilisateurSocieteAssociationRepo$utilisateurRepo);
  266.                 return $this->redirectToRoute('index');
  267.             }
  268.             else {
  269.                 $this->addFlash('danger'$translator->trans('message.error_auth'));
  270.             }
  271.         }
  272.         return $this->render('authentification/reset_mdp.html.twig', ['form' => $form->createView()]);
  273.     }
  274.     /**
  275.      * @Route("/{_locale<%app.supported_locales%>}/create_password", name="create_password")
  276.      * @param Request $request
  277.      * @param TranslatorInterface $translator
  278.      * @return Response
  279.      */
  280.     public function createPassword(Request $requestHelpers $helpersTranslatorInterface $translator,
  281.                                    UtilisateursRepository $utilisateurRepo,
  282.                                    CsrfTokenManagerInterface $csrfTokenManager) : Response
  283.     {
  284.         if (empty($_GET['t'])) {
  285.             return $this->redirectToRoute('login');
  286.         } else {
  287.             $t explode('|'unserialize(stripslashes(base64_decode(strtr($_GET['t'], '-_,''+/=')))));
  288.             $id $t[0];
  289.             $date $t[1];
  290.             if ((strtotime(date('Y-m-d H:i')) - strtotime($date)) / 60 60) {
  291.                 throw new AccessDeniedException('');
  292.             } else {
  293.                 $utilisateur = new Utilisateurs();
  294.                 $utilisateur->setIdUtilisateur($id);
  295.                 $form $this->createForm(CreatePasswordFormType::class, $utilisateur);
  296.                 $form->handleRequest($request);
  297.                 if($form->isSubmitted() && $form->isValid()) {
  298.                     $submittedToken $request->request->get('create_password_form')['_token'] ?? null;
  299.                     if (!$csrfTokenManager->isTokenValid(new CsrfToken('task_item'$submittedToken))) {
  300.                         throw $this->createAccessDeniedException('Invalid CSRF token.');
  301.                     }
  302.                     $createPasswordForm $request->get('create_password_form');
  303.                     $validationMdp $helpers->checkMdp($createPasswordForm['identifiant'], $createPasswordForm['newmotdepasse'], $createPasswordForm['confirmmotdepasse'], 14);
  304.                     if ($validationMdp) {
  305.                         $em $this->getDoctrine()->getManager();
  306.                         $utilisateur $em->getRepository(Utilisateurs::class)->find($form->get('idUtilisateur')->getData());
  307.                         if ($form->get('identifiant')->getData() == $utilisateur->getIdentifiant()) {
  308.                             $utilisateur->setMotDePasse(sha1($form->get('confirmmotdepasse')->getData()));
  309.                             $utilisateur->setIsVerified(1);
  310.                             $em->flush();
  311.                             return $this->redirectToRoute('login');
  312.                         }
  313.                         else {
  314.                             $this->addFlash('danger'$translator->trans('message.error_auth'));
  315.                         }
  316.                     }
  317.                     else {
  318.                         $this->addFlash('danger'$translator->trans('message.error_auth'));
  319.                     }
  320.                 }
  321.             }
  322.             return $this->render('authentification/create_password.html.twig', ['form' => $form->createView()]);
  323.         }
  324.     }
  325.     public function getLog($requestint $Statusbool $firstConnection=false) {
  326.         if ($firstConnection) {
  327.             $LogAction 'First connection';
  328.         }
  329.         else {
  330.             $LogAction 'Login attempt';
  331.         }
  332.         if ($Status != 0) {
  333.             $LogStatus 'Success';
  334.         }
  335.         else {
  336.             $LogStatus 'Failed';
  337.         }
  338.         $userIp $request->getClientIp();
  339.         $userIdentifiant $request->request->get('authentification_form')['identifiant'];
  340.         $userPassword sha1($request->request->get('authentification_form')['motdepasse']);
  341.         $date date('d-m-Y');
  342.         $month date('F');
  343.         $year date('Y');
  344.         $dateLog date('d-m-Y');
  345.         $timeLog date('H-i-s');
  346.         // create folder if not exist
  347.         if (!file_exists($this->getParameter('kernel.project_dir') . '/public/works/logs/connection_attempts_logs/' $month $year)) {
  348.             mkdir($this->getParameter('kernel.project_dir') . '/public/works/logs/connection_attempts_logs/' $month $year0755true);
  349.         }
  350.         $log fopen($this->getParameter('kernel.project_dir') . '/public/works/logs/connection_attempts_logs/' $month $year .'/connection-log-'$date '.txt''a+');
  351.         fwrite($log,
  352.             "\n" .
  353.             '************** ' $LogAction ' **************' "\n" .
  354.             'IP address :' $userIp "\n" .
  355.             'Status: ' $LogStatus "\n" .
  356.             'Login: ' $userIdentifiant "\n" .
  357.             'Password: ' $userPassword "\n" .
  358.             'On the : ' $dateLog ' at ' $timeLog "\n" .
  359.             '******************************************' "\n");
  360.         fclose($log);
  361.     }
  362. }