From dfaf20083845c32686ad69f5a468bc67738f0801 Mon Sep 17 00:00:00 2001 From: Peter Ringelmann Date: Mon, 23 Mar 2026 17:42:57 +0100 Subject: [PATCH] fix(frontend): add strict password confirmation for sensitive admin actions Register axios password confirmation interceptors in the apps management, admin delegation, admin security, and OAuth2 settings bundles, and pass PwdConfirmationMode.Strict on requests to endpoints protected with #[PasswordConfirmationRequired(strict: true)], so that the user password is verified via Basic auth on the request itself rather than relying on the session timestamp. Signed-off-by: Peter Ringelmann --- apps/oauth2/src/settings-admin.ts | 4 + apps/oauth2/src/views/AdminSettings.vue | 3 +- .../AdminDelegation/GroupSelect.vue | 3 +- .../src/components/AdminTwoFactor.vue | 3 +- apps/settings/src/main-admin-delegation.js | 4 + apps/settings/src/main-admin-security.js | 6 +- .../src/main-apps-users-management.ts | 4 + apps/settings/src/store/api.js | 4 +- apps/settings/src/store/apps.js | 128 +++++++++--------- 9 files changed, 90 insertions(+), 69 deletions(-) diff --git a/apps/oauth2/src/settings-admin.ts b/apps/oauth2/src/settings-admin.ts index 95182afb143..47477a45aa7 100644 --- a/apps/oauth2/src/settings-admin.ts +++ b/apps/oauth2/src/settings-admin.ts @@ -3,12 +3,16 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +import axios from '@nextcloud/axios' import { loadState } from '@nextcloud/initial-state' +import { addPasswordConfirmationInterceptors } from '@nextcloud/password-confirmation' import { createApp } from 'vue' import AdminSettings from './views/AdminSettings.vue' import 'vite/modulepreload-polyfill' +addPasswordConfirmationInterceptors(axios) + const clients = loadState('oauth2', 'clients') const app = createApp(AdminSettings, { diff --git a/apps/oauth2/src/views/AdminSettings.vue b/apps/oauth2/src/views/AdminSettings.vue index 8730e405c34..7c849caa394 100644 --- a/apps/oauth2/src/views/AdminSettings.vue +++ b/apps/oauth2/src/views/AdminSettings.vue @@ -8,6 +8,7 @@ import axios, { isAxiosError } from '@nextcloud/axios' import { getCapabilities } from '@nextcloud/capabilities' import { loadState } from '@nextcloud/initial-state' import { t } from '@nextcloud/l10n' +import { PwdConfirmationMode } from '@nextcloud/password-confirmation' import { generateUrl } from '@nextcloud/router' import { ref } from 'vue' import NcButton from '@nextcloud/vue/components/NcButton' @@ -56,7 +57,7 @@ async function addClient() { const { data } = await axios.post(generateUrl('apps/oauth2/clients'), { name: newClient.value.name, redirectUri: newClient.value.redirectUri, - }) + }, { confirmPassword: PwdConfirmationMode.Strict }) clients.value.push(data) showSecretWarning.value = true diff --git a/apps/settings/src/components/AdminDelegation/GroupSelect.vue b/apps/settings/src/components/AdminDelegation/GroupSelect.vue index 8e994c7d993..209dedc98a7 100644 --- a/apps/settings/src/components/AdminDelegation/GroupSelect.vue +++ b/apps/settings/src/components/AdminDelegation/GroupSelect.vue @@ -17,6 +17,7 @@