Merge branch 'security-key-without-2fa' into 'develop'

Make security key independent of 2FA

Co-authored-by: TrojanerHD <github@trojaner.dev>

Closes #8610

See merge request firefish/firefish!10670
This commit is contained in:
naskya 2024-02-29 12:19:26 +00:00
commit f8bc26bd6b
24 changed files with 44 additions and 208 deletions

View file

@ -417,8 +417,6 @@ audio: Звук
removeQuote: Премахни цитат
_sfx:
notification: Известия
_2fa:
renewTOTPCancel: Отмяна
_permissions:
"read:favorites": Виж списъка си с отметки
"write:favorites": Редактирай списъка си с отметки

View file

@ -335,20 +335,11 @@ _2fa:
securityKeyName: Introduïu un nom de clau
removeKey: Suprimeix la clau de seguretat
removeKeyConfirm: Vols suprimir la clau {name}?
renewTOTP: Tornar a configurar l'aplicació d'autenticació
renewTOTPOk: Reconfigurar
renewTOTPCancel: Cancel·lar
step2Click: Fer clic en aquest codi QR us permetrà registrar 2FA a la vostra clau
de seguretat o aplicació d'autenticació del telèfon.
securityKeyNotSupported: El vostre navegador no admet claus de seguretat.
registerTOTPBeforeKey: Configureu una aplicació d'autenticació per registrar una
clau de seguretat o de passi.
tapSecurityKey: Si us plau, seguiu el vostre navegador per registrar la clau de
seguretat o d'accés
renewTOTPConfirm: Això farà que els codis de verificació de l'aplicació anterior
deixin de funcionar
whyTOTPOnlyRenew: Laplicació dautenticació no es pot eliminar sempre que es hi
hagi una clau de seguretat registrada.
token: Token 2FA
_widgets:
notifications: "Notificacions"

View file

@ -1402,23 +1402,14 @@ _2fa:
deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels
einrichten."
step3Title: Gib deinen Authentifizierungscode ein
renewTOTPOk: Neu konfigurieren
securityKeyNotSupported: Dein Browser unterstützt Hardware-Security-Keys nicht.
chromePasskeyNotSupported: Chrome Passkeys werden momentan nicht unterstützt.
renewTOTP: Konfiguriere deine Authenticator App neu
renewTOTPCancel: Abbrechen
tapSecurityKey: Bitte folge den Anweisungen deines Browsers, um einen Hardware-Security-Key
oder einen Passkey zu registrieren
removeKey: Entferne deinen Hardware-Security-Key
removeKeyConfirm: Möchtest du wirklich deinen Key mit der Bezeichnung {name} löschen?
renewTOTPConfirm: Das wird dazu führen, dass du Verifizierungscodes deiner vorherigen
Authenticator App nicht mehr nutzen kannst
whyTOTPOnlyRenew: Die Authentificator App kann nicht entfernt werden, solange ein
Hardware-Security-Key registriert ist.
step2Click: Ein Klick auf diesen QR-Code erlaubt es dir eine 2FA-Methode zu deinem
Security Key oder deiner Authenticator App hinzuzufügen.
registerTOTPBeforeKey: Bitte registriere eine Authentificator App, um einen Hardware-Security-Key
oder einen Passkey zu nutzen.
securityKeyName: Gib einen Namen für den Key ein
token: 2FA Token
_permissions:

View file

@ -1586,8 +1586,6 @@ _2fa:
step3: "Enter the token provided by your app to finish setup."
step4: "From now on, any future login attempts will ask for such a login token."
securityKeyNotSupported: "Your browser does not support security keys."
registerTOTPBeforeKey: "Please set up an authenticator app to register a security
or pass key."
securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup
authentication via hardware security keys that support FIDO2 to further secure
your account."
@ -1597,13 +1595,6 @@ _2fa:
tapSecurityKey: "Please follow your browser to register the security or pass key"
removeKey: "Remove security key"
removeKeyConfirm: "Really delete the {name} key?"
whyTOTPOnlyRenew: "The authenticator app cannot be removed as long as a security
key is registered."
renewTOTP: "Reconfigure authenticator app"
renewTOTPConfirm: "This will cause verification codes from your previous app to
stop working"
renewTOTPOk: "Reconfigure"
renewTOTPCancel: "Cancel"
token: "2FA Token"
_permissions:
"read:account": "View your account information"

View file

@ -1381,21 +1381,12 @@ _2fa:
chromePasskeyNotSupported: Contraseñas de Chrome no están soportadas.
removeKeyConfirm: ¿Realmente deseas borrar la clave {name}?
step3Title: Ingresa un código de autorización
renewTOTP: Reconfigurar la aplicación autorizadora
whyTOTPOnlyRenew: La aplicación autorizadora no puede ser quitada mientras la clave
de seguridad siga registrada.
renewTOTPConfirm: Esto causará que los códigos de verificación de la aplicación
anterior dejen de funcionar
renewTOTPOk: Reconfigurar
securityKeyNotSupported: Tu navegador no soporta claves de seguridad.
step2Click: Presionar este código QR te permitirá registrar la autorización 2FA
a tu clave de seguridad o aplicación autorizadora.
registerTOTPBeforeKey: Por favor configura una aplicación autorizadora para registrar
una clave de seguridad o de paso.
securityKeyName: Ingresa el nombre de la clave
tapSecurityKey: Por favor, espera al navegador para registrar la clave de seguridad
o de paso
renewTOTPCancel: Cancelar
token: Token 2FA
removeKey: Quitar clave de seguridad
_permissions:

View file

@ -1312,19 +1312,10 @@ _2fa:
step2Click: En cliquant sur ce QR code, vous pourrez enregistrer l'authentification
à deux facteurs (2FA) sur votre clé de sécurité ou votre application d'authentification
sur téléphone.
whyTOTPOnlyRenew: L'application d'authentification ne peut pas être supprimée tant
qu'une clé de sécurité est enregistrée.
securityKeyName: Entrez un nom de clé
removeKeyConfirm: Voulez-vous vraiment supprimer la clé {name}?
renewTOTP: Reconfigurer l'application d'authentification
renewTOTPConfirm: Cela entraînera l'arrêt de fonctionnement des codes de vérification
provenant de votre application précédente
renewTOTPOk: Reconfigurer
securityKeyNotSupported: Votre navigateur ne prend pas en charge les clés de sécurité.
removeKey: Supprimer la clé de sécurité
renewTOTPCancel: Annuler
registerTOTPBeforeKey: Veuillez configurer une application d'authentification pour
enregistrer une clé de sécurité ou un mot de passe.
tapSecurityKey: Veuillez suivre les instructions de votre navigateur pour enregistrer
la clé de sécurité ou le mot de passe
_permissions:

View file

@ -1300,8 +1300,6 @@ _2fa:
securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses
login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung
FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu."
renewTOTPConfirm: Ini akan menyebabkan kode verifikasi dari aplikasimu sebelumnya
berhenti bekerja
token: Token 2FA
chromePasskeyNotSupported: Kunci pas Chrome saat ini tidak didukung.
securityKeyName: Masukkan nama kunci
@ -1310,15 +1308,9 @@ _2fa:
keamanan atau apl ontentikasi ponsel.
step3Title: Masukkan kode otentikasi
securityKeyNotSupported: Perambanmu tidak mendukung kunci keamanan.
renewTOTPOk: Konfigurasi ulang
renewTOTPCancel: Batal
registerTOTPBeforeKey: Silakan atur apl otentikator untuk mendaftarkan kunci keamanan
atau kunci pas.
tapSecurityKey: Silakan ikuti perambanmu untuk mendaftarkan kunci keamanan atau
kunci pas
removeKeyConfirm: Yakin menghapus kunci {name}?
whyTOTPOnlyRenew: Apl otentikator tidak dapat dihapus selama kunci keamanan didaftarkan.
renewTOTP: Konfigurasi ulang apl otentikator
_permissions:
"read:account": "Lihat informasi akun"
"write:account": "Sunting informasi akun"

View file

@ -1220,7 +1220,6 @@ _tutorial:
_2fa:
registerTOTP: "Aggiungi app di autenticazione"
securityKeyName: Scegli un nome per la chiave
renewTOTPOk: Riconfigura
step2: Poi, scansiona il QR code mostrato a schermo.
securityKeyInfo: Oltre alle impronte digitali o al PIN, puoi anche autenticarti
con chiavi di sicurezza hardware che supportano FIDO2 per rendere il tuo account
@ -1230,19 +1229,12 @@ _2fa:
fattori (2FA).
step3: Inserisci il token fornito dalla tua app per terminare.
step4: Da ora in poi i futuri tentativi di login necessiteranno del token.
registerTOTPBeforeKey: Prima installa una app di autenticazione o registra una chiave
di sicurezza o una pass key.
token: Token 2FA
whyTOTPOnlyRenew: La app di autenticazione non può essere rimossa finché la chiave
di sicurezza è registrata.
step2Click: Cliccando sul QR code potrai registrare la 2FA nella tua chiave di sicurezza
o nella app di autenticazione dello smartphone.
step2Url: 'Puoi anche chiamare questo URL se sei su desktop:'
securityKeyNotSupported: Il tuo browser non supporta le chiavi di sicurezza.
chromePasskeyNotSupported: Le passkey di Chrome non sono supportate.
renewTOTPConfirm: I codici di verifica già impostati in precedenza smetteranno di
funzionare
renewTOTP: Riconfigura la app di autenticazione
registerSecurityKey: Registra una chiave di sicurezza o pass key
step1: Prima di tutto, installa una app di autenticazione (tipo {a} o {b}) sul tuo
device.
@ -1250,7 +1242,6 @@ _2fa:
sicurezza o la pass key
removeKey: Rimuovi la chiave di sicurezza
removeKeyConfirm: Confermi la rimozione della chiave {name} ?
renewTOTPCancel: Annulla
_permissions:
"read:account": "Visualizzare le informazioni dell'account"
"write:account": "Modificare le informazioni dell'account"

View file

@ -1355,7 +1355,6 @@ _2fa:
step3: "アプリに表示されている確認コード(トークン)を入力して完了です。"
step4: "これからログインするときも、同じように確認コードを入力します。"
securityKeyNotSupported: "お使いのブラウザはセキュリティキーに対応していません。"
registerTOTPBeforeKey: "セキュリティキー・パスキーを登録するには、まず認証アプリの設定を行なってください。"
securityKeyInfo: "FIDO2をサポートするハードウェアセキュリティキー、端末の生体認証やPINロック、パスキーといった、WebAuthn由来の鍵を登録します。"
chromePasskeyNotSupported: "Chromeのパスキーは現在サポートしていません。"
registerSecurityKey: "セキュリティキー・パスキーを登録する"
@ -1363,11 +1362,6 @@ _2fa:
tapSecurityKey: "ブラウザの指示に従い、セキュリティキーやパスキーを登録してください"
removeKey: "セキュリティキーを削除"
removeKeyConfirm: "{name}を削除しますか?"
whyTOTPOnlyRenew: "セキュリティキーが登録されている場合、認証アプリの設定は解除できません。"
renewTOTP: "認証アプリを再設定"
renewTOTPConfirm: "今までの認証アプリの確認コードは使用できなくなります"
renewTOTPOk: "再設定する"
renewTOTPCancel: "やめておく"
token: "多要素認証トークン"
_permissions:
"read:account": "アカウントの情報を見る"

View file

@ -1242,18 +1242,12 @@ _2fa:
수 있습니다."
step2Click: QR 코드를 클릭하여 사용 중인 보안 키 또는 인증 앱을 등록할 수 있습니다.
step3Title: 확인 코드를 입력
registerTOTPBeforeKey: 보안 키/패스 키를 등록하시려면 우선 인증 앱 설정을 마치십시오.
securityKeyNotSupported: 이 브라우저는 보안 키를 지원하지 않습니다.
chromePasskeyNotSupported: 현재 Chrome의 패스키는 지원하지 않습니다.
token: 2차 인증 토큰
removeKey: 보안 키를 삭제
removeKeyConfirm: '{name}을 삭제하시겠습니까?'
renewTOTPCancel: 취소
renewTOTPConfirm: 지금 사용 중인 인증 앱의 확인 코드는 사용할 수 없게 됩니다
securityKeyName: 키 이름 입력
renewTOTPOk: 재설정
whyTOTPOnlyRenew: 보안 키가 등록되어 있는 상태에서 인증 앱 설정을 해제할 수 없습니다.
renewTOTP: 인증 앱을 재설정
tapSecurityKey: 브라우저의 지시에 따라 보안 키나 패스 키를 등록하십시오
_permissions:
"read:account": "계정의 정보를 봅니다"

View file

@ -1677,18 +1677,12 @@ _2fa:
step3: Oppgi en engangskode for å fullføre oppsettet.
step1: Først, installer en app for engangskoder (slik som {a} eller {b}) på en enhet.
step3Title: Skriv inn en autentiseringskode
renewTOTPCancel: Avbryt
securityKeyName: Oppgi et nøkkelnavn
renewTOTPOk: Rekonfigurer
registerSecurityKey: Registrer en sikkerhetsnøkkel
step2: Deretter kan du scanne QR-koden som vises på skjermen.
registerTOTP: Registrer engangskode-app
removeKeyConfirm: Sikker på at du vil slette nøkkelen {name}?
registerTOTPBeforeKey: Sett opp en autentiserings-app for å registrere en sikkerhetsnøkkel.
chromePasskeyNotSupported: Passkeys i Chrome er foreløpig ikke støttet.
renewTOTPConfirm: Dette vil føre til at kodene fra den forrige appen din vil slutte
å virke
renewTOTP: Rekonfigurer autentiserings-app
securityKeyNotSupported: Nettleseren din tillater ikke sikkerhetsnøkler.
step2Click: Når du klikker på QR-koden kan du registrere den som en tofaktor-pålogging
på en sikkerhetsnøkkel eller engangskode-app.

View file

@ -1286,17 +1286,8 @@ _2fa:
removeKey: Удалить ключ безопасности
step2Click: Нажав на этот QR-код, вы сможете зарегистрировать 2FA в вашем ключе
безопасности или приложении-аутентификаторе для телефона.
registerTOTPBeforeKey: Пожалуйста, настройте приложение-аутентификатор, чтобы зарегистрировать
ключ безопасности или пароль.
chromePasskeyNotSupported: Пароли Chrome пока не поддерживаются.
renewTOTP: Перенастроить приложение-аутентификатор
renewTOTPConfirm: Это приведет к тому, что коды подтверждения из предыдущего приложения
перестанут работать
renewTOTPOk: Перенастроить
renewTOTPCancel: Отменить
token: 2FA Токен
whyTOTPOnlyRenew: Приложение аутентификатора нельзя удалить, пока зарегистрирован
ключ безопасности.
tapSecurityKey: Пожалуйста, следуйте инструкциям вашего браузера, чтобы зарегистрировать
ключ безопасности или ключ-пароль
step3Title: Введите код аутентификации

View file

@ -1325,18 +1325,13 @@ noGraze: Firefish ile çakıştığı için lütfen "Graze for Mastodon" tarayı
devre dışı bırakın.
isBot: Bu hesap bir bottur
_2fa:
renewTOTPOk: Yeniden Yapılandır
registerTOTP: Doğrulayıcı uygulamasını kaydedin
renewTOTPCancel: İptal Et
renewTOTPConfirm: Bu, önceki uygulamanızdaki doğrulama kodlarının çalışmamasına
neden olur
alreadyRegistered: Zaten bir 2 faktörlü kimlik doğrulama cihazını kaydettiniz.
chromePasskeyNotSupported: Chrome geçiş anahtarları şu anda desteklenmemektedir.
registerSecurityKey: Bir güvenlik veya geçiş anahtarı kaydedin
securityKeyName: Bir anahtar adı girin
removeKey: Güvenlik anahtarını kaldır
removeKeyConfirm: '{name} anahtarı gerçekten silinsin mi?'
renewTOTP: Kimlik doğrulayıcı uygulamasını yeniden yapılandırın
token: 2FA Tokeni
step1: Öncelikle, cihazınıza bir kimlik doğrulama uygulaması ({a} veya {b} gibi)
yükleyin.
@ -1354,10 +1349,6 @@ _2fa:
aracılığıyla kimlik doğrulama ayarlayabilirsiniz.
tapSecurityKey: Güvenlik veya geçiş anahtarını kaydetmek için lütfen tarayıcınızı
takip edin
registerTOTPBeforeKey: Bir güvenlik veya geçiş anahtarı kaydetmek için lütfen bir
kimlik doğrulama uygulaması kurun.
whyTOTPOnlyRenew: Kimlik doğrulayıcı uygulaması, bir güvenlik anahtarı kaydedildiği
sürece kaldırılamaz.
_poll:
voted: Oylandı
deadlineTime: Zaman

View file

@ -1104,7 +1104,6 @@ _2fa:
апаратний ключ безпеки або ключ-пароль
securityKeyName: Введіть назву ключа
chromePasskeyNotSupported: Паролі Chrome наразі не підтримуються.
renewTOTPOk: Переналаштувати
removeKey: Видалити ключ безпеки
alreadyRegistered: 2FA вже налаштовано.
step2Click: Натиснувши на цей QR-код, ви зможете зареєструвати 2FA у вашому ключі
@ -1117,15 +1116,7 @@ _2fa:
можете налаштувати автентифікацію за допомогою апаратних ключів безпеки, які підтримують
FIDO2, щоб додатково захистити свій обліковий запис.
removeKeyConfirm: Дійсно видалити ключ {name}?
whyTOTPOnlyRenew: Додаток автентифікатора не можна видалити, доки зареєстровано
ключ безпеки.
renewTOTP: Переналаштувати додаток-автентифікатор
renewTOTPCancel: Скасувати
renewTOTPConfirm: Це призведе до того, що коди підтвердження з попереднього додатку
перестануть працювати
token: 2FA Токен
registerTOTPBeforeKey: Будь ласка, налаштуйте додаток-автентифікатор, щоб зареєструвати
ключ безпеки або пароль.
step2Url: 'Також, ви можете ввести цю URL-адресу, якщо використовуєте десктопну
програму:'
step3: Введіть токен, наданий вашим додатком, щоб завершити налаштування.

View file

@ -1342,24 +1342,16 @@ _2fa:
securityKeyInfo: "Bên cạnh xác minh bằng vân tay hoặc mã PIN, bạn cũng có thể thiết
lập xác minh thông qua khóa bảo mật phần cứng hỗ trợ FIDO2 để bảo mật hơn nữa
cho tài khoản của mình."
registerTOTPBeforeKey: Vui lòng thiết lập một ứng dụng xác thực để đăng ký khóa
bảo mật hoặc mật khẩu.
tapSecurityKey: Vui lòng theo dõi trình duyệt của bạn để đăng ký mã bảo mật hoặc
mã khóa
renewTOTPConfirm: Điều này sẽ khiến mã xác minh từ ứng dụng trước của bạn ngừng
hoạt động
securityKeyName: Nhập tên mã khóa
step3Title: Nhập mã xác thực
chromePasskeyNotSupported: Mật khẩu Chrome hiện không được hỗ trợ.
removeKeyConfirm: Thực sự xóa khóa {name}?
whyTOTPOnlyRenew: Không thể xóa ứng dụng xác thực miễn là đã đăng ký khóa bảo mật.
renewTOTPOk: Cấu hình lại
renewTOTPCancel: Hủy bỏ
removeKey: Xóa khóa bảo mật
step2Click: Nhấn vào mã QR này sẽ cho phép bạn đăng ký 2FA cho khóa bảo mật hoặc
ứng dụng xác thực điện thoại của bạn.
securityKeyNotSupported: Trình duyệt của bạn không hỗ trợ khóa bảo mật.
renewTOTP: Định cấu hình lại ứng dụng xác thực
token: 2FA Token
_permissions:
"read:account": "Xem thông tin tài khoản của bạn"

View file

@ -1258,12 +1258,7 @@ _2fa:
step3: "输入您的应用提供的令牌以完成设置。"
step4: "从现在开始,任何登录操作都将要求您提供这样一个登录令牌。"
securityKeyInfo: "除了指纹或 PIN 身份验证外,您还可以通过支持 FIDO2 的硬件安全密钥设置身份验证,以进一步保护您的账号。"
renewTOTPOk: 重新配置
renewTOTPCancel: 取消
token: 2FA 令牌
renewTOTP: 重新配置身份验证器应用
registerTOTPBeforeKey: 请先设置认证器应用以注册安全或通行密钥。
renewTOTPConfirm: 这将导致您之前应用中的验证码失效
step3Title: 输入验证码
step2Click: 点击此二维码将允许您在安全密钥或手机身份验证器应用中注册 2FA。
securityKeyNotSupported: 您的浏览器不支持安全密钥。
@ -1272,7 +1267,6 @@ _2fa:
tapSecurityKey: 请按照您的浏览器的指示注册安全或通行密钥
removeKey: 移除安全密钥
removeKeyConfirm: 真的要删除 {name} 密钥吗?
whyTOTPOnlyRenew: 只要注册了安全密钥,就无法删除身份验证器应用。
_permissions:
"read:account": "查看账号信息"
"write:account": "更改账号信息"

View file

@ -1254,18 +1254,12 @@ _2fa:
step3: "輸入您的App提供的權杖以完成設定。"
step4: "從現在開始,任何登入操作都將要求您提供權杖。"
securityKeyInfo: "您可以設定使用支援FIDO2的硬體安全鎖、終端設備的指纹認證或者PIN碼來登入。"
renewTOTPCancel: 取消
removeKey: 移除安全金鑰
removeKeyConfirm: 真的要刪掉 {name} 嗎?
renewTOTP: 重新配置身份驗證器應用程式
chromePasskeyNotSupported: 目前不支持 Chrome 密鑰。
whyTOTPOnlyRenew: 只要註冊了安全金鑰,就無法刪除身份驗證器應用程式。
renewTOTPConfirm: 這將導致您之前的身分驗證器應用程式停止工作
securityKeyName: 取一個金鑰的名字
tapSecurityKey: 請按照您的瀏覽器註冊安全金鑰或密碼
token: 兩步驟驗證金鑰
registerTOTPBeforeKey: 請設置身份驗證器應用程式以註冊安全金鑰或密碼。
renewTOTPOk: 重新配置
step3Title: 輸入驗證碼
securityKeyNotSupported: 您使用的瀏覧器不支援安全金鑰(Security key)。
step2Click: 點擊此二維條碼以註冊2FA至你的安全密鑰或手機的Authenticator應用程式。

View file

@ -526,11 +526,9 @@ export const UserRepository = db.getRepository(User).extend({
ffVisibility: profile!.ffVisibility,
twoFactorEnabled: profile!.twoFactorEnabled,
usePasswordLessLogin: profile!.usePasswordLessLogin,
securityKeys: profile!.twoFactorEnabled
? UserSecurityKeys.countBy({
userId: user.id,
}).then((result) => result >= 1)
: false,
securityKeys: UserSecurityKeys.countBy({
userId: user.id,
}).then((result) => result >= 1),
}
: {}),
@ -576,18 +574,16 @@ export const UserRepository = db.getRepository(User).extend({
? {
email: profile!.email,
emailVerified: profile!.emailVerified,
securityKeysList: profile!.twoFactorEnabled
? UserSecurityKeys.find({
where: {
userId: user.id,
},
select: {
id: true,
name: true,
lastUsed: true,
},
})
: [],
securityKeysList: UserSecurityKeys.find({
where: {
userId: user.id,
},
select: {
id: true,
name: true,
lastUsed: true,
},
}),
}
: {}),

View file

@ -47,10 +47,6 @@ export default define(meta, paramDef, async (ps, user) => {
throw new Error("incorrect password");
}
if (!profile.twoFactorEnabled) {
throw new Error("2fa not enabled");
}
const clientData = JSON.parse(ps.clientDataJSON);
if (clientData.type !== "webauthn.create") {
@ -148,6 +144,8 @@ export default define(meta, paramDef, async (ps, user) => {
}),
);
UserProfiles.update(user.id, { securityKeysAvailable: true });
return {
id: credentialIdString,
name: ps.name,

View file

@ -32,10 +32,6 @@ export default define(meta, paramDef, async (ps, user) => {
throw new Error("incorrect password");
}
// if (!profile.twoFactorEnabled) {
// throw new Error("2fa not enabled");
// }
// 32 byte challenge
const entropy = await randomBytes(32);
const challenge = entropy

View file

@ -47,8 +47,9 @@ export default define(meta, paramDef, async (ps, user) => {
});
if (keyCount === 0) {
await UserProfiles.update(me.id, {
await UserProfiles.update(user.id, {
usePasswordLessLogin: false,
securityKeysAvailable: false,
});
}

View file

@ -116,7 +116,7 @@ export default async (ctx: Koa.Context) => {
);
}
if (!profile.twoFactorEnabled) {
if (!profile.twoFactorEnabled && !profile.securityKeysAvailable) {
if (same) {
signin(ctx, user);
return;
@ -128,7 +128,7 @@ export default async (ctx: Koa.Context) => {
}
}
if (token) {
if (token && profile.twoFactorEnabled) {
if (!same) {
await fail(403, {
id: "932c904e-9460-45b7-9ce6-7ed33be7eb2c",

View file

@ -79,10 +79,16 @@
{{ i18n.ts.retry }}
</MkButton>
</div>
<div v-if="user && user.securityKeys" class="or-hr">
<div
v-if="user && user.securityKeys && user.twoFactorEnabled"
class="or-hr"
>
<p class="or-msg">{{ i18n.ts.or }}</p>
</div>
<div class="twofa-group totp-group">
<div
v-if="user.twoFactorEnabled"
class="twofa-group totp-group"
>
<p style="margin-bottom: 0">
{{ i18n.ts.twoStepAuthentication }}
</p>
@ -247,25 +253,23 @@ function queryKey() {
function onSubmit() {
signing.value = true;
console.log("submit");
if (!totpLogin.value && user.value && user.value.twoFactorEnabled) {
if (window.PublicKeyCredential && user.value.securityKeys) {
os.api("signin", {
username: username.value,
password: password.value,
"hcaptcha-response": hCaptchaResponse.value,
"g-recaptcha-response": reCaptchaResponse.value,
if (window.PublicKeyCredential && user.value.securityKeys) {
os.api("signin", {
username: username.value,
password: password.value,
"hcaptcha-response": hCaptchaResponse.value,
"g-recaptcha-response": reCaptchaResponse.value,
})
.then((res) => {
totpLogin.value = true;
signing.value = false;
challengeData.value = res;
return queryKey();
})
.then((res) => {
totpLogin.value = true;
signing.value = false;
challengeData.value = res;
return queryKey();
})
.catch(loginFailed);
} else {
totpLogin.value = true;
signing.value = false;
}
.catch(loginFailed);
} else if (!totpLogin.value && user.value && user.value.twoFactorEnabled) {
totpLogin.value = true;
signing.value = false;
} else {
os.api("signin", {
username: username.value,

View file

@ -14,17 +14,7 @@
<template #caption>{{ i18n.ts.totpDescription }}</template>
<div v-if="$i.twoFactorEnabled" class="_gaps_s">
<div v-text="i18n.ts._2fa.alreadyRegistered" />
<template v-if="$i.securityKeysList.length > 0">
<MkButton @click="renewTOTP"
><i
:class="icon('ph-shield-check')"
style="margin-right: 0.5rem"
></i
>{{ i18n.ts._2fa.renewTOTP }}</MkButton
>
<MkInfo>{{ i18n.ts._2fa.whyTOTPOnlyRenew }}</MkInfo>
</template>
<MkButton v-else @click="unregisterTOTP"
<MkButton @click="unregisterTOTP"
><i
:class="icon('ph-shield-slash')"
style="margin-right: 0.5rem"
@ -56,13 +46,6 @@
{{ i18n.ts._2fa.securityKeyNotSupported }}
</MkInfo>
<MkInfo
v-else-if="supportsCredentials && !$i.twoFactorEnabled"
warn
>
{{ i18n.ts._2fa.registerTOTPBeforeKey }}
</MkInfo>
<template v-else>
<MkButton primary @click="addSecurityKey"
><i
@ -202,19 +185,6 @@ function unregisterTOTP() {
});
}
function renewTOTP() {
os.confirm({
type: "question",
title: i18n.ts._2fa.renewTOTP,
text: i18n.ts._2fa.renewTOTPConfirm,
okText: i18n.ts._2fa.renewTOTPOk,
cancelText: i18n.ts._2fa.renewTOTPCancel,
}).then(({ canceled }) => {
if (canceled) return;
registerTOTP();
});
}
async function unregisterKey(key) {
const confirm = await os.confirm({
type: "question",