Skip to content

Commit 0cd77d2

Browse files
jasonvargaclaude
andcommitted
Stash intended URL in session for 2FA setup middleware
The frontend RedirectIfTwoFactorSetupIncomplete middleware previously threaded the original URL through a referer query string, but the TwoFactorSetupController had been switched to read url.intended from the session — leaving the query string dead and dropping the original URL for already-authenticated users bounced into setup. Both middlewares now stash the URL via setIntendedUrl, and the CP setup controller reads it back via getIntendedUrl, keeping CP and frontend on the same mechanism. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e46bd7e commit 0cd77d2

5 files changed

Lines changed: 23 additions & 26 deletions

File tree

src/Http/Controllers/CP/Auth/TwoFactorSetupController.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ public function __construct(Request $request)
1616
protected function redirectPath()
1717
{
1818
$cp = cp_route('index');
19-
$referer = request('referer');
20-
$referredFromCp = Str::startsWith($referer, $cp) && ! Str::startsWith($referer, $cp.'/auth/');
19+
$intended = redirect()->getIntendedUrl();
20+
$isCpUrl = $intended && Str::startsWith($intended, $cp) && ! Str::startsWith($intended, $cp.'/auth/');
2121

22-
return $referredFromCp ? $referer : $cp;
22+
return $isCpUrl ? $intended : $cp;
2323
}
2424

2525
protected function routes($user): array

src/Http/Middleware/CP/RedirectIfTwoFactorSetupIncomplete.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace Statamic\Http\Middleware\CP;
44

5-
use Illuminate\Http\Request;
65
use Statamic\Http\Middleware\RedirectIfTwoFactorSetupIncomplete as Middleware;
76

87
class RedirectIfTwoFactorSetupIncomplete extends Middleware
@@ -12,10 +11,8 @@ protected function redirectRoute(): string
1211
return 'statamic.cp.two-factor-setup';
1312
}
1413

15-
protected function redirectUrl(Request $request): string
14+
protected function redirectUrl(): string
1615
{
17-
return route($this->redirectRoute(), [
18-
'referer' => $request->fullUrl(),
19-
]);
16+
return route($this->redirectRoute());
2017
}
2118
}

src/Http/Middleware/RedirectIfTwoFactorSetupIncomplete.php

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ public function handle(Request $request, Closure $next)
2323
app(EnableTwoFactorAuthentication::class)($user);
2424
}
2525

26-
return redirect($this->redirectUrl($request));
26+
redirect()->setIntendedUrl($request->fullUrl());
27+
28+
return redirect($this->redirectUrl());
2729
}
2830

2931
return $next($request);
@@ -41,15 +43,9 @@ protected function isSetupUrl(Request $request): bool
4143
return $currentPath === $customPath;
4244
}
4345

44-
protected function redirectUrl(Request $request): string
46+
protected function redirectUrl(): string
4547
{
46-
if ($url = config('statamic.users.two_factor_setup_url')) {
47-
return $url;
48-
}
49-
50-
return route($this->redirectRoute(), [
51-
'referer' => $request->fullUrl(),
52-
]);
48+
return config('statamic.users.two_factor_setup_url') ?? route($this->redirectRoute());
5349
}
5450

5551
protected function redirectRoute(): string

tests/Feature/Users/TwoFactorRoutesTest.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ public function cp_two_factor_setup_middleware_redirects_when_two_factor_is_enfo
6363
$this
6464
->actingAs($user)
6565
->get(cp_route('dashboard'))
66-
->assertRedirect(cp_route('two-factor-setup', ['referer' => cp_route('dashboard')]));
66+
->assertRedirect(cp_route('two-factor-setup'))
67+
->assertSessionHas('url.intended', cp_route('dashboard'));
6768
}
6869

6970
#[Test]
@@ -93,7 +94,8 @@ public function cp_two_factor_setup_middleware_ignores_frontend_setup_url_config
9394
$this
9495
->actingAs($user)
9596
->get(cp_route('dashboard'))
96-
->assertRedirect(cp_route('two-factor-setup', ['referer' => cp_route('dashboard')]));
97+
->assertRedirect(cp_route('two-factor-setup'))
98+
->assertSessionHas('url.intended', cp_route('dashboard'));
9799
}
98100

99101
#[Test]
@@ -106,7 +108,8 @@ public function frontend_two_factor_setup_middleware_redirects_when_two_factor_i
106108
$this
107109
->actingAs($user)
108110
->get('/test-frontend-route')
109-
->assertRedirect(route('statamic.two-factor-setup', ['referer' => url('/test-frontend-route')]));
111+
->assertRedirect(route('statamic.two-factor-setup'))
112+
->assertSessionHas('url.intended', url('/test-frontend-route'));
110113
}
111114

112115
#[Test]
@@ -121,7 +124,8 @@ public function frontend_two_factor_setup_middleware_generates_secret_when_none_
121124
$this
122125
->actingAs($user)
123126
->get('/test-frontend-route')
124-
->assertRedirect(route('statamic.two-factor-setup', ['referer' => url('/test-frontend-route')]));
127+
->assertRedirect(route('statamic.two-factor-setup'))
128+
->assertSessionHas('url.intended', url('/test-frontend-route'));
125129

126130
$this->assertNotNull($user->fresh()->two_factor_secret);
127131
}
@@ -138,7 +142,8 @@ public function frontend_two_factor_setup_middleware_does_not_regenerate_existin
138142
$this
139143
->actingAs($user)
140144
->get('/test-frontend-route')
141-
->assertRedirect(route('statamic.two-factor-setup', ['referer' => url('/test-frontend-route')]));
145+
->assertRedirect(route('statamic.two-factor-setup'))
146+
->assertSessionHas('url.intended', url('/test-frontend-route'));
142147

143148
$this->assertEquals($existing, $user->fresh()->two_factor_secret);
144149
}

tests/Feature/Users/TwoFactorSetupTest.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,12 @@ public function it_redirects_to_the_dashboard_if_the_user_is_already_set_up()
3535
}
3636

3737
#[Test]
38-
public function redirect_url_is_referer()
38+
public function redirect_url_is_intended_url()
3939
{
4040
$this
4141
->actingAs($this->user())
42-
->get(cp_route('two-factor-setup', [
43-
'referer' => 'http://localhost/cp/collections',
44-
]))
42+
->withSession(['url.intended' => 'http://localhost/cp/collections'])
43+
->get(cp_route('two-factor-setup'))
4544
->assertInertia(fn ($page) => $page->where('redirect', 'http://localhost/cp/collections'));
4645
}
4746

0 commit comments

Comments
 (0)