Un administrateur du site vous à créé un compte sur Sortir.com !
-Votre mot de passe temporaire est : aChanger44!
+Un administrateur du site vous a créé un compte !
+Terminer la création de cotre compte : Sortir.com
Toute l'équipe de Sortir vous souhaite la bienvenue !
"); @@ -142,6 +160,9 @@ class AdminController extends AbstractController } catch(\Exception $e) { $this->addFlash('error', "Erreur : " . $e->getMessage()); return $this->redirectToRoute('app_adminUser'); + } catch (TransportExceptionInterface $e) { + $this->addFlash('error', "Erreur : " . $e->getMessage()); + return $this->redirectToRoute('app_adminUser'); } } #[Route('/admin/user/import', name: 'participant_import', methods: ['POST'])] diff --git a/src/Controller/PasswordResetController.php b/src/Controller/PasswordResetController.php new file mode 100644 index 0000000..97e4e18 --- /dev/null +++ b/src/Controller/PasswordResetController.php @@ -0,0 +1,119 @@ +request->get('email'); + + // Vérifier si l'email est valide + if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + $this->addFlash('error', 'Adresse e-mail invalide.'); + return $this->redirectToRoute('app_login'); + } + + // Générer un token unique + $token = bin2hex(random_bytes(32)); + + // Enregistrer le token dans la base de données + $passwordResetToken = new PasswordResetToken(); + $passwordResetToken->setToken($token) + ->setEmail($email) + ->setCreatedAt(new \DateTime()); + + $entityManager->persist($passwordResetToken); + $entityManager->flush(); + + // Générer un lien de réinitialisation + $resetLink = $urlGenerator->generate( + 'app_password_reset', + ['token' => $token], + UrlGeneratorInterface::ABSOLUTE_URL + ); + + // Envoyer l'email avec le lien + $email = (new Email()) + ->from('contact@sortir.com') + ->to($email) + ->subject('Sortir.com | Réinitialisation de mot de passe') + ->html("Bonjour,
Vous avez demandé une réinitialisation de mot de passe. Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe :
+Réinitialiser mon mot de passe
+Ce lien est valable 24 heures.
"); + + $mailer->send($email); + + $this->addFlash('success', 'Un email de réinitialisation a été envoyé.'); + return $this->redirectToRoute('app_login'); + }catch (TransportExceptionInterface|RandomException $e){ + $this->addFlash('error', 'Erreur : ' . $e->getMessage()); + return $this->redirectToRoute('app_login'); + } + } + #[Route('/password/reset/{token}', name: 'app_password_reset', methods: ['GET', 'POST'])] + public function resetPassword( + string $token, + Request $request, + EntityManagerInterface $entityManager, + ): Response { + // Vérifier si le token existe + $repository = $entityManager->getRepository(PasswordResetToken::class); + $passwordResetToken = $repository->findOneBy(['token' => $token]); + + if (!$passwordResetToken || $passwordResetToken->isExpired()) { + $this->addFlash('error', 'Ce lien de réinitialisation est invalide ou expiré.'); + return $this->redirectToRoute('app_login'); + } + + // Si la requête est POST, traiter le nouveau mot de passe + if ($request->isMethod('POST')) { + $newPassword = $request->request->get('password'); + $newPasswordConfirm = $request->request->get('passwordConfirm'); + + if ($newPassword.equalTo($newPasswordConfirm)) { + $this->addFlash('error', 'Les mots de passe ne correspondent pas.'); + return $this->redirectToRoute('app_password_reset', ['token' => $token]); + } + + if (strlen($newPassword) < 6) { + $this->addFlash('error', 'Le mot de passe doit contenir au moins 6 caractères.'); + return $this->redirectToRoute('app_password_reset', ['token' => $token]); + } + + // Récupérer l'utilisateur et mettre à jour le mot de passe + $user = $entityManager->getRepository(Participant::class)->findOneBy(['email' => $passwordResetToken->getEmail()]); + $user->setPassword(password_hash($newPassword, PASSWORD_BCRYPT)); + + $entityManager->remove($passwordResetToken); // Supprimer le token + $entityManager->flush(); + + $this->addFlash('success', 'Votre mot de passe a été mis à jour.'); + return $this->redirectToRoute('app_login'); + } + + return $this->render('password_reset/index.html.twig', ['token' => $token]); + } +} diff --git a/src/DataFixtures/UserFixtures.php b/src/DataFixtures/UserFixtures.php index ccbfa3f..ba62888 100644 --- a/src/DataFixtures/UserFixtures.php +++ b/src/DataFixtures/UserFixtures.php @@ -32,11 +32,11 @@ class UserFixtures extends Fixture $johan->setNom('Leroy'); $johan->setPseudo('Jojo'); $johan->setTelephone('0785421565'); - $johan->setEmail('johan@gmail.com'); + $johan->setEmail('leroyjohan3@gmail.com'); $johan->setRoles(['ROLE_USER', 'ROLE_ADMIN']); $johan->setAdministrateur(true); $johan->setActif(false); - $johan->setPassword($this->userPasswordHasher->hashPassword($johan, 'test-44')); + $johan->setPassword($this->userPasswordHasher->hashPassword($johan, 'Vn21pd%6a%Hw5j')); $manager->persist($johan); $marvin = new Participant(); diff --git a/templates/password_reset/index.html.twig b/templates/password_reset/index.html.twig new file mode 100644 index 0000000..e21a93d --- /dev/null +++ b/templates/password_reset/index.html.twig @@ -0,0 +1,29 @@ +{% extends 'main/base.html.twig' %} +{% block head %} + + + {% block stylesheets %} + {{ encore_entry_link_tags('app') }} + {% endblock %} + +{% endblock %} + +{%block content %} +