src/Controller/Back/SecurityController.php line 53

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Back;
  3. use App\Entity\BackUser;
  4. use App\Entity\BackUserLog;
  5. use App\Form\ForgotPasswordType;
  6. use App\Form\Model\ForgotPassword;
  7. use App\Form\Model\ResetPassword;
  8. use App\Form\ResetPasswordType;
  9. use App\Repository\BackUserRepository;
  10. use App\Service\MailService;
  11. use App\Utils\FormHelper;
  12. use DateInterval;
  13. use DateTime;
  14. use Doctrine\ORM\NonUniqueResultException;
  15. use Doctrine\Persistence\ManagerRegistry;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  23. use Twig\Error\LoaderError;
  24. use Twig\Error\RuntimeError;
  25. use Twig\Error\SyntaxError;
  26. #[Route('/back')]
  27. class SecurityController extends AbstractController
  28. {
  29.     /**
  30.      * SecurityController constructor.
  31.      */
  32.     public function __construct(
  33.         protected MailService $mailer,
  34.         protected UserPasswordHasherInterface $passwordEncoder,
  35.         protected ManagerRegistry $registry
  36.     ) {
  37.     }
  38.     /**
  39.      * @throws \Exception
  40.      */
  41.     #[Route('/login'name'back_security_login')]
  42.     public function login(Request $requestAuthenticationUtils $helper): Response
  43.     {
  44.         $session $request->getSession();
  45.         $date = new DateTime();
  46.         $date->sub(new DateInterval('P5M'));
  47.         $locked $session->get('locked'false);
  48.         if ($locked && $locked $date->format('YmdHis')) {
  49.             $session->set('locked'false);
  50.         }
  51.         return $this->render('back/security/login.html.twig', [
  52.             'last_username' => $helper->getLastUsername(),
  53.             'error'         => $helper->getLastAuthenticationError(),
  54.             'locked'        => $session->get('locked'false),
  55.         ]);
  56.     }
  57.     /**
  58.      * @throws NonUniqueResultException
  59.      * @throws LoaderError
  60.      * @throws RuntimeError
  61.      * @throws SyntaxError
  62.      */
  63.     #[Route('/forgot-password'name'back_security_forgotPassword')]
  64.     public function forgotPassword(Request $request): Response
  65.     {
  66.         $forgotPassword = new ForgotPassword();
  67.         $form $this->createForm(ForgotPasswordType::class, $forgotPassword);
  68.         if ('POST' == $request->getMethod()) {
  69.             $form->handleRequest($request);
  70.             if ($form->isSubmitted() && $form->isValid()) {
  71.                 $mail $forgotPassword->getEmail();
  72.                 /** @var BackUserRepository $repository */
  73.                 $repository $this->registry->getRepository(BackUser::class);
  74.                 /** @var BackUser $user */
  75.                 $user $repository->findOneByMail($mail);
  76.                 if (null !== $user) {
  77.                     $user->generateResetPasswordHash();
  78.                     $em $this->registry->getManager();
  79.                     $em->persist($user);
  80.                     $em->flush();
  81.                     $this->mailer->resetPassword($user);
  82.                 }
  83.                 return $this->render('back/security/forgot-password-success.html.twig');
  84.             }
  85.             $errors FormHelper::getErrorMessages($form);
  86.         }
  87.         $form FormHelper::getData($form);
  88.         return $this->render('back/security/forgot-password.html.twig', [
  89.             'form'   => $form['forgot_password']['children'],
  90.             'errors' => $errors ?? null,
  91.         ]);
  92.     }
  93.     /**
  94.      * @throws \Exception
  95.      */
  96.     #[Route('/reset-password/{resetPasswordHash}'name'back_security_resetPassword')]
  97.     public function resetPassword(Request $requestBackUser $user): Response
  98.     {
  99.         $resetPassword = new ResetPassword();
  100.         $form $this->createForm(ResetPasswordType::class, $resetPassword);
  101.         if ('POST' == $request->getMethod()) {
  102.             $form->handleRequest($request);
  103.             if ($form->isSubmitted() && $form->isValid()) {
  104.                 $em $this->registry->getManager();
  105.                 $user->setPassword($this->passwordEncoder->hashPassword($user$resetPassword->getPassword()));
  106.                 $user->setResetPasswordHash();
  107.                 $em->persist($user);
  108.                 $userLog = new BackUserLog();
  109.                 $userLog->setType(BackUserLog::TYPE_RESET_PASSWORD);
  110.                 $userLog->setUser($user);
  111.                 $userLog->setIp($user->getLastIp());
  112.                 $userLog->setDate(new DateTime());
  113.                 $em->persist($userLog);
  114.                 $em->flush();
  115.                 return new RedirectResponse($this->generateUrl('back_security_login'));
  116.             }
  117.             $errors FormHelper::getErrorMessages($form);
  118.         }
  119.         $form FormHelper::getData($form);
  120.         return $this->render('back/security/reset-password.html.twig', [
  121.             'form'   => $form['reset_password']['children'],
  122.             'errors' => $errors ?? null,
  123.             'hash'   => $user->getResetPasswordHash(),
  124.         ]);
  125.     }
  126.     /**
  127.      * @throws \Exception
  128.      */
  129.     #[Route('/unlock-account/{unlockingHash}'name'back_security_unlockAccount')]
  130.     public function unlockAccount(BackUser $user): Response
  131.     {
  132.         $em $this->registry->getManager();
  133.         $user->setEnabled(true);
  134.         $user->setUnlockingHash();
  135.         $em->persist($user);
  136.         $userLog = new BackUserLog();
  137.         $userLog->setType(BackUserLog::TYPE_UNLOCK);
  138.         $userLog->setUser($user);
  139.         $userLog->setIp($user->getLastIp());
  140.         $userLog->setDate(new DateTime());
  141.         $em->persist($userLog);
  142.         $em->flush();
  143.         return new RedirectResponse($this->generateUrl('back_security_login'));
  144.     }
  145.     /**
  146.      * @throws \Exception
  147.      */
  148.     #[Route('/logout'name'back_security_logout')]
  149.     public function logout(): never
  150.     {
  151.         throw new \Exception('This should never be reached!');
  152.     }
  153. }