src/Controller/SecurityController.php line 30

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\EmailEnvoi;
  4. use App\Entity\User;
  5. use Doctrine\Persistence\ManagerRegistry;
  6. use Doctrine\Persistence\ObjectManager;
  7. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  12. use Symfony\Component\Mailer\MailerInterface;
  13. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  14. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  15. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  16. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  17. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  18. class SecurityController extends AbstractController
  19. {
  20.     private ObjectManager $em;
  21.     public function __construct(ManagerRegistry $doctrine)
  22.     {
  23.         $this->em = $doctrine->getManager();
  24.     }
  25.     public function connexion(AuthenticationUtils $authenticationUtils): Response
  26.     {
  27.         $error = null;
  28.         if ($this->getUser()) {
  29.             return $this->redirectToRoute('homepage');
  30.         }
  31.         // get the login error if there is one
  32.         if($authenticationUtils->getLastAuthenticationError())
  33.         {
  34.             $error = "La connexion a échouée, merci de réessayer.";
  35.         }
  36.         // last username entered by the user
  37.         $lastUsername = $authenticationUtils->getLastUsername();
  38.         return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error, 'captcha_site_key' => $this->getParameter('captcha_site_key')]);
  39.     }
  40.     public function motDePassePerdu(Request $request, MailerInterface $mailer, TokenGeneratorInterface $tokenGenerator): Response
  41.     {
  42.         if ($request->isMethod('POST')) {
  43.             $secret = $this->getParameter('captcha_secret_key');
  44.             $verifyResponse = file_get_contents('https://hcaptcha.com/siteverify?secret=' . $secret . '&response=' . $request->request->get('h-captcha-response') . '&remoteip=' . $_SERVER['REMOTE_ADDR']);
  45.             $responseData = json_decode($verifyResponse);
  46.             if (!$responseData->success) {
  47.                 throw new CustomUserMessageAuthenticationException('Vous devez valider le captcha pour recevoir un nouveau mot de passe.');
  48.             }
  49.             $email = $request->request->get('email');
  50.             $user = $this->em->getRepository(User::class)->findOneBy(['email'=>$email]);
  51.             if ($user) {
  52.                 $this->sendResetPasswordMail($mailer, $tokenGenerator, $user);
  53.             }
  54.             $this->addFlash('info', 'Si cet email est lié à un compte, vous recevrez un email pour réinitialiser votre mot de passe');
  55.             return $this->redirectToRoute('app_password_lost');
  56.         }
  57.         return $this->render('security/password_lost.html.twig', ['captcha_site_key' => $this->getParameter('captcha_site_key')]);
  58.     }
  59.     public function sendResetPasswordMail($mailer, $tokenGenerator, $user)
  60.     {
  61.         $token = $tokenGenerator->generateToken();
  62.         try{
  63.             $user->setResetToken($token);
  64.             $this->em->flush();
  65.         } catch (\Exception $e) {
  66.             $this->addFlash('warning', $e->getMessage());
  67.             return $this->redirectToRoute('homepage');
  68.         }
  69.         $url = $this->generateUrl('app_reset_password', array('token' => $token), UrlGeneratorInterface::ABSOLUTE_URL);
  70.         $expediteur = $this->getParameter('adresse_mail_default');
  71.         $emailExp = $this->em->getRepository(EmailEnvoi::class)->findOneBy([]);
  72.         if($emailExp){
  73.             $expediteur = $emailExp->getEmail();
  74.         }
  75.         $mail = (new TemplatedEmail())
  76.             ->from($expediteur)
  77.             ->to($user->getEmail())
  78.             ->subject('Réinitialisation de mot de passe')
  79.             ->htmlTemplate('security/template_mail.html.twig')
  80.             // pass variables (name => value) to the template
  81.             ->context([
  82.                 'url' => $url,
  83.                 'user' => $user,
  84.             ]);
  85.         try {
  86.             $mailer->send($mail);
  87.             return true;
  88.         }
  89.         catch (TransportExceptionInterface $exception){
  90.             throw new ($exception);
  91.         }
  92.     }
  93.     public function reinitialisationMotDePasse(Request $request, string $token, UserPasswordHasherInterface $passwordEncoder): Response
  94.     {
  95.         $user = $this->em->getRepository(User::class)->findOneBy(['resetToken'=>$token]);
  96.         if ($user === null) {
  97.             $this->addFlash('danger', 'La demande a expirée ! Veuillez renouveller la procédure.');
  98.             return $this->redirectToRoute('homepage');
  99.         }
  100.         //Reset avec le mail envoyé
  101.         if ($request->isMethod('POST')) {
  102.             $uppercase = preg_match('@[A-Z]@', $_POST['password']);
  103.             $lowercase = preg_match('@[a-z]@', $_POST['password']);
  104.             $number    = preg_match('@[0-9]@', $_POST['password']);
  105.             $char    = preg_match('/[\/~`\!@#\$%\^&\*\(\)_\-\+=\{\}\[\]\|;:\<\>,\.\?]/', $_POST['password']);
  106.             if(!$uppercase || !$lowercase || !$number || !$char || strlen($_POST['password']) < 12) {
  107.                 $request->getSession()->getFlashBag()->add('danger',"Le mot de passe ne respecte pas les conditions demandées ( au moins 1 minuscule, 1 majuscule, 1 chiffre, 1 caractère spécial et minimum 12 caractères )");
  108.                 return $this->redirectToRoute('app_reset_password',['token'=>$token]);
  109.             }
  110.             if($_POST['password'] != $_POST['confirm-password']){
  111.                 $request->getSession()->getFlashBag()->add('danger',"Les mots de passe doivent être identiques.");
  112.                 return $this->redirectToRoute('app_reset_password',['token'=>$token]);
  113.             }
  114.             $user->setResetToken(null);
  115.             $user->setPassword($passwordEncoder->hashPassword($user, $request->request->get('password')));
  116.             $this->em->flush();
  117.             $this->addFlash('success', 'Mot de passe mis à jour !');
  118.             return $this->redirectToRoute('app_login');
  119.         }
  120.         return $this->render('security/reset_password.html.twig', ['token' => $token]);
  121.     }
  122. }