Skip to content

Commit 18103b3

Browse files
committed
Merge remote-tracking branch 'origin/6.x' into frontend-two-factor
2 parents a269ef8 + d5fb7ed commit 18103b3

14 files changed

Lines changed: 164 additions & 20 deletions

File tree

config/users.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,15 @@
176176
| Users may be required to reauthorize before performing certain
177177
| sensitive actions. This is called an elevated session. Here
178178
| you may configure the duration of the session in minutes.
179+
| You may also disable the elevated session entirely.
179180
|
180181
*/
181182

183+
'elevated_sessions_enabled' => env('STATAMIC_ELEVATED_SESSIONS_ENABLED', true),
184+
182185
'elevated_session_duration' => 15,
183186

184-
'elevated_session_url' => null,
187+
'elevated_sessions_url' => null,
185188

186189
/*
187190
|--------------------------------------------------------------------------

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('elevatedSessionsEnabled')) 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_sessions_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
@@ -55,12 +55,14 @@
5555
Route::get('password/reset/{token}', [ResetPasswordController::class, 'showResetForm'])->name('password.reset');
5656
Route::post('password/reset', [ResetPasswordController::class, 'reset'])->middleware('throttle:statamic.auth')->name('password.reset.action');
5757

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

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

src/Auth/Eloquent/User.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,11 @@ public function remove($key)
303303

304304
public function merge($data)
305305
{
306-
$this->data($this->data()->merge(collect($data)->filter(fn ($v) => $v !== null)->all()));
306+
$merged = $this->data()
307+
->except(['roles', 'groups'])
308+
->merge(collect($data)->filter(fn ($v) => $v !== null)->all());
309+
310+
$this->data($merged->all());
307311

308312
return $this;
309313
}

src/CP/Navigation/NavBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -998,7 +998,7 @@ protected function ensureUrlCachesAreUpToDate()
998998
$updated = collect($this->items)
999999
->filter(fn ($item) => collect($this->itemsWithChildrenClosures)->contains($item->id()))
10001000
->filter(fn ($item) => $item->isActive() || $this->withHidden)
1001-
->mapWithKeys(fn ($item) => [$item->id() => $item->children()?->map->url()->all() ?? []])
1001+
->mapWithKeys(fn ($item) => [$item->id() => $item->resolveChildren()->children()?->map->url()->all() ?? []])
10021002
->filter(fn ($urls, $id) => $this->urlsUnresolvedChildren->get($id) != $urls)
10031003
->each(fn ($urls, $id) => $this->trackChangedChildren($id, $urls))
10041004
->isNotEmpty();

src/Http/Controllers/Auth/ElevatedSessionController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class ElevatedSessionController extends Controller
1717
{
1818
public function showForm(Request $request)
1919
{
20-
if ($customUrl = config('statamic.users.elevated_session_url')) {
20+
if ($customUrl = config('statamic.users.elevated_sessions_url')) {
2121
return redirect()->to($customUrl);
2222
}
2323

src/Http/Controllers/CP/CpController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public function authorizeProIf($condition)
7272

7373
public function requireElevatedSession(): void
7474
{
75-
if (! request()->hasElevatedSession()) {
75+
if (config('statamic.users.elevated_sessions_enabled') && ! request()->hasElevatedSession()) {
7676
throw new ElevatedSessionAuthorizationException;
7777
}
7878
}

src/Http/Middleware/RequireElevatedSession.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class RequireElevatedSession
99
{
1010
public function handle($request, Closure $next)
1111
{
12-
if (! $request->hasElevatedSession()) {
12+
if (config('statamic.users.elevated_sessions_enabled') && ! $request->hasElevatedSession()) {
1313
throw new ElevatedSessionAuthorizationException;
1414
}
1515

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+
'elevatedSessionsEnabled' => config('statamic.users.elevated_sessions_enabled'),
6768
'user' => $this->user($user),
6869
'defaultPreferences' => Preference::default()->all(),
6970
'paginationSize' => config('statamic.cp.pagination_size'),

0 commit comments

Comments
 (0)