src/Aviatur/CustomerBundle/Controller/RegistrationController.php line 66

Open in your IDE?
  1. <?php
  2. namespace Aviatur\CustomerBundle\Controller;
  3. // namespace FOS\UserBundle\Controller;
  4. use FOS\UserBundle\CompatibilityUtil;
  5. use FOS\UserBundle\Event\FilterUserResponseEvent;
  6. use FOS\UserBundle\Event\FormEvent;
  7. use FOS\UserBundle\Event\GetResponseUserEvent;
  8. use Aviatur\AgencyBundle\Entity\Agency
  9. use FOS\UserBundle\FOSUserEvents;
  10. use FOS\UserBundle\Model\UserInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  13. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  14. use Aviatur\GeneralBundle\Entity\FosUserUser;
  15. use Aviatur\CustomerBundle\Exception\ValidateException;
  16. use Aviatur\GeneralBundle\Services\AviaturErrorHandler;
  17. use FOS\UserBundle\Controller\RegistrationController as BaseRegistrationController;
  18. use FOS\UserBundle\Form\Factory\FactoryInterface;
  19. use FOS\UserBundle\Model\UserManagerInterface;
  20. use Psr\Container\ContainerInterface;
  21. use Symfony\Component\HttpFoundation\RedirectResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\RouterInterface;
  25. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  26. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  27. use Doctrine\Persistence\ManagerRegistry;
  28. class RegistrationController extends BaseRegistrationController
  29. {
  30.     protected $eventDispatcher;
  31.     protected $formFactory;
  32.     protected $userManager;
  33.     protected $tokenStorage;
  34.     protected $managerRegistry;
  35.     public function __construct(
  36.         EventDispatcherInterface $eventDispatcher,
  37.         FactoryInterface $formFactory,
  38.         UserManagerInterface $userManager,
  39.         TokenStorageInterface $tokenStorage,
  40.         ContainerInterface $container,
  41.         ManagerRegistry $managerRegistry
  42.     ) {
  43.         parent::__construct($eventDispatcher$formFactory$userManager$tokenStorage);
  44.         $this->eventDispatcher $eventDispatcher;
  45.         $this->formFactory $formFactory;
  46.         $this->userManager $userManager;
  47.         $this->tokenStorage $tokenStorage;
  48.         $this->container $container;
  49.         $this->managerRegistry $managerRegistry;
  50.     }
  51.     public function registerAction(Request $requestRouterInterface $router nullAviaturErrorHandler $errorHandler null): Response
  52.     {
  53.         try {
  54.             $user $this->userManager->createUser();
  55.             $user->setEnabled(true);
  56.             $em $this->managerRegistry->getManager();
  57.             $domain $request->getSession()->get('domain');
  58.             $agencyId $request->getSession()->get('agencyDataInfo')['agency_id'] ?? $request->getSession()->get('agencyId');
  59.             $agency $this->getDoctrine()
  60.                 ->getRepository(Agency::class)
  61.                 ->find($agencyId);
  62.             $captchaParameter $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)
  63.                 ->findOneByName('aviatur_captcha');
  64.             if (!$captchaParameter) {
  65.                 throw new \Exception("No se encontró el parámetro de reCAPTCHA.");
  66.             }
  67.             $captchaData json_decode($captchaParameter->getValue(), true);
  68.             $agenciesList $captchaData['Agencies'] ?? [];
  69.             $validateCaptcha in_array($domain$agenciesList);
  70.             $secretKey $validateCaptcha $captchaData['Keys']['RECAPTCHA_SECRET_KEY'] : null;
  71.             $siteKey $validateCaptcha $captchaData['Keys']['RECAPTCHA_SITE_KEY'] : null;
  72.             $event = new GetResponseUserEvent($user$request);
  73.             $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_INITIALIZE);
  74.             if (null !== $event->getResponse()) {
  75.                 return $event->getResponse();
  76.             }
  77.             $form $this->formFactory->createForm();
  78.             $form->setData($user);
  79.             $form->handleRequest($request);
  80.             if ($form->isSubmitted()) {
  81.                 if ($validateCaptcha) {
  82.                     $recaptchaResponse $request->request->get('g-recaptcha-response');
  83.                     if (empty($recaptchaResponse)) {
  84.                         return $this->redirect($errorHandler->errorRedirectNoEmail('''Error en el reCAPTCHA''Por favor, complete el CAPTCHA.'));
  85.                     }
  86.                     $verifyUrl 'https://www.google.com/recaptcha/api/siteverify';
  87.                     $params = [
  88.                         'secret' => $secretKey,
  89.                         'response' => $recaptchaResponse,
  90.                         'remoteip' => $request->getClientIp(),
  91.                     ];
  92.                     $ch curl_init();
  93.                     curl_setopt($chCURLOPT_URL$verifyUrl);
  94.                     curl_setopt($chCURLOPT_POSTtrue);
  95.                     curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($params));
  96.                     curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  97.                     $result curl_exec($ch);
  98.                     curl_close($ch);
  99.                     $resultJson json_decode($result);
  100.                     if (!$resultJson->success) {
  101.                         return $this->redirect($errorHandler->errorRedirectNoEmail('''Error en el reCAPTCHA''Por favor, confirme que no es un robot.'));
  102.                     }
  103.                 }
  104.                 if ($form->isValid()) {
  105.                     $event = new FormEvent($form$request);
  106.                     $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_SUCCESS);
  107.                     $user->setAgency($agency);
  108.                     $user->setCreatedAt(new \DateTime());
  109.                     $this->userManager->updateUser($user);
  110.                     if (null === $response $event->getResponse()) {
  111.                         $url $this->generateUrl('fos_user_registration_confirmed');
  112.                         $response = new RedirectResponse($url);
  113.                     }
  114.                     $this->eventDispatcher->dispatch(new FilterUserResponseEvent($user$request$response), FOSUserEvents::REGISTRATION_COMPLETED);
  115.                     return $response;
  116.                 }
  117.                 $event = new FormEvent($form$request);
  118.                 $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_FAILURE);
  119.                 if (null !== $response $event->getResponse()) {
  120.                     return $response;
  121.                 }
  122.             }
  123.             return $this->render('@FOSUser/Registration/register.html.twig', [
  124.                 'form' => $form->createView(),
  125.                 'siteKey' => $siteKey,
  126.                 'validateCaptcha' => $validateCaptcha
  127.             ]);
  128.         } catch (ValidateException $e) {
  129.             $message 'Información incompleta o inconsistente: ' $e->getMessage();
  130.             $redirectError $errorHandler->errorRedirect($router->generate('homepage'), 'Error de Registro'$message);
  131.             return new RedirectResponse($redirectError);
  132.         } catch (\Exception $e) {
  133.             $message 'Error en el sistema: ' $e->getMessage();
  134.             $redirectError $errorHandler->errorRedirect($router->generate('homepage'), 'Error de Registro'$message);
  135.             return new RedirectResponse($redirectError);
  136.         }
  137.     }
  138.     /**
  139.      * Tell the user to check their email provider.
  140.      */
  141.     public function checkEmailAction(Request $request): Response
  142.     {
  143.         $email $request->getSession()->get('fos_user_send_confirmation_email/email');
  144.         if (empty($email)) {
  145.             return new RedirectResponse($this->generateUrl('fos_user_registration_register'));
  146.         }
  147.         $request->getSession()->remove('fos_user_send_confirmation_email/email');
  148.         $user $this->userManager->findUserByEmail($email);
  149.         if (null === $user) {
  150.             return new RedirectResponse($this->container->get('router')->generate('fos_user_security_login'));
  151.         }
  152.         return $this->render('@FOSUser/Registration/check_email.html.twig', [
  153.             'user' => $user,
  154.         ]);
  155.     }
  156.     /**
  157.      * Receive the confirmation token from user email provider, login the user.
  158.      *
  159.      * @param string $token
  160.      */
  161.     public function confirmAction(Request $request$token): Response
  162.     {
  163.         $userManager $this->userManager;
  164.         $user $userManager->findUserByConfirmationToken($token);
  165.         if (null === $user) {
  166.             return new RedirectResponse($this->container->get('router')->generate('fos_user_security_login'));
  167.         }
  168.         $user->setConfirmationToken(null);
  169.         $user->setEnabled(true);
  170.         $event = new GetResponseUserEvent($user$request);
  171.         $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_CONFIRM);
  172.         $userManager->updateUser($user);
  173.         if (null === $response $event->getResponse()) {
  174.             $url $this->generateUrl('fos_user_registration_confirmed');
  175.             $response = new RedirectResponse($url);
  176.         }
  177.         $this->eventDispatcher->dispatch(new FilterUserResponseEvent($user$request$response), FOSUserEvents::REGISTRATION_CONFIRMED);
  178.         return $response;
  179.     }
  180.     /**
  181.      * Tell the user his account is now confirmed.
  182.      */
  183.     public function confirmedAction(Request $request): Response
  184.     {
  185.         $user $this->getUser();
  186.         if (!is_object($user) || !$user instanceof UserInterface) {
  187.             throw new AccessDeniedException('This user does not have access to this section.');
  188.         }
  189.         return $this->render('@FOSUser/Registration/confirmed.html.twig', [
  190.             'user' => $user,
  191.             'targetUrl' => $this->getTargetUrlFromSession($request->getSession()),
  192.         ]);
  193.     }
  194.     private function getTargetUrlFromSession(SessionInterface $session): ?string
  195.     {
  196.         $token $this->tokenStorage->getToken();
  197.         if (method_exists($token'getFirewallName')) {
  198.             $firewallName $token->getFirewallName();
  199.         } elseif (method_exists($token'getProviderKey')) {
  200.             // BC with Symfony 5.x
  201.             $firewallName $token->getProviderKey();
  202.         } else {
  203.             return null;
  204.         }
  205.         $key sprintf('_security.%s.target_path'$firewallName);
  206.         if ($session->has($key)) {
  207.             return $session->get($key);
  208.         }
  209.         return null;
  210.     }
  211. }