src/Controller/RegistrationController.php line 49

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use DateTime;
  5. use App\Form\RegistrationFormType;
  6. use App\Form\UnsecureRegistrationFormType;
  7. use App\Security\EmailVerifier;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Mime\Address;
  14. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
  18. use App\Repository\ClientRepository;
  19. use App\Repository\AvatarRepository;
  20. use App\Repository\ClientProductRepository;
  21. use App\Repository\DomainRepository;
  22. use App\Repository\JobRepository;
  23. use App\Repository\LocationRepository;
  24. use App\Repository\ProductRepository;
  25. use App\Repository\SubLocationRepository;
  26. use App\Repository\UserRepository;
  27. use App\Security\LoginFormAuthenticator;
  28. use App\Security\LoginFormAuthenticatorUnsecure;
  29. use Symfony\Component\Form\FormError;
  30. use Symfony\Component\HttpFoundation\Cookie;
  31. use Symfony\Component\Mailer\MailerInterface;
  32. use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
  33. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  34. class RegistrationController extends AbstractController
  35. {
  36.     private $emailVerifier;
  37.     public function __construct(EmailVerifier $emailVerifier)
  38.     {
  39.         $this->emailVerifier $emailVerifier;
  40.     }
  41.     /**
  42.      * @Route("/{clientSlug}/{clientSalt}/register", name="app_register")
  43.      */
  44.     public function register($clientSlug$clientSaltRequest $requestUserPasswordHasherInterface $userPasswordHasherEntityManagerInterface $entityManagerClientRepository $clientRepositoryDomainRepository $domainRepositoryLocationRepository $locationRepositorySublocationRepository $subLocationRepositoryMailerInterface $mailerAvatarRepository $avatarRepositoryJobRepository $jobRepositoryClientProductRepository $clientProductRepositoryUserAuthenticatorInterface $authenticatorLoginFormAuthenticator $loginAuthenticatorLoginFormAuthenticatorUnsecure $loginAuthenticatorUnsecure): Response
  45.     {
  46.         $client $clientRepository->findOneBySlug($clientSlug);
  47.         
  48.         $avatar $avatarRepository->findOneById(13);
  49.         $jobs $jobRepository->findByClient($client);
  50.         $locations $locationRepository->findByClient($client);
  51.         $subLocations $subLocationRepository->findByClient($client);
  52.         $user = new User();
  53.         
  54.         if($client->isIsSecure() == true){
  55.             $form $this->createForm(RegistrationFormType::class, $user);
  56.             $form->handleRequest($request);
  57.             if ($form->isSubmitted() && $form->isValid()) {
  58.                 $jobTitleData $form->get('jobTitle')->getData();
  59.                 if($client->isIsHiddenJobTitle() == false){
  60.                     if($jobTitleData == ''){
  61.                         $form->get('jobTitle')->addError(new FormError('Veuillez renseigner un poste.'));
  62.                             return $this->render('registration/register.html.twig', [
  63.                                 'registrationForm' => $form->createView(),
  64.                                 'locations' => $locations,
  65.                                 'subLocations' => $subLocations,
  66.                                 'client' => $client,
  67.                                 'jobs' => $jobs,
  68.                                 'hiddenPassword' => $this->getParameter('app.generic_password')
  69.                         ]);
  70.                     }
  71.                 }
  72.                 $clientLocationsCount count($client->getLocations());
  73.                 $locationData $form->get('location')->getData();
  74.                 if($clientLocationsCount 0){
  75.                     if($locationData == '' || $locationData == null){
  76.                         $form->get('location')->addError(new FormError('Veuillez renseigner votre ' $client->getLabelLocation() . '.'));
  77.                             return $this->render('registration/register_unsecure.html.twig', [
  78.                                 'registrationForm' => $form->createView(),
  79.                                 'locations' => $locations,
  80.                                 'subLocations' => $subLocations,
  81.                                 'client' => $client,
  82.                                 'jobs' => $jobs,
  83.                                 'hiddenPassword' => $this->getParameter('app.generic_password')
  84.                         ]);
  85.                     }
  86.                 }
  87.                 $clientSubLocationsCount count($client->getSubLocations());
  88.                 $subLocationData $form->get('subLocation')->getData();
  89.                 if($clientSubLocationsCount 0){
  90.                     if($subLocationData == '' || $subLocationData == null){
  91.                         $form->get('subLocation')->addError(new FormError('Veuillez renseigner votre ' $client->getLabelSubLocation() . '.'));
  92.                             return $this->render('registration/register_unsecure.html.twig', [
  93.                                 'registrationForm' => $form->createView(),
  94.                                 'locations' => $locations,
  95.                                 'subLocations' => $subLocations,
  96.                                 'client' => $client,
  97.                                 'jobs' => $jobs,
  98.                                 'hiddenPassword' => $this->getParameter('app.generic_password')
  99.                         ]);
  100.                     }
  101.                 }
  102.                 // Si le client = public
  103.                 if($client->getId() == 1){
  104.                     $user->setIsActive(true);
  105.                     $user->setAvatar($avatar);
  106.                     $user->setClient($client);
  107.                     $user->setCreatedAt(new Datetime());
  108.                     $user->setModifiedAt(new Datetime());
  109.                     $user->setSalt($this->generateRandomString());
  110.                     $user->setPassword(
  111.                         $userPasswordHasher->hashPassword(
  112.                             $user,
  113.                             $form->get('plainPassword')->getData()
  114.                             )
  115.                         )
  116.                     ;
  117.                 }else{
  118.                     // Si count des noms de domaines du client > 0 : vérification de l'adresse email renseignée par l'utilisateur
  119.                     $domainsCount count($client->getDomains());
  120.                     if($domainsCount 0){
  121.                         $userDomain substr($form->get('email')->getData(), strpos($form->get('email')->getData(), "@") + 1);
  122.                         $clientDomain $domainRepository->findOneBy(['name' => $userDomain'client' => $client]);
  123.         
  124.                         if(!empty($clientDomain)){
  125.                             $user->setIsActive(true);
  126.                             $user->setAvatar($avatar);
  127.                             $user->setClient($client);
  128.                             $user->setCreatedAt(new Datetime());
  129.                             $user->setModifiedAt(new Datetime());
  130.                             $user->setSalt($this->generateRandomString());
  131.                             // encode the plain password
  132.                             $user->setPassword(
  133.                             $userPasswordHasher->hashPassword(
  134.                                     $user,
  135.                                     $form->get('plainPassword')->getData()
  136.                                 )
  137.                             );
  138.                         }else{
  139.                             $form->addError(new FormError('Veuillez renseigner votre adresse email professionnelle.'));
  140.                             return $this->render('registration/register.html.twig', [
  141.                                 'registrationForm' => $form->createView(),
  142.                                 'locations' => $locations,
  143.                                 'subLocations' => $subLocations,
  144.                                 'client' => $client,
  145.                                 'jobs' => $jobs,
  146.                             ]);
  147.                         }
  148.                     }else{
  149.                         $user->setIsActive(true);
  150.                         $user->setAvatar($avatar);
  151.                         $user->setClient($client);
  152.                         $user->setCreatedAt(new Datetime());
  153.                         $user->setModifiedAt(new Datetime());
  154.                         $user->setSalt($this->generateRandomString());
  155.                         // encode the plain password
  156.                         $user->setPassword(
  157.                         $userPasswordHasher->hashPassword(
  158.                                 $user,
  159.                                 $form->get('plainPassword')->getData()
  160.                             )
  161.                         );
  162.                     }
  163.                 }
  164.                 $entityManager->persist($user);
  165.                 $entityManager->flush();
  166.                 
  167.                 // Mail de bienvenue
  168.                $welcomeEmail = (new TemplatedEmail())
  169.                     ->context([
  170.                         'client' => $client
  171.                     ])
  172.                     ->from(new Address('no-reply@avisea.net''Ween'))
  173.                     ->to($user->getEmail())
  174.                     ->subject('Bienvenue sur Ween')
  175.                     ->htmlTemplate('email/welcome.html.twig')
  176.                 ;
  177.                 $mailer->send($welcomeEmail);
  178.     
  179.                 // generate a signed url and email it to the user
  180.                 $this->emailVerifier->sendEmailConfirmation('app_verify_email'$user,
  181.                     (new TemplatedEmail())
  182.                         ->context(['client' => $client])
  183.                         ->from(new Address('no-reply@avisea.net''Ween'))
  184.                         ->to($user->getEmail())
  185.                         ->subject('Veuillez confirmer votre adresse email')
  186.                         ->htmlTemplate('registration/confirmation_email.html.twig')
  187.                 );
  188.                 return $this->redirectToRoute('app_login', ['clientSlug' => $client->getSlug(), 'clientSalt' => $client->getSalt(), 'fromRegister' => '1'], Response::HTTP_SEE_OTHER);
  189.             }
  190.     
  191.             $content $this->renderView('registration/register.html.twig', [
  192.                 'registrationForm' => $form->createView(),
  193.                 'locations' => $locations,
  194.                 'subLocations' => $subLocations,
  195.                 'jobs' => $jobs,
  196.                 'client' => $client
  197.             ]);
  198.             $viewWithCookie $this->setCookie($client->getSlug(), $content);
  199.             return $viewWithCookie;
  200.         }else{
  201.             $secureClientProducts $clientProductRepository->hasClientSecureProduct($client);
  202.             $form $this->createForm(UnsecureRegistrationFormType::class, $user);
  203.             $form->handleRequest($request);
  204.             if ($form->isSubmitted() && $form->isValid()) {
  205.                 $jobTitleData $form->get('jobTitle')->getData();
  206.                 if($client->isIsHiddenJobTitle() == false){
  207.                     if($jobTitleData == ''){
  208.                         $form->get('jobTitle')->addError(new FormError('Veuillez renseigner un poste.'));
  209.                         return $this->render('registration/register_unsecure.html.twig', [
  210.                             'registrationForm' => $form->createView(),
  211.                             'locations' => $locations,
  212.                             'subLocations' => $subLocations,
  213.                             'client' => $client,
  214.                             'jobs' => $jobs,
  215.                             'hiddenPassword' => $this->getParameter('app.generic_password')
  216.                         ]);
  217.                     }
  218.                 }
  219.                 $clientLocationsCount count($client->getLocations());
  220.                 $locationData $form->get('location')->getData();
  221.                 if($clientLocationsCount 0){
  222.                     if($locationData == '' || $locationData == null){
  223.                         $form->get('location')->addError(new FormError('Veuillez renseigner votre ' $client->getLabelLocation() . '.'));
  224.                             return $this->render('registration/register_unsecure.html.twig', [
  225.                                 'registrationForm' => $form->createView(),
  226.                                 'locations' => $locations,
  227.                                 'subLocations' => $subLocations,
  228.                                 'client' => $client,
  229.                                 'jobs' => $jobs,
  230.                                 'hiddenPassword' => $this->getParameter('app.generic_password')
  231.                         ]);
  232.                     }
  233.                 }
  234.                 $clientSubLocationsCount count($client->getSubLocations());
  235.                 $subLocationData $form->get('subLocation')->getData();
  236.                 if($clientSubLocationsCount 0){
  237.                     if($subLocationData == '' || $subLocationData == null){
  238.                         $form->get('subLocation')->addError(new FormError('Veuillez renseigner votre ' $client->getLabelSubLocation() . '.'));
  239.                             return $this->render('registration/register_unsecure.html.twig', [
  240.                                 'registrationForm' => $form->createView(),
  241.                                 'locations' => $locations,
  242.                                 'subLocations' => $subLocations,
  243.                                 'client' => $client,
  244.                                 'jobs' => $jobs,
  245.                                 'hiddenPassword' => $this->getParameter('app.generic_password')
  246.                         ]);
  247.                     }
  248.                 }
  249.                 
  250.                 if($form->get('plainPassword')->getData() == 'hidden_pswrd'){
  251.                     $domainsCount count($client->getDomains());
  252.                     if($domainsCount 0){
  253.                         $userDomain substr($form->get('email')->getData(), strpos($form->get('email')->getData(), "@") + 1);
  254.                         $clientDomain $domainRepository->findOneBy(['name' => $userDomain'client' => $client]);
  255.         
  256.                         if(!empty($clientDomain)){
  257.                             $user->setIsActive(true);
  258.                             $user->setAvatar($avatar);
  259.                             $user->setClient($client);
  260.                             $user->setCreatedAt(new Datetime());
  261.                             $user->setModifiedAt(new Datetime());
  262.                             $user->setIsVerified(true);
  263.                             $user->setSalt($this->generateRandomString());
  264.                             // encode the plain password
  265.                             $user->setPassword(
  266.                             $userPasswordHasher->hashPassword(
  267.                                     $user,
  268.                                     $this->getParameter('app.generic_password')
  269.                                 )
  270.                             );
  271.                         }else{
  272.                             $form->addError(new FormError('Veuillez renseigner votre adresse email professionnelle.'));
  273.                             return $this->render('registration/register_unsecure.html.twig', [
  274.                                 'registrationForm' => $form->createView(),
  275.                                 'locations' => $locations,
  276.                                 'subLocations' => $subLocations,
  277.                                 'client' => $client,
  278.                                 'jobs' => $jobs,
  279.                                 'hiddenPassword' => $this->getParameter('app.generic_password')
  280.                             ]);
  281.                         }
  282.                     }else{
  283.                         $user->setIsActive(true);
  284.                         $user->setAvatar($avatar);
  285.                         $user->setClient($client);
  286.                         $user->setCreatedAt(new Datetime());
  287.                         $user->setModifiedAt(new Datetime());
  288.                         $user->setIsVerified(true);
  289.                         $user->setSalt($this->generateRandomString());
  290.                         // encode the plain password
  291.                         $user->setPassword(
  292.                         $userPasswordHasher->hashPassword(
  293.                                 $user,
  294.                                 $this->getParameter('app.generic_password')
  295.                             )
  296.                         );
  297.                     }
  298.                 }
  299.                 $entityManager->persist($user);
  300.                 $entityManager->flush();
  301.                 $welcomeEmail = (new TemplatedEmail())
  302.                     ->context([
  303.                         'client' => $client
  304.                     ])
  305.                     ->from(new Address('no-reply@avisea.net''Ween'))
  306.                 ->to($user->getEmail())
  307.                     ->subject('Bienvenue sur Ween')
  308.                 ->htmlTemplate('email/welcome.html.twig')
  309.                 ;
  310.                 $mailer->send($welcomeEmail);
  311.                 
  312.                 if($secureClientProducts === true){
  313.                     $authenticator->authenticateUser(
  314.                         $user
  315.                         $loginAuthenticatorUnsecure
  316.                         $request)
  317.                     ;
  318.                     return $this->redirectToRoute('app_set_password', [], Response::HTTP_SEE_OTHER); 
  319.                 }else{
  320.                     return $authenticator->authenticateUser(
  321.                         $user
  322.                         $loginAuthenticator
  323.                         $request)
  324.                     ;
  325.                 }
  326.             }
  327.             $content $this->renderView('registration/register_unsecure.html.twig', [
  328.                 'registrationForm' => $form->createView(),
  329.                 'locations' => $locations,
  330.                 'subLocations' => $subLocations,
  331.                 'jobs' => $jobs,
  332.                 'client' => $client,
  333.                 'hiddenPassword' => $this->getParameter('app.generic_password')
  334.             ]);
  335.             $viewWithCookie $this->setCookie($client->getSlug(), $content);
  336.             return $viewWithCookie;
  337.         }
  338.     }
  339.     /**
  340.      * @Route("/verify/email", name="app_verify_email")
  341.      */
  342.     public function verifyUserEmail(Request $requestTranslatorInterface $translatorUserRepository $userRepository): Response
  343.     {
  344.         $id $request->get('id');
  345.         if (null === $id) {
  346.             return $this->redirectToRoute('app_register', array('client' => $request->attributes->get('client'), 'salt' => $request->attributes->get('salt')));
  347.         }
  348.         $user $userRepository->find($id);
  349.         if (null === $user) {
  350.             return $this->redirectToRoute('app_register', array('client' => $request->attributes->get('client'), 'salt' => $request->attributes->get('salt')));
  351.         }
  352.         // validate email confirmation link, sets User::isVerified=true and persists
  353.         try {
  354.             $this->emailVerifier->handleEmailConfirmation($request$user);
  355.         } catch (VerifyEmailExceptionInterface $exception) {
  356.             $this->addFlash('verify_email_error'$translator->trans($exception->getReason(), [], 'VerifyEmailBundle'));
  357.             return $this->redirectToRoute('app_register');
  358.         }
  359.         // @TODO Change the redirect on success and handle or remove the flash message in your templates
  360.         $this->addFlash('success''Votre email a été vérifié.');
  361.         return $this->redirectToRoute('app_login', array('clientSlug' => $user->getClient()->getSlug(), 'clientSalt' => $user->getClient()->getSalt()));
  362.     }
  363.     public function generateRandomString($length 3) {
  364.         $characters '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  365.         $charactersLength strlen($characters);
  366.         $randomString '';
  367.         for ($i 0$i $length$i++) {
  368.             $randomString .= $characters[random_int(0$charactersLength 1)];
  369.         }
  370.         return $randomString;
  371.     }
  372.     public function setCookie($clientSlug$content){
  373.         switch ($_ENV['ACTUAL_ENV']) {
  374.             case 'local':
  375.                 $clientSlugCookie = new Cookie(
  376.                     'clientSlug',
  377.                     $clientSlug,
  378.                     strtotime('+1 year'),
  379.                     '/',
  380.                     'plateform.localhost',
  381.                     true,
  382.                     true
  383.                 );
  384.                 break;
  385.             case 'demo':
  386.                 $clientSlugCookie = new Cookie(
  387.                     'clientSlug',
  388.                     $clientSlug,
  389.                     strtotime('+1 year'),
  390.                     '/',
  391.                     'demo.plateform.jobinlive.fr',
  392.                     true,
  393.                     true
  394.                 );
  395.                 break;
  396.             case 'preprod':
  397.                 $clientSlugCookie = new Cookie(
  398.                     'clientSlug',
  399.                     $clientSlug,
  400.                     strtotime('+1 year'),
  401.                     '/',
  402.                     'preprod.plateform.jobinlive.fr',
  403.                     true,
  404.                     true
  405.                 );
  406.                 break;
  407.             case 'prod':
  408.                 $clientSlugCookie = new Cookie(
  409.                     'clientSlug',
  410.                     $clientSlug,
  411.                     strtotime('+1 year'),
  412.                     '/',
  413.                     'app-ween.fr',
  414.                     true,
  415.                     true
  416.                 );
  417.                 break;
  418.         }
  419.         $response = new Response();
  420.         $response->setContent($content);
  421.         $response->headers->setCookie($clientSlugCookie);
  422.         return $response;
  423.     }
  424. }