src/Controller/SecurityController.php line 288

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use App\Entity\User;
  8. use App\Entity\Demandeur;
  9. use App\Entity\Jury;
  10. use App\Service\sendNotification;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  13. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  14. use App\Security\AppCustomAuthenticator;
  15. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  16. use App\Form\RegistrationFormType;
  17. use App\Form\RenewPasswordType;
  18. use App\Form\AccountFormType;
  19. class SecurityController extends AbstractController
  20. {
  21.     /**
  22.      * @Route("/", name="app_login")
  23.      */
  24.     public function login(AuthenticationUtils $authenticationUtils): Response
  25.     {
  26.         // si déja connecté
  27.         if ($this->getUser()) {
  28.             if($this->isGranted('ROLE_DEPOSANT')) {
  29.                 return $this->redirectToRoute('app_demande_list');
  30.             }
  31.             else {
  32.                 return $this->redirectToRoute('app_offres_index');
  33.             }
  34.         }
  35.         // get the login error if there is one
  36.         $error $authenticationUtils->getLastAuthenticationError();
  37.         // last username entered by the user
  38.         $lastUsername $authenticationUtils->getLastUsername();
  39.         return $this->render('security/login.html.twig', ['last_username' => $lastUsername'error' => $error]);
  40.     }
  41.     /**
  42.      * @Route("/logout", name="app_logout")
  43.      */
  44.     public function logout()
  45.     {
  46.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  47.     }
  48.     /**
  49.      * @Route("/inscription", name="app_inscription")
  50.      */
  51.     public function register(   sendNotification $sendNotification
  52.                                 Request $request
  53.                                 UserPasswordHasherInterface $userPasswordHasher
  54.                                 EntityManagerInterface $entityManager
  55.                                 UserAuthenticatorInterface $userAuthenticator,
  56.                                 AppCustomAuthenticator $appAuthenticator): Response
  57.     {
  58.         $user = new User();
  59.         $formRegister $this->createForm(RegistrationFormType::class, $user);
  60.         $formRegister->handleRequest($request);
  61.         if ($formRegister->isSubmitted() && $formRegister->isValid()) {
  62.             // username = email
  63.             $user->setUsername($formRegister->get('plainPassword')->getData());
  64.             // encode the plain password
  65.             $user->setPassword(
  66.                 $userPasswordHasher->hashPassword(
  67.                     $user,
  68.                     $formRegister->get('plainPassword')->getData()
  69.                 )
  70.             );
  71.             // Role
  72.             $user->setRoles(['ROLE_EN_ATTENTE']);
  73.             $entityManager->persist($user);
  74.             $entityManager->flush();
  75.             
  76.             $sendNotification->send("nouvelle-demande-admin-RH"NULL$user);
  77.             //return $userAuthenticator->authenticateUser($user, $appAuthenticator, $request);
  78.             $session $request->getSession();
  79.             $session->getFlashBag()->add('message'"Votre inscription sera finalisée après validation de votre adresse email. Vous allez recevoir un message contenant un lien permettant de finaliser l'inscription.");
  80.             return $this->redirectToRoute('app_edito');
  81.         }
  82.         return $this->render('security/register.html.twig', [
  83.             'registrationForm' => $formRegister->createView(),
  84.         ]);
  85.     }
  86.     /**
  87.      * @Route("/validation/{checksum}", name="app_validate_account")
  88.      */
  89.     public function validation$checksum
  90.                                 EntityManagerInterface $entityManager
  91.                                 Request $request
  92.                                 UserAuthenticatorInterface $userAuthenticator,
  93.                                 AppCustomAuthenticator $appAuthenticator )
  94.     {
  95.         $session $request->getSession();
  96.         if(!$checksum) {
  97.             $session->getFlashBag()->add('error'"Votre compte n'a pas été retrouvé, veuillez renouveler l'inscription");
  98.             return $this->redirectToRoute('app_edito');
  99.         }
  100.         $user $entityManager->getRepository(User::class)->findOneBy(
  101.             array('emailValidationChecksum' => $checksum)
  102.         );
  103.         if(!$user) {
  104.             $session->getFlashBag()->add('error'"Votre compte n'a pas été retrouvé, veuillez renouveler l'inscription");
  105.             return $this->redirectToRoute('app_edito');
  106.         }
  107.         $user->setEmailValidationChecksum("");
  108.         $user->setRoles(['ROLE_CANDIDAT']);
  109.         $entityManager->persist($user);
  110.         $entityManager->flush();
  111.         
  112.         $session->getFlashBag()->add('message'"Votre compte a été validé, vous pouvez poursuivre votre navigation.");
  113.         
  114.         return $userAuthenticator->authenticateUser($user$appAuthenticator$request);
  115.     }
  116.     /**
  117.      * @Route("/invitation-jury/{id}/{checksum}", name="app_invitation_jury")
  118.      */
  119.     public function invitationJury$checksum$id
  120.                                 EntityManagerInterface $entityManager
  121.                                 Request $request
  122.                                 UserPasswordHasherInterface $userPasswordHasher,
  123.                                 UserAuthenticatorInterface $userAuthenticator,
  124.                                 AppCustomAuthenticator $appAuthenticator )
  125.     {
  126.         $session $request->getSession();
  127.         
  128.         if(!$checksum) {
  129.             $session->getFlashBag()->add('error'"L'invitation n'a pas été trouvée ou a déjà été validée");
  130.             return $this->redirectToRoute('app_edito');
  131.         }
  132.         $user $entityManager->getRepository(User::class)->findOneBy(
  133.             array('emailValidationChecksum' => $checksum)
  134.         );
  135.         if(!$user) {
  136.             $session->getFlashBag()->add('error'"L'invitation n'a pas été trouvée ou a déjà été validée");
  137.             return $this->redirectToRoute('app_edito');
  138.         }
  139.         // si déja connecté
  140.         $user_connected $this->getUser();
  141.         if($user_connected) {
  142.             if($user_connected->getId() != $user->getId()) {
  143.                 $session->getFlashBag()->add('error'"Vous êtes connecté avec un compte différent de celui concerné par l'invitation, veuillez vous déconnecter préalablement");
  144.                 return $this->redirectToRoute('app_edito');
  145.             }
  146.         }
  147.         $demandeur $entityManager->getRepository(Demandeur::class)->find($id);
  148.         if(!$demandeur) {
  149.             throw new InvalidArgumentException("Cette demande n'existe pas");
  150.         }
  151.         //  tester l'invitation au jury
  152.         $jury $entityManager->getRepository(Jury::class)->findOneBy(['user' => $user'demandeur' => $demandeur]); 
  153.         if(!$jury) {
  154.             throw new InvalidArgumentException("Cette invitation au jury n'existe pas");
  155.         }
  156.         //$user->setEmailValidationChecksum("");
  157.         //$user->setRoles(['ROLE_CANDIDAT']);
  158.         //$entityManager->persist($user);
  159.         //$entityManager->flush();
  160.         if($request->get('valider_compte_ok')) {
  161.             // Validation avec compte existante complet
  162.             $user->setEmailValidationChecksum("");
  163.             $entityManager->persist($user);
  164.             $entityManager->flush();
  165.             
  166.             // valider l'invitation au jury
  167.             $jury->setValide(true);
  168.             $entityManager->persist($jury);
  169.             $entityManager->flush();
  170.             
  171.             $session->getFlashBag()->add('message'"Votre participation au jury a été validée");
  172.             return $this->redirectToRoute('app_demande_jury', ['id' => $id]);
  173.         }
  174.         $formAccount $this->createForm(AccountFormType::class, $user);
  175.         $formAccount->handleRequest($request);
  176.         if ($formAccount->isSubmitted() && $formAccount->isValid()) {
  177.             // username = email
  178.             $user->setUsername($formAccount->get('email')->getData());
  179.             // encode the plain password
  180.             $user->setPassword(
  181.                 $userPasswordHasher->hashPassword(
  182.                     $user,
  183.                     $formAccount->get('plainPassword')->getData()
  184.                 )
  185.             );
  186.             $user->setEmailValidationChecksum("");
  187.             $entityManager->persist($user);
  188.             $entityManager->flush();
  189.             // valider l'invitation au jury
  190.             $jury->setValide(true);
  191.             $entityManager->persist($jury);
  192.             $entityManager->flush();
  193.             $session->getFlashBag()->add('message'"Votre compte a été finalisé, votre participation au jury a été validée");
  194.             return $userAuthenticator->authenticateUser($user$appAuthenticator$request);
  195.         }
  196.         
  197.         //$session->getFlashBag()->add('message', "Votre compte a été validé, vous pouvez poursuivre votre navigation.");
  198.         
  199.         //
  200.         return $this->renderForm('security/invitation_jury.html.twig', [
  201.             'user'         => $user,
  202.             'demandeur'    => $demandeur,
  203.             'accountForm'  => $formAccount,
  204.         ]);
  205.     }
  206.     /**
  207.      * @Route("/validation/send-new/{id}/{checksum}", name="app_validate_send_new")
  208.      */
  209.     public function send_again$id$checksum
  210.                                 EntityManagerInterface $entityManager
  211.                                 Request $request,
  212.                                 sendNotification $sendNotification )
  213.     {
  214.         $session $request->getSession();
  215.         if($id && $checksum == md5('P13'.$id)) {
  216.             $user $entityManager->getRepository(User::class)->find($id);
  217.             if($user) {
  218.                 $user->setEmailValidationChecksum(md5("P13".time()));
  219.                 $entityManager->persist($user);
  220.                 $entityManager->flush();
  221.                 $sendNotification->send("validation-email-creation-compte"NULL$user);
  222.                 $session->getFlashBag()->add('message'"Votre inscription sera finalisée après validation de votre adresse email. Vous allez recevoir un message contenant un lien permettant de finaliser l'inscription.");
  223.                 return $this->redirectToRoute('app_edito');
  224.             }
  225.         }
  226.         $session->getFlashBag()->add('error'"Erreur lors du réenvoi du message");
  227.         return $this->redirectToRoute('app_edito');
  228.     }
  229.     /**
  230.      * @Route("/send-email-validation", name="app_validate_send_email_validation")
  231.      */
  232.     public function send_again_connectedEntityManagerInterface $entityManager
  233.                                 Request $request,
  234.                                 sendNotification $sendNotification )
  235.     {
  236.         $session $request->getSession();
  237.         $user_connected $this->getUser();
  238.         $user $entityManager->getRepository(User::class)->find($user_connected->getId());
  239.         $user->setEmailValidationChecksum(md5("P13".time()));
  240.         $entityManager->persist($user);
  241.         $entityManager->flush();
  242.         $sendNotification->send("validation-email-creation-compte"NULL$user);
  243.         return $this->redirectToRoute('app_edito');
  244.     }
  245.     /**
  246.      * @Route("/renew-pass", name="app_renew")
  247.      */
  248.     public function renew_passEntityManagerInterface $entityManager
  249.                                 Request $request,
  250.                                 sendNotification $sendNotification )
  251.     {
  252.         $session $request->getSession();
  253.         $formRenew $this->createForm(RenewPasswordType::class);
  254.         $formRenew->handleRequest($request);
  255.         if ($formRenew->isSubmitted() && $formRenew->isValid()) {
  256.             $user $entityManager->getRepository(User::class)->findOneBy(
  257.                 array('email' => $formRenew->get('email')->getData())
  258.             );
  259.             if($user) {
  260.                 $user->setEmailValidationChecksum(md5("P13".time()));
  261.                 $entityManager->persist($user);
  262.                 $entityManager->flush();
  263.                 $sendNotification->send("renouvellement-password"NULL$user);
  264.                 $session->getFlashBag()->add('message'"Vous allez recevoir un message contenant un lien permettant de vous connecter.");
  265.                 return $this->redirectToRoute('app_edito');
  266.             }
  267.             else {
  268.                 $session->getFlashBag()->add('error'"Votre compte n'a pas été retrouvé");
  269.                 return $this->redirectToRoute('app_edito');
  270.             }
  271.         }
  272.         return $this->renderForm('security/renew.html.twig', [
  273.             'renewForm'         => $formRenew,
  274.         ]);
  275.     }
  276.     
  277.     /**
  278.      * @Route("/user/mes-informations", name="mes_informations")
  279.      */
  280.     public function mes_informations(   EntityManagerInterface $entityManager
  281.                                         Request $request,
  282.                                         UserPasswordHasherInterface $userPasswordHasher,
  283.                                         sendNotification $sendNotification )
  284.     {
  285.         $session $request->getSession();
  286.         $user $this->getUser();
  287.         $formAccount $this->createForm(AccountFormType::class, $user);
  288.         $formAccount->handleRequest($request);
  289.         if ($formAccount->isSubmitted() && $formAccount->isValid()) {
  290.             // username = email
  291.             $user->setUsername($formAccount->get('email')->getData());
  292.             // encode the plain password
  293.             $user->setPassword(
  294.                 $userPasswordHasher->hashPassword(
  295.                     $user,
  296.                     $formAccount->get('plainPassword')->getData()
  297.                 )
  298.             );
  299.             $entityManager->persist($user);
  300.             $entityManager->flush();
  301.             $session->getFlashBag()->add('message'"Vos informations sont enregistrées");
  302.         }
  303.         return $this->renderForm('security/mes_informations.html.twig', [
  304.             'accountForm'         => $formAccount,
  305.         ]);
  306.     }
  307.     /**
  308.      * @Route("/renew-pass/{checksum}", name="app_renew_pass")
  309.      */
  310.     public function do_renew_pass$checksum
  311.                                 EntityManagerInterface $entityManager
  312.                                 Request $request
  313.                                 UserAuthenticatorInterface $userAuthenticator,
  314.                                 AppCustomAuthenticator $appAuthenticator )
  315.     {
  316.         $session $request->getSession();
  317.         if(!$checksum) {
  318.             $session->getFlashBag()->add('error'"Votre compte n'a pas été retrouvé, veuillez renouveler l'inscription");
  319.             return $this->redirectToRoute('app_edito');
  320.         }
  321.         $user $entityManager->getRepository(User::class)->findOneBy(
  322.             array('emailValidationChecksum' => $checksum)
  323.         );
  324.         if(!$user) {
  325.             $session->getFlashBag()->add('error'"Votre compte n'a pas été retrouvé, veuillez renouveler l'inscription");
  326.             return $this->redirectToRoute('app_edito');
  327.         }
  328.         $user->setEmailValidationChecksum("");
  329.         $roles $user->getRoles();
  330.         if($roles[0]=='ROLE_EN_ATTENTE') {
  331.             $user->setRoles(['ROLE_CANDIDAT']);
  332.         }
  333.         $entityManager->persist($user);
  334.         $entityManager->flush();
  335.         
  336.         $session->getFlashBag()->add('message'"Vous êtes maintenant connecté, vous pouvez modifier votre mot de passe sur la page 'Mon Compte'");
  337.         
  338.         return $userAuthenticator->authenticateUser($user$appAuthenticator$request);
  339.     }
  340. }