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

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\AdminBundle\Entity\AdminUser;
  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.             // Pre-fill data from query parameters (e.g. from Social Login)
  57.             if ($request->query->has('email')) {
  58.                 $user->setEmail($request->query->get('email'));
  59.                 $user->setUsername($request->query->get('email'));
  60.             }
  61.             if ($request->query->has('firstname')) {
  62.                 $user->setFirstname($request->query->get('firstname'));
  63.             }
  64.             if ($request->query->has('lastname')) {
  65.                 $user->setLastname($request->query->get('lastname'));
  66.             }
  67.             if ($request->query->has('google_id')) {
  68.                 $user->setGoogleId($request->query->get('google_id'));
  69.             }
  70.             $em $this->managerRegistry->getManager();
  71.             $domain $request->getSession()->get('domain');
  72.             $agencyId $request->getSession()->get('agencyDataInfo')['agency_id'] ?? $request->getSession()->get('agencyId');
  73.             $agency $this->getDoctrine()
  74.                 ->getRepository(Agency::class)
  75.                 ->find($agencyId);
  76.             $captchaParameter $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)
  77.                 ->findOneByName('aviatur_captcha');
  78.             if (!$captchaParameter) {
  79.                 throw new \Exception("No se encontró el parámetro de reCAPTCHA.");
  80.             }
  81.             $captchaData json_decode($captchaParameter->getValue(), true);
  82.             $agenciesList $captchaData['Agencies'] ?? [];
  83.             $validateCaptcha in_array($domain$agenciesList);
  84.             $secretKey $validateCaptcha $captchaData['Keys']['RECAPTCHA_SECRET_KEY'] : null;
  85.             $siteKey $validateCaptcha $captchaData['Keys']['RECAPTCHA_SITE_KEY'] : null;
  86.             $event = new GetResponseUserEvent($user$request);
  87.             $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_INITIALIZE);
  88.             if (null !== $event->getResponse()) {
  89.                 return $event->getResponse();
  90.             }
  91.             $form $this->formFactory->createForm();
  92.             $form->setData($user);
  93.             $form->handleRequest($request);
  94.             if ($form->isSubmitted()) {
  95.                 if ($validateCaptcha) {
  96.                     $recaptchaResponse $request->request->get('g-recaptcha-response');
  97.                     if (empty($recaptchaResponse)) {
  98.                         return $this->redirect($errorHandler->errorRedirectNoEmail('''Error en el reCAPTCHA''Por favor, complete el CAPTCHA.'));
  99.                     }
  100.                     $verifyUrl 'https://www.google.com/recaptcha/api/siteverify';
  101.                     $params = [
  102.                         'secret' => $secretKey,
  103.                         'response' => $recaptchaResponse,
  104.                         'remoteip' => $request->getClientIp(),
  105.                     ];
  106.                     $ch curl_init();
  107.                     curl_setopt($chCURLOPT_URL$verifyUrl);
  108.                     curl_setopt($chCURLOPT_POSTtrue);
  109.                     curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($params));
  110.                     curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  111.                     $result curl_exec($ch);
  112.                     curl_close($ch);
  113.                     $resultJson json_decode($result);
  114.                     if (!$resultJson->success) {
  115.                         return $this->redirect($errorHandler->errorRedirectNoEmail('''Error en el reCAPTCHA''Por favor, confirme que no es un robot.'));
  116.                     }
  117.                 }
  118.                 if ($form->isValid()) {
  119.                     $event = new FormEvent($form$request);
  120.                     $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_SUCCESS);
  121.                     $user->setAgency($agency);
  122.                     $user->setCreatedAt(new \DateTime());
  123.                     $this->userManager->updateUser($user);
  124.                     if (null === $response $event->getResponse()) {
  125.                         $url $this->generateUrl('fos_user_registration_confirmed');
  126.                         $response = new RedirectResponse($url);
  127.                     }
  128.                     $this->eventDispatcher->dispatch(new FilterUserResponseEvent($user$request$response), FOSUserEvents::REGISTRATION_COMPLETED);
  129.                     return $response;
  130.                 }
  131.                 $event = new FormEvent($form$request);
  132.                 $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_FAILURE);
  133.                 if (null !== $response $event->getResponse()) {
  134.                     return $response;
  135.                 }
  136.             }
  137.             return $this->render('@FOSUser/Registration/register.html.twig', [
  138.                 'form' => $form->createView(),
  139.                 'siteKey' => $siteKey,
  140.                 'validateCaptcha' => $validateCaptcha
  141.             ]);
  142.         } catch (ValidateException $e) {
  143.             $message 'Información incompleta o inconsistente: ' $e->getMessage();
  144.             $redirectError $errorHandler->errorRedirect($router->generate('aviatur_general_homepage'), 'Error de Registro'$message);
  145.             return new RedirectResponse($redirectError);
  146.         } catch (\Exception $e) {
  147.             $message 'Error en el sistema: ' $e->getMessage();
  148.             $redirectError $errorHandler->errorRedirect($router->generate('aviatur_general_homepage'), 'Error de Registro'$message);
  149.             return new RedirectResponse($redirectError);
  150.         }
  151.     }
  152.     /**
  153.      * Tell the user to check their email provider.
  154.      */
  155.     public function checkEmailAction(Request $request): Response
  156.     {
  157.         $email $request->getSession()->get('fos_user_send_confirmation_email/email');
  158.         if (empty($email)) {
  159.             return new RedirectResponse($this->generateUrl('fos_user_registration_register'));
  160.         }
  161.         $request->getSession()->remove('fos_user_send_confirmation_email/email');
  162.         $user $this->userManager->findUserByEmail($email);
  163.         if (null === $user) {
  164.             return new RedirectResponse($this->container->get('router')->generate('fos_user_security_login'));
  165.         }
  166.         return $this->render('@FOSUser/Registration/check_email.html.twig', [
  167.             'user' => $user,
  168.         ]);
  169.     }
  170.     /**
  171.      * Receive the confirmation token from user email provider, login the user.
  172.      *
  173.      * @param string $token
  174.      */
  175.     public function confirmAction(Request $request$token): Response
  176.     {
  177.         $userManager $this->userManager;
  178.         $user $userManager->findUserByConfirmationToken($token);
  179.         if (null === $user) {
  180.             return new RedirectResponse($this->container->get('router')->generate('fos_user_security_login'));
  181.         }
  182.         $user->setConfirmationToken(null);
  183.         $user->setEnabled(true);
  184.         $event = new GetResponseUserEvent($user$request);
  185.         $this->eventDispatcher->dispatch($eventFOSUserEvents::REGISTRATION_CONFIRM);
  186.         $userManager->updateUser($user);
  187.         if (null === $response $event->getResponse()) {
  188.             $url $this->generateUrl('fos_user_registration_confirmed');
  189.             $response = new RedirectResponse($url);
  190.         }
  191.         $this->eventDispatcher->dispatch(new FilterUserResponseEvent($user$request$response), FOSUserEvents::REGISTRATION_CONFIRMED);
  192.         return $response;
  193.     }
  194.     /**
  195.      * Tell the user his account is now confirmed.
  196.      */
  197.     public function confirmedAction(Request $request): Response
  198.     {
  199.         $user $this->getUser();
  200.         if (!is_object($user) || !$user instanceof UserInterface) {
  201.             throw new AccessDeniedException('This user does not have access to this section.');
  202.         }
  203.         return $this->render('@FOSUser/Registration/confirmed.html.twig', [
  204.             'user' => $user,
  205.             'targetUrl' => $this->getTargetUrlFromSession($request->getSession()),
  206.         ]);
  207.     }
  208.     private function getTargetUrlFromSession(SessionInterface $session): ?string
  209.     {
  210.         $token $this->tokenStorage->getToken();
  211.         if (method_exists($token'getFirewallName')) {
  212.             $firewallName $token->getFirewallName();
  213.         } elseif (method_exists($token'getProviderKey')) {
  214.             // BC with Symfony 5.x
  215.             $firewallName $token->getProviderKey();
  216.         } else {
  217.             return null;
  218.         }
  219.         $key sprintf('_security.%s.target_path'$firewallName);
  220.         if ($session->has($key)) {
  221.             return $session->get($key);
  222.         }
  223.         return null;
  224.     }
  225. }