src/Controller/SecurityController.php line 849

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\ModUser;
  4. use App\Repository\ModUserRepository;
  5. use App\Entity\ModIpbann;
  6. use App\Repository\ModIpbannRepository;
  7. use App\Entity\ModPage;
  8. use App\Repository\ModPageRepository;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Symfony\Component\Form\Extension\Core\Type\TextType;
  18. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  19. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  20. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  21. use Symfony\Component\Form\Extension\Core\Type\TelType;
  22. use Symfony\Component\Form\Extension\Core\Type\DateType;
  23. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  24. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  25. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  26. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  27. use Symfony\Component\Form\CallbackTransformer;
  28. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  29. use Symfony\Component\Form\FormEvent;
  30. use Symfony\Component\Form\FormEvents;
  31. use Symfony\Component\Validator\Constraints\NotBlank;
  32. use Symfony\Component\Mailer\MailerInterface;
  33. use Symfony\Component\Mime\Email;
  34. use Symfony\Component\Mime\Address;
  35. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  36. use phpDocumentor\Reflection\Project;
  37. class SecurityController extends AbstractController
  38. {
  39.     public $from "stephane@webgiciel.com";
  40.     public $limiteEssai 3;
  41.     public $interrupteur 0;
  42.     public function __construct(ModPageRepository $pagesRepoModIpbannRepository $ipbannRepoModUserRepository $userRepoUserPasswordHasherInterface $passwordEncoderEntityManagerInterface $em)
  43.     {
  44.       $this->pagesRepo $pagesRepo;
  45.       $this->ipbannRepo $ipbannRepo;
  46.       $this->userRepo $userRepo;
  47.       $this->passwordEncoder $passwordEncoder;
  48.       $this->em $em;
  49.     }
  50.     // Fonctions utiles ******************************************************************************************* **** //
  51.     // fonction 
  52.     public function ifNoAdmin()
  53.     {
  54.       // recupere tous les admins
  55.       $admins $this->userRepo->isAdmin();
  56.       //dump($admins);
  57.       // si pas d'admin
  58.       if (count($admins) == 0){
  59.         return 'secur_premiereconnexion';
  60.       }
  61.       // sinon user existe
  62.       else{
  63.         return '';
  64.       }
  65.     }
  66.     // fabrication d'un codeVerif
  67.     public function codeVerif()
  68.     {
  69.         $code rand(09).rand(09).rand(09).rand(09).rand(09).rand(09);
  70.         return $code;
  71.     }
  72.     // fabrication d'un codeUser
  73.     public function codeUser($user)
  74.     {
  75.         $code rand(09).rand(09).rand(09).rand(09).rand(09).rand(09);
  76.         return $code;
  77.     }
  78.     // envoi un email
  79.     public function envoiEmail($dest$sujet$message$template$titre$contextMailerInterface $mailer)
  80.     {
  81.       $email = (new TemplatedEmail())
  82.       ->from($this->from)
  83.       ->to(new Address($dest))
  84.       ->subject($sujet)
  85.       ->text($message)
  86.       ->htmlTemplate($template)
  87.       ->context($context)
  88.       ;
  89.       try {
  90.           $mailer->send($email);
  91.       } catch (TransportExceptionInterface $e) {
  92.           // some error prevented the email sending; display an
  93.           // error message or try to resend the message
  94.           dump($e);
  95.       }
  96.     }
  97.     // fonction qui redirige vers la page premiere connexion si la base des user est vide
  98.     public function ifNoUser(){
  99.         // recupere tous les users
  100.         $users $this->userRepo->findAll();
  101.   
  102.         // si pas de users
  103.         if (count($users) == 0){
  104.           return 'security_premiere_inscription';
  105.         }
  106.         // sinon user existe
  107.         else{
  108.           return '';
  109.         }
  110.   
  111.     }
  112.   
  113.     // makehash
  114.     public function makehash($user)
  115.     {
  116.       $hash md5($user->getUsername()."polopKey".$user->getEmail());
  117.       return $hash;
  118.     }
  119.     // Fonctions de formulaires ******************************************************************************************* **** //
  120.     // formulaire d'Inscription premier admin
  121.     public function formPremierAdmin($task){
  122.         $form $this->createFormBuilder($task)
  123.             ->add('username'TextType::class, [
  124.               'label' => 'Choisissez votre pseudo *',
  125.               'required'   => false,
  126.               'help' => 'Votre pseudo ne doit pas contenir de caractères spéciaux, et doit contenir entre 4 et 16 caractères.',
  127.               'attr' => [
  128.                 "class" => "form-control-lg",
  129.                 "onkeypress" => "verifierCaracteres(event); return false;",
  130.                 "placeholder" => "Pseudo",
  131.                 ]
  132.             ])
  133.             ->add('password'RepeatedType::class, [
  134.                 'type' => PasswordType::class,
  135.                 'invalid_message' => 'Attention, les champs mot de passe doivent correspondrent.',
  136.                 'options' => [
  137.                   'attr' => [
  138.                     'class' => 'password-field form-control form-control-lg'
  139.                     ]
  140.                   ],
  141.                   'required' => false,
  142.                   
  143.                   'first_options'  => 
  144.                   [
  145.                     'label' => 'Choisissez un mot de passe',
  146.                     '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.',
  147.                     'attr' => [
  148.                       'class' => 'form-control',
  149.                       'placeholder' => 'Mot de passe *',
  150.                   ],
  151.                   'row_attr' => [
  152.                       'class' => ''
  153.                   ]
  154.                 ],
  155.                 
  156.                 'second_options' => 
  157.                 [
  158.                   'label' => 'Retaper votre mot de passe *',
  159.                   'attr' => [
  160.                     'class' => 'form-control',
  161.                     'placeholder' => 'Retaper le mot de passe'
  162.                 ],
  163.               ],
  164.             ])
  165.             ->add('email'EmailType::class, [
  166.               'label' => 'Votre mail de contact *',
  167.               'required'   => false,
  168.               'help' => 'Votre mail doit être fonctionnel car il vous permettra d\'activer votre compte.',
  169.               'attr' => [
  170.                 "class" => "form-control form-control-lg",
  171.                 "placeholder" => "Email",
  172.                 ]
  173.             ])
  174.             ->add('telephone'TelType::class, [
  175.               'label' => 'Votre téléphone',
  176.               'required'   => false,
  177.               'help' => 'Optionnel',
  178.               'attr' => [
  179.                 "class" => "form-control form-control-lg",
  180.                 "placeholder" => "Téléphone",
  181.                 ]
  182.             ])
  183.             ->add('cgu'CheckboxType::class, [
  184.               'label'    => 'J\'accepte les conditions générales d\'utilisation.',
  185.               'required'   => false,
  186.               'label_attr' => [
  187.                 "class" => "form-check-label text-muted",
  188.               ],
  189.               'attr' => [
  190.                 "class" => "form-check-label text-muted",
  191.               ],
  192.             ])
  193.             ->add('prenom'TextType::class, [
  194.               'label' => 'Prénom',
  195.               'required'   => false,
  196.               'help' => '',
  197.               'attr' => [
  198.                 "class" => "form-control-lg",
  199.                 "placeholder" => "Prénom",
  200.                 ]
  201.             ])
  202.             ->add('nom'TextType::class, [
  203.               'label' => 'Nom',
  204.               'required'   => false,
  205.               'help' => '',
  206.               'attr' => [
  207.                 "class" => "form-control-lg",
  208.                 "placeholder" => "Nom",
  209.                 ]
  210.             ])
  211.             ->add('societe'TextType::class, [
  212.               'label' => 'Société',
  213.               'required'   => false,
  214.               'help' => '',
  215.               'attr' => [
  216.                 "class" => "form-control-lg",
  217.                 "placeholder" => "Société",
  218.                 ]
  219.             ])
  220.             ->add('save'SubmitType::class, [
  221.               'label' => 'Enregistrer'
  222.               'attr' => [
  223.                 "class" => "btn btn-block btn-primary btn-lg font-weight-medium auth-form-btn",
  224.               ],
  225.             ])
  226.             
  227.             ->getForm();
  228.         return $form;
  229.     }
  230.     // formulaire d'Inscription 
  231.     public function formInscription($task){
  232.       $form $this->createFormBuilder($task)
  233.           ->add('username'TextType::class, [
  234.             'label' => 'Choisissez votre pseudo *',
  235.             'required'   => false,
  236.             'attr' => [
  237.               "placeholder" => "Pseudo",
  238.               ]
  239.           ])
  240.   
  241.           ->add('password'RepeatedType::class, [
  242.               'type' => PasswordType::class,
  243.               'invalid_message' => 'Attention, les champs mot de passe doivent correspondrent.',
  244.               'options' => [
  245.                 'attr' => [
  246.                   'class' => 'form-control'
  247.                   ]
  248.                 ],
  249.                 'required' => true,
  250.                 
  251.                 'first_options'  => 
  252.                 [
  253.                   'label' => 'Choisissez un mot de passe',
  254.                   '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.',
  255.                   'attr' => [
  256.                     'class' => 'form-control',
  257.                     'placeholder' => 'Mot de passe *',
  258.                 ],
  259.                 'row_attr' => [
  260.                     'class' => ''
  261.                 ]
  262.               ],
  263.               
  264.               'second_options' => 
  265.               [
  266.                 'label' => 'Retaper votre mot de passe *',
  267.                 'attr' => [
  268.                   'class' => 'form-control',
  269.                   'placeholder' => 'Retaper le mot de passe'
  270.               ],
  271.             ],
  272.           ])
  273.           ->add('email'EmailType::class, [
  274.             'label' => 'Votre mail de contact *',
  275.             'required'   => true,
  276.             'help' => 'Votre mail doit être fonctionnel car il vous permettra d\'activer votre compte.',
  277.             'attr' => [
  278.               "class" => "form-control",
  279.               "placeholder" => "Email",
  280.               ]
  281.           ])
  282.           
  283.           ->add('prenom'TextType::class, [
  284.             'label' => 'Prénom',
  285.             'required'   => false,
  286.             'help' => '',
  287.             'attr' => [
  288.               "placeholder" => "Prénom",
  289.               ]
  290.           ])
  291.           ->add('nom'TextType::class, [
  292.             'label' => 'Nom',
  293.             'required'   => false,
  294.             'help' => '',
  295.             'attr' => [
  296.               "placeholder" => "Nom",
  297.               ]
  298.           ])
  299.           ->add('societe'TextType::class, [
  300.             'label' => 'Société',
  301.             'required'   => false,
  302.             'help' => '',
  303.             'attr' => [
  304.               "placeholder" => "Société",
  305.               ]
  306.           ])
  307.   
  308.           ->add('telephone'TelType::class, [
  309.             'label' => 'Téléphone',
  310.             'required'   => false,
  311.             'help' => 'Optionnel',
  312.             'attr' => [
  313.               "class" => "form-control",
  314.               "placeholder" => "Téléphone",
  315.               ]
  316.           ])
  317.           ->add('cgu'CheckboxType::class, [
  318.             'label'    => ' J\'accepte les conditions générales d\'utilisation. *',
  319.             'required'   => true,
  320.             'label_attr' => [
  321.             ],
  322.             'attr' => [
  323.               "style" => "padding:0; border-color:#213b52;",
  324.             ],
  325.           ])
  326.           ->add('save'SubmitType::class, [
  327.             'label' => 'Enregistrer'
  328.             'attr' => [
  329.               "class" => "btn-get-started",
  330.             ],
  331.           ])
  332.               
  333.           ->getForm();
  334.   
  335.           return $form;
  336.     }
  337.   
  338.     // formulaire de Vérification du code email
  339.     public function formVerifCodeEmail($task){
  340.       $form $this->createFormBuilder($task)
  341.           ->add('codeVerif'TextType::class, [
  342.             'label' => 'Renseignez ici le code reçu par email',
  343.             'required'   => false,
  344.             'attr' => [
  345.               "class" => "form-control-lg",
  346.               "placeholder" => "Code",
  347.               ]
  348.           ])
  349.           ->add('save'SubmitType::class, [
  350.             'label' => 'Envoyer'
  351.             'attr' => [
  352.               "class" => "btn btn-block btn-primary btn-lg font-weight-medium auth-form-btn",
  353.             ],
  354.           ])
  355.           
  356.       ->getForm();
  357.       return $form;
  358.     }
  359.   
  360.     // formulaire d'oubli des identifiants
  361.     public function formOubliId($task){
  362.       $form $this->createFormBuilder($task)
  363.           ->add('email'EmailType::class, [
  364.             'label' => 'Renseignez ici votre email de contact',
  365.             'required'   => false,
  366.             'attr' => [
  367.               "class" => "form-control",
  368.               "placeholder" => "Email",
  369.               ]
  370.           ])
  371.           ->add('save'SubmitType::class, [
  372.             'label' => 'Envoyer'
  373.             'attr' => [
  374.               "class" => "btn btn-block btn-primary btn-lg font-weight-medium auth-form-btn",
  375.             ],
  376.           ])
  377.           
  378.       ->getForm();
  379.       return $form;
  380.     }
  381.     // formulaire de reinitialisation
  382.     public function formOubliReinit(){
  383.       $form $this->createFormBuilder()
  384.         ->add('username'TextType::class, [
  385.           'label' => 'Renseignez votre pseudo',
  386.           'required'   => false,
  387.           'attr' => [
  388.             "class" => "form-control-lg",
  389.             "placeholder" => "Pseudo",
  390.             ]
  391.         ])
  392.         ->add('verifcode'TextType::class, [
  393.           'label' => 'Renseignez le CodeVerif',
  394.           'required'   => false,
  395.           'attr' => [
  396.             "class" => "form-control-lg",
  397.             "placeholder" => "CodeVerif",
  398.             ]
  399.         ])
  400.         ->add('password'RepeatedType::class, [
  401.             'type' => PasswordType::class,
  402.             'invalid_message' => 'Attention, les champs mot de passe doivent correspondrent.',
  403.             'options' => [
  404.               'attr' => [
  405.                 'class' => 'password-field form-control form-control-lg'
  406.                 ]
  407.               ],
  408.               'required' => false,
  409.               
  410.               'first_options'  => 
  411.               [
  412.                 'label' => 'Choisissez votre nouveau mot de passe',
  413.                 '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.',
  414.                 'attr' => [
  415.                   'class' => 'form-control',
  416.                   'placeholder' => 'Mot de passe *',
  417.               ],
  418.               'row_attr' => [
  419.                   'class' => ''
  420.               ]
  421.             ],
  422.             
  423.             'second_options' => 
  424.             [
  425.               'label' => 'Retaper votre nouveau mot de passe',
  426.               'attr' => [
  427.                 'class' => 'form-control',
  428.                 'placeholder' => 'Retaper le mot de passe'
  429.             ],
  430.           ],
  431.         ])
  432.         ->add('save'SubmitType::class, [
  433.           'label' => 'Envoyer'
  434.           'attr' => [
  435.             "class" => "btn btn-block btn-primary btn-lg font-weight-medium auth-form-btn",
  436.           ],
  437.         ])
  438.           
  439.         ->getForm();
  440.       return $form;
  441.     }
  442.     
  443.     // Pages ******************************************************************************************* **** //
  444.     /**
  445.      * @Route("/premiereconnexion", name="secur_premiereconnexion")
  446.      */
  447.     public function secur_premiereconnexion(Request $requestMailerInterface $mailer): Response
  448.     {
  449.       // 1. Test si il existe au moins un admin actif
  450.       if( $this->ifNoAdmin() == ""){
  451.         // 2. Redirige vers front_index
  452.         return $this->redirectToRoute('front_index');
  453.       }
  454.       // 3. init user
  455.       $user = new ModUser();
  456.       // 4. construction du formulaire d'inscription
  457.       $form $this->formPremierAdmin($user);
  458.       $form->handleRequest($request);
  459.       // Si le formulaire est soumis
  460.       if ($form->isSubmitted() && $form->isValid()) {
  461.         // 6. fabrication du codeVerif
  462.         $codeVerif $this->codeVerif();
  463.         // 7. fabrication du codeUser
  464.         $codeUser $this->makehash($user);
  465.     
  466.         // 8. renseigne l'objet user
  467.         $user->setActif(0);
  468.         $user->setRoles(['ROLE_ADMIN']);
  469.         $user->setPassword(
  470.           $this->passwordEncoder->hashPassword(
  471.             $user,
  472.             $form->get('password')->getData()
  473.           )
  474.         );
  475.         $user->setDateCrea(new \DateTime("NOW"));
  476.         $user->setDateModif(new \DateTime("NOW"));
  477.         $user->setCodeVerif($codeVerif);
  478.                 
  479.         // 9. enregistre l'objet user dans la base
  480.         $this->em->persist($user);
  481.         $this->em->flush();
  482.         
  483.         // 10. construit le message en texte seul
  484.         $message '
  485.             codeVerif : '.$codeVerif.'
  486.         ';
  487.                 
  488.         // 11. envoi un email pour verifier l email
  489.         $this->envoiEmail(
  490.           $user->getEmail(),
  491.           "Inscription de l'administrateur",
  492.           $message,
  493.           "security/inscription/emails/mailPremiereConnexion.html.twig",
  494.           "Inscription de l'administrateur",
  495.           [
  496.             'titreDansLeMail' => "Inscription de l'administrateur",
  497.             'pseudo' => $user->getUsername(),
  498.             'codeVerif' => $user->getCodeVerif(),
  499.             'codeUser' => $codeUser,
  500.           ],
  501.           $mailer
  502.         );
  503.     
  504.         // 12. prepare le message flash success
  505.         $this->addFlash('success''Un email contenant la suite de la procédure d\'inscription vient de vous être envoyé.');
  506.         
  507.         // 13. redirection vers secur_preinscription 
  508.         return $this->redirectToRoute('secur_preinscription');
  509.       }
  510.     
  511.       // 5. affichage de la page
  512.       return $this->render('security/inscription/premiereconnexion.html.twig', [
  513.           'controller_name' => 'security_premiere_inscription',
  514.           'user' => $user,
  515.           'form' => $form->createView(),
  516.       ]);
  517.     }
  518.     /**
  519.      * @Route("/preinscription", name="secur_preinscription")
  520.      */
  521.     public function secur_preinscription(): Response
  522.     {
  523.       // 1. Affiche la Page
  524.       return $this->render('security/inscription/preinscription.html.twig', [
  525.         'controller_name' => 'secur_preinscription',
  526.         'pages' => $this->pagesRepo->findAll(),
  527.       ]);
  528.     }
  529.     /**
  530.      * @Route("/activation/{username}/{hash}", name="secur_activationCode")
  531.      */
  532.     public function secur_activationCode($username$hashRequest $request): Response
  533.     {
  534.       // 1. Récupère la session
  535.       $session $request->getSession();
  536.       // 2. Vérification de l'IP dans la liste des ip bannis
  537.       $recupBann $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
  538.       // Si l'IP est banni => redirection vers secur_banni
  539.       if ( count($recupBann) > ){
  540.         // 3. redirection vers secur_banni
  541.         return $this->redirectToRoute('secur_banni');
  542.       }
  543.       // 4. recupération du username et du codeUser
  544.       $nomUser $username;
  545.       $codeUser $hash;
  546.       
  547.       // 5. init objet user
  548.       $user $this->userRepo->findPseudo($nomUser);
  549.       
  550.       // 6. construction du formulaire de vérification du code mail
  551.       $form $this->formVerifCodeEmail($user);
  552.       $form->handleRequest($request);
  553.       
  554.       // Si le formulaire est soumis
  555.       if ($form->isSubmitted() && $form->isValid()) {
  556.         
  557.         // 8. recupère les champs du formulaire
  558.         $task $form->getData();
  559.         
  560.         // 9. Test si le nombre d'essai a dépassé la limite
  561.         if ( $session->get('nbrEssai') >= $this->limiteEssai ){
  562.           // 10. Récupération de l'ip de l'utilisateur
  563.           $ipVisiteur $_SERVER['REMOTE_ADDR'];
  564.           // 11. Création et remplissage d'un nouvel objet lModIpbann
  565.           $ipBann = new ModIpbann();
  566.           $ipBann->setIp($ipVisiteur);
  567.           $ipBann->setReproche("Nombre d'essai dépassé lors de l'activation du compte.");
  568.           $ipBann->setDateCrea(new \DateTime("NOW"));
  569.           // 12. Enregistre l'objet ModIpbann dans la base
  570.           $this->em->persist($ipBann);
  571.           $this->em->flush();
  572.           // 13. Redirection vers secur_banni 
  573.           return $this->redirectToRoute('secur_banni');
  574.         }
  575.         
  576.         // 14. Comparaison des codes
  577.         if ($user[0]->getCodeVerif() != $task["codeVerif"])
  578.         {
  579.           // 15. Incrémente le nombre d essai
  580.           if ( $session->get('nbrEssai') == -
  581.           {
  582.             $session->set('nbrEssai'1);
  583.           }
  584.           else
  585.           {
  586.             $newEss $session->get('nbrEssai') + 1;
  587.             $session->set('nbrEssai'$newEss );
  588.           }
  589.           // 16. prépare le message flash error
  590.           $this->addFlash('error''Attention le code saisi n\'est pas celui attendu ! Il vus reste '.abs($this->limiteEssai $session->get('nbrEssai') + 1).' essai(s)');
  591.         }
  592.         else{
  593.           // 17. active user
  594.           $user[0]->setActif(1);
  595.           $user[0]->setDateModif(new \DateTime("NOW"));
  596.           // 18. enregistre dans la base
  597.           $this->em->persist($user[0]);
  598.           $this->em->flush();
  599.           // 19. reinit session nbrEssai
  600.           $session->set('nbrEssai', -);
  601.           // 20. prepare le message flash success
  602.           $this->addFlash('success''Votre compte est actif ! Loguez-vous pour entrer.');
  603.           // 21. redirection vers secur_login 
  604.           return $this->redirectToRoute('secur_login');
  605.         }
  606.       }
  607.       // 7. affiche la page de formulaire
  608.       return $this->render('security/inscription/activation.html.twig', [
  609.         'controller_name' => 'secur_activationCode',
  610.         'user' => $user,
  611.         'form' => $form->createView(),
  612.         'request' => $request,
  613.       ]);
  614.     }
  615.     /**
  616.      * @Route("/bann", name="secur_banni")
  617.      */
  618.     public function secur_banni(): Response
  619.     {
  620.       // 1. verif ip banni
  621.       $recupBann $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
  622.       // 2. Si l'IP ok pas banni => redirection vers front_index
  623.       if ( count($recupBann) == ){
  624.         return $this->redirectToRoute('front_index');
  625.       }
  626.       // 3. affiche la page
  627.       return $this->render('security/bann/banni.html.twig', [
  628.         'controller_name' => 'secur_banni',
  629.       ]);
  630.     }
  631.     // Pages visiteurs ******************************************************************************************* **** //
  632.     /**
  633.      * @Route("/login", name="secur_login")
  634.      */
  635.     public function secur_login(AuthenticationUtils $authenticationUtilsRequest $request): Response
  636.     {
  637.         // 1. Récupère la session
  638.         $session $request->getSession();
  639.         // 2. verification si l ip user est banni
  640.         $recupBann $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
  641.         // Si l'IP est banni => redirection vers secur_banni
  642.         if ( count($recupBann) > ){
  643.           // 3. redirection vers secur_banni
  644.           return $this->redirectToRoute('secur_banni');
  645.         }
  646.         // get the login error if there is one
  647.         $error $authenticationUtils->getLastAuthenticationError();
  648.         // last username entered by the user
  649.         $lastUsername $authenticationUtils->getLastUsername();
  650.         
  651.         // 4. affiche la page
  652.         return $this->render('security/login.html.twig', [
  653.             'controller_name' => 'secur_login',
  654.             'last_username' => $lastUsername,
  655.             'error' => $error,
  656.         ]);
  657.     }
  658.     /**
  659.      * @Route("/logout", name="secur_logout", methods={"GET"})
  660.      */
  661.     public function secur_logout(): void
  662.     {
  663.         // controller can be blank: it will never be called!
  664.         //throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  665.         // 2. prépare le message flash error
  666.         $this->addFlash('success''Merci pour votre visite, à bientôt!');
  667.     }
  668.     /**
  669.      * @Route("/inscription", name="secur_inscription")
  670.      */
  671.     public function secur_inscription(Request $requestMailerInterface $mailer): Response
  672.     {
  673.       // 1. Vérification de l'IP dans la liste des ip bannis
  674.       $recupBann $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
  675.       // Si l'IP est banni => redirection vers secur_banni
  676.       if ( count($recupBann) > ){
  677.         // 2. Redirection vers secur_banni
  678.         return $this->redirectToRoute('secur_banni');
  679.       }
  680.       // 3. init user
  681.       $user = new ModUser();
  682.       // 4. construction du formulaire d'inscription
  683.       $form $this->formInscription($user);
  684.       $form->handleRequest($request);
  685.       // Si le formulaire est soumis
  686.       if ($form->isSubmitted() && $form->isValid()) {
  687.         // 6. fabrication du codeVerif
  688.         $codeVerif $this->codeVerif();
  689.         // 7. fabrication du codeUser
  690.         $codeUser $this->makehash($user);
  691.     
  692.         // 8. renseigne l'objet user
  693.         $user->setActif(0);
  694.         $user->setRoles(['ROLE_USER']);
  695.         $user->setPassword(
  696.           $this->passwordEncoder->hashPassword(
  697.             $user,
  698.             $form->get('password')->getData()
  699.           )
  700.         );
  701.         $user->setDateCrea(new \DateTime("NOW"));
  702.         $user->setDateModif(new \DateTime("NOW"));
  703.         $user->setCodeVerif($codeVerif);
  704.                 
  705.         // 9. enregistre l'objet user dans la base
  706.         $this->em->persist($user);
  707.         $this->em->flush();
  708.         
  709.         // 10. construit le message en texte seul
  710.         $message '
  711.             codeVerif : '.$codeVerif.'
  712.         ';
  713.                 
  714.         // 11. envoi un email pour verifier l email
  715.         $this->envoiEmail(
  716.           $user->getEmail(),
  717.           "Activation de votre compte Webgiciel",
  718.           $message,
  719.           "security/inscription/emails/mailInscription.html.twig",
  720.           "Votre compte Webgiciel est créé !",
  721.           [
  722.             'titreDansLeMail' => "Votre compte Webgiciel est créé !",
  723.             'pseudo' => $user->getUsername(),
  724.             'codeVerif' => $user->getCodeVerif(),
  725.             'codeUser' => $codeUser,
  726.           ],
  727.           $mailer
  728.         );
  729.     
  730.         // 12. prepare le message flash success
  731.         $this->addFlash('success''Un email contenant la suite de la procédure d\'inscription vient de vous être envoyé.');
  732.         
  733.         // 13. redirection vers secur_preinscription 
  734.         return $this->redirectToRoute('secur_preinscription');
  735.       }
  736.       // 7. affiche la page de formulaire
  737.       return $this->render('security/inscription/inscription.html.twig', [
  738.         'controller_name' => 'secur_inscription',
  739.         'user' => $user,
  740.         'form' => $form->createView(),
  741.         'pages' => $this->pagesRepo->findAll(),
  742.       ]);
  743.       
  744.     }
  745.     /**
  746.      * @Route("/oubli", name="secur_oubli")
  747.      */
  748.     public function secur_oubli(Request $requestMailerInterface $mailer): Response
  749.     {
  750.       // 1. Récupère la session
  751.       $session $request->getSession();
  752.       // 2. Vérification de l'IP dans la liste des ip bannis
  753.       $recupBann $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
  754.       // Si l'IP est banni => redirection vers secur_banni
  755.       if ( count($recupBann) > ){
  756.         // 3. redirection vers secur_banni
  757.         return $this->redirectToRoute('secur_banni');
  758.       }
  759.       // 4. init objet user
  760.       $user = new ModUser();
  761.       // 5. construction du formulaire d'oubli
  762.       $form $this->formOubliId($user);
  763.       $form->handleRequest($request);
  764.       // Si le formulaire est soumis
  765.       if ($form->isSubmitted() && $form->isValid()) {
  766.         // 7. recupère les champs du formulaire
  767.         $taskEmail $user->getEmail();
  768.         
  769.         // 8. Test l'existence du mail dans la base user
  770.         $userRecup $this->userRepo->findEmail($taskEmail);
  771.         // Si l'email existe
  772.         if ( count($userRecup) > )
  773.         {
  774.           // 9. recup le user
  775.           $user $userRecup[0];
  776.           // 10. fabrication du codeVerif
  777.           $codeVerif $this->codeVerif();
  778.           // 11. fabrication du codeUser
  779.           $codeUser $this->makehash($user);
  780.           // 12. renseigne le compte
  781.           $user->setActif(0);
  782.           $user->setCodeVerif($codeVerif);
  783.           // 13. enregistre dans la base
  784.           $this->em->persist($user);
  785.           $this->em->flush();
  786.           // 14. préparation du mail
  787.           $message '
  788.               codeVerif : '.$codeVerif.'
  789.           ';
  790.           // 15. envoi un email pour verifier l email
  791.           $this->envoiEmail(
  792.             $user->getEmail(),
  793.             "Récupération des identifiants",
  794.             $message,
  795.             "security/inscription/emails/mailOubli.html.twig",
  796.             "Récupération des identifiants",
  797.             [
  798.               'titreDansLeMail' => "Récupération des identifiants",
  799.               'pseudo' => $user->getUsername(),
  800.               'codeVerif' => $user->getCodeVerif(),
  801.               'codeUser' => $codeUser,
  802.             ],
  803.             $mailer
  804.           );
  805.           // 16. prepare le message flash success
  806.           $this->addFlash('success''Un email contenant la procédure de reinitialisation vient de vous être envoyé.');
  807.           // 17. redirection vers secur_reinitMdp 
  808.           return $this->redirectToRoute('secur_oubliOk');
  809.         }
  810.         else{
  811.           // 17. prepare le message flash success
  812.           $this->addFlash('success''Un email * contenant la procédure de reinitialisation vient de vous être envoyé.');
  813.           // 18. redirection vers secur_reinitMdp 
  814.           return $this->redirectToRoute('secur_oubliOk');
  815.         }
  816.       }
  817.       // 6. affiche la page de formulaire
  818.       return $this->render('security/oubli.html.twig', [
  819.         'controller_name' => 'secur_oubli',
  820.         'user' => $user,
  821.         'form' => $form->createView(),
  822.       ]);
  823.     }
  824.     /**
  825.      * @Route("/oubli/actif", name="secur_oubliOk")
  826.      */
  827.     public function secur_oubliOk(): Response
  828.     {
  829.       // 1. affiche la page 
  830.       return $this->render('security/oubliok.html.twig', [
  831.         'controller_name' => 'secur_oubliOk',
  832.       ]);
  833.     }
  834.     /**
  835.      * @Route("/reinit/{hash}", name="secur_reinitMdp")
  836.      */
  837.     public function secur_reinitMdp($hashRequest $request): Response
  838.     {
  839.         // 1. Récupère la session
  840.         $session $request->getSession();
  841.         
  842.         // 2. init error
  843.         $error 0;
  844.         // 3. Vérification de l'IP dans la liste des ip bannis
  845.         $recupBann $this->ipbannRepo->findIP($_SERVER['REMOTE_ADDR']);
  846.         // Si l'IP est banni => redirection vers secur_banni
  847.         if ( count($recupBann) > ){
  848.           // 4. redirection vers secur_banni
  849.           return $this->redirectToRoute('secur_banni');
  850.         }
  851.         // 5. construction du formulaire de reinitialisation
  852.         $form $this->formOubliReinit();
  853.         $form->handleRequest($request);
  854.   
  855.         // Si le formulaire est soumis
  856.         if ($form->isSubmitted() && $form->isValid()) {
  857.           // 7. recupère les champs du formulaire
  858.           $monform $form->getData();
  859.           $username $monform["username"];
  860.           $verifcode $monform["verifcode"];
  861.           $password $monform["password"];
  862.           // 8. recup user avec le pseudo
  863.           $userRecup $this->userRepo->findPseudo($username);
  864.           $user $userRecup[0];
  865.           // 9. fabrication du codeUser
  866.           $codeUser $this->makehash($user);
  867.           // 10. Test la comparaison entre les codes
  868.           if( $codeUser != $hash ){
  869.             // 11. incremente une erreur
  870.             $error++;
  871.             // 12. Incrémente le nombre d essai
  872.             if ( $session->get('nbrEssai') == -
  873.             {
  874.               $session->set('nbrEssai'1);
  875.             }
  876.             else
  877.             {
  878.               $newEss $session->get('nbrEssai') + 1;
  879.               $session->set('nbrEssai'$newEss );
  880.             }
  881.             // 13. Test si le nombre d'essai a dépassé la limite
  882.             if ( $session->get('nbrEssai') >= $this->limiteEssai ){
  883.               // 14. Récupération de l'ip de l'utilisateur
  884.               $ipVisiteur $_SERVER['REMOTE_ADDR'];
  885.               // 15. Création et remplissage d'un nouvel objet lModIpbann
  886.               $ipBann = new ModIpbann();
  887.               $ipBann->setIp($ipVisiteur);
  888.               $ipBann->setReproche("Nombre d'essai dépassé lors de l'activation du compte.");
  889.               $ipBann->setDateCrea(new \DateTime("NOW"));
  890.               // 16. Enregistre l'objet ModIpbann dans la base
  891.               $this->em->persist($ipBann);
  892.               $this->em->flush();
  893.               // 17. Redirection vers secur_banni 
  894.               return $this->redirectToRoute('secur_banni');
  895.             }
  896.             // sinon 
  897.             else{
  898.               // 18. prépare le message flash error
  899.               $this->addFlash('error''Attention le code saisi n\'est pas celui attendu ! Il vus reste '.abs($this->limiteEssai $session->get('nbrEssai') + 1).' essai(s)');
  900.               // affiche form
  901.             }
  902.           }
  903.           // sinon les codes sont bons
  904.           else{
  905.             // 19. si la comparaison des verifcode est erroné
  906.             if( $verifcode != $user->getCodeVerif() ){
  907.                 // 20. prépare le message flash error
  908.                 $this->addFlash('error''Attention le code saisi n\'est pas celui attendu ! Il vus reste '.abs($this->limiteEssai $session->get('nbrEssai') + 1).' essai(s)');
  909.                 // affiche form
  910.             }
  911.             //
  912.             else{
  913.               // 21. renseigne l'objet user
  914.               $user->setActif(1);
  915.               $user->setPassword(
  916.                 $this->passwordEncoder->hashPassword(
  917.                   $user,
  918.                   $password
  919.                 )
  920.               );
  921.               $user->setDateModif(new \DateTime("NOW"));
  922.               // 22. enregistre l'objet user dans la base
  923.               $this->em->persist($user);
  924.               $this->em->flush();
  925.               // 23. prepare le message flash success
  926.               $this->addFlash('success''Votre mot de passe est modifié! Vous pouvez vous identifier pour continuer..');
  927.               // 24. redirection vers secur_login 
  928.               return $this->redirectToRoute('secur_login');
  929.             }
  930.           }
  931.           
  932.         }
  933.         // 6. affiche la page de formulaire
  934.         return $this->render('security/reinit.html.twig', [
  935.           'controller_name' => 'secur_reinitMdp',
  936.           'form' => $form->createView(),
  937.         ]);
  938.     }
  939.       // AJAX ******************************************************************************************* **** //
  940.     /**
  941.      * @Route("/verifPseudo", name="secur_verifPseudo")
  942.      */
  943.     public function secur_verifPseudo(Request $requestMailerInterface $mailer): JsonResponse
  944.     {
  945.       // 1. recupere datas de l'ajax
  946.       $pseudo utf8_decode(htmlspecialchars($_POST["pseudo"]));
  947.       // 2. verif existance pseudo
  948.       $user $this->userRepo->findPseudo($pseudo);
  949.       // 3. return json
  950.       return $this->json(['msg' => count($user)]);
  951.     }
  952.     /**
  953.      * @Route("/verifEmail", name="secur_verifEmail")
  954.      */
  955.     public function secur_verifEmail(Request $requestMailerInterface $mailer): JsonResponse
  956.     {
  957.       // 1. recupere datas de l'ajax
  958.       $mailx utf8_decode(htmlspecialchars($_POST["mailx"]));
  959.       // 2. verif existance pseudo
  960.       $user $this->userRepo->findEmail($mailx);
  961.       // 3. return json
  962.       return $this->json(['msg' => count($user)]);
  963.     }
  964.     
  965.     
  966.     
  967. }