Compare commits

...

45 Commits

Author SHA1 Message Date
c9635d9e2b feat: improve i18n (#3259) 2024-10-01 00:10:49 +08:00
3bd52172ea feat: add Hide-Password option for signin method rule field (#3258) 2024-09-30 23:31:41 +08:00
bf730050d5 feat: increase Organization.Favicon to 200 chars 2024-09-29 11:45:56 +08:00
5b733b7f15 feat: improve filterRecordIn24Hours() logic 2024-09-29 11:45:15 +08:00
034f28def9 feat: logout if app.conf's inactiveTimeoutMinutes is reached (#3244)
* feat: logout if there's no activities for a long time

* fix: change the implementation of updating LastTime

* fix: add logoutMinites to app.conf

* fix: change the implementation of judgment statement

* fix: use sync.Map to ensure thread safety

* fix: syntax standards and Apache headers

* fix: change the implementation of obtaining logoutMinutes in app.conf

* fix: follow community code standards

* fix: <=0 or empty means no restriction

* Update logout_filter.go

* Update app.conf

* Update main.go

* Update and rename logout_filter.go to timeout_filter.go

* Update app.conf

* Update timeout_filter.go

* fix: update app.conf

---------

Co-authored-by: Yang Luo <hsluoyz@qq.com>
2024-09-27 01:18:02 +08:00
c86ac8e6ad feat: fix UTF-8 charset for Alipay IdP (#3247) 2024-09-27 00:59:52 +08:00
d647eed22a feat: add OIDC WebFinger support (#3245)
* feat: add WebFinger support

* lint: used gofumpt

* oidc: ensure webfinger rel is checked
2024-09-26 13:06:36 +08:00
717c53f6e5 feat: support enableErrorMask2 config 2024-09-25 19:37:14 +08:00
097adac871 feat: support single-choice and multi-choices in signup page (#3234)
* feat: add custom signup field

* feat: support more field in signup page

* feat: support more field in signup page

* feat: support more field in signup page

* feat: Reduce code duplication in form item rendering

* feat: Simplify gender and info checks using includes

* feat: update translate

* Revert "feat: update translate"

This reverts commit 669334c716.

* feat: address feedback from hsluoyz
2024-09-25 12:48:37 +08:00
74543b9533 feat: improve QR code for casdoor-app (#3226)
* feat: simplify login url for casdoor-app

* feat: add token check

* fix: improve logic
2024-09-23 22:27:58 +08:00
110dc04179 feat: Revert "feat: fix permission problem in standard image" (#3231)
This reverts commit 6464bd10dc.
2024-09-23 22:19:27 +08:00
6464bd10dc feat: fix permission problem in standard image (#3228) 2024-09-23 18:40:39 +08:00
db878a890e feat: add type and options to signup items 2024-09-21 23:40:29 +08:00
12d6d8e6ce feat: fix cookie expire time too short bug 2024-09-21 22:45:13 +08:00
8ed6e4f934 feat: improve UI for "No account?" 2024-09-21 07:35:33 +08:00
ed9732caf9 feat: add condition for getWebBuildFolder function (#3219) 2024-09-20 23:59:13 +08:00
0de4e7da38 feat: fix organization pagination count error (#3215)
* fix(organization): ensure count includes shared organizations

Adjust the `GetOrganizationCount` function to account for shared organizations by adding
an additional parameter and modifying the count query accordingly. This change ensures that
the organization count correctly reflects shared organizations within the system.

* ```fix(organization): optimize GetOrganizationCount query

Refactor the GetOrganizationCount function to use a more efficient search
method by leveraging the 'is_shared' field directly in the query condition.
This change improves the performance for counting organizations by avoiding
unnecessary iteration over potentially large result sets.
```

---------

Co-authored-by: CuiJing <cuijing@tul.com.cn>
2024-09-20 23:58:46 +08:00
a330fbc11f docs: fix Docker link 2024-09-17 20:45:32 +08:00
ed158d4981 feat: support advanced editor in model edit page (#3176)
* feat: integrate external model editor and handle message events for model updates

* feat: add CasbinEditor and IframeEditor components for model editing

* feat: add tabbed editor interface for CasbinEditor

* fix: Synchronize content between basic and advanced editors

* refactor: simplify CasbinEditor and ModelEditPage components

* refactor: Refactor CasbinEditor for improved iframe initialization and model synchronization

* refactor: update default state of CasbinEditor active tab to "advanced

* chore: add Apache License header to CasbinEditor.js and IframeEditor.js files

* refactor: update CasbinEditor class names for consistency
2024-09-16 22:25:25 +08:00
8df965b98d feat: improve SAML XML's xmlns to fix SAML support for some clouds (#3207) 2024-09-16 08:01:28 +08:00
2c3749820e feat: add application.UseEmailAsSamlNameId field for SAML (#3203)
* feat: Add option to use email as SAML NameID based on application config

- Updated NewSamlResponse11 to accept an application parameter.
- Conditionally set SAML NameIdentifier to user's email or username based on application.UseEmailAsNameId.

* refactor: Update GetValidationBySaml to pass application to NewSamlResponse11

- Modified GetValidationBySaml function to include application parameter in NewSamlResponse11 call.

* feat: Rename field and update logic for using Email as SAML NameID

- Renamed the `UseEmailAsNameId` field to `UseEmailAsSamlNameId` in the `Application` struct.
- Updated `NewSamlResponse` and `NewSamlResponse11` functions to use `UseEmailAsSamlNameId` for setting the NameID value.
- Modified `ApplicationEditPage.js` to reflect the field name change and update the corresponding logic.
2024-09-15 23:00:50 +08:00
0b17cb9746 feat: make Organization.EnableSoftDeletion and User.IsDeleted work (#3205)
* feat: make Organization.EnableSoftDeletion and User.IsDeleted work

* fix: add handling of the situation where organization is nil
2024-09-15 14:35:44 +08:00
e2ce9ad625 feat: handle null account item issue in CheckPermissionForUpdateUser() (#3202)
* feat: improve the logic of the permission check code for users to modify account items

* fix: add skip operation for deleted account items in update-user API

* fix: add the function of removing deleted account item
2024-09-14 15:00:10 +08:00
64491abc64 feat: fix CORS issue of /api/acs for SAML IdP (#3200)
* fix: fix CORS problem of /api/acs when login with saml idp

* fix: fix origin get null when receive post with http protocol
2024-09-14 12:48:51 +08:00
934a8947c8 feat: fix CAS logout failure caused by Beego session update problem (#3194)
* feat: fix the cas logout failure caused by beego session update problem

* fix: simplify the implementation of logout timer

* fix: change the location of the login success code

* fix: add i18n to CasLogout.js
2024-09-10 21:31:37 +08:00
943edfb48b feat: support QR login for casdoor app (#3190)
* feat: add MFA devices QR code to UserEditPage

* chore: remove mfa devices
2024-09-08 22:38:13 +08:00
0d02b5e768 feat: remove disabled state in syncer.table 2024-09-07 21:08:21 +08:00
ba8d0b5f46 feat: Revert "feat: Users added through LDAP cannot log in using the set password" (#3186)
This reverts commit 973a1df6c2.
2024-09-07 20:55:14 +08:00
973a1df6c2 feat: Users added through LDAP cannot log in using the set password (#3175)
* fix: login will prioritize the use of password set in casdoor and use ldap when use LDAP option in login form or user never change their password in casdoor after sync

* fix: promote if statement
2024-09-06 10:31:34 +08:00
05bfd3a3a3 feat: fix bug that custom SAML providers are removed by GetMaskedApplication() (#3165) 2024-09-05 20:08:56 +08:00
69aa3c8a8b feat: Revert "feat: add Casbin editor's checking in model editor" (#3167)
This reverts commit a1b010a406.
2024-09-03 21:59:06 +08:00
a1b010a406 feat: add Casbin editor's checking in model editor (#3166)
* feat: add model syntax linting and update dependencies

* refactor: move model linter logic to separate module
2024-09-03 21:32:45 +08:00
89e92cbd47 feat: when using basic auth to fetch access_token will return restful response to oidc client (#3164) 2024-09-03 08:05:29 +08:00
d4c8193357 feat: support reCAPTCHA v3 captcha provider (#3160)
* feat: support reCAPTCHA v3 captcha provider

* fix: modify the implementation of row component style in CaptchaModal.js
2024-09-02 22:15:03 +08:00
9b33800b4c feat: add email_verified, phone_number and phone_number_verified field for standard jwt token (#3156)
* feat: add email_verified, phone_number and phone_number_verified field for standard jwt token

* fix: fix linter err
2024-08-31 12:49:39 +08:00
ec98785172 feat: certEditPage will be redirected to 404 when name is changed (#3154) 2024-08-30 23:04:50 +08:00
45dd4cc344 feat: fix nonce not parsed issue in fastAutoSignin() (#3153)
* fix: fix nonce none passed when auto sign enabled

* fix: fix query error
2024-08-30 22:29:23 +08:00
1adb172d6b feat: add more crypto algorithm for jwt signing (#3150)
* feat: add more algorithm support for JWT signing

* feat: add i18n support

* feat: add i18n support

* feat: optimize if statement

* fix: remove additional space line
2024-08-30 16:59:41 +08:00
c08f2b1f3f feat: support Casdoor storage provider (#3147)
* feat: support Casdoor storage provider

* fix: fix code format and nil pointer error

* feat: change cert if statement
2024-08-27 23:54:03 +08:00
62bb257c6d feat: make Resource.Url length to 500 2024-08-26 23:57:41 +08:00
230a77e3e3 feat: add captcha page (#3144) 2024-08-26 23:22:53 +08:00
dce0a96dea feat: improve uploaded file URL 2024-08-26 21:41:28 +08:00
65563fa0cd feat: Ensure MFA email and phone are validated before enabling (#3143)
Added validation checks to ensure that a user's email and phone number are provided before enabling MFA email and phone respectively. This fixes the issue where MFA could be enabled without these values, causing inconsistencies.
2024-08-26 08:40:22 +08:00
f2a94f671a feat: complete i18n translation (#3141)
* feat: complete i18n translation

* fix: fix problem in cs/data
2024-08-24 23:27:59 +08:00
1460a0498f feat: support assign a default group for synchronized from external openldap (#3140)
* feat: support default sync group for ldap (with without add i18n translate)

* feat: improve translation

* feat: update all i18n translation

* revert: remove new i18n translation
2024-08-24 00:12:52 +08:00
84 changed files with 1889 additions and 175 deletions

View File

@ -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>

View File

@ -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, *, *

View File

@ -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":

View File

@ -23,6 +23,7 @@ isDemoMode = false
batchSize = 100
enableErrorMask = false
enableGzip = true
inactiveTimeoutMinutes =
ldapServerPort = 389
radiusServerPort = 1812
radiusSecret = "secret"

View File

@ -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,

View File

@ -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()
}

View File

@ -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

View File

@ -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)

View File

@ -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())

View File

@ -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, "不存在") {

View File

@ -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)
}

View File

@ -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
View File

@ -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
View File

@ -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=

View File

@ -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
}

View File

@ -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"))

View File

@ -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)
}
}

View File

@ -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
}

View File

@ -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

View File

@ -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
}

View File

@ -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) {

View File

@ -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"`
}

View File

@ -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")

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}
}
}

View File

@ -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) {

View File

@ -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 {

View File

@ -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
}

View File

@ -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
//}

View File

@ -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

View File

@ -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")

View File

@ -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
View 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
View 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
}

View File

@ -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

View File

@ -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}) => {

View File

@ -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
View 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
View 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;

View File

@ -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);

View File

@ -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
View 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;

View File

@ -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"))} :

View File

@ -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>

View File

@ -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"))} :

View File

@ -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;
}

View File

@ -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"}} >

View File

@ -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>

View File

@ -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() {

View File

@ -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?")}&nbsp;
{
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;

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -115,7 +115,7 @@ export const CaptchaModal = (props) => {
} else {
return (
<Col>
<Row>
<Row justify={"center"}>
<CaptchaWidget
captchaType={captchaType}
subType={subType}

View File

@ -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;
}

View File

@ -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",

View File

@ -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í",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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": "Багатофакторна аутентифікація",

View File

@ -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",

View File

@ -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": "多因素认证",

View File

@ -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}&nbsp;&nbsp;&nbsp;&nbsp;
<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>
)}
/>

View File

@ -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")},
];
}

View File

@ -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",