From 7aac2df3d7dc9728c3ea39c4a7c1bcc58f60f665 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Tue, 1 Sep 2026 10:51:34 +0100 Subject: [PATCH] fix enforced two factor setup elevation --- resources/js/components/two-factor/Setup.vue | 20 +++++++++----- resources/js/pages/auth/two-factor/Setup.vue | 9 ++++++- resources/js/pages/layout/Outside.vue | 10 ++++++- routes/cp.php | 12 +++++---- .../DisableTwoFactorAuthentication.php | 2 +- tests/Actions/DisableTwoFactorTest.php | 8 ++++++ tests/Auth/ElevatedSessionTest.php | 27 +++++++++++++++++++ 7 files changed, 74 insertions(+), 14 deletions(-) diff --git a/resources/js/components/two-factor/Setup.vue b/resources/js/components/two-factor/Setup.vue index 0526ad82559..aca5275063c 100644 --- a/resources/js/components/two-factor/Setup.vue +++ b/resources/js/components/two-factor/Setup.vue @@ -25,12 +25,20 @@ onMounted(() => getSetupCode()); function getSetupCode() { loading.value = true; - axios.post(props.enableUrl).then((response) => { - qrCode.value = response.data.qr; - secretKey.value = response.data.secret_key; - confirmUrl.value = response.data.confirm_url; - loading.value = false; - }); + axios + .post(props.enableUrl) + .then((response) => { + qrCode.value = response.data.qr; + secretKey.value = response.data.secret_key; + confirmUrl.value = response.data.confirm_url; + }) + .catch((error) => { + setupModalOpen.value = false; + Statamic.$toast.error(error.response?.data?.message ?? error.message); + }) + .finally(() => { + loading.value = false; + }); } function confirm() { diff --git a/resources/js/pages/auth/two-factor/Setup.vue b/resources/js/pages/auth/two-factor/Setup.vue index e3deb6bc6aa..26bc01cf0e3 100644 --- a/resources/js/pages/auth/two-factor/Setup.vue +++ b/resources/js/pages/auth/two-factor/Setup.vue @@ -2,6 +2,7 @@ import Head from '@/pages/layout/Head.vue'; import Outside from '@/pages/layout/Outside.vue'; import TwoFactorSetup from '@/components/two-factor/Setup.vue'; +import { requireElevatedSession } from '@/components/elevated-sessions'; import { AuthCard, Button } from '@ui'; import { ref } from 'vue'; @@ -11,6 +12,12 @@ const props = defineProps(['routes', 'redirect']); const setupModalOpen = ref(false); +function openSetupModal() { + requireElevatedSession() + .then(() => (setupModalOpen.value = true)) + .catch(() => Statamic.$toast.error(__('statamic::messages.elevated_session_required'))); +} + function setupComplete() { window.location.href = props.redirect; } @@ -24,7 +31,7 @@ function setupComplete() { :title="__('Set up Two Factor Authentication')" :description="__('statamic::messages.two_factor_account_requirement')" > -