<?php
namespace App\Controller;
use App\Entity\Messagerie;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\Users;
use App\Form\ResettingType;
use App\Notification\MessageNotification;
use App\Services\Mailer;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
/**
* @Route("/renouvellement-mot-de-passe")
*/
class ResettingController extends AbstractController
{
private $generator;
public function __construct(UrlGeneratorInterface $generator)
{
$this->generator = $generator;
}
/**
* @Route("/requete", name="request_resetting")
*/
public function request(Request $request, MessageNotification $mailer, ManagerRegistry $doctrine , TokenGeneratorInterface $tokenGenerator)
{
// 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->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $doctrine->getManager();
// voir l'épisode 2 de cette série pour retrouver la méthode loadUserByUsername:
$user = $em->getRepository(Users::class)->findOneBy(['email'=> $form->getData()['email']]);
// aucun email associé à ce compte.
if (!$user) {
$this->addFlash('error', "Aucun compte ne correspond à cette adresse email");
return $this->redirectToRoute("request_resetting");
}
// création du token
$user->setToken($tokenGenerator->generateToken());
// enregistrement de la date de création du token
$user->setPasswordRequestedAt(new \Datetime());
$em->flush();
$lien = $this->generator->generate('resetting', ['id' => $user->getId(), 'token' => $user->getToken()], UrlGenerator::ABSOLUTE_URL);
$btnLien = '<table border="0" valign="top" cellspacing="0" cellpadding="0" width="550" align="center" class="rnb-col-1">
<tbody><tr>
<td valign="top">
<table cellpadding="0" border="0" align="center" cellspacing="0" class="rnb-btn-col-content" style="margin:auto; border-collapse: separate;">
<tbody><tr>
<td width="auto" valign="middle" bgcolor="#000000 " align="center" style="font-size:1.2em; font-family:Arial,Helvetica,sans-serif; color:#ffffff; font-weight:normal; padding:20px 30px; vertical-align: middle; background-color:#000000 ;border-radius:30px;border-top:0px None #ffffff;border-right:0px None #ffffff;border-bottom:0px None #ffffff;border-left:0px None #ffffff;">
<span style="color:#ffffff; font-weight:normal;">
<a style="text-decoration:none; color:#ffffff; font-weight:normal;" target="_blank" href="'.$lien.'"><strong>Modifier mon mot de passe</strong></a>
</span>
</td>
</tr></tbody></table>
</td>
</tr>
</tbody>
</table>' ;
// on utilise le service Mailer créé précédemment
/* $bodyMail = $mailer->createBodyMail('resetting/mail.html.twig', [
'user' => $user
]);
$mailer->sendMessage('from@email.com', $user->getEmail(), 'renouvellement du mot de passe', $bodyMail); */
$message = "<p>Bonjour,</p><br>
<p>Vous avez demandé à réinitialiser votre mot de passe ? </p>
<p>Rien de plus simple, cliquez ici et suivez les instructions : </p>
<br>
".$btnLien."
<br>
<p style='font-size:0.7em'>Si le lien ne fonctionne pas, copiez le lien ci-dessous et collez le dans votre navigateur : <br>
'".$lien."'
</p>
<br><br>
<p>À bientôt sur aoyos.fr</p>
<p> </p><br>
";
$messagerie = new Messagerie;
$messagerie->setEmail($user->getEmail());
$messagerie->setSujet("Réinitialisation de votre accès Aoyos");
$messagerie->setMessage($message);
$mailer->notify($messagerie);
$this->addFlash('success', "Un mail va vous être envoyé afin que vous puissiez renouveler votre mot de passe. Le lien que vous recevrez sera valide 24h.");
return $this->redirectToRoute("request_resetting");
}
return $this->render('security/requestmdp.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("/{id}/{token}", name="resetting")
*/
public function resetting(Users $user, $token, Request $request, ManagerRegistry $doctrine , UserPasswordHasherInterface $passwordEncoder)
{
// 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()))
{
$this->addFlash('success', "Ce lien a déjà été utilisé");
return $this->redirectToRoute('login');
}
$form = $this->createForm(ResettingType::class, $user);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid())
{
$password = $passwordEncoder->hashPassword($user, $user->getPlainPassword());
$user->setPassword($password);
// réinitialisation du token à null pour qu'il ne soit plus réutilisable
$user->setToken(null);
$user->setPasswordRequestedAt(null);
$em = $doctrine->getManager();
$em->persist($user);
$em->flush();
// $request->getSession()->getFlashBag()->add('success', "Votre mot de passe a été renouvelé.");
$this->addFlash('success', "Votre mot de passe a bien été modifié, vous pouvez vous connecter :");
return $this->redirectToRoute('login');
}
return $this->render('security/resetmdp.html.twig', [
'form' => $form->createView()
]);
}
}
?>