mirror of
https://github.com/casdoor/casdoor.git
synced 2025-07-15 03:33:49 +08:00
Compare commits
45 Commits
Author | SHA1 | Date | |
---|---|---|---|
c9635d9e2b | |||
3bd52172ea | |||
bf730050d5 | |||
5b733b7f15 | |||
034f28def9 | |||
c86ac8e6ad | |||
d647eed22a | |||
717c53f6e5 | |||
097adac871 | |||
74543b9533 | |||
110dc04179 | |||
6464bd10dc | |||
db878a890e | |||
12d6d8e6ce | |||
8ed6e4f934 | |||
ed9732caf9 | |||
0de4e7da38 | |||
a330fbc11f | |||
ed158d4981 | |||
8df965b98d | |||
2c3749820e | |||
0b17cb9746 | |||
e2ce9ad625 | |||
64491abc64 | |||
934a8947c8 | |||
943edfb48b | |||
0d02b5e768 | |||
ba8d0b5f46 | |||
973a1df6c2 | |||
05bfd3a3a3 | |||
69aa3c8a8b | |||
a1b010a406 | |||
89e92cbd47 | |||
d4c8193357 | |||
9b33800b4c | |||
ec98785172 | |||
45dd4cc344 | |||
1adb172d6b | |||
c08f2b1f3f | |||
62bb257c6d | |||
230a77e3e3 | |||
dce0a96dea | |||
65563fa0cd | |||
f2a94f671a | |||
1460a0498f |
@ -13,7 +13,7 @@
|
||||
<a href="https://github.com/casdoor/casdoor/releases/latest">
|
||||
<img alt="GitHub Release" src="https://img.shields.io/github/v/release/casdoor/casdoor.svg">
|
||||
</a>
|
||||
<a href="https://hub.docker.com/repository/docker/casbin/casdoor">
|
||||
<a href="https://hub.docker.com/r/casbin/casdoor">
|
||||
<img alt="Docker Image Version (latest semver)" src="https://img.shields.io/badge/Docker%20Hub-latest-brightgreen">
|
||||
</a>
|
||||
</p>
|
||||
|
@ -77,6 +77,7 @@ p, *, *, POST, /api/verify-code, *, *
|
||||
p, *, *, POST, /api/reset-email-or-phone, *, *
|
||||
p, *, *, POST, /api/upload-resource, *, *
|
||||
p, *, *, GET, /.well-known/openid-configuration, *, *
|
||||
p, *, *, GET, /.well-known/webfinger, *, *
|
||||
p, *, *, *, /.well-known/jwks, *, *
|
||||
p, *, *, GET, /api/get-saml-login, *, *
|
||||
p, *, *, POST, /api/acs, *, *
|
||||
|
@ -26,6 +26,10 @@ func GetCaptchaProvider(captchaType string) CaptchaProvider {
|
||||
return NewDefaultCaptchaProvider()
|
||||
case "reCAPTCHA":
|
||||
return NewReCaptchaProvider()
|
||||
case "reCAPTCHA v2":
|
||||
return NewReCaptchaProvider()
|
||||
case "reCAPTCHA v3":
|
||||
return NewReCaptchaProvider()
|
||||
case "Aliyun Captcha":
|
||||
return NewAliyunCaptchaProvider()
|
||||
case "hCaptcha":
|
||||
|
@ -23,6 +23,7 @@ isDemoMode = false
|
||||
batchSize = 100
|
||||
enableErrorMask = false
|
||||
enableGzip = true
|
||||
inactiveTimeoutMinutes =
|
||||
ldapServerPort = 389
|
||||
radiusServerPort = 1812
|
||||
radiusSecret = "secret"
|
||||
|
@ -200,6 +200,10 @@ func (c *ApiController) Signup() {
|
||||
Type: userType,
|
||||
Password: authForm.Password,
|
||||
DisplayName: authForm.Name,
|
||||
Gender: authForm.Gender,
|
||||
Bio: authForm.Bio,
|
||||
Tag: authForm.Tag,
|
||||
Education: authForm.Education,
|
||||
Avatar: organization.DefaultAvatar,
|
||||
Email: authForm.Email,
|
||||
Phone: authForm.Phone,
|
||||
|
@ -14,7 +14,11 @@
|
||||
|
||||
package controllers
|
||||
|
||||
import "github.com/casdoor/casdoor/object"
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/casdoor/casdoor/object"
|
||||
)
|
||||
|
||||
// GetOidcDiscovery
|
||||
// @Title GetOidcDiscovery
|
||||
@ -42,3 +46,31 @@ func (c *RootController) GetJwks() {
|
||||
c.Data["json"] = jwks
|
||||
c.ServeJSON()
|
||||
}
|
||||
|
||||
// GetWebFinger
|
||||
// @Title GetWebFinger
|
||||
// @Tag OIDC API
|
||||
// @Param resource query string true "resource"
|
||||
// @Success 200 {object} object.WebFinger
|
||||
// @router /.well-known/webfinger [get]
|
||||
func (c *RootController) GetWebFinger() {
|
||||
resource := c.Input().Get("resource")
|
||||
rels := []string{}
|
||||
host := c.Ctx.Request.Host
|
||||
|
||||
for key, value := range c.Input() {
|
||||
if strings.HasPrefix(key, "rel") {
|
||||
rels = append(rels, value...)
|
||||
}
|
||||
}
|
||||
|
||||
webfinger, err := object.GetWebFinger(resource, rels, host)
|
||||
if err != nil {
|
||||
c.ResponseError(err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
c.Data["json"] = webfinger
|
||||
c.Ctx.Output.ContentType("application/jrd+json")
|
||||
c.ServeJSON()
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ func (c *ApiController) GetOrganizations() {
|
||||
c.ResponseOk(organizations)
|
||||
} else {
|
||||
limit := util.ParseInt(limit)
|
||||
count, err := object.GetOrganizationCount(owner, field, value)
|
||||
count, err := object.GetOrganizationCount(owner, organizationName, field, value)
|
||||
if err != nil {
|
||||
c.ResponseError(err.Error())
|
||||
return
|
||||
@ -138,7 +138,7 @@ func (c *ApiController) AddOrganization() {
|
||||
return
|
||||
}
|
||||
|
||||
count, err := object.GetOrganizationCount("", "", "")
|
||||
count, err := object.GetOrganizationCount("", "", "", "")
|
||||
if err != nil {
|
||||
c.ResponseError(err.Error())
|
||||
return
|
||||
|
@ -257,7 +257,7 @@ func (c *ApiController) UploadResource() {
|
||||
fileType, _ = util.GetOwnerAndNameFromIdNoCheck(mimeType + "/")
|
||||
}
|
||||
|
||||
fullFilePath = object.GetTruncatedPath(provider, fullFilePath, 175)
|
||||
fullFilePath = object.GetTruncatedPath(provider, fullFilePath, 450)
|
||||
if tag != "avatar" && tag != "termsOfUse" && !strings.HasPrefix(tag, "idCard") {
|
||||
ext := filepath.Ext(filepath.Base(fullFilePath))
|
||||
index := len(fullFilePath) - len(ext)
|
||||
|
@ -289,6 +289,16 @@ func (c *ApiController) UpdateUser() {
|
||||
}
|
||||
}
|
||||
|
||||
if user.MfaEmailEnabled && user.Email == "" {
|
||||
c.ResponseError(c.T("user:MFA email is enabled but email is empty"))
|
||||
return
|
||||
}
|
||||
|
||||
if user.MfaPhoneEnabled && user.Phone == "" {
|
||||
c.ResponseError(c.T("user:MFA phone is enabled but phone number is empty"))
|
||||
return
|
||||
}
|
||||
|
||||
if msg := object.CheckUpdateUser(oldUser, &user, c.GetAcceptLanguage()); msg != "" {
|
||||
c.ResponseError(msg)
|
||||
return
|
||||
@ -400,6 +410,12 @@ func (c *ApiController) GetEmailAndPhone() {
|
||||
organization := c.Ctx.Request.Form.Get("organization")
|
||||
username := c.Ctx.Request.Form.Get("username")
|
||||
|
||||
enableErrorMask2 := conf.GetConfigBool("enableErrorMask2")
|
||||
if enableErrorMask2 {
|
||||
c.ResponseError("Error")
|
||||
return
|
||||
}
|
||||
|
||||
user, err := object.GetUserByFields(organization, username)
|
||||
if err != nil {
|
||||
c.ResponseError(err.Error())
|
||||
|
@ -45,6 +45,15 @@ func (c *ApiController) ResponseOk(data ...interface{}) {
|
||||
|
||||
// ResponseError ...
|
||||
func (c *ApiController) ResponseError(error string, data ...interface{}) {
|
||||
enableErrorMask2 := conf.GetConfigBool("enableErrorMask2")
|
||||
if enableErrorMask2 {
|
||||
error = c.T("subscription:Error")
|
||||
|
||||
resp := &Response{Status: "error", Msg: error}
|
||||
c.ResponseJsonData(resp, data...)
|
||||
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, "不存在") {
|
||||
|
@ -27,7 +27,18 @@ import (
|
||||
)
|
||||
|
||||
func deployStaticFiles(provider *object.Provider) {
|
||||
storageProvider, err := storage.GetStorageProvider(provider.Type, provider.ClientId, provider.ClientSecret, provider.RegionId, provider.Bucket, provider.Endpoint)
|
||||
certificate := ""
|
||||
if provider.Category == "Storage" && provider.Type == "Casdoor" {
|
||||
cert, err := object.GetCert(util.GetId(provider.Owner, provider.Cert))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if cert == nil {
|
||||
panic(err)
|
||||
}
|
||||
certificate = cert.Certificate
|
||||
}
|
||||
storageProvider, err := storage.GetStorageProvider(provider.Type, provider.ClientId, provider.ClientSecret, provider.RegionId, provider.Bucket, provider.Endpoint, certificate, provider.Content)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
@ -26,6 +26,10 @@ type AuthForm struct {
|
||||
Name string `json:"name"`
|
||||
FirstName string `json:"firstName"`
|
||||
LastName string `json:"lastName"`
|
||||
Gender string `json:"gender"`
|
||||
Bio string `json:"bio"`
|
||||
Tag string `json:"tag"`
|
||||
Education string `json:"education"`
|
||||
Email string `json:"email"`
|
||||
Phone string `json:"phone"`
|
||||
Affiliation string `json:"affiliation"`
|
||||
|
4
go.mod
4
go.mod
@ -12,7 +12,7 @@ require (
|
||||
github.com/casdoor/go-sms-sender v0.24.0
|
||||
github.com/casdoor/gomail/v2 v2.0.1
|
||||
github.com/casdoor/notify v0.45.0
|
||||
github.com/casdoor/oss v1.7.0
|
||||
github.com/casdoor/oss v1.8.0
|
||||
github.com/casdoor/xorm-adapter/v3 v3.1.0
|
||||
github.com/casvisor/casvisor-go-sdk v1.4.0
|
||||
github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f
|
||||
@ -30,7 +30,7 @@ require (
|
||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
|
||||
github.com/go-webauthn/webauthn v0.6.0
|
||||
github.com/golang-jwt/jwt/v4 v4.5.0
|
||||
github.com/google/uuid v1.4.0
|
||||
github.com/google/uuid v1.6.0
|
||||
github.com/json-iterator/go v1.1.12
|
||||
github.com/lestrrat-go/jwx v1.2.29
|
||||
github.com/lib/pq v1.10.9
|
||||
|
9
go.sum
9
go.sum
@ -1083,6 +1083,8 @@ github.com/casbin/casbin/v2 v2.28.3/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRt
|
||||
github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg=
|
||||
github.com/casbin/casbin/v2 v2.77.2 h1:yQinn/w9x8AswiwqwtrXz93VU48R1aYTXdHEx4RI3jM=
|
||||
github.com/casbin/casbin/v2 v2.77.2/go.mod h1:mzGx0hYW9/ksOSpw3wNjk3NRAroq5VMFYUQ6G43iGPk=
|
||||
github.com/casdoor/casdoor-go-sdk v0.50.0 h1:bUYbz/MzJuWfLKJbJM0+U0YpYewAur+THp5TKnufWZM=
|
||||
github.com/casdoor/casdoor-go-sdk v0.50.0/go.mod h1:cMnkCQJgMYpgAlgEx8reSt1AVaDIQLcJ1zk5pzBaz+4=
|
||||
github.com/casdoor/go-reddit/v2 v2.1.0 h1:kIbfdJ7AA7H0uTQ8s0q4GGZqSS5V9wVE74RrXyD9XPs=
|
||||
github.com/casdoor/go-reddit/v2 v2.1.0/go.mod h1:eagkvwlZ4Hcsuc/uQsLHYEulz5jN65SVSwV/AIE7zsc=
|
||||
github.com/casdoor/go-sms-sender v0.24.0 h1:LNLsce3EG/87I3JS6UiajF3LlQmdIiCgebEu0IE4wSM=
|
||||
@ -1091,8 +1093,8 @@ github.com/casdoor/gomail/v2 v2.0.1 h1:J+FG6x80s9e5lBHUn8Sv0Y56mud34KiWih5YdmudR
|
||||
github.com/casdoor/gomail/v2 v2.0.1/go.mod h1:VnGPslEAtpix5FjHisR/WKB1qvZDBaujbikxDe9d+2Q=
|
||||
github.com/casdoor/notify v0.45.0 h1:OlaFvcQFjGOgA4mRx07M8AH1gvb5xNo21mcqrVGlLgk=
|
||||
github.com/casdoor/notify v0.45.0/go.mod h1:wNHQu0tiDROMBIvz0j3Om3Lhd5yZ+AIfnFb8MYb8OLQ=
|
||||
github.com/casdoor/oss v1.7.0 h1:VCOuD+CcD0MAA99p6JTyUak14bVR6UsaeyuTaVg0Mrs=
|
||||
github.com/casdoor/oss v1.7.0/go.mod h1:rJAWA0hLhtu94t6IRpotLUkXO1NWMASirywQYaGizJE=
|
||||
github.com/casdoor/oss v1.8.0 h1:uuyKhDIp7ydOtV4lpqhAY23Ban2Ln8La8+QT36CwylM=
|
||||
github.com/casdoor/oss v1.8.0/go.mod h1:uaqO7KBI2lnZcnB8rF7O6C2bN7llIbfC5Ql8ex1yR1U=
|
||||
github.com/casdoor/xorm-adapter/v3 v3.1.0 h1:NodWayRtSLVSeCvL9H3Hc61k0G17KhV9IymTCNfh3kk=
|
||||
github.com/casdoor/xorm-adapter/v3 v3.1.0/go.mod h1:4WTcUw+bTgBylGHeGHzTtBvuTXRS23dtwzFLl9tsgFM=
|
||||
github.com/casvisor/casvisor-go-sdk v1.4.0 h1:hbZEGGJ1cwdHFAxeXrMoNw6yha6Oyg2F0qQhBNCN/dg=
|
||||
@ -1460,8 +1462,9 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
|
||||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
|
||||
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=
|
||||
|
@ -200,7 +200,7 @@ func (idp *AlipayIdProvider) postWithBody(body interface{}, targetUrl string) ([
|
||||
|
||||
formData.Set("sign", sign)
|
||||
|
||||
resp, err := idp.Client.PostForm(targetUrl, formData)
|
||||
resp, err := idp.Client.Post(targetUrl, "application/x-www-form-urlencoded;charset=utf-8", strings.NewReader(formData.Encode()))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
2
main.go
2
main.go
@ -56,6 +56,7 @@ func main() {
|
||||
beego.InsertFilter("*", beego.BeforeRouter, routers.StaticFilter)
|
||||
beego.InsertFilter("*", beego.BeforeRouter, routers.AutoSigninFilter)
|
||||
beego.InsertFilter("*", beego.BeforeRouter, routers.CorsFilter)
|
||||
beego.InsertFilter("*", beego.BeforeRouter, routers.TimeoutFilter)
|
||||
beego.InsertFilter("*", beego.BeforeRouter, routers.ApiFilter)
|
||||
beego.InsertFilter("*", beego.BeforeRouter, routers.PrometheusFilter)
|
||||
beego.InsertFilter("*", beego.BeforeRouter, routers.RecordMessage)
|
||||
@ -71,6 +72,7 @@ func main() {
|
||||
beego.BConfig.WebConfig.Session.SessionProviderConfig = conf.GetConfigString("redisEndpoint")
|
||||
}
|
||||
beego.BConfig.WebConfig.Session.SessionCookieLifeTime = 3600 * 24 * 30
|
||||
beego.BConfig.WebConfig.Session.SessionGCMaxLifetime = 3600 * 24 * 30
|
||||
// beego.BConfig.WebConfig.Session.SessionCookieSameSite = http.SameSiteNoneMode
|
||||
|
||||
err := logs.SetLogger(logs.AdapterFile, conf.GetConfigString("logConfig"))
|
||||
|
@ -31,15 +31,17 @@ type SigninMethod struct {
|
||||
}
|
||||
|
||||
type SignupItem struct {
|
||||
Name string `json:"name"`
|
||||
Visible bool `json:"visible"`
|
||||
Required bool `json:"required"`
|
||||
Prompted bool `json:"prompted"`
|
||||
CustomCss string `json:"customCss"`
|
||||
Label string `json:"label"`
|
||||
Placeholder string `json:"placeholder"`
|
||||
Regex string `json:"regex"`
|
||||
Rule string `json:"rule"`
|
||||
Name string `json:"name"`
|
||||
Visible bool `json:"visible"`
|
||||
Required bool `json:"required"`
|
||||
Prompted bool `json:"prompted"`
|
||||
Type string `json:"type"`
|
||||
CustomCss string `json:"customCss"`
|
||||
Label string `json:"label"`
|
||||
Placeholder string `json:"placeholder"`
|
||||
Options []string `json:"options"`
|
||||
Regex string `json:"regex"`
|
||||
Rule string `json:"rule"`
|
||||
}
|
||||
|
||||
type SigninItem struct {
|
||||
@ -78,13 +80,14 @@ type Application struct {
|
||||
EnableSamlCompress bool `json:"enableSamlCompress"`
|
||||
EnableSamlC14n10 bool `json:"enableSamlC14n10"`
|
||||
EnableSamlPostBinding bool `json:"enableSamlPostBinding"`
|
||||
UseEmailAsSamlNameId bool `json:"useEmailAsSamlNameId"`
|
||||
EnableWebAuthn bool `json:"enableWebAuthn"`
|
||||
EnableLinkWithEmail bool `json:"enableLinkWithEmail"`
|
||||
OrgChoiceMode string `json:"orgChoiceMode"`
|
||||
SamlReplyUrl string `xorm:"varchar(100)" json:"samlReplyUrl"`
|
||||
Providers []*ProviderItem `xorm:"mediumtext" json:"providers"`
|
||||
SigninMethods []*SigninMethod `xorm:"varchar(2000)" json:"signinMethods"`
|
||||
SignupItems []*SignupItem `xorm:"varchar(2000)" json:"signupItems"`
|
||||
SignupItems []*SignupItem `xorm:"varchar(3000)" json:"signupItems"`
|
||||
SigninItems []*SigninItem `xorm:"mediumtext" json:"signinItems"`
|
||||
GrantTypes []string `xorm:"varchar(1000)" json:"grantTypes"`
|
||||
OrganizationObj *Organization `xorm:"-" json:"organizationObj"`
|
||||
@ -97,6 +100,7 @@ type Application struct {
|
||||
ClientSecret string `xorm:"varchar(100)" json:"clientSecret"`
|
||||
RedirectUris []string `xorm:"varchar(1000)" json:"redirectUris"`
|
||||
TokenFormat string `xorm:"varchar(100)" json:"tokenFormat"`
|
||||
TokenSigningMethod string `xorm:"varchar(100)" json:"tokenSigningMethod"`
|
||||
TokenFields []string `xorm:"varchar(1000)" json:"tokenFields"`
|
||||
ExpireInHours int `json:"expireInHours"`
|
||||
RefreshExpireInHours int `json:"refreshExpireInHours"`
|
||||
@ -530,7 +534,7 @@ func GetMaskedApplication(application *Application, userId string) *Application
|
||||
|
||||
providerItems := []*ProviderItem{}
|
||||
for _, providerItem := range application.Providers {
|
||||
if providerItem.Provider != nil && (providerItem.Provider.Category == "OAuth" || providerItem.Provider.Category == "Web3" || providerItem.Provider.Category == "Captcha") {
|
||||
if providerItem.Provider != nil && (providerItem.Provider.Category == "OAuth" || providerItem.Provider.Category == "Web3" || providerItem.Provider.Category == "Captcha" || providerItem.Provider.Category == "SAML") {
|
||||
providerItems = append(providerItems, providerItem)
|
||||
}
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ type Ldap struct {
|
||||
BaseDn string `xorm:"varchar(100)" json:"baseDn"`
|
||||
Filter string `xorm:"varchar(200)" json:"filter"`
|
||||
FilterFields []string `xorm:"varchar(100)" json:"filterFields"`
|
||||
DefaultGroup string `xorm:"varchar(100)" json:"defaultGroup"`
|
||||
|
||||
AutoSync int `json:"autoSync"`
|
||||
LastSync string `xorm:"varchar(100)" json:"lastSync"`
|
||||
@ -148,7 +149,7 @@ func UpdateLdap(ldap *Ldap) (bool, error) {
|
||||
}
|
||||
|
||||
affected, err := ormer.Engine.ID(ldap.Id).Cols("owner", "server_name", "host",
|
||||
"port", "enable_ssl", "username", "password", "base_dn", "filter", "filter_fields", "auto_sync").Update(ldap)
|
||||
"port", "enable_ssl", "username", "password", "base_dn", "filter", "filter_fields", "auto_sync", "default_group").Update(ldap)
|
||||
if err != nil {
|
||||
return false, nil
|
||||
}
|
||||
|
@ -339,6 +339,10 @@ func SyncLdapUsers(owner string, syncUsers []LdapUser, ldapId string) (existUser
|
||||
Ldap: syncUser.Uuid,
|
||||
}
|
||||
|
||||
if ldap.DefaultGroup != "" {
|
||||
newUser.Groups = []string{ldap.DefaultGroup}
|
||||
}
|
||||
|
||||
affected, err := AddUser(newUser)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
|
@ -44,6 +44,18 @@ type OidcDiscovery struct {
|
||||
EndSessionEndpoint string `json:"end_session_endpoint"`
|
||||
}
|
||||
|
||||
type WebFinger struct {
|
||||
Subject string `json:"subject"`
|
||||
Links []WebFingerLink `json:"links"`
|
||||
Aliases *[]string `json:"aliases,omitempty"`
|
||||
Properties *map[string]string `json:"properties,omitempty"`
|
||||
}
|
||||
|
||||
type WebFingerLink struct {
|
||||
Rel string `json:"rel"`
|
||||
Href string `json:"href"`
|
||||
}
|
||||
|
||||
func isIpAddress(host string) bool {
|
||||
// Attempt to split the host and port, ignoring the error
|
||||
hostWithoutPort, _, err := net.SplitHostPort(host)
|
||||
@ -112,7 +124,7 @@ func GetOidcDiscovery(host string) OidcDiscovery {
|
||||
ResponseModesSupported: []string{"query", "fragment", "login", "code", "link"},
|
||||
GrantTypesSupported: []string{"password", "authorization_code"},
|
||||
SubjectTypesSupported: []string{"public"},
|
||||
IdTokenSigningAlgValuesSupported: []string{"RS256"},
|
||||
IdTokenSigningAlgValuesSupported: []string{"RS256", "RS512", "ES256", "ES384", "ES512"},
|
||||
ScopesSupported: []string{"openid", "email", "profile", "address", "phone", "offline_access"},
|
||||
ClaimsSupported: []string{"iss", "ver", "sub", "aud", "iat", "exp", "id", "type", "displayName", "avatar", "permanentAvatar", "email", "phone", "location", "affiliation", "title", "homepage", "bio", "tag", "region", "language", "score", "ranking", "isOnline", "isAdmin", "isForbidden", "signupApplication", "ldap"},
|
||||
RequestParameterSupported: true,
|
||||
@ -160,3 +172,43 @@ func GetJsonWebKeySet() (jose.JSONWebKeySet, error) {
|
||||
|
||||
return jwks, nil
|
||||
}
|
||||
|
||||
func GetWebFinger(resource string, rels []string, host string) (WebFinger, error) {
|
||||
wf := WebFinger{}
|
||||
|
||||
resourceSplit := strings.Split(resource, ":")
|
||||
|
||||
if len(resourceSplit) != 2 {
|
||||
return wf, fmt.Errorf("invalid resource")
|
||||
}
|
||||
|
||||
resourceType := resourceSplit[0]
|
||||
resourceValue := resourceSplit[1]
|
||||
|
||||
oidcDiscovery := GetOidcDiscovery(host)
|
||||
|
||||
switch resourceType {
|
||||
case "acct":
|
||||
user, err := GetUserByEmailOnly(resourceValue)
|
||||
if err != nil {
|
||||
return wf, err
|
||||
}
|
||||
|
||||
if user == nil {
|
||||
return wf, fmt.Errorf("user not found")
|
||||
}
|
||||
|
||||
wf.Subject = resource
|
||||
|
||||
for _, rel := range rels {
|
||||
if rel == "http://openid.net/specs/connect/1.0/issuer" {
|
||||
wf.Links = append(wf.Links, WebFingerLink{
|
||||
Rel: "http://openid.net/specs/connect/1.0/issuer",
|
||||
Href: oidcDiscovery.Issuer,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return wf, nil
|
||||
}
|
||||
|
@ -56,7 +56,7 @@ type Organization struct {
|
||||
WebsiteUrl string `xorm:"varchar(100)" json:"websiteUrl"`
|
||||
Logo string `xorm:"varchar(200)" json:"logo"`
|
||||
LogoDark string `xorm:"varchar(200)" json:"logoDark"`
|
||||
Favicon string `xorm:"varchar(100)" json:"favicon"`
|
||||
Favicon string `xorm:"varchar(200)" json:"favicon"`
|
||||
PasswordType string `xorm:"varchar(100)" json:"passwordType"`
|
||||
PasswordSalt string `xorm:"varchar(100)" json:"passwordSalt"`
|
||||
PasswordOptions []string `xorm:"varchar(100)" json:"passwordOptions"`
|
||||
@ -79,9 +79,9 @@ type Organization struct {
|
||||
AccountItems []*AccountItem `xorm:"varchar(5000)" json:"accountItems"`
|
||||
}
|
||||
|
||||
func GetOrganizationCount(owner, field, value string) (int64, error) {
|
||||
func GetOrganizationCount(owner, name, field, value string) (int64, error) {
|
||||
session := GetSession(owner, -1, -1, field, value, "", "")
|
||||
return session.Count(&Organization{})
|
||||
return session.Count(&Organization{Name: name})
|
||||
}
|
||||
|
||||
func GetOrganizations(owner string, name ...string) ([]*Organization, error) {
|
||||
|
@ -36,7 +36,7 @@ type Resource struct {
|
||||
FileType string `xorm:"varchar(100)" json:"fileType"`
|
||||
FileFormat string `xorm:"varchar(100)" json:"fileFormat"`
|
||||
FileSize int `json:"fileSize"`
|
||||
Url string `xorm:"varchar(255)" json:"url"`
|
||||
Url string `xorm:"varchar(500)" json:"url"`
|
||||
Description string `xorm:"varchar(255)" json:"description"`
|
||||
}
|
||||
|
||||
|
@ -65,7 +65,11 @@ func NewSamlResponse(application *Application, user *User, host string, certific
|
||||
assertion.CreateAttr("IssueInstant", now)
|
||||
assertion.CreateElement("saml:Issuer").SetText(host)
|
||||
subject := assertion.CreateElement("saml:Subject")
|
||||
subject.CreateElement("saml:NameID").SetText(user.Name)
|
||||
nameIDValue := user.Name
|
||||
if application.UseEmailAsSamlNameId {
|
||||
nameIDValue = user.Email
|
||||
}
|
||||
subject.CreateElement("saml:NameID").SetText(nameIDValue)
|
||||
subjectConfirmation := subject.CreateElement("saml:SubjectConfirmation")
|
||||
subjectConfirmation.CreateAttr("Method", "urn:oasis:names:tc:SAML:2.0:cm:bearer")
|
||||
subjectConfirmationData := subjectConfirmation.CreateElement("saml:SubjectConfirmationData")
|
||||
@ -184,17 +188,17 @@ type NameIDFormat struct {
|
||||
}
|
||||
|
||||
type SingleSignOnService struct {
|
||||
XMLName xml.Name
|
||||
// XMLName xml.Name
|
||||
Binding string `xml:"Binding,attr"`
|
||||
Location string `xml:"Location,attr"`
|
||||
}
|
||||
|
||||
type Attribute struct {
|
||||
// XMLName xml.Name
|
||||
Xmlns string `xml:"xmlns,attr"`
|
||||
Name string `xml:"Name,attr"`
|
||||
NameFormat string `xml:"NameFormat,attr"`
|
||||
FriendlyName string `xml:"FriendlyName,attr"`
|
||||
Xmlns string `xml:"xmlns,attr"`
|
||||
Values []string `xml:"AttributeValue"`
|
||||
}
|
||||
|
||||
@ -386,7 +390,7 @@ func GetSamlResponse(application *Application, user *User, samlRequest string, h
|
||||
}
|
||||
|
||||
// NewSamlResponse11 return a saml1.1 response(not 2.0)
|
||||
func NewSamlResponse11(user *User, requestID string, host string) (*etree.Element, error) {
|
||||
func NewSamlResponse11(application *Application, user *User, requestID string, host string) (*etree.Element, error) {
|
||||
samlResponse := &etree.Element{
|
||||
Space: "samlp",
|
||||
Tag: "Response",
|
||||
@ -430,7 +434,11 @@ func NewSamlResponse11(user *User, requestID string, host string) (*etree.Elemen
|
||||
// nameIdentifier inside subject
|
||||
nameIdentifier := subject.CreateElement("saml:NameIdentifier")
|
||||
// nameIdentifier.CreateAttr("Format", "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress")
|
||||
nameIdentifier.SetText(user.Name)
|
||||
if application.UseEmailAsSamlNameId {
|
||||
nameIdentifier.SetText(user.Email)
|
||||
} else {
|
||||
nameIdentifier.SetText(user.Name)
|
||||
}
|
||||
|
||||
// subjectConfirmation inside subject
|
||||
subjectConfirmation := subject.CreateElement("saml:SubjectConfirmation")
|
||||
@ -439,7 +447,11 @@ func NewSamlResponse11(user *User, requestID string, host string) (*etree.Elemen
|
||||
attributeStatement := assertion.CreateElement("saml:AttributeStatement")
|
||||
subjectInAttribute := attributeStatement.CreateElement("saml:Subject")
|
||||
nameIdentifierInAttribute := subjectInAttribute.CreateElement("saml:NameIdentifier")
|
||||
nameIdentifierInAttribute.SetText(user.Name)
|
||||
if application.UseEmailAsSamlNameId {
|
||||
nameIdentifierInAttribute.SetText(user.Email)
|
||||
} else {
|
||||
nameIdentifierInAttribute.SetText(user.Name)
|
||||
}
|
||||
|
||||
subjectConfirmationInAttribute := subjectInAttribute.CreateElement("saml:SubjectConfirmation")
|
||||
subjectConfirmationInAttribute.CreateElement("saml:ConfirmationMethod").SetText("urn:oasis:names:tc:SAML:1.0:cm:artifact")
|
||||
|
@ -100,12 +100,13 @@ func GetUploadFileUrl(provider *Provider, fullFilePath string, hasTimestamp bool
|
||||
|
||||
fileUrl := ""
|
||||
if host != "" {
|
||||
fileUrl = util.UrlJoin(host, escapePath(objectKey))
|
||||
// fileUrl = util.UrlJoin(host, escapePath(objectKey))
|
||||
fileUrl = util.UrlJoin(host, objectKey)
|
||||
}
|
||||
|
||||
if fileUrl != "" && hasTimestamp {
|
||||
fileUrl = fmt.Sprintf("%s?t=%s", fileUrl, util.GetCurrentUnixTime())
|
||||
}
|
||||
// if fileUrl != "" && hasTimestamp {
|
||||
// fileUrl = fmt.Sprintf("%s?t=%s", fileUrl, util.GetCurrentUnixTime())
|
||||
// }
|
||||
|
||||
if provider.Type == ProviderTypeTencentCloudCOS {
|
||||
objectKey = escapePath(objectKey)
|
||||
@ -116,7 +117,18 @@ func GetUploadFileUrl(provider *Provider, fullFilePath string, hasTimestamp bool
|
||||
|
||||
func getStorageProvider(provider *Provider, lang string) (oss.StorageInterface, error) {
|
||||
endpoint := getProviderEndpoint(provider)
|
||||
storageProvider, err := storage.GetStorageProvider(provider.Type, provider.ClientId, provider.ClientSecret, provider.RegionId, provider.Bucket, endpoint)
|
||||
certificate := ""
|
||||
if provider.Category == "Storage" && provider.Type == "Casdoor" {
|
||||
cert, err := GetCert(util.GetId(provider.Owner, provider.Cert))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if cert == nil {
|
||||
return nil, fmt.Errorf("no cert for %s", provider.Cert)
|
||||
}
|
||||
certificate = cert.Certificate
|
||||
}
|
||||
storageProvider, err := storage.GetStorageProvider(provider.Type, provider.ClientId, provider.ClientSecret, provider.RegionId, provider.Bucket, endpoint, certificate, provider.Content)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -144,11 +156,15 @@ func uploadFile(provider *Provider, fullFilePath string, fileBuffer *bytes.Buffe
|
||||
fileUrl, objectKey := GetUploadFileUrl(provider, fullFilePath, true)
|
||||
objectKeyRefined := refineObjectKey(provider, objectKey)
|
||||
|
||||
_, err = storageProvider.Put(objectKeyRefined, fileBuffer)
|
||||
object, err := storageProvider.Put(objectKeyRefined, fileBuffer)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
if provider.Type == "Casdoor" {
|
||||
fileUrl = object.Path
|
||||
}
|
||||
|
||||
return fileUrl, objectKey, nil
|
||||
}
|
||||
|
||||
|
@ -281,7 +281,7 @@ func GetValidationBySaml(samlRequest string, host string) (string, string, error
|
||||
return "", "", fmt.Errorf("the application for user %s is not found", userId)
|
||||
}
|
||||
|
||||
samlResponse, err := NewSamlResponse11(user, request.RequestID, host)
|
||||
samlResponse, err := NewSamlResponse11(application, user, request.RequestID, host)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ package object
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/casdoor/casdoor/util"
|
||||
@ -378,36 +379,52 @@ func generateJwtToken(application *Application, user *User, nonce string, scope
|
||||
application.TokenFormat = "JWT"
|
||||
}
|
||||
|
||||
var jwtMethod jwt.SigningMethod
|
||||
|
||||
if application.TokenSigningMethod == "RS256" {
|
||||
jwtMethod = jwt.SigningMethodRS256
|
||||
} else if application.TokenSigningMethod == "RS512" {
|
||||
jwtMethod = jwt.SigningMethodRS512
|
||||
} else if application.TokenSigningMethod == "ES256" {
|
||||
jwtMethod = jwt.SigningMethodES256
|
||||
} else if application.TokenSigningMethod == "ES512" {
|
||||
jwtMethod = jwt.SigningMethodES512
|
||||
} else if application.TokenSigningMethod == "ES384" {
|
||||
jwtMethod = jwt.SigningMethodES384
|
||||
} else {
|
||||
jwtMethod = jwt.SigningMethodRS256
|
||||
}
|
||||
|
||||
// the JWT token length in "JWT-Empty" mode will be very short, as User object only has two properties: owner and name
|
||||
if application.TokenFormat == "JWT" {
|
||||
claimsWithoutThirdIdp := getClaimsWithoutThirdIdp(claims)
|
||||
|
||||
token = jwt.NewWithClaims(jwt.SigningMethodRS256, claimsWithoutThirdIdp)
|
||||
token = jwt.NewWithClaims(jwtMethod, claimsWithoutThirdIdp)
|
||||
claimsWithoutThirdIdp.ExpiresAt = jwt.NewNumericDate(refreshExpireTime)
|
||||
claimsWithoutThirdIdp.TokenType = "refresh-token"
|
||||
refreshToken = jwt.NewWithClaims(jwt.SigningMethodRS256, claimsWithoutThirdIdp)
|
||||
refreshToken = jwt.NewWithClaims(jwtMethod, claimsWithoutThirdIdp)
|
||||
} else if application.TokenFormat == "JWT-Empty" {
|
||||
claimsShort := getShortClaims(claims)
|
||||
|
||||
token = jwt.NewWithClaims(jwt.SigningMethodRS256, claimsShort)
|
||||
token = jwt.NewWithClaims(jwtMethod, claimsShort)
|
||||
claimsShort.ExpiresAt = jwt.NewNumericDate(refreshExpireTime)
|
||||
claimsShort.TokenType = "refresh-token"
|
||||
refreshToken = jwt.NewWithClaims(jwt.SigningMethodRS256, claimsShort)
|
||||
refreshToken = jwt.NewWithClaims(jwtMethod, claimsShort)
|
||||
} else if application.TokenFormat == "JWT-Custom" {
|
||||
claimsCustom := getClaimsCustom(claims, application.TokenFields)
|
||||
|
||||
token = jwt.NewWithClaims(jwt.SigningMethodRS256, claimsCustom)
|
||||
token = jwt.NewWithClaims(jwtMethod, claimsCustom)
|
||||
refreshClaims := getClaimsCustom(claims, application.TokenFields)
|
||||
refreshClaims["exp"] = jwt.NewNumericDate(refreshExpireTime)
|
||||
refreshClaims["TokenType"] = "refresh-token"
|
||||
refreshToken = jwt.NewWithClaims(jwt.SigningMethodRS256, refreshClaims)
|
||||
refreshToken = jwt.NewWithClaims(jwtMethod, refreshClaims)
|
||||
} else if application.TokenFormat == "JWT-Standard" {
|
||||
claimsStandard := getStandardClaims(claims)
|
||||
|
||||
token = jwt.NewWithClaims(jwt.SigningMethodRS256, claimsStandard)
|
||||
token = jwt.NewWithClaims(jwtMethod, claimsStandard)
|
||||
claimsStandard.ExpiresAt = jwt.NewNumericDate(refreshExpireTime)
|
||||
claimsStandard.TokenType = "refresh-token"
|
||||
refreshToken = jwt.NewWithClaims(jwt.SigningMethodRS256, claimsStandard)
|
||||
refreshToken = jwt.NewWithClaims(jwtMethod, claimsStandard)
|
||||
} else {
|
||||
return "", "", "", fmt.Errorf("unknown application TokenFormat: %s", application.TokenFormat)
|
||||
}
|
||||
@ -425,34 +442,57 @@ func generateJwtToken(application *Application, user *User, nonce string, scope
|
||||
}
|
||||
}
|
||||
|
||||
// RSA private key
|
||||
key, err := jwt.ParseRSAPrivateKeyFromPEM([]byte(cert.PrivateKey))
|
||||
var (
|
||||
tokenString string
|
||||
refreshTokenString string
|
||||
key interface{}
|
||||
)
|
||||
|
||||
if strings.Contains(application.TokenSigningMethod, "RS") || application.TokenSigningMethod == "" {
|
||||
// RSA private key
|
||||
key, err = jwt.ParseRSAPrivateKeyFromPEM([]byte(cert.PrivateKey))
|
||||
} else if strings.Contains(application.TokenSigningMethod, "ES") {
|
||||
// ES private key
|
||||
key, err = jwt.ParseECPrivateKeyFromPEM([]byte(cert.PrivateKey))
|
||||
} else if strings.Contains(application.TokenSigningMethod, "Ed") {
|
||||
// Ed private key
|
||||
key, err = jwt.ParseEdPrivateKeyFromPEM([]byte(cert.PrivateKey))
|
||||
}
|
||||
if err != nil {
|
||||
return "", "", "", err
|
||||
}
|
||||
|
||||
token.Header["kid"] = cert.Name
|
||||
tokenString, err := token.SignedString(key)
|
||||
tokenString, err = token.SignedString(key)
|
||||
if err != nil {
|
||||
return "", "", "", err
|
||||
}
|
||||
refreshTokenString, err := refreshToken.SignedString(key)
|
||||
refreshTokenString, err = refreshToken.SignedString(key)
|
||||
|
||||
return tokenString, refreshTokenString, name, err
|
||||
}
|
||||
|
||||
func ParseJwtToken(token string, cert *Cert) (*Claims, error) {
|
||||
t, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
|
||||
if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
|
||||
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
|
||||
}
|
||||
var (
|
||||
certificate interface{}
|
||||
err error
|
||||
)
|
||||
|
||||
if cert.Certificate == "" {
|
||||
return nil, fmt.Errorf("the certificate field should not be empty for the cert: %v", cert)
|
||||
}
|
||||
|
||||
// RSA certificate
|
||||
certificate, err := jwt.ParseRSAPublicKeyFromPEM([]byte(cert.Certificate))
|
||||
if _, ok := token.Method.(*jwt.SigningMethodRSA); ok {
|
||||
// RSA certificate
|
||||
certificate, err = jwt.ParseRSAPublicKeyFromPEM([]byte(cert.Certificate))
|
||||
} else if _, ok := token.Method.(*jwt.SigningMethodECDSA); ok {
|
||||
// ES certificate
|
||||
certificate, err = jwt.ParseECPublicKeyFromPEM([]byte(cert.Certificate))
|
||||
} else {
|
||||
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -18,16 +18,20 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/casdoor/casdoor/util"
|
||||
"github.com/golang-jwt/jwt/v4"
|
||||
)
|
||||
|
||||
type ClaimsStandard struct {
|
||||
*UserShort
|
||||
Gender string `json:"gender,omitempty"`
|
||||
TokenType string `json:"tokenType,omitempty"`
|
||||
Nonce string `json:"nonce,omitempty"`
|
||||
Scope string `json:"scope,omitempty"`
|
||||
Address OIDCAddress `json:"address,omitempty"`
|
||||
EmailVerified bool `json:"email_verified,omitempty"`
|
||||
PhoneNumber string `json:"phone_number,omitempty"`
|
||||
PhoneNumberVerified bool `json:"phone_number_verified,omitempty"`
|
||||
Gender string `json:"gender,omitempty"`
|
||||
TokenType string `json:"tokenType,omitempty"`
|
||||
Nonce string `json:"nonce,omitempty"`
|
||||
Scope string `json:"scope,omitempty"`
|
||||
Address OIDCAddress `json:"address,omitempty"`
|
||||
|
||||
jwt.RegisteredClaims
|
||||
}
|
||||
@ -43,12 +47,14 @@ func getStreetAddress(user *User) string {
|
||||
func getStandardClaims(claims Claims) ClaimsStandard {
|
||||
res := ClaimsStandard{
|
||||
UserShort: getShortUser(claims.User),
|
||||
EmailVerified: claims.User.EmailVerified,
|
||||
TokenType: claims.TokenType,
|
||||
Nonce: claims.Nonce,
|
||||
Scope: claims.Scope,
|
||||
RegisteredClaims: claims.RegisteredClaims,
|
||||
}
|
||||
|
||||
res.Phone = ""
|
||||
var scopes []string
|
||||
|
||||
if strings.Contains(claims.Scope, ",") {
|
||||
@ -62,6 +68,15 @@ func getStandardClaims(claims Claims) ClaimsStandard {
|
||||
res.Address = OIDCAddress{StreetAddress: getStreetAddress(claims.User)}
|
||||
} else if scope == "profile" {
|
||||
res.Gender = claims.User.Gender
|
||||
} else if scope == "phone" && claims.User.Phone != "" {
|
||||
res.PhoneNumberVerified = true
|
||||
phoneNumber, ok := util.GetE164Number(claims.User.Phone, claims.User.CountryCode)
|
||||
if !ok {
|
||||
res.PhoneNumberVerified = false
|
||||
} else {
|
||||
res.PhoneNumber = phoneNumber
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -950,7 +950,17 @@ func DeleteUser(user *User) (bool, error) {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return deleteUser(user)
|
||||
organization, err := GetOrganizationByUser(user)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if organization != nil && organization.EnableSoftDeletion {
|
||||
user.IsDeleted = true
|
||||
user.DeletedTime = util.GetCurrentTime()
|
||||
return UpdateUser(user.GetId(), user, []string{"is_deleted", "deleted_time"}, false)
|
||||
} else {
|
||||
return deleteUser(user)
|
||||
}
|
||||
}
|
||||
|
||||
func GetUserInfo(user *User, scope string, aud string, host string) (*Userinfo, error) {
|
||||
|
@ -271,113 +271,213 @@ func CheckPermissionForUpdateUser(oldUser, newUser *User, isAdmin bool, lang str
|
||||
|
||||
if oldUser.Owner != newUser.Owner {
|
||||
item := GetAccountItemByName("Organization", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Owner = oldUser.Owner
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Name != newUser.Name {
|
||||
item := GetAccountItemByName("Name", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Name = oldUser.Name
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Id != newUser.Id {
|
||||
item := GetAccountItemByName("ID", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Id = oldUser.Id
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.DisplayName != newUser.DisplayName {
|
||||
item := GetAccountItemByName("Display name", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.DisplayName = oldUser.DisplayName
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Avatar != newUser.Avatar {
|
||||
item := GetAccountItemByName("Avatar", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Avatar = oldUser.Avatar
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Type != newUser.Type {
|
||||
item := GetAccountItemByName("User type", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Type = oldUser.Type
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
// The password is *** when not modified
|
||||
if oldUser.Password != newUser.Password && newUser.Password != "***" {
|
||||
item := GetAccountItemByName("Password", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Password = oldUser.Password
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Email != newUser.Email {
|
||||
item := GetAccountItemByName("Email", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Email = oldUser.Email
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Phone != newUser.Phone {
|
||||
item := GetAccountItemByName("Phone", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Phone = oldUser.Phone
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.CountryCode != newUser.CountryCode {
|
||||
item := GetAccountItemByName("Country code", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.CountryCode = oldUser.CountryCode
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Region != newUser.Region {
|
||||
item := GetAccountItemByName("Country/Region", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Region = oldUser.Region
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Location != newUser.Location {
|
||||
item := GetAccountItemByName("Location", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Location = oldUser.Location
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Affiliation != newUser.Affiliation {
|
||||
item := GetAccountItemByName("Affiliation", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Affiliation = oldUser.Affiliation
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Title != newUser.Title {
|
||||
item := GetAccountItemByName("Title", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Title = oldUser.Title
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Homepage != newUser.Homepage {
|
||||
item := GetAccountItemByName("Homepage", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Homepage = oldUser.Homepage
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Bio != newUser.Bio {
|
||||
item := GetAccountItemByName("Bio", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Bio = oldUser.Bio
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.Tag != newUser.Tag {
|
||||
item := GetAccountItemByName("Tag", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Tag = oldUser.Tag
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.SignupApplication != newUser.SignupApplication {
|
||||
item := GetAccountItemByName("Signup application", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.SignupApplication = oldUser.SignupApplication
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Gender != newUser.Gender {
|
||||
item := GetAccountItemByName("Gender", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Gender = oldUser.Gender
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Birthday != newUser.Birthday {
|
||||
item := GetAccountItemByName("Birthday", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Birthday = oldUser.Birthday
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Education != newUser.Education {
|
||||
item := GetAccountItemByName("Education", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Education = oldUser.Education
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.IdCard != newUser.IdCard {
|
||||
item := GetAccountItemByName("ID card", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.IdCard = oldUser.IdCard
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.IdCardType != newUser.IdCardType {
|
||||
item := GetAccountItemByName("ID card type", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.IdCardType = oldUser.IdCardType
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
oldUserPropertiesJson, _ := json.Marshal(oldUser.Properties)
|
||||
newUserPropertiesJson, _ := json.Marshal(newUser.Properties)
|
||||
if string(oldUserPropertiesJson) != string(newUserPropertiesJson) {
|
||||
item := GetAccountItemByName("Properties", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Properties = oldUser.Properties
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.PreferredMfaType != newUser.PreferredMfaType {
|
||||
item := GetAccountItemByName("Multi-factor authentication", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.PreferredMfaType = oldUser.PreferredMfaType
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Groups == nil {
|
||||
@ -390,7 +490,11 @@ func CheckPermissionForUpdateUser(oldUser, newUser *User, isAdmin bool, lang str
|
||||
newUserGroupsJson, _ := json.Marshal(newUser.Groups)
|
||||
if string(oldUserGroupsJson) != string(newUserGroupsJson) {
|
||||
item := GetAccountItemByName("Groups", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Groups = oldUser.Groups
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Address == nil {
|
||||
@ -404,65 +508,117 @@ func CheckPermissionForUpdateUser(oldUser, newUser *User, isAdmin bool, lang str
|
||||
newUserAddressJson, _ := json.Marshal(newUser.Address)
|
||||
if string(oldUserAddressJson) != string(newUserAddressJson) {
|
||||
item := GetAccountItemByName("Address", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Address = oldUser.Address
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if newUser.FaceIds != nil {
|
||||
item := GetAccountItemByName("Face ID", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.FaceIds = oldUser.FaceIds
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.IsAdmin != newUser.IsAdmin {
|
||||
item := GetAccountItemByName("Is admin", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.IsAdmin = oldUser.IsAdmin
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.IsForbidden != newUser.IsForbidden {
|
||||
item := GetAccountItemByName("Is forbidden", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.IsForbidden = oldUser.IsForbidden
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.IsDeleted != newUser.IsDeleted {
|
||||
item := GetAccountItemByName("Is deleted", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.IsDeleted = oldUser.IsDeleted
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
if oldUser.NeedUpdatePassword != newUser.NeedUpdatePassword {
|
||||
item := GetAccountItemByName("Need update password", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.NeedUpdatePassword = oldUser.NeedUpdatePassword
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Balance != newUser.Balance {
|
||||
item := GetAccountItemByName("Balance", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Balance = oldUser.Balance
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Score != newUser.Score {
|
||||
item := GetAccountItemByName("Score", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Score = oldUser.Score
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Karma != newUser.Karma {
|
||||
item := GetAccountItemByName("Karma", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Karma = oldUser.Karma
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Language != newUser.Language {
|
||||
item := GetAccountItemByName("Language", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Language = oldUser.Language
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Ranking != newUser.Ranking {
|
||||
item := GetAccountItemByName("Ranking", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Ranking = oldUser.Ranking
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Currency != newUser.Currency {
|
||||
item := GetAccountItemByName("Currency", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Currency = oldUser.Currency
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
if oldUser.Hash != newUser.Hash {
|
||||
item := GetAccountItemByName("Hash", organization)
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
if item == nil {
|
||||
newUser.Hash = oldUser.Hash
|
||||
} else {
|
||||
itemsChanged = append(itemsChanged, item)
|
||||
}
|
||||
}
|
||||
|
||||
for _, accountItem := range itemsChanged {
|
||||
|
@ -166,19 +166,76 @@ func AddToVerificationRecord(user *User, provider *Provider, remoteAddr, recordT
|
||||
return nil
|
||||
}
|
||||
|
||||
func filterRecordIn24Hours(record *VerificationRecord) *VerificationRecord {
|
||||
if record == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
now := time.Now().Unix()
|
||||
if now-record.Time > 60*60*24 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return record
|
||||
}
|
||||
|
||||
func getVerificationRecord(dest string) (*VerificationRecord, error) {
|
||||
var record VerificationRecord
|
||||
record := &VerificationRecord{}
|
||||
record.Receiver = dest
|
||||
|
||||
has, err := ormer.Engine.Desc("time").Where("is_used = false").Get(&record)
|
||||
has, err := ormer.Engine.Desc("time").Where("is_used = false").Get(record)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
record = filterRecordIn24Hours(record)
|
||||
if record == nil {
|
||||
has = false
|
||||
}
|
||||
|
||||
if !has {
|
||||
record = &VerificationRecord{}
|
||||
record.Receiver = dest
|
||||
|
||||
has, err = ormer.Engine.Desc("time").Get(record)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
record = filterRecordIn24Hours(record)
|
||||
if record == nil {
|
||||
has = false
|
||||
}
|
||||
|
||||
if !has {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return record, nil
|
||||
}
|
||||
|
||||
return record, nil
|
||||
}
|
||||
|
||||
func getUnusedVerificationRecord(dest string) (*VerificationRecord, error) {
|
||||
record := &VerificationRecord{}
|
||||
record.Receiver = dest
|
||||
|
||||
has, err := ormer.Engine.Desc("time").Where("is_used = false").Get(record)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
record = filterRecordIn24Hours(record)
|
||||
if record == nil {
|
||||
has = false
|
||||
}
|
||||
|
||||
if !has {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return &record, nil
|
||||
return record, nil
|
||||
}
|
||||
|
||||
func CheckVerificationCode(dest string, code string, lang string) (*VerifyResult, error) {
|
||||
@ -187,7 +244,9 @@ func CheckVerificationCode(dest string, code string, lang string) (*VerifyResult
|
||||
return nil, err
|
||||
}
|
||||
if record == nil {
|
||||
return &VerifyResult{noRecordError, i18n.Translate(lang, "verification:The verification code has not been sent yet, or has already been used!")}, nil
|
||||
return &VerifyResult{noRecordError, i18n.Translate(lang, "verification:The verification code has not been sent yet!")}, nil
|
||||
} else if record.IsUsed {
|
||||
return &VerifyResult{noRecordError, i18n.Translate(lang, "verification:The verification code has already been used!")}, nil
|
||||
}
|
||||
|
||||
timeoutInMinutes, err := conf.GetConfigInt64("verificationCodeTimeout")
|
||||
@ -196,9 +255,6 @@ func CheckVerificationCode(dest string, code string, lang string) (*VerifyResult
|
||||
}
|
||||
|
||||
now := time.Now().Unix()
|
||||
if now-record.Time > timeoutInMinutes*60*10 {
|
||||
return &VerifyResult{noRecordError, i18n.Translate(lang, "verification:The verification code has not been sent yet!")}, nil
|
||||
}
|
||||
if now-record.Time > timeoutInMinutes*60 {
|
||||
return &VerifyResult{timeoutError, fmt.Sprintf(i18n.Translate(lang, "verification:You should verify your code in %d min!"), timeoutInMinutes)}, nil
|
||||
}
|
||||
@ -211,7 +267,7 @@ func CheckVerificationCode(dest string, code string, lang string) (*VerifyResult
|
||||
}
|
||||
|
||||
func DisableVerificationCode(dest string) error {
|
||||
record, err := getVerificationRecord(dest)
|
||||
record, err := getUnusedVerificationRecord(dest)
|
||||
if record == nil || err != nil {
|
||||
return nil
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ package routers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/beego/beego/context"
|
||||
"github.com/casdoor/casdoor/object"
|
||||
@ -23,6 +24,10 @@ import (
|
||||
)
|
||||
|
||||
func AutoSigninFilter(ctx *context.Context) {
|
||||
urlPath := ctx.Request.URL.Path
|
||||
if strings.HasPrefix(urlPath, "/api/login/oauth/access_token") {
|
||||
return
|
||||
}
|
||||
//if getSessionUser(ctx) != "" {
|
||||
// return
|
||||
//}
|
||||
|
@ -48,6 +48,10 @@ func CorsFilter(ctx *context.Context) {
|
||||
originHostname := getHostname(origin)
|
||||
host := removePort(ctx.Request.Host)
|
||||
|
||||
if origin == "null" {
|
||||
origin = ""
|
||||
}
|
||||
|
||||
if strings.HasPrefix(origin, "http://localhost") || strings.HasPrefix(origin, "https://localhost") || strings.HasPrefix(origin, "http://127.0.0.1") || strings.HasPrefix(origin, "http://casdoor-app") || strings.Contains(origin, ".chromiumapp.org") {
|
||||
setCorsHeaders(ctx, origin)
|
||||
return
|
||||
|
@ -290,6 +290,7 @@ func initAPI() {
|
||||
|
||||
beego.Router("/.well-known/openid-configuration", &controllers.RootController{}, "GET:GetOidcDiscovery")
|
||||
beego.Router("/.well-known/jwks", &controllers.RootController{}, "*:GetJwks")
|
||||
beego.Router("/.well-known/webfinger", &controllers.RootController{}, "GET:GetWebFinger")
|
||||
|
||||
beego.Router("/cas/:organization/:application/serviceValidate", &controllers.RootController{}, "GET:CasServiceValidate")
|
||||
beego.Router("/cas/:organization/:application/proxyValidate", &controllers.RootController{}, "GET:CasProxyValidate")
|
||||
|
@ -43,6 +43,10 @@ func getWebBuildFolder() string {
|
||||
return path
|
||||
}
|
||||
|
||||
if util.FileExist(filepath.Join(frontendBaseDir, "index.html")) {
|
||||
return frontendBaseDir
|
||||
}
|
||||
|
||||
path = filepath.Join(frontendBaseDir, "web/build")
|
||||
return path
|
||||
}
|
||||
@ -58,7 +62,7 @@ func fastAutoSignin(ctx *context.Context) (string, error) {
|
||||
redirectUri := ctx.Input.Query("redirect_uri")
|
||||
scope := ctx.Input.Query("scope")
|
||||
state := ctx.Input.Query("state")
|
||||
nonce := ""
|
||||
nonce := ctx.Input.Query("nonce")
|
||||
codeChallenge := ctx.Input.Query("code_challenge")
|
||||
if clientId == "" || responseType != "code" || redirectUri == "" {
|
||||
return "", nil
|
||||
|
64
routers/timeout_filter.go
Normal file
64
routers/timeout_filter.go
Normal file
@ -0,0 +1,64 @@
|
||||
// Copyright 2024 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.
|
||||
|
||||
package routers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/beego/beego/context"
|
||||
"github.com/casdoor/casdoor/conf"
|
||||
)
|
||||
|
||||
var (
|
||||
inactiveTimeoutMinutes int64
|
||||
requestTimeMap sync.Map
|
||||
)
|
||||
|
||||
func init() {
|
||||
var err error
|
||||
inactiveTimeoutMinutes, err = conf.GetConfigInt64("inactiveTimeoutMinutes")
|
||||
if err != nil {
|
||||
inactiveTimeoutMinutes = 0
|
||||
}
|
||||
}
|
||||
|
||||
func timeoutLogout(ctx *context.Context, sessionId string) {
|
||||
requestTimeMap.Delete(sessionId)
|
||||
ctx.Input.CruSession.Set("username", "")
|
||||
ctx.Input.CruSession.Set("accessToken", "")
|
||||
ctx.Input.CruSession.Delete("SessionData")
|
||||
responseError(ctx, fmt.Sprintf(T(ctx, "auth:Timeout for inactivity of %d minutes"), inactiveTimeoutMinutes))
|
||||
}
|
||||
|
||||
func TimeoutFilter(ctx *context.Context) {
|
||||
if inactiveTimeoutMinutes <= 0 {
|
||||
return
|
||||
}
|
||||
|
||||
owner, name := getSubject(ctx)
|
||||
if owner == "anonymous" || name == "anonymous" {
|
||||
return
|
||||
}
|
||||
|
||||
sessionId := ctx.Input.CruSession.SessionID()
|
||||
currentTime := time.Now()
|
||||
preRequestTime, has := requestTimeMap.Load(sessionId)
|
||||
requestTimeMap.Store(sessionId, currentTime)
|
||||
if has && preRequestTime.(time.Time).Add(time.Minute*time.Duration(inactiveTimeoutMinutes)).Before(currentTime) {
|
||||
timeoutLogout(ctx, sessionId)
|
||||
}
|
||||
}
|
19
storage/casdoor.go
Normal file
19
storage/casdoor.go
Normal file
@ -0,0 +1,19 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"github.com/casdoor/oss"
|
||||
"github.com/casdoor/oss/casdoor"
|
||||
)
|
||||
|
||||
func NewCasdoorStorageProvider(providerType string, clientId string, clientSecret string, region string, bucket string, endpoint string, cert string, content string) oss.StorageInterface {
|
||||
sp := casdoor.New(&casdoor.Config{
|
||||
clientId,
|
||||
clientSecret,
|
||||
endpoint,
|
||||
cert,
|
||||
region,
|
||||
content,
|
||||
bucket,
|
||||
})
|
||||
return sp
|
||||
}
|
@ -16,7 +16,7 @@ package storage
|
||||
|
||||
import "github.com/casdoor/oss"
|
||||
|
||||
func GetStorageProvider(providerType string, clientId string, clientSecret string, region string, bucket string, endpoint string) (oss.StorageInterface, error) {
|
||||
func GetStorageProvider(providerType string, clientId string, clientSecret string, region string, bucket string, endpoint string, cert string, content string) (oss.StorageInterface, error) {
|
||||
switch providerType {
|
||||
case "Local File System":
|
||||
return NewLocalFileSystemStorageProvider(), nil
|
||||
@ -36,6 +36,8 @@ func GetStorageProvider(providerType string, clientId string, clientSecret strin
|
||||
return NewGoogleCloudStorageProvider(clientSecret, bucket, endpoint), nil
|
||||
case "Synology":
|
||||
return NewSynologyNasStorageProvider(clientId, clientSecret, endpoint), nil
|
||||
case "Casdoor":
|
||||
return NewCasdoorStorageProvider(providerType, clientId, clientSecret, region, bucket, endpoint, cert, content), nil
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
|
@ -344,7 +344,8 @@ class App extends Component {
|
||||
window.location.pathname.startsWith("/cas") ||
|
||||
window.location.pathname.startsWith("/select-plan") ||
|
||||
window.location.pathname.startsWith("/buy-plan") ||
|
||||
window.location.pathname.startsWith("/qrcode") ;
|
||||
window.location.pathname.startsWith("/qrcode") ||
|
||||
window.location.pathname.startsWith("/captcha");
|
||||
}
|
||||
|
||||
onClick = ({key}) => {
|
||||
|
@ -407,6 +407,16 @@ class ApplicationEditPage extends React.Component {
|
||||
/>
|
||||
</Col>
|
||||
</Row>
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||
{Setting.getLabel(i18next.t("application:Token signing method"), i18next.t("application:Token signing method - Tooltip"))} :
|
||||
</Col>
|
||||
<Col span={22} >
|
||||
<Select virtual={false} style={{width: "100%"}} value={this.state.application.tokenSigningMethod === "" ? "RS256" : this.state.application.tokenSigningMethod} onChange={(value => {this.updateApplicationField("tokenSigningMethod", value);})}
|
||||
options={["RS256", "RS512", "ES256", "ES512", "ES384"].map((item) => Setting.getOption(item, item))}
|
||||
/>
|
||||
</Col>
|
||||
</Row>
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||
{Setting.getLabel(i18next.t("application:Token fields"), i18next.t("application:Token fields - Tooltip"))} :
|
||||
@ -693,6 +703,16 @@ class ApplicationEditPage extends React.Component {
|
||||
}} />
|
||||
</Col>
|
||||
</Row>
|
||||
<Row style={{marginTop: "20px"}}>
|
||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 19 : 2}>
|
||||
{Setting.getLabel(i18next.t("application:Use Email as NameID"), i18next.t("application:Use Email as NameID - Tooltip"))} :
|
||||
</Col>
|
||||
<Col span={1}>
|
||||
<Switch checked={this.state.application.useEmailAsSamlNameId} onChange={checked => {
|
||||
this.updateApplicationField("useEmailAsSamlNameId", checked);
|
||||
}} />
|
||||
</Col>
|
||||
</Row>
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 19 : 2}>
|
||||
{Setting.getLabel(i18next.t("application:Enable SAML POST binding"), i18next.t("application:Enable SAML POST binding - Tooltip"))} :
|
||||
|
116
web/src/CaptchaPage.js
Normal file
116
web/src/CaptchaPage.js
Normal file
@ -0,0 +1,116 @@
|
||||
// Copyright 2021 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 {CaptchaModal} from "./common/modal/CaptchaModal";
|
||||
import * as ApplicationBackend from "./backend/ApplicationBackend";
|
||||
import * as Setting from "./Setting";
|
||||
|
||||
class CaptchaPage extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
const params = new URLSearchParams(this.props.location.search);
|
||||
this.state = {
|
||||
owner: "admin",
|
||||
application: null,
|
||||
clientId: params.get("client_id"),
|
||||
applicationName: params.get("state"),
|
||||
redirectUri: params.get("redirect_uri"),
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.getApplication();
|
||||
}
|
||||
|
||||
onUpdateApplication(application) {
|
||||
this.setState({
|
||||
application: application,
|
||||
});
|
||||
}
|
||||
|
||||
getApplication() {
|
||||
if (this.state.applicationName === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
ApplicationBackend.getApplication(this.state.owner, this.state.applicationName)
|
||||
.then((res) => {
|
||||
if (res.status === "error") {
|
||||
this.onUpdateApplication(null);
|
||||
this.setState({
|
||||
msg: res.msg,
|
||||
});
|
||||
return ;
|
||||
}
|
||||
this.onUpdateApplication(res.data);
|
||||
});
|
||||
}
|
||||
|
||||
getCaptchaProviderItems(application) {
|
||||
const providers = application?.providers;
|
||||
|
||||
if (providers === undefined || providers === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return providers.filter(providerItem => {
|
||||
if (providerItem.provider === undefined || providerItem.provider === null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return providerItem.provider.category === "Captcha";
|
||||
});
|
||||
}
|
||||
|
||||
callback(values) {
|
||||
Setting.goToLink(`${this.state.redirectUri}?code=${values.captchaToken}&type=${values.captchaType}&secret=${values.clientSecret}&applicationId=${values.applicationId}`);
|
||||
}
|
||||
|
||||
renderCaptchaModal(application) {
|
||||
const captchaProviderItems = this.getCaptchaProviderItems(application);
|
||||
if (captchaProviderItems === null) {
|
||||
return null;
|
||||
}
|
||||
const alwaysProviderItems = captchaProviderItems.filter(providerItem => providerItem.rule === "Always");
|
||||
const dynamicProviderItems = captchaProviderItems.filter(providerItem => providerItem.rule === "Dynamic");
|
||||
const provider = alwaysProviderItems.length > 0
|
||||
? alwaysProviderItems[0].provider
|
||||
: dynamicProviderItems[0].provider;
|
||||
|
||||
return <CaptchaModal
|
||||
owner={provider.owner}
|
||||
name={provider.name}
|
||||
visible={true}
|
||||
onOk={(captchaType, captchaToken, clientSecret) => {
|
||||
const values = {
|
||||
captchaType: captchaType,
|
||||
captchaToken: captchaToken,
|
||||
clientSecret: clientSecret,
|
||||
applicationId: `${provider.owner}/${provider.name}`,
|
||||
};
|
||||
this.callback(values);
|
||||
}}
|
||||
onCancel={() => this.callback({captchaType: "none", captchaToken: "", clientSecret: ""})}
|
||||
isCurrentProvider={true}
|
||||
/>;
|
||||
}
|
||||
render() {
|
||||
return (
|
||||
this.renderCaptchaModal(this.state.application)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default CaptchaPage;
|
97
web/src/CasbinEditor.js
Normal file
97
web/src/CasbinEditor.js
Normal file
@ -0,0 +1,97 @@
|
||||
// Copyright 2024 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, {useCallback, useEffect, useRef, useState} from "react";
|
||||
import {Controlled as CodeMirror} from "react-codemirror2";
|
||||
import "codemirror/lib/codemirror.css";
|
||||
import "codemirror/mode/properties/properties";
|
||||
import * as Setting from "./Setting";
|
||||
import IframeEditor from "./IframeEditor";
|
||||
import {Tabs} from "antd";
|
||||
|
||||
const {TabPane} = Tabs;
|
||||
|
||||
const CasbinEditor = ({model, onModelTextChange}) => {
|
||||
const [activeKey, setActiveKey] = useState("advanced");
|
||||
const iframeRef = useRef(null);
|
||||
const [localModelText, setLocalModelText] = useState(model.modelText);
|
||||
|
||||
const handleModelTextChange = useCallback((newModelText) => {
|
||||
if (!Setting.builtInObject(model)) {
|
||||
setLocalModelText(newModelText);
|
||||
onModelTextChange(newModelText);
|
||||
}
|
||||
}, [model, onModelTextChange]);
|
||||
|
||||
const syncModelText = useCallback(() => {
|
||||
return new Promise((resolve) => {
|
||||
if (activeKey === "advanced" && iframeRef.current) {
|
||||
const handleSyncMessage = (event) => {
|
||||
if (event.data.type === "modelUpdate") {
|
||||
window.removeEventListener("message", handleSyncMessage);
|
||||
handleModelTextChange(event.data.modelText);
|
||||
resolve();
|
||||
}
|
||||
};
|
||||
window.addEventListener("message", handleSyncMessage);
|
||||
iframeRef.current.getModelText();
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
}, [activeKey, handleModelTextChange]);
|
||||
|
||||
const handleTabChange = (key) => {
|
||||
syncModelText().then(() => {
|
||||
setActiveKey(key);
|
||||
if (key === "advanced" && iframeRef.current) {
|
||||
iframeRef.current.updateModelText(localModelText);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
setLocalModelText(model.modelText);
|
||||
}, [model.modelText]);
|
||||
|
||||
return (
|
||||
<div style={{height: "100%", width: "100%", display: "flex", flexDirection: "column"}}>
|
||||
<Tabs activeKey={activeKey} onChange={handleTabChange} style={{flex: "0 0 auto", marginTop: "-10px"}}>
|
||||
<TabPane tab="Basic Editor" key="basic" />
|
||||
<TabPane tab="Advanced Editor" key="advanced" />
|
||||
</Tabs>
|
||||
<div style={{flex: "1 1 auto", overflow: "hidden"}}>
|
||||
{activeKey === "advanced" ? (
|
||||
<IframeEditor
|
||||
ref={iframeRef}
|
||||
initialModelText={localModelText}
|
||||
onModelTextChange={handleModelTextChange}
|
||||
style={{width: "100%", height: "100%"}}
|
||||
/>
|
||||
) : (
|
||||
<CodeMirror
|
||||
value={localModelText}
|
||||
className="full-height-editor no-horizontal-scroll-editor"
|
||||
options={{mode: "properties", theme: "default"}}
|
||||
onBeforeChange={(editor, data, value) => {
|
||||
handleModelTextChange(value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default CasbinEditor;
|
@ -288,14 +288,14 @@ class CertEditPage extends React.Component {
|
||||
Setting.showMessage("success", i18next.t("general:Successfully saved"));
|
||||
this.setState({
|
||||
certName: this.state.cert.name,
|
||||
}, () => {
|
||||
if (exitAfterSave) {
|
||||
this.props.history.push("/certs");
|
||||
} else {
|
||||
this.props.history.push(`/certs/${this.state.cert.owner}/${this.state.cert.name}`);
|
||||
this.getCert();
|
||||
}
|
||||
});
|
||||
|
||||
if (exitAfterSave) {
|
||||
this.props.history.push("/certs");
|
||||
} else {
|
||||
this.props.history.push(`/certs/${this.state.cert.owner}/${this.state.cert.name}`);
|
||||
this.getCert();
|
||||
}
|
||||
} else {
|
||||
Setting.showMessage("error", `${i18next.t("general:Failed to save")}: ${res.msg}`);
|
||||
this.updateCertField("name", this.state.certName);
|
||||
|
@ -32,6 +32,7 @@ import {authConfig} from "./auth/Auth";
|
||||
import ProductBuyPage from "./ProductBuyPage";
|
||||
import PaymentResultPage from "./PaymentResultPage";
|
||||
import QrCodePage from "./QrCodePage";
|
||||
import CaptchaPage from "./CaptchaPage";
|
||||
import CustomHead from "./basic/CustomHead";
|
||||
|
||||
class EntryPage extends React.Component {
|
||||
@ -120,6 +121,7 @@ class EntryPage extends React.Component {
|
||||
<Route exact path="/buy-plan/:owner/:pricingName" render={(props) => <ProductBuyPage {...this.props} pricing={this.state.pricing} onUpdatePricing={onUpdatePricing} {...props} />} />
|
||||
<Route exact path="/buy-plan/:owner/:pricingName/result" render={(props) => <PaymentResultPage {...this.props} pricing={this.state.pricing} onUpdatePricing={onUpdatePricing} {...props} />} />
|
||||
<Route exact path="/qrcode/:owner/:paymentName" render={(props) => <QrCodePage {...this.props} onUpdateApplication={onUpdateApplication} {...props} />} />
|
||||
<Route exact path="/captcha" render={(props) => <CaptchaPage {...props} />} />
|
||||
</Switch>
|
||||
</div>
|
||||
</React.Fragment>
|
||||
|
66
web/src/IframeEditor.js
Normal file
66
web/src/IframeEditor.js
Normal file
@ -0,0 +1,66 @@
|
||||
// Copyright 2024 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, {forwardRef, useEffect, useImperativeHandle, useRef, useState} from "react";
|
||||
|
||||
const IframeEditor = forwardRef(({initialModelText, onModelTextChange}, ref) => {
|
||||
const iframeRef = useRef(null);
|
||||
const [iframeReady, setIframeReady] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const handleMessage = (event) => {
|
||||
if (event.origin !== "https://editor.casbin.org") {return;}
|
||||
|
||||
if (event.data.type === "modelUpdate") {
|
||||
onModelTextChange(event.data.modelText);
|
||||
} else if (event.data.type === "iframeReady") {
|
||||
setIframeReady(true);
|
||||
iframeRef.current?.contentWindow.postMessage({
|
||||
type: "initializeModel",
|
||||
modelText: initialModelText,
|
||||
}, "*");
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener("message", handleMessage);
|
||||
return () => window.removeEventListener("message", handleMessage);
|
||||
}, [onModelTextChange, initialModelText]);
|
||||
|
||||
useImperativeHandle(ref, () => ({
|
||||
getModelText: () => {
|
||||
iframeRef.current?.contentWindow.postMessage({type: "getModelText"}, "*");
|
||||
},
|
||||
updateModelText: (newModelText) => {
|
||||
if (iframeReady) {
|
||||
iframeRef.current?.contentWindow.postMessage({
|
||||
type: "updateModelText",
|
||||
modelText: newModelText,
|
||||
}, "*");
|
||||
}
|
||||
},
|
||||
}));
|
||||
|
||||
return (
|
||||
<iframe
|
||||
ref={iframeRef}
|
||||
src="https://editor.casbin.org/model-editor"
|
||||
frameBorder="0"
|
||||
width="100%"
|
||||
height="500px"
|
||||
title="Casbin Model Editor"
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default IframeEditor;
|
@ -13,12 +13,13 @@
|
||||
// limitations under the License.
|
||||
|
||||
import React from "react";
|
||||
import {Button, Card, Col, Input, InputNumber, Row, Select, Switch} from "antd";
|
||||
import {EyeInvisibleOutlined, EyeTwoTone} from "@ant-design/icons";
|
||||
import {Button, Card, Col, Input, InputNumber, Row, Select, Space, Switch} from "antd";
|
||||
import {EyeInvisibleOutlined, EyeTwoTone, HolderOutlined, UsergroupAddOutlined} from "@ant-design/icons";
|
||||
import * as LddpBackend from "./backend/LdapBackend";
|
||||
import * as OrganizationBackend from "./backend/OrganizationBackend";
|
||||
import * as Setting from "./Setting";
|
||||
import i18next from "i18next";
|
||||
import * as GroupBackend from "./backend/GroupBackend";
|
||||
|
||||
const {Option} = Select;
|
||||
|
||||
@ -30,12 +31,14 @@ class LdapEditPage extends React.Component {
|
||||
organizationName: props.match.params.organizationName,
|
||||
ldap: null,
|
||||
organizations: [],
|
||||
groups: null,
|
||||
};
|
||||
}
|
||||
|
||||
UNSAFE_componentWillMount() {
|
||||
this.getLdap();
|
||||
this.getOrganizations();
|
||||
this.getGroups();
|
||||
}
|
||||
|
||||
getLdap() {
|
||||
@ -60,6 +63,17 @@ class LdapEditPage extends React.Component {
|
||||
});
|
||||
}
|
||||
|
||||
getGroups() {
|
||||
GroupBackend.getGroups(this.state.organizationName)
|
||||
.then((res) => {
|
||||
if (res.status === "ok") {
|
||||
this.setState({
|
||||
groups: res.data,
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
updateLdapField(key, value) {
|
||||
this.setState((prevState) => {
|
||||
prevState.ldap[key] = value;
|
||||
@ -214,6 +228,31 @@ class LdapEditPage extends React.Component {
|
||||
/>
|
||||
</Col>
|
||||
</Row>
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{lineHeight: "32px", textAlign: "right", paddingRight: "25px"}} span={3}>
|
||||
{Setting.getLabel(i18next.t("ldap:Default group"), i18next.t("ldap:Default group - Tooltip"))} :
|
||||
</Col>
|
||||
<Col span={21}>
|
||||
<Select virtual={false} style={{width: "100%"}} value={this.state.ldap.defaultGroup ?? []} onChange={(value => {
|
||||
this.updateLdapField("defaultGroup", value);
|
||||
})}
|
||||
>
|
||||
<Option key={""} value={""}>
|
||||
<Space>
|
||||
{i18next.t("general:Default")}
|
||||
</Space>
|
||||
</Option>
|
||||
{
|
||||
this.state.groups?.map((group) => <Option key={group.name} value={`${group.owner}/${group.name}`}>
|
||||
<Space>
|
||||
{group.type === "Physical" ? <UsergroupAddOutlined /> : <HolderOutlined />}
|
||||
{group.displayName}
|
||||
</Space>
|
||||
</Option>)
|
||||
}
|
||||
</Select>
|
||||
</Col>
|
||||
</Row>
|
||||
<Row style={{marginTop: "20px"}}>
|
||||
<Col style={{lineHeight: "32px", textAlign: "right", paddingRight: "25px"}} span={3}>
|
||||
{Setting.getLabel(i18next.t("ldap:Auto Sync"), i18next.t("ldap:Auto Sync - Tooltip"))} :
|
||||
|
@ -18,11 +18,7 @@ import * as ModelBackend from "./backend/ModelBackend";
|
||||
import * as OrganizationBackend from "./backend/OrganizationBackend";
|
||||
import * as Setting from "./Setting";
|
||||
import i18next from "i18next";
|
||||
|
||||
import {Controlled as CodeMirror} from "react-codemirror2";
|
||||
import "codemirror/lib/codemirror.css";
|
||||
|
||||
require("codemirror/mode/properties/properties");
|
||||
import ModelEditor from "./CasbinEditor";
|
||||
|
||||
const {Option} = Select;
|
||||
|
||||
@ -147,16 +143,10 @@ class ModelEditPage extends React.Component {
|
||||
{Setting.getLabel(i18next.t("model:Model text"), i18next.t("model:Model text - Tooltip"))} :
|
||||
</Col>
|
||||
<Col span={22}>
|
||||
<div style={{width: "100%"}} >
|
||||
<CodeMirror
|
||||
value={this.state.model.modelText}
|
||||
options={{mode: "properties", theme: "default"}}
|
||||
onBeforeChange={(editor, data, value) => {
|
||||
if (Setting.builtInObject(this.state.model)) {
|
||||
return;
|
||||
}
|
||||
this.updateModelField("modelText", value);
|
||||
}}
|
||||
<div style={{position: "relative", height: "500px"}} >
|
||||
<ModelEditor
|
||||
model={this.state.model}
|
||||
onModelTextChange={(value) => this.updateModelField("modelText", value)}
|
||||
/>
|
||||
</div>
|
||||
</Col>
|
||||
|
@ -843,7 +843,7 @@ class ProviderEditPage extends React.Component {
|
||||
)
|
||||
}
|
||||
{
|
||||
this.state.provider.type !== "ADFS" && this.state.provider.type !== "AzureAD" && this.state.provider.type !== "AzureADB2C" && this.state.provider.type !== "Casdoor" && this.state.provider.type !== "Okta" ? null : (
|
||||
this.state.provider.type !== "ADFS" && this.state.provider.type !== "AzureAD" && this.state.provider.type !== "AzureADB2C" && (this.state.provider.type !== "Casdoor" && this.state.category !== "Storage") && this.state.provider.type !== "Okta" ? null : (
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={2}>
|
||||
{Setting.getLabel(i18next.t("provider:Domain"), i18next.t("provider:Domain - Tooltip"))} :
|
||||
@ -870,7 +870,7 @@ class ProviderEditPage extends React.Component {
|
||||
</Col>
|
||||
</Row>
|
||||
)}
|
||||
{["Custom HTTP SMS", "Local File System", "MinIO", "Tencent Cloud COS", "Google Cloud Storage", "Qiniu Cloud Kodo", "Synology"].includes(this.state.provider.type) ? null : (
|
||||
{["Custom HTTP SMS", "Local File System", "MinIO", "Tencent Cloud COS", "Google Cloud Storage", "Qiniu Cloud Kodo", "Synology", "Casdoor"].includes(this.state.provider.type) ? null : (
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={2}>
|
||||
{Setting.getLabel(i18next.t("provider:Endpoint (Intranet)"), i18next.t("provider:Region endpoint for Intranet"))} :
|
||||
@ -885,7 +885,9 @@ class ProviderEditPage extends React.Component {
|
||||
{["Custom HTTP SMS", "Local File System"].includes(this.state.provider.type) ? null : (
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={2}>
|
||||
{Setting.getLabel(i18next.t("provider:Bucket"), i18next.t("provider:Bucket - Tooltip"))} :
|
||||
{["Casdoor"].includes(this.state.provider.type) ?
|
||||
Setting.getLabel(i18next.t("general:Provider"), i18next.t("provider:Provider - Tooltip"))
|
||||
: Setting.getLabel(i18next.t("provider:Bucket"), i18next.t("provider:Bucket - Tooltip"))} :
|
||||
</Col>
|
||||
<Col span={22} >
|
||||
<Input value={this.state.provider.bucket} onChange={e => {
|
||||
@ -906,7 +908,7 @@ class ProviderEditPage extends React.Component {
|
||||
</Col>
|
||||
</Row>
|
||||
)}
|
||||
{["Custom HTTP SMS", "Qiniu Cloud Kodo", "Synology"].includes(this.state.provider.type) ? null : (
|
||||
{["Custom HTTP SMS", "Qiniu Cloud Kodo", "Synology", "Casdoor"].includes(this.state.provider.type) ? null : (
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={2}>
|
||||
{Setting.getLabel(i18next.t("provider:Domain"), i18next.t("provider:Domain - Tooltip"))} :
|
||||
@ -918,10 +920,24 @@ class ProviderEditPage extends React.Component {
|
||||
</Col>
|
||||
</Row>
|
||||
)}
|
||||
{["AWS S3", "Tencent Cloud COS", "Qiniu Cloud Kodo"].includes(this.state.provider.type) ? (
|
||||
{["Casdoor"].includes(this.state.provider.type) ? (
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={2}>
|
||||
{Setting.getLabel(i18next.t("provider:Region ID"), i18next.t("provider:Region ID - Tooltip"))} :
|
||||
{Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} :
|
||||
</Col>
|
||||
<Col span={22} >
|
||||
<Input value={this.state.provider.content} onChange={e => {
|
||||
this.updateProviderField("content", e.target.value);
|
||||
}} />
|
||||
</Col>
|
||||
</Row>
|
||||
) : null}
|
||||
{["AWS S3", "Tencent Cloud COS", "Qiniu Cloud Kodo", "Casdoor"].includes(this.state.provider.type) ? (
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={2}>
|
||||
{["Casdoor"].includes(this.state.provider.type) ?
|
||||
Setting.getLabel(i18next.t("general:Application"), i18next.t("general:Application - Tooltip")) :
|
||||
Setting.getLabel(i18next.t("provider:Region ID"), i18next.t("provider:Region ID - Tooltip"))} :
|
||||
</Col>
|
||||
<Col span={22} >
|
||||
<Input value={this.state.provider.regionId} onChange={e => {
|
||||
@ -1298,7 +1314,7 @@ class ProviderEditPage extends React.Component {
|
||||
) : null
|
||||
}
|
||||
{
|
||||
(this.state.provider.type === "Alipay" || this.state.provider.type === "WeChat Pay") ? (
|
||||
(this.state.provider.type === "Alipay" || this.state.provider.type === "WeChat Pay" || this.state.provider.type === "Casdoor") ? (
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||
{Setting.getLabel(i18next.t("general:Cert"), i18next.t("general:Cert - Tooltip"))} :
|
||||
|
@ -229,6 +229,10 @@ export const OtherProviderInfo = {
|
||||
logo: `${StaticBaseUrl}/img/social_synology.png`,
|
||||
url: "https://www.synology.com/en-global/dsm/feature/file_sharing",
|
||||
},
|
||||
"Casdoor": {
|
||||
logo: `${StaticBaseUrl}/img/casdoor.png`,
|
||||
url: "https://casdoor.org/docs/provider/storage/overview",
|
||||
},
|
||||
},
|
||||
SAML: {
|
||||
"Aliyun IDaaS": {
|
||||
@ -283,6 +287,14 @@ export const OtherProviderInfo = {
|
||||
logo: `${StaticBaseUrl}/img/social_recaptcha.png`,
|
||||
url: "https://www.google.com/recaptcha",
|
||||
},
|
||||
"reCAPTCHA v2": {
|
||||
logo: `${StaticBaseUrl}/img/social_recaptcha.png`,
|
||||
url: "https://www.google.com/recaptcha",
|
||||
},
|
||||
"reCAPTCHA v3": {
|
||||
logo: `${StaticBaseUrl}/img/social_recaptcha.png`,
|
||||
url: "https://www.google.com/recaptcha",
|
||||
},
|
||||
"hCaptcha": {
|
||||
logo: `${StaticBaseUrl}/img/social_hcaptcha.png`,
|
||||
url: "https://www.hcaptcha.com",
|
||||
@ -1062,6 +1074,7 @@ export function getProviderTypeOptions(category) {
|
||||
{id: "Qiniu Cloud Kodo", name: "Qiniu Cloud Kodo"},
|
||||
{id: "Google Cloud Storage", name: "Google Cloud Storage"},
|
||||
{id: "Synology", name: "Synology"},
|
||||
{id: "Casdoor", name: "Casdoor"},
|
||||
]
|
||||
);
|
||||
} else if (category === "SAML") {
|
||||
@ -1083,7 +1096,8 @@ export function getProviderTypeOptions(category) {
|
||||
} else if (category === "Captcha") {
|
||||
return ([
|
||||
{id: "Default", name: "Default"},
|
||||
{id: "reCAPTCHA", name: "reCAPTCHA"},
|
||||
{id: "reCAPTCHA v2", name: "reCAPTCHA v2"},
|
||||
{id: "reCAPTCHA v3", name: "reCAPTCHA v3"},
|
||||
{id: "hCaptcha", name: "hCaptcha"},
|
||||
{id: "Aliyun Captcha", name: "Aliyun Captcha"},
|
||||
{id: "GEETEST", name: "GEETEST"},
|
||||
@ -1154,7 +1168,7 @@ export function renderLogo(application) {
|
||||
|
||||
function isSigninMethodEnabled(application, signinMethod) {
|
||||
if (application && application.signinMethods) {
|
||||
return application.signinMethods.filter(item => item.name === signinMethod).length > 0;
|
||||
return application.signinMethods.filter(item => item.name === signinMethod && item.rule !== "Hide-Password").length > 0;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
@ -434,10 +434,9 @@ class SyncerEditPage extends React.Component {
|
||||
{Setting.getLabel(i18next.t("syncer:Table"), i18next.t("syncer:Table - Tooltip"))} :
|
||||
</Col>
|
||||
<Col span={22} >
|
||||
<Input value={this.state.syncer.table}
|
||||
disabled={this.state.syncer.type === "Keycloak"} onChange={e => {
|
||||
this.updateSyncerField("table", e.target.value);
|
||||
}} />
|
||||
<Input value={this.state.syncer.table} onChange={e => {
|
||||
this.updateSyncerField("table", e.target.value);
|
||||
}} />
|
||||
</Col>
|
||||
</Row>
|
||||
<Row style={{marginTop: "20px"}} >
|
||||
|
@ -1050,6 +1050,8 @@ class UserEditPage extends React.Component {
|
||||
<MfaAccountTable
|
||||
title={i18next.t("user:MFA accounts")}
|
||||
table={this.state.user.mfaAccounts}
|
||||
accessToken={this.props.account?.accessToken}
|
||||
icon={this.state.user.avatar}
|
||||
onUpdateTable={(table) => {this.updateUserField("mfaAccounts", table);}}
|
||||
/>
|
||||
</Col>
|
||||
|
@ -34,25 +34,42 @@ class CasLogout extends React.Component {
|
||||
|
||||
UNSAFE_componentWillMount() {
|
||||
const params = new URLSearchParams(this.props.location.search);
|
||||
const logoutInterval = 100;
|
||||
|
||||
const logoutTimeOut = (redirectUri) => {
|
||||
setTimeout(() => {
|
||||
AuthBackend.getAccount().then((accountRes) => {
|
||||
if (accountRes.status === "ok") {
|
||||
AuthBackend.logout().then((logoutRes) => {
|
||||
if (logoutRes.status === "ok") {
|
||||
logoutTimeOut(logoutRes.data2);
|
||||
} else {
|
||||
Setting.showMessage("error", `${i18next.t("login:Failed to log out")}: ${logoutRes.msg}`);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
Setting.showMessage("success", i18next.t("application:Logged out successfully"));
|
||||
this.props.onUpdateAccount(null);
|
||||
if (redirectUri !== null && redirectUri !== undefined && redirectUri !== "") {
|
||||
Setting.goToLink(redirectUri);
|
||||
} else if (params.has("service")) {
|
||||
Setting.goToLink(params.get("service"));
|
||||
} else {
|
||||
Setting.goToLinkSoft(this, `/cas/${this.state.owner}/${this.state.applicationName}/login`);
|
||||
}
|
||||
}
|
||||
});
|
||||
}, logoutInterval);
|
||||
};
|
||||
|
||||
AuthBackend.logout()
|
||||
.then((res) => {
|
||||
if (res.status === "ok") {
|
||||
Setting.showMessage("success", "Logged out successfully");
|
||||
this.props.onUpdateAccount(null);
|
||||
const redirectUri = res.data2;
|
||||
if (redirectUri !== null && redirectUri !== undefined && redirectUri !== "") {
|
||||
Setting.goToLink(redirectUri);
|
||||
} else if (params.has("service")) {
|
||||
Setting.goToLink(params.get("service"));
|
||||
} else {
|
||||
Setting.goToLinkSoft(this, `/cas/${this.state.owner}/${this.state.applicationName}/login`);
|
||||
}
|
||||
logoutTimeOut(res.data2);
|
||||
} else {
|
||||
Setting.showMessage("error", `Failed to log out: ${res.msg}`);
|
||||
Setting.showMessage("error", `${i18next.t("login:Failed to log out")}: ${res.msg}`);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
render() {
|
||||
|
@ -938,7 +938,7 @@ class LoginPage extends React.Component {
|
||||
signinItem.label ? Setting.renderSignupLink(application, signinItem.label) :
|
||||
(
|
||||
<React.Fragment>
|
||||
{i18next.t("login:No account?")}
|
||||
{i18next.t("login:No account?")}
|
||||
{
|
||||
Setting.renderSignupLink(application, i18next.t("login:sign up now"))
|
||||
}
|
||||
@ -1125,6 +1125,9 @@ class LoginPage extends React.Component {
|
||||
]);
|
||||
|
||||
application?.signinMethods?.forEach((signinMethod) => {
|
||||
if (signinMethod.rule === "Hide-Password") {
|
||||
return;
|
||||
}
|
||||
const item = itemsMap.get(generateItemKey(signinMethod.name, signinMethod.rule));
|
||||
if (item) {
|
||||
let label = signinMethod.name === signinMethod.displayName ? item.label : signinMethod.displayName;
|
||||
|
@ -13,7 +13,7 @@
|
||||
// limitations under the License.
|
||||
|
||||
import React from "react";
|
||||
import {Button, Form, Input, Radio, Result, Row, message} from "antd";
|
||||
import {Button, Form, Input, Radio, Result, Row, Select, message} from "antd";
|
||||
import * as Setting from "../Setting";
|
||||
import * as AuthBackend from "./AuthBackend";
|
||||
import * as ProviderButton from "./ProviderButton";
|
||||
@ -50,6 +50,38 @@ const formItemLayout = {
|
||||
},
|
||||
};
|
||||
|
||||
const renderFormItem = (signupItem) => {
|
||||
const commonProps = {
|
||||
name: signupItem.name.toLowerCase(),
|
||||
label: signupItem.label || signupItem.name,
|
||||
rules: [
|
||||
{
|
||||
required: signupItem.required,
|
||||
message: i18next.t(`signup:Please input your ${signupItem.label || signupItem.name}!`),
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
if (!signupItem.type || signupItem.type === "Input") {
|
||||
return (
|
||||
<Form.Item {...commonProps}>
|
||||
<Input placeholder={signupItem.placeholder} />
|
||||
</Form.Item>
|
||||
);
|
||||
} else if (signupItem.type === "Single Choice" || signupItem.type === "Multiple Choices") {
|
||||
return (
|
||||
<Form.Item {...commonProps}>
|
||||
<Select
|
||||
mode={signupItem.type === "Multiple Choices" ? "multiple" : "single"}
|
||||
placeholder={signupItem.placeholder}
|
||||
showSearch={false}
|
||||
options={signupItem.options.map(option => ({label: option, value: option}))}
|
||||
/>
|
||||
</Form.Item>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export const tailFormItemLayout = {
|
||||
wrapperCol: {
|
||||
xs: {
|
||||
@ -198,6 +230,22 @@ class SignupPage extends React.Component {
|
||||
onFinish(values) {
|
||||
const application = this.getApplicationObj();
|
||||
|
||||
if (Array.isArray(values.gender)) {
|
||||
values.gender = values.gender.join(", ");
|
||||
}
|
||||
|
||||
if (Array.isArray(values.bio)) {
|
||||
values.bio = values.bio.join(", ");
|
||||
}
|
||||
|
||||
if (Array.isArray(values.tag)) {
|
||||
values.tag = values.tag.join(", ");
|
||||
}
|
||||
|
||||
if (Array.isArray(values.education)) {
|
||||
values.education = values.education.join(", ");
|
||||
}
|
||||
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
values.plan = params.get("plan");
|
||||
values.pricing = params.get("pricing");
|
||||
@ -238,6 +286,7 @@ class SignupPage extends React.Component {
|
||||
}
|
||||
|
||||
renderFormItem(application, signupItem) {
|
||||
const validItems = ["Gender", "Bio", "Tag", "Education"];
|
||||
if (!signupItem.visible) {
|
||||
return null;
|
||||
}
|
||||
@ -366,7 +415,9 @@ class SignupPage extends React.Component {
|
||||
},
|
||||
]}
|
||||
>
|
||||
<RegionSelect className="signup-region-select" onChange={(value) => {this.setState({region: value});}} />
|
||||
<RegionSelect className="signup-region-select" onChange={(value) => {
|
||||
this.setState({region: value});
|
||||
}} />
|
||||
</Form.Item>
|
||||
);
|
||||
} else if (signupItem.name === "Email" || signupItem.name === "Phone" || signupItem.name === "Email or Phone" || signupItem.name === "Phone or Email") {
|
||||
@ -669,8 +720,9 @@ class SignupPage extends React.Component {
|
||||
</span>
|
||||
);
|
||||
})
|
||||
|
||||
);
|
||||
} else if (validItems.includes(signupItem.name)) {
|
||||
return renderFormItem(signupItem);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,8 @@ export const CaptchaWidget = (props) => {
|
||||
|
||||
useEffect(() => {
|
||||
switch (captchaType) {
|
||||
case "reCAPTCHA": {
|
||||
case "reCAPTCHA" :
|
||||
case "reCAPTCHA v2": {
|
||||
const reTimer = setInterval(() => {
|
||||
if (!window.grecaptcha) {
|
||||
loadScript("https://recaptcha.net/recaptcha/api.js");
|
||||
@ -42,6 +43,32 @@ export const CaptchaWidget = (props) => {
|
||||
}, 300);
|
||||
break;
|
||||
}
|
||||
case "reCAPTCHA v3": {
|
||||
const reTimer = setInterval(() => {
|
||||
if (!window.grecaptcha) {
|
||||
loadScript(`https://recaptcha.net/recaptcha/api.js?render=${siteKey}`);
|
||||
}
|
||||
if (window.grecaptcha && window.grecaptcha.render) {
|
||||
const clientId = window.grecaptcha.render("captcha", {
|
||||
"sitekey": siteKey,
|
||||
"badge": "inline",
|
||||
"size": "invisible",
|
||||
"callback": onChange,
|
||||
"error-callback": function() {
|
||||
const logoWidth = `${document.getElementById("captcha").offsetWidth + 40}px`;
|
||||
document.getElementsByClassName("grecaptcha-logo")[0].firstChild.style.width = logoWidth;
|
||||
document.getElementsByClassName("grecaptcha-badge")[0].style.width = logoWidth;
|
||||
},
|
||||
});
|
||||
|
||||
window.grecaptcha.ready(function() {
|
||||
window.grecaptcha.execute(clientId, {action: "submit"});
|
||||
});
|
||||
clearInterval(reTimer);
|
||||
}
|
||||
}, 300);
|
||||
break;
|
||||
}
|
||||
case "hCaptcha": {
|
||||
const hTimer = setInterval(() => {
|
||||
if (!window.hcaptcha) {
|
||||
|
@ -115,7 +115,7 @@ export const CaptchaModal = (props) => {
|
||||
} else {
|
||||
return (
|
||||
<Col>
|
||||
<Row>
|
||||
<Row justify={"center"}>
|
||||
<CaptchaWidget
|
||||
captchaType={captchaType}
|
||||
subType={subType}
|
||||
|
@ -51,3 +51,19 @@ code {
|
||||
.custom-link:hover {
|
||||
color: rgb(64 64 64) !important;
|
||||
}
|
||||
|
||||
.full-height-editor {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.full-height-editor [class*="CodeMirror"] {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.no-horizontal-scroll-editor [class*="CodeMirror-hscrollbar"] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.no-horizontal-scroll-editor [class*="CodeMirror-scroll"] {
|
||||
overflow-x: hidden !important;
|
||||
}
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Vlevo",
|
||||
"Logged in successfully": "Úspěšně přihlášen",
|
||||
"Logged out successfully": "Úspěšně odhlášen",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "Nová aplikace",
|
||||
"No verification": "Bez ověření",
|
||||
"Normal": "Normální",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Přihlašovací relace",
|
||||
"Signup items": "Položky registrace",
|
||||
"Signup items - Tooltip": "Položky, které uživatelé vyplňují při registraci nových účtů",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Malá ikona",
|
||||
"Tags - Tooltip": "Pouze uživatelé s tagem uvedeným v tazích aplikace se mohou přihlásit",
|
||||
"The application does not allow to sign up new account": "Aplikace neumožňuje registraci nového účtu",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Uživatelská pole zahrnutá v tokenu",
|
||||
"Token format": "Formát tokenu",
|
||||
"Token format - Tooltip": "Formát přístupového tokenu",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "Nečekali jste, že uvidíte tuto výzvu"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Přístupový klíč - Tooltip",
|
||||
"Access secret": "Přístupové tajemství",
|
||||
"Access secret - Tooltip": "Přístupové tajemství - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Akce",
|
||||
"Adapter": "Adaptér",
|
||||
"Adapter - Tooltip": "Název tabulky úložiště politiky",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Povolit",
|
||||
"Enable dark logo": "Povolit tmavé logo",
|
||||
"Enable dark logo - Tooltip": "Povolit tmavé logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Povoleno",
|
||||
"Enabled successfully": "Úspěšně povoleno",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Pozvánky",
|
||||
"Is enabled": "Je povoleno",
|
||||
"Is enabled - Tooltip": "Nastavit, zda může být použito",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPy",
|
||||
"LDAPs - Tooltip": "LDAP servery",
|
||||
"Languages": "Jazyky",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Poskytovatelé plateb, které mají být nakonfigurovány, včetně PayPal, Alipay, WeChat Pay, atd.",
|
||||
"Providers": "Poskytovatelé",
|
||||
"Providers - Tooltip": "Poskytovatelé, kteří mají být nakonfigurováni, včetně přihlášení třetích stran, objektového úložiště, ověřovacího kódu, atd.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Skutečné jméno",
|
||||
"Records": "Záznamy",
|
||||
"Request URI": "Požadavek URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Základní DN",
|
||||
"Base DN - Tooltip": "Základní DN při vyhledávání v LDAP",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Upravit LDAP",
|
||||
"Enable SSL": "Povolit SSL",
|
||||
"Enable SSL - Tooltip": "Zda povolit SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Rozpoznávání obličeje",
|
||||
"Face recognition failed": "Rozpoznávání obličeje selhalo",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Nepodařilo se získat autorizaci MetaMask",
|
||||
"Failed to obtain Web3-Onboard authorization": "Nepodařilo se získat autorizaci Web3-Onboard",
|
||||
"Forgot password?": "Zapomněli jste heslo?",
|
||||
@ -521,7 +537,7 @@
|
||||
"Failed to initiate MFA": "Nepodařilo se zahájit MFA",
|
||||
"Have problems?": "Máte problémy?",
|
||||
"Multi-factor authentication": "Vícefaktorové ověřování",
|
||||
"Multi-factor authentication - Tooltip": "Dvoufaktorové ověřování - Tooltip",
|
||||
"Multi-factor authentication - Tooltip ": "Dvoufaktorové ověřování - Tooltip",
|
||||
"Multi-factor authentication description": "Popis dvoufaktorového ověřování",
|
||||
"Multi-factor methods": "Metody dvoufaktorového ověřování",
|
||||
"Multi-factor recover": "Obnovení dvoufaktorového ověřování",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Váš telefon je",
|
||||
"preferred": "preferované"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Upravit model",
|
||||
"Model text": "Text modelu",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "ID projektu",
|
||||
"Project Id - Tooltip": "Nápověda k ID projektu",
|
||||
"Prompted": "Vyzván",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "URL poskytovatele",
|
||||
"Provider URL - Tooltip": "URL pro konfiguraci poskytovatele služby, toto pole je pouze pro referenci a není použito v Casdoor",
|
||||
"Public key": "Veřejný klíč",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Máte účet?",
|
||||
"Label": "Štítek",
|
||||
"Label HTML": "HTML štítek",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Zástupný text",
|
||||
"Please accept the agreement!": "Prosím přijměte smlouvu!",
|
||||
"Please click the below button to sign in": "Prosím klikněte na tlačítko níže pro přihlášení",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Odkaz",
|
||||
"Location": "Místo",
|
||||
"Location - Tooltip": "Město bydliště",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Spravované účty",
|
||||
"Modify password...": "Změnit heslo...",
|
||||
"Multi-factor authentication": "Vícefaktorové ověřování",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Links",
|
||||
"Logged in successfully": "Erfolgreich eingeloggt",
|
||||
"Logged out successfully": "Erfolgreich ausgeloggt",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "Neue Anwendung",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Anmeldesession",
|
||||
"Signup items": "Registrierungs Items",
|
||||
"Signup items - Tooltip": "Items, die Benutzer ausfüllen müssen, wenn sie neue Konten registrieren",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "Die Anwendung erlaubt es nicht, ein neues Konto zu registrieren",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token-Format",
|
||||
"Token format - Tooltip": "Das Format des Access-Tokens",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "Sie sind unerwartet auf diese Aufforderungsseite gelangt"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Aktion",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Tabellenname des Policy Stores",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Ist aktiviert",
|
||||
"Is enabled - Tooltip": "Festlegen, ob es verwendet werden kann",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP-Server",
|
||||
"Languages": "Sprachen",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Zahlungsprovider, die konfiguriert werden müssen, inkl. PayPal, Alipay, WeChat Pay usw.",
|
||||
"Providers": "Provider",
|
||||
"Providers - Tooltip": "Provider, die konfiguriert werden müssen, einschließlich Drittanbieter-Logins, Objektspeicherung, Verifizierungscode usw.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Echter Name",
|
||||
"Records": "Datensätze",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Basis-DN",
|
||||
"Base DN - Tooltip": "Basis-DN während der LDAP-Suche",
|
||||
"CN": "KN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "LDAP bearbeiten",
|
||||
"Enable SSL": "Aktivieren Sie SSL",
|
||||
"Enable SSL - Tooltip": "Ob SSL aktiviert werden soll",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Passwort vergessen?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Modell bearbeiten",
|
||||
"Model text": "Modelltext",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "ausgelöst",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Anbieter-URL",
|
||||
"Provider URL - Tooltip": "URL zur Konfiguration des Dienstanbieters, dieses Feld dient nur als Referenz und wird in Casdoor nicht verwendet",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Haben Sie ein Konto?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Bitte akzeptieren Sie die Vereinbarung!",
|
||||
"Please click the below button to sign in": "Bitte klicken Sie auf den untenstehenden Button, um sich anzumelden",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Ort",
|
||||
"Location - Tooltip": "Stadt des Wohnsitzes",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Verwaltete Konten",
|
||||
"Modify password...": "Passwort ändern...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "The user fields included in the token",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Izquierda",
|
||||
"Logged in successfully": "Acceso satisfactorio",
|
||||
"Logged out successfully": "Cerró sesión exitosamente",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "Nueva aplicación",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Sesión de inicio de sesión",
|
||||
"Signup items": "Artículos de registro",
|
||||
"Signup items - Tooltip": "Elementos para que los usuarios los completen al registrar nuevas cuentas",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "La aplicación no permite registrarse una cuenta nueva",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Formato del token",
|
||||
"Token format - Tooltip": "El formato del token de acceso",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "Es inesperado ver esta página de inicio"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Acción",
|
||||
"Adapter": "Adaptador",
|
||||
"Adapter - Tooltip": "Nombre de la tabla de la tienda de políticas",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Está habilitado",
|
||||
"Is enabled - Tooltip": "Establecer si se puede usar",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs (Secure LDAP)",
|
||||
"LDAPs - Tooltip": "Servidores LDAP",
|
||||
"Languages": "Idiomas",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Proveedores de pago a configurar, incluyendo PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Proveedores",
|
||||
"Providers - Tooltip": "Proveedores a configurar, incluyendo inicio de sesión de terceros, almacenamiento de objetos, código de verificación, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Nombre real",
|
||||
"Records": "Registros",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "DN base",
|
||||
"Base DN - Tooltip": "Base DN durante la búsqueda LDAP",
|
||||
"CN": "CN (siglas en inglés) podría traducirse como \"Red de Comunicaciones\". Sin embargo, sin más contexto, no es posible saber cuál es el significado exacto de estas siglas",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Editar LDAP",
|
||||
"Enable SSL": "Habilitar SSL",
|
||||
"Enable SSL - Tooltip": "Si se habilita SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "¿Olvidaste tu contraseña?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Editar modelo",
|
||||
"Model text": "Texto modelo",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Estimulado",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "URL del proveedor",
|
||||
"Provider URL - Tooltip": "Dirección URL para configurar el proveedor de servicios, este campo sólo se utiliza como referencia y no se utiliza en Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "¿Tiene una cuenta?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "¡Por favor, acepta el acuerdo!",
|
||||
"Please click the below button to sign in": "Por favor, haga clic en el botón de abajo para iniciar sesión",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Enlace",
|
||||
"Location": "Ubicación",
|
||||
"Location - Tooltip": "Ciudad de residencia",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Cuentas gestionadas",
|
||||
"Modify password...": "Modificar contraseña...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Gauche",
|
||||
"Logged in successfully": "Connexion réussie",
|
||||
"Logged out successfully": "Déconnexion réussie",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "Nouvelle application",
|
||||
"No verification": "Aucune vérification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Session de connexion",
|
||||
"Signup items": "Champs d'inscription",
|
||||
"Signup items - Tooltip": "Champs à remplir lors de l'enregistrement de nouveaux comptes",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Seuls les comptes ayant leur étiquette listée dans les étiquettes de l'application peuvent se connecter",
|
||||
"The application does not allow to sign up new account": "L'application ne permet pas de créer un nouveau compte",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Format de jeton",
|
||||
"Token format - Tooltip": "Le format du jeton d'accès",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "Il n'était pas prévu que vous voyez cette page de saisie"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Clé d'accès - Infobulle",
|
||||
"Access secret": "Clé secrète",
|
||||
"Access secret - Tooltip": "Clé secrète - Info-bulle",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adaptateur",
|
||||
"Adapter - Tooltip": "Nom de la table du magasin de règle",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Activer",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Activé",
|
||||
"Enabled successfully": "Activé avec succès",
|
||||
"Enforcers": "Exécuteurs",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Est activé",
|
||||
"Is enabled - Tooltip": "Définir s'il peut être utilisé",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "Serveurs LDAP",
|
||||
"Languages": "Langues",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Les fournisseurs de paiement à configurer, tels que PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Fournisseurs",
|
||||
"Providers - Tooltip": "Les fournisseurs à configurer, tels que la connexion via un service tiers, le stockage d'objets, le code de vérification, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Nom complet",
|
||||
"Records": "Enregistrements",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "DN racine",
|
||||
"Base DN - Tooltip": "Le DN racine (base DN) lors de la recherche LDAP",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Modifier le LDAP",
|
||||
"Enable SSL": "Activer SSL",
|
||||
"Enable SSL - Tooltip": "Activer SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Échec de l'obtention de l'autorisation MetaMask",
|
||||
"Failed to obtain Web3-Onboard authorization": "Échec de l'obtention de l'autorisation MetaMask",
|
||||
"Forgot password?": "Mot de passe oublié ?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Votre téléphone est",
|
||||
"preferred": "préféré"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Modifier le modèle",
|
||||
"Model text": "Définition du modèle",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "ID du projet",
|
||||
"Project Id - Tooltip": "ID du projet - Infobulle",
|
||||
"Prompted": "Incité",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "URL du fournisseur",
|
||||
"Provider URL - Tooltip": "URL pour configurer le fournisseur de services, ce champ est uniquement utilisé à titre de référence et n'est pas utilisé dans Casdoor",
|
||||
"Public key": "Clé publique",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Avez-vous un compte ?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Veuillez accepter l'accord !",
|
||||
"Please click the below button to sign in": "Veuillez cliquer sur le bouton ci-dessous pour vous connecter",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Lier",
|
||||
"Location": "Localisation",
|
||||
"Location - Tooltip": "Ville de résidence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Comptes gérés",
|
||||
"Modify password...": "Modifier le mot de passe...",
|
||||
"Multi-factor authentication": "Authentification multifacteur",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Kiri",
|
||||
"Logged in successfully": "Berhasil masuk",
|
||||
"Logged out successfully": "Berhasil keluar dari sistem",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "Aplikasi Baru",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Sesi masuk",
|
||||
"Signup items": "Item pendaftaran",
|
||||
"Signup items - Tooltip": "Item-item yang harus diisi pengguna saat mendaftar untuk akun baru",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "Aplikasi tidak memperbolehkan untuk mendaftar akun baru",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Format token",
|
||||
"Token format - Tooltip": "Format dari token akses",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "Anda tidak mengharapkan untuk melihat halaman prompt ini"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Aksi",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Nama tabel dari penyimpanan kebijakan",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Diaktifkan",
|
||||
"Is enabled - Tooltip": "Atur apakah itu dapat digunakan",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "Server LDAP",
|
||||
"Languages": "Bahasa-bahasa",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Penyedia pembayaran harus dikonfigurasi, termasuk PayPal, Alipay, WeChat Pay, dan sebagainya.",
|
||||
"Providers": "Penyedia-penyedia",
|
||||
"Providers - Tooltip": "Penyedia harus dikonfigurasi, termasuk login pihak ketiga, penyimpanan objek, kode verifikasi, dan lain-lain.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Nama asli",
|
||||
"Records": "Catatan",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "DN dasar",
|
||||
"Base DN - Tooltip": "Base DN selama pencarian LDAP",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Mengedit LDAP",
|
||||
"Enable SSL": "Aktifkan SSL",
|
||||
"Enable SSL - Tooltip": "Apakah untuk mengaktifkan SSL?",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Lupa kata sandi?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Mengedit Model",
|
||||
"Model text": "Teks Model",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Mendorong",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "URL penyedia",
|
||||
"Provider URL - Tooltip": "URL untuk melakukan konfigurasi service provider, kolom ini hanya digunakan sebagai referensi dan tidak digunakan dalam Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Punya akun?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Tolong terima perjanjian ini!",
|
||||
"Please click the below button to sign in": "Silakan klik tombol di bawah ini untuk masuk",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Tautan",
|
||||
"Location": "Lokasi",
|
||||
"Location - Tooltip": "Kota tempat tinggal",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Akun yang dikelola",
|
||||
"Modify password...": "Mengubah kata sandi...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "左",
|
||||
"Logged in successfully": "正常にログインしました",
|
||||
"Logged out successfully": "正常にログアウトしました",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "新しいアプリケーション",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "サインインセッション",
|
||||
"Signup items": "サインアップアイテム",
|
||||
"Signup items - Tooltip": "新しいアカウントを登録する際にユーザーが入力するアイテム",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "アプリケーションでは新しいアカウントの登録ができません",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "トークン形式",
|
||||
"Token format - Tooltip": "アクセストークンのフォーマット",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "このプロンプトページを見ることは予期せぬことである"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "アクション",
|
||||
"Adapter": "アダプター",
|
||||
"Adapter - Tooltip": "ポリシー・ストアのテーブル名",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "可能になっています",
|
||||
"Is enabled - Tooltip": "使用可能かどうかを設定してください",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAP",
|
||||
"LDAPs - Tooltip": "LDAPサーバー",
|
||||
"Languages": "言語",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "支払いプロバイダーを設定する必要があります。これには、PayPal、Alipay、WeChat Payなどが含まれます。",
|
||||
"Providers": "プロバイダー",
|
||||
"Providers - Tooltip": "設定するプロバイダーには、サードパーティのログイン、オブジェクトストレージ、検証コードなどが含まれます。",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "本名",
|
||||
"Records": "記録",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "ベース DN",
|
||||
"Base DN - Tooltip": "LDAP検索中のBase DN",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "LDAPを編集",
|
||||
"Enable SSL": "SSL を有効にする",
|
||||
"Enable SSL - Tooltip": "SSLを有効にするかどうか",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "パスワードを忘れましたか?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "編集モデル",
|
||||
"Model text": "モデルテキスト",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "促された",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "プロバイダーURL",
|
||||
"Provider URL - Tooltip": "サービスプロバイダーの設定用URL。このフィールドは参照用にのみ使用され、Casdoorでは使用されません",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "アカウントはありますか?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "合意に同意してください!",
|
||||
"Please click the below button to sign in": "以下のボタンをクリックしてログインしてください",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "リンク",
|
||||
"Location": "場所",
|
||||
"Location - Tooltip": "居住都市",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "管理アカウント",
|
||||
"Modify password...": "パスワードを変更する...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "왼쪽",
|
||||
"Logged in successfully": "성공적으로 로그인했습니다",
|
||||
"Logged out successfully": "로그아웃이 성공적으로 되었습니다",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "새로운 응용 프로그램",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "로그인 세션",
|
||||
"Signup items": "가입 항목",
|
||||
"Signup items - Tooltip": "새로운 계정 등록시 사용자가 작성해야하는 항목들",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "이 어플리케이션은 새 계정 등록을 허용하지 않습니다",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "토큰 형식",
|
||||
"Token format - Tooltip": "접근 토큰의 형식",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "당신은 이 프롬프트 페이지를 볼 것을 예상하지 못했습니다"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "동작",
|
||||
"Adapter": "어댑터",
|
||||
"Adapter - Tooltip": "정책 저장소의 테이블 이름",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "활성화됩니다",
|
||||
"Is enabled - Tooltip": "사용 가능한 지 여부를 설정하세요",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP 서버",
|
||||
"Languages": "언어",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "지불 공급자를 구성해야합니다. PayPal, Alipay, WeChat Pay 등이 포함됩니다.",
|
||||
"Providers": "제공자들",
|
||||
"Providers - Tooltip": "공급 업체는 구성되어야합니다. 3rd-party 로그인, 객체 저장소, 검증 코드 등을 포함합니다.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "실명",
|
||||
"Records": "기록",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "기본 DN",
|
||||
"Base DN - Tooltip": "LDAP 검색 중 기본 DN",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "LDAP 수정",
|
||||
"Enable SSL": "SSL 활성화",
|
||||
"Enable SSL - Tooltip": "SSL을 활성화할지 여부를 결정하십시오",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "비밀번호를 잊으셨나요?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "편집 형태 모델",
|
||||
"Model text": "모델 텍스트",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "자극 받은",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "제공자 URL",
|
||||
"Provider URL - Tooltip": "서비스 제공 업체 구성을 위한 URL이며, 이 필드는 참조 용도로만 사용되며 Casdoor에서 사용되지 않습니다",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "계정이 있나요?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "계약서를 승인해주세요!",
|
||||
"Please click the below button to sign in": "아래 버튼을 클릭하여 로그인하세요",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "링크",
|
||||
"Location": "장소",
|
||||
"Location - Tooltip": "거주 도시",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "관리 계정",
|
||||
"Modify password...": "비밀번호 수정하기...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Esquerda",
|
||||
"Logged in successfully": "Login realizado com sucesso",
|
||||
"Logged out successfully": "Logout realizado com sucesso",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "Nova Aplicação",
|
||||
"No verification": "Sem verificação",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Sessão de login",
|
||||
"Signup items": "Itens de registro",
|
||||
"Signup items - Tooltip": "Itens para os usuários preencherem ao registrar novas contas",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Apenas usuários com a tag listada nas tags do aplicativo podem acessar",
|
||||
"The application does not allow to sign up new account": "A aplicação não permite o registro de novas contas",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Formato do token",
|
||||
"Token format - Tooltip": "O formato do token de acesso",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "Você não deveria ver esta página de prompt"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Ação",
|
||||
"Adapter": "Adaptador",
|
||||
"Adapter - Tooltip": "Nome da tabela do armazenamento de políticas",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Habilitar",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Habilitado",
|
||||
"Enabled successfully": "Habilitado com sucesso",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Está habilitado",
|
||||
"Is enabled - Tooltip": "Define se está habilitado",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "Servidores LDAP",
|
||||
"Languages": "Idiomas",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Provedores de pagamento a serem configurados, incluindo PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Provedores",
|
||||
"Providers - Tooltip": "Provedores a serem configurados, incluindo login de terceiros, armazenamento de objetos, código de verificação, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Nome real",
|
||||
"Records": "Registros",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN durante a busca LDAP",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Editar LDAP",
|
||||
"Enable SSL": "Habilitar SSL",
|
||||
"Enable SSL - Tooltip": "Se habilitar o SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Esqueceu a senha?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Editar Modelo",
|
||||
"Model text": "Texto do Modelo",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Solicitado",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "URL do Provedor",
|
||||
"Provider URL - Tooltip": "URL para configurar o provedor de serviço, este campo é apenas usado para referência e não é usado no Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Já possui uma conta?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Por favor, aceite o acordo!",
|
||||
"Please click the below button to sign in": "Por favor, clique no botão abaixo para fazer login",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Localização",
|
||||
"Location - Tooltip": "Cidade de residência",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Contas gerenciadas",
|
||||
"Modify password...": "Modificar senha...",
|
||||
"Multi-factor authentication": "Autenticação de vários fatores",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Левый",
|
||||
"Logged in successfully": "Успешный вход в систему",
|
||||
"Logged out successfully": "Успешный выход из системы",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "Новое приложение",
|
||||
"No verification": "Нет верификации",
|
||||
"Normal": "Обычный",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Сессия входа в систему",
|
||||
"Signup items": "Элементы регистрации",
|
||||
"Signup items - Tooltip": "Элементы, которые пользователи должны заполнить при регистрации новых аккаунтов",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Только пользователи с тегом, указанным в тегах приложения могут войти в систему",
|
||||
"The application does not allow to sign up new account": "Приложение не позволяет зарегистрироваться новому аккаунту",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Формат жетона",
|
||||
"Token format - Tooltip": "Формат токена доступа",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "Вы не ожидали увидеть эту страницу-подсказку"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Действие",
|
||||
"Adapter": "Адаптер",
|
||||
"Adapter - Tooltip": "Имя таблицы хранилища политик",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Включить",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Включено",
|
||||
"Enabled successfully": "Успешно включено",
|
||||
"Enforcers": "Контролёры доступа",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Включен",
|
||||
"Is enabled - Tooltip": "Установить, может ли использоваться",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPы",
|
||||
"LDAPs - Tooltip": "LDAP серверы",
|
||||
"Languages": "Языки",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Провайдеры платежей должны быть настроены, включая PayPal, Alipay, WeChat Pay и т.д.",
|
||||
"Providers": "Провайдеры",
|
||||
"Providers - Tooltip": "Провайдеры должны быть настроены, включая вход с помощью сторонних сервисов, объектное хранилище, код подтверждения и т.д.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Реальное имя",
|
||||
"Records": "Записи",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Базовый DN",
|
||||
"Base DN - Tooltip": "Базовый DN во время поиска LDAP",
|
||||
"CN": "КНР",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Изменить LDAP",
|
||||
"Enable SSL": "Включить SSL",
|
||||
"Enable SSL - Tooltip": "Перевод: Следует ли включать SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Не удалось получить авторизацию MetaMask",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Забыли пароль?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Ваш телефон",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Редактировать модель",
|
||||
"Model text": "Модельный текст",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Побудил",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "URL поставщика",
|
||||
"Provider URL - Tooltip": "URL для настройки поставщика услуг, это поле используется только для ссылки и не используется в Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "У вас есть аккаунт?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Пожалуйста, примите соглашение!",
|
||||
"Please click the below button to sign in": "Пожалуйста, нажмите на кнопку ниже, чтобы авторизоваться",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Ссылка",
|
||||
"Location": "Местоположение",
|
||||
"Location - Tooltip": "Город проживания",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Управляемые аккаунты",
|
||||
"Modify password...": "Изменить пароль...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Vľavo",
|
||||
"Logged in successfully": "Úspešne prihlásený",
|
||||
"Logged out successfully": "Úspešne odhlásený",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "Nová aplikácia",
|
||||
"No verification": "Bez overenia",
|
||||
"Normal": "Normálny",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Relácia prihlásenia",
|
||||
"Signup items": "Položky registrácie",
|
||||
"Signup items - Tooltip": "Položky, ktoré majú používatelia vyplniť pri registrácii nových účtov",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Malá ikona",
|
||||
"Tags - Tooltip": "Prihlásiť sa môžu iba používatelia s tagom uvedeným v tagoch aplikácie",
|
||||
"The application does not allow to sign up new account": "Aplikácia neumožňuje vytvoriť nový účet",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Používateľské polia zahrnuté v tokene",
|
||||
"Token format": "Formát tokenu",
|
||||
"Token format - Tooltip": "Formát prístupového tokenu",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "Neočekávali ste, že uvidíte túto výzvu"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Prístupový kľúč",
|
||||
"Access secret": "Prístupové tajomstvo",
|
||||
"Access secret - Tooltip": "Prístupové tajomstvo",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Akcia",
|
||||
"Adapter": "Adaptér",
|
||||
"Adapter - Tooltip": "Názov tabuľky úložiska pravidiel",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Povoliť",
|
||||
"Enable dark logo": "Povoliť tmavé logo",
|
||||
"Enable dark logo - Tooltip": "Povoliť tmavé logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Povolené",
|
||||
"Enabled successfully": "Úspešne povolené",
|
||||
"Enforcers": "Vynútitelia",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Pozvánky",
|
||||
"Is enabled": "Je povolené",
|
||||
"Is enabled - Tooltip": "Nastavte, či môže byť použitý",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAP",
|
||||
"LDAPs - Tooltip": "LDAP servery",
|
||||
"Languages": "Jazyky",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Poskytovatelia platieb na konfiguráciu, vrátane PayPal, Alipay, WeChat Pay atď.",
|
||||
"Providers": "Poskytovatelia",
|
||||
"Providers - Tooltip": "Poskytovatelia na konfiguráciu, vrátane prihlásenia cez tretie strany, ukladania objektov, overovacích kódov atď.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Skutočné meno",
|
||||
"Records": "Záznamy",
|
||||
"Request URI": "URI požiadavky",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Základný DN",
|
||||
"Base DN - Tooltip": "Základný DN počas vyhľadávania LDAP",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Upraviť LDAP",
|
||||
"Enable SSL": "Povoliť SSL",
|
||||
"Enable SSL - Tooltip": "Či povoliť SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Rozpoznávanie tváre",
|
||||
"Face recognition failed": "Zlyhalo rozpoznávanie tváre",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Nepodarilo sa získať autorizáciu MetaMask",
|
||||
"Failed to obtain Web3-Onboard authorization": "Nepodarilo sa získať autorizáciu Web3-Onboard",
|
||||
"Forgot password?": "Zabudli ste heslo?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Váš telefón je",
|
||||
"preferred": "preferované"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Upraviť model",
|
||||
"Model text": "Text modelu",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "ID projektu",
|
||||
"Project Id - Tooltip": "ID projektu",
|
||||
"Prompted": "Vyžiadané",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "URL poskytovateľa",
|
||||
"Provider URL - Tooltip": "URL na konfiguráciu poskytovateľa služby, toto pole sa používa len na referenciu a v Casdoor sa nepoužíva",
|
||||
"Public key": "Verejný kľúč",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Máte účet?",
|
||||
"Label": "Štítok",
|
||||
"Label HTML": "HTML štítok",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Miesto na vyplnenie",
|
||||
"Please accept the agreement!": "Prosím, akceptujte dohodu!",
|
||||
"Please click the below button to sign in": "Prosím, kliknite na nižšie uvedené tlačidlo na prihlásenie",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Odkaz",
|
||||
"Location": "Miesto",
|
||||
"Location - Tooltip": "Mesto bydliska",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Spravované účty",
|
||||
"Modify password...": "Zmeniť heslo...",
|
||||
"Multi-factor authentication": "Viacfaktorová autentifikácia",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Left",
|
||||
"Logged in successfully": "Logged in successfully",
|
||||
"Logged out successfully": "Logged out successfully",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Is enabled",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Languages",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Real name",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Forgot password?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Edit Model",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Have account?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Please accept the agreement!",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Sol",
|
||||
"Logged in successfully": "Başarıyla giriş yapıldı",
|
||||
"Logged out successfully": "Başarıyla çıkış yapıldı",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "New Application",
|
||||
"No verification": "No verification",
|
||||
"Normal": "Normal",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Token format",
|
||||
"Token format - Tooltip": "The format of access token",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "You are unexpected to see this prompt page"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Action",
|
||||
"Adapter": "Adapter",
|
||||
"Adapter - Tooltip": "Table name of the policy store",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Etkinleştir",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Etkin",
|
||||
"Enabled successfully": "Başarıyla etkinleştirildi",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Davetler",
|
||||
"Is enabled": "Aktif Mi?",
|
||||
"Is enabled - Tooltip": "Set whether it can use",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAP servers",
|
||||
"Languages": "Diller",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Payment providers to be configured, including PayPal, Alipay, WeChat Pay, etc.",
|
||||
"Providers": "Providers",
|
||||
"Providers - Tooltip": "Providers to be configured, including 3rd-party login, object storage, verification code, etc.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Gerçek isim",
|
||||
"Records": "Records",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN during LDAP search",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Edit LDAP",
|
||||
"Enable SSL": "Enable SSL",
|
||||
"Enable SSL - Tooltip": "Whether to enable SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Metamask yetkilendirmesi başarısız",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Şifrenizi mi unuttunuz?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Telefon numaranız",
|
||||
"preferred": "tercih edilen"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Modeli Düzenle",
|
||||
"Model text": "Model text",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Prompted",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Provider URL",
|
||||
"Provider URL - Tooltip": "URL for configuring the service provider, this field is only used for reference and is not used in Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Zaten bir hesabınız var mı?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Lütfen, kullanım koşullarını kabul ediniz",
|
||||
"Please click the below button to sign in": "Please click the below button to sign in",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Link",
|
||||
"Location": "Location",
|
||||
"Location - Tooltip": "City of residence",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Managed accounts",
|
||||
"Modify password...": "Modify password...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Ліворуч",
|
||||
"Logged in successfully": "Успішно ввійшли",
|
||||
"Logged out successfully": "Успішно вийшов",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "Нова заявка",
|
||||
"No verification": "Без підтвердження",
|
||||
"Normal": "нормальний",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Сеанс входу",
|
||||
"Signup items": "Пункти реєстрації",
|
||||
"Signup items - Tooltip": "Пункти, які користувачі повинні заповнити під час реєстрації нових облікових записів",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Маленький значок",
|
||||
"Tags - Tooltip": "Увійти можуть лише користувачі з тегом, указаним у тегах програми",
|
||||
"The application does not allow to sign up new account": "Програма не дозволяє зареєструвати новий обліковий запис",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Поля маркерів – підказка",
|
||||
"Token format": "Формат маркера",
|
||||
"Token format - Tooltip": "Формат маркера доступу",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "Ви неочікувано побачите цю сторінку запиту"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Ключ доступу - підказка",
|
||||
"Access secret": "Секрет доступу",
|
||||
"Access secret - Tooltip": "Секрет доступу - підказка",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Дія",
|
||||
"Adapter": "Перехідник",
|
||||
"Adapter - Tooltip": "Назва таблиці сховища полісів",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Увімкнути",
|
||||
"Enable dark logo": "Увімкнути темний логотип",
|
||||
"Enable dark logo - Tooltip": "Увімкнути темний логотип",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Увімкнено",
|
||||
"Enabled successfully": "Успішно ввімкнено",
|
||||
"Enforcers": "Силовики",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Запрошення",
|
||||
"Is enabled": "Увімкнено",
|
||||
"Is enabled - Tooltip": "Встановіть, чи можна використовувати",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAP",
|
||||
"LDAPs - Tooltip": "Сервери LDAP",
|
||||
"Languages": "Мови",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Платіжні постачальники, які потрібно налаштувати, зокрема PayPal, Alipay, WeChat Pay тощо.",
|
||||
"Providers": "Провайдери",
|
||||
"Providers - Tooltip": "Постачальники, які потрібно налаштувати, включаючи вхід сторонніх розробників, зберігання об’єктів, код підтвердження тощо.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Справжнє ім'я",
|
||||
"Records": "Записи",
|
||||
"Request URI": "URI запиту",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "Базовий DN",
|
||||
"Base DN - Tooltip": "Базовий DN під час пошуку LDAP",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Редагувати LDAP",
|
||||
"Enable SSL": "Увімкніть SSL",
|
||||
"Enable SSL - Tooltip": "Чи вмикати SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Розпізнавання обличчя",
|
||||
"Face recognition failed": "Помилка розпізнавання обличчя",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Не вдалося отримати авторизацію MetaMask",
|
||||
"Failed to obtain Web3-Onboard authorization": "Не вдалося отримати авторизацію Web3-Onboard",
|
||||
"Forgot password?": "Забули пароль?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Ваш телефон",
|
||||
"preferred": "бажаний"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Редагувати модель",
|
||||
"Model text": "Текст моделі",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Ідентифікатор проекту",
|
||||
"Project Id - Tooltip": "Ідентифікатор проекту – підказка",
|
||||
"Prompted": "Запропоновано",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "URL-адреса постачальника",
|
||||
"Provider URL - Tooltip": "URL-адреса для налаштування постачальника послуг, це поле використовується лише для довідки та не використовується в Casdoor",
|
||||
"Public key": "Відкритий ключ",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Є акаунт?",
|
||||
"Label": "Мітка",
|
||||
"Label HTML": "Мітка HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Заповнювач",
|
||||
"Please accept the agreement!": "Будь ласка, прийміть угоду!",
|
||||
"Please click the below button to sign in": "Натисніть кнопку нижче, щоб увійти",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Посилання",
|
||||
"Location": "Місцезнаходження",
|
||||
"Location - Tooltip": "Місто проживання",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Керовані облікові записи",
|
||||
"Modify password...": "Змінити пароль...",
|
||||
"Multi-factor authentication": "Багатофакторна аутентифікація",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "Trái",
|
||||
"Logged in successfully": "Đăng nhập thành công",
|
||||
"Logged out successfully": "Đã đăng xuất thành công",
|
||||
"Multiple Choices": "Multiple Choices",
|
||||
"New Application": "Ứng dụng mới",
|
||||
"No verification": "Không xác minh",
|
||||
"Normal": "Bình thường",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "Phiên đăng nhập",
|
||||
"Signup items": "Các mục đăng ký",
|
||||
"Signup items - Tooltip": "Các thông tin cần được người dùng điền khi đăng ký tài khoản mới",
|
||||
"Single Choice": "Single Choice",
|
||||
"Small icon": "Small icon",
|
||||
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
|
||||
"The application does not allow to sign up new account": "Ứng dụng không cho phép đăng ký tài khoản mới",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token fields - Tooltip",
|
||||
"Token format": "Định dạng mã thông báo",
|
||||
"Token format - Tooltip": "Định dạng của mã thông báo truy cập",
|
||||
"Token signing method": "Token signing method",
|
||||
"Token signing method - Tooltip": "Signing method of JWT token, needs to be the same algorithm as the certificate",
|
||||
"Use Email as NameID": "Use Email as NameID",
|
||||
"Use Email as NameID - Tooltip": "Use Email as NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "Bạn không mong đợi thấy trang này hiện lên"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "Access key - Tooltip",
|
||||
"Access secret": "Access secret",
|
||||
"Access secret - Tooltip": "Access secret - Tooltip",
|
||||
"Access token is empty": "Access token is empty",
|
||||
"Action": "Hành động",
|
||||
"Adapter": "Bộ chuyển đổi",
|
||||
"Adapter - Tooltip": "Tên bảng của kho lưu trữ chính sách",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "Enable",
|
||||
"Enable dark logo": "Enable dark logo",
|
||||
"Enable dark logo - Tooltip": "Enable dark logo",
|
||||
"Enable tour": "Enable tour",
|
||||
"Enable tour - Tooltip": "Display tour for users",
|
||||
"Enabled": "Enabled",
|
||||
"Enabled successfully": "Enabled successfully",
|
||||
"Enforcers": "Enforcers",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "Invitations",
|
||||
"Is enabled": "Đã được kích hoạt",
|
||||
"Is enabled - Tooltip": "Đặt liệu nó có thể sử dụng hay không",
|
||||
"Is shared": "Is shared",
|
||||
"Is shared - Tooltip": "Share this application with other organizations",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "Máy chủ LDAP",
|
||||
"Languages": "Ngôn ngữ",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "Cung cấp thanh toán được cấu hình, bao gồm PayPal, Alipay, WeChat Pay, vv.",
|
||||
"Providers": "Nhà cung cấp",
|
||||
"Providers - Tooltip": "Các nhà cung cấp phải được cấu hình, bao gồm đăng nhập bên thứ ba, lưu trữ đối tượng, mã xác minh, v.v.",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "QR code is too large",
|
||||
"Real name": "Tên thật",
|
||||
"Records": "Hồ sơ",
|
||||
"Request URI": "Request URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "DN cơ sở",
|
||||
"Base DN - Tooltip": "Đơn vị căn bản (Base DN) trong quá trình tìm kiếm LDAP",
|
||||
"CN": "CN",
|
||||
"Default group": "Default group",
|
||||
"Default group - Tooltip": "Group to which users belong after synchronization",
|
||||
"Edit LDAP": "Sửa LDAP",
|
||||
"Enable SSL": "Kích hoạt SSL",
|
||||
"Enable SSL - Tooltip": "Có nên kích hoạt SSL hay không?",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "Face Recognition",
|
||||
"Face recognition failed": "Face recognition failed",
|
||||
"Failed to log out": "Failed to log out",
|
||||
"Failed to obtain MetaMask authorization": "Failed to obtain MetaMask authorization",
|
||||
"Failed to obtain Web3-Onboard authorization": "Failed to obtain Web3-Onboard authorization",
|
||||
"Forgot password?": "Quên mật khẩu?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "Your phone is",
|
||||
"preferred": "preferred"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "Account Name",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "Secret Key"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Sửa mô hình",
|
||||
"Model text": "Văn bản mẫu",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "Project Id",
|
||||
"Project Id - Tooltip": "Project Id - Tooltip",
|
||||
"Prompted": "Thúc đẩy",
|
||||
"Provider - Tooltip": "Provider - Tooltip",
|
||||
"Provider URL": "Địa chỉ URL nhà cung cấp",
|
||||
"Provider URL - Tooltip": "URL để cấu hình nhà cung cấp dịch vụ, trường này chỉ được sử dụng để tham khảo và không được sử dụng trong Casdoor",
|
||||
"Public key": "Public key",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "Có tài khoản không?",
|
||||
"Label": "Label",
|
||||
"Label HTML": "Label HTML",
|
||||
"Options": "Options",
|
||||
"Placeholder": "Placeholder",
|
||||
"Please accept the agreement!": "Vui lòng chấp nhận thỏa thuận!",
|
||||
"Please click the below button to sign in": "Xin vui lòng nhấn vào nút bên dưới để đăng nhập",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "Liên kết",
|
||||
"Location": "Vị trí",
|
||||
"Location - Tooltip": "Thành phố cư trú",
|
||||
"MFA accounts": "MFA accounts",
|
||||
"Managed accounts": "Quản lý tài khoản",
|
||||
"Modify password...": "Sửa đổi mật khẩu...",
|
||||
"Multi-factor authentication": "Multi-factor authentication",
|
||||
|
@ -74,6 +74,7 @@
|
||||
"Left": "居左",
|
||||
"Logged in successfully": "登录成功",
|
||||
"Logged out successfully": "登出成功",
|
||||
"Multiple Choices": "多选",
|
||||
"New Application": "添加应用",
|
||||
"No verification": "不校验",
|
||||
"Normal": "标准",
|
||||
@ -112,6 +113,7 @@
|
||||
"Signin session": "保持登录会话",
|
||||
"Signup items": "注册项",
|
||||
"Signup items - Tooltip": "注册用户注册时需要填写的项目",
|
||||
"Single Choice": "单选",
|
||||
"Small icon": "小图标",
|
||||
"Tags - Tooltip": "用户的标签在应用的标签集合中时,用户才可以登录该应用",
|
||||
"The application does not allow to sign up new account": "该应用不允许注册新账户",
|
||||
@ -121,6 +123,10 @@
|
||||
"Token fields - Tooltip": "Token中所包含的用户字段",
|
||||
"Token format": "Access Token格式",
|
||||
"Token format - Tooltip": "Access Token格式",
|
||||
"Token signing method": "Token签名算法",
|
||||
"Token signing method - Tooltip": "JWT token的签名算法,需要与证书算法相匹配",
|
||||
"Use Email as NameID": "使用邮箱作为NameID",
|
||||
"Use Email as NameID - Tooltip": "使用邮箱作为NameID - Tooltip",
|
||||
"You are unexpected to see this prompt page": "错误:该提醒页面不应出现"
|
||||
},
|
||||
"cert": {
|
||||
@ -177,6 +183,7 @@
|
||||
"Access key - Tooltip": "访问密钥",
|
||||
"Access secret": "访问密码",
|
||||
"Access secret - Tooltip": "访问密码",
|
||||
"Access token is empty": "Access token为空",
|
||||
"Action": "操作",
|
||||
"Adapter": "适配器",
|
||||
"Adapter - Tooltip": "策略存储的表名",
|
||||
@ -234,6 +241,8 @@
|
||||
"Enable": "启用",
|
||||
"Enable dark logo": "开启暗黑Logo",
|
||||
"Enable dark logo - Tooltip": "开启暗黑Logo",
|
||||
"Enable tour": "启用导引",
|
||||
"Enable tour - Tooltip": "为用户显示导引",
|
||||
"Enabled": "已开启",
|
||||
"Enabled successfully": "启用成功",
|
||||
"Enforcers": "Casbin执行器",
|
||||
@ -265,6 +274,8 @@
|
||||
"Invitations": "邀请码",
|
||||
"Is enabled": "已启用",
|
||||
"Is enabled - Tooltip": "是否启用",
|
||||
"Is shared": "是否共享",
|
||||
"Is shared - Tooltip": "与其他组织共享此应用",
|
||||
"LDAPs": "LDAP",
|
||||
"LDAPs - Tooltip": "LDAPs",
|
||||
"Languages": "语言",
|
||||
@ -328,6 +339,8 @@
|
||||
"Provider - Tooltip": "需要配置的支付提供商,包括PayPal、支付宝、微信支付等",
|
||||
"Providers": "提供商",
|
||||
"Providers - Tooltip": "需要配置的提供商,包括第三方登录、对象存储、验证码等",
|
||||
"QR Code": "QR Code",
|
||||
"QR code is too large": "二维码过大",
|
||||
"Real name": "姓名",
|
||||
"Records": "日志",
|
||||
"Request URI": "请求URI",
|
||||
@ -441,6 +454,8 @@
|
||||
"Base DN": "基本DN",
|
||||
"Base DN - Tooltip": "LDAP搜索时的基DN",
|
||||
"CN": "CN",
|
||||
"Default group": "默认群组",
|
||||
"Default group - Tooltip": "同步用户后用户所在的群组",
|
||||
"Edit LDAP": "编辑LDAP",
|
||||
"Enable SSL": "启用SSL",
|
||||
"Enable SSL - Tooltip": "是否启用SSL",
|
||||
@ -470,6 +485,7 @@
|
||||
"Face ID": "Face ID",
|
||||
"Face Recognition": "人脸识别",
|
||||
"Face recognition failed": "人脸识别失败",
|
||||
"Failed to log out": "注销失败",
|
||||
"Failed to obtain MetaMask authorization": "获取MetaMask授权失败",
|
||||
"Failed to obtain Web3-Onboard authorization": "获取 Web3-Onboard 授权失败",
|
||||
"Forgot password?": "忘记密码?",
|
||||
@ -551,6 +567,11 @@
|
||||
"Your phone is": "你的手机号",
|
||||
"preferred": "首选"
|
||||
},
|
||||
"mfaAccount": {
|
||||
"Account Name": "账号名",
|
||||
"Issuer": "Issuer",
|
||||
"Secret Key": "密钥"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "编辑模型",
|
||||
"Model text": "模型文本",
|
||||
@ -818,6 +839,7 @@
|
||||
"Project Id": "项目 Id",
|
||||
"Project Id - Tooltip": "项目 Id - 工具提示",
|
||||
"Prompted": "注册后提醒绑定",
|
||||
"Provider - Tooltip": "提供商 - Tooltip",
|
||||
"Provider URL": "提供商URL",
|
||||
"Provider URL - Tooltip": "提供商网址配置对应的URL,该字段仅用来方便跳转,在Casdoor平台中未使用",
|
||||
"Public key": "公钥",
|
||||
@ -937,6 +959,7 @@
|
||||
"Have account?": "已有账号?",
|
||||
"Label": "标签",
|
||||
"Label HTML": "标签HTML",
|
||||
"Options": "选项",
|
||||
"Placeholder": "占位符",
|
||||
"Please accept the agreement!": "请先同意用户协议!",
|
||||
"Please click the below button to sign in": "请点击下方按钮登录",
|
||||
@ -1136,6 +1159,7 @@
|
||||
"Link": "绑定",
|
||||
"Location": "城市",
|
||||
"Location - Tooltip": "居住地址所在的城市",
|
||||
"MFA accounts": "MFA账户",
|
||||
"Managed accounts": "托管账户",
|
||||
"Modify password...": "编辑密码...",
|
||||
"Multi-factor authentication": "多因素认证",
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
import React from "react";
|
||||
import {DeleteOutlined, DownOutlined, UpOutlined} from "@ant-design/icons";
|
||||
import {Button, Col, Image, Input, Row, Table, Tooltip} from "antd";
|
||||
import {Alert, Button, Col, Image, Input, Popover, QRCode, Row, Table, Tooltip} from "antd";
|
||||
import * as Setting from "../Setting";
|
||||
import i18next from "i18next";
|
||||
|
||||
@ -23,6 +23,7 @@ class MfaAccountTable extends React.Component {
|
||||
super(props);
|
||||
this.state = {
|
||||
classes: props,
|
||||
icon: this.props.icon,
|
||||
mfaAccounts: this.props.table !== null ? this.props.table.map((item, index) => {
|
||||
item.key = index;
|
||||
return item;
|
||||
@ -75,6 +76,42 @@ class MfaAccountTable extends React.Component {
|
||||
this.updateTable(table);
|
||||
}
|
||||
|
||||
getQrUrl() {
|
||||
const {accessToken} = this.props;
|
||||
let qrUrl = `casdoor-app://login?serverUrl=${window.location.origin}&accessToken=${accessToken}`;
|
||||
let error = null;
|
||||
|
||||
if (!accessToken) {
|
||||
qrUrl = "";
|
||||
error = i18next.t("general:Access token is empty");
|
||||
}
|
||||
|
||||
if (qrUrl.length >= 2000) {
|
||||
qrUrl = "";
|
||||
error = i18next.t("general:QR code is too large");
|
||||
}
|
||||
|
||||
return {qrUrl, error};
|
||||
}
|
||||
|
||||
renderQrCode() {
|
||||
const {qrUrl, error} = this.getQrUrl();
|
||||
|
||||
if (error) {
|
||||
return <Alert message={error} type="error" showIcon />;
|
||||
} else {
|
||||
return (
|
||||
<QRCode
|
||||
value={qrUrl}
|
||||
icon={this.state.icon}
|
||||
errorLevel="M"
|
||||
size={230}
|
||||
bordered={false}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
renderTable(table) {
|
||||
const columns = [
|
||||
{
|
||||
@ -157,7 +194,11 @@ class MfaAccountTable extends React.Component {
|
||||
title={() => (
|
||||
<div>
|
||||
{this.props.title}
|
||||
<Button style={{marginRight: "5px"}} type="primary" size="small" onClick={() => this.addRow(table)}>{i18next.t("general:Add")}</Button>
|
||||
<Button style={{marginRight: "10px"}} type="primary" size="small" onClick={() => this.addRow(table)}>{i18next.t("general:Add")}</Button>
|
||||
<Popover trigger="focus" overlayInnerStyle={{padding: 0}}
|
||||
content={this.renderQrCode()}>
|
||||
<Button style={{marginLeft: "5px"}} type="primary" size="small">{i18next.t("general:QR Code")}</Button>
|
||||
</Popover>
|
||||
</div>
|
||||
)}
|
||||
/>
|
||||
|
@ -136,6 +136,7 @@ class SigninMethodTable extends React.Component {
|
||||
options = [
|
||||
{id: "All", name: i18next.t("general:All")},
|
||||
{id: "Non-LDAP", name: i18next.t("general:Non-LDAP")},
|
||||
{id: "Hide-Password", name: i18next.t("general:Hide-Password")},
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -65,7 +65,7 @@ class SignupTable extends React.Component {
|
||||
}
|
||||
|
||||
addRow(table) {
|
||||
const row = {name: Setting.getNewRowNameForTable(table, "Please select a signup item"), visible: true, required: true, rule: "None", customCss: ""};
|
||||
const row = {name: Setting.getNewRowNameForTable(table, "Please select a signup item"), visible: true, required: true, options: [], rule: "None", customCss: ""};
|
||||
if (table === undefined) {
|
||||
table = [];
|
||||
}
|
||||
@ -100,6 +100,10 @@ class SignupTable extends React.Component {
|
||||
{name: "ID", displayName: i18next.t("general:ID")},
|
||||
{name: "Display name", displayName: i18next.t("general:Display name")},
|
||||
{name: "Affiliation", displayName: i18next.t("user:Affiliation")},
|
||||
{name: "Gender", displayName: i18next.t("user:Gender")},
|
||||
{name: "Bio", displayName: i18next.t("user:Bio")},
|
||||
{name: "Tag", displayName: i18next.t("user:Tag")},
|
||||
{name: "Education", displayName: i18next.t("user:Education")},
|
||||
{name: "Country/Region", displayName: i18next.t("user:Country/Region")},
|
||||
{name: "ID card", displayName: i18next.t("user:ID card")},
|
||||
{name: "Password", displayName: i18next.t("general:Password")},
|
||||
@ -201,6 +205,25 @@ class SignupTable extends React.Component {
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: i18next.t("provider:Type"),
|
||||
dataIndex: "type",
|
||||
key: "type",
|
||||
width: "160px",
|
||||
render: (text, record, index) => {
|
||||
const options = [
|
||||
{id: "Input", name: i18next.t("application:Input")},
|
||||
{id: "Single Choice", name: i18next.t("application:Single Choice")},
|
||||
{id: "Multiple Choices", name: i18next.t("application:Multiple Choices")},
|
||||
];
|
||||
|
||||
return (
|
||||
<Select virtual={false} style={{width: "100%"}} value={text} onChange={(value => {
|
||||
this.updateField(table, index, "type", value);
|
||||
})} options={options.map(item => Setting.getOption(item.name, item.id))} />
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: i18next.t("signup:Label"),
|
||||
dataIndex: "label",
|
||||
@ -261,7 +284,7 @@ class SignupTable extends React.Component {
|
||||
title: i18next.t("signup:Placeholder"),
|
||||
dataIndex: "placeholder",
|
||||
key: "placeholder",
|
||||
width: "200px",
|
||||
width: "110px",
|
||||
render: (text, record, index) => {
|
||||
if (record.name.startsWith("Text ")) {
|
||||
return null;
|
||||
@ -274,6 +297,26 @@ class SignupTable extends React.Component {
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: i18next.t("signup:Options"),
|
||||
dataIndex: "options",
|
||||
key: "options",
|
||||
width: "180px",
|
||||
render: (text, record, index) => {
|
||||
if (record.type !== "Single Choice" && record.type !== "Multiple Choices") {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Select virtual={false} mode="tags" style={{width: "100%"}} value={text}
|
||||
onChange={(value => {
|
||||
this.updateField(table, index, "options", value);
|
||||
})}
|
||||
options={text?.map((option) => Setting.getOption(option, option))}
|
||||
/>
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: i18next.t("signup:Regex"),
|
||||
dataIndex: "regex",
|
||||
|
Reference in New Issue
Block a user