<?php
namespace App\Controller;
use App\Entity\PasswordReset;
use App\Entity\PasswordUpdate;
use App\Form\PasswordResetType;
use App\Form\PasswordUpdateType;
use App\Repository\UserRepository;
use App\Service\BreadcrumbService;
use App\Repository\TraineeRepository;
use Symfony\Component\Form\FormError;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
class AccountController extends AbstractController
{
private $breadcrumbService;
public function __construct(BreadcrumbService $breadcrumbService)
{
$this->breadcrumbService = $breadcrumbService;
}
#[Route('/login', name: 'login')]
public function login(AuthenticationUtils $utils): Response
{
$user = $this->getUser();
$error = $utils->getLastAuthenticationError();
$username = $utils->getLastUsername();
if ($user) {
return $this->redirectToRoute('homepage');
}
return $this->render('account/login.html.twig', [
'hasError' => $error !== null,
'error' => $error,
'username' => $username,
]);
}
#[Route('/logout', name: 'logout')]
#[IsGranted('ROLE_USER')]
public function logout()
{
}
#[Route('/password-reset', name: 'password_reset')]
public function forgottenPassword(Request $request, EntityManagerInterface $manager, UserPasswordHasherInterface $encoder, TraineeRepository $repo){
$session = $this->getUser();
if ($session) {
return $this->redirectToRoute('homepage');
}
$passwordReset = new PasswordReset();
$form = $this->createForm(PasswordResetType::class, $passwordReset);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
// 1. Vérification de l'email renseigné
if($repo->findOneBy(["email" => $form->get("email")->getData()])) {
$user = $repo->findOneBy(["email" => $form->get("email")->getData()]);
$password = md5(uniqid());
$hash = $encoder->hashPassword($user, $password);
$user->setHash($hash);
$mail = $this->sendCredentials($user->getEmail(), $password);
if ($mail == 1) {
$manager->persist($user);
$manager->flush();
return $this->redirectToRoute('login');
} else {
return $this->redirectToRoute('password_reset');
}
} else {
// Gestion de l'erreur
$form->get('email')->addError(new FormError("L'adresse mail renseignée n'existe pas."));
}
}
return $this->render('/account/forgotten-password.html.twig', [
'form' => $form->createView()
]);
}
#[Route('/account/password-update', name: 'password_update')]
#[IsGranted('ROLE_USER')]
public function updatePassword(Request $request, EntityManagerInterface $manager, UserPasswordHasherInterface $encoder): Response
{
$breadcrumb = $this->breadcrumbService->buildBreadcrumb([
['title' => 'Mon compte', 'url' => $this->generateUrl('homepage')],
['title' => 'Modifier mon mot de passe']
]);
$passwordUpdate = new PasswordUpdate();
$user = $this->getUser();
if ($user instanceof PasswordAuthenticatedUserInterface) {
$form = $this->createForm(PasswordUpdateType::class, $passwordUpdate);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Vérification du mot de passe actuel de l'utilisateur
if (!$encoder->isPasswordValid($user, $passwordUpdate->getPassword())) {
// Gestion de l'erreur
$form->get('password')->addError(new FormError("Le mot de passe saisi est invalide."));
} else {
$newPassword = $passwordUpdate->getNewPassword();
$hashedPassword = $encoder->hashPassword($user, $newPassword);
$user->setPassword($hashedPassword);
$manager->persist($user);
$manager->flush();
$this->addFlash(
'success',
"Votre mot de passe a bien été modifié !"
);
return $this->redirectToRoute('homepage');
}
}
return $this->render('/account/password.html.twig', [
'form' => $form->createView(),
'breadcrumb' => $breadcrumb,
]);
} else {
throw new \LogicException('Invalid user type.');
}
}
public function sendCredentials(string $email_dest, string $mdp)
{
$to = $email_dest;
$email_from = "admin@calypso.l2mb.fr";
$boundary = md5(rand());
$passage_ligne = "\n";
$headers = "From: Calypso" . " <" . $email_from . ">" . $passage_ligne; //Emetteur
$headers .= "Reply-to: Calypso" . " <" . $email_from . ">" . $passage_ligne; //Emetteur
$headers .= "MIME-Version: 1.0" . $passage_ligne; //Version de MIME
$headers .= 'Content-Type: multipart/mixed; boundary=' . $boundary . ' ' . $passage_ligne;
$objet = "Calypso - Vos informations de connexion";
$subject = $objet;
$message = '--' . $boundary . $passage_ligne; //Séparateur d'ouverture
$message .= "Content-Type: text/plain; charset=utf-8" . $passage_ligne; //Type du contenu
$message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; //Encodage
$message .= $passage_ligne . "Bienvenue sur Calypso !" . $passage_ligne; //Contenu du message
$message .= $passage_ligne . $passage_ligne;
$message .= $passage_ligne . "Voici vos informations de connexion :" . $passage_ligne;
$message .= $passage_ligne . "Votre identifiant : " . $email_dest;
$message .= $passage_ligne . "Votre mot de passe : " . $mdp . $passage_ligne;
$message .= $passage_ligne . $passage_ligne;
$message .= $passage_ligne . "Vous pouvez vous connecter depuis ce lien : " . htmlentities("https://www.calypso.lvet.fr/login") . $passage_ligne;
$message .= $passage_ligne . "Vous pourrez changer votre mot de passe à tout moment depuis votre espace sur le site." . $passage_ligne;
$retour = 0;
if (mail($to, $subject, $message, $headers)) {
$retour = 1;
}
return $retour;
}
}