‪TYPO3CMS  10.4
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;
35 
40 {
44  public const ‪MESSAGEKEY_DEFAULT = 'welcome';
45 
49  public const ‪MESSAGEKEY_ERROR = 'error';
50 
54  public const ‪MESSAGEKEY_LOGOUT = 'logout';
55 
59  protected ‪$redirectHandler;
60 
64  protected ‪$loginType = '';
65 
69  protected ‪$redirectUrl = '';
70 
74  protected ‪$requestHandler;
75 
79  protected ‪$userService;
80 
84  protected ‪$configuration;
85 
89  protected ‪$eventDispatcher;
90 
94  protected ‪$userAspect;
95 
99  protected ‪$showCookieWarning = false;
100 
101  public function ‪__construct(
105  EventDispatcherInterface ‪$eventDispatcher
106  ) {
107  $this->redirectHandler = ‪$redirectHandler;
108  $this->requestHandler = ‪$requestHandler;
109  $this->userService = ‪$userService;
110  $this->eventDispatcher = ‪$eventDispatcher;
111  $this->userAspect = GeneralUtility::makeInstance(Context::class)->getAspect('frontend.user');
112  }
113 
117  public function ‪initializeAction(): void
118  {
119  $this->loginType = (string)$this->requestHandler->getPropertyFromGetAndPost('logintype');
120  $this->configuration = ‪RedirectConfiguration::fromSettings($this->settings);
121 
122  if ($this->‪isLoginOrLogoutInProgress() && !$this->‪isRedirectDisabled()) {
123  if ($this->userAspect->isLoggedIn() && $this->userService->cookieWarningRequired()) {
124  $this->showCookieWarning = true;
125  return;
126  }
127 
128  $this->redirectUrl = $this->redirectHandler->processRedirect(
129  $this->loginType,
130  $this->configuration,
131  $this->request->hasArgument('redirectReferrer') ? $this->request->getArgument('redirectReferrer') : ''
132  );
133  }
134  }
135 
139  public function ‪loginAction(): void
140  {
141  if ($this->‪isLogoutSuccessful()) {
142  $this->eventDispatcher->dispatch(new LogoutConfirmedEvent($this, $this->view));
143  } elseif ($this->‪hasLoginErrorOccurred()) {
144  $this->eventDispatcher->dispatch(new LoginErrorOccurredEvent());
145  }
146 
147  $this->‪handleLoginForwards();
148  $this->‪handleRedirect();
149 
150  $this->eventDispatcher->dispatch(new ModifyLoginFormViewEvent($this->view));
151 
152  $this->view->assignMultiple(
153  [
154  'cookieWarning' => $this->showCookieWarning,
155  'messageKey' => $this->‪getStatusMessageKey(),
156  'storagePid' => $this->‪shallEnforceLoginSigning() ? $this->‪getSignedStorageFolders() : implode(',', $this->‪getStorageFolders()),
157  'permaloginStatus' => $this->‪getPermaloginStatus(),
158  'redirectURL' => $this->redirectHandler->getLoginFormRedirectUrl($this->configuration, $this->isRedirectDisabled()),
159  'redirectReferrer' => $this->request->hasArgument('redirectReferrer') ? (string)$this->request->getArgument('redirectReferrer'): '',
160  'referer' => $this->requestHandler->getPropertyFromGetAndPost('referer'),
161  'noRedirect' => $this->isRedirectDisabled(),
162  ]
163  );
164  }
165 
172  public function ‪overviewAction(bool $showLoginMessage = false): void
173  {
174  if (!$this->userAspect->isLoggedIn()) {
175  $this->‪forward('login');
176  }
177 
178  $this->eventDispatcher->dispatch(new LoginConfirmedEvent($this, $this->view));
179  $this->‪handleRedirect();
180 
181  $this->view->assignMultiple(
182  [
183  'cookieWarning' => $this->showCookieWarning,
184  'user' => $this->userService->getFeUserData(),
185  'showLoginMessage' => $showLoginMessage,
186  ]
187  );
188  }
189 
194  public function ‪logoutAction(int $redirectPageLogout = 0): void
195  {
196  $this->‪handleRedirect();
197 
198  $this->view->assignMultiple(
199  [
200  'cookieWarning' => $this->showCookieWarning,
201  'user' => $this->userService->getFeUserData(),
202  'storagePid' => $this->shallEnforceLoginSigning() ? $this->getSignedStorageFolders() : implode(',', $this->‪getStorageFolders()),
203  'noRedirect' => $this->‪isRedirectDisabled(),
204  'actionUri' => $this->redirectHandler->getLogoutFormRedirectUrl($this->configuration, $redirectPageLogout, $this->isRedirectDisabled()),
205  ]
206  );
207  }
208 
212  protected function ‪handleRedirect(): void
213  {
214  if ($this->redirectUrl !== '') {
215  $this->eventDispatcher->dispatch(new ‪BeforeRedirectEvent($this->loginType, $this->redirectUrl));
216  $this->‪redirectToUri($this->redirectUrl);
217  }
218  }
219 
223  protected function ‪handleLoginForwards(): void
224  {
225  if ($this->‪shouldRedirectToOverview()) {
226  $this->‪forward('overview', null, null, ['showLoginMessage' => true]);
227  }
228 
229  if ($this->userAspect->isLoggedIn()) {
230  $this->‪forward('logout', null, null, ['redirectPageLogout' => $this->settings['redirectPageLogout']]);
231  }
232  }
233 
240  protected function ‪getPermaloginStatus(): int
241  {
242  $permaLogin = (int)‪$GLOBALS['TYPO3_CONF_VARS']['FE']['permalogin'];
243 
244  return $this->‪isPermaloginDisabled($permaLogin) ? -1 : $permaLogin;
245  }
246 
247  protected function ‪isPermaloginDisabled(int $permaLogin): bool
248  {
249  return $permaLogin > 1
250  || (int)($this->settings['showPermaLogin'] ?? 0) === 0
251  || ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['lifetime'] === 0;
252  }
253 
259  protected function ‪shouldRedirectToOverview(): bool
260  {
261  return $this->userAspect->isLoggedIn()
262  && ($this->loginType === ‪LoginType::LOGIN)
263  && !($this->settings['showLogoutFormAfterLogin'] ?? 0);
264  }
265 
271  protected function ‪getStatusMessageKey(): string
272  {
273  $messageKey = ‪self::MESSAGEKEY_DEFAULT;
274  if ($this->‪hasLoginErrorOccurred()) {
275  $messageKey = ‪self::MESSAGEKEY_ERROR;
276  } elseif ($this->loginType === ‪LoginType::LOGOUT) {
277  $messageKey = ‪self::MESSAGEKEY_LOGOUT;
278  }
279 
280  return $messageKey;
281  }
282 
283  protected function ‪isLoginOrLogoutInProgress(): bool
284  {
285  return $this->loginType === ‪LoginType::LOGIN || $this->loginType === ‪LoginType::LOGOUT;
286  }
287 
293  public function ‪isRedirectDisabled(): bool
294  {
295  return
296  $this->request->hasArgument('noredirect')
297  || ($this->settings['noredirect'] ?? false)
298  || ($this->settings['redirectDisable'] ?? false);
299  }
300 
301  protected function ‪isLogoutSuccessful(): bool
302  {
303  return $this->loginType === ‪LoginType::LOGOUT && !$this->userAspect->isLoggedIn();
304  }
305 
306  protected function ‪hasLoginErrorOccurred(): bool
307  {
308  return $this->loginType === ‪LoginType::LOGIN && !$this->userAspect->isLoggedIn();
309  }
310 }
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\MESSAGEKEY_LOGOUT
‪const MESSAGEKEY_LOGOUT
Definition: LoginController.php:54
‪TYPO3\CMS\Extbase\Mvc\Exception\StopActionException
Definition: StopActionException.php:31
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\forward
‪forward($actionName, $controllerName=null, $extensionName=null, array $arguments=null)
Definition: ActionController.php:815
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\getPermaloginStatus
‪int getPermaloginStatus()
Definition: LoginController.php:231
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$userAspect
‪UserAspect $userAspect
Definition: LoginController.php:86
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$requestHandler
‪ServerRequestHandler $requestHandler
Definition: LoginController.php:70
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\isPermaloginDisabled
‪isPermaloginDisabled(int $permaLogin)
Definition: LoginController.php:238
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$configuration
‪RedirectConfiguration $configuration
Definition: LoginController.php:78
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\handleRedirect
‪handleRedirect()
Definition: LoginController.php:203
‪TYPO3\CMS\FrontendLogin\Controller\AbstractLoginFormController
Definition: AbstractLoginFormController.php:26
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\hasLoginErrorOccurred
‪hasLoginErrorOccurred()
Definition: LoginController.php:297
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\MESSAGEKEY_ERROR
‪const MESSAGEKEY_ERROR
Definition: LoginController.php:49
‪TYPO3\CMS\FrontendLogin\Event\LoginErrorOccurredEvent
Definition: LoginErrorOccurredEvent.php:24
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\isLogoutSuccessful
‪isLogoutSuccessful()
Definition: LoginController.php:292
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$redirectHandler
‪RedirectHandler $redirectHandler
Definition: LoginController.php:58
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\handleLoginForwards
‪handleLoginForwards()
Definition: LoginController.php:214
‪TYPO3\CMS\FrontendLogin\Controller
Definition: AbstractLoginFormController.php:18
‪TYPO3\CMS\FrontendLogin\Redirect\ServerRequestHandler
Definition: ServerRequestHandler.php:29
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$loginType
‪string $loginType
Definition: LoginController.php:62
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\isRedirectDisabled
‪bool isRedirectDisabled()
Definition: LoginController.php:284
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$eventDispatcher
‪EventDispatcherInterface $eventDispatcher
Definition: LoginController.php:82
‪TYPO3\CMS\Core\Authentication\LoginType
Definition: LoginType.php:26
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:53
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\isLoginOrLogoutInProgress
‪isLoginOrLogoutInProgress()
Definition: LoginController.php:274
‪TYPO3\CMS\FrontendLogin\Controller\AbstractLoginFormController\shallEnforceLoginSigning
‪shallEnforceLoginSigning()
Definition: AbstractLoginFormController.php:65
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\MESSAGEKEY_DEFAULT
‪const MESSAGEKEY_DEFAULT
Definition: LoginController.php:44
‪TYPO3\CMS\FrontendLogin\Controller\AbstractLoginFormController\getStorageFolders
‪array getStorageFolders()
Definition: AbstractLoginFormController.php:32
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$showCookieWarning
‪bool $showCookieWarning
Definition: LoginController.php:90
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$userService
‪UserService $userService
Definition: LoginController.php:74
‪TYPO3\CMS\FrontendLogin\Service\UserService
Definition: UserService.php:26
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\overviewAction
‪overviewAction(bool $showLoginMessage=false)
Definition: LoginController.php:163
‪TYPO3\CMS\FrontendLogin\Controller\AbstractLoginFormController\getSignedStorageFolders
‪getSignedStorageFolders()
Definition: AbstractLoginFormController.php:55
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\$redirectUrl
‪string $redirectUrl
Definition: LoginController.php:66
‪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:25
‪TYPO3\CMS\Core\Authentication\LoginType\LOGIN
‪const LOGIN
Definition: LoginType.php:30
‪TYPO3\CMS\FrontendLogin\Event\LoginConfirmedEvent
Definition: LoginConfirmedEvent.php:25
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\getStatusMessageKey
‪string getStatusMessageKey()
Definition: LoginController.php:262
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\logoutAction
‪logoutAction(int $redirectPageLogout=0)
Definition: LoginController.php:185
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:5
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration\fromSettings
‪static static fromSettings(array $settings)
Definition: RedirectConfiguration.php:99
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration
Definition: RedirectConfiguration.php:28
‪TYPO3\CMS\FrontendLogin\Event\BeforeRedirectEvent
Definition: BeforeRedirectEvent.php:24
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\initializeAction
‪initializeAction()
Definition: LoginController.php:108
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:46
‪TYPO3\CMS\FrontendLogin\Controller\LoginController
Definition: LoginController.php:40
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\shouldRedirectToOverview
‪bool shouldRedirectToOverview()
Definition: LoginController.php:250
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler
Definition: RedirectHandler.php:30
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\loginAction
‪loginAction()
Definition: LoginController.php:130
‪TYPO3\CMS\Core\Context\UserAspect
Definition: UserAspect.php:38
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\redirectToUri
‪redirectToUri($uri, $delay=0, $statusCode=303)
Definition: ActionController.php:878
‪TYPO3\CMS\FrontendLogin\Controller\LoginController\__construct
‪__construct(RedirectHandler $redirectHandler, ServerRequestHandler $requestHandler, UserService $userService, EventDispatcherInterface $eventDispatcher)
Definition: LoginController.php:92