‪TYPO3CMS  10.4
RedirectModeHandler.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 
27 
34 {
38  protected ‪$redirectUrlValidator;
39 
43  protected ‪$uriBuilder;
44 
48  protected ‪$serverRequestHandler;
49 
53  private ‪$userService;
54 
59 
64 
65  public function ‪__construct(
71  ) {
72  $this->uriBuilder = ‪$uriBuilder;
73  $this->redirectUrlValidator = GeneralUtility::makeInstance(
74  RedirectUrlValidator::class,
75  GeneralUtility::makeInstance(SiteFinder::class)
76  );
77  $this->serverRequestHandler = ‪$serverRequestHandler;
78  $this->userService = ‪$userService;
79  $this->frontendUserRepository = ‪$frontendUserRepository;
80  $this->frontendUserGroupRepository = ‪$frontendUserGroupRepository;
81  }
82 
88  public function ‪redirectModeGroupLogin(): string
89  {
90  // taken from dkd_redirect_at_login written by Ingmar Schlecht; database-field changed
91  $groupData = $this->userService->getFeUserGroupData();
92 
93  $groupUids = array_unique(array_map('intval', $groupData['uid']));
94  if (empty($groupData['uid'])) {
95  return '';
96  }
97 
98  // take the first group with a redirect page
99  foreach ($groupUids as $groupUid) {
100  $redirectPageId = (int)$this->frontendUserGroupRepository
101  ->findRedirectPageIdByGroupId($groupUid);
102  if ($redirectPageId > 0) {
103  return $this->‪buildUriForPageUid($redirectPageId);
104  }
105  }
106  return '';
107  }
108 
114  public function ‪redirectModeUserLogin(): string
115  {
116  $redirectPageId = $this->frontendUserRepository->findRedirectIdPageByUserId(
117  $this->userService->getFeUserData()['uid']
118  );
119 
120  if ($redirectPageId === null) {
121  return '';
122  }
123 
124  return $this->‪buildUriForPageUid($redirectPageId);
125  }
126 
133  public function ‪redirectModeLogin(int $redirectPageLogin): string
134  {
135  $redirectUrl = '';
136  if ($redirectPageLogin !== 0) {
137  $redirectUrl = $this->‪buildUriForPageUid($redirectPageLogin);
138  }
139 
140  return $redirectUrl;
141  }
142 
149  public function ‪redirectModeReferrer(string $redirectReferrer): string
150  {
151  $redirectUrl = '';
152  if ($redirectReferrer !== 'off') {
153  // Avoid forced logout, when trying to login immediately after a logout
154  $redirectUrl = preg_replace('/[&?]logintype=[a-z]+/', '', $this->‪getRefererRequestParam());
155  }
156 
157  return $redirectUrl ?? '';
158  }
159 
167  public function ‪redirectModeRefererDomains(string $domains, string $redirectReferrer): string
168  {
169  $redirectUrl = '';
170  if ($redirectReferrer !== '') {
171  return '';
172  }
173 
174  // Auto redirect.
175  // Feature to redirect to the page where the user came from (HTTP_REFERER).
176  // Allowed domains to redirect to, can be configured with plugin.tx_felogin_login.domains
177  // Thanks to plan2.net / Martin Kutschker for implementing this feature.
178  // also avoid redirect when logging in after changing password
179  if ($domains) {
180  $url = $this->‪getRefererRequestParam();
181  // Is referring url allowed to redirect?
182  $match = [];
183  if (preg_match('#^http://([[:alnum:]._-]+)/#', $url, $match)) {
184  $redirectDomain = $match[1];
185  $found = false;
186  foreach (‪GeneralUtility::trimExplode(',', $domains, true) as $domain) {
187  if (preg_match('/(?:^|\\.)' . $domain . '$/', $redirectDomain)) {
188  $found = true;
189  break;
190  }
191  }
192  if (!$found) {
193  $url = '';
194  }
195  }
196  // Avoid forced logout, when trying to login immediately after a logout
197  if ($url) {
198  $redirectUrl = preg_replace('/[&?]logintype=[a-z]+/', '', $url);
199  }
200  }
201 
202  return $redirectUrl ?? '';
203  }
204 
211  public function ‪redirectModeLoginError(int $redirectPageLoginError = 0): string
212  {
213  $redirectUrl = '';
214  if ($redirectPageLoginError > 0) {
215  $redirectUrl = $this->‪buildUriForPageUid($redirectPageLoginError);
216  }
217 
218  return $redirectUrl;
219  }
220 
227  public function ‪redirectModeLogout(int $redirectPageLogout): string
228  {
229  $redirectUrl = '';
230  if ($redirectPageLogout > 0) {
231  $redirectUrl = $this->‪buildUriForPageUid($redirectPageLogout);
232  }
233 
234  return $redirectUrl;
235  }
236 
237  protected function ‪buildUriForPageUid(int $pageUid): string
238  {
239  $this->uriBuilder->reset();
240  $this->uriBuilder->setTargetPageUid($pageUid);
241 
242  return $this->uriBuilder->build();
243  }
244 
245  protected function ‪getRefererRequestParam(): string
246  {
247  $referer = '';
248  $requestReferer = (string)$this->serverRequestHandler->getPropertyFromGetAndPost('referer');
249  if ($this->redirectUrlValidator->isValid($requestReferer)) {
250  $referer = $requestReferer;
251  }
252 
253  return $referer;
254  }
255 }
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler
Definition: RedirectModeHandler.php:34
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\redirectModeGroupLogin
‪string redirectModeGroupLogin()
Definition: RedirectModeHandler.php:82
‪TYPO3\CMS\FrontendLogin\Domain\Repository\FrontendUserRepository
Definition: FrontendUserRepository.php:31
‪TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder
Definition: UriBuilder.php:39
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\$frontendUserGroupRepository
‪FrontendUserGroupRepository $frontendUserGroupRepository
Definition: RedirectModeHandler.php:57
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\redirectModeUserLogin
‪string redirectModeUserLogin()
Definition: RedirectModeHandler.php:108
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\redirectModeLogin
‪string redirectModeLogin(int $redirectPageLogin)
Definition: RedirectModeHandler.php:127
‪TYPO3\CMS\FrontendLogin\Redirect\ServerRequestHandler
Definition: ServerRequestHandler.php:29
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\redirectModeReferrer
‪string redirectModeReferrer(string $redirectReferrer)
Definition: RedirectModeHandler.php:143
‪TYPO3\CMS\Core\Site\SiteFinder
Definition: SiteFinder.php:31
‪TYPO3\CMS\FrontendLogin\Service\UserService
Definition: UserService.php:26
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\redirectModeRefererDomains
‪string redirectModeRefererDomains(string $domains, string $redirectReferrer)
Definition: RedirectModeHandler.php:161
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\redirectModeLoginError
‪string redirectModeLoginError(int $redirectPageLoginError=0)
Definition: RedirectModeHandler.php:205
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\buildUriForPageUid
‪buildUriForPageUid(int $pageUid)
Definition: RedirectModeHandler.php:231
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\$userService
‪UserService $userService
Definition: RedirectModeHandler.php:49
‪TYPO3\CMS\FrontendLogin\Redirect
Definition: RedirectHandler.php:18
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static string[] trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:1059
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\redirectModeLogout
‪string redirectModeLogout(int $redirectPageLogout)
Definition: RedirectModeHandler.php:221
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\$redirectUrlValidator
‪RedirectUrlValidator $redirectUrlValidator
Definition: RedirectModeHandler.php:37
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\getRefererRequestParam
‪getRefererRequestParam()
Definition: RedirectModeHandler.php:239
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\$frontendUserRepository
‪FrontendUserRepository $frontendUserRepository
Definition: RedirectModeHandler.php:53
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\$serverRequestHandler
‪ServerRequestHandler $serverRequestHandler
Definition: RedirectModeHandler.php:45
‪TYPO3\CMS\FrontendLogin\Validation\RedirectUrlValidator
Definition: RedirectUrlValidator.php:32
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\$uriBuilder
‪UriBuilder $uriBuilder
Definition: RedirectModeHandler.php:41
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:46
‪TYPO3\CMS\FrontendLogin\Domain\Repository\FrontendUserGroupRepository
Definition: FrontendUserGroupRepository.php:29
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler\__construct
‪__construct(UriBuilder $uriBuilder, ServerRequestHandler $serverRequestHandler, UserService $userService, FrontendUserRepository $frontendUserRepository, FrontendUserGroupRepository $frontendUserGroupRepository)
Definition: RedirectModeHandler.php:59