diff options
author | Christoph Wurst <christoph@winzerhof-wurst.at> | 2024-04-09 08:12:21 +0200 |
---|---|---|
committer | backportbot[bot] <backportbot[bot]@users.noreply.github.com> | 2024-04-23 07:35:46 +0000 |
commit | c3e269d01e02553483377a8ffaca9c36b93df47a (patch) | |
tree | 2b6475ba7f4d85b4b3746cab92a8712cd6bec5dd | |
parent | e4147017717c2df9d4679e008f1483528fec81a2 (diff) | |
download | nextcloud-server-backport/44745/stable27.tar.gz nextcloud-server-backport/44745/stable27.zip |
fix(auth): Keep redirect URL during 2FA setup and challengebackport/44745/stable27
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
[skip ci]
-rw-r--r-- | core/Controller/TwoFactorChallengeController.php | 3 | ||||
-rw-r--r-- | core/Middleware/TwoFactorMiddleware.php | 6 | ||||
-rw-r--r-- | core/templates/twofactorsetupselection.php | 1 | ||||
-rw-r--r-- | tests/Core/Controller/TwoFactorChallengeControllerTest.php | 9 |
4 files changed, 14 insertions, 5 deletions
diff --git a/core/Controller/TwoFactorChallengeController.php b/core/Controller/TwoFactorChallengeController.php index 7a57d5eeb1a..f1deba36264 100644 --- a/core/Controller/TwoFactorChallengeController.php +++ b/core/Controller/TwoFactorChallengeController.php @@ -216,6 +216,7 @@ class TwoFactorChallengeController extends Controller { $data = [ 'providers' => $setupProviders, 'logout_url' => $this->getLogoutUrl(), + 'redirect_url' => $redirect_url, ]; return new StandaloneTemplateResponse($this->appName, 'twofactorsetupselection', $data, 'guest'); @@ -246,6 +247,7 @@ class TwoFactorChallengeController extends Controller { $data = [ 'provider' => $provider, 'logout_url' => $this->getLogoutUrl(), + 'redirect_url' => $redirect_url, 'template' => $tmpl->fetchPage(), ]; $response = new StandaloneTemplateResponse($this->appName, 'twofactorsetupchallenge', $data, 'guest'); @@ -263,6 +265,7 @@ class TwoFactorChallengeController extends Controller { 'core.TwoFactorChallenge.showChallenge', [ 'challengeProviderId' => $providerId, + 'redirect_url' => $redirect_url, ] )); } diff --git a/core/Middleware/TwoFactorMiddleware.php b/core/Middleware/TwoFactorMiddleware.php index ca0df9d6ab9..cba803f1adc 100644 --- a/core/Middleware/TwoFactorMiddleware.php +++ b/core/Middleware/TwoFactorMiddleware.php @@ -157,8 +157,10 @@ class TwoFactorMiddleware extends Middleware { public function afterException($controller, $methodName, Exception $exception) { if ($exception instanceof TwoFactorAuthRequiredException) { - $params = []; - if (isset($this->request->server['REQUEST_URI'])) { + $params = [ + 'redirect_url' => $this->request->getParam('redirect_url'), + ]; + if (!isset($params['redirect_url']) && isset($this->request->server['REQUEST_URI'])) { $params['redirect_url'] = $this->request->server['REQUEST_URI']; } return new RedirectResponse($this->urlGenerator->linkToRoute('core.TwoFactorChallenge.selectChallenge', $params)); diff --git a/core/templates/twofactorsetupselection.php b/core/templates/twofactorsetupselection.php index 4ef19d86349..fb8db49cf17 100644 --- a/core/templates/twofactorsetupselection.php +++ b/core/templates/twofactorsetupselection.php @@ -33,6 +33,7 @@ declare(strict_types=1); href="<?php p(\OC::$server->getURLGenerator()->linkToRoute('core.TwoFactorChallenge.setupProvider', [ 'providerId' => $provider->getId(), + 'redirect_url' => $_['redirect_url'], ] )) ?>"> <?php diff --git a/tests/Core/Controller/TwoFactorChallengeControllerTest.php b/tests/Core/Controller/TwoFactorChallengeControllerTest.php index baf7feaa068..c937b925997 100644 --- a/tests/Core/Controller/TwoFactorChallengeControllerTest.php +++ b/tests/Core/Controller/TwoFactorChallengeControllerTest.php @@ -337,7 +337,7 @@ class TwoFactorChallengeControllerTest extends TestCase { $this->assertEquals($expected, $this->controller->solveChallenge('myprovider', 'token', '/url')); } - public function testSetUpProviders() { + public function testSetUpProviders(): void { $user = $this->createMock(IUser::class); $this->userSession->expects($this->once()) ->method('getUser') @@ -357,6 +357,7 @@ class TwoFactorChallengeControllerTest extends TestCase { $provider, ], 'logout_url' => 'logoutAttribute', + 'redirect_url' => null, ], 'guest' ); @@ -392,7 +393,7 @@ class TwoFactorChallengeControllerTest extends TestCase { $this->assertEquals($expected, $response); } - public function testSetUpProvider() { + public function testSetUpProvider(): void { $user = $this->createMock(IUser::class); $this->userSession->expects($this->once()) ->method('getUser') @@ -426,6 +427,7 @@ class TwoFactorChallengeControllerTest extends TestCase { 'provider' => $provider, 'logout_url' => 'logoutAttribute', 'template' => 'tmpl', + 'redirect_url' => null, ], 'guest' ); @@ -435,13 +437,14 @@ class TwoFactorChallengeControllerTest extends TestCase { $this->assertEquals($expected, $response); } - public function testConfirmProviderSetup() { + public function testConfirmProviderSetup(): void { $this->urlGenerator->expects($this->once()) ->method('linkToRoute') ->with( 'core.TwoFactorChallenge.showChallenge', [ 'challengeProviderId' => 'totp', + 'redirect_url' => null, ]) ->willReturn('2fa/select/page'); $expected = new RedirectResponse('2fa/select/page'); |