From ac629148b6ce0cc10ae7a85ab1af13d4c7410855 Mon Sep 17 00:00:00 2001 From: Torben Hansen <derhansen@gmail.com> Date: Thu, 22 Dec 2022 19:39:22 +0100 Subject: [PATCH] [BUGFIX] Respect HTTP_REFERER for felogin redirect mode 'referer' The `redirectMode=referer` configuration allows to process a redirect after a successful login to an evaluated referer value. For the legacy version of the felogin plugin, the referer value has been evaluated using the GET/POST parameter `referer` and the `HTTP_REFERER` as fallback. The extbase version of the felogin plugin currently only evaluates the GET/POST parameter `referer`. This patch adds the missing `HTTP_REFERER` fallback evaluation of the referer. Resolves: #91844 Releases: main, 11.5 Signed-off-by: Torben Hansen <derhansen@gmail.com> Change-Id: Id4119b0425ddca09a350f4d8d8a6ebb4d3b3135b Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77401 Tested-by: core-ci <typo3@b13.com> Tested-by: Oliver Hader <oliver.hader@typo3.org> Reviewed-by: Oliver Hader <oliver.hader@typo3.org> --- .../felogin/Classes/Redirect/RedirectModeHandler.php | 10 +++++++--- .../felogin/Classes/Redirect/ServerRequestHandler.php | 8 ++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/typo3/sysext/felogin/Classes/Redirect/RedirectModeHandler.php b/typo3/sysext/felogin/Classes/Redirect/RedirectModeHandler.php index bda8381803c8..c6496d15f250 100644 --- a/typo3/sysext/felogin/Classes/Redirect/RedirectModeHandler.php +++ b/typo3/sysext/felogin/Classes/Redirect/RedirectModeHandler.php @@ -141,7 +141,7 @@ class RedirectModeHandler $redirectUrl = ''; if ($redirectReferrer !== 'off') { // Avoid forced logout, when trying to login immediately after a logout - $redirectUrl = preg_replace('/[&?]logintype=[a-z]+/', '', $this->getRefererRequestParam()); + $redirectUrl = preg_replace('/[&?]logintype=[a-z]+/', '', $this->getReferer()); } return $redirectUrl ?? ''; @@ -163,7 +163,7 @@ class RedirectModeHandler // Thanks to plan2.net / Martin Kutschker for implementing this feature. // also avoid redirect when logging in after changing password if ($domains) { - $url = $this->getRefererRequestParam(); + $url = $this->getReferer(); // Is referring url allowed to redirect? $match = []; if (preg_match('#^http://([[:alnum:]._-]+)/#', $url, $match)) { @@ -222,10 +222,14 @@ class RedirectModeHandler return $this->uriBuilder->build(); } - protected function getRefererRequestParam(): string + protected function getReferer(): string { $referer = ''; $requestReferer = (string)$this->serverRequestHandler->getPropertyFromGetAndPost('referer'); + if ($requestReferer === '') { + $requestReferer = $this->serverRequestHandler->getHttpReferer(); + } + if ($this->redirectUrlValidator->isValid($requestReferer)) { $referer = $requestReferer; } diff --git a/typo3/sysext/felogin/Classes/Redirect/ServerRequestHandler.php b/typo3/sysext/felogin/Classes/Redirect/ServerRequestHandler.php index 497e3cbac5fe..b5a18d6adc00 100644 --- a/typo3/sysext/felogin/Classes/Redirect/ServerRequestHandler.php +++ b/typo3/sysext/felogin/Classes/Redirect/ServerRequestHandler.php @@ -59,6 +59,14 @@ class ServerRequestHandler )[$propertyName] ?? null; } + /** + * Returns the HTTP_REFERER from server request parameters if set + */ + public function getHttpReferer(): string + { + return $this->request->getServerParams()['HTTP_REFERER'] ?? ''; + } + /** * Returns validated redirect url contained in request param return_url or redirect_url */ -- GitLab