src/Controller/ResetPasswordController.php line 52

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Form\ChangePasswordFormType;
  5. use App\Form\ResetPasswordRequestFormType;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Mailer\MailerInterface;
  12. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use App\Repository\CategorieRepository;
  15. use App\Repository\UserRepository;
  16. use Psr\Log\LoggerInterface;
  17. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  18. use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
  19. use Symfony\Component\Mime\Email;
  20. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  21. use Symfony\Component\Form\FormBuilderInterface;
  22. use Symfony\Component\Form\AbstractType;
  23. use Symfony\Component\Validator\Constraints as Assert;
  24. use Symfony\Component\Validator\Validator\ValidatorInterface;
  25. use SymfonyCasts\Bundle\ResetPassword\ResetPasswordHelperInterface;
  26. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  27. #[Route('/reset-password')]
  28. class ResetPasswordController extends AbstractController
  29. {
  30.     private EntityManagerInterface $entityManager;
  31.     private LoggerInterface $logger;
  32.     private SessionInterface $session;
  33.     private $validator;
  34.     private CategorieRepository $categorieRepository;
  35.     public function __construct(ValidatorInterface $validator,EntityManagerInterface $entityManagerLoggerInterface $logger,CategorieRepository $categorieRepository,  SessionInterface $session)
  36.     {
  37.         $this->entityManager $entityManager;
  38.         $this->logger $logger;
  39.         $this->session $session;
  40.         $this->validator $validator;
  41.         $this->categorieRepository $categorieRepository;
  42.     }
  43.     #[Route('/password/request'name'app_password_request')]
  44.     public function request(ValidatorInterface $validator,Request $request,UserRepository $userRepositorySessionInterface $session,TokenGeneratorInterface $tokenGeneratorCategorieRepository $categorieRepositoryMailerInterface $mailer): Response
  45.     {
  46.         $categories $categorieRepository->findAll();
  47.         if ($request->isMethod('POST')) {
  48.             $email $request->request->get('email');
  49.     
  50.            /*   // Validation de l'email
  51.         if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  52.             $this->addFlash('error', 'Invalid email address.');
  53.             return $this->render('reset_password/request.html.twig');
  54.         }*/
  55.         $user $userRepository->findOneBy(['email' => $email]);
  56.         if ($user) {
  57.             $token $tokenGenerator->generateToken();
  58.             $expiresAt = (new \DateTime())->modify('+1 hour'); // Token expires in 1 hour
  59.             // Stocker le token et la date d'expiration dans la session
  60.             $session->set('password_reset_token', [
  61.                 'token' => $token,
  62.                 'expires_at' => $expiresAt->format('Y-m-d H:i:s'),
  63.                 'user_id' => $user->getId(),
  64.             ]);
  65.             $resetUrl $this->generateUrl('app_reset_password', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
  66.             $emailMessage = (new Email())
  67.                 ->from('your_email@gmail.com')
  68.                 ->to($user->getEmail())
  69.                 ->subject('Password Reset Request')
  70.                 ->html('<p>To reset your password, please visit <a href="' $resetUrl '">this link</a></p>');
  71.             $mailer->send($emailMessage);
  72.             $this->addFlash('success''An email has been sent with instructions to reset your password.');
  73.             return $this->redirectToRoute('app_check_email');
  74.         }
  75.     
  76.             $this->addFlash('error''No user found with this email address.');
  77.         }
  78.         return $this->render('reset_password/request.html.twig', [
  79.             'categories' => $categories,
  80.         ]);
  81.     }
  82.     #[Route('/reset/{token}'name'app_reset_password')]
  83.     public function reset(Request $request,SessionInterface $session,string $token,UserRepository $userRepository,CategorieRepository $categorieRepository,EntityManagerInterface $entityManagerUserPasswordHasherInterface $passwordHasher): Response
  84.     {
  85.         $categories $categorieRepository->findAll();
  86.         
  87.         $storedToken $session->get('password_reset_token');
  88.         $userId $session->get('password_reset_user');
  89.         if (!$storedToken || $storedToken['token'] !== $token || new \DateTime() > new \DateTime($storedToken['expires_at'])) {
  90.             $this->addFlash('error''The token is invalid or has expired.');
  91.             return $this->redirectToRoute('app_password_request');
  92.         }
  93.     
  94.         $user $userRepository->find($storedToken['user_id']);
  95.     
  96.         if (!$user) {
  97.             $this->addFlash('error''No user found.');
  98.             return $this->redirectToRoute('app_password_request');
  99.         }
  100.     
  101.         if ($request->isMethod('POST')) {
  102.             $newPassword $request->request->get('password');
  103.             $user->setPassword($passwordHasher->hashPassword($user$newPassword));
  104.     
  105.             $this->entityManager->persist($user);
  106.             $this->entityManager->flush();
  107.     
  108.             // Clear session after successful password reset
  109.             $session->remove('password_reset_token');
  110.     
  111.             $this->addFlash('success''Password successfully reset.');
  112.             return $this->redirectToRoute('app_check_email');
  113.         }
  114.         return $this->render('reset_password/reset.html.twig', [
  115.             'token' => $token,
  116.             'categories' => $categories,
  117.         ]);
  118.     }
  119.     
  120.     #[Route('/process'name'process_reset_password')]
  121.     public function processSendingPasswordResetEmail(CategorieRepository $categorieRepository,Request $requestMailerInterface $mailer): RedirectResponse
  122.     {
  123.         $categories $categorieRepository->findAll();
  124.         $emailFormData $request->request->get('reset_password_request_form')['email'];
  125.         $user $this->entityManager->getRepository(User::class)->findOneBy(['email' => $emailFormData]);
  126.         if (!$user) {
  127.             $this->addFlash('error''Aucun utilisateur trouvĂ© avec cet e-mail.');
  128.             return $this->redirectToRoute('app_forgot_password_request');
  129.         }
  130.         // Stockez l'email dans la session
  131.         $this->get('session')->set('reset_password_email'$emailFormData);
  132.         return $this->redirectToRoute('app_reset_password');
  133.     }
  134.     #[Route('/reset-password/check-email'name'app_check_email')]
  135.     public function checkEmail(CategorieRepository $categorieRepository): Response
  136.     {
  137.         $categories $categorieRepository->findAll();
  138.         return $this->render('reset_password/check_email.html.twig', [
  139.             'categories' => $categories,
  140.         ]);
  141.     }
  142.     
  143. }