‪TYPO3CMS  11.5
RedirectHandler.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\Http\Message\ServerRequestInterface;
26 
33 {
37  protected ‪$userIsLoggedIn = false;
38 
42  protected ‪$requestHandler;
43 
47  protected ‪$redirectModeHandler;
48 
52  protected ‪$redirectUrlValidator;
53 
54  public function ‪__construct(
57  ‪Context $context,
59  ) {
60  $this->requestHandler = ‪$requestHandler;
61  $this->redirectModeHandler = ‪$redirectModeHandler;
62  $this->redirectUrlValidator = ‪$redirectUrlValidator;
63  $this->userIsLoggedIn = (bool)$context->‪getPropertyFromAspect('frontend.user', 'isLoggedIn');
64  }
65 
69  public function ‪processRedirect(string $loginType, ‪RedirectConfiguration $configuration, string $redirectModeReferrer): string
70  {
71  if ($this->‪isUserLoginFailedAndLoginErrorActive($configuration->‪getModes(), $loginType)) {
72  return $this->redirectModeHandler->redirectModeLoginError($configuration->‪getPageOnLoginError());
73  }
74 
75  $redirectUrlList = [];
76  foreach ($configuration->‪getModes() as $redirectMode) {
77  $redirectUrl = '';
78 
79  if ($loginType === ‪LoginType::LOGIN) {
80  $redirectUrl = $this->‪handleSuccessfulLogin($redirectMode, $configuration->‪getPageOnLogin(), $configuration->‪getDomains(), $redirectModeReferrer);
81  } elseif ($loginType === ‪LoginType::LOGOUT) {
82  $redirectUrl = $this->‪handleSuccessfulLogout($redirectMode, $configuration->‪getPageOnLogout());
83  }
84 
85  if ($redirectUrl !== '') {
86  $redirectUrlList[] = $redirectUrl;
87  }
88  }
89 
90  return $this->‪fetchReturnUrlFromList($redirectUrlList, $configuration->‪getFirstMode());
91  }
92 
96  protected function ‪getLogoutRedirectUrl(array $redirectModes, int $redirectPageLogout = 0): string
97  {
98  if ($this->userIsLoggedIn && $this->‪isRedirectModeActive($redirectModes, ‪RedirectMode::LOGOUT)) {
99  return $this->redirectModeHandler->redirectModeLogout($redirectPageLogout);
100  }
101  return $this->‪getGetpostRedirectUrl($redirectModes);
102  }
103 
107  protected function ‪getGetpostRedirectUrl(array $redirectModes): string
108  {
109  return $this->‪isRedirectModeActive($redirectModes, ‪RedirectMode::GETPOST)
110  ? $this->requestHandler->getRedirectUrlRequestParam()
111  : '';
112  }
113 
117  protected function ‪handleSuccessfulLogout(string $redirectMode, int $redirectPageLogout): string
118  {
119  if ($redirectMode === ‪RedirectMode::LOGOUT) {
120  return $this->redirectModeHandler->redirectModeLogout($redirectPageLogout);
121  }
122  return '';
123  }
124 
128  protected function ‪fetchReturnUrlFromList(array $redirectUrlList, $redirectFirstMethod): string
129  {
130  if (count($redirectUrlList) === 0) {
131  return '';
132  }
133 
134  // Remove empty values, but keep "0" as value (that's why "strlen" is used as second parameter)
135  $redirectUrlList = array_filter($redirectUrlList, static function (string $value): bool {
136  return strlen($value) > 0;
137  });
138 
139  return $redirectFirstMethod
140  ? array_shift($redirectUrlList)
141  : array_pop($redirectUrlList);
142  }
143 
147  protected function ‪handleSuccessfulLogin(string $redirectMode, int $redirectPageLogin = 0, string $domains = '', string $redirectModeReferrer = ''): string
148  {
149  if (!$this->userIsLoggedIn) {
150  return '';
151  }
152 
153  // Logintype is needed because the login-page wouldn't be accessible anymore after a login (would always redirect)
154  switch ($redirectMode) {
156  $redirectUrl = $this->redirectModeHandler->redirectModeGroupLogin();
157  break;
159  $redirectUrl = $this->redirectModeHandler->redirectModeUserLogin();
160  break;
162  $redirectUrl = $this->redirectModeHandler->redirectModeLogin($redirectPageLogin);
163  break;
165  $redirectUrl = $this->requestHandler->getRedirectUrlRequestParam();
166  break;
168  $redirectUrl = $this->redirectModeHandler->redirectModeReferrer($redirectModeReferrer);
169  break;
171  $redirectUrl = $this->redirectModeHandler->redirectModeReferrerDomains($domains, $redirectModeReferrer);
172  break;
173  default:
174  $redirectUrl = '';
175  }
176 
177  return $redirectUrl;
178  }
179 
180  protected function ‪isUserLoginFailedAndLoginErrorActive(array $redirectModes, string $loginType): bool
181  {
182  return $loginType === ‪LoginType::LOGIN
183  && !$this->userIsLoggedIn
184  && $this->‪isRedirectModeActive($redirectModes, ‪RedirectMode::LOGIN_ERROR);
185  }
186 
187  protected function ‪isRedirectModeActive(array $redirectModes, string $mode): bool
188  {
189  return in_array($mode, $redirectModes, true);
190  }
191 
195  public function ‪getLoginFormRedirectUrl(‪RedirectConfiguration $configuration, bool $redirectDisabled): string
196  {
197  if (!$redirectDisabled) {
198  return $this->‪getGetpostRedirectUrl($configuration->‪getModes());
199  }
200  return '';
201  }
202 
214  public function ‪getReferrerForLoginForm(ServerRequestInterface $request, array $settings): string
215  {
216  // Early return, if redirectMode is not configured to respect the referrer
217  if (!$this->‪isReferrerRedirectEnabled($settings)) {
218  return '';
219  }
220 
221  $referrer = (string)(
222  $request->getParsedBody()['referer'] ??
223  $request->getQueryParams()['referer'] ??
224  $request->getServerParams()['HTTP_REFERER'] ??
225  ''
226  );
227 
228  // If the current request was initiated via sub-request, we use the URI of the original request as referrer
229  if ($originalRequest = $request->getAttribute('originalRequest', false)) {
230  $referrer = (string)$originalRequest->getUri();
231  }
232 
233  if ($this->redirectUrlValidator->isValid($referrer)) {
234  return $referrer;
235  }
236 
237  return '';
238  }
239 
243  protected function ‪isReferrerRedirectEnabled(array $settings): bool
244  {
246  $configuredRedirectModes = ‪GeneralUtility::trimExplode(',', $settings['redirectMode'] ?? '');
247  return count(array_intersect($configuredRedirectModes, $referrerRedirectModes)) > 0;
248  }
249 
253  public function ‪getLogoutFormRedirectUrl(‪RedirectConfiguration $configuration, int $redirectPageLogout, bool $redirectDisabled): string
254  {
255  if (!$redirectDisabled) {
256  return $this->‪getLogoutRedirectUrl($configuration->‪getModes(), $redirectPageLogout);
257  }
258  return $this->requestHandler->getRedirectUrlRequestParam();
259  }
260 }
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\isReferrerRedirectEnabled
‪isReferrerRedirectEnabled(array $settings)
Definition: RedirectHandler.php:239
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler
Definition: RedirectModeHandler.php:34
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:999
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\REFERRER
‪const REFERRER
Definition: RedirectMode.php:33
‪TYPO3\CMS\Core\Context\Context\getPropertyFromAspect
‪mixed null getPropertyFromAspect(string $name, string $property, $default=null)
Definition: Context.php:149
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\getLoginFormRedirectUrl
‪getLoginFormRedirectUrl(RedirectConfiguration $configuration, bool $redirectDisabled)
Definition: RedirectHandler.php:191
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\$redirectUrlValidator
‪RedirectUrlValidator $redirectUrlValidator
Definition: RedirectHandler.php:48
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\getGetpostRedirectUrl
‪getGetpostRedirectUrl(array $redirectModes)
Definition: RedirectHandler.php:103
‪TYPO3\CMS\FrontendLogin\Redirect\ServerRequestHandler
Definition: ServerRequestHandler.php:29
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration\getFirstMode
‪getFirstMode()
Definition: RedirectConfiguration.php:68
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\GETPOST
‪const GETPOST
Definition: RedirectMode.php:30
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration\getPageOnLoginError
‪getPageOnLoginError()
Definition: RedirectConfiguration.php:83
‪TYPO3\CMS\Core\Authentication\LoginType
Definition: LoginType.php:26
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration\getDomains
‪getDomains()
Definition: RedirectConfiguration.php:78
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\isUserLoginFailedAndLoginErrorActive
‪isUserLoginFailedAndLoginErrorActive(array $redirectModes, string $loginType)
Definition: RedirectHandler.php:176
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:53
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\__construct
‪__construct(ServerRequestHandler $requestHandler, RedirectModeHandler $redirectModeHandler, Context $context, RedirectUrlValidator $redirectUrlValidator)
Definition: RedirectHandler.php:50
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\processRedirect
‪processRedirect(string $loginType, RedirectConfiguration $configuration, string $redirectModeReferrer)
Definition: RedirectHandler.php:65
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\GROUP_LOGIN
‪const GROUP_LOGIN
Definition: RedirectMode.php:32
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\isRedirectModeActive
‪isRedirectModeActive(array $redirectModes, string $mode)
Definition: RedirectHandler.php:183
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration\getModes
‪getModes()
Definition: RedirectConfiguration.php:63
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\$redirectModeHandler
‪RedirectModeHandler $redirectModeHandler
Definition: RedirectHandler.php:44
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\getLogoutFormRedirectUrl
‪getLogoutFormRedirectUrl(RedirectConfiguration $configuration, int $redirectPageLogout, bool $redirectDisabled)
Definition: RedirectHandler.php:249
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\USER_LOGIN
‪const USER_LOGIN
Definition: RedirectMode.php:31
‪TYPO3\CMS\FrontendLogin\Redirect
Definition: RedirectHandler.php:18
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\handleSuccessfulLogout
‪handleSuccessfulLogout(string $redirectMode, int $redirectPageLogout)
Definition: RedirectHandler.php:113
‪TYPO3\CMS\Core\Authentication\LoginType\LOGOUT
‪const LOGOUT
Definition: LoginType.php:35
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\LOGOUT
‪const LOGOUT
Definition: RedirectMode.php:28
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\LOGIN
‪const LOGIN
Definition: RedirectMode.php:27
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\LOGIN_ERROR
‪const LOGIN_ERROR
Definition: RedirectMode.php:29
‪TYPO3\CMS\Core\Authentication\LoginType\LOGIN
‪const LOGIN
Definition: LoginType.php:30
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\$requestHandler
‪ServerRequestHandler $requestHandler
Definition: RedirectHandler.php:40
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\getReferrerForLoginForm
‪getReferrerForLoginForm(ServerRequestInterface $request, array $settings)
Definition: RedirectHandler.php:210
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\fetchReturnUrlFromList
‪fetchReturnUrlFromList(array $redirectUrlList, $redirectFirstMethod)
Definition: RedirectHandler.php:124
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration
Definition: RedirectConfiguration.php:28
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\REFERRER_DOMAINS
‪const REFERRER_DOMAINS
Definition: RedirectMode.php:34
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration\getPageOnLogout
‪getPageOnLogout()
Definition: RedirectConfiguration.php:88
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\handleSuccessfulLogin
‪handleSuccessfulLogin(string $redirectMode, int $redirectPageLogin=0, string $domains='', string $redirectModeReferrer='')
Definition: RedirectHandler.php:143
‪TYPO3\CMS\FrontendLogin\Validation\RedirectUrlValidator
Definition: RedirectUrlValidator.php:32
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\getLogoutRedirectUrl
‪getLogoutRedirectUrl(array $redirectModes, int $redirectPageLogout=0)
Definition: RedirectHandler.php:92
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler
Definition: RedirectHandler.php:33
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration\getPageOnLogin
‪getPageOnLogin()
Definition: RedirectConfiguration.php:73
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler\$userIsLoggedIn
‪bool $userIsLoggedIn
Definition: RedirectHandler.php:36