Compare commits

...

17 Commits

Author SHA1 Message Date
DacongDA
fea6317430 feat: add back support for non-discoverable credential WebAuthn login and display WebAuthn ID again (#3998) 2025-07-25 18:34:37 +08:00
DacongDA
5f702ca418 feat: make enableErrorMask work for corner cases by moving checks from controller to Translate() (#3996) 2025-07-25 00:39:01 +08:00
Robin Ye
0495d17a07 feat: support OAuth 2.0 form_post response mode (#3973) 2025-07-24 15:17:45 +08:00
Yang Luo
c6a2d59aa4 feat: update i18n strings 2025-07-24 15:15:19 +08:00
DacongDA
d867afdd70 feat: can set default value for "Auto sign in" in application edit page (#3987) 2025-07-22 22:57:01 +08:00
Attack825
a92430e8fd feat: fix auto sign-in flow on result page (#3983) 2025-07-22 20:19:45 +08:00
Yang Luo
447cb70553 feat: change some fields of organization and user to mediumtext 2025-07-21 23:43:17 +08:00
Yang Luo
e05fbec739 feat: keep backward compatibility in GetHashedPassword() 2025-07-21 19:32:59 +08:00
DacongDA
65ab36f073 feat: fix bug that GetHashedPassword() reports error (#3982) 2025-07-21 14:41:09 +08:00
M Zahid Rausyanfikri
d027e07383 feat: fix bug that needUpdatePassword is not respected (#3979) 2025-07-21 10:17:24 +08:00
DacongDA
d3c718b577 feat: fix bug that language cannot be switched to user selected language (#3980) 2025-07-21 10:16:07 +08:00
DacongDA
ea68e6c2dc feat: support inline-captcha in login page (#3970) 2025-07-19 01:12:07 +08:00
raiki02
7aa0b2e63f feat: change the method "login" to correct param "signup" (#3971) 2025-07-19 00:49:00 +08:00
raiki02
a39b121280 feat: support WeChat login directly in login page (#3957) 2025-07-18 01:29:31 +08:00
DacongDA
feef4cc242 feat: set ResponseModesSupported to standard OIDC: "query", "fragment" (#3968) 2025-07-17 10:20:37 +08:00
Attack825
1b5ef53655 feat: fix tour bug about orgIsTourVisible settings (#3965) 2025-07-16 18:00:44 +08:00
Attack825
18d639cca2 feat: fix tour button (#3961) 2025-07-16 12:02:14 +08:00
74 changed files with 649 additions and 117 deletions

View File

@@ -286,8 +286,7 @@ func (c *ApiController) Signup() {
}
}
if application.HasPromptPage() && user.Type == "normal-user" {
// The prompt page needs the user to be signed in
if user.Type == "normal-user" {
c.SetSessionUsername(user.GetId())
}

View File

@@ -54,13 +54,6 @@ func (c *ApiController) ResponseError(error string, data ...interface{}) {
return
}
enableErrorMask := conf.GetConfigBool("enableErrorMask")
if enableErrorMask {
if strings.HasPrefix(error, "The user: ") && strings.HasSuffix(error, " doesn't exist") || strings.HasPrefix(error, "用户: ") && strings.HasSuffix(error, "不存在") {
error = c.T("check:password or code is incorrect")
}
}
resp := &Response{Status: "error", Msg: error}
c.ResponseJsonData(resp, data...)
}

View File

@@ -17,6 +17,7 @@ package controllers
import (
"bytes"
"encoding/base64"
"fmt"
"io"
"github.com/casdoor/casdoor/form"
@@ -47,6 +48,13 @@ func (c *ApiController) WebAuthnSignupBegin() {
registerOptions := func(credCreationOpts *protocol.PublicKeyCredentialCreationOptions) {
credCreationOpts.CredentialExcludeList = user.CredentialExcludeList()
credCreationOpts.AuthenticatorSelection.ResidentKey = "preferred"
credCreationOpts.Attestation = "none"
ext := map[string]interface{}{
"credProps": true,
}
credCreationOpts.Extensions = ext
}
options, sessionData, err := webauthnObj.BeginRegistration(
user,
@@ -118,7 +126,34 @@ func (c *ApiController) WebAuthnSigninBegin() {
return
}
options, sessionData, err := webauthnObj.BeginDiscoverableLogin()
userOwner := c.Input().Get("owner")
userName := c.Input().Get("name")
var options *protocol.CredentialAssertion
var sessionData *webauthn.SessionData
if userName == "" {
options, sessionData, err = webauthnObj.BeginDiscoverableLogin()
} else {
var user *object.User
user, err = object.GetUserByFields(userOwner, userName)
if err != nil {
c.ResponseError(err.Error())
return
}
if user == nil {
c.ResponseError(fmt.Sprintf(c.T("general:The user: %s doesn't exist"), util.GetId(userOwner, userName)))
return
}
if len(user.WebauthnCredentials) == 0 {
c.ResponseError(c.T("webauthn:Found no credentials for this user"))
return
}
options, sessionData, err = webauthnObj.BeginLogin(user)
}
if err != nil {
c.ResponseError(err.Error())
return
@@ -153,15 +188,27 @@ func (c *ApiController) WebAuthnSigninFinish() {
c.Ctx.Request.Body = io.NopCloser(bytes.NewBuffer(c.Ctx.Input.RequestBody))
var user *object.User
handler := func(rawID, userHandle []byte) (webauthn.User, error) {
user, err = object.GetUserByWebauthID(base64.StdEncoding.EncodeToString(rawID))
if sessionData.UserID != nil {
userId := string(sessionData.UserID)
user, err = object.GetUser(userId)
if err != nil {
return nil, err
c.ResponseError(err.Error())
return
}
return user, nil
_, err = webauthnObj.FinishLogin(user, sessionData, c.Ctx.Request)
} else {
handler := func(rawID, userHandle []byte) (webauthn.User, error) {
user, err = object.GetUserByWebauthID(base64.StdEncoding.EncodeToString(rawID))
if err != nil {
return nil, err
}
return user, nil
}
_, err = webauthnObj.FinishDiscoverableLogin(handler, sessionData, c.Ctx.Request)
}
_, err = webauthnObj.FinishDiscoverableLogin(handler, sessionData, c.Ctx.Request)
if err != nil {
c.ResponseError(err.Error())
return

View File

@@ -38,9 +38,20 @@ func NewMd5UserSaltCredManager() *Md5UserSaltCredManager {
}
func (cm *Md5UserSaltCredManager) GetHashedPassword(password string, salt string) string {
if salt == "" {
return getMd5HexDigest(password)
}
return getMd5HexDigest(getMd5HexDigest(password) + salt)
}
func (cm *Md5UserSaltCredManager) IsPasswordCorrect(plainPwd string, hashedPwd string, salt string) bool {
// For backward-compatibility
if salt == "" {
if hashedPwd == cm.GetHashedPassword(getMd5HexDigest(plainPwd), salt) {
return true
}
}
return hashedPwd == cm.GetHashedPassword(plainPwd, salt)
}

View File

@@ -38,9 +38,20 @@ func NewSha256SaltCredManager() *Sha256SaltCredManager {
}
func (cm *Sha256SaltCredManager) GetHashedPassword(password string, salt string) string {
if salt == "" {
return getSha256HexDigest(password)
}
return getSha256HexDigest(getSha256HexDigest(password) + salt)
}
func (cm *Sha256SaltCredManager) IsPasswordCorrect(plainPwd string, hashedPwd string, salt string) bool {
// For backward-compatibility
if salt == "" {
if hashedPwd == cm.GetHashedPassword(getSha256HexDigest(plainPwd), salt) {
return true
}
}
return hashedPwd == cm.GetHashedPassword(plainPwd, salt)
}

View File

@@ -38,9 +38,20 @@ func NewSha512SaltCredManager() *Sha512SaltCredManager {
}
func (cm *Sha512SaltCredManager) GetHashedPassword(password string, salt string) string {
if salt == "" {
return getSha512HexDigest(password)
}
return getSha512HexDigest(getSha512HexDigest(password) + salt)
}
func (cm *Sha512SaltCredManager) IsPasswordCorrect(plainPwd string, hashedPwd string, salt string) bool {
// For backward-compatibility
if salt == "" {
if hashedPwd == cm.GetHashedPassword(getSha512HexDigest(plainPwd), salt) {
return true
}
}
return hashedPwd == cm.GetHashedPassword(plainPwd, salt)
}

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Vaše oblast neumožňuje registraci pomocí telefonu",
"password or code is incorrect": "heslo nebo kód je nesprávné",
"password or code is incorrect, you have %d remaining chances": "heslo nebo kód je nesprávné, máte %d zbývajících pokusů",
"password or code is incorrect, you have %s remaining chances": "heslo nebo kód je nesprávné, máte %s zbývajících pokusů",
"unsupported password type: %s": "nepodporovaný typ hesla: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Ihre Region ist nicht berechtigt, sich telefonisch anzumelden",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "Das Passwort oder der Code ist falsch. Du hast noch %d Versuche übrig",
"password or code is incorrect, you have %s remaining chances": "Das Passwort oder der Code ist falsch. Du hast noch %s Versuche übrig",
"unsupported password type: %s": "Nicht unterstützter Passworttyp: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Tu región no está permitida para registrarse por teléfono",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "Contraseña o código incorrecto, tienes %d intentos restantes",
"password or code is incorrect, you have %s remaining chances": "Contraseña o código incorrecto, tienes %s intentos restantes",
"unsupported password type: %s": "Tipo de contraseña no compatible: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "منطقه شما اجازه ثبت‌نام با تلفن را ندارد",
"password or code is incorrect": "رمز عبور یا کد نادرست است",
"password or code is incorrect, you have %d remaining chances": "رمز عبور یا کد نادرست است، شما %d فرصت باقی‌مانده دارید",
"password or code is incorrect, you have %s remaining chances": "رمز عبور یا کد نادرست است، شما %s فرصت باقی‌مانده دارید",
"unsupported password type: %s": "نوع رمز عبور پشتیبانی نشده: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Votre région n'est pas autorisée à s'inscrire par téléphone",
"password or code is incorrect": "mot de passe ou code invalide",
"password or code is incorrect, you have %d remaining chances": "Le mot de passe ou le code est incorrect, il vous reste %d chances",
"password or code is incorrect, you have %s remaining chances": "Le mot de passe ou le code est incorrect, il vous reste %s chances",
"unsupported password type: %s": "Type de mot de passe non pris en charge : %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Wilayah Anda tidak diizinkan untuk mendaftar melalui telepon",
"password or code is incorrect": "kata sandi atau kode salah",
"password or code is incorrect, you have %d remaining chances": "Sandi atau kode salah, Anda memiliki %d kesempatan tersisa",
"password or code is incorrect, you have %s remaining chances": "Sandi atau kode salah, Anda memiliki %s kesempatan tersisa",
"unsupported password type: %s": "jenis sandi tidak didukung: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "あなたの地域は電話でサインアップすることができません",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "パスワードまたはコードが間違っています。あと%d回の試行機会があります",
"password or code is incorrect, you have %s remaining chances": "パスワードまたはコードが間違っています。あと%s回の試行機会があります",
"unsupported password type: %s": "サポートされていないパスワードタイプ:%s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "당신의 지역은 전화로 가입할 수 없습니다",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "암호 또는 코드가 올바르지 않습니다. %d번의 기회가 남아 있습니다",
"password or code is incorrect, you have %s remaining chances": "암호 또는 코드가 올바르지 않습니다. %s번의 기회가 남아 있습니다",
"unsupported password type: %s": "지원되지 않는 암호 유형: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "senha ou código incorreto",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Ваш регион не разрешает регистрацию по телефону",
"password or code is incorrect": "неправильный пароль или код",
"password or code is incorrect, you have %d remaining chances": "Неправильный пароль или код, у вас осталось %d попыток",
"password or code is incorrect, you have %s remaining chances": "Неправильный пароль или код, у вас осталось %s попыток",
"unsupported password type: %s": "неподдерживаемый тип пароля: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Váš región neumožňuje registráciu cez telefón",
"password or code is incorrect": "heslo alebo kód je nesprávne",
"password or code is incorrect, you have %d remaining chances": "heslo alebo kód je nesprávne, máte %d zostávajúcich pokusov",
"password or code is incorrect, you have %s remaining chances": "heslo alebo kód je nesprávne, máte %s zostávajúcich pokusov",
"unsupported password type: %s": "nepodporovaný typ hesla: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "şifre veya kod hatalı",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Your region is not allow to signup by phone",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "password or code is incorrect, you have %d remaining chances",
"password or code is incorrect, you have %s remaining chances": "password or code is incorrect, you have %s remaining chances",
"unsupported password type: %s": "unsupported password type: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"",
"Your region is not allow to signup by phone": "Vùng của bạn không được phép đăng ký bằng điện thoại",
"password or code is incorrect": "password or code is incorrect",
"password or code is incorrect, you have %d remaining chances": "Mật khẩu hoặc mã không chính xác, bạn còn %d lần cơ hội",
"password or code is incorrect, you have %s remaining chances": "Mật khẩu hoặc mã không chính xác, bạn còn %s lần cơ hội",
"unsupported password type: %s": "Loại mật khẩu không được hỗ trợ: %s"
},
"enforcer": {

View File

@@ -85,7 +85,7 @@
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "您的密码已过期。请点击 \\\"忘记密码\\\" 以重置密码",
"Your region is not allow to signup by phone": "所在地区不支持手机号注册",
"password or code is incorrect": "密码错误",
"password or code is incorrect, you have %d remaining chances": "密码错误,您还有 %d 次尝试的机会",
"password or code is incorrect, you have %s remaining chances": "密码错误,您还有 %s 次尝试的机会",
"unsupported password type: %s": "不支持的密码类型: %s"
},
"enforcer": {

View File

@@ -19,14 +19,21 @@ import (
"fmt"
"strings"
"github.com/casdoor/casdoor/conf"
"github.com/casdoor/casdoor/util"
)
var enableErrorMask = false
//go:embed locales/*/data.json
var f embed.FS
var langMap = make(map[string]map[string]map[string]string) // for example : langMap[en][account][Invalid information] = Invalid information
func init() {
enableErrorMask = conf.GetConfigBool("enableErrorMask")
}
func getI18nFilePath(category string, language string) string {
if category == "backend" {
return fmt.Sprintf("../i18n/locales/%s/data.json", language)
@@ -74,6 +81,15 @@ func applyData(data1 *I18nData, data2 *I18nData) {
}
func Translate(language string, errorText string) string {
modified := false
if enableErrorMask {
if errorText == "general:The user: %s doesn't exist" ||
errorText == "check:password or code is incorrect, you have %s remaining chances" {
modified = true
errorText = "check:password or code is incorrect"
}
}
tokens := strings.SplitN(errorText, ":", 2)
if !strings.Contains(errorText, ":") || len(tokens) != 2 {
return fmt.Sprintf("Translate error: the error text doesn't contain \":\", errorText = %s", errorText)
@@ -97,5 +113,9 @@ func Translate(language string, errorText string) string {
if res == "" {
res = tokens[1]
}
if modified {
res += "%.s"
}
return res
}

View File

@@ -17,6 +17,7 @@ package object
import (
"fmt"
"regexp"
"strconv"
"time"
"github.com/casdoor/casdoor/i18n"
@@ -100,7 +101,7 @@ func recordSigninErrorInfo(user *User, lang string, options ...bool) error {
if leftChances == 0 && enableCaptcha {
return fmt.Errorf(i18n.Translate(lang, "check:password or code is incorrect"))
} else if leftChances >= 0 {
return fmt.Errorf(i18n.Translate(lang, "check:password or code is incorrect, you have %d remaining chances"), leftChances)
return fmt.Errorf(i18n.Translate(lang, "check:password or code is incorrect, you have %s remaining chances"), strconv.Itoa(leftChances))
}
// don't show the chance error message if the user has no chance left

View File

@@ -124,7 +124,7 @@ func GetOidcDiscovery(host string) OidcDiscovery {
JwksUri: fmt.Sprintf("%s/.well-known/jwks", originBackend),
IntrospectionEndpoint: fmt.Sprintf("%s/api/login/oauth/introspect", originBackend),
ResponseTypesSupported: []string{"code", "token", "id_token", "code token", "code id_token", "token id_token", "code token id_token", "none"},
ResponseModesSupported: []string{"query", "fragment", "login", "code", "link"},
ResponseModesSupported: []string{"query", "fragment", "form_post"},
GrantTypesSupported: []string{"password", "authorization_code"},
SubjectTypesSupported: []string{"public"},
IdTokenSigningAlgValuesSupported: []string{"RS256", "RS512", "ES256", "ES384", "ES512"},

View File

@@ -81,12 +81,12 @@ type Organization struct {
UseEmailAsUsername bool `json:"useEmailAsUsername"`
EnableTour bool `json:"enableTour"`
IpRestriction string `json:"ipRestriction"`
NavItems []string `xorm:"varchar(1000)" json:"navItems"`
WidgetItems []string `xorm:"varchar(1000)" json:"widgetItems"`
NavItems []string `xorm:"mediumtext" json:"navItems"`
WidgetItems []string `xorm:"mediumtext" json:"widgetItems"`
MfaItems []*MfaItem `xorm:"varchar(300)" json:"mfaItems"`
MfaRememberInHours int `json:"mfaRememberInHours"`
AccountItems []*AccountItem `xorm:"varchar(5000)" json:"accountItems"`
AccountItems []*AccountItem `xorm:"mediumtext" json:"accountItems"`
}
func GetOrganizationCount(owner, name, field, value string) (int64, error) {

View File

@@ -190,7 +190,7 @@ type User struct {
WebauthnCredentials []webauthn.Credential `xorm:"webauthnCredentials blob" json:"webauthnCredentials"`
PreferredMfaType string `xorm:"varchar(100)" json:"preferredMfaType"`
RecoveryCodes []string `xorm:"varchar(1000)" json:"recoveryCodes"`
RecoveryCodes []string `xorm:"mediumtext" json:"recoveryCodes"`
TotpSecret string `xorm:"varchar(100)" json:"totpSecret"`
MfaPhoneEnabled bool `json:"mfaPhoneEnabled"`
MfaEmailEnabled bool `json:"mfaEmailEnabled"`
@@ -204,7 +204,7 @@ type User struct {
Roles []*Role `json:"roles"`
Permissions []*Permission `json:"permissions"`
Groups []string `xorm:"groups varchar(1000)" json:"groups"`
Groups []string `xorm:"mediumtext" json:"groups"`
LastChangePasswordTime string `xorm:"varchar(100)" json:"lastChangePasswordTime"`
LastSigninWrongTime string `xorm:"varchar(100)" json:"lastSigninWrongTime"`

View File

@@ -247,7 +247,9 @@ class App extends Component {
account.organization = res.data2;
accessToken = res.data.accessToken;
this.setLanguage(account);
if (!localStorage.getItem("language")) {
this.setLanguage(account);
}
this.setTheme(Setting.getThemeData(account.organization), Conf.InitThemeAlgorithm);
setTourLogo(account.organization.logo);
setOrgIsTourVisible(account.organization.enableTour);

View File

@@ -1237,7 +1237,7 @@ class ApplicationEditPage extends React.Component {
submitApplicationEdit(exitAfterSave) {
const application = Setting.deepCopy(this.state.application);
application.providers = application.providers?.filter(provider => this.state.providers.map(provider => provider.name).includes(provider.name));
application.signinMethods = application.signinMethods?.filter(signinMethod => ["Password", "Verification code", "WebAuthn", "LDAP", "Face ID"].includes(signinMethod.name));
application.signinMethods = application.signinMethods?.filter(signinMethod => ["Password", "Verification code", "WebAuthn", "LDAP", "Face ID", "WeChat"].includes(signinMethod.name));
ApplicationBackend.updateApplication("admin", this.state.applicationName, application)
.then((res) => {

View File

@@ -208,10 +208,14 @@ let orgIsTourVisible = true;
export function setOrgIsTourVisible(visible) {
orgIsTourVisible = visible;
if (orgIsTourVisible === false) {
setIsTourVisible(false);
}
}
export function setIsTourVisible(visible) {
localStorage.setItem("isTourVisible", visible);
window.dispatchEvent(new Event("storageTourChanged"));
}
export function setTourLogo(tourLogoSrc) {
@@ -221,7 +225,7 @@ export function setTourLogo(tourLogoSrc) {
}
export function getTourVisible() {
return localStorage.getItem("isTourVisible") !== "false" && orgIsTourVisible;
return localStorage.getItem("isTourVisible") !== "false";
}
export function getNextButtonChild(nextPathName) {

View File

@@ -35,6 +35,30 @@ class AuthCallback extends React.Component {
};
}
submitFormPost(redirectUri, code, state) {
const form = document.createElement("form");
form.method = "post";
form.action = redirectUri;
const codeInput = document.createElement("input");
codeInput.type = "hidden";
codeInput.name = "code";
codeInput.value = code;
form.appendChild(codeInput);
if (state) {
const stateInput = document.createElement("input");
stateInput.type = "hidden";
stateInput.name = "state";
stateInput.value = state;
form.appendChild(stateInput);
}
document.body.appendChild(form);
form.submit();
setTimeout(() => form.remove(), 1000);
}
getInnerParams() {
// For example, for Casbin-OA, realRedirectUri = "http://localhost:9000/login"
// realRedirectUrl = "http://localhost:9000"
@@ -158,6 +182,7 @@ class AuthCallback extends React.Component {
// OAuth
const oAuthParams = Util.getOAuthGetParameters(innerParams);
const concatChar = oAuthParams?.redirectUri?.includes("?") ? "&" : "?";
const responseMode = oAuthParams?.responseMode || "query"; // Default to "query" if not specified
const signinUrl = localStorage.getItem("signinUrl");
AuthBackend.login(body, oAuthParams)
@@ -181,8 +206,13 @@ class AuthCallback extends React.Component {
Setting.goToLinkSoft(this, `/forget/${applicationName}`);
return;
}
const code = res.data;
Setting.goToLink(`${oAuthParams.redirectUri}${concatChar}code=${code}&state=${oAuthParams.state}`);
if (responseMode === "form_post") {
this.submitFormPost(oAuthParams?.redirectUri, res.data, oAuthParams?.state);
} else {
const code = res.data;
Setting.goToLink(`${oAuthParams.redirectUri}${concatChar}code=${code}&state=${oAuthParams.state}`);
}
// Setting.showMessage("success", `Authorization code: ${res.data}`);
} else if (responseType === "token" || responseType === "id_token") {
if (res.data3) {

View File

@@ -38,6 +38,7 @@ import {RequiredMfa} from "./mfa/MfaAuthVerifyForm";
import {GoogleOneTapLoginVirtualButton} from "./GoogleLoginButton";
import * as ProviderButton from "./ProviderButton";
import {goToLink} from "../Setting";
import WeChatLoginPanel from "./WeChatLoginPanel";
const FaceRecognitionCommonModal = lazy(() => import("../common/modal/FaceRecognitionCommonModal"));
const FaceRecognitionModal = lazy(() => import("../common/modal/FaceRecognitionModal"));
@@ -346,7 +347,7 @@ class LoginPage extends React.Component {
return;
}
if (resp.data2) {
if (resp.data3) {
sessionStorage.setItem("signinUrl", window.location.pathname + window.location.search);
Setting.goToLinkSoft(ths, `/forget/${application.name}`);
return;
@@ -436,18 +437,26 @@ class LoginPage extends React.Component {
values["password"] = passwordCipher;
}
const captchaRule = this.getCaptchaRule(this.getApplicationObj());
if (captchaRule === CaptchaRule.Always) {
this.setState({
openCaptchaModal: true,
values: values,
});
return;
} else if (captchaRule === CaptchaRule.Dynamic) {
this.checkCaptchaStatus(values);
return;
} else if (captchaRule === CaptchaRule.InternetOnly) {
this.checkCaptchaStatus(values);
return;
const application = this.getApplicationObj();
const noModal = application?.signinItems.map(signinItem => signinItem.name === "Captcha" && signinItem.rule === "inline").includes(true);
if (!noModal) {
if (captchaRule === CaptchaRule.Always) {
this.setState({
openCaptchaModal: true,
values: values,
});
return;
} else if (captchaRule === CaptchaRule.Dynamic) {
this.checkCaptchaStatus(values);
return;
} else if (captchaRule === CaptchaRule.InternetOnly) {
this.checkCaptchaStatus(values);
return;
}
} else {
values["captchaType"] = this.state?.captchaValues?.captchaType;
values["captchaToken"] = this.state?.captchaValues?.captchaToken;
values["clientSecret"] = this.state?.captchaValues?.clientSecret;
}
}
this.login(values);
@@ -628,9 +637,6 @@ class LoginPage extends React.Component {
)
;
} else if (signinItem.name === "Username") {
if (this.state.loginMethod === "webAuthn") {
return null;
}
return (
<div key={resultItemKey}>
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
@@ -640,7 +646,7 @@ class LoginPage extends React.Component {
label={signinItem.label ? signinItem.label : null}
rules={[
{
required: true,
required: this.state.loginMethod !== "webAuthn",
message: () => {
switch (this.state.loginMethod) {
case "verificationCodeEmail":
@@ -774,7 +780,7 @@ class LoginPage extends React.Component {
</>
}
{
this.renderCaptchaModal(application)
application?.signinItems.map(signinItem => signinItem.name === "Captcha" && signinItem.rule === "inline").includes(true) ? null : this.renderCaptchaModal(application, false)
}
</Form.Item>
);
@@ -818,6 +824,8 @@ class LoginPage extends React.Component {
</Form.Item>
</div>
);
} else if (signinItem.name === "Captcha" && signinItem.rule === "inline") {
return this.renderCaptchaModal(application, true);
} else if (signinItem.name.startsWith("Text ") || signinItem?.isCustom) {
return (
<div key={resultItemKey} dangerouslySetInnerHTML={{__html: signinItem.customCss}} />
@@ -877,13 +885,17 @@ class LoginPage extends React.Component {
loginWidth += 10;
}
if (this.state.loginMethod === "wechat") {
return (<WeChatLoginPanel application={application} renderFormItem={this.renderFormItem.bind(this)} loginMethod={this.state.loginMethod} loginWidth={loginWidth} renderMethodChoiceBox={this.renderMethodChoiceBox.bind(this)} />);
}
return (
<Form
name="normal_login"
initialValues={{
organization: application.organization,
application: application.name,
autoSignin: true,
autoSignin: !application?.signinItems.map(signinItem => signinItem.name === "Forgot password?" && signinItem.rule === "Auto sign in - False")?.includes(true),
username: Conf.ShowGithubCorner ? "admin" : "",
password: Conf.ShowGithubCorner ? "123" : "",
}}
@@ -959,7 +971,7 @@ class LoginPage extends React.Component {
});
}
renderCaptchaModal(application) {
renderCaptchaModal(application, noModal) {
if (this.getCaptchaRule(this.getApplicationObj()) === CaptchaRule.Never) {
return null;
}
@@ -988,6 +1000,12 @@ class LoginPage extends React.Component {
owner={provider.owner}
name={provider.name}
visible={this.state.openCaptchaModal}
noModal={noModal}
onUpdateToken={(captchaType, captchaToken, clientSecret) => {
this.setState({captchaValues: {
captchaType, captchaToken, clientSecret,
}});
}}
onOk={(captchaType, captchaToken, clientSecret) => {
const values = this.state.values;
values["captchaType"] = captchaType;
@@ -1072,7 +1090,8 @@ class LoginPage extends React.Component {
const oAuthParams = Util.getOAuthGetParameters();
this.populateOauthValues(values);
const application = this.getApplicationObj();
return fetch(`${Setting.ServerUrl}/api/webauthn/signin/begin?owner=${application.organization}`, {
const usernameParam = `&name=${encodeURIComponent(username)}`;
return fetch(`${Setting.ServerUrl}/api/webauthn/signin/begin?owner=${application.organization}${username ? usernameParam : ""}`, {
method: "GET",
credentials: "include",
})
@@ -1084,6 +1103,12 @@ class LoginPage extends React.Component {
}
credentialRequestOptions.publicKey.challenge = UserWebauthnBackend.webAuthnBufferDecode(credentialRequestOptions.publicKey.challenge);
if (username) {
credentialRequestOptions.publicKey.allowCredentials.forEach(function(listItem) {
listItem.id = UserWebauthnBackend.webAuthnBufferDecode(listItem.id);
});
}
return navigator.credentials.get({
publicKey: credentialRequestOptions.publicKey,
});
@@ -1204,6 +1229,7 @@ class LoginPage extends React.Component {
[generateItemKey("WebAuthn", "None"), {label: i18next.t("login:WebAuthn"), key: "webAuthn"}],
[generateItemKey("LDAP", "None"), {label: i18next.t("login:LDAP"), key: "ldap"}],
[generateItemKey("Face ID", "None"), {label: i18next.t("login:Face ID"), key: "faceId"}],
[generateItemKey("WeChat", "None"), {label: i18next.t("login:WeChat"), key: "wechat"}],
]);
application?.signinMethods?.forEach((signinMethod) => {
@@ -1225,7 +1251,7 @@ class LoginPage extends React.Component {
if (items.length > 1) {
return (
<div>
<Tabs className="signin-methods" items={items} size={"small"} defaultActiveKey={this.getDefaultLoginMethod(application)} onChange={(key) => {
<Tabs className="signin-methods" items={items} size={"small"} activeKey={this.state.loginMethod} onChange={(key) => {
this.setState({loginMethod: key});
}} centered>
</Tabs>

View File

@@ -18,6 +18,7 @@ import i18next from "i18next";
import {authConfig} from "./Auth";
import * as ApplicationBackend from "../backend/ApplicationBackend";
import * as Setting from "../Setting";
import * as AuthBackend from "./AuthBackend";
class ResultPage extends React.Component {
constructor(props) {
@@ -60,6 +61,22 @@ class ResultPage extends React.Component {
this.props.onUpdateApplication(application);
}
handleSignIn = () => {
AuthBackend.getAccount()
.then((res) => {
if (res.status === "ok" && res.data) {
const linkInStorage = sessionStorage.getItem("signinUrl");
if (linkInStorage !== null && linkInStorage !== "") {
window.location.href = linkInStorage;
} else {
Setting.goToLink("/");
}
} else {
Setting.redirectToLoginPage(this.state.application, this.props.history);
}
});
};
render() {
const application = this.state.application;
@@ -89,14 +106,7 @@ class ResultPage extends React.Component {
title={i18next.t("signup:Your account has been created!")}
subTitle={i18next.t("signup:Please click the below button to sign in")}
extra={[
<Button type="primary" key="login" onClick={() => {
const linkInStorage = sessionStorage.getItem("signinUrl");
if (linkInStorage !== null && linkInStorage !== "") {
Setting.goToLinkSoft(this, linkInStorage);
} else {
Setting.redirectToLoginPage(application, this.props.history);
}
}}>
<Button type="primary" key="login" onClick={this.handleSignIn}>
{i18next.t("login:Sign In")}
</Button>,
]}

View File

@@ -141,6 +141,7 @@ export function getOAuthGetParameters(params) {
const nonce = getRefinedValue(queries.get("nonce"));
const challengeMethod = getRefinedValue(queries.get("code_challenge_method"));
const codeChallenge = getRefinedValue(queries.get("code_challenge"));
const responseMode = getRefinedValue(queries.get("response_mode"));
const samlRequest = getRefinedValue(lowercaseQueries["samlRequest".toLowerCase()]);
const relayState = getRefinedValue(lowercaseQueries["RelayState".toLowerCase()]);
const noRedirect = getRefinedValue(lowercaseQueries["noRedirect".toLowerCase()]);
@@ -159,6 +160,7 @@ export function getOAuthGetParameters(params) {
nonce: nonce,
challengeMethod: challengeMethod,
codeChallenge: codeChallenge,
responseMode: responseMode,
samlRequest: samlRequest,
relayState: relayState,
noRedirect: noRedirect,

View File

@@ -0,0 +1,106 @@
// Copyright 2025 The Casdoor Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import React from "react";
import * as AuthBackend from "./AuthBackend";
import i18next from "i18next";
import * as Util from "./Util";
class WeChatLoginPanel extends React.Component {
constructor(props) {
super(props);
this.state = {
qrCode: null,
loading: false,
ticket: null,
};
this.pollingTimer = null;
}
UNSAFE_componentWillMount() {
this.fetchQrCode();
}
componentDidUpdate(prevProps) {
if (this.props.loginMethod === "wechat" && prevProps.loginMethod !== "wechat") {
this.fetchQrCode();
}
if (prevProps.loginMethod === "wechat" && this.props.loginMethod !== "wechat") {
this.setState({qrCode: null, loading: false, ticket: null});
this.clearPolling();
}
}
componentWillUnmount() {
this.clearPolling();
}
clearPolling() {
if (this.pollingTimer) {
clearInterval(this.pollingTimer);
this.pollingTimer = null;
}
}
fetchQrCode() {
const {application} = this.props;
const wechatProviderItem = application?.providers?.find(p => p.provider?.type === "WeChat");
if (wechatProviderItem) {
this.setState({loading: true, qrCode: null, ticket: null});
AuthBackend.getWechatQRCode(`${wechatProviderItem.provider.owner}/${wechatProviderItem.provider.name}`).then(res => {
if (res.status === "ok" && res.data) {
this.setState({qrCode: res.data, loading: false, ticket: res.data2});
this.clearPolling();
this.pollingTimer = setInterval(() => {
Util.getEvent(application, wechatProviderItem.provider, res.data2, "signup");
}, 1000);
} else {
this.setState({qrCode: null, loading: false, ticket: null});
this.clearPolling();
}
}).catch(() => {
this.setState({qrCode: null, loading: false, ticket: null});
this.clearPolling();
});
}
}
render() {
const {application, loginWidth = 320} = this.props;
const {loading, qrCode} = this.state;
return (
<div style={{width: loginWidth, margin: "0 auto", textAlign: "center", marginTop: 16}}>
{application.signinItems?.filter(item => item.name === "Logo").map(signinItem => this.props.renderFormItem(application, signinItem))}
{this.props.renderMethodChoiceBox()}
{application.signinItems?.filter(item => item.name === "Languages").map(signinItem => this.props.renderFormItem(application, signinItem))}
{loading ? (
<div style={{marginTop: 16}}>
<span>{i18next.t("login:Loading")}</span>
</div>
) : qrCode ? (
<div style={{marginTop: 2}}>
<img src={`data:image/png;base64,${qrCode}`} alt="WeChat QR code" style={{width: 250, height: 250}} />
<div style={{marginTop: 8}}>
<a onClick={e => {e.preventDefault(); this.fetchQrCode();}}>
{i18next.t("login:Refresh")}
</a>
</div>
</div>
) : null}
</div>
);
}
}
export default WeChatLoginPanel;

View File

@@ -31,6 +31,7 @@ export function registerWebauthnCredential() {
credentialCreationOptions.publicKey.excludeCredentials[i].id = webAuthnBufferDecode(credentialCreationOptions.publicKey.excludeCredentials[i].id);
}
}
return navigator.credentials.create({
publicKey: credentialCreationOptions.publicKey,
});

View File

@@ -20,7 +20,7 @@ import {CaptchaWidget} from "../CaptchaWidget";
import {SafetyOutlined} from "@ant-design/icons";
export const CaptchaModal = (props) => {
const {owner, name, visible, onOk, onCancel, isCurrentProvider} = props;
const {owner, name, visible, onOk, onUpdateToken, onCancel, isCurrentProvider, noModal} = props;
const [captchaType, setCaptchaType] = React.useState("none");
const [clientId, setClientId] = React.useState("");
@@ -36,16 +36,16 @@ export const CaptchaModal = (props) => {
const defaultInputRef = React.useRef(null);
useEffect(() => {
if (visible) {
if (visible || noModal) {
loadCaptcha();
} else {
handleCancel();
setOpen(false);
}
}, [visible]);
}, [visible, noModal]);
useEffect(() => {
if (captchaToken !== "" && captchaType !== "Default") {
if (captchaToken !== "" && captchaType !== "Default" && !noModal) {
handleOk();
}
}, [captchaToken]);
@@ -81,6 +81,36 @@ export const CaptchaModal = (props) => {
};
const renderDefaultCaptcha = () => {
if (noModal) {
return (
<Row style={{textAlign: "center"}}>
<Col
style={{flex: noModal ? "70%" : "100%"}}>
<Input
ref={defaultInputRef}
value={captchaToken}
prefix={<SafetyOutlined />}
placeholder={i18next.t("general:Captcha")}
onChange={(e) => onChange(e.target.value)}
/>
</Col>
<Col
style={{
flex: noModal ? "30%" : "100%",
}}
>
<img src={`data:image/png;base64,${captchaImg}`}
onClick={loadCaptcha}
style={{
borderRadius: "5px",
border: "1px solid #ccc",
marginBottom: "20px",
width: "100%",
}} alt="captcha" />
</Col>
</Row>
);
}
return (
<Col style={{textAlign: "center"}}>
<div style={{display: "inline-block"}}>
@@ -113,6 +143,9 @@ export const CaptchaModal = (props) => {
const onChange = (token) => {
setCaptchaToken(token);
if (noModal) {
onUpdateToken?.(captchaType, token, clientSecret);
}
};
const renderCaptcha = () => {
@@ -153,28 +186,33 @@ export const CaptchaModal = (props) => {
return null;
};
return (
<Modal
closable={true}
maskClosable={false}
destroyOnClose={true}
title={i18next.t("general:Captcha")}
open={open}
okText={i18next.t("general:OK")}
cancelText={i18next.t("general:Cancel")}
width={350}
footer={renderFooter()}
onCancel={handleCancel}
afterClose={handleCancel}
onOk={handleOk}
>
<div style={{marginTop: "20px", marginBottom: "50px"}}>
{
renderCaptcha()
}
</div>
</Modal>
);
if (noModal) {
return renderCaptcha();
} else {
return (
<Modal
closable={true}
maskClosable={false}
destroyOnClose={true}
title={i18next.t("general:Captcha")}
open={open}
okText={i18next.t("general:OK")}
cancelText={i18next.t("general:Cancel")}
width={350}
footer={renderFooter()}
onCancel={handleCancel}
afterClose={handleCancel}
onOk={handleOk}
>
<div style={{marginTop: "20px", marginBottom: "50px"}}>
{
renderCaptcha()
}
</div>
</Modal>
);
}
};
export const CaptchaRule = {

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "sign up now",
"username, Email or phone": "username, Email or phone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Upravit HTML hlavičky",
"Header HTML - Tooltip": "Přizpůsobit hlavičku vstupní stránky vaší aplikace",
"Incremental": "Inkrementální",
"Inline": "Inline",
"Input": "Vstup",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Zadejte svou aplikaci!",
"Please input your organization!": "Zadejte svou organizaci!",
"Please select a HTML file": "Vyberte HTML soubor",
"Pop up": "Pop up",
"Random": "Náhodný",
"Real name": "Skutečné jméno",
"Redirect URL": "Přesměrovací URL",
@@ -295,6 +297,7 @@
"Failed to save": "Nepodařilo se uložit",
"Failed to sync": "Nepodařilo se synchronizovat",
"Failed to verify": "Nepodařilo se ověřit",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "URL ikony favicon použité na všech stránkách Casdoor organizace",
"First name": "Křestní jméno",
@@ -444,6 +447,7 @@
"Tokens": "Tokeny",
"Tour": "Tour",
"Transactions": "Transakce",
"True": "True",
"Type": "Typ",
"Type - Tooltip": "Typ - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Vyberte organizaci pro přihlášení",
"Please type an organization to sign in": "Zadejte organizaci pro přihlášení",
"Redirecting, please wait.": "Přesměrování, prosím čekejte.",
"Refresh": "Refresh",
"Sign In": "Přihlásit se",
"Sign in with Face ID": "Přihlásit se pomocí Face ID",
"Sign in with WebAuthn": "Přihlásit se pomocí WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "Zadaný údaj není platné telefonní číslo!",
"To access": "Pro přístup",
"Verification code": "Ověřovací kód",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "zaregistrujte se nyní",
"username, Email or phone": "uživatelské jméno, Email nebo telefon"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Povolit skenování QR kódu WeChat Media Platform pro přihlášení",
"Use WeChat Media Platform to login": "Použít WeChat Media Platform pro přihlášení",
"Use WeChat Open Platform to login": "Použít WeChat Open Platform pro přihlášení",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "Tok uživatele",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Bitte geben Sie Ihre Anwendung ein!",
"Please input your organization!": "Bitte geben Sie Ihre Organisation ein!",
"Please select a HTML file": "Bitte wählen Sie eine HTML-Datei aus",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Weiterleitungs-URL",
@@ -295,6 +297,7 @@
"Failed to save": "Konnte nicht gespeichert werden",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon-URL, die auf allen Casdoor-Seiten der Organisation verwendet wird",
"First name": "Vorname",
@@ -444,6 +447,7 @@
"Tokens": "Token",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Umleitung, bitte warten.",
"Refresh": "Refresh",
"Sign In": "Anmelden",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Melden Sie sich mit WebAuthn an",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "Zum Zugriff",
"Verification code": "Verifizierungscode",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "Melde dich jetzt an",
"username, Email or phone": "Benutzername, E-Mail oder Telefon"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "sign up now",
"username, Email or phone": "username, Email or phone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "¡Por favor, ingrese su solicitud!",
"Please input your organization!": "¡Por favor, ingrese su organización!",
"Please select a HTML file": "Por favor, seleccione un archivo HTML",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redireccionar URL",
@@ -295,6 +297,7 @@
"Failed to save": "No se pudo guardar",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon (ícono de favoritos)",
"Favicon - Tooltip": "URL del icono Favicon utilizado en todas las páginas de Casdoor de la organización",
"First name": "Nombre de pila",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "Dirección URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirigiendo, por favor espera.",
"Refresh": "Refresh",
"Sign In": "Iniciar sesión",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Iniciar sesión con WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "para acceder",
"Verification code": "Código de verificación",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn (Autenticación Web)",
"sign up now": "Regístrate ahora",
"username, Email or phone": "Nombre de usuario, correo electrónico o teléfono"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "ویرایش HTML سربرگ",
"Header HTML - Tooltip": "کد head صفحه ورود برنامه خود را سفارشی کنید",
"Incremental": "افزایشی",
"Inline": "Inline",
"Input": "ورودی",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "لطفاً برنامه خود را وارد کنید!",
"Please input your organization!": "لطفاً سازمان خود را وارد کنید!",
"Please select a HTML file": "لطفاً یک فایل HTML انتخاب کنید",
"Pop up": "Pop up",
"Random": "تصادفی",
"Real name": "نام واقعی",
"Redirect URL": "آدرس بازگشت",
@@ -295,6 +297,7 @@
"Failed to save": "عدم موفقیت در ذخیره",
"Failed to sync": "عدم موفقیت در همگام‌سازی",
"Failed to verify": "عدم موفقیت در تأیید",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "آدرس آیکون Favicon استفاده شده در تمام صفحات Casdoor سازمان",
"First name": "نام",
@@ -444,6 +447,7 @@
"Tokens": "توکن‌ها",
"Tour": "Tour",
"Transactions": "تراکنش‌ها",
"True": "True",
"Type": "نوع",
"Type - Tooltip": "نوع - راهنمای ابزار",
"URL": "آدرس",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "لطفاً یک سازمان برای ورود انتخاب کنید",
"Please type an organization to sign in": "لطفاً یک سازمان برای ورود تایپ کنید",
"Redirecting, please wait.": "در حال هدایت، لطفاً صبر کنید.",
"Refresh": "Refresh",
"Sign In": "ورود",
"Sign in with Face ID": "ورود با شناسه چهره",
"Sign in with WebAuthn": "ورود با WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "ورودی شماره تلفن معتبر نیست!",
"To access": "برای دسترسی",
"Verification code": "کد تأیید",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "ثبت‌نام کنید",
"username, Email or phone": "نام کاربری، ایمیل یا تلفن"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "آیا اجازه اسکن کد QR پلتفرم رسانه WeChat برای ورود داده شود",
"Use WeChat Media Platform to login": "استفاده از پلتفرم رسانه WeChat برای ورود",
"Use WeChat Open Platform to login": "استفاده از پلتفرم باز WeChat برای ورود",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "جریان کاربر",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "sign up now",
"username, Email or phone": "username, Email or phone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incrémentale",
"Inline": "Inline",
"Input": "Saisie",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Veuillez saisir votre application !",
"Please input your organization!": "Veuillez saisir votre organisation !",
"Please select a HTML file": "Veuillez sélectionner un fichier HTML",
"Pop up": "Pop up",
"Random": "Aléatoire",
"Real name": "Nom complet",
"Redirect URL": "URL de redirection",
@@ -295,6 +297,7 @@
"Failed to save": "Échec de sauvegarde",
"Failed to sync": "Failed to sync",
"Failed to verify": "Échec de la vérification",
"False": "False",
"Favicon": "Icône du site",
"Favicon - Tooltip": "L'URL de l'icône « favicon » utilisée dans toutes les pages Casdoor de l'organisation",
"First name": "Prénom",
@@ -444,6 +447,7 @@
"Tokens": "Jetons",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Infobulle",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Veuillez choisir une organisation pour vous connecter",
"Please type an organization to sign in": "Veuillez entrer une organisation pour vous connecter",
"Redirecting, please wait.": "Redirection en cours, veuillez patienter.",
"Refresh": "Refresh",
"Sign In": "Se connecter",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Connectez-vous avec WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "Pour accéder à",
"Verification code": "Code de vérification",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "Inscrivez-vous maintenant",
"username, Email or phone": "identifiant, adresse e-mail ou téléphone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "sign up now",
"username, Email or phone": "username, Email or phone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Silakan masukkan aplikasi Anda!",
"Please input your organization!": "Silakan masukkan organisasi Anda!",
"Please select a HTML file": "Silahkan pilih file HTML",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Mengalihkan URL",
@@ -295,6 +297,7 @@
"Failed to save": "Gagal menyimpan",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "URL ikon Favicon yang digunakan di semua halaman Casdoor organisasi",
"First name": "Nama depan",
@@ -444,6 +447,7 @@
"Tokens": "Token-token",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Mengalihkan, harap tunggu.",
"Refresh": "Refresh",
"Sign In": "Masuk",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Masuk dengan WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "Untuk mengakses",
"Verification code": "Kode verifikasi",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "Daftar sekarang",
"username, Email or phone": "nama pengguna, Email atau nomor telepon"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "sign up now",
"username, Email or phone": "username, Email or phone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "あなたの申請を入力してください!",
"Please input your organization!": "あなたの組織を入力してください!",
"Please select a HTML file": "HTMLファイルを選択してください",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "リダイレクトURL",
@@ -295,6 +297,7 @@
"Failed to save": "保存に失敗しました",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "ファビコン",
"Favicon - Tooltip": "組織のすべてのCasdoorページに使用されるFaviconアイコンのURL",
"First name": "名前",
@@ -444,6 +447,7 @@
"Tokens": "トークン",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "リダイレクト中、お待ちください。",
"Refresh": "Refresh",
"Sign In": "サインイン",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "WebAuthnでサインインしてください",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "アクセスする",
"Verification code": "確認コード",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "今すぐサインアップ",
"username, Email or phone": "ユーザー名、メールアドレス、または電話番号"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "sign up now",
"username, Email or phone": "username, Email or phone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "당신의 신청서를 입력해주세요!",
"Please input your organization!": "귀하의 조직을 입력해 주세요!",
"Please select a HTML file": "HTML 파일을 선택해 주세요",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "리디렉트 URL",
@@ -295,6 +297,7 @@
"Failed to save": "저장에 실패했습니다",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "파비콘",
"Favicon - Tooltip": "조직의 모든 Casdoor 페이지에서 사용되는 Favicon 아이콘 URL",
"First name": "이름",
@@ -444,6 +447,7 @@
"Tokens": "토큰",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "리디렉팅 중입니다. 잠시 기다려주세요.",
"Refresh": "Refresh",
"Sign In": "로그인",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "WebAuthn으로 로그인하세요",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "접근하다",
"Verification code": "인증 코드",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "지금 가입하세요",
"username, Email or phone": "유저명, 이메일 또는 전화번호"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "sign up now",
"username, Email or phone": "username, Email or phone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "sign up now",
"username, Email or phone": "username, Email or phone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "sign up now",
"username, Email or phone": "username, Email or phone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Por favor, insira o nome da sua aplicação!",
"Please input your organization!": "Por favor, insira o nome da sua organização!",
"Please select a HTML file": "Por favor, selecione um arquivo HTML",
"Pop up": "Pop up",
"Random": "Aleatório",
"Real name": "Nome real",
"Redirect URL": "URL de redirecionamento",
@@ -295,6 +297,7 @@
"Failed to save": "Falha ao salvar",
"Failed to sync": "Falha ao sincronizar",
"Failed to verify": "Falha ao verificar",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "URL do ícone de favicon usado em todas as páginas do Casdoor da organização",
"First name": "Nome",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Tipo",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecionando, por favor aguarde.",
"Refresh": "Refresh",
"Sign In": "Entrar",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Entrar com WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "Para acessar",
"Verification code": "Código de verificação",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "Inscreva-se agora",
"username, Email or phone": "Nome de usuário, email ou telefone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Последовательный",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Пожалуйста, введите свою заявку!",
"Please input your organization!": "Пожалуйста, введите название вашей организации!",
"Please select a HTML file": "Пожалуйста, выберите файл HTML",
"Pop up": "Pop up",
"Random": "Случайный",
"Real name": "Полное имя",
"Redirect URL": "Перенаправление URL",
@@ -295,6 +297,7 @@
"Failed to save": "Не удалось сохранить",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Фавикон",
"Favicon - Tooltip": "URL иконки Favicon, используемый на всех страницах организации Casdoor",
"First name": "Имя",
@@ -444,6 +447,7 @@
"Tokens": "Токены",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Перенаправление, пожалуйста, подождите.",
"Refresh": "Refresh",
"Sign In": "Войти",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Войти с помощью WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "Для доступа",
"Verification code": "Код подтверждения",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "Зарегистрируйтесь сейчас",
"username, Email or phone": "имя пользователя, электронная почта или телефон"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "HTML hlavičky - Upraviť",
"Header HTML - Tooltip": "Vlastný HTML kód pre hlavičku vašej vstupnej stránky aplikácie",
"Incremental": "Postupný",
"Inline": "Inline",
"Input": "Vstup",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Zadajte svoju aplikáciu!",
"Please input your organization!": "Zadajte svoju organizáciu!",
"Please select a HTML file": "Vyberte HTML súbor",
"Pop up": "Pop up",
"Random": "Náhodný",
"Real name": "Skutočné meno",
"Redirect URL": "URL presmerovania",
@@ -295,6 +297,7 @@
"Failed to save": "Nepodarilo sa uložiť",
"Failed to sync": "Nepodarilo sa synchronizovať",
"Failed to verify": "Nepodarilo sa overiť",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "URL ikony favicon používaná na všetkých stránkach Casdoor organizácie",
"First name": "Meno",
@@ -444,6 +447,7 @@
"Tokens": "Tokeny",
"Tour": "Tour",
"Transactions": "Transakcie",
"True": "True",
"Type": "Typ",
"Type - Tooltip": "Typ",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Vyberte organizáciu na prihlásenie",
"Please type an organization to sign in": "Zadajte organizáciu na prihlásenie",
"Redirecting, please wait.": "Prebieha presmerovanie, prosím čakajte.",
"Refresh": "Refresh",
"Sign In": "Prihlásiť sa",
"Sign in with Face ID": "Prihlásiť sa pomocou Face ID",
"Sign in with WebAuthn": "Prihlásiť sa pomocou WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "Zadaný údaj nie je platné telefónne číslo!",
"To access": "Na prístup",
"Verification code": "Overovací kód",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "zaregistrujte sa teraz",
"username, Email or phone": "meno používateľa, Email alebo telefón"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Či povoliť skenovanie QR kódu WeChat Media Platform na prihlásenie",
"Use WeChat Media Platform to login": "Použiť WeChat Media Platform na prihlásenie",
"Use WeChat Open Platform to login": "Použiť WeChat Open Platform na prihlásenie",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "Tok používateľa",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "sign up now",
"username, Email or phone": "username, Email or phone"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Incremental",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Pop up": "Pop up",
"Random": "Random",
"Real name": "Gerçek isim",
"Redirect URL": "Yönlendirme URL'si",
@@ -295,6 +297,7 @@
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Doğrulama başarısız oldu",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "İsim",
@@ -444,6 +447,7 @@
"Tokens": "Tokens",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Yönlendiriliyor, lütfen bekleyiniz.",
"Refresh": "Refresh",
"Sign In": "Oturum aç",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "To access",
"Verification code": "Verification code",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "hemen kaydolun",
"username, Email or phone": "kullanıcı adınız, Eposta adresiniz ve telefon numaranız"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "HTML-код заголовка Редагувати",
"Header HTML - Tooltip": "Налаштуйте тег head на сторінці входу до програми",
"Incremental": "Інкрементний",
"Inline": "Inline",
"Input": "Введення",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Будь ласка, введіть свою заявку!",
"Please input your organization!": "Будь ласка, введіть вашу організацію!",
"Please select a HTML file": "Виберіть файл HTML",
"Pop up": "Pop up",
"Random": "Випадковий",
"Real name": "Справжнє ім'я",
"Redirect URL": "URL-адреса перенаправлення",
@@ -295,6 +297,7 @@
"Failed to save": "Не вдалося зберегти",
"Failed to sync": "Не вдалося синхронізувати",
"Failed to verify": "Не вдалося перевірити",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "URL-адреса піктограми Favicon, яка використовується на всіх сторінках Casdoor організації",
"First name": "Ім'я",
@@ -444,6 +447,7 @@
"Tokens": "Жетони",
"Tour": "Tour",
"Transactions": "транзакції",
"True": "True",
"Type": "Тип",
"Type - Tooltip": "Тип - підказка",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Виберіть організацію для входу",
"Please type an organization to sign in": "Будь ласка, введіть організацію, щоб увійти",
"Redirecting, please wait.": "Перенаправлення, будь ласка, зачекайте.",
"Refresh": "Refresh",
"Sign In": "Увійти",
"Sign in with Face ID": "Увійдіть за допомогою Face ID",
"Sign in with WebAuthn": "Увійдіть за допомогою WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "Введений недійсний номер телефону!",
"To access": "Доступу",
"Verification code": "Код підтвердження",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "Зареєструйся зараз",
"username, Email or phone": "ім'я користувача, електронну пошту або телефон"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Чи дозволяти сканування QR-коду WeChat Media Platform для входу",
"Use WeChat Media Platform to login": "Використовуйте медіаплатформу WeChat для входу",
"Use WeChat Open Platform to login": "Використовуйте відкриту платформу WeChat для входу",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "Потік користувачів",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - Edit",
"Header HTML - Tooltip": "Custom the head tag of your application entry page",
"Incremental": "Tăng",
"Inline": "Inline",
"Input": "Input",
"Internet-Only": "Internet-Only",
"Invalid characters in application name": "Invalid characters in application name",
@@ -95,6 +96,7 @@
"Please input your application!": "Vui lòng nhập ứng dụng của bạn!",
"Please input your organization!": "Vui lòng nhập tổ chức của bạn!",
"Please select a HTML file": "Vui lòng chọn tệp HTML",
"Pop up": "Pop up",
"Random": "Ngẫu nhiên",
"Real name": "Tên thật",
"Redirect URL": "Chuyển hướng URL",
@@ -295,6 +297,7 @@
"Failed to save": "Không thể lưu lại",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"False": "False",
"Favicon": "Favicon",
"Favicon - Tooltip": "URL biểu tượng Favicon được sử dụng trong tất cả các trang của tổ chức Casdoor",
"First name": "Tên",
@@ -444,6 +447,7 @@
"Tokens": "Mã thông báo",
"Tour": "Tour",
"Transactions": "Transactions",
"True": "True",
"Type": "Type",
"Type - Tooltip": "Type - Tooltip",
"URL": "URL",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "Please select an organization to sign in",
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Đang chuyển hướng, vui lòng đợi.",
"Refresh": "Refresh",
"Sign In": "Đăng nhập",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Đăng nhập với WebAuthn",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "The input is not valid phone number!",
"To access": "Để truy cập",
"Verification code": "Mã xác thực",
"WeChat": "WeChat",
"WebAuthn": "WebAuthn",
"sign up now": "Đăng ký ngay bây giờ",
"username, Email or phone": "Tên đăng nhập, Email hoặc điện thoại"
@@ -988,6 +994,8 @@
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"Use global endpoint": "Use global endpoint",
"Use global endpoint - Tooltip": "Use global endpoint - Tooltip",
"Use id as name": "Use id as name",
"Use id as name - Tooltip": "Use id as user's name",
"User flow": "User flow",

View File

@@ -75,6 +75,7 @@
"Header HTML - Edit": "Header HTML - 编辑",
"Header HTML - Tooltip": "自定义应用页面的head标签",
"Incremental": "递增",
"Inline": "内嵌",
"Input": "输入",
"Internet-Only": "外网启用",
"Invalid characters in application name": "应用名称内有非法字符",
@@ -95,6 +96,7 @@
"Please input your application!": "请输入你的应用",
"Please input your organization!": "请输入你的组织",
"Please select a HTML file": "请选择一个HTML文件",
"Pop up": "弹框",
"Random": "随机",
"Real name": "真实姓名",
"Redirect URL": "重定向 URL",
@@ -295,6 +297,7 @@
"Failed to save": "保存失败",
"Failed to sync": "同步失败",
"Failed to verify": "验证失败",
"False": "假",
"Favicon": "组织Favicon",
"Favicon - Tooltip": "该组织所有Casdoor页面中所使用的Favicon图标URL",
"First name": "名字",
@@ -444,6 +447,7 @@
"Tokens": "令牌",
"Tour": "引导",
"Transactions": "交易",
"True": "真",
"Type": "类型",
"Type - Tooltip": "类型",
"URL": "链接",
@@ -568,6 +572,7 @@
"Please select an organization to sign in": "请选择要登录的组织",
"Please type an organization to sign in": "请输入要登录的组织",
"Redirecting, please wait.": "正在跳转, 请稍等.",
"Refresh": "刷新",
"Sign In": "登录",
"Sign in with Face ID": "人脸登录",
"Sign in with WebAuthn": "WebAuthn登录",
@@ -581,6 +586,7 @@
"The input is not valid phone number!": "您输入的手机号有误!",
"To access": "访问",
"Verification code": "验证码",
"WeChat": "微信",
"WebAuthn": "Web身份验证",
"sign up now": "立即注册",
"username, Email or phone": "用户名、Email或手机号"
@@ -963,7 +969,7 @@
"Signup HTML - Edit": "注册页面HTML - 编辑",
"Signup HTML - Tooltip": "自定义HTML用于替换默认的注册页面样式",
"Signup group": "注册后的群组",
"Signup group - Tooltip": "Signup group - Tooltip",
"Signup group - Tooltip": "注册后自动加入的群组",
"Silent": "静默",
"Site key": "Site key",
"Site key - Tooltip": "站点密钥",
@@ -980,22 +986,24 @@
"Test SMTP Connection": "测试SMTP连接",
"Third-party": "第三方",
"This field is required": "此字段是必需的",
"Token URL": "Token URL",
"Token URL - Tooltip": "自定义OAuth的Token URL",
"Token URL": "Token链接",
"Token URL - Tooltip": "自定义OAuth的Token链接",
"Type": "类型",
"Type - Tooltip": "类型",
"Use WeChat Media Platform in PC": "在PC端使用微信公众平台",
"Use WeChat Media Platform in PC - Tooltip": "是否使用微信公众平台的二维码进行登录",
"Use WeChat Media Platform to login": "使用微信公众平台进行登录",
"Use WeChat Open Platform to login": "使用微信开放平台进行登录",
"Use global endpoint": "启用全局地址",
"Use global endpoint - Tooltip": "启用全局地址",
"Use id as name": "使用id作为用户名",
"Use id as name - Tooltip": "使用id作为用户的名字",
"User flow": "User flow",
"User flow - Tooltip": "User flow",
"User mapping": "用户映射",
"User mapping - Tooltip": "用户映射 - 工具提示",
"UserInfo URL": "UserInfo URL",
"UserInfo URL - Tooltip": "自定义OAuth的UserInfo URL",
"UserInfo URL": "UserInfo链接",
"UserInfo URL - Tooltip": "自定义OAuth的UserInfo链接",
"Wallets": "钱包",
"Wallets - Tooltip": "钱包 - 工具提示",
"admin (Shared)": "admin共享"
@@ -1231,7 +1239,7 @@
"Keys": "键",
"Language": "语言",
"Language - Tooltip": "语言 - Tooltip",
"Last change password time": "Last change password time",
"Last change password time": "上次修改密码时间",
"Link": "绑定",
"Location": "城市",
"Location - Tooltip": "居住地址所在的城市",

View File

@@ -72,6 +72,7 @@ class SigninMethodTable extends React.Component {
{name: "WebAuthn", displayName: i18next.t("login:WebAuthn")},
{name: "LDAP", displayName: i18next.t("login:LDAP")},
{name: "Face ID", displayName: i18next.t("login:Face ID")},
{name: "WeChat", displayName: i18next.t("login:WeChat")},
];
const columns = [
{

View File

@@ -49,6 +49,9 @@ class SigninTable extends React.Component {
updateField(table, index, key, value) {
table[index][key] = value;
if (key === "name" && value === "Captcha") {
table[index]["rule"] = "pop up";
}
this.updateTable(table);
}
@@ -114,6 +117,8 @@ class SigninTable extends React.Component {
{name: "Forgot password?", displayName: i18next.t("login:Forgot password?")},
{name: "Login button", displayName: i18next.t("login:Signin button")},
{name: "Signup link", displayName: i18next.t("general:Signup link")},
{name: "Captcha", displayName: i18next.t("general:Captcha")},
{name: "Auto sign in", displayName: i18next.t("login:Auto sign in")},
];
const getItemDisplayName = (text) => {
@@ -249,6 +254,19 @@ class SigninTable extends React.Component {
{id: "small", name: i18next.t("application:Small icon")},
];
}
if (record.name === "Captcha") {
options = [
{id: "pop up", name: i18next.t("application:Pop up")},
{id: "inline", name: i18next.t("application:Inline")},
];
}
if (record.name === "Forgot password?") {
options = [
{id: "None", name: `${i18next.t("login:Auto sign in")} - ${i18next.t("general:True")}`},
{id: "Auto sign in - False", name: `${i18next.t("login:Auto sign in")} - ${i18next.t("general:False")}`},
];
}
if (options.length === 0) {
return null;
}

View File

@@ -42,8 +42,9 @@ class WebAuthnCredentialTable extends React.Component {
const columns = [
{
title: i18next.t("general:Name"),
dataIndex: "ID",
key: "ID",
dataIndex: "id",
key: "id",
ellipsis: true,
},
{
title: i18next.t("general:Action"),
@@ -60,7 +61,7 @@ class WebAuthnCredentialTable extends React.Component {
];
return (
<Table rowKey={"ID"} columns={columns} dataSource={this.props.table} size="middle" bordered pagination={false}
<Table rowKey={"id"} columns={columns} dataSource={this.props.table} size="middle" bordered pagination={false}
title={() => (
<div>
{i18next.t("user:WebAuthn credentials")}&nbsp;&nbsp;&nbsp;&nbsp;