<?php
namespace App\Controller;
use App\Entity\ModUser;
use App\Repository\ModUserRepository;
use App\Entity\ModIpbann;
use App\Repository\ModIpbannRepository;
use App\Entity\ModPage;
use App\Repository\ModPageRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use phpDocumentor\Reflection\Project;
class SecurityController extends AbstractController
{
public $from = "stephane@webgiciel.com";
public $limiteEssai = 3;
public $interrupteur = 0;
public function __construct(ModPageRepository $pagesRepo, ModIpbannRepository $ipbannRepo, ModUserRepository $userRepo, UserPasswordHasherInterface $passwordEncoder, EntityManagerInterface $em)
{
$this->pagesRepo = $pagesRepo;
$this->ipbannRepo = $ipbannRepo;
$this->userRepo = $userRepo;
$this->passwordEncoder = $passwordEncoder;
$this->em = $em;
}
// Fonctions utiles ******************************************************************************************* **** //
// fonction
public function ifNoAdmin()
{
// recupere tous les admins
$admins = $this->userRepo->isAdmin();
//dump($admins);
// si pas d'admin
if (count($admins) == 0){
return 'secur_premiereconnexion';
}
// sinon user existe
else{
return '';
}
}
// fabrication d'un codeVerif
public function codeVerif()
{
$code = rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9);
return $code;
}
// fabrication d'un codeUser
public function codeUser($user)
{
$code = rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9).rand(0, 9);
return $code;
}
// envoi un email
public function envoiEmail($dest, $sujet, $message, $template, $titre, $context, MailerInterface $mailer)
{
$email = (new TemplatedEmail())
->from($this->from)
->to(new Address($dest))
->subject($sujet)
->text($message)
->htmlTemplate($template)
->context($context)
;
try {
$mailer->send($email);
} catch (TransportExceptionInterface $e) {
// some error prevented the email sending; display an
// error message or try to resend the message
dump($e);
}
}
// fonction qui redirige vers la page premiere connexion si la base des user est vide
public function ifNoUser(){
// recupere tous les users
$users = $this->userRepo->findAll();
// si pas de users
if (count($users) == 0){
return 'security_premiere_inscription';
}
// sinon user existe
else{
return '';
}
}
// makehash
public function makehash($user)
{
$hash = md5($user->getUsername()."polopKey".$user->getEmail());
return $hash;
}
// Fonctions de formulaires ******************************************************************************************* **** //
// formulaire d'Inscription premier admin
public function formPremierAdmin($task){
$form = $this->createFormBuilder($task)
->add('username', TextType::class, [
'label' => 'Choisissez votre pseudo *',
'required' => false,
'help' => 'Votre pseudo ne doit pas contenir de caractères spéciaux, et doit contenir entre 4 et 16 caractères.',
'attr' => [
"class" => "form-control-lg",
"onkeypress" => "verifierCaracteres(event); return false;",
"placeholder" => "Pseudo",
]
])
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'Attention, les champs mot de passe doivent correspondrent.',
'options' => [
'attr' => [
'class' => 'password-field form-control form-control-lg'
]
],
'required' => false,
'first_options' =>
[
'label' => 'Choisissez un mot de passe',
'help' => 'Votre mot de passe doit contenir au moins une majuscule, une minuscule, un chiffre et un caractère spécial, et doit contenir entre 8 et 16 caractères.',
'attr' => [
'class' => 'form-control',
'placeholder' => 'Mot de passe *',
],
'row_attr' => [
'class' => '',
]
],
'second_options' =>
[
'label' => 'Retaper votre mot de passe *',
'attr' => [
'class' => 'form-control',
'placeholder' => 'Retaper le mot de passe'
],
],
])
->add('email', EmailType::class, [
'label' => 'Votre mail de contact *',
'required' => false,
'help' => 'Votre mail doit être fonctionnel car il vous permettra d\'activer votre compte.',
'attr' => [
"class" => "form-control form-control-lg",
"placeholder" => "Email",
]
])
->add('telephone', TelType::class, [
'label' => 'Votre téléphone',
'required' => false,
'help' => 'Optionnel',
'attr' => [
"class" => "form-control form-control-lg",
"placeholder" => "Téléphone",
]
])
->add('cgu', CheckboxType::class, [
'label' => 'J\'accepte les conditions générales d\'utilisation.',
'required' => false,
'label_attr' => [
"class" => "form-check-label text-muted",
],
'attr' => [
"class" => "form-check-label text-muted",
],
])
->add('prenom', TextType::class, [
'label' => 'Prénom',
'required' => false,
'help' => '',
'attr' => [
"class" => "form-control-lg",
"placeholder" => "Prénom",
]
])
->add('nom', TextType::class, [
'label' => 'Nom',
'required' => false,
'help' => '',
'attr' => [
"class" => "form-control-lg",
"placeholder" => "Nom",
]
])
->add('societe', TextType::class, [
'label' => 'Société',
'required' => false,
'help' => '',
'attr' => [
"class" => "form-control-lg",
"placeholder" => "Société",
]
])
->add('save', SubmitType::class, [
'label' => 'Enregistrer',
'attr' => [
"class" => "btn btn-block btn-primary btn-lg font-weight-medium auth-form-btn",
],
])
->getForm();
return $form;
}
// formulaire d'Inscription
public function formInscription($task){
$form = $this->createFormBuilder($task)
->add('username', TextType::class, [
'label' => 'Choisissez votre pseudo *',
'required' => false,
'attr' => [
"placeholder" => "Pseudo",
]
])
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'Attention, les champs mot de passe doivent correspondrent.',
'options' => [
'attr' => [
'class' => 'form-control'
]
],
'required' => true,
'first_options' =>
[
'label' => 'Choisissez un mot de passe',
'help' => 'Votre mot de passe doit contenir au moins une majuscule, une minuscule, un chiffre et un caractère spécial, et doit contenir entre 8 et 16 caractères.',
'attr' => [
'class' => 'form-control',
'placeholder' => 'Mot de passe *',
],
'row_attr' => [
'class' => '',
]
],
'second_options' =>
[
'label' => 'Retaper votre mot de passe *',
'attr' => [
'class' => 'form-control',
'placeholder' => 'Retaper le mot de passe'
],
],
])
->add('email', EmailType::class, [
'label' => 'Votre mail de contact *',
'required' => true,
'help' => 'Votre mail doit être fonctionnel car il vous permettra d\'activer votre compte.',
'attr' => [
"class" => "form-control",
"placeholder" => "Email",
]
])
->add('prenom', TextType::class, [
'label' => 'Prénom',
'required' => false,
'help' => '',
'attr' => [
"placeholder" => "Prénom",
]
])
->add('nom', TextType::class, [
'label' => 'Nom',
'required' => false,
'help' => '',
'attr' => [
"placeholder" => "Nom",
]
])
->add('societe', TextType::class, [
'label' => 'Société',
'required' => false,
'help' => '',
'attr' => [
"placeholder" => "Société",
]
])
->add('telephone', TelType::class, [
'label' => 'Téléphone',
'required' => false,
'help' => 'Optionnel',
'attr' => [
"class" => "form-control",
"placeholder" => "Téléphone",
]
])
->add('cgu', CheckboxType::class, [
'label' => ' J\'accepte les conditions générales d\'utilisation. *',
'required' => true,
'label_attr' => [
],
'attr' => [
"style" => "padding:0; border-color:#213b52;",
],
])
->add('save', SubmitType::class, [
'label' => 'Enregistrer',
'attr' => [
"class" => "btn-get-started",
],
])
->getForm();
return $form;
}
// formulaire de Vérification du code email
public function formVerifCodeEmail($task){
$form = $this->createFormBuilder($task)
->add('codeVerif', TextType::class, [
'label' => 'Renseignez ici le code reçu par email',
'required' => false,
'attr' => [
"class" => "form-control-lg",
"placeholder" => "Code",
]
])
->add('save', SubmitType::class, [
'label' => 'Envoyer',
'attr' => [
"class" => "btn btn-block btn-primary btn-lg font-weight-medium auth-form-btn",
],
])
->getForm();
return $form;
}
// formulaire d'oubli des identifiants
public function formOubliId($task){
$form = $this->createFormBuilder($task)
->add('email', EmailType::class, [
'label' => 'Renseignez ici votre email de contact',
'required' => false,
'attr' => [
"class" => "form-control",
"placeholder" => "Email",
]
])
->add('save', SubmitType::class, [
'label' => 'Envoyer',
'attr' => [
"class" => "btn btn-block btn-primary btn-lg font-weight-medium auth-form-btn",
],
])
->getForm();
return $form;
}
// formulaire de reinitialisation
public function formOubliReinit(){
$form = $this->createFormBuilder()
->add('username', TextType::class, [
'label' => 'Renseignez votre pseudo',
'required' => false,
'attr' => [
"class" => "form-control-lg",
"placeholder" => "Pseudo",
]
])
->add('verifcode', TextType::class, [
'label' => 'Renseignez le CodeVerif',
'required' => false,
'attr' => [
"class" => "form-control-lg",
"placeholder" => "CodeVerif",
]
])
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'Attention, les champs mot de passe doivent correspondrent.',
'options' => [
'attr' => [
'class' => 'password-field form-control form-control-lg'
]
],
'required' => false,
'first_options' =>
[
'label' => 'Choisissez votre nouveau mot de passe',
'help' => 'Votre mot de passe doit contenir au moins une majuscule, une minuscule, un chiffre et un caractère spécial, et doit contenir entre 8 et 16 caractères.',
'attr' => [
'class' => 'form-control',
'placeholder' => 'Mot de passe *',
],
'row_attr' => [
'class' => '',
]
],
'second_options' =>
[
'label' => 'Retaper votre nouveau mot de passe',
'attr' => [
'class' => 'form-control',
'placeholder' => 'Retaper le mot de passe'
],
],
])
->add('save', SubmitType::class, [
'label' => 'Envoyer',
'attr' => [
"class" => "btn btn-block btn-primary btn-lg font-weight-medium auth-form-btn",
],
])
->getForm();
return $form;
}
// Pages ******************************************************************************************* **** //
/**
* @Route("/premiereconnexion", name="secur_premiereconnexion")
*/
public function secur_premiereconnexion(Request $request, MailerInterface $mailer): Response
{
// 1. Test si il existe au moins un admin actif
if( $this->ifNoAdmin() == ""){
// 2. Redirige vers front_index
return $this->redirectToRoute('front_index');
}
// 3. init user
$user = new ModUser();
// 4. construction du formulaire d'inscription
$form = $this->formPremierAdmin($user);
$form->handleRequest($request);
// Si le formulaire est soumis
if ($form->isSubmitted() && $form->isValid()) {
// 6. fabrication du codeVerif
$codeVerif = $this->codeVerif();
// 7. fabrication du codeUser
$codeUser = $this->makehash($user);
// 8. renseigne l'objet user
$user->setActif(0);
$user->setRoles(['ROLE_ADMIN']);
$user->setPassword(
$this->passwordEncoder->hashPassword(
$user,
$form->get('password')->getData()
)
);
$user->setDateCrea(new \DateTime("NOW"));
$user->setDateModif(new \DateTime("NOW"));
$user->setCodeVerif($codeVerif);
// 9. enregistre l'objet user dans la base
$this->em->persist($user);
$this->em->flush();
// 10. construit le message en texte seul
$message = '
codeVerif : '.$codeVerif.'
';
// 11. envoi un email pour verifier l email
$this->envoiEmail(
$user->getEmail(),
"Inscription de l'administrateur",
$message,
"security/inscription/emails/mailPremiereConnexion.html.twig",
"Inscription de l'administrateur",
[
'titreDansLeMail' => "Inscription de l'administrateur",
'pseudo' => $user->getUsername(),
'codeVerif' => $user->getCodeVerif(),
'codeUser' => $codeUser,
],
$mailer
);
// 12. prepare le message flash success
$this->addFlash('success', 'Un email contenant la suite de la procédure d\'inscription vient de vous être envoyé.');
// 13. redirection vers secur_preinscription
return $this->redirectToRoute('secur_preinscription');
}
// 5. affichage de la page
return $this->render('security/inscription/premiereconnexion.html.twig', [
'controller_name' => 'security_premiere_inscription',
'user' => $user,
'form' => $form->createView(),
]);
}
/**
* @Route("/preinscription", name="secur_preinscription")
*/
public function secur_preinscription(): Response
{
// 1. Affiche la Page
return $this->render('security/inscription/preinscription.html.twig', [
'controller_name' => 'secur_preinscription',
'pages' => $this->pagesRepo->findAll(),
]);
}
/**
* @Route("/activation/{username}/{hash}", name="secur_activationCode")
*/
public function secur_activationCode($username, $hash, Request $request): Response
{
// 1. Récupère la session
$session = $request->getSession();
// 2. Vérification de l'IP dans la liste des ip bannis
$recupBann = $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
// Si l'IP est banni => redirection vers secur_banni
if ( count($recupBann) > 0 ){
// 3. redirection vers secur_banni
return $this->redirectToRoute('secur_banni');
}
// 4. recupération du username et du codeUser
$nomUser = $username;
$codeUser = $hash;
// 5. init objet user
$user = $this->userRepo->findPseudo($nomUser);
// 6. construction du formulaire de vérification du code mail
$form = $this->formVerifCodeEmail($user);
$form->handleRequest($request);
// Si le formulaire est soumis
if ($form->isSubmitted() && $form->isValid()) {
// 8. recupère les champs du formulaire
$task = $form->getData();
// 9. Test si le nombre d'essai a dépassé la limite
if ( $session->get('nbrEssai') >= $this->limiteEssai ){
// 10. Récupération de l'ip de l'utilisateur
$ipVisiteur = $_SERVER['REMOTE_ADDR'];
// 11. Création et remplissage d'un nouvel objet lModIpbann
$ipBann = new ModIpbann();
$ipBann->setIp($ipVisiteur);
$ipBann->setReproche("Nombre d'essai dépassé lors de l'activation du compte.");
$ipBann->setDateCrea(new \DateTime("NOW"));
// 12. Enregistre l'objet ModIpbann dans la base
$this->em->persist($ipBann);
$this->em->flush();
// 13. Redirection vers secur_banni
return $this->redirectToRoute('secur_banni');
}
// 14. Comparaison des codes
if ($user[0]->getCodeVerif() != $task["codeVerif"])
{
// 15. Incrémente le nombre d essai
if ( $session->get('nbrEssai') == -1 )
{
$session->set('nbrEssai', 1);
}
else
{
$newEss = $session->get('nbrEssai') + 1;
$session->set('nbrEssai', $newEss );
}
// 16. prépare le message flash error
$this->addFlash('error', 'Attention le code saisi n\'est pas celui attendu ! Il vus reste '.abs($this->limiteEssai - $session->get('nbrEssai') + 1).' essai(s)');
}
else{
// 17. active user
$user[0]->setActif(1);
$user[0]->setDateModif(new \DateTime("NOW"));
// 18. enregistre dans la base
$this->em->persist($user[0]);
$this->em->flush();
// 19. reinit session nbrEssai
$session->set('nbrEssai', -1 );
// 20. prepare le message flash success
$this->addFlash('success', 'Votre compte est actif ! Loguez-vous pour entrer.');
// 21. redirection vers secur_login
return $this->redirectToRoute('secur_login');
}
}
// 7. affiche la page de formulaire
return $this->render('security/inscription/activation.html.twig', [
'controller_name' => 'secur_activationCode',
'user' => $user,
'form' => $form->createView(),
'request' => $request,
]);
}
/**
* @Route("/bann", name="secur_banni")
*/
public function secur_banni(): Response
{
// 1. verif ip banni
$recupBann = $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
// 2. Si l'IP ok pas banni => redirection vers front_index
if ( count($recupBann) == 0 ){
return $this->redirectToRoute('front_index');
}
// 3. affiche la page
return $this->render('security/bann/banni.html.twig', [
'controller_name' => 'secur_banni',
]);
}
// Pages visiteurs ******************************************************************************************* **** //
/**
* @Route("/login", name="secur_login")
*/
public function secur_login(AuthenticationUtils $authenticationUtils, Request $request): Response
{
// 1. Récupère la session
$session = $request->getSession();
// 2. verification si l ip user est banni
$recupBann = $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
// Si l'IP est banni => redirection vers secur_banni
if ( count($recupBann) > 0 ){
// 3. redirection vers secur_banni
return $this->redirectToRoute('secur_banni');
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
// 4. affiche la page
return $this->render('security/login.html.twig', [
'controller_name' => 'secur_login',
'last_username' => $lastUsername,
'error' => $error,
]);
}
/**
* @Route("/logout", name="secur_logout", methods={"GET"})
*/
public function secur_logout(): void
{
// controller can be blank: it will never be called!
//throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
// 2. prépare le message flash error
$this->addFlash('success', 'Merci pour votre visite, à bientôt!');
}
/**
* @Route("/inscription", name="secur_inscription")
*/
public function secur_inscription(Request $request, MailerInterface $mailer): Response
{
// 1. Vérification de l'IP dans la liste des ip bannis
$recupBann = $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
// Si l'IP est banni => redirection vers secur_banni
if ( count($recupBann) > 0 ){
// 2. Redirection vers secur_banni
return $this->redirectToRoute('secur_banni');
}
// 3. init user
$user = new ModUser();
// 4. construction du formulaire d'inscription
$form = $this->formInscription($user);
$form->handleRequest($request);
// Si le formulaire est soumis
if ($form->isSubmitted() && $form->isValid()) {
// 6. fabrication du codeVerif
$codeVerif = $this->codeVerif();
// 7. fabrication du codeUser
$codeUser = $this->makehash($user);
// 8. renseigne l'objet user
$user->setActif(0);
$user->setRoles(['ROLE_USER']);
$user->setPassword(
$this->passwordEncoder->hashPassword(
$user,
$form->get('password')->getData()
)
);
$user->setDateCrea(new \DateTime("NOW"));
$user->setDateModif(new \DateTime("NOW"));
$user->setCodeVerif($codeVerif);
// 9. enregistre l'objet user dans la base
$this->em->persist($user);
$this->em->flush();
// 10. construit le message en texte seul
$message = '
codeVerif : '.$codeVerif.'
';
// 11. envoi un email pour verifier l email
$this->envoiEmail(
$user->getEmail(),
"Activation de votre compte Webgiciel",
$message,
"security/inscription/emails/mailInscription.html.twig",
"Votre compte Webgiciel est créé !",
[
'titreDansLeMail' => "Votre compte Webgiciel est créé !",
'pseudo' => $user->getUsername(),
'codeVerif' => $user->getCodeVerif(),
'codeUser' => $codeUser,
],
$mailer
);
// 12. prepare le message flash success
$this->addFlash('success', 'Un email contenant la suite de la procédure d\'inscription vient de vous être envoyé.');
// 13. redirection vers secur_preinscription
return $this->redirectToRoute('secur_preinscription');
}
// 7. affiche la page de formulaire
return $this->render('security/inscription/inscription.html.twig', [
'controller_name' => 'secur_inscription',
'user' => $user,
'form' => $form->createView(),
'pages' => $this->pagesRepo->findAll(),
]);
}
/**
* @Route("/oubli", name="secur_oubli")
*/
public function secur_oubli(Request $request, MailerInterface $mailer): Response
{
// 1. Récupère la session
$session = $request->getSession();
// 2. Vérification de l'IP dans la liste des ip bannis
$recupBann = $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
// Si l'IP est banni => redirection vers secur_banni
if ( count($recupBann) > 0 ){
// 3. redirection vers secur_banni
return $this->redirectToRoute('secur_banni');
}
// 4. init objet user
$user = new ModUser();
// 5. construction du formulaire d'oubli
$form = $this->formOubliId($user);
$form->handleRequest($request);
// Si le formulaire est soumis
if ($form->isSubmitted() && $form->isValid()) {
// 7. recupère les champs du formulaire
$taskEmail = $user->getEmail();
// 8. Test l'existence du mail dans la base user
$userRecup = $this->userRepo->findEmail($taskEmail);
// Si l'email existe
if ( count($userRecup) > 0 )
{
// 9. recup le user
$user = $userRecup[0];
// 10. fabrication du codeVerif
$codeVerif = $this->codeVerif();
// 11. fabrication du codeUser
$codeUser = $this->makehash($user);
// 12. renseigne le compte
$user->setActif(0);
$user->setCodeVerif($codeVerif);
// 13. enregistre dans la base
$this->em->persist($user);
$this->em->flush();
// 14. préparation du mail
$message = '
codeVerif : '.$codeVerif.'
';
// 15. envoi un email pour verifier l email
$this->envoiEmail(
$user->getEmail(),
"Récupération des identifiants",
$message,
"security/inscription/emails/mailOubli.html.twig",
"Récupération des identifiants",
[
'titreDansLeMail' => "Récupération des identifiants",
'pseudo' => $user->getUsername(),
'codeVerif' => $user->getCodeVerif(),
'codeUser' => $codeUser,
],
$mailer
);
// 16. prepare le message flash success
$this->addFlash('success', 'Un email contenant la procédure de reinitialisation vient de vous être envoyé.');
// 17. redirection vers secur_reinitMdp
return $this->redirectToRoute('secur_oubliOk');
}
else{
// 17. prepare le message flash success
$this->addFlash('success', 'Un email * contenant la procédure de reinitialisation vient de vous être envoyé.');
// 18. redirection vers secur_reinitMdp
return $this->redirectToRoute('secur_oubliOk');
}
}
// 6. affiche la page de formulaire
return $this->render('security/oubli.html.twig', [
'controller_name' => 'secur_oubli',
'user' => $user,
'form' => $form->createView(),
]);
}
/**
* @Route("/oubli/actif", name="secur_oubliOk")
*/
public function secur_oubliOk(): Response
{
// 1. affiche la page
return $this->render('security/oubliok.html.twig', [
'controller_name' => 'secur_oubliOk',
]);
}
/**
* @Route("/reinit/{hash}", name="secur_reinitMdp")
*/
public function secur_reinitMdp($hash, Request $request): Response
{
// 1. Récupère la session
$session = $request->getSession();
// 2. init error
$error = 0;
// 3. Vérification de l'IP dans la liste des ip bannis
$recupBann = $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
// Si l'IP est banni => redirection vers secur_banni
if ( count($recupBann) > 0 ){
// 4. redirection vers secur_banni
return $this->redirectToRoute('secur_banni');
}
// 5. construction du formulaire de reinitialisation
$form = $this->formOubliReinit();
$form->handleRequest($request);
// Si le formulaire est soumis
if ($form->isSubmitted() && $form->isValid()) {
// 7. recupère les champs du formulaire
$monform = $form->getData();
$username = $monform["username"];
$verifcode = $monform["verifcode"];
$password = $monform["password"];
// 8. recup user avec le pseudo
$userRecup = $this->userRepo->findPseudo($username);
$user = $userRecup[0];
// 9. fabrication du codeUser
$codeUser = $this->makehash($user);
// 10. Test la comparaison entre les codes
if( $codeUser != $hash ){
// 11. incremente une erreur
$error++;
// 12. Incrémente le nombre d essai
if ( $session->get('nbrEssai') == -1 )
{
$session->set('nbrEssai', 1);
}
else
{
$newEss = $session->get('nbrEssai') + 1;
$session->set('nbrEssai', $newEss );
}
// 13. Test si le nombre d'essai a dépassé la limite
if ( $session->get('nbrEssai') >= $this->limiteEssai ){
// 14. Récupération de l'ip de l'utilisateur
$ipVisiteur = $_SERVER['REMOTE_ADDR'];
// 15. Création et remplissage d'un nouvel objet lModIpbann
$ipBann = new ModIpbann();
$ipBann->setIp($ipVisiteur);
$ipBann->setReproche("Nombre d'essai dépassé lors de l'activation du compte.");
$ipBann->setDateCrea(new \DateTime("NOW"));
// 16. Enregistre l'objet ModIpbann dans la base
$this->em->persist($ipBann);
$this->em->flush();
// 17. Redirection vers secur_banni
return $this->redirectToRoute('secur_banni');
}
// sinon
else{
// 18. prépare le message flash error
$this->addFlash('error', 'Attention le code saisi n\'est pas celui attendu ! Il vus reste '.abs($this->limiteEssai - $session->get('nbrEssai') + 1).' essai(s)');
// affiche form
}
}
// sinon les codes sont bons
else{
// 19. si la comparaison des verifcode est erroné
if( $verifcode != $user->getCodeVerif() ){
// 20. prépare le message flash error
$this->addFlash('error', 'Attention le code saisi n\'est pas celui attendu ! Il vus reste '.abs($this->limiteEssai - $session->get('nbrEssai') + 1).' essai(s)');
// affiche form
}
//
else{
// 21. renseigne l'objet user
$user->setActif(1);
$user->setPassword(
$this->passwordEncoder->hashPassword(
$user,
$password
)
);
$user->setDateModif(new \DateTime("NOW"));
// 22. enregistre l'objet user dans la base
$this->em->persist($user);
$this->em->flush();
// 23. prepare le message flash success
$this->addFlash('success', 'Votre mot de passe est modifié! Vous pouvez vous identifier pour continuer..');
// 24. redirection vers secur_login
return $this->redirectToRoute('secur_login');
}
}
}
// 6. affiche la page de formulaire
return $this->render('security/reinit.html.twig', [
'controller_name' => 'secur_reinitMdp',
'form' => $form->createView(),
]);
}
// AJAX ******************************************************************************************* **** //
/**
* @Route("/verifPseudo", name="secur_verifPseudo")
*/
public function secur_verifPseudo(Request $request, MailerInterface $mailer): JsonResponse
{
// 1. recupere datas de l'ajax
$pseudo = utf8_decode(htmlspecialchars($_POST["pseudo"]));
// 2. verif existance pseudo
$user = $this->userRepo->findPseudo($pseudo);
// 3. return json
return $this->json(['msg' => count($user)]);
}
/**
* @Route("/verifEmail", name="secur_verifEmail")
*/
public function secur_verifEmail(Request $request, MailerInterface $mailer): JsonResponse
{
// 1. recupere datas de l'ajax
$mailx = utf8_decode(htmlspecialchars($_POST["mailx"]));
// 2. verif existance pseudo
$user = $this->userRepo->findEmail($mailx);
// 3. return json
return $this->json(['msg' => count($user)]);
}
}