<?php
namespace App\Controller;
use App\Entity\User\User;
use App\Entity\User\UserStatus;
use App\Service\User\ResetUser;
use App\Entity\Email\TemplateEmail;
use Symfony\Component\Form\FormError;
use App\Repository\User\UserRepository;
use App\Form\Security\ResetPasswordType;
use Doctrine\ORM\EntityManagerInterface;
use App\Form\Security\ChangePasswordType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Service\Manager\Email\TemplateMailerManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class SecurityController extends AbstractController
{
#[Route(path: '/login', name: 'app_login')]
public function login(AuthenticationUtils $authenticationUtils): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('app_admin_index');
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error
]);
}
#[Route(path: '/logout', name: 'app_logout')]
public function logout(): void
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
/**
* @Route("/forgotten-password", name="app_forgotten_password")
*/
public function forgottenPassword(
Request $request,
UserRepository $userRepository,
TemplateMailerManager $templateMailer,
ResetUser $resetUser
) {
if ($this->getUser()) {
return $this->redirectToRoute('app_admin_index');
}
$form = $this->createForm(ResetPasswordType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$error = 1;
$email = $form->get('email')->getData();
/** @var User $user */
$user = $userRepository->findOneByEmail($email);
if ($user) {
if (
!$user->getDeletedAt() &&
$user->getStatus() &&
$user->getStatus()->getValue() == UserStatus::VALID
) {
$reset = $resetUser->resetPassword($user);
if ($reset) {
$templateMailer->selectTemplateAndSendEmail(
TemplateEmail::TYPE_FORGOTTEN_PASSWORD,
$user,
['reset_password_link' => true]
);
$error = 0;
$this->addFlash('success', 'Un email de réinitialisation de mot de passe a été envoyé à l\'adresse email indiquée.');
}
}
}
if ($error) {
$form
->get('email')
->addError(new FormError('Email inconnu'));
} else {
return $this->redirectToRoute('app_forgotten_password');
}
}
return $this->render('security/forgotten_password.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/reset-password/{token}", name="app_reset_password")
*/
public function resetPassword(
string $token,
Request $request,
UserRepository $userRepository,
UserPasswordHasherInterface $passwordHasher,
EntityManagerInterface $entityManager
) {
if ($this->getUser()) {
return $this->redirectToRoute('app_admin_index');
}
/** @var User $user */
$user = $userRepository->findOneByResetToken($token);
if ($user === null) {
$this->addFlash('danger', 'Lien invalide, merci de faire une nouvelle demande.');
return $this->redirectToRoute('app_admin_index');
}
$form = $this->createForm(ChangePasswordType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setPassword($passwordHasher->hashPassword($user, $form->get('password')->getData()));
$user->setResetToken(null);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('success', 'Votre nouveau mot de passe a été créé.');
return $this->redirectToRoute('app_forgotten_password');
}
return $this->render('security/reset_password.html.twig', [
'form' => $form->createView(),
'user' => $user
]);
}
}