‪TYPO3CMS  11.5
LoginController.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\EventDispatcher\EventDispatcherInterface;
21 use Psr\Http\Message\ResponseInterface;
37 
42 {
46  public const ‪MESSAGEKEY_DEFAULT = 'welcome';
47 
51  public const ‪MESSAGEKEY_ERROR = 'error';
52 
56  public const ‪MESSAGEKEY_LOGOUT = 'logout';
57 
61  protected ‪$redirectHandler;
62 
66  protected ‪$loginType = '';
67 
71  protected ‪$redirectUrl = '';
72 
76  protected ‪$requestHandler;
77 
81  protected ‪$userService;
82 
86  protected ‪$configuration;
87 
91  protected ‪$eventDispatcher;
92 
96  protected ‪$userAspect;
97 
101  protected ‪$redirectUrlValidator;
102 
106  protected ‪$showCookieWarning = false;
107 
108  public function ‪__construct(
113  EventDispatcherInterface ‪$eventDispatcher
114  ) {
115  $this->redirectHandler = ‪$redirectHandler;
116  $this->requestHandler = ‪$requestHandler;
117  $this->userService = ‪$userService;
118  $this->redirectUrlValidator = ‪$redirectUrlValidator;
119  $this->eventDispatcher = ‪$eventDispatcher;
120  $this->userAspect = GeneralUtility::makeInstance(Context::class)->getAspect('frontend.user');
121  }
122 
126  public function ‪initializeAction(): void
127  {
128  $this->loginType = (string)$this->requestHandler->getPropertyFromGetAndPost('logintype');
129  $this->configuration = ‪RedirectConfiguration::fromSettings($this->settings);
130 
131  if ($this->‪isLoginOrLogoutInProgress() && !$this->‪isRedirectDisabled()) {
132  if ($this->userAspect->isLoggedIn() && $this->userService->cookieWarningRequired()) {
133  $this->showCookieWarning = true;
134  return;
135  }
136 
137  $this->redirectUrl = $this->redirectHandler->processRedirect(
138  $this->loginType,
139  $this->configuration,
140  $this->request->hasArgument('redirectReferrer') ? $this->request->getArgument('redirectReferrer') : ''
141  );
142  }
143  }
144 
148  public function ‪loginAction(): ResponseInterface
149  {
150  if ($this->‪isLogoutSuccessful()) {
151  $this->eventDispatcher->dispatch(new LogoutConfirmedEvent($this, $this->view));
152  } elseif ($this->‪hasLoginErrorOccurred()) {
153  $this->eventDispatcher->dispatch(new LoginErrorOccurredEvent());
154  }
155 
156  if (($forwardResponse = $this->‪handleLoginForwards()) !== null) {
157  return $forwardResponse;
158  }
159  $this->‪handleRedirect();
160 
161  $this->eventDispatcher->dispatch(new ModifyLoginFormViewEvent($this->view));
162 
163  $this->view->assignMultiple(
164  [
165  'cookieWarning' => $this->showCookieWarning,
166  'messageKey' => $this->‪getStatusMessageKey(),
167  'storagePid' => $this->‪shallEnforceLoginSigning() ? $this->‪getSignedStorageFolders() : implode(',', $this->‪getStorageFolders()),
168  'permaloginStatus' => $this->‪getPermaloginStatus(),
169  'redirectURL' => $this->redirectHandler->getLoginFormRedirectUrl($this->configuration, $this->isRedirectDisabled()),
170  'redirectReferrer' => $this->request->hasArgument('redirectReferrer') ? (string)$this->request->getArgument('redirectReferrer') : '',
171  'referer' => $this->redirectHandler->getReferrerForLoginForm($this->request, $this->settings),
172  'noRedirect' => $this->isRedirectDisabled(),
173  ]
174  );
175 
176  return $this->‪htmlResponse();
177  }
178 
182  public function ‪overviewAction(bool $showLoginMessage = false): ResponseInterface
183  {
184  if (!$this->userAspect->isLoggedIn()) {
185  return new ‪ForwardResponse('login');
186  }
187 
188  $this->eventDispatcher->dispatch(new LoginConfirmedEvent($this, $this->view));
189  $this->‪handleRedirect();
190 
191  $this->view->assignMultiple(
192  [
193  'cookieWarning' => $this->showCookieWarning,
194  'user' => $this->userService->getFeUserData(),
195  'showLoginMessage' => $showLoginMessage,
196  ]
197  );
198 
199  return $this->‪htmlResponse();
200  }
201 
205  public function ‪logoutAction(int $redirectPageLogout = 0): ResponseInterface
206  {
207  $this->‪handleRedirect();
208 
209  $this->view->assignMultiple(
210  [
211  'cookieWarning' => $this->showCookieWarning,
212  'user' => $this->userService->getFeUserData(),
213  'storagePid' => $this->shallEnforceLoginSigning() ? $this->getSignedStorageFolders() : implode(',', $this->‪getStorageFolders()),
214  'noRedirect' => $this->‪isRedirectDisabled(),
215  'actionUri' => $this->redirectHandler->getLogoutFormRedirectUrl($this->configuration, $redirectPageLogout, $this->isRedirectDisabled()),
216  ]
217  );
218 
219  return $this->‪htmlResponse();
220  }
221 
225  protected function ‪handleRedirect(): void
226  {
227  if ($this->redirectUrl !== '') {
228  $event = new ‪BeforeRedirectEvent($this->loginType, $this->redirectUrl, $this->request);
229  $this->eventDispatcher->dispatch($event);
230  if ($event->getRedirectUrl() !== '') {
231  $this->‪redirectToUri($event->getRedirectUrl());
232  }
233  }
234  }
235 
239  protected function ‪handleLoginForwards(): ?ResponseInterface
240  {
241  if ($this->‪shouldRedirectToOverview()) {
242  return (new ForwardResponse('overview'))->withArguments(['showLoginMessage' => true]);
243  }
244 
245  if ($this->userAspect->isLoggedIn()) {
246  return (new ‪ForwardResponse('logout'))->withArguments(['redirectPageLogout' => $this->settings['redirectPageLogout']]);
247  }
248 
249  return null;
250  }
251 
256  protected function ‪getPermaloginStatus(): int
257  {
258  $permaLogin = (int)‪$GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'];
259 
260  return $this->‪isPermaloginDisabled($permaLogin) ? -1 : $permaLogin;
261  }
262 
263  protected function ‪isPermaloginDisabled(int $permaLogin): bool
264  {
265  return $permaLogin > 1
266  || (int)($this->settings['showPermaLogin'] ?? 0) === 0
267  || ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['lifetime'] === 0;
268  }
269 
273  protected function ‪shouldRedirectToOverview(): bool
274  {
275  return $this->userAspect->isLoggedIn()
276  && ($this->loginType === ‪LoginType::LOGIN)
277  && !($this->settings['showLogoutFormAfterLogin'] ?? 0);
278  }
279 
283  protected function ‪getStatusMessageKey(): string
284  {
286  if ($this->‪hasLoginErrorOccurred()) {
287  $messageKey = ‪self::MESSAGEKEY_ERROR;
288  } elseif ($this->loginType === ‪LoginType::LOGOUT) {
289  $messageKey = ‪self::MESSAGEKEY_LOGOUT;
290  }
291 
292  return $messageKey;
293  }
294 
295  protected function ‪isLoginOrLogoutInProgress(): bool
296  {
297  return $this->loginType === ‪LoginType::LOGIN || $this->loginType === ‪LoginType::LOGOUT;
298  }
299 
303  public function ‪isRedirectDisabled(): bool
304  {
305  return
306  $this->request->hasArgument('noredirect')
307  || ($this->settings['noredirect'] ?? false)
308  || ($this->settings['redirectDisable'] ?? false);
309  }
310 
311  protected function ‪isLogoutSuccessful(): bool
312  {
313  return $this->loginType === ‪LoginType::LOGOUT && !$this->userAspect->isLoggedIn();
314  }
315 
316  protected function ‪hasLoginErrorOccurred(): bool
317  {
318  return $this->loginType === ‪LoginType::LOGIN && !$this->userAspect->isLoggedIn();
319  }
320 }
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\__construct
‪__construct(RedirectHandler $redirectHandler, ServerRequestHandler $requestHandler, UserService $userService, RedirectUrlValidator $redirectUrlValidator, EventDispatcherInterface $eventDispatcher)
Definition: LoginController.php:98
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\MESSAGEKEY_LOGOUT
‪const MESSAGEKEY_LOGOUT
Definition: LoginController.php:56
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\redirectToUri
‪never redirectToUri($uri, $_=null, $statusCode=303)
Definition: ActionController.php:966
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$userAspect
‪UserAspect $userAspect
Definition: LoginController.php:88
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$requestHandler
‪ServerRequestHandler $requestHandler
Definition: LoginController.php:72
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\isPermaloginDisabled
‪isPermaloginDisabled(int $permaLogin)
Definition: LoginController.php:253
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$configuration
‪RedirectConfiguration $configuration
Definition: LoginController.php:80
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\htmlResponse
‪ResponseInterface htmlResponse(string $html=null)
Definition: ActionController.php:1067
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\handleRedirect
‪handleRedirect()
Definition: LoginController.php:215
‪TYPO3\CMS\FrontendLogin\Controller\AbstractLoginFormController
Definition: AbstractLoginFormController.php:26
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\hasLoginErrorOccurred
‪hasLoginErrorOccurred()
Definition: LoginController.php:306
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\MESSAGEKEY_ERROR
‪const MESSAGEKEY_ERROR
Definition: LoginController.php:51
‪TYPO3\CMS\FrontendLogin\Event\LoginErrorOccurredEvent
Definition: LoginErrorOccurredEvent.php:23
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\isLogoutSuccessful
‪isLogoutSuccessful()
Definition: LoginController.php:301
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$redirectHandler
‪RedirectHandler $redirectHandler
Definition: LoginController.php:60
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\handleLoginForwards
‪handleLoginForwards()
Definition: LoginController.php:229
‪TYPO3\CMS\FrontendLogin\Controller
Definition: AbstractLoginFormController.php:18
‪TYPO3\CMS\FrontendLogin\Redirect\ServerRequestHandler
Definition: ServerRequestHandler.php:29
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\isRedirectDisabled
‪isRedirectDisabled()
Definition: LoginController.php:293
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$loginType
‪string $loginType
Definition: LoginController.php:64
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\shouldRedirectToOverview
‪shouldRedirectToOverview()
Definition: LoginController.php:263
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$eventDispatcher
‪EventDispatcherInterface $eventDispatcher
Definition: LoginController.php:84
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$redirectUrlValidator
‪RedirectUrlValidator $redirectUrlValidator
Definition: LoginController.php:92
‪TYPO3\CMS\Extbase\Http\ForwardResponse
Definition: ForwardResponse.php:24
‪TYPO3\CMS\Core\Authentication\LoginType
Definition: LoginType.php:26
‪TYPO3\CMS\FrontendLogin\Controller\AbstractLoginFormController\getStorageFolders
‪getStorageFolders()
Definition: AbstractLoginFormController.php:30
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:53
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\isLoginOrLogoutInProgress
‪isLoginOrLogoutInProgress()
Definition: LoginController.php:285
‪TYPO3\CMS\FrontendLogin\Controller\AbstractLoginFormController\shallEnforceLoginSigning
‪shallEnforceLoginSigning()
Definition: AbstractLoginFormController.php:63
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\MESSAGEKEY_DEFAULT
‪const MESSAGEKEY_DEFAULT
Definition: LoginController.php:46
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$showCookieWarning
‪bool $showCookieWarning
Definition: LoginController.php:96
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$userService
‪UserService $userService
Definition: LoginController.php:76
‪TYPO3\CMS\FrontendLogin\Service\UserService
Definition: UserService.php:26
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\overviewAction
‪overviewAction(bool $showLoginMessage=false)
Definition: LoginController.php:172
‪TYPO3\CMS\FrontendLogin\Controller\AbstractLoginFormController\getSignedStorageFolders
‪getSignedStorageFolders()
Definition: AbstractLoginFormController.php:53
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$redirectUrl
‪string $redirectUrl
Definition: LoginController.php:68
‪TYPO3\CMS\FrontendLogin\Event\ModifyLoginFormViewEvent
Definition: ModifyLoginFormViewEvent.php:26
‪TYPO3\CMS\Core\Authentication\LoginType\LOGOUT
‪const LOGOUT
Definition: LoginType.php:35
‪TYPO3\CMS\FrontendLogin\Event\LogoutConfirmedEvent
Definition: LogoutConfirmedEvent.php:24
‪TYPO3\CMS\Core\Authentication\LoginType\LOGIN
‪const LOGIN
Definition: LoginType.php:30
‪TYPO3\CMS\FrontendLogin\Event\LoginConfirmedEvent
Definition: LoginConfirmedEvent.php:24
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\getStatusMessageKey
‪getStatusMessageKey()
Definition: LoginController.php:273
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\getPermaloginStatus
‪getPermaloginStatus()
Definition: LoginController.php:246
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\logoutAction
‪logoutAction(int $redirectPageLogout=0)
Definition: LoginController.php:195
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration\fromSettings
‪static fromSettings(array $settings)
Definition: RedirectConfiguration.php:96
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration
Definition: RedirectConfiguration.php:28
‪TYPO3\CMS\FrontendLogin\Event\BeforeRedirectEvent
Definition: BeforeRedirectEvent.php:28
‪TYPO3\CMS\FrontendLogin\Validation\RedirectUrlValidator
Definition: RedirectUrlValidator.php:32
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\initializeAction
‪initializeAction()
Definition: LoginController.php:116
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\FrontendLogin\Controller\LoginController
Definition: LoginController.php:42
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler
Definition: RedirectHandler.php:33
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\loginAction
‪loginAction()
Definition: LoginController.php:138
‪TYPO3\CMS\Core\Context\UserAspect
Definition: UserAspect.php:37