src/Controller/ForgetPasswordController.php line 79

Open in your IDE?
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: mint
  5. * Date: 11/11/19
  6. * Time: 08:01
  7. */
  8. namespace App\Controller;
  9. use App\Entity\ResetPassword;
  10. use App\Form\ForgotPasswordType;
  11. use App\Form\PasswordUserUpdateType;
  12. use App\Notification\EmailNotification;
  13. use App\Repository\ResetPasswordRepository;
  14. use App\Repository\UserRepository;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  20. class ForgetPasswordController extends AbstractController
  21. {
  22. /**
  23. * @Route("/forgot", name="forgot_password")
  24. */
  25. public function forgotPasswordRequest(Request $request, EmailNotification $emailNotification, EntityManagerInterface $em, UserRepository $userRepository)
  26. {
  27. $resetPassword = new ResetPassword();
  28. $form = $this->createForm(ForgotPasswordType::class, $resetPassword);
  29. $form->handleRequest($request);
  30. if ($form->isSubmitted() && $form->isValid()) {
  31. $formData = $form->getData();
  32. $email = $formData->getEmail();
  33. $user = $userRepository->findOneBy([
  34. 'email' => $email
  35. ]);
  36. if($user){
  37. //enregistrer ici dans la table ResetPassword et envoyer le mail
  38. $lang = $user->getLanguage();
  39. $now = new \DateTimeImmutable();
  40. $expireAt = $now->add(new \DateInterval("PT1H"));
  41. $token = $this->generateToken();
  42. $resetPassword->setEmail($email)
  43. ->setCreateAt($now)
  44. ->setToken($token)
  45. ->setEndAt($expireAt)
  46. ;
  47. $em->persist($resetPassword);
  48. $em->flush();
  49. $emailNotification->forgotPasswordLink($email, $token, $lang);
  50. $this->addFlash('success', 'Un email vous a été envoyé pour modifier votre mot de passe, merci de le consulter rapidement, le lien est valable UNE heure seulement');
  51. return $this->redirectToRoute('forgot_password');
  52. }else{
  53. $this->addFlash('error', 'Aucun utilisateur inscrit avec cette adresse email');
  54. return $this->redirectToRoute('forgot_password');
  55. }
  56. }
  57. return $this->render('pages/forgot.html.twig', [
  58. 'form' => $form->createView(),
  59. ]);
  60. }
  61. /**
  62. * @Route("/reset/{email}/{token}", name="reset_password_from_email")
  63. */
  64. public function forgotPasswordResponseToTheLink($email, $token, Request $request, UserRepository $userRepository, ResetPasswordRepository $resetPasswordRepository, UserPasswordEncoderInterface $passwordEncoder,EntityManagerInterface $em, EmailNotification $emailNotification)
  65. {
  66. $existingToken = $resetPasswordRepository->findOneBy([
  67. 'token' => $token
  68. ]);
  69. $now = new \DateTimeImmutable();
  70. if($existingToken and $existingToken->getEndAt() > $now ){
  71. //changer le MDP ICI
  72. $user = $userRepository->findOneBy([
  73. 'email' => $email,
  74. ]);
  75. $form = $this->createForm(PasswordUserUpdateType::class, $user);
  76. $form->handleRequest($request);
  77. if ($form->isSubmitted() && $form->isValid()) {
  78. $formData = $form->getData();
  79. $newPassword = $formData->getPassword();
  80. $encodedPassword = $passwordEncoder->encodePassword($user,$newPassword);
  81. $user->setPassword($encodedPassword);
  82. $em->persist($user);
  83. $em->remove($existingToken);
  84. $em->flush();
  85. $lang = $user->getLanguage();
  86. $emailNotification->forgotPasswordOk($email, $lang);
  87. $this->addFlash('success', 'Votre mot de passe a bien été modifié, vous pouvez vous connecter');
  88. return $this->redirectToRoute('app_login');
  89. }
  90. return $this->render('pages/reset.html.twig', [
  91. 'form' => $form->createView(),
  92. ]);
  93. }else{
  94. if($existingToken) {
  95. $em->remove($existingToken);
  96. $em->flush();
  97. }
  98. $this->addFlash('error', 'Cette demande a expiré ou n\'existe pas, veuillez en refaire la demande');
  99. return $this->redirectToRoute('forgot_password');
  100. }
  101. }
  102. public function generateToken()
  103. {
  104. //Generate a random string.
  105. $token = openssl_random_pseudo_bytes(16);
  106. //Convert the binary data into hexadecimal representation.
  107. $token = bin2hex($token);
  108. return $token;
  109. }
  110. }