From 3e45e21862b4c69425506bb898e001ef06f021e8 Mon Sep 17 00:00:00 2001
From: Benni Mack <benni@typo3.org>
Date: Wed, 15 Mar 2023 23:32:54 +0100
Subject: [PATCH] [BUGFIX] Allow to modify redirectUrl via PSR-14 event in
 EXT:felogin

The "BeforeRedirectEvent" in EXT:felogin did not
allow to modify the actual redirectUrl,
which is now modified, as the Event was not
as powerful.

Resolves: #96813
Releases: main, 11.5
Change-Id: I5716c9a3f8d58cd019dca5e3e9d47a242c9ec45e
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/78059
Tested-by: core-ci <typo3@b13.com>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
---
 .../Classes/Controller/LoginController.php    |  7 ++++--
 .../Classes/Event/BeforeRedirectEvent.php     | 24 +++++++++++++++++--
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/typo3/sysext/felogin/Classes/Controller/LoginController.php b/typo3/sysext/felogin/Classes/Controller/LoginController.php
index b8481a3b634f..941ab8f97b63 100644
--- a/typo3/sysext/felogin/Classes/Controller/LoginController.php
+++ b/typo3/sysext/felogin/Classes/Controller/LoginController.php
@@ -251,8 +251,11 @@ class LoginController extends AbstractLoginFormController
     protected function handleRedirect(): void
     {
         if ($this->redirectUrl !== '') {
-            $this->eventDispatcher->dispatch(new BeforeRedirectEvent($this->loginType, $this->redirectUrl));
-            $this->redirectToUri($this->redirectUrl);
+            $event = new BeforeRedirectEvent($this->loginType, $this->redirectUrl, $this->request);
+            $this->eventDispatcher->dispatch($event);
+            if ($event->getRedirectUrl() !== '') {
+                $this->redirectToUri($event->getRedirectUrl());
+            }
         }
     }
 
diff --git a/typo3/sysext/felogin/Classes/Event/BeforeRedirectEvent.php b/typo3/sysext/felogin/Classes/Event/BeforeRedirectEvent.php
index d12c2927ffd9..bfa5151cb6e2 100644
--- a/typo3/sysext/felogin/Classes/Event/BeforeRedirectEvent.php
+++ b/typo3/sysext/felogin/Classes/Event/BeforeRedirectEvent.php
@@ -17,8 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\FrontendLogin\Event;
 
+use Psr\Http\Message\ServerRequestInterface;
+
 /**
- * Notification before a redirect is made.
+ * Notification before a redirect is made, which also allows to modify
+ * the actual redirect URL. Setting the redirect to an empty string
+ * will avoid triggering a redirect.
  */
 final class BeforeRedirectEvent
 {
@@ -32,10 +36,16 @@ final class BeforeRedirectEvent
      */
     private $redirectUrl;
 
-    public function __construct(string $loginType, string $redirectUrl)
+    /**
+     * @var ServerRequestInterface
+     */
+    private $request;
+
+    public function __construct(string $loginType, string $redirectUrl, $request)
     {
         $this->loginType = $loginType;
         $this->redirectUrl = $redirectUrl;
+        $this->request = $request;
     }
 
     public function getLoginType(): string
@@ -47,4 +57,14 @@ final class BeforeRedirectEvent
     {
         return $this->redirectUrl;
     }
+
+    public function setRedirectUrl(string $redirectUrl): void
+    {
+        $this->redirectUrl = $redirectUrl;
+    }
+
+    public function getRequest()
+    {
+        return $this->request;
+    }
 }
-- 
GitLab