src/Controller/Web/SecurityController.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Web;
  3. use App\Entity\User;
  4. use App\Form\Resetting\ResetPasswordFormType;
  5. use App\Form\Resetting\ResetPasswordRequestFormType;
  6. use DateTime;
  7. use Exception;
  8. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  13. use Symfony\Component\Mailer\MailerInterface;
  14. use Symfony\Component\Mime\Address;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  17. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  18. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. class SecurityController extends AbstractController
  21. {
  22.     /**
  23.      * @Route("/login", name="app_login")
  24.      * @param Request $request
  25.      * @param AuthenticationUtils $authenticationUtils
  26.      * @return Response
  27.      */
  28.     public function login(Request $requestAuthenticationUtils $authenticationUtils): Response
  29.     {
  30.         if ($this->getUser()) {
  31.             return $this->redirectToRoute('index_presentation');
  32.         }
  33.         // get the login error if there is one
  34.         $error $authenticationUtils->getLastAuthenticationError();
  35.         // last username entered by the user
  36.         $lastUsername $authenticationUtils->getLastUsername();
  37.         return $this->render('Security/login.html.twig', [
  38.             'last_username' => $lastUsername,
  39.             'error' => $error
  40.         ]);
  41.     }
  42.     /**
  43.      * @Route("/logout", name="app_logout", options = { "expose" = true }, methods={"GET","HEAD"})
  44.      */
  45.     public function logout()
  46.     {
  47.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  48.     }
  49.     /**
  50.      * @Route("/resetting/request", name="app_password_reset_request", options={"expose":true})
  51.      * @param Request $request
  52.      * @param MailerInterface $mailer
  53.      * @param TranslatorInterface $translator
  54.      * @return Response
  55.      */
  56.     public function resetPasswordRequest(Request $requestMailerInterface $mailerTranslatorInterface $translator) : Response {
  57.         $form $this->createForm(ResetPasswordRequestFormType::class);
  58.         $form->handleRequest($request);
  59.         if ($form->isSubmitted() && $form->isValid()) {
  60.             $em $this->getDoctrine()->getManager();
  61.             $user $em->getRepository(User::class)->findOneBy(array('email' => $form->get('email')->getData()));
  62.             if ($user) {
  63.                 if (empty($user->getConfirmationToken())) {
  64.                     try {
  65.                         $user->setConfirmationToken(md5(random_bytes(random_int(4050))));
  66.                     } catch (Exception $e) {
  67.                     }
  68.                 }
  69.                 $latestRequestDate $user->getPasswordRequestedAt();
  70.                 $now = new DateTime();
  71.                 $diff $now->getTimestamp() - ($latestRequestDate $latestRequestDate->getTimestamp() : 0);
  72.                 if (is_null($latestRequestDate) || $diff >= 86400) {
  73.                     $user->setPasswordRequestedAt(new DateTime());
  74.                     if ($this->SendResetPasswordEmail($mailer$translator$user)) {
  75.                         // TODO change email with the link
  76.                         $em->flush();
  77.                     } else {
  78.                         // TODO display if there is an error for the sending of the mail
  79.                     }
  80.                 } else if ($diff 86400) {
  81.                     return $this->render('Resetting/passwordAlreadyRequested.html.twig', [
  82.                         'email' => $form->get('email')->getData(),
  83.                     ]);
  84.                 }
  85.             }
  86.             return $this->render('Resetting/check_email.html.twig', [
  87.                 'email' => $form->get('email')->getData(),
  88.             ]);
  89.         }
  90.         return $this->render('Resetting/request.html.twig', [
  91.             'form' => $form->createView(),
  92.         ]);
  93.     }
  94.     /**
  95.      * @Route("/resetting/password", name="app_password_reset", options={"expose":true})
  96.      * @param Request $request
  97.      * @param UserPasswordEncoderInterface $passwordEncoder
  98.      * @return Response
  99.      */
  100.     public function resetPassword(Request $requestUserPasswordEncoderInterface $passwordEncoder) : Response {
  101.         $form $this->createForm(ResetPasswordFormType::class);
  102.         $em $this->getDoctrine()->getManager();
  103.         $form->handleRequest($request);
  104.         $user null;
  105.         if ($form->isSubmitted() && $form->isValid()) {
  106.             $user $em->getRepository(User::class)->findOneBy(array('confirmationToken' => $request->get('token')));
  107.             if ($user && $user->getPasswordRequestedAt()) {
  108.                 $now = new DateTime();
  109.                 if (($now->getTimestamp() - $user->getPasswordRequestedAt()->getTimestamp()) > 86400) {
  110.                     return $this->render('Resetting/passwordRequestError.html.twig', [
  111.                     ]);
  112.                 }
  113.                 $user->setPassword(
  114.                     $passwordEncoder->encodePassword(
  115.                         $user,
  116.                         $form->get('plainPassword')->getData()
  117.                     )
  118.                 );
  119.                 $user->setPasswordRequestedAt(null);
  120.                 $em->flush();
  121.             } else {
  122.                 return $this->render('Resetting/passwordRequestError.html.twig', [
  123.                 ]);
  124.             }
  125.             return $this->redirectToRoute('app_login');
  126.         } else if (!$form->isSubmitted()) {
  127.             $user $em->getRepository(User::class)->findOneBy(array('confirmationToken' => $request->get('token')));
  128.             if ($user && $user->getPasswordRequestedAt()) {
  129.                 $now = new DateTime();
  130.                 if (($now->getTimestamp() - $user->getPasswordRequestedAt()->getTimestamp()) > 86400) {
  131.                     return $this->render('Resetting/passwordRequestError.html.twig', [
  132.                     ]);
  133.                 }
  134.             } else {
  135.                 return $this->render('Resetting/passwordRequestError.html.twig', [
  136.                 ]);
  137.             }
  138.         }
  139.         return $this->render('Resetting/reset.html.twig', [
  140.             'form' => $form->createView(), 'token' => $request->get('token')
  141.         ]);
  142.     }
  143.     private function SendResetPasswordEmail(MailerInterface $mailerTranslatorInterface $translatorUser $user) : bool {
  144.         $message = (new TemplatedEmail())
  145.             ->subject($translator->trans('resetting.email.subject', array(), 'FOSUserBundle'))
  146.             ->from(new Address($this->getParameter('NOREPLY_EMAIL'), 'No-Reply'))
  147.             ->to(new Address($user->getEmail(), ($user->getFirstName() . " " $user->getLastName())))
  148.             ->htmlTemplate('Resetting/emailResetting.html.twig')
  149.             ->textTemplate('Resetting/emailResetting.txt.twig')
  150.             ->context([
  151.                 'datamail' => [
  152.                     'user' => $user,
  153.                     'confirmationUrl' => $this->generateUrl('app_password_reset', [], UrlGeneratorInterface::ABSOLUTE_URL).'?token='.$user->getConfirmationToken()
  154.                 ]
  155.             ])
  156.         ;
  157.         try {
  158.             $mailer->send($message);
  159.         } catch (TransportExceptionInterface $e) {
  160.             return false;
  161.         }
  162.         return true;
  163.     }
  164. }