浏览代码

feat(otp): add notification for when all recovery codes are used

Hintay 2 月之前
父节点
当前提交
5d5bac2e25

+ 10 - 0
app/src/language/ar/app.po

@@ -106,6 +106,10 @@ msgstr "بعد ذلك، قم بتحديث هذه الصفحة وانقر فوق
 msgid "All"
 msgid "All"
 msgstr "الكل"
 msgstr "الكل"
 
 
+#: src/language/constants.ts:57
+msgid "All Recovery Codes Have Been Used"
+msgstr ""
+
 #: src/views/preference/OpenAISettings.vue:32
 #: src/views/preference/OpenAISettings.vue:32
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "عنوان URL الأساسي لAPI"
 msgstr "عنوان URL الأساسي لAPI"
@@ -1885,6 +1889,12 @@ msgstr ""
 "يرجى أولاً إضافة بيانات الاعتماد في الشهادات > بيانات اعتماد DNS، ثم اختيار "
 "يرجى أولاً إضافة بيانات الاعتماد في الشهادات > بيانات اعتماد DNS، ثم اختيار "
 "أحد بيانات الاعتماد أدناه لطلب API لمزود DNS."
 "أحد بيانات الاعتماد أدناه لطلب API لمزود DNS."
 
 
+#: src/language/constants.ts:58
+msgid ""
+"Please generate new recovery codes in the preferences immediately to prevent "
+"lockout."
+msgstr ""
+
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/ConfigEditor.vue:249
 #: src/views/config/ConfigEditor.vue:249
 msgid "Please input a filename"
 msgid "Please input a filename"

+ 3 - 0
app/src/language/constants.ts

@@ -53,4 +53,7 @@ export const msg = [
   $gettext('Enable Remote Site Error'),
   $gettext('Enable Remote Site Error'),
   $gettext('Rename Remote Site Success'),
   $gettext('Rename Remote Site Success'),
   $gettext('Rename Remote Site Error'),
   $gettext('Rename Remote Site Error'),
+
+  $gettext('All Recovery Codes Have Been Used'),
+  $gettext('Please generate new recovery codes in the preferences immediately to prevent lockout.'),
 ]
 ]

+ 10 - 0
app/src/language/en/app.po

@@ -108,6 +108,10 @@ msgstr ""
 msgid "All"
 msgid "All"
 msgstr ""
 msgstr ""
 
 
+#: src/language/constants.ts:57
+msgid "All Recovery Codes Have Been Used"
+msgstr ""
+
 #: src/views/preference/OpenAISettings.vue:32
 #: src/views/preference/OpenAISettings.vue:32
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr ""
 msgstr ""
@@ -1956,6 +1960,12 @@ msgid ""
 "select one of the credentialsbelow to request the API of the DNS provider."
 "select one of the credentialsbelow to request the API of the DNS provider."
 msgstr ""
 msgstr ""
 
 
+#: src/language/constants.ts:58
+msgid ""
+"Please generate new recovery codes in the preferences immediately to prevent "
+"lockout."
+msgstr ""
+
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/ConfigEditor.vue:249
 #: src/views/config/ConfigEditor.vue:249
 #, fuzzy
 #, fuzzy

+ 10 - 0
app/src/language/es/app.po

@@ -111,6 +111,10 @@ msgstr ""
 msgid "All"
 msgid "All"
 msgstr "Todo"
 msgstr "Todo"
 
 
+#: src/language/constants.ts:57
+msgid "All Recovery Codes Have Been Used"
+msgstr ""
+
 #: src/views/preference/OpenAISettings.vue:32
 #: src/views/preference/OpenAISettings.vue:32
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "URL Base de la API"
 msgstr "URL Base de la API"
@@ -1906,6 +1910,12 @@ msgstr ""
 "luego seleccione una de las credenciales de aquí debajo para llamar a la API "
 "luego seleccione una de las credenciales de aquí debajo para llamar a la API "
 "del proveedor de DNS."
 "del proveedor de DNS."
 
 
+#: src/language/constants.ts:58
+msgid ""
+"Please generate new recovery codes in the preferences immediately to prevent "
+"lockout."
+msgstr ""
+
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/ConfigEditor.vue:249
 #: src/views/config/ConfigEditor.vue:249
 msgid "Please input a filename"
 msgid "Please input a filename"

+ 10 - 0
app/src/language/fr_FR/app.po

@@ -109,6 +109,10 @@ msgstr ""
 msgid "All"
 msgid "All"
 msgstr ""
 msgstr ""
 
 
+#: src/language/constants.ts:57
+msgid "All Recovery Codes Have Been Used"
+msgstr ""
+
 #: src/views/preference/OpenAISettings.vue:32
 #: src/views/preference/OpenAISettings.vue:32
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "URL de base de l'API"
 msgstr "URL de base de l'API"
@@ -1950,6 +1954,12 @@ msgstr ""
 "des informations d'identification ci-dessous pour demander l'API du "
 "des informations d'identification ci-dessous pour demander l'API du "
 "fournisseur DNS."
 "fournisseur DNS."
 
 
+#: src/language/constants.ts:58
+msgid ""
+"Please generate new recovery codes in the preferences immediately to prevent "
+"lockout."
+msgstr ""
+
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/ConfigEditor.vue:249
 #: src/views/config/ConfigEditor.vue:249
 #, fuzzy
 #, fuzzy

+ 8 - 0
app/src/language/messages.pot

@@ -100,6 +100,10 @@ msgstr ""
 msgid "All"
 msgid "All"
 msgstr ""
 msgstr ""
 
 
+#: src/language/constants.ts:57
+msgid "All Recovery Codes Have Been Used"
+msgstr ""
+
 #: src/views/preference/OpenAISettings.vue:32
 #: src/views/preference/OpenAISettings.vue:32
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr ""
 msgstr ""
@@ -1814,6 +1818,10 @@ msgstr ""
 msgid "Please first add credentials in Certification > DNS Credentials, and then select one of the credentialsbelow to request the API of the DNS provider."
 msgid "Please first add credentials in Certification > DNS Credentials, and then select one of the credentialsbelow to request the API of the DNS provider."
 msgstr ""
 msgstr ""
 
 
+#: src/language/constants.ts:58
+msgid "Please generate new recovery codes in the preferences immediately to prevent lockout."
+msgstr ""
+
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/ConfigEditor.vue:249
 #: src/views/config/ConfigEditor.vue:249
 msgid "Please input a filename"
 msgid "Please input a filename"

+ 10 - 0
app/src/language/zh_CN/app.po

@@ -106,6 +106,10 @@ msgstr "然后,刷新此页面并再次点击添加 Passkey。"
 msgid "All"
 msgid "All"
 msgstr "全部"
 msgstr "全部"
 
 
+#: src/language/constants.ts:57
+msgid "All Recovery Codes Have Been Used"
+msgstr "所有恢复码都已被使用"
+
 #: src/views/preference/OpenAISettings.vue:32
 #: src/views/preference/OpenAISettings.vue:32
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "API 地址"
 msgstr "API 地址"
@@ -1832,6 +1836,12 @@ msgstr ""
 "请首先在 “证书”> “DNS 凭证” 中添加凭证,然后在下方选择一个凭证,请求 DNS 提供"
 "请首先在 “证书”> “DNS 凭证” 中添加凭证,然后在下方选择一个凭证,请求 DNS 提供"
 "商的 API。"
 "商的 API。"
 
 
+#: src/language/constants.ts:58
+msgid ""
+"Please generate new recovery codes in the preferences immediately to prevent "
+"lockout."
+msgstr "请立即在偏好设置中生成新的恢复码,以防止无法访问您的账户。"
+
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/components/Rename.vue:63
 #: src/views/config/ConfigEditor.vue:249
 #: src/views/config/ConfigEditor.vue:249
 msgid "Please input a filename"
 msgid "Please input a filename"

文件差异内容过多而无法显示
+ 326 - 160
app/src/language/zh_TW/app.po


+ 13 - 1
internal/user/otp.go

@@ -9,6 +9,7 @@ import (
 
 
 	"github.com/0xJacky/Nginx-UI/internal/cache"
 	"github.com/0xJacky/Nginx-UI/internal/cache"
 	"github.com/0xJacky/Nginx-UI/internal/crypto"
 	"github.com/0xJacky/Nginx-UI/internal/crypto"
+	"github.com/0xJacky/Nginx-UI/internal/notification"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/query"
 	"github.com/0xJacky/Nginx-UI/query"
 	"github.com/google/uuid"
 	"github.com/google/uuid"
@@ -50,13 +51,24 @@ func VerifyOTP(user *model.User, otp, recoveryCode string) (err error) {
 		}
 		}
 
 
 		// check recovery code
 		// check recovery code
+		usedCount := 0
+		verified := false
 		for _, code := range user.RecoveryCodes.Codes {
 		for _, code := range user.RecoveryCodes.Codes {
 			if code.Code == recoveryCode && code.UsedTime == nil {
 			if code.Code == recoveryCode && code.UsedTime == nil {
 				t := time.Now().Unix()
 				t := time.Now().Unix()
 				code.UsedTime = &t
 				code.UsedTime = &t
 				_, err = u.Where(u.ID.Eq(user.ID)).Updates(user)
 				_, err = u.Where(u.ID.Eq(user.ID)).Updates(user)
-				return
+				if err != nil {
+					return err
+				}
+				verified = true
 			}
 			}
+			if code.UsedTime != nil {
+				usedCount++
+			}
+		}
+		if verified && usedCount == len(user.RecoveryCodes.Codes) {
+			notification.Warning("All Recovery Codes Have Been Used", "Please generate new recovery codes in the preferences immediately to prevent lockout.")
 		}
 		}
 		return ErrRecoveryCode
 		return ErrRecoveryCode
 	}
 	}

部分文件因为文件数量过多而无法显示