diff --git a/controllers/auth.go b/controllers/auth.go index 36eeaa56..feb4852b 100644 --- a/controllers/auth.go +++ b/controllers/auth.go @@ -69,6 +69,15 @@ func (c *ApiController) HandleLoggedIn(application *object.Application, user *ob return } + // check user's tag + if !user.IsGlobalAdmin && !user.IsAdmin && len(application.Tags) > 0 { + // only users with the tag that is listed in the application tags can login + if !util.InSlice(application.Tags, user.Tag) { + c.ResponseError(fmt.Sprintf(c.T("auth:User's tag: %s is not listed in the application's tags"), user.Tag)) + return + } + } + if form.Password != "" && user.IsMfaEnabled() { c.setMfaSessionData(&object.MfaSessionData{UserId: userId}) resp = &Response{Status: object.NextMfa, Data: user.GetPreferredMfaProps(true)} diff --git a/go.mod b/go.mod index 4a8a02d1..c1342ef6 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( github.com/robfig/cron/v3 v3.0.1 github.com/russellhaering/gosaml2 v0.9.0 github.com/russellhaering/goxmldsig v1.2.0 - github.com/sashabaranov/go-openai v1.9.1 + github.com/sashabaranov/go-openai v1.12.0 github.com/satori/go.uuid v1.2.0 github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect github.com/shirou/gopsutil v3.21.11+incompatible diff --git a/go.sum b/go.sum index 6479b982..3abda261 100644 --- a/go.sum +++ b/go.sum @@ -548,6 +548,8 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sashabaranov/go-openai v1.9.1 h1:3N52HkJKo9Zlo/oe1AVv5ZkCOny0ra58/ACvAxkN3MM= github.com/sashabaranov/go-openai v1.9.1/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg= +github.com/sashabaranov/go-openai v1.12.0 h1:aRNHH0gtVfrpIaEolD0sWrLLRnYQNK4cH/bIAHwL8Rk= +github.com/sashabaranov/go-openai v1.12.0/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= diff --git a/i18n/locales/de/data.json b/i18n/locales/de/data.json index a3147e67..1890f64c 100644 --- a/i18n/locales/de/data.json +++ b/i18n/locales/de/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "Die Anmeldeart \"Anmeldung mit Passwort\" ist für die Anwendung nicht aktiviert", "The provider: %s is not enabled for the application": "Der Anbieter: %s ist nicht für die Anwendung aktiviert", "Unauthorized operation": "Nicht autorisierte Operation", - "Unknown authentication type (not password or provider), form = %s": "Unbekannter Authentifizierungstyp (nicht Passwort oder Anbieter), Formular = %s" + "Unknown authentication type (not password or provider), form = %s": "Unbekannter Authentifizierungstyp (nicht Passwort oder Anbieter), Formular = %s", + "User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags" }, "cas": { "Service %s and %s do not match": "Service %s und %s stimmen nicht überein" diff --git a/i18n/locales/en/data.json b/i18n/locales/en/data.json index f8680069..e9fbc0c7 100644 --- a/i18n/locales/en/data.json +++ b/i18n/locales/en/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "The login method: login with password is not enabled for the application", "The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application", "Unauthorized operation": "Unauthorized operation", - "Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s" + "Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s", + "User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags" }, "cas": { "Service %s and %s do not match": "Service %s and %s do not match" diff --git a/i18n/locales/es/data.json b/i18n/locales/es/data.json index 1be02021..dae65d40 100644 --- a/i18n/locales/es/data.json +++ b/i18n/locales/es/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "El método de inicio de sesión: inicio de sesión con contraseña no está habilitado para la aplicación", "The provider: %s is not enabled for the application": "El proveedor: %s no está habilitado para la aplicación", "Unauthorized operation": "Operación no autorizada", - "Unknown authentication type (not password or provider), form = %s": "Tipo de autenticación desconocido (no es contraseña o proveedor), formulario = %s" + "Unknown authentication type (not password or provider), form = %s": "Tipo de autenticación desconocido (no es contraseña o proveedor), formulario = %s", + "User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags" }, "cas": { "Service %s and %s do not match": "Los servicios %s y %s no coinciden" diff --git a/i18n/locales/fr/data.json b/i18n/locales/fr/data.json index 6c92de0c..819af959 100644 --- a/i18n/locales/fr/data.json +++ b/i18n/locales/fr/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "La méthode de connexion : connexion avec mot de passe n'est pas activée pour l'application", "The provider: %s is not enabled for the application": "Le fournisseur :%s n'est pas activé pour l'application", "Unauthorized operation": "Opération non autorisée", - "Unknown authentication type (not password or provider), form = %s": "Type d'authentification inconnu (pas de mot de passe ou de fournisseur), formulaire = %s" + "Unknown authentication type (not password or provider), form = %s": "Type d'authentification inconnu (pas de mot de passe ou de fournisseur), formulaire = %s", + "User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags" }, "cas": { "Service %s and %s do not match": "Les services %s et %s ne correspondent pas" diff --git a/i18n/locales/id/data.json b/i18n/locales/id/data.json index 2363b82f..af75f00e 100644 --- a/i18n/locales/id/data.json +++ b/i18n/locales/id/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "Metode login: login dengan kata sandi tidak diaktifkan untuk aplikasi tersebut", "The provider: %s is not enabled for the application": "Penyedia: %s tidak diaktifkan untuk aplikasi ini", "Unauthorized operation": "Operasi tidak sah", - "Unknown authentication type (not password or provider), form = %s": "Jenis otentikasi tidak diketahui (bukan kata sandi atau pemberi), formulir = %s" + "Unknown authentication type (not password or provider), form = %s": "Jenis otentikasi tidak diketahui (bukan kata sandi atau pemberi), formulir = %s", + "User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags" }, "cas": { "Service %s and %s do not match": "Layanan %s dan %s tidak cocok" diff --git a/i18n/locales/ja/data.json b/i18n/locales/ja/data.json index f6e9a70d..158518f8 100644 --- a/i18n/locales/ja/data.json +++ b/i18n/locales/ja/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "ログイン方法:パスワードでのログインはアプリケーションで有効になっていません", "The provider: %s is not enabled for the application": "プロバイダー:%sはアプリケーションでは有効化されていません", "Unauthorized operation": "不正操作", - "Unknown authentication type (not password or provider), form = %s": "不明な認証タイプ(パスワードまたはプロバイダーではない)フォーム=%s" + "Unknown authentication type (not password or provider), form = %s": "不明な認証タイプ(パスワードまたはプロバイダーではない)フォーム=%s", + "User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags" }, "cas": { "Service %s and %s do not match": "サービス%sと%sは一致しません" diff --git a/i18n/locales/ko/data.json b/i18n/locales/ko/data.json index 3320bda0..b9aec68d 100644 --- a/i18n/locales/ko/data.json +++ b/i18n/locales/ko/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "어플리케이션에서는 암호를 사용한 로그인 방법이 활성화되어 있지 않습니다", "The provider: %s is not enabled for the application": "제공자 %s은(는) 응용 프로그램에서 활성화되어 있지 않습니다", "Unauthorized operation": "무단 조작", - "Unknown authentication type (not password or provider), form = %s": "알 수 없는 인증 유형(암호 또는 공급자가 아님), 폼 = %s" + "Unknown authentication type (not password or provider), form = %s": "알 수 없는 인증 유형(암호 또는 공급자가 아님), 폼 = %s", + "User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags" }, "cas": { "Service %s and %s do not match": "서비스 %s와 %s는 일치하지 않습니다" diff --git a/i18n/locales/pt/data.json b/i18n/locales/pt/data.json index f8680069..e9fbc0c7 100644 --- a/i18n/locales/pt/data.json +++ b/i18n/locales/pt/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "The login method: login with password is not enabled for the application", "The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application", "Unauthorized operation": "Unauthorized operation", - "Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s" + "Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s", + "User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags" }, "cas": { "Service %s and %s do not match": "Service %s and %s do not match" diff --git a/i18n/locales/ru/data.json b/i18n/locales/ru/data.json index f541c6ef..a5a06062 100644 --- a/i18n/locales/ru/data.json +++ b/i18n/locales/ru/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "Метод входа: вход с паролем не включен для приложения", "The provider: %s is not enabled for the application": "Провайдер: %s не включен для приложения", "Unauthorized operation": "Несанкционированная операция", - "Unknown authentication type (not password or provider), form = %s": "Неизвестный тип аутентификации (не пароль и не провайдер), форма = %s" + "Unknown authentication type (not password or provider), form = %s": "Неизвестный тип аутентификации (не пароль и не провайдер), форма = %s", + "User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags" }, "cas": { "Service %s and %s do not match": "Сервисы %s и %s не совпадают" diff --git a/i18n/locales/vi/data.json b/i18n/locales/vi/data.json index 5f28c04b..2d9ef037 100644 --- a/i18n/locales/vi/data.json +++ b/i18n/locales/vi/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "Phương thức đăng nhập: đăng nhập bằng mật khẩu không được kích hoạt cho ứng dụng", "The provider: %s is not enabled for the application": "Nhà cung cấp: %s không được kích hoạt cho ứng dụng", "Unauthorized operation": "Hoạt động không được ủy quyền", - "Unknown authentication type (not password or provider), form = %s": "Loại xác thực không xác định (không phải mật khẩu hoặc nhà cung cấp), biểu mẫu = %s" + "Unknown authentication type (not password or provider), form = %s": "Loại xác thực không xác định (không phải mật khẩu hoặc nhà cung cấp), biểu mẫu = %s", + "User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags" }, "cas": { "Service %s and %s do not match": "Dịch sang tiếng Việt: Dịch vụ %s và %s không khớp" diff --git a/i18n/locales/zh/data.json b/i18n/locales/zh/data.json index 48ba187d..9f2fe781 100644 --- a/i18n/locales/zh/data.json +++ b/i18n/locales/zh/data.json @@ -18,7 +18,8 @@ "The login method: login with password is not enabled for the application": "该应用禁止采用密码登录方式", "The provider: %s is not enabled for the application": "该应用的提供商: %s未被启用", "Unauthorized operation": "未授权的操作", - "Unknown authentication type (not password or provider), form = %s": "未知的认证类型(非密码或第三方提供商):%s" + "Unknown authentication type (not password or provider), form = %s": "未知的认证类型(非密码或第三方提供商):%s", + "User's tag: %s is not listed in the application's tags": "用户的标签: %s不在该应用的标签列表中" }, "cas": { "Service %s and %s do not match": "服务%s与%s不匹配" diff --git a/object/application.go b/object/application.go index b7a96076..aaec8535 100644 --- a/object/application.go +++ b/object/application.go @@ -57,6 +57,7 @@ type Application struct { SignupItems []*SignupItem `xorm:"varchar(1000)" json:"signupItems"` GrantTypes []string `xorm:"varchar(1000)" json:"grantTypes"` OrganizationObj *Organization `xorm:"-" json:"organizationObj"` + Tags []string `xorm:"mediumtext" json:"tags"` ClientId string `xorm:"varchar(100)" json:"clientId"` ClientSecret string `xorm:"varchar(100)" json:"clientSecret"` diff --git a/object/init.go b/object/init.go index 79345184..d2656906 100644 --- a/object/init.go +++ b/object/init.go @@ -184,6 +184,7 @@ func initBuiltInApplication() { {Name: "Phone", Visible: true, Required: true, Prompted: false, Rule: "None"}, {Name: "Agreement", Visible: true, Required: true, Prompted: false, Rule: "None"}, }, + Tags: []string{}, RedirectUris: []string{}, ExpireInHours: 168, FormOffset: 2, diff --git a/object/init_data.go b/object/init_data.go index f920414a..083614d6 100644 --- a/object/init_data.go +++ b/object/init_data.go @@ -145,6 +145,9 @@ func readInitDataFromFile(filePath string) (*InitData, error) { if application.RedirectUris == nil { application.RedirectUris = []string{} } + if application.Tags == nil { + application.Tags = []string{} + } } for _, permission := range data.Permissions { if permission.Actions == nil { diff --git a/util/slice.go b/util/slice.go index cdc3cd37..ee2cc4b9 100644 --- a/util/slice.go +++ b/util/slice.go @@ -43,6 +43,15 @@ func ContainsString(values []string, val string) bool { return sort.SearchStrings(values, val) != len(values) } +func InSlice(slice []string, elem string) bool { + for _, val := range slice { + if val == elem { + return true + } + } + return false +} + func ReturnAnyNotEmpty(strs ...string) string { for _, str := range strs { if str != "" { diff --git a/web/src/ApplicationEditPage.js b/web/src/ApplicationEditPage.js index 475cc645..5281148b 100644 --- a/web/src/ApplicationEditPage.js +++ b/web/src/ApplicationEditPage.js @@ -132,6 +132,11 @@ class ApplicationEditPage extends React.Component { if (res.grantTypes === null || res.grantTypes === undefined || res.grantTypes.length === 0) { res.grantTypes = ["authorization_code"]; } + + if (res.tags === null || res.tags === undefined) { + res.tags = []; + } + this.setState({ application: res, }); @@ -312,6 +317,18 @@ class ApplicationEditPage extends React.Component { + + + {Setting.getLabel(i18next.t("organization:Tags"), i18next.t("application:Tags - Tooltip"))} : + + + + + {Setting.getLabel(i18next.t("provider:Client ID"), i18next.t("provider:Client ID - Tooltip"))} : diff --git a/web/src/locales/de/data.json b/web/src/locales/de/data.json index fe934fd9..7b8cf1bd 100644 --- a/web/src/locales/de/data.json +++ b/web/src/locales/de/data.json @@ -96,6 +96,7 @@ "Signup items": "Registrierungs Items", "Signup items - Tooltip": "Items, die Benutzer ausfüllen müssen, wenn sie neue Konten registrieren", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Die URL der Registrierungsseite wurde in die Zwischenablage kopiert. Bitte fügen Sie sie in einen Inkognito-Tab oder einen anderen Browser ein", + "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "The application does not allow to sign up new account": "Die Anwendung erlaubt es nicht, ein neues Konto zu registrieren", "Token expire": "Token läuft ab", "Token expire - Tooltip": "Ablaufzeit des Access-Tokens", diff --git a/web/src/locales/en/data.json b/web/src/locales/en/data.json index f463eb31..302c478a 100644 --- a/web/src/locales/en/data.json +++ b/web/src/locales/en/data.json @@ -96,6 +96,7 @@ "Signup items": "Signup items", "Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser", + "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "The application does not allow to sign up new account": "The application does not allow to sign up new account", "Token expire": "Token expire", "Token expire - Tooltip": "Access token expiration time", diff --git a/web/src/locales/es/data.json b/web/src/locales/es/data.json index 3713d094..30051940 100644 --- a/web/src/locales/es/data.json +++ b/web/src/locales/es/data.json @@ -96,6 +96,7 @@ "Signup items": "Artículos de registro", "Signup items - Tooltip": "Elementos para que los usuarios los completen al registrar nuevas cuentas", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "La URL de la página de registro se ha copiado correctamente en el portapapeles. Por favor, péguela en una ventana de incógnito o en otro navegador", + "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "The application does not allow to sign up new account": "La aplicación no permite registrarse una cuenta nueva", "Token expire": "Token expirado", "Token expire - Tooltip": "Tiempo de expiración del token de acceso", diff --git a/web/src/locales/fr/data.json b/web/src/locales/fr/data.json index a00bd48d..6ca30999 100644 --- a/web/src/locales/fr/data.json +++ b/web/src/locales/fr/data.json @@ -96,6 +96,7 @@ "Signup items": "Les éléments d'inscription", "Signup items - Tooltip": "Eléments à remplir par les utilisateurs lors de l'inscription de nouveaux comptes", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "URL de la page d'inscription copiée avec succès dans le presse-papiers, veuillez la coller dans la fenêtre de navigation privée ou dans un autre navigateur", + "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "The application does not allow to sign up new account": "L'application ne permet pas de créer un nouveau compte", "Token expire": "Le jeton expire", "Token expire - Tooltip": "Temps d'expiration de jeton d'accès", diff --git a/web/src/locales/id/data.json b/web/src/locales/id/data.json index b3d2e447..dc8b9bdd 100644 --- a/web/src/locales/id/data.json +++ b/web/src/locales/id/data.json @@ -96,6 +96,7 @@ "Signup items": "Item pendaftaran", "Signup items - Tooltip": "Item-item yang harus diisi pengguna saat mendaftar untuk akun baru", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Tautan halaman pendaftaran URL berhasil disalin ke papan klip, silakan tempelkan ke dalam jendela incognito atau browser lain", + "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "The application does not allow to sign up new account": "Aplikasi tidak memperbolehkan untuk mendaftar akun baru", "Token expire": "Token kadaluarsa", "Token expire - Tooltip": "Waktu kadaluwarsa token akses", diff --git a/web/src/locales/ja/data.json b/web/src/locales/ja/data.json index c49d71ed..388ebe99 100644 --- a/web/src/locales/ja/data.json +++ b/web/src/locales/ja/data.json @@ -96,6 +96,7 @@ "Signup items": "サインアップアイテム", "Signup items - Tooltip": "新しいアカウントを登録する際にユーザーが入力するアイテム", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "サインアップページのURLがクリップボードに正常にコピーされました。シークレットウィンドウまたは別のブラウザに貼り付けてください", + "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "The application does not allow to sign up new account": "アプリケーションでは新しいアカウントの登録ができません", "Token expire": "トークンの有効期限が切れました", "Token expire - Tooltip": "アクセストークンの有効期限", diff --git a/web/src/locales/ko/data.json b/web/src/locales/ko/data.json index bd472d19..f95ed65b 100644 --- a/web/src/locales/ko/data.json +++ b/web/src/locales/ko/data.json @@ -96,6 +96,7 @@ "Signup items": "가입 항목", "Signup items - Tooltip": "새로운 계정 등록시 사용자가 작성해야하는 항목들", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "가입 페이지 URL이 클립보드에 성공적으로 복사되었습니다. 시크릿 창이나 다른 브라우저에 붙여넣어 주십시오", + "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "The application does not allow to sign up new account": "이 어플리케이션은 새 계정 등록을 허용하지 않습니다", "Token expire": "토큰 만료", "Token expire - Tooltip": "액세스 토큰 만료 시간", diff --git a/web/src/locales/pt/data.json b/web/src/locales/pt/data.json index b815bd3c..f00b170c 100644 --- a/web/src/locales/pt/data.json +++ b/web/src/locales/pt/data.json @@ -96,6 +96,7 @@ "Signup items": "Itens de registro", "Signup items - Tooltip": "Itens para os usuários preencherem ao registrar novas contas", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "URL da página de registro copiada para a área de transferência com sucesso. Cole-a na janela anônima ou em outro navegador", + "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "The application does not allow to sign up new account": "A aplicação não permite o registro de novas contas", "Token expire": "Expiração do Token", "Token expire - Tooltip": "Tempo de expiração do token de acesso", diff --git a/web/src/locales/ru/data.json b/web/src/locales/ru/data.json index 2fb56684..6ceebd89 100644 --- a/web/src/locales/ru/data.json +++ b/web/src/locales/ru/data.json @@ -96,6 +96,7 @@ "Signup items": "Элементы регистрации", "Signup items - Tooltip": "Элементы, которые пользователи должны заполнить при регистрации новых аккаунтов", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Успешно скопирован URL страницы регистрации в буфер обмена, пожалуйста, вставьте его в режиме инкогнито или в другом браузере", + "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "The application does not allow to sign up new account": "Приложение не позволяет зарегистрироваться новому аккаунту", "Token expire": "Срок действия токена истекает", "Token expire - Tooltip": "Время истечения токена доступа", diff --git a/web/src/locales/vi/data.json b/web/src/locales/vi/data.json index eade073e..c20b4855 100644 --- a/web/src/locales/vi/data.json +++ b/web/src/locales/vi/data.json @@ -96,6 +96,7 @@ "Signup items": "Các mục đăng ký", "Signup items - Tooltip": "Các thông tin cần được người dùng điền khi đăng ký tài khoản mới", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Đã sao chép thành công đường dẫn trang đăng ký vào clipboard, vui lòng dán nó vào cửa sổ ẩn danh hoặc trình duyệt khác", + "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "The application does not allow to sign up new account": "Ứng dụng không cho phép đăng ký tài khoản mới", "Token expire": "Mã thông báo hết hạn", "Token expire - Tooltip": "Thời gian hết hạn của mã truy cập", diff --git a/web/src/locales/zh/data.json b/web/src/locales/zh/data.json index 81ee4a5a..42ebcda6 100644 --- a/web/src/locales/zh/data.json +++ b/web/src/locales/zh/data.json @@ -96,6 +96,7 @@ "Signup items": "注册项", "Signup items - Tooltip": "注册用户注册时需要填写的项目", "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "注册页面URL已成功复制到剪贴板,请粘贴到当前浏览器的隐身模式窗口或另一个浏览器访问", + "Tags - Tooltip": "用户的标签在应用的标签集合中时,用户才可以登录该应用", "The application does not allow to sign up new account": "该应用不允许注册新账户", "Token expire": "Access Token过期", "Token expire - Tooltip": "Access Token过期时间",