src/Controller/AccountController.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\PasswordReset;
  4. use App\Entity\PasswordUpdate;
  5. use App\Form\PasswordResetType;
  6. use App\Form\PasswordUpdateType;
  7. use App\Repository\UserRepository;
  8. use App\Service\BreadcrumbService;
  9. use App\Repository\TraineeRepository;
  10. use Symfony\Component\Form\FormError;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  18. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  19. use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
  20. class AccountController extends AbstractController
  21. {
  22.     private $breadcrumbService;
  23.     public function __construct(BreadcrumbService $breadcrumbService)
  24.     {
  25.         $this->breadcrumbService = $breadcrumbService;
  26.     }
  27.     
  28.     #[Route('/login', name: 'login')]
  29.     public function login(AuthenticationUtils $utils): Response
  30.     {
  31.         $user = $this->getUser();
  32.         $error = $utils->getLastAuthenticationError();
  33.         $username = $utils->getLastUsername();
  34.         if ($user) {
  35.             return $this->redirectToRoute('homepage');
  36.         }
  37.         return $this->render('account/login.html.twig', [
  38.             'hasError' => $error !== null,
  39.             'error' => $error,
  40.             'username' => $username,
  41.         ]);
  42.     }
  43.     #[Route('/logout', name: 'logout')]
  44.     #[IsGranted('ROLE_USER')]
  45.     public function logout()
  46.     {
  47.     }
  48.     #[Route('/password-reset', name: 'password_reset')]
  49.     public function forgottenPassword(Request $request, EntityManagerInterface $manager, UserPasswordHasherInterface $encoder, TraineeRepository $repo){
  50.         $session = $this->getUser();
  51.         if ($session) {
  52.             return $this->redirectToRoute('homepage');
  53.         }
  54.         $passwordReset = new PasswordReset();
  55.         $form = $this->createForm(PasswordResetType::class, $passwordReset);
  56.         $form->handleRequest($request);
  57.         if($form->isSubmitted() && $form->isValid()){
  58.             // 1. Vérification de l'email renseigné
  59.             if($repo->findOneBy(["email" => $form->get("email")->getData()])) {
  60.                 $user = $repo->findOneBy(["email" => $form->get("email")->getData()]);
  61.                 $password = md5(uniqid());
  62.                 $hash = $encoder->hashPassword($user, $password);
  63.                 $user->setHash($hash);
  64.                 $mail = $this->sendCredentials($user->getEmail(), $password);
  65.                 if ($mail == 1) {
  66.                     $manager->persist($user);
  67.                     $manager->flush();
  68.                     return $this->redirectToRoute('login');
  69.                 } else {
  70.                     return $this->redirectToRoute('password_reset');
  71.                 }
  72.             } else {
  73.                 // Gestion de l'erreur
  74.                 $form->get('email')->addError(new FormError("L'adresse mail renseignée n'existe pas."));
  75.             }
  76.         }
  77.         return $this->render('/account/forgotten-password.html.twig', [
  78.             'form' => $form->createView()
  79.         ]);
  80.     }
  81.     #[Route('/account/password-update', name: 'password_update')]
  82.     #[IsGranted('ROLE_USER')]
  83.     public function updatePassword(Request $request, EntityManagerInterface $manager, UserPasswordHasherInterface $encoder): Response
  84.     {
  85.         $breadcrumb = $this->breadcrumbService->buildBreadcrumb([
  86.             ['title' => 'Mon compte', 'url' => $this->generateUrl('homepage')],
  87.             ['title' => 'Modifier mon mot de passe']
  88.         ]);
  89.         $passwordUpdate = new PasswordUpdate();
  90.         $user = $this->getUser();
  91.         if ($user instanceof PasswordAuthenticatedUserInterface) {
  92.             $form = $this->createForm(PasswordUpdateType::class, $passwordUpdate);
  93.             $form->handleRequest($request);
  94.             if ($form->isSubmitted() && $form->isValid()) {
  95.                 // Vérification du mot de passe actuel de l'utilisateur
  96.                 if (!$encoder->isPasswordValid($user, $passwordUpdate->getPassword())) {
  97.                     // Gestion de l'erreur
  98.                     $form->get('password')->addError(new FormError("Le mot de passe saisi est invalide."));
  99.                 } else {
  100.                     $newPassword = $passwordUpdate->getNewPassword();
  101.                     $hashedPassword = $encoder->hashPassword($user, $newPassword);
  102.                     $user->setPassword($hashedPassword);
  103.                     $manager->persist($user);
  104.                     $manager->flush();
  105.                     $this->addFlash(
  106.                         'success',
  107.                         "Votre mot de passe a bien été modifié !"
  108.                     );
  109.                     return $this->redirectToRoute('homepage');
  110.                 }
  111.             }
  112.             return $this->render('/account/password.html.twig', [
  113.                 'form' => $form->createView(),
  114.                 'breadcrumb' => $breadcrumb,
  115.             ]);
  116.         } else {
  117.             throw new \LogicException('Invalid user type.');
  118.         }
  119.     }
  120.     public function sendCredentials(string $email_dest, string $mdp)
  121.     {
  122.         $to = $email_dest;
  123.         $email_from = "admin@calypso.l2mb.fr";
  124.         $boundary = md5(rand());
  125.         $passage_ligne = "\n";
  126.         $headers = "From: Calypso" . " <" . $email_from . ">" . $passage_ligne; //Emetteur
  127.         $headers .= "Reply-to: Calypso" . " <" . $email_from . ">" . $passage_ligne; //Emetteur
  128.         $headers .= "MIME-Version: 1.0" . $passage_ligne; //Version de MIME
  129.         $headers .= 'Content-Type: multipart/mixed; boundary=' . $boundary . ' ' . $passage_ligne;
  130.         $objet = "Calypso - Vos informations de connexion";
  131.         $subject = $objet;
  132.         $message = '--' . $boundary . $passage_ligne; //Séparateur d'ouverture
  133.         $message .= "Content-Type: text/plain; charset=utf-8" . $passage_ligne; //Type du contenu
  134.         $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; //Encodage
  135.         $message .= $passage_ligne . "Bienvenue sur Calypso !" . $passage_ligne; //Contenu du message
  136.         $message .= $passage_ligne . $passage_ligne;
  137.         $message .= $passage_ligne . "Voici vos informations de connexion :" . $passage_ligne;
  138.         $message .= $passage_ligne . "Votre identifiant : " . $email_dest;
  139.         $message .= $passage_ligne . "Votre mot de passe : " . $mdp . $passage_ligne;
  140.         $message .= $passage_ligne . $passage_ligne;
  141.         $message .= $passage_ligne . "Vous pouvez vous connecter depuis ce lien : " . htmlentities("https://www.calypso.lvet.fr/login") . $passage_ligne;
  142.         $message .= $passage_ligne . "Vous pourrez changer votre mot de passe à tout moment depuis votre espace sur le site." . $passage_ligne;
  143.         $retour = 0;
  144.         if (mail($to, $subject, $message, $headers)) {
  145.             $retour = 1;
  146.         }
  147.         return $retour;
  148.     }
  149. }