src/UserBundle/Controller/ResettingController.php line 29

Open in your IDE?
  1. <?php
  2. // src/Controller/SecurityController.php
  3. namespace App\UserBundle\Controller;
  4. use App\Controller\Traits\GenericTrait;
  5. use App\Entity\User;
  6. use App\UserBundle\Events\ResettingPasswordEvent;
  7. use App\UserBundle\Form\ResettingType;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpFoundation\Session\Session;
  12. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Contracts\Service\Attribute\Required;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. class ResettingController extends AbstractController
  19. {
  20.     use GenericTrait;
  21.     #[Required]
  22.     public  EventDispatcherInterface $eventDispatcher;
  23.     #[Route("/request"name"resetting_request")]
  24.     public function request(
  25.         Request $request,
  26.         EntityManagerInterface $em,
  27.         TranslatorInterface $translator
  28.     ): Response
  29.     {
  30.         $session = new Session();
  31.         if($request->getMethod() == 'POST'){
  32.             $username $request->request->get('_username');
  33.             $user $em->getRepository(User::class)->findUserByUsernameOrEmail($username);
  34.             if(!empty($user) && $user instanceof User){
  35.                 /**
  36.                  * @var User $user
  37.                  */
  38.                 if($user->getPasswordRequestedAt() !== null){
  39.                     if($user->getPasswordRequestedAt()->getTimestamp() + $this->getParameter('retry_ttl') > time()){
  40.                         $session->getFlashBag()->add('warning'$translator->trans('resetting.ttl_not_reached',['%duration%' => $this->getParameter('retry_ttl')],'userbundle'));
  41.                         return $this->redirectToRoute('resetting_request');
  42.                     }
  43.                 }
  44.                 $user->setPasswordRequestedAt(new \DateTime('now'));
  45.                 $token md5(random_bytes(100));
  46.                 $user->setConfirmationToken($token);
  47.                 $em->persist($user);
  48.                 $em->flush();
  49.                 $event = new ResettingPasswordEvent($user);
  50.                 $this->eventDispatcher->dispatch($event);
  51.                 $session->getFlashBag()->add('success'$translator->trans('resetting.request.success',[],'userbundle'));
  52.             } else {
  53.                 $session->getFlashBag()->add('warning'$translator->trans('resetting.request.failed',[],'userbundle'));
  54.             }
  55.             return $this->redirectToRoute('resetting_request');
  56.         }
  57.         return $this->render('@UserBundle/Resetting/request.html.twig');
  58.     }
  59.     #[Route("/resetting/{token}",name'resetting_action')]
  60.     public function resetPassword(
  61.         Request $request,
  62.         UserPasswordHasherInterface $userPasswordEncoder,
  63.         EntityManagerInterface $em,
  64.         TranslatorInterface $translator,
  65.         string $token
  66.     ): Response
  67.     {
  68.         $session = new Session();
  69.         $user $em->getRepository(User::class)->findOneBy(['confirmation_token' => $token]);
  70.         if(empty($user)){
  71.             $session->getFlashBag()->add('danger'$translator->trans('resetting.token.error',[],'userbundle'));
  72.             return $this->redirectToRoute('resetting_request');
  73.         }
  74.         $form $this->createForm(ResettingType::class,null);
  75.         $form->handleRequest($request);
  76.         if($form->isSubmitted() && $form->isValid()){
  77.             $encodedPassword $userPasswordEncoder->hashPassword($user$form->get('password')->getData());
  78.             $user->setPassword($encodedPassword);
  79.             $user->setConfirmationToken(null);
  80.             $user->setPasswordRequestedAt(null);
  81.             $em->persist($user);
  82.             $em->flush();
  83.             $session->getFlashBag()->add('success'$translator->trans('resetting.success',[],'userbundle'));
  84.             return $this->redirectToRoute('app_login');
  85.         }
  86.         return $this->render('@User/Resetting/reset.html.twig', ['form' => $form->createView()]);
  87.     }
  88. }