<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Exception;
use App\Classes\Mail\MailerFromTwig;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\UtilisateurRepository;
use App\Entity\Utilisateur;
class SecurityController extends AbstractController
{
/**
* @Route("/deconnexion", name="security_logout")
*/
public function logout(): RedirectResponse
{
return $this->redirectToRoute('security_login');
}
/**
* @Route("/creer-mot-de-passe/{token}", name="security_create_password")
*/
public function createPassword(Request $request, string $token, UtilisateurRepository $utilisateurRepository, UserPasswordHasherInterface $passwordEncoder, EntityManagerInterface $entityManager): Response
{
$user = $utilisateurRepository->findOneBy(['invitationToken' => $token]);
if (!$user) {
$this->addFlash('danger', 'Ce lien d\'invitation est invalide ou a expiré.');
return $this->redirectToRoute('security_login');
}
if ($request->isMethod('POST')) {
$password = $request->request->get('password');
$passwordConfirm = $request->request->get('password_confirm');
if ($password !== $passwordConfirm) {
$this->addFlash('danger', 'Les mots de passe ne correspondent pas.');
return $this->render('security/create_password.html.twig', ['token' => $token]);
}
$user->setPassword($passwordEncoder->hashPassword($user, $password));
$user->setInvitationToken(null);
$entityManager->flush();
$this->addFlash('success', 'Votre mot de passe a été créé avec succès. Vous pouvez maintenant vous connecter.');
return $this->redirectToRoute('security_login');
}
return $this->render('security/create_password.html.twig', ['token' => $token]);
}
/**
* @Route("/connexion/mot-de-passe-perdu", name="security_password_lost")
* @throws TransportExceptionInterface
*/
public function passwordLost(
Request $request,
TokenGeneratorInterface $tokenGenerator,
EntityManagerInterface $entityManager,
MailerFromTwig $myMailer,
UtilisateurRepository $utilisateurRepository
): Response {
$submittedToken = $request->request->get('token');
if ($request->isMethod('POST') && $this->isCsrfTokenValid('password-lost', $submittedToken)) {
$email = $request->request->get('email');
if ('' === trim($email) || false === filter_var($email, FILTER_VALIDATE_EMAIL)) {
return $this->redirectToRoute('security_login', ['message' => 'Vous devez saisir un email valide']);
}
$user = $utilisateurRepository->findOneBy(['mailPerso' => $email]);
if (null === $user) {
return $this->redirectToRoute('security_login', ['message' => 'Email Inconnu']);
}
$token = $tokenGenerator->generateToken();
try {
$user->setResetToken($token);
$entityManager->flush();
} catch (Exception $e) {
return $this->redirectToRoute('security_login', ['message' => $e->getMessage()]);
}
$url = $this->generateUrl('security_reset_password', ['token' => $token],
UrlGeneratorInterface::ABSOLUTE_URL);
$myMailer->initEmail();
$myMailer->setTemplate('security/mails/passwordLost.html.twig', ['url' => $url, 'user' => $user]);
$myMailer->sendMessage([$user->getMailPerso()], 'Mot de passe perdu');
return $this->render('security/passwordLostConfirm.html.twig');
}
return $this->render('security/passwordLost.html.twig');
}
/**
* @Route("/connexion/init-password/{user}", name="security_password_init", options={"expose"=true})
* @throws TransportExceptionInterface
*/
public function initPassword(
UserPasswordHasherInterface $passwordEncoder,
EntityManagerInterface $entityManager,
MailerFromTwig $mailerFromTwig,
Utilisateur $user
): JsonResponse {
$password = mb_substr(md5(time()), 0, 10);
$passwordEncode = $passwordEncoder->hashPassword($user, $password);
$user->setPassword($passwordEncode);
$entityManager->flush();
$mailerFromTwig->initEmail();
$mailerFromTwig->setTemplate('mails/security/initPassword.txt.twig', [
'personnel' => $user,
'password' => $password,
]);
$mailerFromTwig->sendMessage($user->getMailPerso(), 'Initialisation de votre compte');
$mailerFromTwig->initEmail();
$mailerFromTwig->setTemplate('mails/security/initLogin.txt.twig', [
'personnel' => $user,
]);
$mailerFromTwig->sendMessage($user->getMailPerso(), 'Confirmation de votre Login');
return $this->json(true);
}
/**
* @Route("/connexion/reset-password/{token}", name="security_reset_password")
*/
public function resetPassword(
Request $request,
string $token,
UtilisateurRepository $utilisateurRepository,
UserPasswordHasherInterface $passwordEncoder,
EntityManagerInterface $entityManager
): Response {
if ($request->isMethod('POST')) {
$user = $utilisateurRepository->findOneBy(['resetToken' => $token]);
if (null === $user) {
return $this->redirectToRoute('security_login', ['message' => 'Token Inconnu']);
}
$user->setResetToken(null);
$user->setPassword($passwordEncoder->hashPassword($user, $request->request->get('inputPassword')));
$entityManager->flush();
return $this->redirectToRoute('security_login', ['message' => 'Mot de passe mis à jour']);
}
return $this->render('security/reset_password.html.twig', ['token' => $token]);
}
/**
* @Route("/connexion/aide", name="security_aide")
*/
public function aide(): Response {
return $this->redirectToRoute('security_login', ['showAide' => 'TRUE', 'message' => 'showAide']);
}
/**
* @Route("/connexion/{message}/{showAide}", name="security_login")
*/
public function login(AuthenticationUtils $authenticationUtils, string $message = '', string $showAide = 'FALSE'): Response
{
return $this->render('security/login.html.twig',
[
'message' => $message,
'showAide' => $showAide,
'last_username' => $authenticationUtils->getLastUsername(),
'error' => $authenticationUtils->getLastAuthenticationError(),
]);
}
}