From 68308d76854348df2b7b7b6049eafa0301eb9133 Mon Sep 17 00:00:00 2001
From: Julian Lam
Date: Fri, 22 May 2026 15:26:39 -0400
Subject: [PATCH 01/10] Add multi-device WebAuthN support
- Backend: add getAuthnDevices, removeDevice, renameDevice methods
- API routes: GET/DELETE/PATCH /2factor/authn/device endpoints
- Registration: prompt for device name, store in Redis hash
- Login: device selection dropdown when multiple devices exist
- Settings: device list with rename/remove buttons
- Templates: login-authn device selection, 2factor device container
- Translations: 8 new keys across all 8 language directories
Assisted-by: unsloth/Qwen3.6-35B-A3B-GGUF
---
languages/en-GB/2factor.json | 8 ++
languages/fr/2factor.json | 8 ++
languages/it/2factor.json | 8 ++
languages/ko/2factor.json | 8 ++
languages/pl/2factor.json | 8 ++
languages/ru/2factor.json | 8 ++
languages/zh-CN/2factor.json | 8 ++
lib/controllers.js | 9 ++-
library.js | 61 ++++++++++++---
static/lib/authn.js | 105 ++++++++++++++++++-------
static/lib/settings.js | 111 +++++++++++++++++++++++++--
static/templates/account/2factor.tpl | 1 +
static/templates/login-authn.tpl | 20 ++++-
13 files changed, 310 insertions(+), 53 deletions(-)
diff --git a/languages/en-GB/2factor.json b/languages/en-GB/2factor.json
index 4bf5649..f3f864d 100644
--- a/languages/en-GB/2factor.json
+++ b/languages/en-GB/2factor.json
@@ -43,9 +43,17 @@
"authn.modal.content": "A request to register your hardware key has been sent, please authenticate by activating the key now
",
"authn.error": "Hardware key registration aborted.",
"authn.success": "Hardware key successfully registered.",
+ "authn.register.prompt": "Enter a name for this device (optional):",
"authn.login.lead": "Please activate your hardware key now.",
"authn.login.info": "This account is protected by two-factor authentication via a physical key. If you own the key for this account, please activate it now by pressing the button on the key.",
+ "authn.login.select": "Select your hardware key to authenticate with:",
"authn.login.error": "We cannot validate the integrity of this key, please use a backup code to log in, and re-register this key with your account.",
+ "authn.rename": "Rename",
+ "authn.rename.prompt": "Enter new device name:",
+ "authn.renamed": "Device renamed successfully.",
+ "authn.remove": "Remove",
+ "authn.remove.confirm": "Are you sure you want to remove this device? You will not be able to use it for two-factor authentication.",
+ "authn.removed": "Device removed successfully.",
"login.text": "Enter the verification code generated by your mobile application.",
"login.verify": "Verify",
diff --git a/languages/fr/2factor.json b/languages/fr/2factor.json
index 65bfc96..9d15ec6 100644
--- a/languages/fr/2factor.json
+++ b/languages/fr/2factor.json
@@ -48,5 +48,13 @@
"admin.deactivate.search": "Recherche d'utilisateurs ici ...",
"admin.force_2fa": "Enforce 2factor Authentication",
+ "authn.register.prompt": "Enter a name for this device (optional):",
+ "authn.login.select": "Select your hardware key to authenticate with:",
+ "authn.rename": "Rename",
+ "authn.rename.prompt": "Enter new device name:",
+ "authn.renamed": "Device renamed successfully.",
+ "authn.remove": "Remove",
+ "authn.remove.confirm": "Are you sure you want to remove this device? You will not be able to use it for two-factor authentication.",
+ "authn.removed": "Device removed successfully.",
"admin.force_2fa.help": "Force the users belonging to the selected groups to activate 2FA.
This is useful to enhance security by ensuring privileged users such as administrators and moderators have this activated."
}
diff --git a/languages/it/2factor.json b/languages/it/2factor.json
index acd207f..1e04a19 100644
--- a/languages/it/2factor.json
+++ b/languages/it/2factor.json
@@ -48,5 +48,13 @@
"admin.deactivate.search": "Cerca per utente...",
"admin.force_2fa": "Enforce 2factor Authentication",
+ "authn.register.prompt": "Enter a name for this device (optional):",
+ "authn.login.select": "Select your hardware key to authenticate with:",
+ "authn.rename": "Rename",
+ "authn.rename.prompt": "Enter new device name:",
+ "authn.renamed": "Device renamed successfully.",
+ "authn.remove": "Remove",
+ "authn.remove.confirm": "Are you sure you want to remove this device? You will not be able to use it for two-factor authentication.",
+ "authn.removed": "Device removed successfully.",
"admin.force_2fa.help": "Force the users belonging to the selected groups to activate 2FA.
This is useful to enhance security by ensuring privileged users such as administrators and moderators have this activated."
}
diff --git a/languages/ko/2factor.json b/languages/ko/2factor.json
index eacf655..76939d8 100644
--- a/languages/ko/2factor.json
+++ b/languages/ko/2factor.json
@@ -75,5 +75,13 @@
"admin.deactivate.search": "여기서 사용자 검색...",
"admin.force_2fa": "2단계 인증 강제 사용",
+ "authn.register.prompt": "Enter a name for this device (optional):",
+ "authn.login.select": "Select your hardware key to authenticate with:",
+ "authn.rename": "Rename",
+ "authn.rename.prompt": "Enter new device name:",
+ "authn.renamed": "Device renamed successfully.",
+ "authn.remove": "Remove",
+ "authn.remove.confirm": "Are you sure you want to remove this device? You will not be able to use it for two-factor authentication.",
+ "authn.removed": "Device removed successfully.",
"admin.force_2fa.help": "선택한 그룹에 속한 사용자에게 2단계 인증(2FA)를 활성화하도록 강제합니다.
이는 관리자 및 중재자와 같은 특권 사용자의 보안을 강화하는 데 유용합니다."
}
diff --git a/languages/pl/2factor.json b/languages/pl/2factor.json
index b362417..3f226e0 100644
--- a/languages/pl/2factor.json
+++ b/languages/pl/2factor.json
@@ -48,5 +48,13 @@
"admin.deactivate.search": "Wyszukaj użytkowników tutaj...",
"admin.force_2fa": "Wymuś weryfikację dwuetapową",
+ "authn.register.prompt": "Enter a name for this device (optional):",
+ "authn.login.select": "Select your hardware key to authenticate with:",
+ "authn.rename": "Rename",
+ "authn.rename.prompt": "Enter new device name:",
+ "authn.renamed": "Device renamed successfully.",
+ "authn.remove": "Remove",
+ "authn.remove.confirm": "Are you sure you want to remove this device? You will not be able to use it for two-factor authentication.",
+ "authn.removed": "Device removed successfully.",
"admin.force_2fa.help": "Wymagaj od wybranych grup użytkowników aktywacji 2FA.
Funkcja ta przekłada się na wyższy poziom bezpieczeństwa tam gdzie w grę wchodzą uprawnienia administratora czy moderatora."
}
diff --git a/languages/ru/2factor.json b/languages/ru/2factor.json
index 8caa8ac..9feead8 100644
--- a/languages/ru/2factor.json
+++ b/languages/ru/2factor.json
@@ -68,5 +68,13 @@
"admin.deactivate.search": "Ищите пользователей здесь...",
"admin.force_2fa": "Принудительная двухфакторная аутентификация",
+ "authn.register.prompt": "Enter a name for this device (optional):",
+ "authn.login.select": "Select your hardware key to authenticate with:",
+ "authn.rename": "Rename",
+ "authn.rename.prompt": "Enter new device name:",
+ "authn.renamed": "Device renamed successfully.",
+ "authn.remove": "Remove",
+ "authn.remove.confirm": "Are you sure you want to remove this device? You will not be able to use it for two-factor authentication.",
+ "authn.removed": "Device removed successfully.",
"admin.force_2fa.help": "Принудительно активируйте 2FA у пользователей, принадлежащих к выбранным группам.
Это полезно для повышения безопасности, гарантируя, что у привилегированных пользователей, таких как администраторы и модераторы, эта функция активирована."
}
diff --git a/languages/zh-CN/2factor.json b/languages/zh-CN/2factor.json
index 41618d1..5b4154e 100644
--- a/languages/zh-CN/2factor.json
+++ b/languages/zh-CN/2factor.json
@@ -48,5 +48,13 @@
"admin.deactivate.search": "在这里搜索用户...",
"admin.force_2fa": "Enforce 2factor Authentication",
+ "authn.register.prompt": "Enter a name for this device (optional):",
+ "authn.login.select": "Select your hardware key to authenticate with:",
+ "authn.rename": "Rename",
+ "authn.rename.prompt": "Enter new device name:",
+ "authn.renamed": "Device renamed successfully.",
+ "authn.remove": "Remove",
+ "authn.remove.confirm": "Are you sure you want to remove this device? You will not be able to use it for two-factor authentication.",
+ "authn.removed": "Device removed successfully.",
"admin.force_2fa.help": "Force the users belonging to the selected groups to activate 2FA.
This is useful to enhance security by ensuring privileged users such as administrators and moderators have this activated."
}
diff --git a/lib/controllers.js b/lib/controllers.js
index 4884b89..ab7dec7 100644
--- a/lib/controllers.js
+++ b/lib/controllers.js
@@ -114,12 +114,12 @@ Controllers.renderAuthnChallenge = async (req, res, next) => {
return next();
}
- const keyIds = await parent.getAuthnKeyIds(uid);
+ const devices = await parent.getAuthnDevices(uid);
let authnOptions;
- if (keyIds.length) {
+ if (devices.length) {
authnOptions = await parent._f2l.assertionOptions();
- authnOptions.allowCredentials = keyIds.map(keyId => ({
- id: keyId,
+ authnOptions.allowCredentials = devices.map(d => ({
+ id: d.id,
type: 'public-key',
transports: ['usb', 'ble', 'nfc'],
}));
@@ -130,6 +130,7 @@ Controllers.renderAuthnChallenge = async (req, res, next) => {
res.render('login-authn', {
single,
authnOptions,
+ devices,
next: req.query.next,
});
};
diff --git a/library.js b/library.js
index a698fd4..361782a 100644
--- a/library.js
+++ b/library.js
@@ -131,6 +131,25 @@ plugin.addRoutes = async ({ router, middleware, helpers }) => {
helpers.formatApiResponse(200, res, registrationRequest);
});
+ routeHelpers.setupApiRoute(router, 'get', '/2factor/authn/devices', middlewares, async (req, res) => {
+ const devices = await plugin.getAuthnDevices(req.uid);
+ helpers.formatApiResponse(200, res, { devices });
+ });
+
+ routeHelpers.setupApiRoute(router, 'patch', '/2factor/authn/device', middlewares, async (req, res) => {
+ const { id, name } = req.body;
+ if (typeof name !== 'string' || !name.trim()) {
+ return helpers.formatApiResponse(400, res);
+ }
+ await plugin.renameDevice(req.uid, id, name.trim());
+ helpers.formatApiResponse(200, res);
+ });
+
+ routeHelpers.setupApiRoute(router, 'delete', '/2factor/authn/device/:id', middlewares, async (req, res) => {
+ await plugin.removeDevice(req.uid, req.params.id);
+ helpers.formatApiResponse(200, res);
+ });
+
routeHelpers.setupApiRoute(router, 'post', '/2factor/authn/register', middlewares, async (req, res) => {
const attestationExpectations = {
challenge: req.session.registrationRequest.challenge,
@@ -139,7 +158,8 @@ plugin.addRoutes = async ({ router, middleware, helpers }) => {
};
req.body.rawId = Uint8Array.from(atob(base64url.toBase64(req.body.rawId)), c => c.charCodeAt(0)).buffer;
const regResult = await plugin._f2l.attestationResult(req.body, attestationExpectations);
- plugin.saveAuthn(req.uid, regResult.authnrData);
+ const deviceName = typeof req.body.deviceName === 'string' && req.body.deviceName.trim() ? req.body.deviceName.trim() : undefined;
+ plugin.saveAuthn(req.uid, regResult.authnrData, deviceName);
delete req.session.registrationRequest;
req.session.tfa = true; // eliminate re-challenge on registration
@@ -177,14 +197,7 @@ plugin.addRoutes = async ({ router, middleware, helpers }) => {
});
});
- routeHelpers.setupApiRoute(router, 'delete', '/2factor/authn', middlewares, async (req, res) => {
- const { uid } = req;
- const keyIds = await db.getObjectKeys(`2factor:webauthn:${uid}`);
- await db.sortedSetRemove('2factor:webauthn:counters', keyIds);
- await db.delete(`2factor:webauthn:${uid}`);
- helpers.formatApiResponse(200, res);
- });
routeHelpers.setupApiRoute(router, 'delete', '/2factor/totp', middlewares, async (req, res) => {
await db.deleteObjectField('2factor:uid:key', req.uid);
@@ -235,6 +248,15 @@ plugin.getAuthnKeyIds = async (uid) => {
return Object.keys(keys);
};
+plugin.getAuthnDevices = async (uid) => {
+ const keyIds = await plugin.getAuthnKeyIds(uid);
+ const names = await db.getObject(`2factor:webauthn:${uid}:names`) || {};
+ return keyIds.map(id => ({
+ id,
+ name: names[id] || `Device ${keyIds.indexOf(id) + 1}`,
+ }));
+};
+
plugin.getAuthnPublicKey = async (uid, id) => db.getObjectField(`2factor:webauthn:${uid}`, id);
plugin.getAuthnCount = async id => db.sortedSetScore(`2factor:webauthn:counters`, id);
@@ -245,12 +267,15 @@ plugin.save = function (uid, key, callback) {
db.setObjectField('2factor:uid:key', uid, key, callback);
};
-plugin.saveAuthn = (uid, authnrData) => {
+plugin.saveAuthn = async (uid, authnrData, deviceName) => {
const counter = authnrData.get('counter');
const publicKey = authnrData.get('credentialPublicKeyPem');
const id = base64url(authnrData.get('credId'));
- db.setObjectField(`2factor:webauthn:${uid}`, id, publicKey);
- db.sortedSetAdd(`2factor:webauthn:counters`, counter, id);
+ await db.setObjectField(`2factor:webauthn:${uid}`, id, publicKey);
+ await db.sortedSetAdd(`2factor:webauthn:counters`, counter, id);
+ if (deviceName) {
+ await db.setObjectField(`2factor:webauthn:${uid}:names`, id, deviceName);
+ }
};
plugin.hasAuthn = async (uid) => {
@@ -352,6 +377,20 @@ plugin.disassociate = async (uid) => {
const keyIds = await db.getObjectKeys(`2factor:webauthn:${uid}`);
await db.sortedSetRemove('2factor:webauthn:counters', keyIds);
await db.delete(`2factor:webauthn:${uid}`);
+ await db.delete(`2factor:webauthn:${uid}:names`);
+};
+
+plugin.removeDevice = async (uid, id) => {
+ const counters = await db.getObjectKeys(`2factor:webauthn:counters`);
+ if (counters.includes(id)) {
+ await db.sortedSetRemove('2factor:webauthn:counters', id);
+ }
+ await db.deleteObjectField(`2factor:webauthn:${uid}`, id);
+ await db.deleteObjectField(`2factor:webauthn:${uid}:names`, id);
+};
+
+plugin.renameDevice = async (uid, id, newName) => {
+ await db.setObjectField(`2factor:webauthn:${uid}:names`, id, newName);
};
plugin.overrideUid = async ({ req, locals }) => {
diff --git a/static/lib/authn.js b/static/lib/authn.js
index 2686621..4d17684 100644
--- a/static/lib/authn.js
+++ b/static/lib/authn.js
@@ -4,42 +4,89 @@ define('forum/login-authn', ['api', 'alerts', 'hooks'], function (api, alerts, h
var Plugin = {};
Plugin.init = async () => {
- try {
- const abortController = new AbortController();
- hooks.on('action:ajaxify.start', () => {
- abortController.abort();
- });
+ const deviceSelect = document.getElementById('deviceSelect');
+ const authBtn = document.getElementById('authBtn');
+
+ if (deviceSelect && authBtn) {
+ // Multiple devices - show device selection
+ authBtn.addEventListener('click', async () => {
+ const selectedId = deviceSelect.value;
+ authBtn.disabled = true;
+ try {
+ const abortController = new AbortController();
+ hooks.on('action:ajaxify.start', () => {
+ abortController.abort();
+ });
+
+ // Build assertion options for the selected device only
+ const authnOptions = JSON.parse(JSON.stringify(ajaxify.data.authnOptions || {}));
+ authnOptions.allowCredentials = [{
+ id: selectedId,
+ type: 'public-key',
+ transports: ['usb', 'ble', 'nfc'],
+ }];
- const authResponse = await navigator.credentials.get({
- publicKey: ajaxify.data.authnOptions,
- signal: abortController.signal,
+ const authResponse = await navigator.credentials.get({
+ publicKey: authnOptions,
+ signal: abortController.signal,
+ });
+
+ api.post(`/plugins/2factor/authn/verify${document.location.search}`, { authResponse }).then(({ next }) => {
+ ajaxify.go(next.replace(config.relative_path, ''));
+ }).catch((err) => {
+ alerts.error(err);
+ ajaxify.refresh();
+ });
+ } catch (e) {
+ if (e.code !== 20) { // 20 is user canceled
+ alerts.alert({
+ title: '[[2factor:title]]',
+ message: e.message,
+ timeout: 2500,
+ });
+ }
+ authBtn.disabled = false;
+ }
});
+ } else {
+ // Single device or no device selection - proceed directly
+ try {
+ const abortController = new AbortController();
+ hooks.on('action:ajaxify.start', () => {
+ abortController.abort();
+ });
+
+ const authResponse = await navigator.credentials.get({
+ publicKey: ajaxify.data.authnOptions,
+ signal: abortController.signal,
+ });
+
+ api.post(`/plugins/2factor/authn/verify${document.location.search}`, { authResponse }).then(({ next }) => {
+ const iconEl = document.getElementById('statusIcon');
+ iconEl.classList.remove('fa-spinner');
+ iconEl.classList.remove('fa-spin');
+ iconEl.classList.add('fa-check');
+ iconEl.classList.add('text-success');
+ document.location = next;
+ }).catch((err) => {
+ alerts.error(err);
+ ajaxify.refresh();
+ });
+ } catch (e) {
+ if (e.code !== 20) { // 20 is user canceled
+ alerts.alert({
+ title: '[[2factor:title]]',
+ message: e.message,
+ timeout: 2500,
+ });
+ }
- api.post(`/plugins/2factor/authn/verify${document.location.search}`, { authResponse }).then(({ next }) => {
const iconEl = document.getElementById('statusIcon');
iconEl.classList.remove('fa-spinner');
iconEl.classList.remove('fa-spin');
- iconEl.classList.add('fa-check');
- iconEl.classList.add('text-success');
- document.location = next;
- }).catch((err) => {
- alerts.error(err);
- ajaxify.refresh();
- });
- } catch (e) {
- if (e.code !== 20) { // 20 is user canceled
- alerts.alert({
- title: '[[2factor:title]]',
- message: e.message,
- timeout: 2500,
- });
+ iconEl.classList.add('fa-times');
+ iconEl.classList.add('text-danger');
}
-
- const iconEl = document.getElementById('statusIcon');
- iconEl.classList.remove('fa-spinner');
- iconEl.classList.remove('fa-spin');
- iconEl.classList.add('fa-times');
- iconEl.classList.add('text-danger');
}
};
diff --git a/static/lib/settings.js b/static/lib/settings.js
index 992712f..86b513c 100644
--- a/static/lib/settings.js
+++ b/static/lib/settings.js
@@ -12,6 +12,11 @@ define('forum/account/2factor', ['api', 'alerts', 'bootbox'], function (api, ale
const action = e.target.getAttribute('data-action');
Settings[action].call(e.target);
});
+
+ // Render device list if WebAuthn is enabled
+ if (ajaxify.data.hasAuthn) {
+ Settings.renderDevicesList();
+ }
};
Settings.setupTotp = function () {
@@ -51,6 +56,86 @@ define('forum/account/2factor', ['api', 'alerts', 'bootbox'], function (api, ale
});
};
+ Settings.getAuthnDevices = async () => {
+ try {
+ const response = await api.get('/plugins/2factor/authn/devices');
+ return response.devices || [];
+ } catch (e) {
+ alerts.error(e);
+ return [];
+ }
+ };
+
+ Settings.renderDevicesList = async () => {
+ const devices = await Settings.getAuthnDevices();
+ const itemEl = document.querySelector('[data-action="setupAuthn"]').closest('.list-group-item');
+ let devicesHtml = '';
+ if (devices.length > 0) {
+ devicesHtml = '';
+ devices.forEach((device, index) => {
+ const name = device.name || `Device ${index + 1}`;
+ devicesHtml += `
+
+ `;
+ });
+ devicesHtml += '
';
+ }
+ const existing = itemEl.querySelector('.device-list-container');
+ if (existing) {
+ existing.outerHTML = devicesHtml;
+ } else {
+ const container = document.createElement('div');
+ container.className = 'device-list-container mt-2';
+ container.innerHTML = devicesHtml;
+ itemEl.appendChild(container);
+ }
+ // Attach event listeners for rename/remove
+ document.querySelectorAll('.device-rename').forEach(btn => {
+ btn.addEventListener('click', (e) => {
+ const deviceId = e.target.closest('.device-rename').getAttribute('data-device-id');
+ Settings.renameDevice(deviceId);
+ });
+ });
+ document.querySelectorAll('.device-remove').forEach(btn => {
+ btn.addEventListener('click', (e) => {
+ const deviceId = e.target.closest('.device-remove').getAttribute('data-device-id');
+ Settings.removeDevice(deviceId);
+ });
+ });
+ };
+
+ Settings.renameDevice = (deviceId) => {
+ bootbox.prompt('[[2factor:authn.rename.prompt]]', function (result) {
+ if (result && result.trim()) {
+ api.patch('/plugins/2factor/authn/device', { id: deviceId, name: result.trim() })
+ .then(() => {
+ alerts.success('[[2factor:authn.renamed]]');
+ Settings.renderDevicesList();
+ })
+ .catch(alerts.error);
+ }
+ });
+ };
+
+ Settings.removeDevice = (deviceId) => {
+ bootbox.confirm('[[2factor:authn.remove.confirm]]', function (confirm) {
+ if (confirm) {
+ api.del(`/plugins/2factor/authn/device/${deviceId}`)
+ .then(() => {
+ alerts.success('[[2factor:authn.removed]]');
+ Settings.renderDevicesList();
+ })
+ .catch(alerts.error);
+ }
+ });
+ };
+
Settings.disableAuthn = () => {
bootbox.confirm('[[2factor:user.manage.disableAuthn]]', function (confirm) {
if (confirm) {
@@ -62,21 +147,31 @@ define('forum/account/2factor', ['api', 'alerts', 'bootbox'], function (api, ale
Settings.setupAuthn = function () {
const self = this;
self.classList.add('text-muted');
- const modal = bootbox.dialog({
- message: '[[2factor:authn.modal.content]]',
- closeButton: false,
- className: 'text-center',
- });
- api.get('/plugins/2factor/authn/register', {}).then(async (request) => {
+ bootbox.prompt('[[2factor:authn.register.prompt]]', async function (deviceName) {
+ const modal = bootbox.dialog({
+ message: '[[2factor:authn.modal.content]]',
+ closeButton: false,
+ className: 'text-center',
+ });
+ let request;
+ try {
+ request = await api.get('/plugins/2factor/authn/register', {});
+ } catch (e) {
+ modal.modal('hide');
+ self.classList.remove('disabled');
+ alerts.error(e);
+ return;
+ }
try {
const response = await navigator.credentials.create({
publicKey: request,
});
modal.modal('hide');
- api.post('/plugins/2factor/authn/register', response).then(() => {
+ api.post('/plugins/2factor/authn/register', { ...response, deviceName: deviceName && deviceName.trim() ? deviceName.trim() : undefined }).then(() => {
alerts.success('[[2factor:authn.success]]');
- setTimeout(document.location.reload.bind(document.location), 1000);
+ Settings.renderDevicesList();
+ ajaxify.refresh();
}).catch(alerts.error);
} catch (e) {
modal.modal('hide');
diff --git a/static/templates/account/2factor.tpl b/static/templates/account/2factor.tpl
index 9222c00..96b165b 100644
--- a/static/templates/account/2factor.tpl
+++ b/static/templates/account/2factor.tpl
@@ -32,6 +32,7 @@
[[2factor:choices.authn]]
+
diff --git a/static/templates/login-authn.tpl b/static/templates/login-authn.tpl
index 97ec62b..261d944 100644
--- a/static/templates/login-authn.tpl
+++ b/static/templates/login-authn.tpl
@@ -11,12 +11,30 @@
+
+
[[2factor:authn.login.select]]
+
+
+
+
+
+ {{{ if !single }}}
+
+ [[2factor:choices.back]]
+
+ {{{ end }}}
+
[[2factor:authn.login.lead]]
[[2factor:authn.login.info]]
+
- {{{ if !single }}}
+ {{{ if !single && devices.length <= 1 }}}
[[2factor:choices.back]]
From 11140a9a141a8a113f41f51f0960bf458393426a Mon Sep 17 00:00:00 2001
From: Julian Lam
Date: Mon, 25 May 2026 10:58:18 -0400
Subject: [PATCH 02/10] chore: upgrade fido2-lib to ^3.5.8 to fix elliptic
vulnerability
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Upgrade fido2-lib from ^2.8.1 to ^3.5.8, which removes the vulnerable
elliptic dependency chain (fido2-lib → jwk-to-pem → elliptic).
The public API is unchanged so no code modifications needed.
Assisted-by: unsloth/Qwen3.6-35B-A3B-GGUF
---
package-lock.json | 1078 ++++++++++++++++++---------------------------
package.json | 2 +-
2 files changed, 424 insertions(+), 656 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 17f1ea8..86dbdf6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,11 +9,10 @@
"version": "7.6.2",
"license": "MIT",
"dependencies": {
- "@github/webauthn-json": "^0.5.7",
"arraybuffer-to-string": "^1.0.2",
"async": "^3.2.0",
"base64url": "^3.0.1",
- "fido2-lib": "^2.8.1",
+ "fido2-lib": "^3.5.8",
"lru-cache": "^5.1.1",
"notp": "^2.0.3",
"passport-totp": "0.0.2",
@@ -136,6 +135,84 @@
"node": ">=4"
}
},
+ "node_modules/@cbor-extract/cbor-extract-darwin-arm64": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.2.tgz",
+ "integrity": "sha512-ZKZ/F8US7JR92J4DMct6cLW/Y66o2K576+zjlEN/MevH70bFIsB10wkZEQPLzl2oNh2SMGy55xpJ9JoBRl5DOA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@cbor-extract/cbor-extract-darwin-x64": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.2.tgz",
+ "integrity": "sha512-32b1mgc+P61Js+KW9VZv/c+xRw5EfmOcPx990JbCBSkYJFY0l25VinvyyWfl+3KjibQmAcYwmyzKF9J4DyKP/Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@cbor-extract/cbor-extract-linux-arm": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.2.tgz",
+ "integrity": "sha512-tNg0za41TpQfkhWjptD+0gSD2fggMiDCSacuIeELyb2xZhr7PrhPe5h66Jc67B/5dmpIhI2QOUtv4SBsricyYQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@cbor-extract/cbor-extract-linux-arm64": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.2.tgz",
+ "integrity": "sha512-wfqgzqCAy/Vn8i6WVIh7qZd0DdBFaWBjPdB6ma+Wihcjv0gHqD/mw3ouVv7kbbUNrab6dKEx/w3xQZEdeXIlzg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@cbor-extract/cbor-extract-linux-x64": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.2.tgz",
+ "integrity": "sha512-rpiLnVEsqtPJ+mXTdx1rfz4RtUGYIUg2rUAZgd1KjiC1SehYUSkJN7Yh+aVfSjvCGtVP0/bfkQkXpPXKbmSUaA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@cbor-extract/cbor-extract-win32-x64": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.2.tgz",
+ "integrity": "sha512-dI+9P7cfWxkTQ+oE+7Aa6onEn92PHgfWXZivjNheCRmTBDBf2fx6RyTi0cmgpYLnD1KLZK9ZYrMxaPZ4oiXhGA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/@commitlint/cli": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz",
@@ -1076,13 +1153,11 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@github/webauthn-json": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/@github/webauthn-json/-/webauthn-json-0.5.7.tgz",
- "integrity": "sha512-SUYsttDxFSvWvvJssJpwzjmRCqYfdfqC9VCmAHQYfdKCVelyJteCHo9/lK1CB72mx/jrl6cFNY08aua4J2jIyg==",
- "bin": {
- "webauthn-json": "dist/bin/webauthn-json-bin.js"
- }
+ "node_modules/@hexagon/base64": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@hexagon/base64/-/base64-2.0.4.tgz",
+ "integrity": "sha512-H/ZY6rGyaEuk0mwQgZ3BVi9hMjFTYpBNFbmtOuec/pPibuGhCMXd8fGtwBaO0h44FkWMurysMsDrpkJsBRmoWQ==",
+ "license": "MIT"
},
"node_modules/@humanfs/core": {
"version": "0.19.1",
@@ -1145,33 +1220,34 @@
"url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@peculiar/asn1-schema": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz",
- "integrity": "sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==",
- "dependencies": {
- "asn1js": "^3.0.5",
- "pvtsutils": "^1.3.2",
- "tslib": "^2.4.0"
+ "node_modules/@noble/hashes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@peculiar/asn1-schema/node_modules/asn1js": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz",
- "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==",
+ "node_modules/@peculiar/asn1-schema": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz",
+ "integrity": "sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==",
+ "license": "MIT",
"dependencies": {
- "pvtsutils": "^1.3.2",
- "pvutils": "^1.1.3",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=12.0.0"
+ "@peculiar/utils": "^2.0.2",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
}
},
"node_modules/@peculiar/json-schema": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz",
"integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==",
+ "license": "MIT",
"dependencies": {
"tslib": "^2.0.0"
},
@@ -1179,16 +1255,26 @@
"node": ">=8.0.0"
}
},
+ "node_modules/@peculiar/utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz",
+ "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.8.1"
+ }
+ },
"node_modules/@peculiar/webcrypto": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz",
- "integrity": "sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz",
+ "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==",
+ "license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.3.0",
+ "@peculiar/asn1-schema": "^2.3.8",
"@peculiar/json-schema": "^1.1.12",
- "pvtsutils": "^1.3.2",
- "tslib": "^2.4.1",
- "webcrypto-core": "^1.7.4"
+ "pvtsutils": "^1.3.5",
+ "tslib": "^2.6.2",
+ "webcrypto-core": "^1.8.0"
},
"engines": {
"node": ">=10.12.0"
@@ -1519,26 +1605,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/asn1.js": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
- "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
- "dependencies": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "safer-buffer": "^2.1.0"
- }
- },
"node_modules/asn1js": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.4.0.tgz",
- "integrity": "sha512-PvZC0FMyMut8aOnR2jAEGSkmRtHIUYPe9amUEnGjr9TdnUmsfoOkjrvUkOEU9mzpYBR1HyO9bF+8U1cLTMMHhQ==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz",
+ "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "pvutils": "^1.1.3"
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.5",
+ "tslib": "^2.8.1"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=12.0.0"
}
},
"node_modules/astral-regex": {
@@ -1587,25 +1665,6 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
"node_modules/base64url": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
@@ -1614,19 +1673,6 @@
"node": ">=6.0.0"
}
},
- "node_modules/bignumber.js": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz",
- "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/bn.js": {
- "version": "4.12.3",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz",
- "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="
- },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -1649,38 +1695,11 @@
"node": ">=8"
}
},
- "node_modules/brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="
- },
- "node_modules/buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
"node_modules/bytestreamjs": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz",
"integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==",
+ "license": "BSD-3-Clause",
"engines": {
"node": ">=6.0.0"
}
@@ -1752,24 +1771,35 @@
"node": ">=6"
}
},
- "node_modules/cbor": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/cbor/-/cbor-4.3.0.tgz",
- "integrity": "sha512-CvzaxQlaJVa88sdtTWvLJ++MbdtPHtZOBBNjm7h3YKUHILMs9nQyD4AC6hvFZy7GBVB3I6bRibJcxeHydyT2IQ==",
+ "node_modules/cbor-extract": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.2.tgz",
+ "integrity": "sha512-hlSxxI9XO2yQfe9g6msd3g4xCfDqK5T5P0fRMLuaLHhxn4ViPrm+a+MUfhrvH2W962RGxcBwEGzLQyjbDG1gng==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "bignumber.js": "^9.0.0",
- "commander": "^3.0.0",
- "json-text-sequence": "^0.1",
- "nofilter": "^1.0.3"
+ "node-gyp-build-optional-packages": "5.1.1"
},
"bin": {
- "cbor2comment": "bin/cbor2comment",
- "cbor2diag": "bin/cbor2diag",
- "cbor2json": "bin/cbor2json",
- "json2cbor": "bin/json2cbor"
+ "download-cbor-prebuilds": "bin/download-prebuilds.js"
},
- "engines": {
- "node": ">=6.0.0"
+ "optionalDependencies": {
+ "@cbor-extract/cbor-extract-darwin-arm64": "2.2.2",
+ "@cbor-extract/cbor-extract-darwin-x64": "2.2.2",
+ "@cbor-extract/cbor-extract-linux-arm": "2.2.2",
+ "@cbor-extract/cbor-extract-linux-arm64": "2.2.2",
+ "@cbor-extract/cbor-extract-linux-x64": "2.2.2",
+ "@cbor-extract/cbor-extract-win32-x64": "2.2.2"
+ }
+ },
+ "node_modules/cbor-x": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.4.tgz",
+ "integrity": "sha512-UGKHjp6RHC6QuZ2yy5LCKm7MojM4716DwoSaqwQpaH4DvZvbBTGcoDNTiG9Y2lByXZYFEs9WRkS5tLl96IrF1Q==",
+ "license": "MIT",
+ "optionalDependencies": {
+ "cbor-extract": "^2.2.2"
}
},
"node_modules/chalk": {
@@ -1870,11 +1900,6 @@
"integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true
},
- "node_modules/commander": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
- "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow=="
- },
"node_modules/compare-func": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
@@ -1921,14 +1946,6 @@
"node": ">=16"
}
},
- "node_modules/cose-to-jwk": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/cose-to-jwk/-/cose-to-jwk-1.1.0.tgz",
- "integrity": "sha512-DbR/XPptfo+kcoA77jWPTe4JS0MrpOXAg0sgVr2FeZMnTGGpppOL072e2hgPHTVbSoMkt5l0qDv/k2xCn+79Cg==",
- "dependencies": {
- "cbor": "^4.0.0"
- }
- },
"node_modules/cosmiconfig": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
@@ -2125,10 +2142,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/delimit-stream": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz",
- "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ=="
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
},
"node_modules/dijkstrajs": {
"version": "1.0.2",
@@ -2175,20 +2197,6 @@
"node": ">= 0.4"
}
},
- "node_modules/elliptic": {
- "version": "6.6.1",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz",
- "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==",
- "dependencies": {
- "bn.js": "^4.11.9",
- "brorand": "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- "inherits": "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -2384,11 +2392,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/es6-promise": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
- "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
- },
"node_modules/escalade": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
@@ -2799,19 +2802,22 @@
"dev": true
},
"node_modules/fido2-lib": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/fido2-lib/-/fido2-lib-2.8.3.tgz",
- "integrity": "sha512-VBp8jiqujf+1jVZfGDy2qBN8IRQLPuhbDdFSBvDD5/4fRWnHUOuHQGMKcnWAnAkDWw98in0OWhIxa4WJPrFPuw==",
+ "version": "3.5.9",
+ "resolved": "https://registry.npmjs.org/fido2-lib/-/fido2-lib-3.5.9.tgz",
+ "integrity": "sha512-OfiX3VetTaoiuA9Bk8QnIdDVEOyZyR8m6JE++9zLQ3sbpsQN8thaJoLHcDi770cOKGtzvSH49mp2njtXUm6S7w==",
+ "license": "MIT",
"dependencies": {
- "@peculiar/webcrypto": "^1.2.0",
- "asn1js": "^2.0.18",
- "cbor": "^4.0.0",
- "cose-to-jwk": "^1.1.0",
- "jwk-to-pem": "^2.0.5",
- "node-jose": "^2.1.0",
- "pkijs": "=2.1.58",
- "psl": "^1.1.24",
- "pvutils": "^1.0.17"
+ "@hexagon/base64": "^2.0.4",
+ "@peculiar/webcrypto": "~1.5.0",
+ "asn1js": "~3.0.7",
+ "cbor-x": "~1.6.3",
+ "jose": "^6.2.1",
+ "pkijs": "~3.3.3",
+ "punycode.js": "^2.3.1",
+ "tldts": "~7.0.25"
+ },
+ "engines": {
+ "node": ">=10"
}
},
"node_modules/file-entry-cache": {
@@ -3178,15 +3184,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -3200,16 +3197,6 @@
"node": ">= 0.4"
}
},
- "node_modules/hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
- "dependencies": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
"node_modules/human-signals": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
@@ -3234,25 +3221,6 @@
"url": "https://github.com/sponsors/typicode"
}
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -3315,11 +3283,6 @@
"node": ">=8"
}
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
"node_modules/ini": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
@@ -3809,6 +3772,15 @@
"jiti": "bin/jiti.js"
}
},
+ "node_modules/jose": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz",
+ "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -3851,14 +3823,6 @@
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true
},
- "node_modules/json-text-sequence": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz",
- "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==",
- "dependencies": {
- "delimit-stream": "0.1.0"
- }
- },
"node_modules/json5": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
@@ -3897,16 +3861,6 @@
"node": "*"
}
},
- "node_modules/jwk-to-pem": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.5.tgz",
- "integrity": "sha512-L90jwellhO8jRKYwbssU9ifaMVqajzj3fpRjDKcsDzrslU9syRbFqfkXtT4B89HYAap+xsxNcxgBSB09ig+a7A==",
- "dependencies": {
- "asn1.js": "^5.3.0",
- "elliptic": "^6.5.4",
- "safe-buffer": "^5.0.1"
- }
- },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -4027,11 +3981,6 @@
"node": ">=8"
}
},
- "node_modules/lodash": {
- "version": "4.17.23",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
- "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="
- },
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
@@ -4151,11 +4100,6 @@
"node": ">=8"
}
},
- "node_modules/long": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
- "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
- },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -4214,16 +4158,6 @@
"node": ">=6"
}
},
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- },
- "node_modules/minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="
- },
"node_modules/minimatch": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
@@ -4257,36 +4191,19 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
- "node_modules/node-forge": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz",
- "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==",
- "engines": {
- "node": ">= 6.13.0"
- }
- },
- "node_modules/node-jose": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz",
- "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==",
+ "node_modules/node-gyp-build-optional-packages": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz",
+ "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==",
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "base64url": "^3.0.1",
- "buffer": "^6.0.3",
- "es6-promise": "^4.2.8",
- "lodash": "^4.17.21",
- "long": "^5.2.0",
- "node-forge": "^1.2.1",
- "pako": "^2.0.4",
- "process": "^0.11.10",
- "uuid": "^9.0.0"
- }
- },
- "node_modules/nofilter": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz",
- "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==",
- "engines": {
- "node": ">=8"
+ "detect-libc": "^2.0.1"
+ },
+ "bin": {
+ "node-gyp-build-optional-packages": "bin.js",
+ "node-gyp-build-optional-packages-optional": "optional.js",
+ "node-gyp-build-optional-packages-test": "build-test.js"
}
},
"node_modules/normalize-path": {
@@ -4522,11 +4439,6 @@
"node": ">=6"
}
},
- "node_modules/pako": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
- "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
- },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -4632,16 +4544,20 @@
}
},
"node_modules/pkijs": {
- "version": "2.1.58",
- "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-2.1.58.tgz",
- "integrity": "sha512-HEcJ4SbZNdyB7Jb1G7Ot3Y/gd7kZyTDJBMIIZOFselrKrCouhGbQu4rm9Lg8bumBACckq724G9uNsZbNJ6d2gw==",
- "dependencies": {
- "asn1js": "latest",
- "bytestreamjs": "latest",
- "pvutils": "latest"
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz",
+ "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@noble/hashes": "1.4.0",
+ "asn1js": "^3.0.6",
+ "bytestreamjs": "^2.0.1",
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.3",
+ "tslib": "^2.8.1"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=16.0.0"
}
},
"node_modules/please-upgrade-node": {
@@ -4680,19 +4596,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "engines": {
- "node": ">= 0.6.0"
- }
- },
- "node_modules/psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
- },
"node_modules/pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -4712,20 +4615,31 @@
"node": ">=6"
}
},
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/pvtsutils": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.2.tgz",
- "integrity": "sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==",
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz",
+ "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==",
+ "license": "MIT",
"dependencies": {
- "tslib": "^2.4.0"
+ "tslib": "^2.8.1"
}
},
"node_modules/pvutils": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz",
- "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz",
+ "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==",
+ "license": "MIT",
"engines": {
- "node": ">=6.0.0"
+ "node": ">=16.0.0"
}
},
"node_modules/qrcode": {
@@ -4889,25 +4803,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
"node_modules/safe-push-apply": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
@@ -4943,11 +4838,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
"node_modules/semver": {
"version": "7.6.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
@@ -5343,6 +5233,24 @@
"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
"dev": true
},
+ "node_modules/tldts": {
+ "version": "7.0.32",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.32.tgz",
+ "integrity": "sha512-5eDV0tK2NhLAAqBeXDAQ36+EwuStd1HbsSOnGsp+JbExITnExcALLL5M1kTH8gjDYN5QvwmUWimE3GoMZ2A7xQ==",
+ "license": "MIT",
+ "dependencies": {
+ "tldts-core": "^7.0.32"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
+ },
+ "node_modules/tldts-core": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.0.tgz",
+ "integrity": "sha512-/mb9kRld+x1sIMXxWNOAp5m6C+D4GrAORWlJkOJ5dElvxdN1eutz/o7qHLp9gFvDF4Y3/L2xeScoxz6AbEo8rQ==",
+ "license": "MIT"
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -5369,9 +5277,10 @@
}
},
"node_modules/tslib": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
- "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
},
"node_modules/type-check": {
"version": "0.4.0",
@@ -5528,37 +5437,17 @@
"punycode": "^2.1.0"
}
},
- "node_modules/uuid": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
- "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
"node_modules/webcrypto-core": {
- "version": "1.7.6",
- "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.6.tgz",
- "integrity": "sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA==",
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz",
+ "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==",
+ "license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.1.6",
+ "@peculiar/asn1-schema": "^2.7.0",
"@peculiar/json-schema": "^1.1.12",
- "asn1js": "^3.0.1",
- "pvtsutils": "^1.3.2",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/webcrypto-core/node_modules/asn1js": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz",
- "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==",
- "dependencies": {
- "pvtsutils": "^1.3.2",
- "pvutils": "^1.1.3",
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=12.0.0"
+ "@peculiar/utils": "^2.0.2",
+ "asn1js": "^3.0.10",
+ "tslib": "^2.8.1"
}
},
"node_modules/which": {
@@ -5861,6 +5750,42 @@
}
}
},
+ "@cbor-extract/cbor-extract-darwin-arm64": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.2.tgz",
+ "integrity": "sha512-ZKZ/F8US7JR92J4DMct6cLW/Y66o2K576+zjlEN/MevH70bFIsB10wkZEQPLzl2oNh2SMGy55xpJ9JoBRl5DOA==",
+ "optional": true
+ },
+ "@cbor-extract/cbor-extract-darwin-x64": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.2.tgz",
+ "integrity": "sha512-32b1mgc+P61Js+KW9VZv/c+xRw5EfmOcPx990JbCBSkYJFY0l25VinvyyWfl+3KjibQmAcYwmyzKF9J4DyKP/Q==",
+ "optional": true
+ },
+ "@cbor-extract/cbor-extract-linux-arm": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.2.tgz",
+ "integrity": "sha512-tNg0za41TpQfkhWjptD+0gSD2fggMiDCSacuIeELyb2xZhr7PrhPe5h66Jc67B/5dmpIhI2QOUtv4SBsricyYQ==",
+ "optional": true
+ },
+ "@cbor-extract/cbor-extract-linux-arm64": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.2.tgz",
+ "integrity": "sha512-wfqgzqCAy/Vn8i6WVIh7qZd0DdBFaWBjPdB6ma+Wihcjv0gHqD/mw3ouVv7kbbUNrab6dKEx/w3xQZEdeXIlzg==",
+ "optional": true
+ },
+ "@cbor-extract/cbor-extract-linux-x64": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.2.tgz",
+ "integrity": "sha512-rpiLnVEsqtPJ+mXTdx1rfz4RtUGYIUg2rUAZgd1KjiC1SehYUSkJN7Yh+aVfSjvCGtVP0/bfkQkXpPXKbmSUaA==",
+ "optional": true
+ },
+ "@cbor-extract/cbor-extract-win32-x64": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.2.tgz",
+ "integrity": "sha512-dI+9P7cfWxkTQ+oE+7Aa6onEn92PHgfWXZivjNheCRmTBDBf2fx6RyTi0cmgpYLnD1KLZK9ZYrMxaPZ4oiXhGA==",
+ "optional": true
+ },
"@commitlint/cli": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz",
@@ -6498,10 +6423,10 @@
"levn": "^0.4.1"
}
},
- "@github/webauthn-json": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/@github/webauthn-json/-/webauthn-json-0.5.7.tgz",
- "integrity": "sha512-SUYsttDxFSvWvvJssJpwzjmRCqYfdfqC9VCmAHQYfdKCVelyJteCHo9/lK1CB72mx/jrl6cFNY08aua4J2jIyg=="
+ "@hexagon/base64": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@hexagon/base64/-/base64-2.0.4.tgz",
+ "integrity": "sha512-H/ZY6rGyaEuk0mwQgZ3BVi9hMjFTYpBNFbmtOuec/pPibuGhCMXd8fGtwBaO0h44FkWMurysMsDrpkJsBRmoWQ=="
},
"@humanfs/core": {
"version": "0.19.1",
@@ -6539,26 +6464,19 @@
"integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
"dev": true
},
+ "@noble/hashes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="
+ },
"@peculiar/asn1-schema": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz",
- "integrity": "sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz",
+ "integrity": "sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==",
"requires": {
- "asn1js": "^3.0.5",
- "pvtsutils": "^1.3.2",
- "tslib": "^2.4.0"
- },
- "dependencies": {
- "asn1js": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz",
- "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==",
- "requires": {
- "pvtsutils": "^1.3.2",
- "pvutils": "^1.1.3",
- "tslib": "^2.4.0"
- }
- }
+ "@peculiar/utils": "^2.0.2",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
}
},
"@peculiar/json-schema": {
@@ -6569,16 +6487,24 @@
"tslib": "^2.0.0"
}
},
+ "@peculiar/utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz",
+ "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==",
+ "requires": {
+ "tslib": "^2.8.1"
+ }
+ },
"@peculiar/webcrypto": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz",
- "integrity": "sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz",
+ "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==",
"requires": {
- "@peculiar/asn1-schema": "^2.3.0",
+ "@peculiar/asn1-schema": "^2.3.8",
"@peculiar/json-schema": "^1.1.12",
- "pvtsutils": "^1.3.2",
- "tslib": "^2.4.1",
- "webcrypto-core": "^1.7.4"
+ "pvtsutils": "^1.3.5",
+ "tslib": "^2.6.2",
+ "webcrypto-core": "^1.8.0"
}
},
"@rtsao/scc": {
@@ -6823,23 +6749,14 @@
"is-array-buffer": "^3.0.4"
}
},
- "asn1.js": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
- "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
- "requires": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "safer-buffer": "^2.1.0"
- }
- },
"asn1js": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.4.0.tgz",
- "integrity": "sha512-PvZC0FMyMut8aOnR2jAEGSkmRtHIUYPe9amUEnGjr9TdnUmsfoOkjrvUkOEU9mzpYBR1HyO9bF+8U1cLTMMHhQ==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz",
+ "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==",
"requires": {
- "pvutils": "^1.1.3"
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.5",
+ "tslib": "^2.8.1"
}
},
"astral-regex": {
@@ -6876,26 +6793,11 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
- },
"base64url": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
"integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A=="
},
- "bignumber.js": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz",
- "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig=="
- },
- "bn.js": {
- "version": "4.12.3",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz",
- "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="
- },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -6915,20 +6817,6 @@
"fill-range": "^7.1.1"
}
},
- "brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="
- },
- "buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
"bytestreamjs": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz",
@@ -6980,15 +6868,27 @@
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
},
- "cbor": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/cbor/-/cbor-4.3.0.tgz",
- "integrity": "sha512-CvzaxQlaJVa88sdtTWvLJ++MbdtPHtZOBBNjm7h3YKUHILMs9nQyD4AC6hvFZy7GBVB3I6bRibJcxeHydyT2IQ==",
+ "cbor-extract": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.2.tgz",
+ "integrity": "sha512-hlSxxI9XO2yQfe9g6msd3g4xCfDqK5T5P0fRMLuaLHhxn4ViPrm+a+MUfhrvH2W962RGxcBwEGzLQyjbDG1gng==",
+ "optional": true,
+ "requires": {
+ "@cbor-extract/cbor-extract-darwin-arm64": "2.2.2",
+ "@cbor-extract/cbor-extract-darwin-x64": "2.2.2",
+ "@cbor-extract/cbor-extract-linux-arm": "2.2.2",
+ "@cbor-extract/cbor-extract-linux-arm64": "2.2.2",
+ "@cbor-extract/cbor-extract-linux-x64": "2.2.2",
+ "@cbor-extract/cbor-extract-win32-x64": "2.2.2",
+ "node-gyp-build-optional-packages": "5.1.1"
+ }
+ },
+ "cbor-x": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.4.tgz",
+ "integrity": "sha512-UGKHjp6RHC6QuZ2yy5LCKm7MojM4716DwoSaqwQpaH4DvZvbBTGcoDNTiG9Y2lByXZYFEs9WRkS5tLl96IrF1Q==",
"requires": {
- "bignumber.js": "^9.0.0",
- "commander": "^3.0.0",
- "json-text-sequence": "^0.1",
- "nofilter": "^1.0.3"
+ "cbor-extract": "^2.2.2"
}
},
"chalk": {
@@ -7067,11 +6967,6 @@
"integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true
},
- "commander": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
- "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow=="
- },
"compare-func": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
@@ -7109,14 +7004,6 @@
"split2": "^4.0.0"
}
},
- "cose-to-jwk": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/cose-to-jwk/-/cose-to-jwk-1.1.0.tgz",
- "integrity": "sha512-DbR/XPptfo+kcoA77jWPTe4JS0MrpOXAg0sgVr2FeZMnTGGpppOL072e2hgPHTVbSoMkt5l0qDv/k2xCn+79Cg==",
- "requires": {
- "cbor": "^4.0.0"
- }
- },
"cosmiconfig": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
@@ -7241,10 +7128,11 @@
"object-keys": "^1.1.1"
}
},
- "delimit-stream": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz",
- "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ=="
+ "detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "optional": true
},
"dijkstrajs": {
"version": "1.0.2",
@@ -7282,20 +7170,6 @@
"gopd": "^1.2.0"
}
},
- "elliptic": {
- "version": "6.6.1",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz",
- "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==",
- "requires": {
- "bn.js": "^4.11.9",
- "brorand": "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- "inherits": "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -7458,11 +7332,6 @@
"is-symbol": "^1.0.4"
}
},
- "es6-promise": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
- "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
- },
"escalade": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
@@ -7764,19 +7633,18 @@
"dev": true
},
"fido2-lib": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/fido2-lib/-/fido2-lib-2.8.3.tgz",
- "integrity": "sha512-VBp8jiqujf+1jVZfGDy2qBN8IRQLPuhbDdFSBvDD5/4fRWnHUOuHQGMKcnWAnAkDWw98in0OWhIxa4WJPrFPuw==",
+ "version": "3.5.9",
+ "resolved": "https://registry.npmjs.org/fido2-lib/-/fido2-lib-3.5.9.tgz",
+ "integrity": "sha512-OfiX3VetTaoiuA9Bk8QnIdDVEOyZyR8m6JE++9zLQ3sbpsQN8thaJoLHcDi770cOKGtzvSH49mp2njtXUm6S7w==",
"requires": {
- "@peculiar/webcrypto": "^1.2.0",
- "asn1js": "^2.0.18",
- "cbor": "^4.0.0",
- "cose-to-jwk": "^1.1.0",
- "jwk-to-pem": "^2.0.5",
- "node-jose": "^2.1.0",
- "pkijs": "=2.1.58",
- "psl": "^1.1.24",
- "pvutils": "^1.0.17"
+ "@hexagon/base64": "^2.0.4",
+ "@peculiar/webcrypto": "~1.5.0",
+ "asn1js": "~3.0.7",
+ "cbor-x": "~1.6.3",
+ "jose": "^6.2.1",
+ "pkijs": "~3.3.3",
+ "punycode.js": "^2.3.1",
+ "tldts": "~7.0.25"
}
},
"file-entry-cache": {
@@ -8026,15 +7894,6 @@
"has-symbols": "^1.0.3"
}
},
- "hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
"hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -8045,16 +7904,6 @@
"function-bind": "^1.1.2"
}
},
- "hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
- "requires": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
"human-signals": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
@@ -8067,11 +7916,6 @@
"integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
"dev": true
},
- "ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
- },
"ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -8114,11 +7958,6 @@
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true
},
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
"ini": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
@@ -8440,6 +8279,11 @@
"integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
"dev": true
},
+ "jose": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz",
+ "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw=="
+ },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -8479,14 +8323,6 @@
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true
},
- "json-text-sequence": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz",
- "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==",
- "requires": {
- "delimit-stream": "0.1.0"
- }
- },
"json5": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
@@ -8513,16 +8349,6 @@
"through": ">=2.2.7 <3"
}
},
- "jwk-to-pem": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.5.tgz",
- "integrity": "sha512-L90jwellhO8jRKYwbssU9ifaMVqajzj3fpRjDKcsDzrslU9syRbFqfkXtT4B89HYAap+xsxNcxgBSB09ig+a7A==",
- "requires": {
- "asn1.js": "^5.3.0",
- "elliptic": "^6.5.4",
- "safe-buffer": "^5.0.1"
- }
- },
"keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -8616,11 +8442,6 @@
"p-locate": "^4.1.0"
}
},
- "lodash": {
- "version": "4.17.23",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
- "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="
- },
"lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
@@ -8721,11 +8542,6 @@
}
}
},
- "long": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
- "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
- },
"lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -8769,16 +8585,6 @@
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true
},
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- },
- "minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="
- },
"minimatch": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
@@ -8806,32 +8612,15 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
- "node-forge": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz",
- "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg=="
- },
- "node-jose": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz",
- "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==",
+ "node-gyp-build-optional-packages": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz",
+ "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==",
+ "optional": true,
"requires": {
- "base64url": "^3.0.1",
- "buffer": "^6.0.3",
- "es6-promise": "^4.2.8",
- "lodash": "^4.17.21",
- "long": "^5.2.0",
- "node-forge": "^1.2.1",
- "pako": "^2.0.4",
- "process": "^0.11.10",
- "uuid": "^9.0.0"
+ "detect-libc": "^2.0.1"
}
},
- "nofilter": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz",
- "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA=="
- },
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -8993,11 +8782,6 @@
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
},
- "pako": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
- "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
- },
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -9070,13 +8854,16 @@
"integrity": "sha512-7W7wTrE/NsY8xv/DTGjwNIyNah81EQH0MWcTzrHL6pOpMocOGZc0Mbdz9aXxSrp+U0mSmkU8jrNCDCfUs3sOBg=="
},
"pkijs": {
- "version": "2.1.58",
- "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-2.1.58.tgz",
- "integrity": "sha512-HEcJ4SbZNdyB7Jb1G7Ot3Y/gd7kZyTDJBMIIZOFselrKrCouhGbQu4rm9Lg8bumBACckq724G9uNsZbNJ6d2gw==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz",
+ "integrity": "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==",
"requires": {
- "asn1js": "latest",
- "bytestreamjs": "latest",
- "pvutils": "latest"
+ "@noble/hashes": "1.4.0",
+ "asn1js": "^3.0.6",
+ "bytestreamjs": "^2.0.1",
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.3",
+ "tslib": "^2.8.1"
}
},
"please-upgrade-node": {
@@ -9106,16 +8893,6 @@
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true
},
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
- },
- "psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
- },
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -9132,18 +8909,23 @@
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
"dev": true
},
+ "punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="
+ },
"pvtsutils": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.2.tgz",
- "integrity": "sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==",
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz",
+ "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==",
"requires": {
- "tslib": "^2.4.0"
+ "tslib": "^2.8.1"
}
},
"pvutils": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz",
- "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ=="
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz",
+ "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA=="
},
"qrcode": {
"version": "1.5.1",
@@ -9261,11 +9043,6 @@
"isarray": "^2.0.5"
}
},
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- },
"safe-push-apply": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
@@ -9289,11 +9066,6 @@
"is-regex": "^1.2.1"
}
},
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
"semver": {
"version": "7.6.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
@@ -9577,6 +9349,19 @@
"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
"dev": true
},
+ "tldts": {
+ "version": "7.0.32",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.32.tgz",
+ "integrity": "sha512-5eDV0tK2NhLAAqBeXDAQ36+EwuStd1HbsSOnGsp+JbExITnExcALLL5M1kTH8gjDYN5QvwmUWimE3GoMZ2A7xQ==",
+ "requires": {
+ "tldts-core": "^7.0.32"
+ }
+ },
+ "tldts-core": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.0.tgz",
+ "integrity": "sha512-/mb9kRld+x1sIMXxWNOAp5m6C+D4GrAORWlJkOJ5dElvxdN1eutz/o7qHLp9gFvDF4Y3/L2xeScoxz6AbEo8rQ=="
+ },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -9600,9 +9385,9 @@
}
},
"tslib": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
- "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
},
"type-check": {
"version": "0.4.0",
@@ -9716,33 +9501,16 @@
"punycode": "^2.1.0"
}
},
- "uuid": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
- "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
- },
"webcrypto-core": {
- "version": "1.7.6",
- "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.6.tgz",
- "integrity": "sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA==",
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz",
+ "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==",
"requires": {
- "@peculiar/asn1-schema": "^2.1.6",
+ "@peculiar/asn1-schema": "^2.7.0",
"@peculiar/json-schema": "^1.1.12",
- "asn1js": "^3.0.1",
- "pvtsutils": "^1.3.2",
- "tslib": "^2.4.0"
- },
- "dependencies": {
- "asn1js": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz",
- "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==",
- "requires": {
- "pvtsutils": "^1.3.2",
- "pvutils": "^1.1.3",
- "tslib": "^2.4.0"
- }
- }
+ "@peculiar/utils": "^2.0.2",
+ "asn1js": "^3.0.10",
+ "tslib": "^2.8.1"
}
},
"which": {
diff --git a/package.json b/package.json
index 03cf845..636a559 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,7 @@
"arraybuffer-to-string": "^1.0.2",
"async": "^3.2.0",
"base64url": "^3.0.1",
- "fido2-lib": "^2.8.1",
+ "fido2-lib": "^3.5.8",
"lru-cache": "^5.1.1",
"notp": "^2.0.3",
"passport-totp": "0.0.2",
From 474043eaed0d42cab9ec25771ced3f3643d2f552 Mon Sep 17 00:00:00 2001
From: Julian Lam
Date: Mon, 25 May 2026 11:40:12 -0400
Subject: [PATCH 03/10] fix: fido2-lib upgrade breakages, broken tpl
---
library.js | 30 +-
static/lib/authn.js | 55 +-
static/lib/settings.js | 34 +-
static/templates/login-authn.tpl | 14 +-
yarn.lock | 1446 ++++++++++++++++++++++++------
5 files changed, 1276 insertions(+), 303 deletions(-)
diff --git a/library.js b/library.js
index 361782a..9063b02 100644
--- a/library.js
+++ b/library.js
@@ -156,7 +156,19 @@ plugin.addRoutes = async ({ router, middleware, helpers }) => {
origin: `${nconf.get('url_parsed').protocol}//${nconf.get('url_parsed').host}`,
factor: 'second',
};
- req.body.rawId = Uint8Array.from(atob(base64url.toBase64(req.body.rawId)), c => c.charCodeAt(0)).buffer;
+ // fido2-lib 3.x expects rawId/id as ArrayBuffer, attestationObject/clientDataJSON as base64url strings
+ if (typeof req.body.rawId === 'string') {
+ const base64 = req.body.rawId.replace(/-/g, '+').replace(/_/g, '/');
+ const pad = base64.length % 4 ? '='.repeat(4 - (base64.length % 4)) : '';
+ const binary = atob(base64 + pad);
+ req.body.rawId = Uint8Array.from(binary, c => c.charCodeAt(0)).buffer;
+ }
+ if (typeof req.body.id === 'string') {
+ const base64 = req.body.id.replace(/-/g, '+').replace(/_/g, '/');
+ const pad = base64.length % 4 ? '='.repeat(4 - (base64.length % 4)) : '';
+ const binary = atob(base64 + pad);
+ req.body.id = Uint8Array.from(binary, c => c.charCodeAt(0)).buffer;
+ }
const regResult = await plugin._f2l.attestationResult(req.body, attestationExpectations);
const deviceName = typeof req.body.deviceName === 'string' && req.body.deviceName.trim() ? req.body.deviceName.trim() : undefined;
plugin.saveAuthn(req.uid, regResult.authnrData, deviceName);
@@ -179,9 +191,19 @@ plugin.addRoutes = async ({ router, middleware, helpers }) => {
userHandle: null,
};
- req.body.authResponse.rawId =
- Uint8Array.from(atob(base64url.toBase64(req.body.authResponse.rawId)), c => c.charCodeAt(0)).buffer;
- req.body.authResponse.response.userHandle = undefined;
+ // fido2-lib 3.x expects rawId/id as ArrayBuffer, authenticatorData/clientDataJSON as base64url strings
+ if (typeof req.body.authResponse.rawId === 'string') {
+ const base64 = req.body.authResponse.rawId.replace(/-/g, '+').replace(/_/g, '/');
+ const pad = base64.length % 4 ? '='.repeat(4 - (base64.length % 4)) : '';
+ const binary = atob(base64 + pad);
+ req.body.authResponse.rawId = Uint8Array.from(binary, c => c.charCodeAt(0)).buffer;
+ }
+ if (typeof req.body.authResponse.id === 'string') {
+ const base64 = req.body.authResponse.id.replace(/-/g, '+').replace(/_/g, '/');
+ const pad = base64.length % 4 ? '='.repeat(4 - (base64.length % 4)) : '';
+ const binary = atob(base64 + pad);
+ req.body.authResponse.id = Uint8Array.from(binary, c => c.charCodeAt(0)).buffer;
+ }
const authnResult = await plugin._f2l.assertionResult(req.body.authResponse, expectations);
const count = authnResult.authnrData.get('counter');
diff --git a/static/lib/authn.js b/static/lib/authn.js
index 4d17684..20ebbac 100644
--- a/static/lib/authn.js
+++ b/static/lib/authn.js
@@ -1,6 +1,24 @@
'use strict';
define('forum/login-authn', ['api', 'alerts', 'hooks'], function (api, alerts, hooks) {
+ // Encode ArrayBuffer/Uint8Array to base64url for JSON transmission
+ function arrayBufferToBase64url(buffer) {
+ if (!buffer) return '';
+ const bytes = new Uint8Array(buffer);
+ let binary = '';
+ bytes.forEach(b => { binary += String.fromCharCode(b); });
+ const base64 = btoa(binary);
+ return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
+ }
+
+ // Decode base64url strings to Uint8Array for WebAuthn API
+ function base64urlToUint8Array(str) {
+ const base64 = str.replace(/-/g, '+').replace(/_/g, '/');
+ const pad = base64.length % 4 ? '='.repeat(4 - (base64.length % 4)) : '';
+ const binary = atob(base64 + pad);
+ return Uint8Array.from(binary, c => c.charCodeAt(0));
+ }
+
var Plugin = {};
Plugin.init = async () => {
@@ -20,6 +38,7 @@ define('forum/login-authn', ['api', 'alerts', 'hooks'], function (api, alerts, h
// Build assertion options for the selected device only
const authnOptions = JSON.parse(JSON.stringify(ajaxify.data.authnOptions || {}));
+ authnOptions.challenge = base64urlToUint8Array(authnOptions.challenge);
authnOptions.allowCredentials = [{
id: selectedId,
type: 'public-key',
@@ -31,7 +50,21 @@ define('forum/login-authn', ['api', 'alerts', 'hooks'], function (api, alerts, h
signal: abortController.signal,
});
- api.post(`/plugins/2factor/authn/verify${document.location.search}`, { authResponse }).then(({ next }) => {
+ // Encode binary fields for JSON transmission
+ const payload = {
+ authResponse: {
+ id: authResponse.id,
+ rawId: arrayBufferToBase64url(authResponse.rawId),
+ response: {
+ authenticatorData: arrayBufferToBase64url(authResponse.response.authenticatorData),
+ clientDataJSON: arrayBufferToBase64url(authResponse.response.clientDataJSON),
+ signature: arrayBufferToBase64url(authResponse.response.signature),
+ userHandle: arrayBufferToBase64url(authResponse.response.userHandle),
+ },
+ clientExtensionResults: authResponse.getClientExtensionResults(),
+ },
+ };
+ api.post(`/plugins/2factor/authn/verify${document.location.search}`, payload).then(({ next }) => {
ajaxify.go(next.replace(config.relative_path, ''));
}).catch((err) => {
alerts.error(err);
@@ -56,12 +89,28 @@ define('forum/login-authn', ['api', 'alerts', 'hooks'], function (api, alerts, h
abortController.abort();
});
+ const authnOptions = JSON.parse(JSON.stringify(ajaxify.data.authnOptions || {}));
+ authnOptions.challenge = base64urlToUint8Array(authnOptions.challenge);
const authResponse = await navigator.credentials.get({
- publicKey: ajaxify.data.authnOptions,
+ publicKey: authnOptions,
signal: abortController.signal,
});
- api.post(`/plugins/2factor/authn/verify${document.location.search}`, { authResponse }).then(({ next }) => {
+ // Encode binary fields for JSON transmission
+ const payload = {
+ authResponse: {
+ id: authResponse.id,
+ rawId: arrayBufferToBase64url(authResponse.rawId),
+ response: {
+ authenticatorData: arrayBufferToBase64url(authResponse.response.authenticatorData),
+ clientDataJSON: arrayBufferToBase64url(authResponse.response.clientDataJSON),
+ signature: arrayBufferToBase64url(authResponse.response.signature),
+ userHandle: arrayBufferToBase64url(authResponse.response.userHandle),
+ },
+ clientExtensionResults: authResponse.getClientExtensionResults(),
+ },
+ };
+ api.post(`/plugins/2factor/authn/verify${document.location.search}`, payload).then(({ next }) => {
const iconEl = document.getElementById('statusIcon');
iconEl.classList.remove('fa-spinner');
iconEl.classList.remove('fa-spin');
diff --git a/static/lib/settings.js b/static/lib/settings.js
index 86b513c..d4d2fbe 100644
--- a/static/lib/settings.js
+++ b/static/lib/settings.js
@@ -144,6 +144,23 @@ define('forum/account/2factor', ['api', 'alerts', 'bootbox'], function (api, ale
});
};
+ // Decode base64url strings to Uint8Array for WebAuthn API
+ function base64urlToUint8Array(str) {
+ const base64 = str.replace(/-/g, '+').replace(/_/g, '/');
+ const pad = base64.length % 4 ? '='.repeat(4 - (base64.length % 4)) : '';
+ const binary = atob(base64 + pad);
+ return Uint8Array.from(binary, c => c.charCodeAt(0));
+ }
+
+ // Encode ArrayBuffer/Uint8Array to base64url for JSON transmission
+ function arrayBufferToBase64url(buffer) {
+ const bytes = new Uint8Array(buffer);
+ let binary = '';
+ bytes.forEach(b => { binary += String.fromCharCode(b); });
+ const base64 = btoa(binary);
+ return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
+ }
+
Settings.setupAuthn = function () {
const self = this;
self.classList.add('text-muted');
@@ -163,12 +180,27 @@ define('forum/account/2factor', ['api', 'alerts', 'bootbox'], function (api, ale
return;
}
try {
+ // WebAuthn requires user.id and challenge as BufferSource (Uint8Array)
+ request.user.id = base64urlToUint8Array(request.user.id);
+ request.challenge = base64urlToUint8Array(request.challenge);
const response = await navigator.credentials.create({
publicKey: request,
});
modal.modal('hide');
- api.post('/plugins/2factor/authn/register', { ...response, deviceName: deviceName && deviceName.trim() ? deviceName.trim() : undefined }).then(() => {
+ // Encode binary fields for JSON transmission
+ const payload = {
+ id: response.id,
+ rawId: arrayBufferToBase64url(response.rawId),
+ response: {
+ attestationObject: arrayBufferToBase64url(response.response.attestationObject),
+ clientDataJSON: arrayBufferToBase64url(response.response.clientDataJSON),
+ },
+ clientExtensionResults: response.getClientExtensionResults(),
+ deviceName: deviceName && deviceName.trim() ? deviceName.trim() : undefined,
+ };
+
+ api.post('/plugins/2factor/authn/register', payload).then(() => {
alerts.success('[[2factor:authn.success]]');
Settings.renderDevicesList();
ajaxify.refresh();
diff --git a/static/templates/login-authn.tpl b/static/templates/login-authn.tpl
index 261d944..7a1c97b 100644
--- a/static/templates/login-authn.tpl
+++ b/static/templates/login-authn.tpl
@@ -11,13 +11,13 @@
-
+ {{{ if (devices.length != 1) }}}
[[2factor:authn.login.select]]
@@ -27,14 +27,14 @@
[[2factor:choices.back]]
{{{ end }}}
-
+ {{{ else }}}
[[2factor:authn.login.lead]]
[[2factor:authn.login.info]]
-
+ {{{ end }}}
- {{{ if !single && devices.length <= 1 }}}
+ {{{ if (!single && (devices.length == 1)) }}}
[[2factor:choices.back]]
diff --git a/yarn.lock b/yarn.lock
index 7d73b44..ae11aff 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -23,6 +23,11 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
+"@cbor-extract/cbor-extract-linux-x64@2.2.2":
+ version "2.2.2"
+ resolved "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.2.tgz"
+ integrity sha512-rpiLnVEsqtPJ+mXTdx1rfz4RtUGYIUg2rUAZgd1KjiC1SehYUSkJN7Yh+aVfSjvCGtVP0/bfkQkXpPXKbmSUaA==
+
"@commitlint/cli@^19.3.0":
version "19.3.0"
resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz"
@@ -231,7 +236,7 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@eslint/js@9.25.1":
+"@eslint/js@^9.x", "@eslint/js@9.25.1":
version "9.25.1"
resolved "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz"
integrity sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==
@@ -249,10 +254,10 @@
"@eslint/core" "^0.13.0"
levn "^0.4.1"
-"@github/webauthn-json@^0.5.7":
- version "0.5.7"
- resolved "https://registry.npmjs.org/@github/webauthn-json/-/webauthn-json-0.5.7.tgz"
- integrity sha512-SUYsttDxFSvWvvJssJpwzjmRCqYfdfqC9VCmAHQYfdKCVelyJteCHo9/lK1CB72mx/jrl6cFNY08aua4J2jIyg==
+"@hexagon/base64@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/@hexagon/base64/-/base64-2.0.4.tgz"
+ integrity sha512-H/ZY6rGyaEuk0mwQgZ3BVi9hMjFTYpBNFbmtOuec/pPibuGhCMXd8fGtwBaO0h44FkWMurysMsDrpkJsBRmoWQ==
"@humanfs/core@^0.19.1":
version "0.19.1"
@@ -282,14 +287,19 @@
resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz"
integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==
-"@peculiar/asn1-schema@^2.1.6", "@peculiar/asn1-schema@^2.3.0":
- version "2.3.6"
- resolved "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz"
- integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==
+"@noble/hashes@1.4.0":
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz"
+ integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==
+
+"@peculiar/asn1-schema@^2.3.8", "@peculiar/asn1-schema@^2.7.0":
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz"
+ integrity sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==
dependencies:
- asn1js "^3.0.5"
- pvtsutils "^1.3.2"
- tslib "^2.4.0"
+ "@peculiar/utils" "^2.0.2"
+ asn1js "^3.0.6"
+ tslib "^2.8.1"
"@peculiar/json-schema@^1.1.12":
version "1.1.12"
@@ -298,16 +308,36 @@
dependencies:
tslib "^2.0.0"
-"@peculiar/webcrypto@^1.2.0":
- version "1.4.1"
- resolved "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz"
- integrity sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==
+"@peculiar/utils@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz"
+ integrity sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==
dependencies:
- "@peculiar/asn1-schema" "^2.3.0"
+ tslib "^2.8.1"
+
+"@peculiar/webcrypto@~1.5.0":
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz"
+ integrity sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.3.8"
"@peculiar/json-schema" "^1.1.12"
- pvtsutils "^1.3.2"
- tslib "^2.4.1"
- webcrypto-core "^1.7.4"
+ pvtsutils "^1.3.5"
+ tslib "^2.6.2"
+ webcrypto-core "^1.8.0"
+
+"@rtsao/scc@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz"
+ integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
+
+"@stylistic/eslint-plugin-js@4.2.0":
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-4.2.0.tgz"
+ integrity sha512-MiJr6wvyzMYl/wElmj8Jns8zH7Q1w8XoVtm+WM6yDaTrfxryMyb8n0CMxt82fo42RoLIfxAEtM6tmQVxqhk0/A==
+ dependencies:
+ eslint-visitor-keys "^4.2.0"
+ espree "^10.3.0"
"@types/conventional-commits-parser@^5.0.0":
version "5.0.0"
@@ -326,6 +356,11 @@
resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz"
+ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+
"@types/node@*":
version "20.12.12"
resolved "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz"
@@ -338,20 +373,12 @@
resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
-JSONStream@^1.3.5:
- version "1.3.5"
- resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz"
- integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
- dependencies:
- jsonparse "^1.2.0"
- through ">=2.2.7 <3"
-
acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn@^8.14.0:
+"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0:
version "8.14.1"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz"
integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==
@@ -420,77 +447,123 @@ argparse@^2.0.1:
resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz"
+ integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==
+ dependencies:
+ call-bound "^1.0.3"
+ is-array-buffer "^3.0.5"
+
array-ify@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz"
integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==
+array-includes@^3.1.8:
+ version "3.1.8"
+ resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz"
+ integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
+ is-string "^1.0.7"
+
+array.prototype.findlastindex@^1.2.5:
+ version "1.2.6"
+ resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz"
+ integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.4"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.9"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.1.1"
+ es-shim-unscopables "^1.1.0"
+
+array.prototype.flat@^1.3.2:
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz"
+ integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-shim-unscopables "^1.0.2"
+
+array.prototype.flatmap@^1.3.2:
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz"
+ integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-shim-unscopables "^1.0.2"
+
arraybuffer-to-string@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/arraybuffer-to-string/-/arraybuffer-to-string-1.0.2.tgz"
integrity sha512-WbIYlLVmvIAyUBdQRRuyGOJRriOQy9OAsWcyURmsRQp9+g647hdMSS2VFKXbJLVw0daUu06hqwLXm9etVrXI9A==
-asn1.js@^5.3.0:
- version "5.4.1"
- resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz"
- integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
- dependencies:
- bn.js "^4.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
- safer-buffer "^2.1.0"
-
-asn1js@^2.0.18, asn1js@latest:
- version "2.4.0"
- resolved "https://registry.npmjs.org/asn1js/-/asn1js-2.4.0.tgz"
- integrity sha512-PvZC0FMyMut8aOnR2jAEGSkmRtHIUYPe9amUEnGjr9TdnUmsfoOkjrvUkOEU9mzpYBR1HyO9bF+8U1cLTMMHhQ==
- dependencies:
- pvutils "^1.1.3"
-
-asn1js@^3.0.1, asn1js@^3.0.5:
- version "3.0.5"
- resolved "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz"
- integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==
- dependencies:
- pvtsutils "^1.3.2"
- pvutils "^1.1.3"
- tslib "^2.4.0"
+arraybuffer.prototype.slice@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz"
+ integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ is-array-buffer "^3.0.4"
+
+asn1js@^3.0.10, asn1js@^3.0.6, asn1js@~3.0.7:
+ version "3.0.10"
+ resolved "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz"
+ integrity sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==
+ dependencies:
+ pvtsutils "^1.3.6"
+ pvutils "^1.1.5"
+ tslib "^2.8.1"
astral-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz"
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+async-function@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz"
+ integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==
+
async@^3.2.0:
version "3.2.4"
resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz"
integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
+available-typed-arrays@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz"
+ integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+ dependencies:
+ possible-typed-array-names "^1.0.0"
+
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-base64-js@^1.3.1:
- version "1.5.1"
- resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
- integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-
base64url@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz"
integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==
-bignumber.js@^9.0.0:
- version "9.1.1"
- resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz"
- integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==
-
-bn.js@^4.0.0, bn.js@^4.11.9:
- version "4.12.3"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.3.tgz#2cc2c679188eb35b006f2d0d4710bed8437a769e"
- integrity sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==
-
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
@@ -506,24 +579,37 @@ braces@^3.0.3:
dependencies:
fill-range "^7.1.1"
-brorand@^1.1.0:
- version "1.1.0"
- resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
- integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
-
-buffer@^6.0.3:
- version "6.0.3"
- resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz"
- integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
- dependencies:
- base64-js "^1.3.1"
- ieee754 "^1.2.1"
-
-bytestreamjs@latest:
+bytestreamjs@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz"
integrity sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==
+call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz"
+ integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+
+call-bind@^1.0.7, call-bind@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz"
+ integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==
+ dependencies:
+ call-bind-apply-helpers "^1.0.0"
+ es-define-property "^1.0.0"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.2"
+
+call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz"
+ integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ get-intrinsic "^1.3.0"
+
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
@@ -534,15 +620,26 @@ camelcase@^5.0.0:
resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-cbor@^4.0.0:
- version "4.3.0"
- resolved "https://registry.npmjs.org/cbor/-/cbor-4.3.0.tgz"
- integrity sha512-CvzaxQlaJVa88sdtTWvLJ++MbdtPHtZOBBNjm7h3YKUHILMs9nQyD4AC6hvFZy7GBVB3I6bRibJcxeHydyT2IQ==
- dependencies:
- bignumber.js "^9.0.0"
- commander "^3.0.0"
- json-text-sequence "^0.1"
- nofilter "^1.0.3"
+cbor-extract@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.2.tgz"
+ integrity sha512-hlSxxI9XO2yQfe9g6msd3g4xCfDqK5T5P0fRMLuaLHhxn4ViPrm+a+MUfhrvH2W962RGxcBwEGzLQyjbDG1gng==
+ dependencies:
+ node-gyp-build-optional-packages "5.1.1"
+ optionalDependencies:
+ "@cbor-extract/cbor-extract-darwin-arm64" "2.2.2"
+ "@cbor-extract/cbor-extract-darwin-x64" "2.2.2"
+ "@cbor-extract/cbor-extract-linux-arm" "2.2.2"
+ "@cbor-extract/cbor-extract-linux-arm64" "2.2.2"
+ "@cbor-extract/cbor-extract-linux-x64" "2.2.2"
+ "@cbor-extract/cbor-extract-win32-x64" "2.2.2"
+
+cbor-x@~1.6.3:
+ version "1.6.4"
+ resolved "https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.4.tgz"
+ integrity sha512-UGKHjp6RHC6QuZ2yy5LCKm7MojM4716DwoSaqwQpaH4DvZvbBTGcoDNTiG9Y2lByXZYFEs9WRkS5tLl96IrF1Q==
+ optionalDependencies:
+ cbor-extract "^2.2.2"
chalk@^2.0.0:
version "2.4.2"
@@ -618,26 +715,21 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
-color-name@1.1.3:
- version "1.1.3"
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
- integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
-
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
colorette@^2.0.16:
version "2.0.19"
resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz"
integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
-commander@^3.0.0:
- version "3.0.2"
- resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz"
- integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
-
commander@^6.2.0:
version "6.2.1"
resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz"
@@ -668,18 +760,11 @@ conventional-commits-parser@^5.0.0:
resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz"
integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==
dependencies:
- JSONStream "^1.3.5"
is-text-path "^2.0.0"
+ JSONStream "^1.3.5"
meow "^12.0.1"
split2 "^4.0.0"
-cose-to-jwk@^1.1.0:
- version "1.1.0"
- resolved "https://registry.npmjs.org/cose-to-jwk/-/cose-to-jwk-1.1.0.tgz"
- integrity sha512-DbR/XPptfo+kcoA77jWPTe4JS0MrpOXAg0sgVr2FeZMnTGGpppOL072e2hgPHTVbSoMkt5l0qDv/k2xCn+79Cg==
- dependencies:
- cbor "^4.0.0"
-
cosmiconfig-typescript-loader@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz"
@@ -698,7 +783,7 @@ cosmiconfig@^7.0.0:
path-type "^4.0.0"
yaml "^1.10.0"
-cosmiconfig@^9.0.0:
+cosmiconfig@^9.0.0, cosmiconfig@>=8.2:
version "9.0.0"
resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz"
integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==
@@ -722,6 +807,40 @@ dargs@^8.0.0:
resolved "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz"
integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==
+data-view-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz"
+ integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.2"
+
+data-view-byte-length@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz"
+ integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.2"
+
+data-view-byte-offset@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz"
+ integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
debug@^4.2.0, debug@^4.3.1, debug@^4.3.2:
version "4.3.4"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
@@ -744,16 +863,41 @@ deep-is@^0.1.3:
resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
-delimit-stream@0.1.0:
- version "0.1.0"
- resolved "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz"
- integrity sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+detect-libc@^2.0.1:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz"
+ integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==
dijkstrajs@^1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz"
integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
dot-prop@^5.1.0:
version "5.3.0"
resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz"
@@ -761,18 +905,14 @@ dot-prop@^5.1.0:
dependencies:
is-obj "^2.0.0"
-elliptic@^6.5.4:
- version "6.6.1"
- resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz"
- integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==
+dunder-proto@^1.0.0, dunder-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz"
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
dependencies:
- bn.js "^4.11.9"
- brorand "^1.1.0"
- hash.js "^1.0.0"
- hmac-drbg "^1.0.1"
- inherits "^2.0.4"
- minimalistic-assert "^1.0.1"
- minimalistic-crypto-utils "^1.0.1"
+ call-bind-apply-helpers "^1.0.1"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
emoji-regex@^8.0.0:
version "8.0.0"
@@ -791,7 +931,7 @@ end-of-stream@^1.1.0:
dependencies:
once "^1.4.0"
-enquirer@^2.3.6:
+enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3":
version "2.3.6"
resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz"
integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
@@ -810,10 +950,105 @@ error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
-es6-promise@^4.2.8:
- version "4.2.8"
- resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz"
- integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9:
+ version "1.23.9"
+ resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz"
+ integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==
+ dependencies:
+ array-buffer-byte-length "^1.0.2"
+ arraybuffer.prototype.slice "^1.0.4"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ data-view-buffer "^1.0.2"
+ data-view-byte-length "^1.0.2"
+ data-view-byte-offset "^1.0.1"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-set-tostringtag "^2.1.0"
+ es-to-primitive "^1.3.0"
+ function.prototype.name "^1.1.8"
+ get-intrinsic "^1.2.7"
+ get-proto "^1.0.0"
+ get-symbol-description "^1.1.0"
+ globalthis "^1.0.4"
+ gopd "^1.2.0"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ internal-slot "^1.1.0"
+ is-array-buffer "^3.0.5"
+ is-callable "^1.2.7"
+ is-data-view "^1.0.2"
+ is-regex "^1.2.1"
+ is-shared-array-buffer "^1.0.4"
+ is-string "^1.1.1"
+ is-typed-array "^1.1.15"
+ is-weakref "^1.1.0"
+ math-intrinsics "^1.1.0"
+ object-inspect "^1.13.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.7"
+ own-keys "^1.0.1"
+ regexp.prototype.flags "^1.5.3"
+ safe-array-concat "^1.1.3"
+ safe-push-apply "^1.0.0"
+ safe-regex-test "^1.1.0"
+ set-proto "^1.0.0"
+ string.prototype.trim "^1.2.10"
+ string.prototype.trimend "^1.0.9"
+ string.prototype.trimstart "^1.0.8"
+ typed-array-buffer "^1.0.3"
+ typed-array-byte-length "^1.0.3"
+ typed-array-byte-offset "^1.0.4"
+ typed-array-length "^1.0.7"
+ unbox-primitive "^1.1.0"
+ which-typed-array "^1.1.18"
+
+es-define-property@^1.0.0, es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz"
+ integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz"
+ integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
+ dependencies:
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
+
+es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz"
+ integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==
+ dependencies:
+ hasown "^2.0.2"
+
+es-to-primitive@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz"
+ integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==
+ dependencies:
+ is-callable "^1.2.7"
+ is-date-object "^1.0.5"
+ is-symbol "^1.0.4"
escalade@^3.1.1:
version "3.1.2"
@@ -835,6 +1070,47 @@ eslint-config-nodebb@^1.1.4:
resolved "https://registry.npmjs.org/eslint-config-nodebb/-/eslint-config-nodebb-1.1.4.tgz"
integrity sha512-XNNHnYRcg1/8CpjLneZ+4NX6cq6HEiGyvyGpiYPQ5sYax5Qmg21mO71bBjdsrcbB1if4UyF7pYOkOKnK+ZyONg==
+eslint-import-resolver-node@^0.3.9:
+ version "0.3.9"
+ resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz"
+ integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==
+ dependencies:
+ debug "^3.2.7"
+ is-core-module "^2.13.0"
+ resolve "^1.22.4"
+
+eslint-module-utils@^2.12.0:
+ version "2.12.0"
+ resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz"
+ integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==
+ dependencies:
+ debug "^3.2.7"
+
+eslint-plugin-import@2.x:
+ version "2.31.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz"
+ integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==
+ dependencies:
+ "@rtsao/scc" "^1.1.0"
+ array-includes "^3.1.8"
+ array.prototype.findlastindex "^1.2.5"
+ array.prototype.flat "^1.3.2"
+ array.prototype.flatmap "^1.3.2"
+ debug "^3.2.7"
+ doctrine "^2.1.0"
+ eslint-import-resolver-node "^0.3.9"
+ eslint-module-utils "^2.12.0"
+ hasown "^2.0.2"
+ is-core-module "^2.15.1"
+ is-glob "^4.0.3"
+ minimatch "^3.1.2"
+ object.fromentries "^2.0.8"
+ object.groupby "^1.0.3"
+ object.values "^1.2.0"
+ semver "^6.3.1"
+ string.prototype.trimend "^1.0.8"
+ tsconfig-paths "^3.15.0"
+
eslint-scope@^8.3.0:
version "8.3.0"
resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz"
@@ -853,7 +1129,7 @@ eslint-visitor-keys@^4.2.0:
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz"
integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
-eslint@9.25.1:
+"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@>=9.0.0, eslint@9.25.1:
version "9.25.1"
resolved "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz"
integrity sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==
@@ -972,20 +1248,19 @@ fast-levenshtein@^2.0.6:
resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
-fido2-lib@^2.8.1:
- version "2.8.3"
- resolved "https://registry.npmjs.org/fido2-lib/-/fido2-lib-2.8.3.tgz"
- integrity sha512-VBp8jiqujf+1jVZfGDy2qBN8IRQLPuhbDdFSBvDD5/4fRWnHUOuHQGMKcnWAnAkDWw98in0OWhIxa4WJPrFPuw==
- dependencies:
- "@peculiar/webcrypto" "^1.2.0"
- asn1js "^2.0.18"
- cbor "^4.0.0"
- cose-to-jwk "^1.1.0"
- jwk-to-pem "^2.0.5"
- node-jose "^2.1.0"
- pkijs "=2.1.58"
- psl "^1.1.24"
- pvutils "^1.0.17"
+fido2-lib@^3.5.8:
+ version "3.5.9"
+ resolved "https://registry.npmjs.org/fido2-lib/-/fido2-lib-3.5.9.tgz"
+ integrity sha512-OfiX3VetTaoiuA9Bk8QnIdDVEOyZyR8m6JE++9zLQ3sbpsQN8thaJoLHcDi770cOKGtzvSH49mp2njtXUm6S7w==
+ dependencies:
+ "@hexagon/base64" "^2.0.4"
+ "@peculiar/webcrypto" "~1.5.0"
+ asn1js "~3.0.7"
+ cbor-x "~1.6.3"
+ jose "^6.2.1"
+ pkijs "~3.3.3"
+ punycode.js "^2.3.1"
+ tldts "~7.0.25"
file-entry-cache@^8.0.0:
version "8.0.0"
@@ -1039,16 +1314,69 @@ flatted@^3.2.9:
resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz"
integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
+for-each@^0.3.3, for-each@^0.3.5:
+ version "0.3.5"
+ resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz"
+ integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==
+ dependencies:
+ is-callable "^1.2.7"
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+function.prototype.name@^1.1.6, function.prototype.name@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz"
+ integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ functions-have-names "^1.2.3"
+ hasown "^2.0.2"
+ is-callable "^1.2.7"
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
get-caller-file@^2.0.1, get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz"
+ integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.1.1"
+ function-bind "^1.1.2"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ math-intrinsics "^1.1.0"
+
get-own-enumerable-property-symbols@^3.0.0:
version "3.0.2"
resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz"
integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==
+get-proto@^1.0.0, get-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz"
+ integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-object-atoms "^1.0.0"
+
get-stream@^5.0.0:
version "5.2.0"
resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"
@@ -1061,6 +1389,15 @@ get-stream@^8.0.1:
resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz"
integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==
+get-symbol-description@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz"
+ integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+
git-raw-commits@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz"
@@ -1089,6 +1426,24 @@ globals@^14.0.0:
resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz"
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
+globalthis@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz"
+ integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
+ dependencies:
+ define-properties "^1.2.1"
+ gopd "^1.0.1"
+
+gopd@^1.0.1, gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
+
+has-bigints@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz"
+ integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
@@ -1099,22 +1454,38 @@ has-flag@^4.0.0:
resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-hash.js@^1.0.0, hash.js@^1.0.3:
- version "1.1.7"
- resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz"
- integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
dependencies:
- inherits "^2.0.3"
- minimalistic-assert "^1.0.1"
+ es-define-property "^1.0.0"
-hmac-drbg@^1.0.1:
- version "1.0.1"
- resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz"
- integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
+has-proto@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz"
+ integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==
+ dependencies:
+ dunder-proto "^1.0.0"
+
+has-symbols@^1.0.3, has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
+
+has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ dependencies:
+ has-symbols "^1.0.3"
+
+hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
dependencies:
- hash.js "^1.0.3"
- minimalistic-assert "^1.0.0"
- minimalistic-crypto-utils "^1.0.1"
+ function-bind "^1.1.2"
human-signals@^1.1.1:
version "1.1.1"
@@ -1131,11 +1502,6 @@ husky@^8.0.1:
resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz"
integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
-ieee754@^1.2.1:
- version "1.2.1"
- resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
- integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-
ignore@^5.2.0:
version "5.3.2"
resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
@@ -1164,31 +1530,116 @@ indent-string@^4.0.0:
resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
-inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4:
- version "2.0.4"
- resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
ini@4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz"
integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==
+internal-slot@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz"
+ integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==
+ dependencies:
+ es-errors "^1.3.0"
+ hasown "^2.0.2"
+ side-channel "^1.1.0"
+
+is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
+ version "3.0.5"
+ resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz"
+ integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ get-intrinsic "^1.2.6"
+
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+is-async-function@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz"
+ integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==
+ dependencies:
+ async-function "^1.0.0"
+ call-bound "^1.0.3"
+ get-proto "^1.0.1"
+ has-tostringtag "^1.0.2"
+ safe-regex-test "^1.1.0"
+
+is-bigint@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz"
+ integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==
+ dependencies:
+ has-bigints "^1.0.2"
+
+is-boolean-object@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz"
+ integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==
+ dependencies:
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
+
+is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0:
+ version "2.16.1"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz"
+ integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==
+ dependencies:
+ hasown "^2.0.2"
+
+is-data-view@^1.0.1, is-data-view@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz"
+ integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==
+ dependencies:
+ call-bound "^1.0.2"
+ get-intrinsic "^1.2.6"
+ is-typed-array "^1.1.13"
+
+is-date-object@^1.0.5, is-date-object@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz"
+ integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==
+ dependencies:
+ call-bound "^1.0.2"
+ has-tostringtag "^1.0.2"
+
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+is-finalizationregistry@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz"
+ integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==
+ dependencies:
+ call-bound "^1.0.3"
+
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+is-generator-function@^1.0.10:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz"
+ integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==
+ dependencies:
+ call-bound "^1.0.3"
+ get-proto "^1.0.0"
+ has-tostringtag "^1.0.2"
+ safe-regex-test "^1.1.0"
+
is-glob@^4.0.0, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
@@ -1196,6 +1647,19 @@ is-glob@^4.0.0, is-glob@^4.0.3:
dependencies:
is-extglob "^2.1.1"
+is-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz"
+ integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
+
+is-number-object@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz"
+ integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==
+ dependencies:
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
+
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
@@ -1211,11 +1675,33 @@ is-obj@^2.0.0:
resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz"
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+is-regex@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz"
+ integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==
+ dependencies:
+ call-bound "^1.0.2"
+ gopd "^1.2.0"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
+
is-regexp@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz"
integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==
+is-set@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz"
+ integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
+
+is-shared-array-buffer@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz"
+ integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==
+ dependencies:
+ call-bound "^1.0.3"
+
is-stream@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz"
@@ -1226,6 +1712,23 @@ is-stream@^3.0.0:
resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz"
integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
+is-string@^1.0.7, is-string@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz"
+ integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==
+ dependencies:
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
+
+is-symbol@^1.0.4, is-symbol@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz"
+ integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==
+ dependencies:
+ call-bound "^1.0.2"
+ has-symbols "^1.1.0"
+ safe-regex-test "^1.1.0"
+
is-text-path@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz"
@@ -1233,21 +1736,58 @@ is-text-path@^2.0.0:
dependencies:
text-extensions "^2.0.0"
+is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15:
+ version "1.1.15"
+ resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz"
+ integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==
+ dependencies:
+ which-typed-array "^1.1.16"
+
is-unicode-supported@^0.1.0:
version "0.1.0"
resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz"
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+is-weakmap@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz"
+ integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
+
+is-weakref@^1.0.2, is-weakref@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz"
+ integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==
+ dependencies:
+ call-bound "^1.0.3"
+
+is-weakset@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz"
+ integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==
+ dependencies:
+ call-bound "^1.0.3"
+ get-intrinsic "^1.2.6"
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
-jiti@^1.19.1:
+jiti@*, jiti@^1.19.1:
version "1.21.0"
resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz"
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
+jose@^6.2.1:
+ version "6.2.3"
+ resolved "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz"
+ integrity sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==
+
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
@@ -1255,7 +1795,7 @@ js-tokens@^4.0.0:
js-yaml@^4.1.0:
version "4.1.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz"
integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==
dependencies:
argparse "^2.0.1"
@@ -1285,26 +1825,25 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
-json-text-sequence@^0.1:
- version "0.1.1"
- resolved "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz"
- integrity sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==
+json5@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz"
+ integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
dependencies:
- delimit-stream "0.1.0"
+ minimist "^1.2.0"
jsonparse@^1.2.0:
version "1.3.1"
resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz"
integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==
-jwk-to-pem@^2.0.5:
- version "2.0.5"
- resolved "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.5.tgz"
- integrity sha512-L90jwellhO8jRKYwbssU9ifaMVqajzj3fpRjDKcsDzrslU9syRbFqfkXtT4B89HYAap+xsxNcxgBSB09ig+a7A==
+JSONStream@^1.3.5:
+ version "1.3.5"
+ resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz"
+ integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
dependencies:
- asn1.js "^5.3.0"
- elliptic "^6.5.4"
- safe-buffer "^5.0.1"
+ jsonparse "^1.2.0"
+ through ">=2.2.7 <3"
keyv@^4.5.4:
version "4.5.4"
@@ -1427,11 +1966,6 @@ lodash.upperfirst@^4.3.1:
resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz"
integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==
-lodash@^4.17.21:
- version "4.17.23"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a"
- integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==
-
log-symbols@^4.0.0:
version "4.1.0"
resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz"
@@ -1450,11 +1984,6 @@ log-update@^4.0.0:
slice-ansi "^4.0.0"
wrap-ansi "^6.2.0"
-long@^5.2.0:
- version "5.2.1"
- resolved "https://registry.npmjs.org/long/-/long-5.2.1.tgz"
- integrity sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==
-
lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
@@ -1462,6 +1991,11 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
+math-intrinsics@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
+ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+
meow@^12.0.1:
version "12.1.1"
resolved "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz"
@@ -1490,29 +2024,19 @@ mimic-fn@^4.0.0:
resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz"
integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
-minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
- version "1.0.1"
- resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"
- integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
-
-minimalistic-crypto-utils@^1.0.1:
- version "1.0.1"
- resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"
- integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
-
minimatch@^3.1.2:
version "3.1.5"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz"
integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==
dependencies:
brace-expansion "^1.1.7"
-minimist@^1.2.8:
+minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8:
version "1.2.8"
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
-ms@2.1.2:
+ms@^2.1.1, ms@2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
@@ -1522,37 +2046,19 @@ natural-compare@^1.4.0:
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
-node-forge@^1.2.1:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.3.tgz#0ad80f6333b3a0045e827ac20b7f735f93716751"
- integrity sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==
-
-node-jose@^2.1.0:
- version "2.2.0"
- resolved "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz"
- integrity sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==
- dependencies:
- base64url "^3.0.1"
- buffer "^6.0.3"
- es6-promise "^4.2.8"
- lodash "^4.17.21"
- long "^5.2.0"
- node-forge "^1.2.1"
- pako "^2.0.4"
- process "^0.11.10"
- uuid "^9.0.0"
-
-nofilter@^1.0.3:
- version "1.0.4"
- resolved "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz"
- integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==
+node-gyp-build-optional-packages@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz"
+ integrity sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==
+ dependencies:
+ detect-libc "^2.0.1"
normalize-path@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-notp@2.0.x, notp@^2.0.3:
+notp@^2.0.3, notp@2.0.x:
version "2.0.3"
resolved "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz"
integrity sha512-oBig/2uqkjQ5AkBuw4QJYwkEWa/q+zHxI5/I5z6IeP2NT0alpJFsP/trrfCC+9xOAgQSZXssNi962kp5KBmypQ==
@@ -1571,6 +2077,57 @@ npm-run-path@^5.1.0:
dependencies:
path-key "^4.0.0"
+object-inspect@^1.13.3:
+ version "1.13.4"
+ resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz"
+ integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.7:
+ version "4.1.7"
+ resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz"
+ integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+ has-symbols "^1.1.0"
+ object-keys "^1.1.1"
+
+object.fromentries@^2.0.8:
+ version "2.0.8"
+ resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz"
+ integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+
+object.groupby@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz"
+ integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+
+object.values@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz"
+ integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
@@ -1604,6 +2161,15 @@ optionator@^0.9.3:
type-check "^0.4.0"
word-wrap "^1.2.5"
+own-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz"
+ integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==
+ dependencies:
+ get-intrinsic "^1.2.6"
+ object-keys "^1.1.1"
+ safe-push-apply "^1.0.0"
+
p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
@@ -1658,11 +2224,6 @@ p-try@^2.0.0:
resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
-pako@^2.0.4:
- version "2.1.0"
- resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz"
- integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==
-
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
@@ -1714,6 +2275,11 @@ path-key@^4.0.0:
resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz"
integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
@@ -1729,14 +2295,17 @@ pkginfo@0.2.x:
resolved "https://registry.npmjs.org/pkginfo/-/pkginfo-0.2.3.tgz"
integrity sha512-7W7wTrE/NsY8xv/DTGjwNIyNah81EQH0MWcTzrHL6pOpMocOGZc0Mbdz9aXxSrp+U0mSmkU8jrNCDCfUs3sOBg==
-pkijs@=2.1.58:
- version "2.1.58"
- resolved "https://registry.npmjs.org/pkijs/-/pkijs-2.1.58.tgz"
- integrity sha512-HEcJ4SbZNdyB7Jb1G7Ot3Y/gd7kZyTDJBMIIZOFselrKrCouhGbQu4rm9Lg8bumBACckq724G9uNsZbNJ6d2gw==
+pkijs@~3.3.3:
+ version "3.3.3"
+ resolved "https://registry.npmjs.org/pkijs/-/pkijs-3.3.3.tgz"
+ integrity sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==
dependencies:
- asn1js latest
- bytestreamjs latest
- pvutils latest
+ "@noble/hashes" "1.4.0"
+ asn1js "^3.0.6"
+ bytestreamjs "^2.0.1"
+ pvtsutils "^1.3.6"
+ pvutils "^1.1.3"
+ tslib "^2.8.1"
please-upgrade-node@^3.2.0:
version "3.2.0"
@@ -1750,21 +2319,16 @@ pngjs@^5.0.0:
resolved "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz"
integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==
+possible-typed-array-names@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz"
+ integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-process@^0.11.10:
- version "0.11.10"
- resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz"
- integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
-
-psl@^1.1.24:
- version "1.9.0"
- resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz"
- integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
-
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
@@ -1773,22 +2337,27 @@ pump@^3.0.0:
end-of-stream "^1.1.0"
once "^1.3.1"
+punycode.js@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz"
+ integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==
+
punycode@^2.1.0:
version "2.3.0"
resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz"
integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
-pvtsutils@^1.3.2:
- version "1.3.2"
- resolved "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.2.tgz"
- integrity sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==
+pvtsutils@^1.3.5, pvtsutils@^1.3.6:
+ version "1.3.6"
+ resolved "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz"
+ integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==
dependencies:
- tslib "^2.4.0"
+ tslib "^2.8.1"
-pvutils@^1.0.17, pvutils@^1.1.3, pvutils@latest:
- version "1.1.3"
- resolved "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz"
- integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==
+pvutils@^1.1.3, pvutils@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz"
+ integrity sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==
qrcode@^1.5.0:
version "1.5.1"
@@ -1800,6 +2369,32 @@ qrcode@^1.5.0:
pngjs "^5.0.0"
yargs "^15.3.1"
+reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9:
+ version "1.0.10"
+ resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz"
+ integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.9"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.7"
+ get-proto "^1.0.1"
+ which-builtin-type "^1.2.1"
+
+regexp.prototype.flags@^1.5.3:
+ version "1.5.4"
+ resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz"
+ integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-errors "^1.3.0"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ set-function-name "^2.0.2"
+
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
@@ -1825,6 +2420,15 @@ resolve-from@^5.0.0:
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+resolve@^1.22.4:
+ version "1.22.10"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz"
+ integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==
+ dependencies:
+ is-core-module "^2.16.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
restore-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz"
@@ -1845,21 +2449,44 @@ rxjs@^7.5.1:
dependencies:
tslib "^2.1.0"
-safe-buffer@^5.0.1:
- version "5.2.1"
- resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+safe-array-concat@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz"
+ integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.2"
+ get-intrinsic "^1.2.6"
+ has-symbols "^1.1.0"
+ isarray "^2.0.5"
-safer-buffer@^2.1.0:
- version "2.1.2"
- resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+safe-push-apply@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz"
+ integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==
+ dependencies:
+ es-errors "^1.3.0"
+ isarray "^2.0.5"
+
+safe-regex-test@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz"
+ integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ is-regex "^1.2.1"
semver-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz"
integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
semver@^7.6.0:
version "7.6.2"
resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz"
@@ -1870,6 +2497,37 @@ set-blocking@^2.0.0:
resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"
integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+set-function-length@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz"
+ integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.2"
+
+set-proto@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz"
+ integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
@@ -1882,6 +2540,46 @@ shebang-regex@^3.0.0:
resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+side-channel-list@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz"
+ integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+
+side-channel-map@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz"
+ integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+
+side-channel-weakmap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz"
+ integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+ side-channel-map "^1.0.1"
+
+side-channel@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz"
+ integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+ side-channel-list "^1.0.0"
+ side-channel-map "^1.0.1"
+ side-channel-weakmap "^1.0.2"
+
signal-exit@^3.0.2:
version "3.0.7"
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"
@@ -1929,6 +2627,38 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
+string.prototype.trim@^1.2.10:
+ version "1.2.10"
+ resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz"
+ integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.2"
+ define-data-property "^1.1.4"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-object-atoms "^1.0.0"
+ has-property-descriptors "^1.0.2"
+
+string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz"
+ integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.2"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimstart@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz"
+ integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
stringify-object@^3.3.0:
version "3.3.0"
resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz"
@@ -1945,6 +2675,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
dependencies:
ansi-regex "^5.0.1"
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
+ integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
strip-final-newline@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
@@ -1974,6 +2709,11 @@ supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
text-extensions@^2.0.0:
version "2.4.0"
resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz"
@@ -1984,11 +2724,23 @@ thirty-two@1.0.2:
resolved "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz"
integrity sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==
-"through@>=2.2.7 <3", through@^2.3.8:
+through@^2.3.8, "through@>=2.2.7 <3":
version "2.3.8"
resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+tldts-core@^7.0.32:
+ version "7.4.0"
+ resolved "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.0.tgz"
+ integrity sha512-/mb9kRld+x1sIMXxWNOAp5m6C+D4GrAORWlJkOJ5dElvxdN1eutz/o7qHLp9gFvDF4Y3/L2xeScoxz6AbEo8rQ==
+
+tldts@~7.0.25:
+ version "7.0.32"
+ resolved "https://registry.npmjs.org/tldts/-/tldts-7.0.32.tgz"
+ integrity sha512-5eDV0tK2NhLAAqBeXDAQ36+EwuStd1HbsSOnGsp+JbExITnExcALLL5M1kTH8gjDYN5QvwmUWimE3GoMZ2A7xQ==
+ dependencies:
+ tldts-core "^7.0.32"
+
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
@@ -1996,10 +2748,20 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
-tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.4.1:
- version "2.5.0"
- resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz"
- integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
+tsconfig-paths@^3.15.0:
+ version "3.15.0"
+ resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz"
+ integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.2"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tslib@^2.0.0, tslib@^2.1.0, tslib@^2.6.2, tslib@^2.8.1:
+ version "2.8.1"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
@@ -2013,11 +2775,71 @@ type-fest@^0.21.3:
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+typed-array-buffer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz"
+ integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-typed-array "^1.1.14"
+
+typed-array-byte-length@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz"
+ integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==
+ dependencies:
+ call-bind "^1.0.8"
+ for-each "^0.3.3"
+ gopd "^1.2.0"
+ has-proto "^1.2.0"
+ is-typed-array "^1.1.14"
+
+typed-array-byte-offset@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz"
+ integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ for-each "^0.3.3"
+ gopd "^1.2.0"
+ has-proto "^1.2.0"
+ is-typed-array "^1.1.15"
+ reflect.getprototypeof "^1.0.9"
+
+typed-array-length@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz"
+ integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ is-typed-array "^1.1.13"
+ possible-typed-array-names "^1.0.0"
+ reflect.getprototypeof "^1.0.6"
+
+typescript@>=4, typescript@>=4.9.5:
+ version "5.4.5"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz"
+ integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==
+
u2f@^0.1.3:
version "0.1.3"
resolved "https://registry.npmjs.org/u2f/-/u2f-0.1.3.tgz"
integrity sha512-/IaxeBqjo5o3D7plPkxdApbCpgGoI2bmTomS1kq5OjVflaE9UBJ0WfqoXqZryZKfFYBjQC7Tn1hA57WtRgh/Sg==
+unbox-primitive@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz"
+ integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==
+ dependencies:
+ call-bound "^1.0.3"
+ has-bigints "^1.0.2"
+ has-symbols "^1.1.0"
+ which-boxed-primitive "^1.1.1"
+
undici-types@~5.26.4:
version "5.26.5"
resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz"
@@ -2035,27 +2857,75 @@ uri-js@^4.2.2, uri-js@^4.4.1:
dependencies:
punycode "^2.1.0"
-uuid@^9.0.0:
- version "9.0.0"
- resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz"
- integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
-
-webcrypto-core@^1.7.4:
- version "1.7.6"
- resolved "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.6.tgz"
- integrity sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA==
+webcrypto-core@^1.8.0:
+ version "1.9.2"
+ resolved "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz"
+ integrity sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==
dependencies:
- "@peculiar/asn1-schema" "^2.1.6"
+ "@peculiar/asn1-schema" "^2.7.0"
"@peculiar/json-schema" "^1.1.12"
- asn1js "^3.0.1"
- pvtsutils "^1.3.2"
- tslib "^2.4.0"
+ "@peculiar/utils" "^2.0.2"
+ asn1js "^3.0.10"
+ tslib "^2.8.1"
+
+which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz"
+ integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==
+ dependencies:
+ is-bigint "^1.1.0"
+ is-boolean-object "^1.2.1"
+ is-number-object "^1.1.1"
+ is-string "^1.1.1"
+ is-symbol "^1.1.1"
+
+which-builtin-type@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz"
+ integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==
+ dependencies:
+ call-bound "^1.0.2"
+ function.prototype.name "^1.1.6"
+ has-tostringtag "^1.0.2"
+ is-async-function "^2.0.0"
+ is-date-object "^1.1.0"
+ is-finalizationregistry "^1.1.0"
+ is-generator-function "^1.0.10"
+ is-regex "^1.2.1"
+ is-weakref "^1.0.2"
+ isarray "^2.0.5"
+ which-boxed-primitive "^1.1.0"
+ which-collection "^1.0.2"
+ which-typed-array "^1.1.16"
+
+which-collection@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz"
+ integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
+ dependencies:
+ is-map "^2.0.3"
+ is-set "^2.0.3"
+ is-weakmap "^2.0.2"
+ is-weakset "^2.0.3"
which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz"
integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==
+which-typed-array@^1.1.16, which-typed-array@^1.1.18:
+ version "1.1.19"
+ resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz"
+ integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ call-bound "^1.0.4"
+ for-each "^0.3.5"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ has-tostringtag "^1.0.2"
+
which@^2.0.1:
version "2.0.2"
resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
From 664cd097bb66d2a20b1f92872aefa5fda6ebbe91 Mon Sep 17 00:00:00 2001
From: Julian Lam
Date: Mon, 25 May 2026 12:02:04 -0400
Subject: [PATCH 04/10] refactor: move device list rendering to template with
Benchpress
- Pass devices array from renderSettings to template
- Add device list partial for server-side and client-side rendering
- Replace JS-built HTML string in renderDevicesList with app.parseAndTranslate
- Device list markup now lives in templates, not client-side JS
---
lib/controllers.js | 2 +
static/lib/settings.js | 54 ++++++-------------
static/templates/account/2factor.tpl | 4 +-
.../templates/partials/2factor/deviceList.tpl | 13 +++++
4 files changed, 35 insertions(+), 38 deletions(-)
create mode 100644 static/templates/partials/2factor/deviceList.tpl
diff --git a/lib/controllers.js b/lib/controllers.js
index ab7dec7..aa3516e 100644
--- a/lib/controllers.js
+++ b/lib/controllers.js
@@ -249,6 +249,7 @@ Controllers.renderSettings = async (req, res) => {
const hasTotp = await parent.hasTotp(req.user.uid);
const hasAuthn = await parent.hasAuthn(req.user.uid);
+ const devices = hasAuthn ? await parent.getAuthnDevices(req.user.uid) : [];
res.render('account/2factor', {
...res.locals.userData,
title: '[[2factor:title]]',
@@ -256,6 +257,7 @@ Controllers.renderSettings = async (req, res) => {
forceTfa,
hasTotp,
hasAuthn,
+ devices,
backupCodeCount: await parent.countBackupCodes(req.user.uid),
});
};
diff --git a/static/lib/settings.js b/static/lib/settings.js
index d4d2fbe..17260a5 100644
--- a/static/lib/settings.js
+++ b/static/lib/settings.js
@@ -68,44 +68,24 @@ define('forum/account/2factor', ['api', 'alerts', 'bootbox'], function (api, ale
Settings.renderDevicesList = async () => {
const devices = await Settings.getAuthnDevices();
- const itemEl = document.querySelector('[data-action="setupAuthn"]').closest('.list-group-item');
- let devicesHtml = '';
- if (devices.length > 0) {
- devicesHtml = '';
- devices.forEach((device, index) => {
- const name = device.name || `Device ${index + 1}`;
- devicesHtml += `
-
- `;
- });
- devicesHtml += '
';
- }
- const existing = itemEl.querySelector('.device-list-container');
- if (existing) {
- existing.outerHTML = devicesHtml;
- } else {
- const container = document.createElement('div');
- container.className = 'device-list-container mt-2';
- container.innerHTML = devicesHtml;
- itemEl.appendChild(container);
- }
- // Attach event listeners for rename/remove
- document.querySelectorAll('.device-rename').forEach(btn => {
- btn.addEventListener('click', (e) => {
- const deviceId = e.target.closest('.device-rename').getAttribute('data-device-id');
- Settings.renameDevice(deviceId);
+ app.parseAndTranslate('partials/2factor/deviceList', { devices }, (html) => {
+ const itemEl = document.querySelector('[data-action="setupAuthn"]').closest('.list-group-item');
+ const container = itemEl.querySelector('.device-list-container');
+ if (container) {
+ $(container).html(html);
+ }
+ // Attach event listeners for rename/remove
+ document.querySelectorAll('.device-rename').forEach(btn => {
+ btn.addEventListener('click', (e) => {
+ const deviceId = e.target.closest('.device-rename').getAttribute('data-device-id');
+ Settings.renameDevice(deviceId);
+ });
});
- });
- document.querySelectorAll('.device-remove').forEach(btn => {
- btn.addEventListener('click', (e) => {
- const deviceId = e.target.closest('.device-remove').getAttribute('data-device-id');
- Settings.removeDevice(deviceId);
+ document.querySelectorAll('.device-remove').forEach(btn => {
+ btn.addEventListener('click', (e) => {
+ const deviceId = e.target.closest('.device-remove').getAttribute('data-device-id');
+ Settings.removeDevice(deviceId);
+ });
});
});
};
diff --git a/static/templates/account/2factor.tpl b/static/templates/account/2factor.tpl
index 96b165b..0679753 100644
--- a/static/templates/account/2factor.tpl
+++ b/static/templates/account/2factor.tpl
@@ -32,7 +32,9 @@
[[2factor:choices.authn]]
-
+
+
+
diff --git a/static/templates/partials/2factor/deviceList.tpl b/static/templates/partials/2factor/deviceList.tpl
new file mode 100644
index 0000000..bd1e76b
--- /dev/null
+++ b/static/templates/partials/2factor/deviceList.tpl
@@ -0,0 +1,13 @@
+{{{ if devices.length }}}
+
+ {{{ each devices }}}
+
+ {{{ end }}}
+
+{{{ end }}}
From 8e844b14d46c5bd9e312506d74ae90668552e2d1 Mon Sep 17 00:00:00 2001
From: Julian Lam
Date: Mon, 25 May 2026 12:08:16 -0400
Subject: [PATCH 05/10] fix: removeDevice WRONGTYPE error when deleting
WebAuthn device
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
db.getObjectKeys was called on the sorted set key
2factor:webauthn:counters instead of the hash key — Redis throws
WRONGTYPE. db.sortedSetRemove is idempotent so the check is unnecessary.
---
library.js | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/library.js b/library.js
index 9063b02..b4a39c7 100644
--- a/library.js
+++ b/library.js
@@ -219,8 +219,6 @@ plugin.addRoutes = async ({ router, middleware, helpers }) => {
});
});
-
-
routeHelpers.setupApiRoute(router, 'delete', '/2factor/totp', middlewares, async (req, res) => {
await db.deleteObjectField('2factor:uid:key', req.uid);
@@ -267,7 +265,7 @@ plugin.get = async uid => db.getObjectField('2factor:uid:key', uid);
plugin.getAuthnKeyIds = async (uid) => {
const keys = await db.getObject(`2factor:webauthn:${uid}`);
- return Object.keys(keys);
+ return keys ? Object.keys(keys) : [];
};
plugin.getAuthnDevices = async (uid) => {
@@ -403,10 +401,7 @@ plugin.disassociate = async (uid) => {
};
plugin.removeDevice = async (uid, id) => {
- const counters = await db.getObjectKeys(`2factor:webauthn:counters`);
- if (counters.includes(id)) {
- await db.sortedSetRemove('2factor:webauthn:counters', id);
- }
+ await db.sortedSetRemove('2factor:webauthn:counters', id);
await db.deleteObjectField(`2factor:webauthn:${uid}`, id);
await db.deleteObjectField(`2factor:webauthn:${uid}:names`, id);
};
From 7c3a63512ac09668cd55f79c53be0b518b113bf4 Mon Sep 17 00:00:00 2001
From: Julian Lam
Date: Mon, 25 May 2026 12:10:54 -0400
Subject: [PATCH 06/10] feat: allow adding multiple WebAuthn keys
- Remove mute condition on the enable button when a key already exists
- Add 'authn.add' translation key for 'Add key' label shown when
hasAuthn is true
- Users can now register additional hardware keys alongside existing ones
---
languages/en-GB/2factor.json | 1 +
static/templates/account/2factor.tpl | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/languages/en-GB/2factor.json b/languages/en-GB/2factor.json
index f3f864d..11875c6 100644
--- a/languages/en-GB/2factor.json
+++ b/languages/en-GB/2factor.json
@@ -54,6 +54,7 @@
"authn.remove": "Remove",
"authn.remove.confirm": "Are you sure you want to remove this device? You will not be able to use it for two-factor authentication.",
"authn.removed": "Device removed successfully.",
+ "authn.add": "Add key",
"login.text": "Enter the verification code generated by your mobile application.",
"login.verify": "Verify",
diff --git a/static/templates/account/2factor.tpl b/static/templates/account/2factor.tpl
index 0679753..dcd64fa 100644
--- a/static/templates/account/2factor.tpl
+++ b/static/templates/account/2factor.tpl
@@ -26,7 +26,7 @@
From 6c7609e4c1b3c216f022c4ed09ff4c4882fdc0b0 Mon Sep 17 00:00:00 2001
From: Julian Lam
Date: Mon, 25 May 2026 13:23:13 -0400
Subject: [PATCH 07/10] refactor: DRY
---
static/lib/authn.js | 134 +++++++++++++++----------------
static/templates/login-authn.tpl | 4 +-
2 files changed, 68 insertions(+), 70 deletions(-)
diff --git a/static/lib/authn.js b/static/lib/authn.js
index 20ebbac..398a94d 100644
--- a/static/lib/authn.js
+++ b/static/lib/authn.js
@@ -19,7 +19,70 @@ define('forum/login-authn', ['api', 'alerts', 'hooks'], function (api, alerts, h
return Uint8Array.from(binary, c => c.charCodeAt(0));
}
- var Plugin = {};
+ // Decode a credential id: Uint8Array passes through, strings are base64url-decoded
+ function decodeId(id) {
+ return id instanceof Uint8Array ? id : base64urlToUint8Array(id);
+ }
+
+ // Build WebAuthn assertion options from ajaxify.data
+ function buildAssertionOptions(allowCredentials) {
+ const authnOptions = JSON.parse(JSON.stringify(ajaxify.data.authnOptions || {}));
+ authnOptions.challenge = base64urlToUint8Array(authnOptions.challenge);
+ const creds = allowCredentials || authnOptions.allowCredentials;
+ if (creds) {
+ authnOptions.allowCredentials = creds.map(cred => ({
+ ...cred,
+ id: decodeId(cred.id),
+ }));
+ }
+ return authnOptions;
+ }
+
+ // Encode authResponse into JSON-serializable payload
+ function buildPayload(authResponse) {
+ return {
+ authResponse: {
+ id: authResponse.id,
+ rawId: arrayBufferToBase64url(authResponse.rawId),
+ response: {
+ authenticatorData: arrayBufferToBase64url(authResponse.response.authenticatorData),
+ clientDataJSON: arrayBufferToBase64url(authResponse.response.clientDataJSON),
+ signature: arrayBufferToBase64url(authResponse.response.signature),
+ userHandle: arrayBufferToBase64url(authResponse.response.userHandle),
+ },
+ clientExtensionResults: authResponse.getClientExtensionResults(),
+ },
+ };
+ }
+
+ // Submit verification payload and handle redirect/error
+ function submitVerification(payload, onDone) {
+ api.post(`/plugins/2factor/authn/verify${document.location.search}`, payload)
+ .then(({ next }) => {
+ if (onDone) { onDone(next); }
+ })
+ .catch((err) => {
+ alerts.error(err);
+ ajaxify.refresh();
+ });
+ }
+
+ // Perform WebAuthn assertion and verify
+ Plugin.verify = async (allowCredentials, onDone) => {
+ const abortController = new AbortController();
+ hooks.on('action:ajaxify.start', () => {
+ abortController.abort();
+ });
+
+ const authnOptions = buildAssertionOptions(allowCredentials);
+ const authResponse = await navigator.credentials.get({
+ publicKey: authnOptions,
+ signal: abortController.signal,
+ });
+
+ const payload = buildPayload(authResponse);
+ submitVerification(payload, onDone);
+ };
Plugin.init = async () => {
const deviceSelect = document.getElementById('deviceSelect');
@@ -31,44 +94,8 @@ define('forum/login-authn', ['api', 'alerts', 'hooks'], function (api, alerts, h
const selectedId = deviceSelect.value;
authBtn.disabled = true;
try {
- const abortController = new AbortController();
- hooks.on('action:ajaxify.start', () => {
- abortController.abort();
- });
-
- // Build assertion options for the selected device only
- const authnOptions = JSON.parse(JSON.stringify(ajaxify.data.authnOptions || {}));
- authnOptions.challenge = base64urlToUint8Array(authnOptions.challenge);
- authnOptions.allowCredentials = [{
- id: selectedId,
- type: 'public-key',
- transports: ['usb', 'ble', 'nfc'],
- }];
-
- const authResponse = await navigator.credentials.get({
- publicKey: authnOptions,
- signal: abortController.signal,
- });
-
- // Encode binary fields for JSON transmission
- const payload = {
- authResponse: {
- id: authResponse.id,
- rawId: arrayBufferToBase64url(authResponse.rawId),
- response: {
- authenticatorData: arrayBufferToBase64url(authResponse.response.authenticatorData),
- clientDataJSON: arrayBufferToBase64url(authResponse.response.clientDataJSON),
- signature: arrayBufferToBase64url(authResponse.response.signature),
- userHandle: arrayBufferToBase64url(authResponse.response.userHandle),
- },
- clientExtensionResults: authResponse.getClientExtensionResults(),
- },
- };
- api.post(`/plugins/2factor/authn/verify${document.location.search}`, payload).then(({ next }) => {
+ await Plugin.verify([{ id: selectedId, type: 'public-key', transports: ['usb', 'ble', 'nfc'] }], (next) => {
ajaxify.go(next.replace(config.relative_path, ''));
- }).catch((err) => {
- alerts.error(err);
- ajaxify.refresh();
});
} catch (e) {
if (e.code !== 20) { // 20 is user canceled
@@ -84,42 +111,13 @@ define('forum/login-authn', ['api', 'alerts', 'hooks'], function (api, alerts, h
} else {
// Single device or no device selection - proceed directly
try {
- const abortController = new AbortController();
- hooks.on('action:ajaxify.start', () => {
- abortController.abort();
- });
-
- const authnOptions = JSON.parse(JSON.stringify(ajaxify.data.authnOptions || {}));
- authnOptions.challenge = base64urlToUint8Array(authnOptions.challenge);
- const authResponse = await navigator.credentials.get({
- publicKey: authnOptions,
- signal: abortController.signal,
- });
-
- // Encode binary fields for JSON transmission
- const payload = {
- authResponse: {
- id: authResponse.id,
- rawId: arrayBufferToBase64url(authResponse.rawId),
- response: {
- authenticatorData: arrayBufferToBase64url(authResponse.response.authenticatorData),
- clientDataJSON: arrayBufferToBase64url(authResponse.response.clientDataJSON),
- signature: arrayBufferToBase64url(authResponse.response.signature),
- userHandle: arrayBufferToBase64url(authResponse.response.userHandle),
- },
- clientExtensionResults: authResponse.getClientExtensionResults(),
- },
- };
- api.post(`/plugins/2factor/authn/verify${document.location.search}`, payload).then(({ next }) => {
+ await Plugin.verify(null, (next) => {
const iconEl = document.getElementById('statusIcon');
iconEl.classList.remove('fa-spinner');
iconEl.classList.remove('fa-spin');
iconEl.classList.add('fa-check');
iconEl.classList.add('text-success');
document.location = next;
- }).catch((err) => {
- alerts.error(err);
- ajaxify.refresh();
});
} catch (e) {
if (e.code !== 20) { // 20 is user canceled
diff --git a/static/templates/login-authn.tpl b/static/templates/login-authn.tpl
index 7a1c97b..91e6e16 100644
--- a/static/templates/login-authn.tpl
+++ b/static/templates/login-authn.tpl
@@ -11,7 +11,7 @@
- {{{ if (devices.length != 1) }}}
+ {{{ if (devices.length != "1") }}}
[[2factor:authn.login.select]]