<?php
namespace App\Controller\Auth;
use App\Data\PasswordResetConfirmData;
use App\Data\PasswordResetRequestData;
use App\Entity\Auth\User;
use App\Entity\Profile\PasswordResetToken;
use App\Form\Authentication\PasswordResetConfirmForm;
use App\Form\Authentication\PasswordResetRequestForm;
use App\Service\PasswordService;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
class PasswordController extends AbstractController
{
/**
* @var EntityManagerInterface
*/
private EntityManagerInterface $manager;
public function __construct(EntityManagerInterface $manager)
{
$this->manager = $manager;
}
/**
* @Route("/password/new", name="auth_password_reset")
* @param Request $request
* @param PasswordService $resetService
* @return Response
* @throws Exception
*/
public function reset(Request $request, PasswordService $resetService): Response
{
$error = null;
$data = new PasswordResetRequestData();
$form = $this->createForm(PasswordResetRequestForm::class, $data);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
$resetService->resetPassword($form->getData());
$this->addFlash('success', 'Les instructions pour réinitialiser votre mot de passe vous ont été envoyées');
return $this->redirectToRoute('app_login');
} catch (AuthenticationException $e) {
$error = $e;
}
}
return $this->render('auth/password_reset.html.twig', [
'error' => $error,
'form' => $form->createView(),
'title'=> "Mot de passe oublié"
]);
}
/**
* @Route("/password/new/{id<\d+>}/{token}", name="auth_password_reset_confirm")
* @param Request $request
* @param User $user
* @param string $token
* @param PasswordService $service
* @return Response
* @throws Exception
*/
public function confirm(Request $request, User $user, string $token, PasswordService $service): Response
{
$passwordToken = $this->manager->getRepository(PasswordResetToken::class)->findOneBy(['token' => $token]);
if (!$passwordToken || $service->isExpired($passwordToken) || $passwordToken->getUser() !== $user) {
$this->addFlash('error', 'Ce token a expiré');
return $this->redirectToRoute('app_login');
}
$error = null;
$data = new PasswordResetConfirmData();
$form = $this->createForm(PasswordResetConfirmForm::class, $data);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$service->updatePassword($data->getPassword(), $passwordToken);
$this->addFlash('success', 'Votre mot de passe a bien été réinitialisé');
return $this->redirectToRoute('app_login');
}
return $this->render('auth/password_reset_confirm.html.twig', [
'error' => $error,
'form' => $form->createView(),
'title' => "Réinitialisation du mot de passe"
]);
}
/**
* @Route("/password/update", name="auth_password_update")
* @param Request $request
* @param PasswordService $service
* @return Response
* @IsGranted("ROLE_PARENT")
*/
public function newPassword(Request $request, PasswordService $service): Response
{
$error = null;
$data = new PasswordResetConfirmData();
$form = $this->createForm(PasswordResetConfirmForm::class, $data);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$service->changePasswordOnFirstLogin($data->getPassword(), $this->getUser());
$this->addFlash('success', 'Votre mot de passe a bien été mise à jour');
return $this->redirectToRoute('homepage');
}
return $this->render('auth/password_change.html.twig', [
'error' => $error,
'form' => $form->createView()
]);
}
}