Spaces:
No application file
No application file
| namespace Mautic\UserBundle\Controller; | |
| use Mautic\CoreBundle\Controller\CommonController; | |
| use Mautic\CoreBundle\Service\FlashBag; | |
| use Mautic\PluginBundle\Helper\IntegrationHelper; | |
| use Mautic\UserBundle\Exception\WeakPasswordException; | |
| use Symfony\Component\EventDispatcher\EventSubscriberInterface; | |
| use Symfony\Component\HttpFoundation\RedirectResponse; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpKernel\Event\RequestEvent; | |
| use Symfony\Component\HttpKernel\KernelEvents; | |
| use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; | |
| use Symfony\Component\Security\Core\Exception; | |
| use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; | |
| use Symfony\Contracts\Translation\TranslatorInterface; | |
| class SecurityController extends CommonController implements EventSubscriberInterface | |
| { | |
| public function onRequest(RequestEvent $event): void | |
| { | |
| $controller = $event->getRequest()->attributes->get('_controller'); | |
| \assert(is_string($controller)); | |
| if (!str_contains($controller, self::class)) { | |
| return; | |
| } | |
| $authChecker = $this->get('security.authorization_checker'); | |
| \assert($authChecker instanceof AuthorizationCheckerInterface); | |
| // redirect user if they are already authenticated | |
| if ($authChecker->isGranted('IS_AUTHENTICATED_FULLY') | |
| || $authChecker->isGranted('IS_AUTHENTICATED_REMEMBERED') | |
| ) { | |
| $redirectUrl = $this->generateUrl('mautic_dashboard_index'); | |
| $event->setResponse(new RedirectResponse($redirectUrl)); | |
| } | |
| } | |
| /** | |
| * Generates login form and processes login. | |
| * | |
| * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\Response | |
| */ | |
| public function loginAction(Request $request, AuthenticationUtils $authenticationUtils, IntegrationHelper $integrationHelper, TranslatorInterface $translator): \Symfony\Component\HttpFoundation\Response | |
| { | |
| // A way to keep the upgrade from failing if the session is lost after | |
| // the cache is cleared by upgrade.php | |
| if ($request->cookies->has('mautic_update')) { | |
| $step = $request->cookies->get('mautic_update'); | |
| if ('clearCache' === $step) { | |
| // Run migrations | |
| $request->query->set('finalize', 1); | |
| return $this->forward('Mautic\CoreBundle\Controller\AjaxController::updateDatabaseMigrationAction', | |
| [ | |
| 'request' => $request, | |
| ] | |
| ); | |
| } elseif ('schemaMigration' === $step) { | |
| // Done so finalize | |
| return $this->forward('Mautic\CoreBundle\Controller\AjaxController::updateFinalizationAction', | |
| [ | |
| 'request' => $request, | |
| ] | |
| ); | |
| } | |
| /** @var \Mautic\CoreBundle\Helper\CookieHelper $cookieHelper */ | |
| $cookieHelper = $this->factory->getHelper('cookie'); | |
| $cookieHelper->deleteCookie('mautic_update'); | |
| } | |
| $error = $authenticationUtils->getLastAuthenticationError(); | |
| if (null !== $error) { | |
| if ($error instanceof WeakPasswordException) { | |
| $this->addFlash(FlashBag::LEVEL_ERROR, $translator->trans('mautic.user.auth.error.weakpassword', [], 'flashes')); | |
| return $this->forward('Mautic\UserBundle\Controller\PublicController::passwordResetAction'); | |
| } elseif ($error instanceof Exception\BadCredentialsException) { | |
| $msg = 'mautic.user.auth.error.invalidlogin'; | |
| } elseif ($error instanceof Exception\DisabledException) { | |
| $msg = 'mautic.user.auth.error.disabledaccount'; | |
| } else { | |
| $msg = $error->getMessage(); | |
| } | |
| $this->addFlashMessage($msg, [], FlashBag::LEVEL_ERROR, null, false); | |
| } | |
| $request->query->set('tmpl', 'login'); | |
| // Get a list of SSO integrations | |
| $integrations = $integrationHelper->getIntegrationObjects(null, ['sso_service'], true, null, true); | |
| return $this->delegateView([ | |
| 'viewParameters' => [ | |
| 'last_username' => $authenticationUtils->getLastUsername(), | |
| 'integrations' => $integrations, | |
| ], | |
| 'contentTemplate' => '@MauticUser/Security/login.html.twig', | |
| 'passthroughVars' => [ | |
| 'route' => $this->generateUrl('login'), | |
| 'mauticContent' => 'user', | |
| 'sessionExpired' => true, | |
| ], | |
| ]); | |
| } | |
| /** | |
| * Do nothing. | |
| */ | |
| public function loginCheckAction(): void | |
| { | |
| } | |
| /** | |
| * The plugin should be handling this in it's listener. | |
| */ | |
| public function ssoLoginAction($integration): RedirectResponse | |
| { | |
| return new RedirectResponse($this->generateUrl('login')); | |
| } | |
| /** | |
| * The plugin should be handling this in it's listener. | |
| */ | |
| public function ssoLoginCheckAction($integration): RedirectResponse | |
| { | |
| // The plugin should be handling this in it's listener | |
| return new RedirectResponse($this->generateUrl('login')); | |
| } | |
| /** | |
| * @return array<string, string> | |
| */ | |
| public static function getSubscribedEvents(): array | |
| { | |
| return [ | |
| KernelEvents::REQUEST => 'onRequest', | |
| ]; | |
| } | |
| } | |