Add passkey support

This commit is contained in:
Johannes Zellner
2026-02-12 21:10:51 +01:00
parent 3e09bef613
commit 5724ca73b4
16 changed files with 992 additions and 69 deletions
@@ -12,6 +12,7 @@ const dialog = useTemplateRef('dialog');
const formError = ref({});
const busy = ref (false);
const password = ref('');
const twoFAMethod = ref('totp'); // 'totp' or 'passkey'
const form = useTemplateRef('form');
const isFormValid = ref(false);
@@ -25,10 +26,19 @@ async function onSubmit() {
busy.value = true;
formError.value = {};
const [error] = await profileModel.disableTwoFA(password.value);
let error;
if (twoFAMethod.value === 'passkey') {
[error] = await profileModel.deletePasskey(password.value);
} else {
[error] = await profileModel.disableTwoFA(password.value);
}
if (error) {
if (error.status === 412) formError.value.password = error.body.message;
else {
if (error.status === 412) {
password.value = '';
formError.value.password = error.body.message;
setTimeout(() => document.getElementById('passwordInput')?.focus(), 0);
} else {
formError.value.generic = error.status ? error.body.message : 'Internal error';
console.error('Failed to disable 2fa', error);
}
@@ -46,7 +56,8 @@ async function onSubmit() {
}
defineExpose({
async open() {
async open(method = 'totp') {
twoFAMethod.value = method;
password.value = '';
busy.value = false;
formError.value = {};
@@ -64,7 +75,7 @@ defineExpose({
:confirm-label="$t('profile.disable2FA.disable')"
:confirm-active="!busy && isFormValid"
:confirm-busy="busy"
confirm-style="primary"
confirm-style="danger"
:reject-label="$t('main.dialog.cancel')"
:reject-active="!busy"
reject-style="secondary"
@@ -78,7 +89,7 @@ defineExpose({
<FormGroup :has-error="formError.password">
<label>{{ $t('profile.disable2FA.password') }}</label>
<PasswordInput v-model="password" required />
<PasswordInput v-model="password" required id="passwordInput" />
<div class="error-label" v-if="formError.password">{{ formError.password }}</div>
</FormGroup>
</fieldset>