src/Controller/Security/ResettingController.php line 59

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Security;
  3. use FOS\UserBundle\Event\FilterUserResponseEvent;
  4. use FOS\UserBundle\Event\FormEvent;
  5. use FOS\UserBundle\Event\GetResponseNullableUserEvent;
  6. use FOS\UserBundle\Event\GetResponseUserEvent;
  7. use FOS\UserBundle\FOSUserEvents;
  8. use FOS\UserBundle\Model\UserInterface;
  9. use FOS\UserBundle\Util\TokenGeneratorInterface;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  16. use App\Service\Mailer;
  17. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  18. use FOS\UserBundle\Controller\ResettingController as BaseResettingController;
  19. use FOS\UserBundle\Form\Factory\FactoryInterface;
  20. use FOS\UserBundle\Model\UserManagerInterface;
  21. use FOS\UserBundle\Mailer\MailerInterface;
  22. use Psr\Log\LoggerInterface;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. /**
  26.  * @see https://symfony.com/doc/current/bundles/FOSUserBundle/overriding_controllers.html
  27.  * @see https://symfony.com/doc/3.4/bundles/inheritance.html
  28.  */
  29. class ResettingController extends AbstractController # BaseResettingController
  30. {
  31.     /**
  32.      * @param EventDispatcherInterface $eventDispatcher
  33.      * @param FactoryInterface         $formFactory
  34.      * @param UserManagerInterface     $userManager
  35.      * @param TokenGeneratorInterface  $tokenGenerator
  36.      * @param MailerInterface          $mailer
  37.      * @param int                      $retryTtl
  38.      */
  39.     private $manager;
  40.     public function __construct(UserManagerInterface $managerEventDispatcherInterface $eventFactoryInterface $formFactory)
  41.     {
  42.         $this->manager $manager;
  43.         $this->event $event;
  44.         $this->formFactory $formFactory;
  45.     }
  46.     /**
  47.      * @param Request $request
  48.      * @Route("/change-password/request", name="back_resetting_request")
  49.      */
  50.     public function requestAction(Request $request)
  51.     {
  52.         $username $request->get('username');
  53.         return $this->render('resetting/request.html.twig'compact('username'));
  54.     }
  55.     /**
  56.      * @param Request $request
  57.      * @Route("/change-password/send-email", name="back_resetting_send_email")
  58.      *
  59.      * @return Response
  60.      */
  61.     public function sendEmailAction(Request $request,TokenGeneratorInterface $tokenGenerator,Mailer $mailer)
  62.     {
  63.         $username $request->request->get('username');
  64.         /** @var UserInterface $user */
  65.         $user $this->manager->findUserByUsernameOrEmail($username);
  66.       //  $this->logger->info('user reset password ==> '.serialize($user));
  67.         if(!$user) {
  68.             return $this->redirectToRoute('back_resetting_request'compact('username'));
  69.         }
  70.         /** @var $dispatcher EventDispatcherInterface */
  71.         $dispatcher $this->event;
  72.         /* Dispatch init event */
  73.         $event = new GetResponseNullableUserEvent($user$request);
  74.         $dispatcher->dispatch(FOSUserEvents::RESETTING_SEND_EMAIL_INITIALIZE$event);
  75.         if (null !== $event->getResponse()) {
  76.             return $event->getResponse();
  77.         }
  78.         $ttl $this->getParameter('fos_user.resetting.retry_ttl');
  79.         if (null !== $user && !$user->isPasswordRequestNonExpired($ttl)) {
  80.             $event = new GetResponseUserEvent($user$request);
  81.             $dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_REQUEST$event);
  82.             if (null !== $event->getResponse()) {
  83.                 return $event->getResponse();
  84.             }
  85.             if (null === $user->getConfirmationToken()) {
  86.                 $user->setConfirmationToken($tokenGenerator->generateToken());
  87.             }
  88.             /* Dispatch confirm event */
  89.             $event = new GetResponseUserEvent($user$request);
  90.             $dispatcher->dispatch(FOSUserEvents::RESETTING_SEND_EMAIL_CONFIRM$event);
  91.             if (null !== $event->getResponse()) {
  92.                 return $event->getResponse();
  93.             }
  94.             // send Email ressetting pwd
  95.             $mailer->sendResettingEmailMessage($user);
  96.             $user->setPasswordRequestedAt(new \DateTime());
  97.             $this->manager->updateUser($user);
  98.             /* Dispatch completed event */
  99.             $event = new GetResponseUserEvent($user$request);
  100.             $dispatcher->dispatch(FOSUserEvents::RESETTING_SEND_EMAIL_COMPLETED$event);
  101.             if (null !== $event->getResponse()) {
  102.                 return $event->getResponse();
  103.             }
  104.         }
  105.         return new RedirectResponse($this->generateUrl('back_resetting_check_email', array('username' => $username)));
  106.     }
  107.     /**
  108.      * Tell the user to check his email provider.
  109.      *
  110.      * @param Request $request
  111.      * @Route("/change-password/check-email", name="back_resetting_check_email")
  112.      *
  113.      * @return Response
  114.      */
  115.     public function checkEmailAction(Request $request)
  116.     {
  117.         $username $request->query->get('username');
  118.         if (empty($username)) {
  119.             // the user does not come from the sendEmail action
  120.             return new RedirectResponse($this->generateUrl('back_resetting_request'));
  121.         }
  122.         return $this->render('resetting/check_email.html.twig', array(
  123.             'tokenLifetime' => ceil($this->getParameter('fos_user.resetting.retry_ttl') / 3600),
  124.         ));
  125.     }
  126.     /**
  127.      * Reset user password.
  128.      *
  129.      * @param Request $request
  130.      * @param string  $token
  131.      * @Route("/change-password/reset/{token}", name="back_resetting_reset")
  132.      *
  133.      * @return Response
  134.      */
  135.     public function resetAction(Request $request$token,TranslatorInterface $translator)
  136.     {
  137.         /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
  138.         $formFactory $this->formFactory;
  139.         /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
  140.         $userManager $this->manager;
  141.         /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
  142.         $dispatcher $this->event;
  143.         $user $userManager->findUserByConfirmationToken($token);
  144.         if (null === $user) {
  145.             $message $translator->trans("L'utilisateur avec le jeton de confirmation n'existe pas !");
  146.             $this->addFlash('info'$message);
  147.             $url $this->generateUrl('app_login');
  148.             $response = new RedirectResponse($url);
  149.             return $response;
  150.         }
  151.         $event = new GetResponseUserEvent($user$request);
  152.         $dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_INITIALIZE$event);
  153.         if (null !== $event->getResponse()) {
  154.             return $event->getResponse();
  155.         }
  156.         $form $formFactory->createForm();
  157.         $form->setData($user);
  158.         $form->handleRequest($request);
  159.         if ($form->isSubmitted() && $form->isValid()) {
  160.             $event = new FormEvent($form$request);
  161.             $dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_SUCCESS$event);
  162.             $userManager->updateUser($user);
  163.             if (null === $response $event->getResponse()) {
  164.                 $url $this->generateUrl('app_login');
  165.                 $response = new RedirectResponse($url);
  166.             }
  167.             $dispatcher->dispatch(
  168.                 FOSUserEvents::RESETTING_RESET_COMPLETED,
  169.                 new FilterUserResponseEvent($user$request$response)
  170.             );
  171.             return $response;
  172.         }
  173.         return $this->render('resetting/reset.html.twig', array(
  174.             'token' => $token,
  175.             'form' => $form->createView()
  176.         ));
  177.     }
  178. }