From 8d52092a428eddf138043197f0e1e90330a7f00b Mon Sep 17 00:00:00 2001
From: Torben Hansen <derhansen@gmail.com>
Date: Sun, 19 Mar 2023 18:59:36 +0100
Subject: [PATCH] [TASK] Optimize referer evaluation in ext:felogin

The redirect evaluation is currently always processed no matter if
a `redirectMode` based on the referer is configured or not. Also, given
referers are checked for validity using `RedirectUrlValidator`, which
logs a message in the TYPO3 log with the log level `warning` if the given
URL is considered as invalid.

This patch adds a check to the referer evaluation, so it is only processed,
if a redirect mode supporting the referer is active. Additionally, the log
level for invalid redirect URLs in `RedirectUrlValidator` is changed to
`debug`, since a warning is not appropriate for invalid redirect URLs.

Resolves: #100197
Releases: main, 11.5
Signed-off-by: Torben Hansen <derhansen@gmail.com>
Change-Id: I10d1723de131e0387f7dd2103c8a1ca21ed015e5
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/78733
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: core-ci <typo3@b13.com>
Tested-by: Benni Mack <benni@typo3.org>
---
 .../Classes/Controller/LoginController.php       | 16 ++++++++++++++++
 .../Classes/Validation/RedirectUrlValidator.php  |  2 +-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/typo3/sysext/felogin/Classes/Controller/LoginController.php b/typo3/sysext/felogin/Classes/Controller/LoginController.php
index 941ab8f97b63..64ba1d194ec3 100644
--- a/typo3/sysext/felogin/Classes/Controller/LoginController.php
+++ b/typo3/sysext/felogin/Classes/Controller/LoginController.php
@@ -31,6 +31,7 @@ use TYPO3\CMS\FrontendLogin\Event\LoginErrorOccurredEvent;
 use TYPO3\CMS\FrontendLogin\Event\LogoutConfirmedEvent;
 use TYPO3\CMS\FrontendLogin\Event\ModifyLoginFormViewEvent;
 use TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler;
+use TYPO3\CMS\FrontendLogin\Redirect\RedirectMode;
 use TYPO3\CMS\FrontendLogin\Redirect\ServerRequestHandler;
 use TYPO3\CMS\FrontendLogin\Service\UserService;
 use TYPO3\CMS\FrontendLogin\Validation\RedirectUrlValidator;
@@ -231,6 +232,11 @@ class LoginController extends AbstractLoginFormController
      */
     protected function getRefererForLoginForm(): string
     {
+        // Early return, if redirectMode is not configured to respect the referer
+        if (!$this->isRefererRedirectEnabled()) {
+            return '';
+        }
+
         $referer = (string)(
             $this->request->getParsedBody()['referer'] ??
             $this->request->getQueryParams()['referer'] ??
@@ -293,6 +299,16 @@ class LoginController extends AbstractLoginFormController
                || $GLOBALS['TYPO3_CONF_VARS']['FE']['lifetime'] === 0;
     }
 
+    /**
+     * Returns, if redirect based on the referer is enabled
+     */
+    protected function isRefererRedirectEnabled(): bool
+    {
+        $refererRedirectModes = [RedirectMode::REFERER, RedirectMode::REFERER_DOMAINS];
+        $configuredRedirectModes = GeneralUtility::trimExplode(',', $this->settings['redirectMode'] ?? '');
+        return count(array_intersect($configuredRedirectModes, $refererRedirectModes)) > 0;
+    }
+
     /**
      * Redirect to overview on login successful and setting showLogoutFormAfterLogin disabled
      */
diff --git a/typo3/sysext/felogin/Classes/Validation/RedirectUrlValidator.php b/typo3/sysext/felogin/Classes/Validation/RedirectUrlValidator.php
index 83e04cef3584..311bbe87e45c 100644
--- a/typo3/sysext/felogin/Classes/Validation/RedirectUrlValidator.php
+++ b/typo3/sysext/felogin/Classes/Validation/RedirectUrlValidator.php
@@ -55,7 +55,7 @@ class RedirectUrlValidator implements LoggerAwareInterface
             return true;
         }
         // URL is not allowed
-        $this->logger->warning('Url "{url}" was not accepted.', ['url' => $value]);
+        $this->logger->debug('Url "{url}" was not accepted.', ['url' => $value]);
         return false;
     }
 
-- 
GitLab