src/Controller/Admin/SecurityController.php line 79

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\Route;
  4. use App\EventListener\FeatureFlagListener;
  5. use App\Renderer\Page;
  6. use App\Templating\Decorator;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Flagception\Manager\FeatureManagerInterface;
  9. use FOS\UserBundle\Controller\ResettingController;
  10. use FOS\UserBundle\Controller\SecurityController as BaseController;
  11. use FOS\UserBundle\Event\FilterUserResponseEvent;
  12. use FOS\UserBundle\Event\FormEvent;
  13. use FOS\UserBundle\Event\GetResponseUserEvent;
  14. use FOS\UserBundle\Form\Factory\FactoryInterface;
  15. use FOS\UserBundle\FOSUserEvents;
  16. use FOS\UserBundle\Model\UserManagerInterface;
  17. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\RequestStack;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\RouterInterface;
  23. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  24. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  25. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  26. use Symfony\Contracts\Translation\TranslatorInterface;
  27. class SecurityController extends BaseController
  28. {
  29.     public const TOKEN_LIFETIME_IN_HOURS 2;
  30.     private RequestStack $requestStack;
  31.     private Page $pageRenderer;
  32.     private RouterInterface $router;
  33.     private ResettingController $resettingController;
  34.     private UserManagerInterface $userManager;
  35.     private FactoryInterface $formFactory;
  36.     private EventDispatcherInterface $eventDispatcher;
  37.     private FeatureManagerInterface $featureManager;
  38.     private EntityManagerInterface $entityManager;
  39.     private ParameterBagInterface $parameterBag;
  40.     public function __construct(
  41.         AuthenticationUtils $authenticationUtils,
  42.         CsrfTokenManagerInterface $tokenManager,
  43.         RequestStack $requestStack,
  44.         Page $pageRenderer,
  45.         RouterInterface $router,
  46.         ResettingController $resettingController,
  47.         UserManagerInterface $userManager,
  48.         FactoryInterface $formFactory,
  49.         EventDispatcherInterface $eventDispatcher,
  50.         FeatureManagerInterface $featureManager,
  51.         EntityManagerInterface $entityManager,
  52.         ParameterBagInterface $parameterBag,
  53.         protected readonly Decorator $decorator,
  54.     ) {
  55.         parent::__construct($authenticationUtils$tokenManager);
  56.         $this->requestStack $requestStack;
  57.         $this->pageRenderer $pageRenderer;
  58.         $this->router $router;
  59.         $this->resettingController $resettingController;
  60.         $this->userManager $userManager;
  61.         $this->formFactory $formFactory;
  62.         $this->eventDispatcher $eventDispatcher;
  63.         $this->featureManager $featureManager;
  64.         $this->entityManager $entityManager;
  65.         $this->parameterBag $parameterBag;
  66.     }
  67.     /**
  68.      * {@inheritdoc}
  69.      *
  70.      * @throws \Exception
  71.      */
  72.     protected function renderLogin(array $data): Response
  73.     {
  74.         $template '@admin/Security/login.html.twig';
  75.         $requestAttributes $this->requestStack->getMainRequest()->attributes;
  76.         $route $this->entityManager->getRepository(Route::class)
  77.             ->findOneBy(['name' => Route::ALIAS_PREFIX.'user_login']);
  78.         $data['enableRegistration'] = false;
  79.         $data['enableForgotPassword'] = true;
  80.         $data['enableCompanyRegistration'] = false;
  81.         $data['loginCheck'] = $this->router->generate('fos_user_security_check');
  82.         $data['forgotPasswordLink'] = $this->router->generate('admin_forgot_password');
  83.         $data['azureLogin'] = $this->featureManager->isActive(FeatureFlagListener::FEATURE_OAUTH_SSO_AZURE);
  84.         $data['googleLogin'] = $this->featureManager->isActive(FeatureFlagListener::FEATURE_OAUTH_SSO_GOOGLE);
  85.         $data['getnoticedGoogleLogin'] = $this->featureManager->isActive(FeatureFlagListener::FEATURE_OAUTH_SSO_GETNOTICED_GOOGLE);
  86.         $data['pingfederateLogin'] = $this->featureManager->isActive(FeatureFlagListener::FEATURE_OAUTH_SSO_PINGFEDERATE);
  87.         if ('user_login' === $requestAttributes->get('_route')) {
  88.             if (true !== $this->parameterBag->get('site_user_active')) {
  89.                 return $this->redirectToRoute('homepage');
  90.             }
  91.             $data['loginCheck'] = $this->router->generate('user_check');
  92.             $data['forgotPasswordLink'] = $this->router->generate('pages_user_forgot_password');
  93.             $data['enableRegistration'] = $this->parameterBag->get('site_user_enable_registration');
  94.             $data['enableForgotPassword'] = $this->parameterBag->get('site_user_enable_forgot_password');
  95.             $data['enableCompanyRegistration'] = $this->parameterBag->get('site_user_enable_company_registration');
  96.             $response $this
  97.                 ->pageRenderer
  98.                 ->renderPage(
  99.                     '{user_login}',
  100.                     $this->decorator->getTemplate('admin/Security/login_content.html.twig'),
  101.                     $data,
  102.                     [],
  103.                     [],
  104.                     null,
  105.                     $route
  106.                 );
  107.             $response->setMaxAge(0);
  108.             $response->setSharedMaxAge(0);
  109.             return $response;
  110.         }
  111.         $response $this->render($template$data);
  112.         $response->setSharedMaxAge(0);
  113.         return $response;
  114.     }
  115.     public function forgotPasswordAction(Request $request): Response
  116.     {
  117.         if ($request->get('username')) {
  118.             $response $this->resettingController->sendEmailAction($request);
  119.             if ($response instanceof RedirectResponse) {
  120.                 return $this->redirectToRoute('admin_check_mail');
  121.             }
  122.         }
  123.         return $this->render('@admin/Security/forgot_password.html.twig');
  124.     }
  125.     public function checkMailAction(): Response
  126.     {
  127.         return $this->render('@admin/Security/check_mail.html.twig', [
  128.             'tokenLifetime' => self::TOKEN_LIFETIME_IN_HOURS,
  129.         ]);
  130.     }
  131.     public function resetAction(Request $request$tokenTranslatorInterface $translatorRouterInterface $router): Response
  132.     {
  133.         $user $this->userManager->findUserByConfirmationToken($token);
  134.         if (null === $user) {
  135.             return new RedirectResponse($router->generate('admin_dashboard_dashboard_index'));
  136.         }
  137.         $event = new GetResponseUserEvent($user$request);
  138.         $this->eventDispatcher->dispatch($eventFOSUserEvents::RESETTING_RESET_INITIALIZE);
  139.         if (null !== $event->getResponse()) {
  140.             return $event->getResponse();
  141.         }
  142.         $locale $request->getLocale();
  143.         $form $this->formFactory->createForm();
  144.         $form->setData($user);
  145.         $form->handleRequest($request);
  146.         if ($form->isSubmitted() && $form->isValid()) {
  147.             $event = new FormEvent($form$request);
  148.             $this->eventDispatcher->dispatch($eventFOSUserEvents::RESETTING_RESET_SUCCESS);
  149.             $this->userManager->updateUser($user);
  150.             if (null === $response $event->getResponse()) {
  151.                 $url $this->generateUrl('admin_dashboard_dashboard_index');
  152.                 $response = new RedirectResponse($url);
  153.             }
  154.             $this->eventDispatcher->dispatch(
  155.                 new FilterUserResponseEvent($user$request$response),
  156.                 FOSUserEvents::RESETTING_RESET_COMPLETED
  157.             );
  158.             return $response;
  159.         }
  160.         return $this->render('@admin/Security/reset.html.twig', [
  161.             'token' => $token,
  162.             'form' => $form->createView(),
  163.             'site_page_title' => $translator->trans('Reset Password', [], 'admin'$locale),
  164.         ]);
  165.     }
  166. }