src/Controller/SecurityController.php line 198

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\EventSubscriber\WebmasterReferenceRequestSubscriber;
  4. use App\Form\ForgotPassword;
  5. use App\Form\Security\RegistrationForm;
  6. use App\Form\SecurityLogin;
  7. use App\Security\ApiUser;
  8. use App\Security\LoginFormAuthenticator;
  9. use App\Service\AuthenticationHelper;
  10. use App\Service\Client\SecurityService;
  11. use App\Service\Client\User\AccountService;
  12. use App\Service\Client\Webmaster\WebmasterAdService;
  13. use App\Service\ReCaptchaService;
  14. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\RedirectResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
  20. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  21. class SecurityController extends AbstractController
  22. {
  23.     protected SecurityService $service;
  24.     protected AuthenticationHelper $authenticationHelper;
  25.     public function __construct(SecurityService $serviceAuthenticationHelper $authHelper)
  26.     {
  27.         $this->service $service;
  28.         $this->authenticationHelper $authHelper;
  29.     }
  30.     /**
  31.      * @Route("/security/logout")
  32.      * @return void
  33.      */
  34.     public function logout(): void
  35.     {
  36.     }
  37.     /**
  38.      * @Route("/login", name="login")
  39.      * @Template
  40.      *
  41.      * @param AuthenticationUtils $authenticationUtils
  42.      * @param Request $request
  43.      * @param LoginFormAuthenticator $authenticator
  44.      * @param GuardAuthenticatorHandler $guardHandler
  45.      *
  46.      * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
  47.      */
  48.     public function login(AuthenticationUtils $authenticationUtils)
  49.     {
  50.         $form $this->createForm(SecurityLogin::class, null, [
  51.             'action' => $this->generateUrl('login'),
  52.         ]);
  53.         $user $this->getUser();
  54.         if ($user instanceof ApiUser && $user->getApiToken()) {
  55.             return $this->redirectToRoute('app_home_index');
  56.         }
  57.         return [
  58.             'error' => $authenticationUtils->getLastAuthenticationError(),
  59.             'form' => $form->createView(),
  60.         ];
  61.     }
  62.     /**
  63.      * @Route("/account/registerembed", methods={"GET|POST"})
  64.      * @Template()
  65.      * @param WebmasterAdService $webmasterAdService
  66.      * @param AccountService $service
  67.      * @param Request $request
  68.      * @return array
  69.      * @throws \Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface
  70.      * @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface
  71.      * @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface
  72.      * @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
  73.      */
  74.     public function registerembed(WebmasterAdService $webmasterAdServiceAccountService $serviceRequest $request): array
  75.     {
  76.         $success false;
  77.         $error false;
  78.         $form $this->createForm(RegistrationForm::class);
  79.         $form->handleRequest($request);
  80.         $session $request->getSession();
  81.         $wmRef $session->get(WebmasterReferenceRequestSubscriber::SESSION_KEY);
  82.         if ($request->isMethod('POST')) {
  83.             $data $form->getData();
  84.             try {
  85.                 $specs = [
  86.                     'email' => $data['email'] ?? ''
  87.                 ];
  88.                 if($session->has(WebmasterReferenceRequestSubscriber::SESSION_KEY)) {
  89.                     $specs['advertised_by_webmaster'] = $wmRef['webmaster_id'] ?? 0;
  90.                     $specs['advertised_by_tracking_id'] = $wmRef['tracking_id'] ?? '';
  91.                     $specs['advertised_by_campaign_id'] = $wmRef['campaign_id'] ?? 0;
  92.                 }
  93.                 if ($service->createRegistration($specs)) {
  94.                     $session->set('registrationEmail'$specs['email']);
  95.                     $session->save();
  96.                     $success true;
  97.                 } else {
  98.                     $error true;
  99.                     $success false;
  100.                 }
  101.             } catch (\DomainException $e) {
  102.                 $error true;
  103.                 $success false;
  104.             }
  105.         }
  106.         $ad $webmasterAdService->getPublicAdInfo($request->query->getInt('ad'));
  107.         return [
  108.             'form' => $form->createView(),
  109.             'wmRef' => $wmRef ?? ['webmaster_id' => $request->query->get('wmid')],
  110.             'error' => $error,
  111.             'success' => $success,
  112.             'ad' => $ad ?? ['theme' => 1]
  113.         ];
  114.     }
  115.     /**
  116.      * @Template()
  117.      * @return array
  118.      */
  119.     public function widget(): array
  120.     {
  121.         $form $this->createForm(SecurityLogin::class, null, [
  122.             'action' => $this->generateUrl('login'),
  123.             'attr' => [
  124.                 'class' => 'input-group'
  125.             ]
  126.         ]);
  127.         return [
  128.             'form' => $form->createView(),
  129.         ];
  130.     }
  131.     /**
  132.      * @Route("/security/passwort-vergessen", methods={"GET", "POST"})
  133.      * @Template
  134.      * @param Request $request
  135.      * @return array
  136.      */
  137.     public function forgotpassword(Request $request): array
  138.     {
  139.         $form $this->createForm(ForgotPassword::class, null, [
  140.             'attr' => [
  141.                 'class' => 'input-group'
  142.             ]
  143.         ]);
  144.         if ($request->isMethod('POST')) {
  145.             $form->handleRequest($request);
  146.             if ($form->isValid()) {
  147.                 if ($this->service->requestNewPassword($form->getData()['username'])) {
  148.                     $this->addFlash('success''Wir haben Dir eine E-Mail geschickt.');
  149.                 }
  150.             }
  151.         }
  152.         return [
  153.             'form' => $form->createView(),
  154.         ];
  155.     }
  156.     /**
  157.      * @Route("/security/passwort-vergessen/confirm/{confirmationToken}", methods={"GET"}, requirements={"confirmationToken": "[a-f0-9]{40}"})
  158.      * @Template
  159.      * @param Request $request
  160.      * @return array
  161.      */
  162.     public function forgotpasswordCofirm(string $confirmationToken): RedirectResponse
  163.     {
  164.         if ($this->service->confirmNewPasswordRequest($confirmationToken)) {
  165.             $this->addFlash('success''Du erhälst in Kürze eine weitere E-Mail mit Deinem neuen Passwort.');
  166.         } else {
  167.             $this->addFlash('error''Bitte versuche es erneut oder kontaktiere den Support.');
  168.         }
  169.         return $this->redirectToRoute('login');
  170.     }
  171.     /**
  172.      * @Route("/registration", methods={"GET|POST"})
  173.      * @Template()
  174.      * @return array|RedirectResponse
  175.      */
  176.     public function registration(AccountService $serviceRequest $requestReCaptchaService $recaptchaService)
  177.     {
  178.         if ($this->getUser() instanceof ApiUser) {
  179.             $this->addFlash('info''Bitte logge dich aus, bevor du eine Registrierung startest.');
  180.             return $this->redirect('/');
  181.         }
  182.         $form $this->createForm(RegistrationForm::class);
  183.         $form->handleRequest($request);
  184.         if ($form->isSubmitted() && $form->isValid()) {
  185.             if (!$recaptchaService->isValidSubmission($request)) {
  186.                 $this->addFlash('info''Bitte lösen Sie das reCaptcha.');
  187.                 return $this->redirectToRoute('app_security_registration');
  188.             }
  189.             $data $form->getData();
  190.             try {
  191.                 $specs = [
  192.                     'email' => $data['email'],
  193.                     "remote_ip" => $request->headers->get('X-Real-IP'$_SERVER["REMOTE_ADDR"]),
  194.                 ];
  195.                 $session $request->getSession();
  196.                 if($session->has(WebmasterReferenceRequestSubscriber::SESSION_KEY)) {
  197.                     $wmRef $session->get(WebmasterReferenceRequestSubscriber::SESSION_KEY);
  198.                     $specs['advertised_by_webmaster'] = $wmRef['webmaster_id'] ?? 0;
  199.                     $specs['advertised_by_tracking_id'] = $wmRef['tracking_id'] ?? '';
  200.                     $specs['advertised_by_campaign_id'] = $wmRef['campaign_id'] ?? 0;
  201.                 }
  202.                 if ($service->createRegistration($specs)) {
  203.                     $session->set('registrationEmail'$specs['email']);
  204.                     $session->save();
  205.                     $this->addFlash('success''Wir haben dir eine E-Mail geschickt.');
  206.                     return $this->redirectToRoute('app_security_registrationconfirm');
  207.                 }
  208.                 $this->addFlash('info''Bitte nochmal probieren oder Support kontaktieren.');
  209.             } catch (\DomainException $e) {
  210.                 $this->addFlash('error'$e->getMessage());
  211.             }
  212.             return $this->redirectToRoute('app_security_registration');
  213.         }
  214.         return [
  215.             'form' => $form->createView(),
  216.         ];
  217.     }
  218.     /**
  219.      * @Route("/registration/confirm/{confirmationToken}", methods={"GET"})
  220.      * @Template()
  221.      * @return array|RedirectResponse
  222.      */
  223.     public function registrationConfirm(Request $requeststring $confirmationToken '')
  224.     {
  225.         if ($this->getUser() instanceof ApiUser) {
  226.             $this->addFlash('info''Bitte logge dich aus, bevor du eine Registrierung bestätigst.');
  227.             return $this->redirect('/');
  228.         }
  229.         $email $request->getSession()->get('registrationEmail');
  230.         if (!$email) {
  231.             // restart registrationprocess
  232.             return $this->redirectToRoute('app_security_registration');
  233.         }
  234.         return [
  235.             'email' => $email,
  236.         ];
  237.     }
  238.     /**
  239.      * All calls to this method should be intercepted by PinConfirmAuthenticator
  240.      *
  241.      * @Route("/registration/confirm/pin", methods={"POST"})
  242.      * @return RedirectResponse
  243.      */
  244.     public function confirmPin(): RedirectResponse
  245.     {
  246.         if ($this->getUser() instanceof ApiUser) {
  247.             $this->addFlash('info''Bitte logge dich aus, bevor Du eine Registrierung bestätigst.');
  248.         }
  249.         return new RedirectResponse('/');
  250.     }
  251. }