From cf2c3050e2b5b0d28ef3a302b8f6a93451c4fde4 Mon Sep 17 00:00:00 2001
From: Gerrit Mohrmann <mohrmann.t3@gmx.de>
Date: Tue, 14 Apr 2020 17:10:25 +0200
Subject: [PATCH] [BUGFIX] Move redirects in extbase felogin after the events

To fire the LoginConfirmedEvent and LogoutConfirmedEvent even when
redirects are active the redirect handling are moved after the events.

Resolves: #91023
Releases: master
Change-Id: I11fd2aba206edb68426039de7dbfa6e92d79c8a7
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64165
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Susanne Moog <look@susi.dev>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Jonas Eberle <flightvision@googlemail.com>
Reviewed-by: Guido Schmechel <guido.schmechel@brandung.de>
Reviewed-by: Susanne Moog <look@susi.dev>
Reviewed-by: Oliver Bartsch <bo@cedev.de>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../Classes/Controller/LoginController.php    | 26 +++++++++++++++----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/typo3/sysext/felogin/Classes/Controller/LoginController.php b/typo3/sysext/felogin/Classes/Controller/LoginController.php
index f3bb4368d348..dc35fd4cf959 100644
--- a/typo3/sysext/felogin/Classes/Controller/LoginController.php
+++ b/typo3/sysext/felogin/Classes/Controller/LoginController.php
@@ -63,6 +63,11 @@ class LoginController extends AbstractLoginFormController
      */
     protected $loginType = '';
 
+    /**
+     * @var string
+     */
+    protected $redirectUrl = '';
+
     /**
      * @var ServerRequestHandler
      */
@@ -120,15 +125,11 @@ class LoginController extends AbstractLoginFormController
                 return;
             }
 
-            $redirectUrl = $this->redirectHandler->processRedirect(
+            $this->redirectUrl = $this->redirectHandler->processRedirect(
                 $this->loginType,
                 $this->configuration,
                 $this->request->hasArgument('redirectReferrer') ? $this->request->getArgument('redirectReferrer') : ''
             );
-            if ($redirectUrl !== '') {
-                $this->eventDispatcher->dispatch(new BeforeRedirectEvent($this->loginType, $redirectUrl));
-                $this->redirectToUri($redirectUrl);
-            }
         }
     }
 
@@ -144,6 +145,7 @@ class LoginController extends AbstractLoginFormController
         }
 
         $this->handleLoginForwards();
+        $this->handleRedirect();
 
         $this->eventDispatcher->dispatch(new ModifyLoginFormViewEvent($this->view));
 
@@ -174,6 +176,7 @@ class LoginController extends AbstractLoginFormController
         }
 
         $this->eventDispatcher->dispatch(new LoginConfirmedEvent($this, $this->view));
+        $this->handleRedirect();
 
         $this->view->assignMultiple(
             [
@@ -190,6 +193,8 @@ class LoginController extends AbstractLoginFormController
      */
     public function logoutAction(int $redirectPageLogout = 0): void
     {
+        $this->handleRedirect();
+
         $this->view->assignMultiple(
             [
                 'cookieWarning' => $this->showCookieWarning,
@@ -201,6 +206,17 @@ class LoginController extends AbstractLoginFormController
         );
     }
 
+    /**
+     * Handles the redirect when $this->redirectUrl is not empty
+     */
+    protected function handleRedirect(): void
+    {
+        if ($this->redirectUrl !== '') {
+            $this->eventDispatcher->dispatch(new BeforeRedirectEvent($this->loginType, $this->redirectUrl));
+            $this->redirectToUri($this->redirectUrl);
+        }
+    }
+
     /**
      * Handle forwards to overview and logout actions from login action
      */
-- 
GitLab