<?php
namespace App\Controller;
use App\Entity\User;
use App\Services\Mailer;
use App\Services\SendMail;
use App\Form\ResettingType;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Form\ResetPasswordRequestFormType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
class ResettingPwdController extends AbstractController
{
// /**
// * @Route("/mot-de-passe-oublie", name="forgot_pwd")
// */
#[Route('/mot-de-passe-oublie', name:'forgot_pwd')]
public function request(Request $request, UserRepository $userRpo, TokenGeneratorInterface $tokenGenerator, EntityManagerInterface $manager, SendMail $mailer)
{
// création d'un formulaire "à la volée", afin que l'internaute puisse renseigner son mail
// $form = $this->createFormBuilder()->add('email', EmailType::class, [ 'constraints' => [ new Email(), new NotBlank()]])->getForm();
$form = $this->createForm(ResetPasswordRequestFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// voir l'épisode 2 de cette série pour retrouver la méthode loadUserByUsername:
$user = $userRpo->findOneBy(['email' => $form->getData()['email']]);
// aucun email associé à ce compte.
if (!$user) {
$request->getSession()->getFlashBag()->add('error', "Cet email n'existe pas.");
return $this->redirectToRoute("forgot_pwd");
}
// dd($user->getEmail());
// création du token
$user->setToken($tokenGenerator->generateToken());
// enregistrement de la date de création du token
$user->setPasswordRequestedAt(new \Datetime());
$manager->persist($user);
$manager->flush();
$bodyMail = $mailer->createBodyMail('auth/reset_email.html.twig', [ 'user' => $user]);
$mailer->sendEmail(from: 'Abidjan.net@weblogy.com', to: $user->getEmail(), subject: 'Réinitialisation du mot de passe' ,body: $bodyMail);
// AUTRES METHODES --->>>>>Injetcter de dependance MailerInterface<<<<<<----
// $email = (new Email())
// ->from('yemakarios70@gmail.com')
// ->to('brouange48@gmail.com')
// //->cc('cc@example.com')
// //->bcc('bcc@example.com')
// //->replyTo('fabien@example.com')
// //->priority(Email::PRIORITY_HIGH)
// ->subject('Time for Symfony Mailer!')
// ->text('Sending emails is fun again!')
// ->html('<p>See Twig integration for better HTML integration!</p>');
// $mailer->send($email);
// $email = (new TemplatedEmail())
// ->from(new Address('no-reply@abidjan.net', 'Abidjan.net'))
// ->to($user->getEmail())
// ->subject('Demande réinitialisation de mot de passe')
// ->htmlTemplate('front/auth/reset_email.html.twig')
// ->context(['user' => $user]);
// $mailer->send($email);
// on utilise le service Mailer créé précédemment
$request->getSession()->getFlashBag()->add('success', "Un email vous sera envoyé afin que vous puissiez renouveller votre mot de passe. Le lien que vous recevrez sera valide 24h.");
// dd($mailer);
return $this->redirectToRoute("security.login");
}
return $this->render('auth/reset_password.html.twig', ['form' => $form->createView()]);
}
// si supérieur à 10min, retourne false
// sinon retourne false
private function isRequestInTime(\Datetime $passwordRequestedAt = null)
{
if ($passwordRequestedAt === null) {
return false;
}
$now = new \DateTime();
$interval = $now->getTimestamp() - $passwordRequestedAt->getTimestamp();
$daySeconds = 60 * 10;
$response = $interval > $daySeconds ? false : $reponse = true;
return $response;
}
// /**
// * @Route("/mot-de-passe-oublie/{id}/{token}", name="pwd_reset")
// */
#[Route('/mot-de-passe-oublie/{id}/{token}', name:'pwd_reset')]
public function resetting($id, $token, Request $request, UserRepository $userRpo, UserPasswordEncoderInterface $passwordEncoder)
{
// Récupération de l'utilisateur
$user = $userRpo->findOneBy(['id'=>$id]);
// interdit l'accès à la page si:
// le token associé au membre est null
// le token enregistré en base et le token présent dans l'url ne sont pas égaux
// le token date de plus de 10 minutes
if ($user->getToken() === null || $token !== $user->getToken() || !$this->isRequestInTime($user->getPasswordRequestedAt()))
{
$request->getSession()->getFlashBag()->add('warning', "Delai expiré, veuillez réessayer !");
return $this->redirectToRoute('forgot_pwd');
}
$form = $this->createForm(ResettingType::class);
$form->handleRequest($request);
// dd($form->getData()['plainPassword']);
if ($form->isSubmitted() && $form->isValid()) {
$password = $passwordEncoder->encodePassword($user, $form->getData()['plainPassword']);
// $password = $passwordEncoder->encodePassword($user, $form->getData()->getPlainPassword());
$user->setPassword($password);
// réinitialisation du token à null pour qu'il ne soit plus réutilisable
$user->setToken(null);
$user->setPasswordRequestedAt(null);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
$request->getSession()->getFlashBag()->add('success', "Votre mot de passe a été renouvelé.");
return $this->redirectToRoute('security.login');
}
return $this->render('auth/reset.html.twig', ['form' => $form->createView()]);
}
}