From 34bf77e14e5c58e854e3de7810fd2c4474089965 Mon Sep 17 00:00:00 2001 From: Adrien P Date: Fri, 8 Aug 2025 12:27:05 +0200 Subject: [PATCH] Better handling of webautn + removed deprecated extension --- frontend/package.json | 3 +- .../src/components/account/FidoAuthForm.vue | 44 ++++---- frontend/yarn.lock | 106 ++++++------------ modoboa/core/fido2_auth.py | 2 +- 4 files changed, 63 insertions(+), 92 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 3b8e72fda..9ae31902f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,14 +20,13 @@ "@fullcalendar/interaction": "^6.1.15", "@fullcalendar/timegrid": "^6.1.15", "@fullcalendar/vue3": "^6.1.15", - "@github/webauthn-json": "^2.1.1", "@mdi/font": "^7.3.67", "@tiptap/extension-highlight": "^2.11.7", "@tiptap/extension-text-align": "^2.11.7", "@tiptap/pm": "^2.11.7", "@tiptap/starter-kit": "^2.11.7", "@tiptap/vue-3": "^2.11.7", - "apexcharts": "^3.50.0", + "apexcharts": "^4.0.0", "axios": "^1.8.2", "core-js": "^3.37.1", "debounce": "^2.1.0", diff --git a/frontend/src/components/account/FidoAuthForm.vue b/frontend/src/components/account/FidoAuthForm.vue index 9325d0358..d33880c5d 100644 --- a/frontend/src/components/account/FidoAuthForm.vue +++ b/frontend/src/components/account/FidoAuthForm.vue @@ -107,15 +107,12 @@ import { ref, onMounted, computed } from 'vue' import authApi from '@/api/auth.js' import { useGettext } from 'vue3-gettext' import rules from '@/plugins/rules.js' -import { useAuthStore } from '@/stores' +import { useBusStore, useAuthStore } from '@/stores' import ConfirmDialog from '@/components/tools/ConfirmDialog.vue' import RecoveryCodesResetDialog from './RecoveryCodesResetDialog.vue' -import { - create, - parseCreationOptionsFromJSON, -} from '@github/webauthn-json/browser-ponyfill' const authStore = useAuthStore() +const busStore = useBusStore() const { $gettext } = useGettext() @@ -125,7 +122,7 @@ const browserCapable = !!( navigator.credentials && navigator.credentials.create && navigator.credentials.get && - window.PublicKeyCredential + PublicKeyCredential.parseCreationOptionsFromJSON ) const fidoForm = ref() const fidoCreds = computed(() => authStore.fidoCreds) @@ -151,19 +148,28 @@ async function startFidoRegistration() { registrationLoading.value = true const creationOption = await authApi.beginFidoRegistration() if (creationOption) { - const options = parseCreationOptionsFromJSON(creationOption.data) - const device = await create(options) - const result = device.toJSON() - result.name = name.value - authStore.addFidoCred(result).then((res) => { - if (res.status === 200) { - tokens.value = res.data.tokens - showBackupTokenDialog.value = true - } - }) - fidoForm.value.reset() - registrationLoading.value = false - return + const options = PublicKeyCredential.parseCreationOptionsFromJSON(creationOption.data.publicKey) + navigator.credentials + .create({publicKey: options}) + .then((device) => { + const result = device.toJSON() + result.name = name.value + authStore.addFidoCred(result).then((res) => { + if (res.status === 200) { + tokens.value = res.data.tokens + showBackupTokenDialog.value = true + } + }) + fidoForm.value.reset() + registrationLoading.value = false + return + }) + .catch((err) => { + console.log(err) + fidoForm.value.reset() + registrationLoading.value = false + busStore.displayNotification({msg: $gettext('Failed to register the webAuthN device'), type: 'error'}) + }) } registrationLoading.value = false } diff --git a/frontend/yarn.lock b/frontend/yarn.lock index c34674335..748cd4bab 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -263,11 +263,6 @@ resolved "https://registry.yarnpkg.com/@fullcalendar/vue3/-/vue3-6.1.17.tgz#f9c7fb4e6d94ff1dc401aeb730b6dd411b39cbe0" integrity sha512-0+qi/PK/xCkTQXh2CaeN2AkP+SvQTznPhwBXuIyrtsR0Ua8UpmGEXI+my3qQ6o003r8gPUY2e785ywIyhX2zCA== -"@github/webauthn-json@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@github/webauthn-json/-/webauthn-json-2.1.1.tgz#648e63fc28050917d2882cc2b27817a88cb420fc" - integrity sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ== - "@humanfs/core@^0.19.1": version "0.19.1" resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" @@ -454,6 +449,33 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.43.0.tgz#42a88207659e404e8ffa655cae763cbad94906ab" integrity sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw== +"@svgdotjs/svg.draggable.js@^3.0.4": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz#bca1065ec27b1dbae5a92a0558777ed964a395cb" + integrity sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA== + +"@svgdotjs/svg.filter.js@^3.0.8": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.9.tgz#758e336b79e73a6797358d655b60842131a9a52b" + integrity sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw== + dependencies: + "@svgdotjs/svg.js" "^3.2.4" + +"@svgdotjs/svg.js@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz#4716be92a64c66b29921b63f7235fcfb953fb13a" + integrity sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg== + +"@svgdotjs/svg.resize.js@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz#732e4cae15d09ad3021adeac63bc9fad0dc7255a" + integrity sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA== + +"@svgdotjs/svg.select.js@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@svgdotjs/svg.select.js/-/svg.select.js-4.0.3.tgz#6af12755fd71caf703825d4f490fdf02a001cbfc" + integrity sha512-qkMgso1sd2hXKd1FZ1weO7ANq12sNmQJeGDjs46QwDVsxSRcHmvWKL2NDF7Yimpwf3sl5esOLkPqtV2bQ3v/Jg== + "@tiptap/core@^2.14.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.14.0.tgz#9a0ffd500cc720194916475506292006d2cb69c3" @@ -852,18 +874,17 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -apexcharts@^3.50.0: - version "3.54.1" - resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.54.1.tgz#9b78a6ee10e4225d5e04309c8e5b379e2c5c9da2" - integrity sha512-E4et0h/J1U3r3EwS/WlqJCQIbepKbp6wGUmaAwJOMjHUP4Ci0gxanLa7FR3okx6p9coi4st6J853/Cb1NP0vpA== +apexcharts@^4.0.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-4.7.0.tgz#27e578a2fd66847d8ea425aeea1de56d6be42f21" + integrity sha512-iZSrrBGvVlL+nt2B1NpqfDuBZ9jX61X9I2+XV0hlYXHtTwhwLTHDKGXjNXAgFBDLuvSYCB/rq2nPWVPRv2DrGA== dependencies: + "@svgdotjs/svg.draggable.js" "^3.0.4" + "@svgdotjs/svg.filter.js" "^3.0.8" + "@svgdotjs/svg.js" "^3.2.4" + "@svgdotjs/svg.resize.js" "^2.0.2" + "@svgdotjs/svg.select.js" "^4.0.1" "@yr/monotone-cubic-spline" "^1.0.3" - svg.draggable.js "^2.2.2" - svg.easing.js "^2.0.0" - svg.filter.js "^2.0.2" - svg.pathmorphing.js "^0.1.3" - svg.resize.js "^1.4.3" - svg.select.js "^3.0.1" argparse@^2.0.1: version "2.0.1" @@ -2329,61 +2350,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -svg.draggable.js@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz#c514a2f1405efb6f0263e7958f5b68fce50603ba" - integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw== - dependencies: - svg.js "^2.0.1" - -svg.easing.js@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/svg.easing.js/-/svg.easing.js-2.0.0.tgz#8aa9946b0a8e27857a5c40a10eba4091e5691f12" - integrity sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA== - dependencies: - svg.js ">=2.3.x" - -svg.filter.js@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/svg.filter.js/-/svg.filter.js-2.0.2.tgz#91008e151389dd9230779fcbe6e2c9a362d1c203" - integrity sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw== - dependencies: - svg.js "^2.2.5" - -svg.js@>=2.3.x, svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/svg.js/-/svg.js-2.7.1.tgz#eb977ed4737001eab859949b4a398ee1bb79948d" - integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== - -svg.pathmorphing.js@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz#c25718a1cc7c36e852ecabc380e758ac09bb2b65" - integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww== - dependencies: - svg.js "^2.4.0" - -svg.resize.js@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/svg.resize.js/-/svg.resize.js-1.4.3.tgz#885abd248e0cd205b36b973c4b578b9a36f23332" - integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw== - dependencies: - svg.js "^2.6.5" - svg.select.js "^2.1.2" - -svg.select.js@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-2.1.2.tgz#e41ce13b1acff43a7441f9f8be87a2319c87be73" - integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ== - dependencies: - svg.js "^2.2.5" - -svg.select.js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-3.0.1.tgz#a4198e359f3825739226415f82176a90ea5cc917" - integrity sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw== - dependencies: - svg.js "^2.6.5" - tinyglobby@^0.2.13: version "0.2.14" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" diff --git a/modoboa/core/fido2_auth.py b/modoboa/core/fido2_auth.py index 78e87532e..35d680ae2 100644 --- a/modoboa/core/fido2_auth.py +++ b/modoboa/core/fido2_auth.py @@ -37,7 +37,7 @@ def begin_registration(request): extensions={"credentialProtectionPolicy": "userVerificationOptional"}, ) request.session["fido2_state"] = state - return options + return dict(options) def end_registration(request):