<?php
namespace App\Controller;
use DateTime;
use App\Service\Mailjet;
use App\Entity\ResetPassword;
use App\Form\Admin\ResetPasswordType;
use App\Service\CheckRecaptcha;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\ResetPasswordRepository;
use App\Service\StaticData;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class ResetPasswordController extends AbstractController
{
public function __construct(EntityManagerInterface $manager, StaticData $statics)
{
$this->manager = $manager;
$this->statics = $statics->getStaticData();
}
/**
* @Route("/mot-de-passe-oublie", name="reset_password")
*/
public function index(Request $request, UserRepository $userRepo, CheckRecaptcha $recaptcha): Response
{
$page = ['title'=>'Mot de passe oublié'];
# je check si l'utilisateur est déja connecté ?
if ($this->getUser()) {
$this->redirectToRoute('home');
}
# je check si il email à été soumis pour la récupération de mot de passe
if ($request->get('email')) {
define('SITE_KEY','6Lf6ntcdAAAAAFIFOj0w_4Q3_q8fs-zXu7senO2n');
define('SECRETE_KEY','6Lf6ntcdAAAAAImt18bgJi8ajipSKwPYfIq3RQd3');
if ( $recaptcha->check($_POST['reset-recaptcha_response'], SECRETE_KEY) ){
$user = $userRepo->findOneByEmail($request->get('email'));
if ($user) {
# 1 : enregistrer un bdd la demande de reset password
$reset_password = new ResetPassword();
$reset_password
->setUser($user)
->setToken(uniqid("RP"))
->setCreatedAt(new DateTime());
$this->manager->persist($reset_password);
$this->manager->flush();
# 2 : Envoi d'un mail à l'utilisateur
$mailjet = new Mailjet();
$mail_content = $this->renderView('admin/components/mail/_reset_password.html.twig', compact('reset_password'));
$mailjet->send("caurettemarc@gmail.com", "gite-colombine.fr", "maximeavril.dev@gmail.com", "Administrateur", 'Mot de passe oublié', $mail_content, false, false, 3367969);
$flashbag = [
'label' => 'success',
'title' => "Demande prise en compte",
'message' => "Un mail vient de vous être envoyer pour la création de votre nouveau mot de passe !",
'footer' => "Vérifiez vos spams"
];
return $this->render('admin/components/flash/reset_password.html.twig', [
'data' => $reset_password,
'flashbag' => $flashbag
]);
}else {
$flashbag = [
'label' => 'warning',
'title' => "Erreur...",
'message' => "Oups... il semblerait que l'email saisi ne soit pas valide.",
'footer' => "Assurez vous bien de mettre l'email d'un compte existant..."
];
return $this->render('admin/components/flash/reset_password.html.twig', [
'data' => null,
'flashbag' => $flashbag
]);
}
}else {
$flashbag = [
'label' => 'warning',
'title' => "Erreur...",
'message' => "Oups... il semblerait que Google ReCaptcha(bloqueur de spam) ait bloqué l'envoi...",
'footer' => "Merci de recommencer l'opération."
];
return $this->render('admin/components/flash/reset_password.html.twig', [
'data' => null,
'flashbag' => $flashbag
]);
}
}
return $this->render('admin/reset_password/index.html.twig', [
'statics' => $this->statics['data'],
'page' => $page,
'page_title' => '<img class="mt-5 mb-3" src="/images/about/logo-admin-dark-h.png">',
]);
}
/**
* @Route("/modifier-mot-de-passe/{token}", name="update_password")
*/
public function update($token, Request $request ,ResetPasswordRepository $resetPasswordRepo, UserPasswordHasherInterface $encoder, CheckRecaptcha $recaptcha)
{
$page = ['title'=>'Nouveau mot de passe'];
# je recupère l'action liée a l'utilisateur
$reset_password = $resetPasswordRepo->findOneByToken($token);
# je verifie que la demande exist
if(!$reset_password){
return $this->redirectToRoute('reset_password', [
'error' => "Un problème est servenu... Merci de recommencer l'opération."
]);
}
# je verifie que la demande est toujours valide (now + 1h)
$now = new DateTime();
if ($now > $reset_password->getCreatedAt()->modify('+ 1 hour')) {
$this->addFlash(
'warning',
"Votre demande de mot de passe a expiré, veuillez la renouveller."
);
return $this->redirectToRoute('reset_password');
}
# Rendre une vue avec mot de passe
$form = $this->createForm(ResetPasswordType::class);
$form->handleRequest($request);
# si le form est valid et soumis
if ($form->isSubmitted() && $form->isValid()) {
define('SITE_KEY','6Lf6ntcdAAAAAFIFOj0w_4Q3_q8fs-zXu7senO2n');
define('SECRETE_KEY','6Lf6ntcdAAAAAImt18bgJi8ajipSKwPYfIq3RQd3');
if ( $recaptcha->check($_POST['update-recaptcha_response'], SECRETE_KEY) ){
# je recupère le password
$new_pwd = $form->get('new_password')->getData();
//je l'encode
$password_encoded = $encoder->hashPassword($reset_password->getUser(), $new_pwd);
$reset_password->getUser()->setPassword($password_encoded);
# je flush les données
$this->manager->flush();
# envoi du mail de confirmation
$mailjet = new Mailjet();
$mail_content = $this->renderView('admin/components/mail/_update_password.html.twig', compact('reset_password'));
$mailjet->send("caurettemarc@gmail.com", "gite-colombine.fr", "maximeavril.dev@gmail.com", "Administrateur", 'Mot de passe modifié !', false, false, $mail_content, 3367969);
# je notifie l'utilisateur Ajax
$flashbag = [
'label' => 'success',
'title' => "Modifier avec succes",
'message' => "Un mail de confirmation vient de vous être envoyer.",
'footer' => "Vous pouvez maintenant vous connecter !",
'link' => "Je me connecte !"
];
return $this->render('admin/components/flash/update_password.html.twig', [
'data' => $reset_password,
'flashbag' => $flashbag
]);
}else {
$flashbag = [
'label' => 'warning',
'title' => "Erreur...",
'message' => "Oups... il semblerait que Google ReCaptcha(bloqueur de spam) ait bloqué l'envoi...",
'footer' => "Merci de recommencer l'opération.",
'link' => "Recommencer"
];
return $this->render('admin/components/flash/update_password.html.twig', [
'data' => null,
'flashbag' => $flashbag
]);
}
}
return $this->render('admin/reset_password/update.html.twig',[
'form' => $form->createView(),
'page' => $page
]);
}
}