Skip to content

Commit 2f56836

Browse files
jasonvargaclaude
andcommitted
Skip registering elevated session routes when disabled
Also exposes the flag to JS so the requireElevatedSession helper short-circuits before hitting the (now absent) status endpoint. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 72d3457 commit 2f56836

5 files changed

Lines changed: 73 additions & 11 deletions

File tree

resources/js/components/elevated-sessions/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import axios from 'axios';
22

33
export async function requireElevatedSession() {
4+
if (!Statamic.$config.get('elevatedSessionEnabled')) return;
5+
46
const response = await axios.get(cp_url('elevated-session'));
57

68
if (response.data.elevated) return;

routes/cp.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -443,11 +443,13 @@
443443

444444
Route::get('session-timeout', SessionTimeoutController::class)->name('session.timeout');
445445

446-
Route::get('auth/confirm-password', [ElevatedSessionController::class, 'showForm'])->name('confirm-password');
447-
Route::get('elevated-session', [ElevatedSessionController::class, 'status'])->name('elevated-session.status');
448-
Route::get('elevated-session/passkey-options', [ElevatedSessionController::class, 'options'])->name('elevated-session.passkey-options')->middleware('throttle:statamic.cp.passkeys');
449-
Route::post('elevated-session', [ElevatedSessionController::class, 'confirm'])->name('elevated-session.confirm')->middleware('throttle:statamic.cp.auth');
450-
Route::get('elevated-session/resend-code', [ElevatedSessionController::class, 'resendCode'])->name('elevated-session.resend-code')->middleware('throttle:send-elevated-session-code');
446+
if (config('statamic.users.elevated_session_enabled')) {
447+
Route::get('auth/confirm-password', [ElevatedSessionController::class, 'showForm'])->name('confirm-password');
448+
Route::get('elevated-session', [ElevatedSessionController::class, 'status'])->name('elevated-session.status');
449+
Route::get('elevated-session/passkey-options', [ElevatedSessionController::class, 'options'])->name('elevated-session.passkey-options')->middleware('throttle:statamic.cp.passkeys');
450+
Route::post('elevated-session', [ElevatedSessionController::class, 'confirm'])->name('elevated-session.confirm')->middleware('throttle:statamic.cp.auth');
451+
Route::get('elevated-session/resend-code', [ElevatedSessionController::class, 'resendCode'])->name('elevated-session.resend-code')->middleware('throttle:send-elevated-session-code');
452+
}
451453

452454
Route::get('playground', PlaygroundController::class)->name('playground');
453455

routes/web.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@
5454
Route::get('password/reset/{token}', [ResetPasswordController::class, 'showResetForm'])->name('password.reset');
5555
Route::post('password/reset', [ResetPasswordController::class, 'reset'])->middleware('throttle:statamic.auth')->name('password.reset.action');
5656

57-
Route::middleware('auth')->group(function () {
58-
Route::get('confirm-password', [ElevatedSessionController::class, 'showForm'])->name('elevated-session')->middleware([HandleInertiaRequests::class]);
59-
Route::post('elevated-session', [ElevatedSessionController::class, 'confirm'])->name('elevated-session.confirm')->middleware('throttle:statamic.auth');
60-
Route::get('elevated-session/passkey-options', [ElevatedSessionController::class, 'options'])->name('elevated-session.passkey-options')->middleware('throttle:statamic.passkeys');
61-
Route::get('elevated-session/resend-code', [ElevatedSessionController::class, 'resendCode'])->name('elevated-session.resend-code')->middleware('throttle:send-elevated-session-code');
62-
});
57+
if (config('statamic.users.elevated_session_enabled')) {
58+
Route::middleware('auth')->group(function () {
59+
Route::get('confirm-password', [ElevatedSessionController::class, 'showForm'])->name('elevated-session')->middleware([HandleInertiaRequests::class]);
60+
Route::post('elevated-session', [ElevatedSessionController::class, 'confirm'])->name('elevated-session.confirm')->middleware('throttle:statamic.auth');
61+
Route::get('elevated-session/passkey-options', [ElevatedSessionController::class, 'options'])->name('elevated-session.passkey-options')->middleware('throttle:statamic.passkeys');
62+
Route::get('elevated-session/resend-code', [ElevatedSessionController::class, 'resendCode'])->name('elevated-session.resend-code')->middleware('throttle:send-elevated-session-code');
63+
});
64+
}
6365

6466
Route::group(['prefix' => 'passkeys'], function () {
6567
Route::middleware('throttle:statamic.passkeys')->group(function () {

src/Http/View/Composers/JavascriptComposer.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ private function protectedVariables()
6464
'ajaxTimeout' => config('statamic.system.ajax_timeout'),
6565
'googleDocsViewer' => config('statamic.assets.google_docs_viewer'),
6666
'focalPointEditorEnabled' => config('statamic.assets.focal_point_editor'),
67+
'elevatedSessionEnabled' => config('statamic.users.elevated_session_enabled'),
6768
'user' => $this->user($user),
6869
'defaultPreferences' => Preference::default()->all(),
6970
'paginationSize' => config('statamic.cp.pagination_size'),
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace Tests\Auth;
4+
5+
use PHPUnit\Framework\Attributes\Group;
6+
use PHPUnit\Framework\Attributes\Test;
7+
use Statamic\Facades\User;
8+
use Tests\PreventSavingStacheItemsToDisk;
9+
use Tests\TestCase;
10+
11+
#[Group('elevated-session')]
12+
class ElevatedSessionDisabledTest extends TestCase
13+
{
14+
use PreventSavingStacheItemsToDisk;
15+
16+
private $user;
17+
18+
protected function setUp(): void
19+
{
20+
parent::setUp();
21+
22+
$this->user = User::make()->email('foo@bar.com')->makeSuper()->password('secret');
23+
$this->user->save();
24+
}
25+
26+
protected function getEnvironmentSetUp($app)
27+
{
28+
parent::getEnvironmentSetUp($app);
29+
30+
$app['config']->set('statamic.users.elevated_session_enabled', false);
31+
}
32+
33+
#[Test]
34+
public function cp_elevated_session_routes_are_not_registered()
35+
{
36+
$this->actingAs($this->user);
37+
38+
$this->get('/cp/elevated-session')->assertNotFound();
39+
$this->get('/cp/elevated-session/passkey-options')->assertNotFound();
40+
$this->post('/cp/elevated-session')->assertNotFound();
41+
$this->get('/cp/elevated-session/resend-code')->assertNotFound();
42+
$this->get('/cp/auth/confirm-password')->assertNotFound();
43+
}
44+
45+
#[Test]
46+
public function frontend_elevated_session_routes_are_not_registered()
47+
{
48+
$this->actingAs($this->user);
49+
50+
$this->get('/!/auth/confirm-password')->assertNotFound();
51+
$this->post('/!/auth/elevated-session')->assertNotFound();
52+
$this->get('/!/auth/elevated-session/passkey-options')->assertNotFound();
53+
$this->get('/!/auth/elevated-session/resend-code')->assertNotFound();
54+
}
55+
}

0 commit comments

Comments
 (0)