Compare commits

...

34 Commits

Author SHA1 Message Date
Eng Zer Jun
dea03cdd15 feat: replace deprecated github.com/RobotsAndPencils/go-saml (#2558)
The `github.com/RobotsAndPencils/go-saml` has been officially deprecated
and archived on 7 June 2023.

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
2023-12-25 21:15:53 +08:00
xiao-kong-long
21f394847e fix: fix Swagger docs by improving comments 2023-12-23 11:57:18 +08:00
Yang Luo
9bef9691fb feat: fix volcengine SMS provider error handling 2023-12-22 20:49:45 +08:00
Yang Luo
141f22a707 feat: upgrade to Node.js 18 and Go 1.20 in Dockerfile 2023-12-22 14:46:41 +08:00
Yang Luo
02329d342a feat: fix bug in "*" users and roles in permission edit page. 2023-12-22 14:16:00 +08:00
Yang Luo
b9d3e2184c fix: update CI node version from 16 to 18 2023-12-22 09:28:45 +08:00
Yang Luo
28caf8550e Support token parsed result 2023-12-22 02:04:25 +08:00
Yang Luo
79159dc809 Improve TokenEditPage 2023-12-22 00:44:34 +08:00
Yang Luo
63081641d6 Improve i18n text 2023-12-22 00:25:46 +08:00
Yang Luo
698f24f762 feat: fix template code bug in SMS provider of Amazon SNS 2023-12-21 23:32:55 +08:00
HGZ-20
5499e62d7f feat: add the FailedSigninLimit and FailedSigninfrozenTime configuration options to the application (#2552)
Add configuration items to the application to limit the number of logins and the login wait time after the maximum number of errors is reached
feat: #2272

fix: fixed the issue where the token parameter could be set to a negative value
2023-12-20 22:29:53 +08:00
Yang Luo
f8905ae64c Fix S3-compliant storage providers support 2023-12-20 14:38:32 +08:00
Yang Luo
a42594859f feat: improve enforce() and batchEnforce() API response 2023-12-20 11:41:54 +08:00
Yang Luo
46e0bc1a39 Improve i18n texts 2023-12-20 10:09:00 +08:00
Gucheng Wang
ffe2330238 Fix tag field in user list page 2023-12-20 01:57:56 +08:00
Gucheng
ec53616dc8 Update README.md 2023-12-20 01:52:29 +08:00
Gucheng Wang
067276d739 Add new B2C provider 2023-12-17 16:29:29 +08:00
Yang Luo
468ceb6b71 Fix get-all-objects API 403 issue 2023-12-15 21:32:45 +08:00
Satinder Singh
b31a317585 feat: add helm release github action (#2546) 2023-12-15 19:30:10 +08:00
Yang Luo
396b6fb65f feat: refactor custom HTTP related filenames 2023-12-15 00:06:05 +08:00
Yang Luo
be637fca81 fix: fix wrong POST param logic in custom HTTP providers 2023-12-15 00:00:47 +08:00
link89
374928e719 feat: add custom HTTP Email provider (#2542)
* feat: implement Custom HTTP Email provider

* Update Setting.js

* Update ProviderEditPage.js

* Update http.go

* Update provider.go

---------

Co-authored-by: hsluoyz <hsluoyz@qq.com>
2023-12-14 22:35:25 +08:00
Yang Luo
5c103e8cd3 Improve error handling in GenerateIdForNewUser() 2023-12-14 10:12:00 +08:00
Lars Lehtonen
85b86e8831 fix: dropped object group errors (#2545) 2023-12-14 09:00:25 +08:00
Yang Luo
08864686f3 feat: fix Google cloud storage provider bug 2023-12-14 00:25:50 +08:00
HGZ-20
dc06eb9948 feat: fix secret information issue in the CAPTCHA provider code (#2531) 2023-12-11 18:01:56 +08:00
Yang Luo
b068202e74 Improve Radius username handling 2023-12-11 18:01:28 +08:00
Satinder Singh
cb16567c7b feat: helm support extra containers (#2530) 2023-12-10 14:41:56 +08:00
Yang Luo
4eb725d47a Improve image upload UI 2023-12-08 19:42:20 +08:00
Yang Luo
ce72a172b0 feat: add back Custom HTTP SMS provider 2023-12-07 16:59:41 +08:00
Yang Luo
5521962e0c feat: update go-sms-sender to v0.17.0 to improve error handling 2023-12-07 14:25:21 +08:00
Yang Luo
37b8b09cc0 feat: update go-sms-sender to v0.16.0 to fix first number missing bug in AmazonSNSClient.SendMessage 2023-12-06 20:05:48 +08:00
Yang Luo
482eb61168 feat: improve StaticFilter() 2023-12-05 18:33:06 +08:00
Lars Lehtonen
8819a8697b feat: fix dropped error in stripe.go (#2525) 2023-12-05 16:02:33 +08:00
117 changed files with 3825 additions and 1524 deletions

View File

@@ -35,7 +35,7 @@ jobs:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
node-version: 18
cache: 'yarn'
cache-dependency-path: ./web/yarn.lock
- run: yarn install && CI=false yarn run build
@@ -101,7 +101,7 @@ jobs:
working-directory: ./
- uses: actions/setup-node@v3
with:
node-version: 16
node-version: 18
cache: 'yarn'
cache-dependency-path: ./web/yarn.lock
- run: yarn install
@@ -137,7 +137,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 16
node-version: 18
- name: Fetch Previous version
id: get-previous-tag

40
.github/workflows/helm.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: Helm Release
on:
push:
branches:
- master
paths:
- 'manifests/casdoor/Chart.yaml'
jobs:
release-helm-chart:
name: Release Helm Chart
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Helm
uses: azure/setup-helm@v3
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Release Helm Chart
run: |
cd manifests/casdoor
REGISTRY=oci://registry-1.docker.io/casbin
helm package .
PKG_NAME=$(ls *.tgz)
helm repo index . --url $REGISTRY --merge index.yaml
helm push $PKG_NAME $REGISTRY
rm $PKG_NAME
- name: Commit updated helm index.yaml
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: 'ci: update helm index.yaml'

View File

@@ -1,10 +1,10 @@
FROM node:16.18.0 AS FRONT
FROM node:18.19.0 AS FRONT
WORKDIR /web
COPY ./web .
RUN yarn install --frozen-lockfile --network-timeout 1000000 && yarn run build
FROM golang:1.19.9 AS BACK
FROM golang:1.20.12 AS BACK
WORKDIR /go/src/casdoor
COPY . .
RUN ./build.sh

View File

@@ -42,6 +42,20 @@
</a>
</p>
<p align="center">
<sup>Sponsored by</sup>
<br>
<a href="https://stytch.com/docs?utm_source=oss-sponsorship&utm_medium=paid_sponsorship&utm_campaign=casbin">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://cdn.casbin.org/img/stytch-white.png">
<source media="(prefers-color-scheme: light)" srcset="https://cdn.casbin.org/img/stytch-charcoal.png">
<img src="https://cdn.casbin.org/img/stytch-charcoal.png" width="275">
</picture>
</a><br/>
<a href="https://stytch.com/docs?utm_source=oss-sponsorship&utm_medium=paid_sponsorship&utm_campaign=casbin"><b>Build auth with fraud prevention, faster.</b><br/> Try Stytch for API-first authentication, user & org management, multi-tenant SSO, MFA, device fingerprinting, and more.</a>
<br>
</p>
## Online demo
- Read-only site: https://door.casdoor.com (any modification operation will fail)

View File

@@ -92,6 +92,9 @@ p, *, *, GET, /api/get-plan, *, *
p, *, *, GET, /api/get-subscription, *, *
p, *, *, GET, /api/get-provider, *, *
p, *, *, GET, /api/get-organization-names, *, *
p, *, *, GET, /api/get-all-objects, *, *
p, *, *, GET, /api/get-all-actions, *, *
p, *, *, GET, /api/get-all-roles, *, *
`
sa := stringadapter.NewAdapter(ruleText)

View File

@@ -238,7 +238,7 @@ func (c *ApiController) Signup() {
// @Param post_logout_redirect_uri query string false "post_logout_redirect_uri"
// @Param state query string false "state"
// @Success 200 {object} controllers.Response The Response object
// @router /logout [get,post]
// @router /logout [post]
func (c *ApiController) Logout() {
// https://openid.net/specs/openid-connect-rpinitiated-1_0-final.html
accessToken := c.Input().Get("id_token_hint")
@@ -454,6 +454,7 @@ func (c *ApiController) GetUserinfo2() {
// @Tag Login API
// @Title GetCaptcha
// @router /api/get-captcha [get]
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) GetCaptcha() {
applicationId := c.Input().Get("applicationId")
isCurrentProvider := c.Input().Get("isCurrentProvider")
@@ -479,7 +480,7 @@ func (c *ApiController) GetCaptcha() {
Type: captchaProvider.Type,
SubType: captchaProvider.SubType,
ClientId: captchaProvider.ClientId,
ClientSecret: captchaProvider.ClientSecret,
ClientSecret: "***",
ClientId2: captchaProvider.ClientId2,
ClientSecret2: captchaProvider.ClientSecret2,
})

View File

@@ -110,6 +110,14 @@ func (c *ApiController) GetApplication() {
}
}
// 0 as an initialization value, corresponding to the default configuration parameters
if application.FailedSigninLimit == 0 {
application.FailedSigninLimit = object.DefaultFailedSigninLimit
}
if application.FailedSigninfrozenTime == 0 {
application.FailedSigninfrozenTime = object.DefaultFailedSigninfrozenTime
}
c.ResponseOk(object.GetMaskedApplication(application, userId))
}

View File

@@ -387,6 +387,16 @@ func (c *ApiController) Login() {
c.ResponseError(err.Error())
return
} else if enableCaptcha {
captchaProvider, err := object.GetCaptchaProviderByApplication(util.GetId(application.Owner, application.Name), "false", c.GetAcceptLanguage())
if err != nil {
c.ResponseError(err.Error())
return
}
if captchaProvider.Type != "Default" {
authForm.ClientSecret = captchaProvider.ClientSecret
}
var isHuman bool
isHuman, err = captcha.VerifyCaptchaByCaptchaType(authForm.CaptchaType, authForm.CaptchaToken, authForm.ClientSecret)
if err != nil {
@@ -877,6 +887,7 @@ func (c *ApiController) HandleSamlLogin() {
// @Tag HandleOfficialAccountEvent API
// @Title HandleOfficialAccountEvent
// @router /api/webhook [POST]
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) HandleOfficialAccountEvent() {
respBytes, err := ioutil.ReadAll(c.Ctx.Request.Body)
if err != nil {
@@ -907,6 +918,7 @@ func (c *ApiController) HandleOfficialAccountEvent() {
// @Tag GetWebhookEventType API
// @Title GetWebhookEventType
// @router /api/get-webhook-event [GET]
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) GetWebhookEventType() {
lock.Lock()
defer lock.Unlock()
@@ -936,8 +948,14 @@ func (c *ApiController) GetCaptchaStatus() {
return
}
failedSigninLimit, _, err := object.GetFailedSigninConfigByUser(user)
if err != nil {
c.ResponseError(err.Error())
return
}
var captchaEnabled bool
if user != nil && user.SigninWrongTimes >= object.SigninWrongTimesLimit {
if user != nil && user.SigninWrongTimes >= failedSigninLimit {
captchaEnabled = true
}
c.ResponseOk(captchaEnabled)
@@ -948,6 +966,7 @@ func (c *ApiController) GetCaptchaStatus() {
// @Tag Callback API
// @Description Get Login Error Counts
// @router /api/Callback [post]
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) Callback() {
code := c.GetString("code")
state := c.GetString("state")

View File

@@ -16,6 +16,7 @@ package controllers
import (
"encoding/json"
"fmt"
"github.com/casdoor/casdoor/object"
"github.com/casdoor/casdoor/util"
@@ -56,13 +57,19 @@ func (c *ApiController) Enforce() {
return
}
res, err := enforcer.Enforce(request...)
res := []bool{}
keyRes := []string{}
enforceResult, err := enforcer.Enforce(request...)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(res)
res = append(res, enforceResult)
keyRes = append(keyRes, enforcer.GetModelAndAdapter())
c.ResponseOk(res, keyRes)
return
}
@@ -72,22 +79,24 @@ func (c *ApiController) Enforce() {
c.ResponseError(err.Error())
return
}
res := []bool{}
if permission == nil {
res = append(res, false)
} else {
enforceResult, err := object.Enforce(permission, &request)
if err != nil {
c.ResponseError(err.Error())
return
}
res = append(res, enforceResult)
c.ResponseError(fmt.Sprintf("permission: %s doesn't exist", permissionId))
return
}
c.ResponseOk(res)
res := []bool{}
keyRes := []string{}
enforceResult, err := object.Enforce(permission, &request)
if err != nil {
c.ResponseError(err.Error())
return
}
res = append(res, enforceResult)
keyRes = append(keyRes, permission.GetModelAndAdapter())
c.ResponseOk(res, keyRes)
return
}
@@ -111,9 +120,9 @@ func (c *ApiController) Enforce() {
}
res := []bool{}
keyRes := []string{}
listPermissionIdMap := object.GroupPermissionsByModelAdapter(permissions)
for _, permissionIds := range listPermissionIdMap {
for key, permissionIds := range listPermissionIdMap {
firstPermission, err := object.GetPermission(permissionIds[0])
if err != nil {
c.ResponseError(err.Error())
@@ -127,9 +136,10 @@ func (c *ApiController) Enforce() {
}
res = append(res, enforceResult)
keyRes = append(keyRes, key)
}
c.ResponseOk(res)
c.ResponseOk(res, keyRes)
}
// BatchEnforce
@@ -160,13 +170,19 @@ func (c *ApiController) BatchEnforce() {
return
}
res, err := enforcer.BatchEnforce(requests)
res := [][]bool{}
keyRes := []string{}
enforceResult, err := enforcer.BatchEnforce(requests)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(res)
res = append(res, enforceResult)
keyRes = append(keyRes, enforcer.GetModelAndAdapter())
c.ResponseOk(res, keyRes)
return
}
@@ -176,28 +192,24 @@ func (c *ApiController) BatchEnforce() {
c.ResponseError(err.Error())
return
}
res := [][]bool{}
if permission == nil {
l := len(requests)
resRequest := make([]bool, l)
for i := 0; i < l; i++ {
resRequest[i] = false
}
res = append(res, resRequest)
} else {
enforceResult, err := object.BatchEnforce(permission, &requests)
if err != nil {
c.ResponseError(err.Error())
return
}
res = append(res, enforceResult)
c.ResponseError(fmt.Sprintf("permission: %s doesn't exist", permissionId))
return
}
c.ResponseOk(res)
res := [][]bool{}
keyRes := []string{}
enforceResult, err := object.BatchEnforce(permission, &requests)
if err != nil {
c.ResponseError(err.Error())
return
}
res = append(res, enforceResult)
keyRes = append(keyRes, permission.GetModelAndAdapter())
c.ResponseOk(res, keyRes)
return
}
@@ -215,7 +227,7 @@ func (c *ApiController) BatchEnforce() {
}
res := [][]bool{}
keyRes := []string{}
listPermissionIdMap := object.GroupPermissionsByModelAdapter(permissions)
for _, permissionIds := range listPermissionIdMap {
firstPermission, err := object.GetPermission(permissionIds[0])
@@ -231,9 +243,10 @@ func (c *ApiController) BatchEnforce() {
}
res = append(res, enforceResult)
keyRes = append(keyRes, firstPermission.GetModelAndAdapter())
}
c.ResponseOk(res)
c.ResponseOk(res, keyRes)
}
func (c *ApiController) GetAllObjects() {

View File

@@ -71,7 +71,7 @@ func (c *ApiController) GetEnforcers() {
// @Tag Enforcer API
// @Description get enforcer
// @Param id query string true "The id ( owner/name ) of enforcer"
// @Success 200 {object} object
// @Success 200 {object} object.Enforcer
// @router /get-enforcer [get]
func (c *ApiController) GetEnforcer() {
id := c.Input().Get("id")
@@ -99,7 +99,7 @@ func (c *ApiController) GetEnforcer() {
// @Description update enforcer
// @Param id query string true "The id ( owner/name ) of enforcer"
// @Param enforcer body object true "The enforcer object"
// @Success 200 {object} object
// @Success 200 {object} object.Enforcer
// @router /update-enforcer [post]
func (c *ApiController) UpdateEnforcer() {
id := c.Input().Get("id")
@@ -120,7 +120,7 @@ func (c *ApiController) UpdateEnforcer() {
// @Tag Enforcer API
// @Description add enforcer
// @Param enforcer body object true "The enforcer object"
// @Success 200 {object} object
// @Success 200 {object} object.Enforcer
// @router /add-enforcer [post]
func (c *ApiController) AddEnforcer() {
enforcer := object.Enforcer{}
@@ -139,7 +139,7 @@ func (c *ApiController) AddEnforcer() {
// @Tag Enforcer API
// @Description delete enforcer
// @Param body body object.Enforce true "The enforcer object"
// @Success 200 {object} object
// @Success 200 {object} object.Enforcer
// @router /delete-enforcer [post]
func (c *ApiController) DeleteEnforcer() {
var enforcer object.Enforcer

View File

@@ -26,8 +26,10 @@ type LinkForm struct {
}
// Unlink ...
// @router /unlink [post]
// @Tag Login API
// @Title Unlink
// @router /unlink [post]
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) Unlink() {
user, ok := c.RequireSignedInUser()
if !ok {

View File

@@ -510,6 +510,7 @@ func (c *ApiController) SetPassword() {
// @Title CheckUserPassword
// @router /check-user-password [post]
// @Tag User API
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) CheckUserPassword() {
var user object.User
err := json.Unmarshal(c.Ctx.Input.RequestBody, &user)
@@ -580,6 +581,7 @@ func (c *ApiController) GetUserCount() {
// @Title AddUserKeys
// @router /add-user-keys [post]
// @Tag User API
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) AddUserKeys() {
var user object.User
err := json.Unmarshal(c.Ctx.Input.RequestBody, &user)

View File

@@ -39,6 +39,7 @@ const (
// @Title SendVerificationCode
// @Tag Verification API
// @router /send-verification-code [post]
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) SendVerificationCode() {
var vform form.VerificationForm
err := c.ParseForm(&vform)
@@ -53,17 +54,34 @@ func (c *ApiController) SendVerificationCode() {
return
}
if vform.CaptchaType != "none" {
if captchaProvider := captcha.GetCaptchaProvider(vform.CaptchaType); captchaProvider == nil {
c.ResponseError(c.T("general:don't support captchaProvider: ") + vform.CaptchaType)
return
} else if isHuman, err := captchaProvider.VerifyCaptcha(vform.CaptchaToken, vform.ClientSecret); err != nil {
c.ResponseError(err.Error())
return
} else if !isHuman {
provider, err := object.GetCaptchaProviderByApplication(vform.ApplicationId, "false", c.GetAcceptLanguage())
if err != nil {
c.ResponseError(err.Error())
return
}
if provider != nil {
if vform.CaptchaType != provider.Type {
c.ResponseError(c.T("verification:Turing test failed."))
return
}
if provider.Type != "Default" {
vform.ClientSecret = provider.ClientSecret
}
if vform.CaptchaType != "none" {
if captchaProvider := captcha.GetCaptchaProvider(vform.CaptchaType); captchaProvider == nil {
c.ResponseError(c.T("general:don't support captchaProvider: ") + vform.CaptchaType)
return
} else if isHuman, err := captchaProvider.VerifyCaptcha(vform.CaptchaToken, vform.ClientSecret); err != nil {
c.ResponseError(err.Error())
return
} else if !isHuman {
c.ResponseError(c.T("verification:Turing test failed."))
return
}
}
}
application, err := object.GetApplication(vform.ApplicationId)
@@ -212,6 +230,7 @@ func (c *ApiController) SendVerificationCode() {
// @Title VerifyCaptcha
// @Tag Verification API
// @router /verify-captcha [post]
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) VerifyCaptcha() {
var vform form.VerificationForm
err := c.ParseForm(&vform)
@@ -225,6 +244,16 @@ func (c *ApiController) VerifyCaptcha() {
return
}
captchaProvider, err := object.GetCaptchaProviderByOwnerName(vform.ApplicationId, c.GetAcceptLanguage())
if err != nil {
c.ResponseError(err.Error())
return
}
if captchaProvider.Type != "Default" {
vform.ClientSecret = captchaProvider.ClientSecret
}
provider := captcha.GetCaptchaProvider(vform.CaptchaType)
if provider == nil {
c.ResponseError(c.T("verification:Invalid captcha provider."))
@@ -244,6 +273,7 @@ func (c *ApiController) VerifyCaptcha() {
// @Tag Account API
// @Title ResetEmailOrPhone
// @router /api/reset-email-or-phone [post]
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) ResetEmailOrPhone() {
user, ok := c.RequireSignedInUser()
if !ok {
@@ -338,6 +368,7 @@ func (c *ApiController) ResetEmailOrPhone() {
// @Tag Verification API
// @Title VerifyCode
// @router /api/verify-code [post]
// @Success 200 {object} object.Userinfo The Response object
func (c *ApiController) VerifyCode() {
var authForm form.AuthForm
err := json.Unmarshal(c.Ctx.Input.RequestBody, &authForm)

View File

@@ -146,7 +146,7 @@ func (c *ApiController) WebAuthnSigninBegin() {
}
// WebAuthnSigninFinish
// @Title WebAuthnSigninBegin
// @Title WebAuthnSigninFinish
// @Tag Login API
// @Description WebAuthn Login Flow 2nd stage
// @Param body body protocol.CredentialAssertionResponse true "authenticator assertion Response"

82
email/custom_http.go Normal file
View File

@@ -0,0 +1,82 @@
// Copyright 2023 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 email
import (
"fmt"
"net/http"
"net/url"
"strings"
"github.com/casdoor/casdoor/proxy"
)
type HttpEmailProvider struct {
endpoint string
method string
}
func NewHttpEmailProvider(endpoint string, method string) *HttpEmailProvider {
client := &HttpEmailProvider{
endpoint: endpoint,
method: method,
}
return client
}
func (c *HttpEmailProvider) Send(fromAddress string, fromName string, toAddress string, subject string, content string) error {
var req *http.Request
var err error
if c.method == "POST" {
formValues := url.Values{}
formValues.Set("fromName", fromName)
formValues.Set("toAddress", toAddress)
formValues.Set("subject", subject)
formValues.Set("content", content)
req, err = http.NewRequest(c.method, c.endpoint, strings.NewReader(formValues.Encode()))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
} else if c.method == "GET" {
req, err = http.NewRequest(c.method, c.endpoint, nil)
if err != nil {
return err
}
q := req.URL.Query()
q.Add("fromName", fromName)
q.Add("toAddress", toAddress)
q.Add("subject", subject)
q.Add("content", content)
req.URL.RawQuery = q.Encode()
} else {
return fmt.Errorf("HttpEmailProvider's Send() error, unsupported method: %s", c.method)
}
httpClient := proxy.DefaultHttpClient
resp, err := httpClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("HttpEmailProvider's Send() error, custom HTTP Email request failed with status: %s", resp.Status)
}
return err
}

View File

@@ -18,9 +18,11 @@ type EmailProvider interface {
Send(fromAddress string, fromName, toAddress string, subject string, content string) error
}
func GetEmailProvider(typ string, clientId string, clientSecret string, host string, port int, disableSsl bool) EmailProvider {
func GetEmailProvider(typ string, clientId string, clientSecret string, host string, port int, disableSsl bool, endpoint string, method string) EmailProvider {
if typ == "Azure ACS" {
return NewAzureACSEmailProvider(clientSecret, host)
} else if typ == "Custom HTTP Email" {
return NewHttpEmailProvider(endpoint, method)
} else {
return NewSmtpEmailProvider(clientId, clientSecret, host, port, typ, disableSsl)
}

24
go.mod
View File

@@ -4,17 +4,15 @@ go 1.16
require (
github.com/Masterminds/squirrel v1.5.3
github.com/RobotsAndPencils/go-saml v0.0.0-20170520135329-fb13cb52a46b
github.com/alexedwards/argon2id v0.0.0-20211130144151-3585854a6387
github.com/aws/aws-sdk-go v1.45.5
github.com/beego/beego v1.12.12
github.com/beevik/etree v1.1.0
github.com/casbin/casbin v1.9.1 // indirect
github.com/casbin/casbin/v2 v2.77.2
github.com/casdoor/go-sms-sender v0.15.0
github.com/casdoor/go-sms-sender v0.19.0
github.com/casdoor/gomail/v2 v2.0.1
github.com/casdoor/notify v0.45.0
github.com/casdoor/oss v1.3.0
github.com/casdoor/oss v1.4.1
github.com/casdoor/xorm-adapter/v3 v3.1.0
github.com/casvisor/casvisor-go-sdk v1.0.3
github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f
@@ -23,6 +21,7 @@ require (
github.com/elimity-com/scim v0.0.0-20230426070224-941a5eac92f3
github.com/fogleman/gg v1.3.0
github.com/forestmgy/ldapserver v1.1.0
github.com/go-asn1-ber/asn1-ber v1.5.5
github.com/go-git/go-git/v5 v5.6.0
github.com/go-ldap/ldap/v3 v3.4.6
github.com/go-mysql-org/go-mysql v1.7.0
@@ -31,19 +30,17 @@ 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.3.1
github.com/json-iterator/go v1.1.12 // indirect
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
github.com/google/uuid v1.4.0
github.com/json-iterator/go v1.1.12
github.com/lestrrat-go/jwx v1.2.21
github.com/lib/pq v1.10.9
github.com/lor00x/goldap v0.0.0-20180618054307-a546dffdd1a3
github.com/markbates/goth v1.75.2
github.com/mitchellh/mapstructure v1.5.0
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect
github.com/nyaruka/phonenumbers v1.1.5
github.com/pquerna/otp v1.4.0
github.com/prometheus/client_golang v1.11.1
github.com/prometheus/client_model v0.3.0
github.com/prometheus/client_model v0.4.0
github.com/qiangmzsx/string-adapter/v2 v2.1.0
github.com/robfig/cron/v3 v3.0.1
github.com/russellhaering/gosaml2 v0.9.0
@@ -62,11 +59,10 @@ require (
github.com/xorm-io/core v0.7.4
github.com/xorm-io/xorm v1.1.6
github.com/yusufpapurcu/wmi v1.2.2 // indirect
golang.org/x/crypto v0.13.0
golang.org/x/net v0.14.0
golang.org/x/oauth2 v0.11.0
golang.org/x/text v0.13.0 // indirect
google.golang.org/api v0.138.0
golang.org/x/crypto v0.14.0
golang.org/x/net v0.17.0
golang.org/x/oauth2 v0.13.0
google.golang.org/api v0.150.0
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/square/go-jose.v2 v2.6.0
layeh.com/radius v0.0.0-20221205141417-e7fbddd11d68

295
go.sum

File diff suppressed because it is too large Load Diff

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "Der Anbieter: %s ist nicht für die Anwendung aktiviert",
"Unauthorized operation": "Nicht autorisierte Operation",
"Unknown authentication type (not password or provider), form = %s": "Unbekannter Authentifizierungstyp (nicht Passwort oder Anbieter), Formular = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s und %s stimmen nicht überein"
@@ -33,11 +34,12 @@
"Email is invalid": "E-Mail ist ungültig",
"Empty username.": "Leerer Benutzername.",
"FirstName cannot be blank": "Vorname darf nicht leer sein",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "Ldap Benutzername oder Passwort falsch",
"LastName cannot be blank": "Nachname darf nicht leer sein",
"Multiple accounts with same uid, please check your ldap server": "Mehrere Konten mit derselben uid, bitte überprüfen Sie Ihren LDAP-Server",
"Organization does not exist": "Organisation existiert nicht",
"Password must have at least 6 characters": "Das Passwort muss mindestens 6 Zeichen enthalten",
"Phone already exists": "Telefon existiert bereits",
"Phone cannot be empty": "Das Telefon darf nicht leer sein",
"Phone number is invalid": "Die Telefonnummer ist ungültig",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "El proveedor: %s no está habilitado para la aplicación",
"Unauthorized operation": "Operación no autorizada",
"Unknown authentication type (not password or provider), form = %s": "Tipo de autenticación desconocido (no es contraseña o proveedor), formulario = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Los servicios %s y %s no coinciden"
@@ -33,11 +34,12 @@
"Email is invalid": "El correo electrónico no es válido",
"Empty username.": "Nombre de usuario vacío.",
"FirstName cannot be blank": "El nombre no puede estar en blanco",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "Nombre de usuario o contraseña de Ldap incorrectos",
"LastName cannot be blank": "El apellido no puede estar en blanco",
"Multiple accounts with same uid, please check your ldap server": "Cuentas múltiples con el mismo uid, por favor revise su servidor ldap",
"Organization does not exist": "La organización no existe",
"Password must have at least 6 characters": "La contraseña debe tener al menos 6 caracteres",
"Phone already exists": "El teléfono ya existe",
"Phone cannot be empty": "Teléfono no puede estar vacío",
"Phone number is invalid": "El número de teléfono no es válido",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "Le fournisseur :%s n'est pas activé pour l'application",
"Unauthorized operation": "Opération non autorisée",
"Unknown authentication type (not password or provider), form = %s": "Type d'authentification inconnu (pas de mot de passe ou de fournisseur), formulaire = %s",
"User's tag: %s is not listed in the application's tags": "Le tag de lutilisateur %s nest pas répertorié dans les tags de lapplication"
"User's tag: %s is not listed in the application's tags": "Le tag de lutilisateur %s nest pas répertorié dans les tags de lapplication",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Les services %s et %s ne correspondent pas"
@@ -33,11 +34,12 @@
"Email is invalid": "L'adresse e-mail est invalide",
"Empty username.": "Nom d'utilisateur vide.",
"FirstName cannot be blank": "Le prénom ne peut pas être laissé vide",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "Nom d'utilisateur ou mot de passe LDAP incorrect",
"LastName cannot be blank": "Le nom de famille ne peut pas être vide",
"Multiple accounts with same uid, please check your ldap server": "Plusieurs comptes avec le même identifiant d'utilisateur, veuillez vérifier votre serveur LDAP",
"Organization does not exist": "L'organisation n'existe pas",
"Password must have at least 6 characters": "Le mot de passe doit comporter au moins 6 caractères",
"Phone already exists": "Le téléphone existe déjà",
"Phone cannot be empty": "Le téléphone ne peut pas être vide",
"Phone number is invalid": "Le numéro de téléphone est invalide",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "Penyedia: %s tidak diaktifkan untuk aplikasi ini",
"Unauthorized operation": "Operasi tidak sah",
"Unknown authentication type (not password or provider), form = %s": "Jenis otentikasi tidak diketahui (bukan kata sandi atau pemberi), formulir = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Layanan %s dan %s tidak cocok"
@@ -33,11 +34,12 @@
"Email is invalid": "Email tidak valid",
"Empty username.": "Nama pengguna kosong.",
"FirstName cannot be blank": "Nama depan tidak boleh kosong",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "Nama pengguna atau kata sandi Ldap salah",
"LastName cannot be blank": "Nama belakang tidak boleh kosong",
"Multiple accounts with same uid, please check your ldap server": "Beberapa akun dengan uid yang sama, harap periksa server ldap Anda",
"Organization does not exist": "Organisasi tidak ada",
"Password must have at least 6 characters": "Kata sandi harus memiliki minimal 6 karakter",
"Phone already exists": "Telepon sudah ada",
"Phone cannot be empty": "Telepon tidak boleh kosong",
"Phone number is invalid": "Nomor telepon tidak valid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "プロバイダー:%sはアプリケーションでは有効化されていません",
"Unauthorized operation": "不正操作",
"Unknown authentication type (not password or provider), form = %s": "不明な認証タイプ(パスワードまたはプロバイダーではない)フォーム=%s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "サービス%sと%sは一致しません"
@@ -33,11 +34,12 @@
"Email is invalid": "電子メールは無効です",
"Empty username.": "空のユーザー名。",
"FirstName cannot be blank": "ファーストネームは空白にできません",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "Ldapのユーザー名またはパスワードが間違っています",
"LastName cannot be blank": "姓は空白にできません",
"Multiple accounts with same uid, please check your ldap server": "同じuidを持つ複数のアカウントがあります。あなたのLDAPサーバーを確認してください",
"Organization does not exist": "組織は存在しません",
"Password must have at least 6 characters": "パスワードは少なくとも6つの文字が必要です",
"Phone already exists": "電話はすでに存在しています",
"Phone cannot be empty": "電話は空っぽにできません",
"Phone number is invalid": "電話番号が無効です",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "제공자 %s은(는) 응용 프로그램에서 활성화되어 있지 않습니다",
"Unauthorized operation": "무단 조작",
"Unknown authentication type (not password or provider), form = %s": "알 수 없는 인증 유형(암호 또는 공급자가 아님), 폼 = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "서비스 %s와 %s는 일치하지 않습니다"
@@ -33,11 +34,12 @@
"Email is invalid": "이메일이 유효하지 않습니다",
"Empty username.": "빈 사용자 이름.",
"FirstName cannot be blank": "이름은 공백일 수 없습니다",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP 사용자 이름 또는 암호가 잘못되었습니다",
"LastName cannot be blank": "성은 비어 있을 수 없습니다",
"Multiple accounts with same uid, please check your ldap server": "동일한 UID를 가진 여러 계정이 있습니다. LDAP 서버를 확인해주세요",
"Organization does not exist": "조직은 존재하지 않습니다",
"Password must have at least 6 characters": "암호는 적어도 6자 이상이어야 합니다",
"Phone already exists": "전화기는 이미 존재합니다",
"Phone cannot be empty": "전화는 비워 둘 수 없습니다",
"Phone number is invalid": "전화번호가 유효하지 않습니다",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "Провайдер: %s не включен для приложения",
"Unauthorized operation": "Несанкционированная операция",
"Unknown authentication type (not password or provider), form = %s": "Неизвестный тип аутентификации (не пароль и не провайдер), форма = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Сервисы %s и %s не совпадают"
@@ -33,11 +34,12 @@
"Email is invalid": "Адрес электронной почты недействительный",
"Empty username.": "Пустое имя пользователя.",
"FirstName cannot be blank": "Имя не может быть пустым",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "Неправильное имя пользователя или пароль Ldap",
"LastName cannot be blank": "Фамилия не может быть пустой",
"Multiple accounts with same uid, please check your ldap server": "Множественные учетные записи с тем же UID. Пожалуйста, проверьте свой сервер LDAP",
"Organization does not exist": "Организация не существует",
"Password must have at least 6 characters": "Пароль должен содержать не менее 6 символов",
"Phone already exists": "Телефон уже существует",
"Phone cannot be empty": "Телефон не может быть пустым",
"Phone number is invalid": "Номер телефона является недействительным",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",
"Unknown authentication type (not password or provider), form = %s": "Unknown authentication type (not password or provider), form = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Service %s and %s do not match"
@@ -33,11 +34,12 @@
"Email is invalid": "Email is invalid",
"Empty username.": "Empty username.",
"FirstName cannot be blank": "FirstName cannot be blank",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP user name or password incorrect",
"LastName cannot be blank": "LastName cannot be blank",
"Multiple accounts with same uid, please check your ldap server": "Multiple accounts with same uid, please check your ldap server",
"Organization does not exist": "Organization does not exist",
"Password must have at least 6 characters": "Password must have at least 6 characters",
"Phone already exists": "Phone already exists",
"Phone cannot be empty": "Phone cannot be empty",
"Phone number is invalid": "Phone number is invalid",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "Nhà cung cấp: %s không được kích hoạt cho ứng dụng",
"Unauthorized operation": "Hoạt động không được ủy quyền",
"Unknown authentication type (not password or provider), form = %s": "Loại xác thực không xác định (không phải mật khẩu hoặc nhà cung cấp), biểu mẫu = %s",
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags"
"User's tag: %s is not listed in the application's tags": "User's tag: %s is not listed in the application's tags",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "Dịch sang tiếng Việt: Dịch vụ %s và %s không khớp"
@@ -33,11 +34,12 @@
"Email is invalid": "Địa chỉ email không hợp lệ",
"Empty username.": "Tên đăng nhập trống.",
"FirstName cannot be blank": "Tên không được để trống",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "Tên người dùng hoặc mật khẩu Ldap không chính xác",
"LastName cannot be blank": "Họ không thể để trống",
"Multiple accounts with same uid, please check your ldap server": "Nhiều tài khoản với cùng một uid, vui lòng kiểm tra máy chủ ldap của bạn",
"Organization does not exist": "Tổ chức không tồn tại",
"Password must have at least 6 characters": "Mật khẩu phải ít nhất 6 ký tự",
"Phone already exists": "Điện thoại đã tồn tại",
"Phone cannot be empty": "Điện thoại không thể để trống",
"Phone number is invalid": "Số điện thoại không hợp lệ",

View File

@@ -19,7 +19,8 @@
"The provider: %s is not enabled for the application": "该应用的提供商: %s未被启用",
"Unauthorized operation": "未授权的操作",
"Unknown authentication type (not password or provider), form = %s": "未知的认证类型(非密码或第三方提供商):%s",
"User's tag: %s is not listed in the application's tags": "用户的标签: %s不在该应用的标签列表中"
"User's tag: %s is not listed in the application's tags": "用户的标签: %s不在该应用的标签列表中",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "paid-user %s does not have active or pending subscription and the application: %s does not have default pricing"
},
"cas": {
"Service %s and %s do not match": "服务%s与%s不匹配"
@@ -33,11 +34,12 @@
"Email is invalid": "无效邮箱",
"Empty username.": "用户名不可为空",
"FirstName cannot be blank": "名不可以为空",
"Invitation code cannot be blank": "Invitation code cannot be blank",
"Invitation code is invalid": "Invitation code is invalid",
"LDAP user name or password incorrect": "LDAP密码错误",
"LastName cannot be blank": "姓不可以为空",
"Multiple accounts with same uid, please check your ldap server": "多个帐户具有相同的uid请检查您的 LDAP 服务器",
"Organization does not exist": "组织不存在",
"Password must have at least 6 characters": "新密码至少为6位",
"Phone already exists": "该手机号已存在",
"Phone cannot be empty": "手机号不可为空",
"Phone number is invalid": "无效手机号",

View File

@@ -85,10 +85,12 @@ func (idp *AdfsIdProvider) GetToken(code string) (*oauth2.Token, error) {
payload.Set("client_id", idp.Config.ClientID)
payload.Set("client_secret", idp.Config.ClientSecret)
payload.Set("redirect_uri", idp.Config.RedirectURL)
resp, err := idp.Client.PostForm(idp.Config.Endpoint.TokenURL, payload)
if err != nil {
return nil, err
}
data, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
@@ -97,10 +99,10 @@ func (idp *AdfsIdProvider) GetToken(code string) (*oauth2.Token, error) {
pToken := &AdfsToken{}
err = json.Unmarshal(data, pToken)
if err != nil {
return nil, fmt.Errorf("fail to unmarshal token response: %s", err.Error())
return nil, err
}
if pToken.ErrMsg != "" {
return nil, fmt.Errorf("pToken.Errmsg = %s", pToken.ErrMsg)
return nil, fmt.Errorf(pToken.ErrMsg)
}
token := &oauth2.Token{

126
idp/azuread_b2c.go Normal file
View File

@@ -0,0 +1,126 @@
// Copyright 2023 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 idp
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"time"
"golang.org/x/oauth2"
)
type AzureADB2CProvider struct {
Client *http.Client
Config *oauth2.Config
Tenant string
UserFlow string
}
func NewAzureAdB2cProvider(clientId, clientSecret, redirectUrl, tenant string, userFlow string) *AzureADB2CProvider {
return &AzureADB2CProvider{
Config: &oauth2.Config{
ClientID: clientId,
ClientSecret: clientSecret,
RedirectURL: redirectUrl,
Endpoint: oauth2.Endpoint{
AuthURL: fmt.Sprintf("https://%s.b2clogin.com/%s.onmicrosoft.com/%s/oauth2/v2.0/authorize", tenant, tenant, userFlow),
TokenURL: fmt.Sprintf("https://%s.b2clogin.com/%s.onmicrosoft.com/%s/oauth2/v2.0/token", tenant, tenant, userFlow),
},
Scopes: []string{"openid", "email"},
},
Tenant: tenant,
UserFlow: userFlow,
}
}
func (p *AzureADB2CProvider) SetHttpClient(client *http.Client) {
p.Client = client
}
type AzureadB2cToken struct {
IdToken string `json:"id_token"`
TokenType string `json:"token_type"`
NotBefore int `json:"not_before"`
IdTokenExpiresIn int `json:"id_token_expires_in"`
ProfileInfo string `json:"profile_info"`
Scope string `json:"scope"`
}
func (p *AzureADB2CProvider) GetToken(code string) (*oauth2.Token, error) {
payload := url.Values{}
payload.Set("code", code)
payload.Set("grant_type", "authorization_code")
payload.Set("client_id", p.Config.ClientID)
payload.Set("client_secret", p.Config.ClientSecret)
payload.Set("redirect_uri", p.Config.RedirectURL)
resp, err := p.Client.PostForm(p.Config.Endpoint.TokenURL, payload)
if err != nil {
return nil, err
}
data, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
pToken := &AzureadB2cToken{}
err = json.Unmarshal(data, pToken)
if err != nil {
return nil, err
}
token := &oauth2.Token{
AccessToken: pToken.IdToken,
Expiry: time.Unix(time.Now().Unix()+int64(pToken.IdTokenExpiresIn), 0),
}
return token, nil
}
func (p *AzureADB2CProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
userInfoEndpoint := fmt.Sprintf("https://%s.b2clogin.com/%s.onmicrosoft.com/%s/openid/v2.0/userinfo", p.Tenant, p.Tenant, p.UserFlow)
req, err := http.NewRequest("GET", userInfoEndpoint, nil)
if err != nil {
return nil, err
}
req.Header.Add("Authorization", "Bearer "+token.AccessToken)
resp, err := p.Client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("error fetching user info: status code %d", resp.StatusCode)
}
bodyBytes, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var userInfo UserInfo
err = json.Unmarshal(bodyBytes, &userInfo)
if err != nil {
return nil, err
}
return &userInfo, nil
}

View File

@@ -91,6 +91,8 @@ func GetIdProvider(idpInfo *ProviderInfo, redirectUrl string) (IdProvider, error
return NewGitlabIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl), nil
case "ADFS":
return NewAdfsIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl, idpInfo.HostUrl), nil
case "AzureADB2C":
return NewAzureAdB2cProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl, idpInfo.HostUrl, idpInfo.AppId), nil
case "Baidu":
return NewBaiduIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl), nil
case "Alipay":

View File

@@ -104,7 +104,9 @@
}
],
"redirectUris": [""],
"expireInHours": 168
"expireInHours": 168,
"failedSigninLimit": 5,
"failedSigninfrozenTime": 15
}
],
"users": [

View File

@@ -1,5 +1,5 @@
apiVersion: v2
name: casdoor
name: casdoor-helm-charts
description: A Helm chart for Kubernetes
# A chart can be either an 'application' or a 'library' chart.
@@ -15,10 +15,10 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.0
version: 0.3.0
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "1.16.0"
appVersion: "1.18.0"

View File

@@ -59,6 +59,9 @@ spec:
volumeMounts:
- name: config-volume
mountPath: /conf
{{ if .Values.extraContainersEnabled }}
{{- .Values.extraContainers | nindent 8 }}
{{- end }}
volumes:
- name: config-volume
projected:

View File

@@ -108,3 +108,10 @@ nodeSelector: {}
tolerations: []
affinity: {}
# -- Optionally add extra sidecar containers.
extraContainersEnabled: false
extraContainers: ""
# extraContainers: |
# - name: ...
# image: ...

View File

@@ -15,10 +15,11 @@
package notification
import (
"bytes"
"context"
"fmt"
"net/http"
"net/url"
"strings"
"github.com/casdoor/casdoor/proxy"
)
@@ -39,26 +40,29 @@ func NewCustomHttpProvider(endpoint string, method string, paramName string) (*H
}
func (c *HttpNotificationClient) Send(ctx context.Context, subject string, content string) error {
var req *http.Request
var err error
httpClient := proxy.DefaultHttpClient
req, err := http.NewRequest(c.method, c.endpoint, bytes.NewBufferString(content))
if err != nil {
return err
}
if c.method == "POST" {
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.PostForm = map[string][]string{
c.paramName: {content},
formValues := url.Values{}
formValues.Set(c.paramName, content)
req, err = http.NewRequest(c.method, c.endpoint, strings.NewReader(formValues.Encode()))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
} else if c.method == "GET" {
req, err = http.NewRequest(c.method, c.endpoint, nil)
if err != nil {
return err
}
q := req.URL.Query()
q.Add(c.paramName, content)
req.URL.RawQuery = q.Encode()
}
httpClient := proxy.DefaultHttpClient
resp, err := httpClient.Do(req)
if err != nil {
return err
@@ -66,7 +70,7 @@ func (c *HttpNotificationClient) Send(ctx context.Context, subject string, conte
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("SendMessage() error, custom HTTP Notification request failed with status: %s", resp.Status)
return fmt.Errorf("HttpNotificationClient's SendMessage() error, custom HTTP Notification request failed with status: %s", resp.Status)
}
return err

View File

@@ -90,6 +90,9 @@ type Application struct {
FormOffset int `json:"formOffset"`
FormSideHtml string `xorm:"mediumtext" json:"formSideHtml"`
FormBackgroundUrl string `xorm:"varchar(200)" json:"formBackgroundUrl"`
FailedSigninLimit int `json:"failedSigninLimit"`
FailedSigninfrozenTime int `json:"failedSigninfrozenTime"`
}
func GetApplicationCount(owner, field, value string) (int64, error) {

View File

@@ -28,8 +28,9 @@ import (
)
const (
SigninWrongTimesLimit = 5
LastSignWrongTimeDuration = time.Minute * 15
DefaultFailedSigninLimit = 5
// DefaultFailedSigninfrozenTime The unit of frozen time is minutes
DefaultFailedSigninfrozenTime = 15
)
func CheckUserSignup(application *Application, organization *Organization, form *form.AuthForm, lang string) string {
@@ -143,10 +144,15 @@ func CheckUserSignup(application *Application, organization *Organization, form
}
func checkSigninErrorTimes(user *User, lang string) error {
if user.SigninWrongTimes >= SigninWrongTimesLimit {
failedSigninLimit, failedSigninfrozenTime, err := GetFailedSigninConfigByUser(user)
if err != nil {
return err
}
if user.SigninWrongTimes >= failedSigninLimit {
lastSignWrongTime, _ := time.Parse(time.RFC3339, user.LastSigninWrongTime)
passedTime := time.Now().UTC().Sub(lastSignWrongTime)
minutes := int(LastSignWrongTimeDuration.Minutes() - passedTime.Minutes())
minutes := failedSigninfrozenTime - int(passedTime.Minutes())
// deny the login if the error times is greater than the limit and the last login time is less than the duration
if minutes > 0 {
@@ -479,7 +485,14 @@ func CheckToEnableCaptcha(application *Application, organization, username strin
if err != nil {
return false, err
}
return user != nil && user.SigninWrongTimes >= SigninWrongTimesLimit, nil
var failedSigninLimit int
if application.FailedSigninLimit == 0 {
failedSigninLimit = 5
} else {
failedSigninLimit = application.FailedSigninLimit
}
return user != nil && user.SigninWrongTimes >= failedSigninLimit, nil
}
return providerItem.Rule == "Always", nil
}

View File

@@ -47,18 +47,42 @@ func resetUserSigninErrorTimes(user *User) error {
return err
}
func GetFailedSigninConfigByUser(user *User) (int, int, error) {
application, err := GetApplicationByUser(user)
if err != nil {
return 0, 0, err
}
failedSigninLimit := application.FailedSigninLimit
failedSigninfrozenTime := application.FailedSigninfrozenTime
// 0 as an initialization value, corresponding to the default configuration parameters
if failedSigninLimit == 0 {
failedSigninLimit = DefaultFailedSigninLimit
}
if failedSigninfrozenTime == 0 {
failedSigninfrozenTime = DefaultFailedSigninfrozenTime
}
return failedSigninLimit, failedSigninfrozenTime, nil
}
func recordSigninErrorInfo(user *User, lang string, options ...bool) error {
enableCaptcha := false
if len(options) > 0 {
enableCaptcha = options[0]
}
failedSigninLimit, failedSigninfrozenTime, errSignin := GetFailedSigninConfigByUser(user)
if errSignin != nil {
return errSignin
}
// increase failed login count
if user.SigninWrongTimes < SigninWrongTimesLimit {
if user.SigninWrongTimes < failedSigninLimit {
user.SigninWrongTimes++
}
if user.SigninWrongTimes >= SigninWrongTimesLimit {
if user.SigninWrongTimes >= failedSigninLimit {
// record the latest failed login time
user.LastSigninWrongTime = time.Now().UTC().Format(time.RFC3339)
}
@@ -69,7 +93,7 @@ func recordSigninErrorInfo(user *User, lang string, options ...bool) error {
return err
}
leftChances := SigninWrongTimesLimit - user.SigninWrongTimes
leftChances := failedSigninLimit - user.SigninWrongTimes
if leftChances == 0 && enableCaptcha {
return fmt.Errorf(i18n.Translate(lang, "check:password or code is incorrect"))
} else if leftChances >= 0 {
@@ -77,5 +101,5 @@ func recordSigninErrorInfo(user *User, lang string, options ...bool) error {
}
// don't show the chance error message if the user has no chance left
return fmt.Errorf(i18n.Translate(lang, "check:You have entered the wrong password or code too many times, please wait for %d minutes and try again"), int(LastSignWrongTimeDuration.Minutes()))
return fmt.Errorf(i18n.Translate(lang, "check:You have entered the wrong password or code too many times, please wait for %d minutes and try again"), failedSigninfrozenTime)
}

View File

@@ -36,7 +36,7 @@ func getDialer(provider *Provider) *gomail.Dialer {
}
func SendEmail(provider *Provider, title string, content string, dest string, sender string) error {
emailProvider := email.GetEmailProvider(provider.Type, provider.ClientId, provider.ClientSecret, provider.Host, provider.Port, provider.DisableSsl)
emailProvider := email.GetEmailProvider(provider.Type, provider.ClientId, provider.ClientSecret, provider.Host, provider.Port, provider.DisableSsl, provider.Endpoint, provider.Method)
fromAddress := provider.ClientId2
if fromAddress == "" {

View File

@@ -125,6 +125,10 @@ func (enforcer *Enforcer) GetId() string {
return fmt.Sprintf("%s/%s", enforcer.Owner, enforcer.Name)
}
func (enforcer *Enforcer) GetModelAndAdapter() string {
return util.GetId(enforcer.Model, enforcer.Adapter)
}
func (enforcer *Enforcer) InitEnforcer() error {
if enforcer.Enforcer != nil {
return nil

View File

@@ -271,7 +271,9 @@ func GetGroupUsers(groupId string) ([]*User, error) {
users := []*User{}
owner, _ := util.GetOwnerAndNameFromId(groupId)
names, err := userEnforcer.GetUserNamesByGroupName(groupId)
if err != nil {
return nil, err
}
err = ormer.Engine.Where("owner = ?", owner).In("name", names).Find(&users)
if err != nil {
return nil, err
@@ -303,6 +305,9 @@ func GroupChangeTrigger(oldName, newName string) error {
groups := []*Group{}
err = session.Where("parent_id = ?", oldName).Find(&groups)
if err != nil {
return err
}
for _, group := range groups {
group.ParentId = newName
_, err := session.ID(core.PK{group.Owner, group.Name}).Cols("parent_id").Update(group)

View File

@@ -446,9 +446,8 @@ func GetMaskedPermissions(permissions []*Permission) []*Permission {
// as the policyFilter when the enforcer load policy).
func GroupPermissionsByModelAdapter(permissions []*Permission) map[string][]string {
m := make(map[string][]string)
for _, permission := range permissions {
key := permission.Model + permission.Adapter
key := permission.GetModelAndAdapter()
permissionIds, ok := m[key]
if !ok {
m[key] = []string{permission.GetId()}
@@ -464,9 +463,17 @@ func (p *Permission) GetId() string {
return util.GetId(p.Owner, p.Name)
}
func (p *Permission) GetModelAndAdapter() string {
return util.GetId(p.Model, p.Adapter)
}
func (p *Permission) isUserHit(name string) bool {
targetOrg, targetName := util.GetOwnerAndNameFromId(name)
for _, user := range p.Users {
if user == "*" {
return true
}
userOrg, userName := util.GetOwnerAndNameFromId(user)
if userOrg == targetOrg && (userName == "*" || userName == targetName) {
return true
@@ -480,9 +487,14 @@ func (p *Permission) isRoleHit(userId string) bool {
if err != nil {
return false
}
for _, role := range p.Roles {
if role == "*" {
return true
}
for _, targetRole := range targetRoles {
if targetRole.GetId() == role {
if role == targetRole.GetId() {
return true
}
}

View File

@@ -37,7 +37,7 @@ type Provider struct {
SubType string `xorm:"varchar(100)" json:"subType"`
Method string `xorm:"varchar(100)" json:"method"`
ClientId string `xorm:"varchar(200)" json:"clientId"`
ClientSecret string `xorm:"varchar(2000)" json:"clientSecret"`
ClientSecret string `xorm:"varchar(3000)" json:"clientSecret"`
ClientId2 string `xorm:"varchar(100)" json:"clientId2"`
ClientSecret2 string `xorm:"varchar(500)" json:"clientSecret2"`
Cert string `xorm:"varchar(100)" json:"cert"`
@@ -417,7 +417,7 @@ func FromProviderToIdpInfo(ctx *context.Context, provider *Provider) *idp.Provid
providerInfo.ClientId = provider.ClientId2
providerInfo.ClientSecret = provider.ClientSecret2
}
} else if provider.Type == "AzureAD" || provider.Type == "ADFS" || provider.Type == "Okta" {
} else if provider.Type == "AzureAD" || provider.Type == "AzureADB2C" || provider.Type == "ADFS" || provider.Type == "Okta" {
providerInfo.HostUrl = provider.Domain
}

View File

@@ -9,7 +9,6 @@ import (
)
// https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/sec_usr_radatt/configuration/xe-16/sec-usr-radatt-xe-16-book/sec-rad-ov-ietf-attr.html
// https://support.huawei.com/enterprise/zh/doc/EDOC1000178159/35071f9a
type RadiusAccounting struct {
Owner string `xorm:"varchar(100) notnull pk" json:"owner"`
Name string `xorm:"varchar(100) notnull pk" json:"name"`

View File

@@ -271,6 +271,9 @@ func getRolesByUserInternal(userId string) ([]*Role, error) {
if err != nil {
return roles, err
}
if user == nil {
return nil, fmt.Errorf("The user: %s doesn't exist", userId)
}
query := ormer.Engine.Alias("r").Where("r.users like ?", fmt.Sprintf("%%%s%%", userId))
for _, group := range user.Groups {

View File

@@ -28,10 +28,10 @@ import (
"io"
"time"
"github.com/RobotsAndPencils/go-saml"
"github.com/beevik/etree"
"github.com/golang-jwt/jwt/v4"
"github.com/google/uuid"
saml "github.com/russellhaering/gosaml2"
dsig "github.com/russellhaering/goxmldsig"
)
@@ -283,15 +283,15 @@ func GetSamlResponse(application *Application, user *User, samlRequest string, h
}
}
var authnRequest saml.AuthnRequest
var authnRequest saml.AuthNRequest
err = xml.Unmarshal(buffer.Bytes(), &authnRequest)
if err != nil {
return "", "", method, fmt.Errorf("err: Failed to unmarshal AuthnRequest, please check the SAML request. %s", err.Error())
}
// verify samlRequest
if isValid := application.IsRedirectUriValid(authnRequest.Issuer.Url); !isValid {
return "", "", method, fmt.Errorf("err: Issuer URI: %s doesn't exist in the allowed Redirect URI list", authnRequest.Issuer.Url)
if isValid := application.IsRedirectUriValid(authnRequest.Issuer); !isValid {
return "", "", method, fmt.Errorf("err: Issuer URI: %s doesn't exist in the allowed Redirect URI list", authnRequest.Issuer)
}
// get certificate string
@@ -317,7 +317,7 @@ func GetSamlResponse(application *Application, user *User, samlRequest string, h
_, originBackend := getOriginFromHost(host)
// build signedResponse
samlResponse, _ := NewSamlResponse(application, user, originBackend, certificate, authnRequest.AssertionConsumerServiceURL, authnRequest.Issuer.Url, authnRequest.ID, application.RedirectUris)
samlResponse, _ := NewSamlResponse(application, user, originBackend, certificate, authnRequest.AssertionConsumerServiceURL, authnRequest.Issuer, authnRequest.ID, application.RedirectUris)
randomKeyStore := &X509Key{
PrivateKey: cert.PrivateKey,
X509Certificate: certificate,

View File

@@ -26,6 +26,8 @@ func getSmsClient(provider *Provider) (sender.SmsClient, error) {
if provider.Type == sender.HuaweiCloud || provider.Type == sender.AzureACS {
client, err = sender.NewSmsClient(provider.Type, provider.ClientId, provider.ClientSecret, provider.SignName, provider.TemplateCode, provider.ProviderUrl, provider.AppId)
} else if provider.Type == "Custom HTTP SMS" {
client, err = newHttpSmsClient(provider.Endpoint, provider.Method, provider.Title)
} else {
client, err = sender.NewSmsClient(provider.Type, provider.ClientId, provider.ClientSecret, provider.SignName, provider.TemplateCode, provider.AppId)
}

83
object/sms_custom_http.go Normal file
View File

@@ -0,0 +1,83 @@
// Copyright 2023 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 object
import (
"fmt"
"net/http"
"net/url"
"strings"
"github.com/casdoor/casdoor/proxy"
)
type HttpSmsClient struct {
endpoint string
method string
paramName string
}
func newHttpSmsClient(endpoint string, method string, paramName string) (*HttpSmsClient, error) {
client := &HttpSmsClient{
endpoint: endpoint,
method: method,
paramName: paramName,
}
return client, nil
}
func (c *HttpSmsClient) SendMessage(param map[string]string, targetPhoneNumber ...string) error {
phoneNumber := targetPhoneNumber[0]
content := param["code"]
var req *http.Request
var err error
if c.method == "POST" {
formValues := url.Values{}
formValues.Set("phoneNumber", phoneNumber)
formValues.Set(c.paramName, content)
req, err = http.NewRequest(c.method, c.endpoint, strings.NewReader(formValues.Encode()))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
} else if c.method == "GET" {
req, err = http.NewRequest(c.method, c.endpoint, nil)
if err != nil {
return err
}
q := req.URL.Query()
q.Add("phoneNumber", phoneNumber)
q.Add(c.paramName, content)
req.URL.RawQuery = q.Encode()
} else {
return fmt.Errorf("HttpSmsClient's SendMessage() error, unsupported method: %s", c.method)
}
httpClient := proxy.DefaultHttpClient
resp, err := httpClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("HttpSmsClient's SendMessage() error, custom HTTP SMS request failed with status: %s", resp.Status)
}
return err
}

View File

@@ -112,7 +112,10 @@ func getStorageProvider(provider *Provider, lang string) (oss.StorageInterface,
if provider.Domain == "" {
provider.Domain = storageProvider.GetEndpoint()
UpdateProvider(provider.GetId(), provider)
_, err := UpdateProvider(provider.GetId(), provider)
if err != nil {
return nil, err
}
}
return storageProvider, nil
@@ -126,7 +129,12 @@ func uploadFile(provider *Provider, fullFilePath string, fileBuffer *bytes.Buffe
fileUrl, objectKey := GetUploadFileUrl(provider, fullFilePath, true)
_, err = storageProvider.Put(objectKey, fileBuffer)
objectKeyRefined := objectKey
if provider.Type == "Google Cloud Storage" {
objectKeyRefined = strings.TrimPrefix(objectKeyRefined, "/")
}
_, err = storageProvider.Put(objectKeyRefined, fileBuffer)
if err != nil {
return "", "", err
}

View File

@@ -117,6 +117,7 @@ type User struct {
Infoflow string `xorm:"infoflow varchar(100)" json:"infoflow"`
Apple string `xorm:"apple varchar(100)" json:"apple"`
AzureAD string `xorm:"azuread varchar(100)" json:"azuread"`
AzureADB2c string `xorm:"azureadb2c varchar(100)" json:"azureadb2c"`
Slack string `xorm:"slack varchar(100)" json:"slack"`
Steam string `xorm:"steam varchar(100)" json:"steam"`
Bilibili string `xorm:"bilibili varchar(100)" json:"bilibili"`
@@ -622,7 +623,7 @@ func UpdateUser(id string, user *User, columns []string, isAdmin bool) (bool, er
"is_admin", "is_forbidden", "is_deleted", "hash", "is_default_avatar", "properties", "webauthnCredentials", "managedAccounts",
"signin_wrong_times", "last_signin_wrong_time", "groups", "access_key", "access_secret",
"github", "google", "qq", "wechat", "facebook", "dingtalk", "weibo", "gitee", "linkedin", "wecom", "lark", "gitlab", "adfs",
"baidu", "alipay", "casdoor", "infoflow", "apple", "azuread", "slack", "steam", "bilibili", "okta", "douyin", "line", "amazon",
"baidu", "alipay", "casdoor", "infoflow", "apple", "azuread", "azureadb2c", "slack", "steam", "bilibili", "okta", "douyin", "line", "amazon",
"auth0", "battlenet", "bitbucket", "box", "cloudfoundry", "dailymotion", "deezer", "digitalocean", "discord", "dropbox",
"eveonline", "fitbit", "gitea", "heroku", "influxcloud", "instagram", "intercom", "kakao", "lastfm", "mailru", "meetup",
"microsoftonline", "naver", "nextcloud", "onedrive", "oura", "patreon", "paypal", "salesforce", "shopify", "soundcloud",
@@ -1021,7 +1022,10 @@ func GenerateIdForNewUser(application *Application) (string, error) {
lastUserId := -1
if lastUser != nil {
lastUserId = util.ParseInt(lastUser.Id)
lastUserId, err = util.ParseIntWithError(lastUser.Id)
if err != nil {
return util.GenerateId(), nil
}
}
res := strconv.Itoa(lastUserId + 1)

View File

@@ -132,6 +132,9 @@ func (pp *StripePaymentProvider) Notify(body []byte, orderId string) (*NotifyRes
}
// Once payment is successful, the Checkout Session will contain a reference to the successful `PaymentIntent`
sIntent, err := stripeIntent.Get(sCheckout.PaymentIntent.ID, nil)
if err != nil {
return nil, err
}
var (
productName string
productDisplayName string

View File

@@ -17,15 +17,16 @@ package radius
import (
"fmt"
"log"
"strings"
"github.com/casdoor/casdoor/conf"
"github.com/casdoor/casdoor/object"
"github.com/casdoor/casdoor/util"
"layeh.com/radius"
"layeh.com/radius/rfc2865"
"layeh.com/radius/rfc2866"
)
// https://support.huawei.com/enterprise/zh/doc/EDOC1000178159/35071f9a#tab_3
func StartRadiusServer() {
secret := conf.GetConfigString("radiusSecret")
server := radius.PacketServer{
@@ -74,6 +75,11 @@ func handleAccountingRequest(w radius.ResponseWriter, r *radius.Request) {
statusType := rfc2866.AcctStatusType_Get(r.Packet)
username := rfc2865.UserName_GetString(r.Packet)
organization := rfc2865.Class_GetString(r.Packet)
if strings.Contains(username, "/") {
organization, username = util.GetOwnerAndNameFromId(username)
}
log.Printf("handleAccountingRequest() username=%v, org=%v, statusType=%v", username, organization, statusType)
w.Write(r.Response(radius.CodeAccountingResponse))
var err error

View File

@@ -129,7 +129,7 @@ func StaticFilter(ctx *context.Context) {
path += urlPath
}
if !util.FileExist(path) {
if strings.Contains(path, "/../") || !util.FileExist(path) {
path = webBuildFolder + "/index.html"
}
if !util.FileExist(path) {

View File

@@ -22,12 +22,13 @@ import (
func NewAwsS3StorageProvider(clientId string, clientSecret string, region string, bucket string, endpoint string) oss.StorageInterface {
sp := s3.New(&s3.Config{
AccessID: clientId,
AccessKey: clientSecret,
Region: region,
Bucket: bucket,
Endpoint: endpoint,
ACL: awss3.BucketCannedACLPublicRead,
AccessID: clientId,
AccessKey: clientSecret,
Region: region,
Bucket: bucket,
Endpoint: endpoint,
S3Endpoint: endpoint,
ACL: awss3.BucketCannedACLPublicRead,
})
return sp

View File

@@ -19,13 +19,15 @@ import (
"github.com/casdoor/oss/googlecloud"
)
func NewGoogleCloudStorageProvider(clientId string, clientSecret string, bucket string, endpoint string) oss.StorageInterface {
sp, _ := googlecloud.New(&googlecloud.Config{
AccessID: clientId,
AccessKey: clientSecret,
Bucket: bucket,
Endpoint: endpoint,
func NewGoogleCloudStorageProvider(clientSecret string, bucket string, endpoint string) oss.StorageInterface {
sp, err := googlecloud.New(&googlecloud.Config{
ServiceAccountJson: clientSecret,
Bucket: bucket,
Endpoint: endpoint,
})
if err != nil {
panic(err)
}
return sp
}

View File

@@ -33,7 +33,7 @@ func GetStorageProvider(providerType string, clientId string, clientSecret strin
case "Qiniu Cloud Kodo":
return NewQiniuCloudKodoStorageProvider(clientId, clientSecret, region, bucket, endpoint)
case "Google Cloud Storage":
return NewGoogleCloudStorageProvider(clientId, clientSecret, bucket, endpoint)
return NewGoogleCloudStorageProvider(clientSecret, bucket, endpoint)
}
return nil

File diff suppressed because it is too large Load Diff

View File

@@ -102,7 +102,7 @@ paths:
"200":
description: ""
schema:
$ref: '#/definitions/object'
$ref: '#/definitions/object.Enforcer'
/api/add-group:
post:
tags:
@@ -283,24 +283,6 @@ paths:
description: The Response object
schema:
$ref: '#/definitions/controllers.Response'
/api/add-record:
post:
tags:
- Record API
description: add a record
operationId: ApiController.AddRecord
parameters:
- in: body
name: body
description: The details of the record
required: true
schema:
$ref: '#/definitions/object.Record'
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/controllers.Response'
/api/add-resource:
post:
tags:
@@ -436,7 +418,12 @@ paths:
post:
tags:
- User API
operationId: ApiController.AddUserkeys
operationId: ApiController.AddUserKeys
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/add-webhook:
post:
tags:
@@ -455,11 +442,27 @@ paths:
description: The Response object
schema:
$ref: '#/definitions/controllers.Response'
/api/api/Callback:
post:
tags:
- Callback API
description: Get Login Error Counts
operationId: ApiController.Callback
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/api/get-captcha:
get:
tags:
- Login API
operationId: ApiController.GetCaptcha
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/api/get-captcha-status:
get:
tags:
@@ -482,11 +485,21 @@ paths:
tags:
- GetWebhookEventType API
operationId: ApiController.GetWebhookEventType
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/api/reset-email-or-phone:
post:
tags:
- Account API
operationId: ApiController.ResetEmailOrPhone
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/api/send-email:
post:
tags:
@@ -515,6 +528,24 @@ paths:
description: object
schema:
$ref: '#/definitions/Response'
/api/api/send-notification:
post:
tags:
- Service API
description: This API is not for Casdoor frontend to call, it is for Casdoor SDKs.
operationId: ApiController.SendNotification
parameters:
- in: body
name: from
description: Details of the notification request
required: true
schema:
$ref: '#/definitions/controllers.NotificationForm'
responses:
"200":
description: object
schema:
$ref: '#/definitions/Response'
/api/api/send-sms:
post:
tags:
@@ -548,11 +579,21 @@ paths:
tags:
- Verification API
operationId: ApiController.VerifyCode
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/api/webhook:
post:
tags:
- HandleOfficialAccountEvent API
operationId: ApiController.HandleOfficialAccountEvent
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/batch-enforce:
post:
tags:
@@ -606,6 +647,11 @@ paths:
tags:
- User API
operationId: ApiController.CheckUserPassword
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/delete-adapter:
post:
tags:
@@ -677,7 +723,7 @@ paths:
"200":
description: ""
schema:
$ref: '#/definitions/object'
$ref: '#/definitions/object.Enforcer'
/api/delete-group:
post:
tags:
@@ -1265,7 +1311,7 @@ paths:
"200":
description: ""
schema:
$ref: '#/definitions/object'
$ref: '#/definitions/object.Enforcer'
/api/get-enforcers:
get:
tags:
@@ -1285,6 +1331,19 @@ paths:
type: array
items:
$ref: '#/definitions/object.Enforcer'
/api/get-global-certs:
get:
tags:
- Cert API
description: get globle certs
operationId: ApiController.GetGlobalCerts
responses:
"200":
description: The Response object
schema:
type: array
items:
$ref: '#/definitions/object.Cert'
/api/get-global-providers:
get:
tags:
@@ -1311,19 +1370,6 @@ paths:
type: array
items:
$ref: '#/definitions/object.User'
/api/get-global-certs:
get:
tags:
- Cert API
description: get globle certs
operationId: ApiController.GetGlobalCerts
responses:
"200":
description: The Response object
schema:
type: array
items:
$ref: '#/definitions/object.Cert'
/api/get-group:
get:
tags:
@@ -1779,47 +1825,6 @@ paths:
type: array
items:
$ref: '#/definitions/object.Provider'
/api/get-records:
get:
tags:
- Record API
description: get all records
operationId: ApiController.GetRecords
parameters:
- in: query
name: pageSize
description: The size of each page
required: true
type: string
- in: query
name: p
description: The number of the page
required: true
type: string
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Record'
/api/get-records-filter:
post:
tags:
- Record API
description: get records by filter
operationId: ApiController.GetRecordsByFilter
parameters:
- in: body
name: filter
description: filter Record message
required: true
schema:
type: string
type: string
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Record'
/api/get-resource:
get:
tags:
@@ -2387,46 +2392,6 @@ paths:
description: The Response object
schema:
$ref: '#/definitions/controllers.Response'
/api/login/oauth/access_token:
post:
tags:
- Token API
description: get OAuth access token
operationId: ApiController.GetOAuthToken
parameters:
- in: query
name: grant_type
description: OAuth grant type
required: true
type: string
- in: query
name: client_id
description: OAuth client id
required: true
type: string
- in: query
name: client_secret
description: OAuth client secret
required: true
type: string
- in: query
name: code
description: OAuth code
required: true
type: string
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.TokenWrapper'
"400":
description: The Response object
schema:
$ref: '#/definitions/object.TokenError'
"401":
description: The Response object
schema:
$ref: '#/definitions/object.TokenError'
/api/login/oauth/introspect:
post:
description: The introspection endpoint is an OAuth 2.0 endpoint that takes a
@@ -2500,29 +2465,6 @@ paths:
schema:
$ref: '#/definitions/object.TokenError'
/api/logout:
get:
tags:
- Login API
description: logout the current user
operationId: ApiController.Logout
parameters:
- in: query
name: id_token_hint
description: id_token_hint
type: string
- in: query
name: post_logout_redirect_uri
description: post_logout_redirect_uri
type: string
- in: query
name: state
description: state
type: string
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/controllers.Response'
post:
tags:
- Login API
@@ -2620,6 +2562,11 @@ paths:
tags:
- Verification API
operationId: ApiController.SendVerificationCode
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/set-password:
post:
tags:
@@ -2706,6 +2653,12 @@ paths:
post:
tags:
- Login API
operationId: ApiController.Unlink
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/update-adapter:
post:
tags:
@@ -2797,7 +2750,7 @@ paths:
"200":
description: ""
schema:
$ref: '#/definitions/object'
$ref: '#/definitions/object.Enforcer'
/api/update-group:
post:
tags:
@@ -3283,6 +3236,11 @@ paths:
tags:
- Verification API
operationId: ApiController.VerifyCaptcha
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.Userinfo'
/api/webauthn/signin/begin:
get:
tags:
@@ -3310,7 +3268,7 @@ paths:
tags:
- Login API
description: WebAuthn Login Flow 2nd stage
operationId: ApiController.WebAuthnSigninBegin
operationId: ApiController.WebAuthnSigninFinish
parameters:
- in: body
name: body
@@ -3352,13 +3310,47 @@ paths:
description: '"The Response object"'
schema:
$ref: '#/definitions/controllers.Response'
/apiapi/login/oauth/access_token:
post:
tags:
- Token API
description: get OAuth access token
operationId: ApiController.GetOAuthToken
parameters:
- in: query
name: grant_type
description: OAuth grant type
required: true
type: string
- in: query
name: client_id
description: OAuth client id
required: true
type: string
- in: query
name: client_secret
description: OAuth client secret
required: true
type: string
- in: query
name: code
description: OAuth code
required: true
type: string
responses:
"200":
description: The Response object
schema:
$ref: '#/definitions/object.TokenWrapper'
"400":
description: The Response object
schema:
$ref: '#/definitions/object.TokenError'
"401":
description: The Response object
schema:
$ref: '#/definitions/object.TokenError'
definitions:
1183.0xc000639290.false:
title: "false"
type: object
1217.0xc0006392c0.false:
title: "false"
type: object
LaravelResponse:
title: LaravelResponse
type: object
@@ -3393,14 +3385,24 @@ definitions:
type: string
title:
type: string
controllers.NotificationForm:
title: NotificationForm
type: object
properties:
content:
type: string
controllers.Response:
title: Response
type: object
properties:
data:
$ref: '#/definitions/1183.0xc000639290.false'
additionalProperties:
description: support string, struct or []struct
type: string
data2:
$ref: '#/definitions/1217.0xc0006392c0.false'
additionalProperties:
description: support string, struct or []struct
type: string
msg:
type: string
name:
@@ -3430,9 +3432,6 @@ definitions:
object:
title: object
type: object
object.&{197049 0xc000a2cd50 false}:
title: '&{197049 0xc000a2cd50 false}'
type: object
object.AccountItem:
title: AccountItem
type: object
@@ -3468,10 +3467,10 @@ definitions:
format: int64
table:
type: string
tableNamePrefix:
type: string
type:
type: string
useSameDb:
type: boolean
user:
type: string
object.Application:
@@ -3482,6 +3481,8 @@ definitions:
type: string
cert:
type: string
certPublicKey:
type: string
clientId:
type: string
clientSecret:
@@ -3500,6 +3501,8 @@ definitions:
type: boolean
enablePassword:
type: boolean
enableSamlC14n10:
type: boolean
enableSamlCompress:
type: boolean
enableSignUp:
@@ -3530,6 +3533,10 @@ definitions:
type: string
homepageUrl:
type: string
invitationCodes:
type: array
items:
type: string
logo:
type: string
name:
@@ -3553,6 +3560,10 @@ definitions:
refreshExpireInHours:
type: integer
format: int64
samlAttributes:
type: array
items:
$ref: '#/definitions/object.SamlItem'
samlReplyUrl:
type: string
signinHtml:
@@ -3581,15 +3592,11 @@ definitions:
title: CasbinRequest
type: array
items:
$ref: '#/definitions/object.&{197049 0xc000a2cd50 false}'
$ref: '#/definitions/object.CasbinRequest'
object.Cert:
title: Cert
type: object
properties:
authorityPublicKey:
type: string
authorityRootPublicKey:
type: string
bitSize:
type: integer
format: int64
@@ -3905,6 +3912,8 @@ definitions:
type: string
defaultAvatar:
type: string
defaultPassword:
type: string
displayName:
type: string
enableSoftDeletion:
@@ -3922,6 +3931,8 @@ definitions:
type: string
masterPassword:
type: string
masterVerificationCode:
type: string
mfaItems:
type: array
items:
@@ -4011,6 +4022,8 @@ definitions:
type: string
state:
$ref: '#/definitions/pp.PaymentState'
successUrl:
type: string
tag:
type: string
type:
@@ -4043,6 +4056,10 @@ definitions:
type: string
effect:
type: string
groups:
type: array
items:
type: string
isEnabled:
type: boolean
model:
@@ -4091,12 +4108,17 @@ definitions:
type: string
owner:
type: string
pricePerMonth:
type: number
format: double
pricePerYear:
paymentProviders:
type: array
items:
type: string
period:
type: string
price:
type: number
format: double
product:
type: string
role:
type: string
object.Pricing:
@@ -4105,10 +4127,6 @@ definitions:
properties:
application:
type: string
approveTime:
type: string
approver:
type: string
createdTime:
type: string
description:
@@ -4125,10 +4143,6 @@ definitions:
type: array
items:
type: string
state:
type: string
submitter:
type: string
trialDuration:
type: integer
format: int64
@@ -4278,8 +4292,6 @@ definitions:
title: ProviderItem
type: object
properties:
alertType:
type: string
canSignIn:
type: boolean
canSignUp:
@@ -4296,36 +4308,7 @@ definitions:
$ref: '#/definitions/object.Provider'
rule:
type: string
object.Record:
title: Record
type: object
properties:
action:
type: string
clientIp:
type: string
createdTime:
type: string
extendedUser:
$ref: '#/definitions/object.User'
id:
type: integer
format: int64
isTriggered:
type: boolean
method:
type: string
name:
type: string
object:
type: string
organization:
type: string
owner:
type: string
requestUri:
type: string
user:
signupGroup:
type: string
object.Resource:
title: Resource
@@ -4374,6 +4357,10 @@ definitions:
type: array
items:
type: string
groups:
type: array
items:
type: string
isEnabled:
type: boolean
name:
@@ -4388,12 +4375,26 @@ definitions:
type: array
items:
type: string
object.SamlItem:
title: SamlItem
type: object
properties:
name:
type: string
nameformat:
type: string
value:
type: string
object.SignupItem:
title: SignupItem
type: object
properties:
label:
type: string
name:
type: string
placeholder:
type: string
prompted:
type: boolean
required:
@@ -4406,39 +4407,45 @@ definitions:
title: Subscription
type: object
properties:
approveTime:
type: string
approver:
type: string
createdTime:
type: string
description:
type: string
displayName:
type: string
duration:
type: integer
format: int64
endDate:
endTime:
type: string
format: datetime
isEnabled:
type: boolean
name:
type: string
owner:
type: string
payment:
type: string
period:
type: string
plan:
type: string
startDate:
pricing:
type: string
startTime:
type: string
format: datetime
state:
type: string
submitter:
type: string
$ref: '#/definitions/object.SubscriptionState'
user:
type: string
object.SubscriptionState:
title: SubscriptionState
type: string
enum:
- SubStatePending = "Pending"
- SubStateError = "Error"
- SubStateSuspended = "Suspended"
- SubStateActive = "Active"
- SubStateUpcoming = "Upcoming"
- SubStateExpired = "Expired"
example: Pending
object.Syncer:
title: Syncer
type: object
@@ -4472,6 +4479,8 @@ definitions:
port:
type: integer
format: int64
sslMode:
type: string
syncInterval:
type: integer
format: int64
@@ -4524,6 +4533,8 @@ definitions:
properties:
accessToken:
type: string
accessTokenHash:
type: string
application:
type: string
code:
@@ -4548,6 +4559,8 @@ definitions:
type: string
refreshToken:
type: string
refreshTokenHash:
type: string
scope:
type: string
tokenType:
@@ -4609,6 +4622,8 @@ definitions:
type: string
azuread:
type: string
azureadb2c:
type: string
baidu:
type: string
battlenet:
@@ -4659,6 +4674,8 @@ definitions:
type: boolean
eveonline:
type: string
externalId:
type: string
facebook:
type: string
firstName:
@@ -4894,6 +4911,8 @@ definitions:
type: string
email:
type: string
email_verified:
type: boolean
groups:
type: array
items:

View File

@@ -45,6 +45,19 @@ func ParseInt(s string) int {
return i
}
func ParseIntWithError(s string) (int, error) {
if s == "" {
return 0, fmt.Errorf("ParseIntWithError() error, empty string")
}
i, err := strconv.Atoi(s)
if err != nil {
return 0, err
}
return i, nil
}
func ParseFloat(s string) float64 {
f, err := strconv.ParseFloat(s, 64)
if err != nil {

View File

@@ -32,6 +32,7 @@
"file-saver": "^2.0.5",
"i18n-iso-countries": "^7.0.0",
"i18next": "^19.8.9",
"jwt-decode": "^4.0.0",
"libphonenumber-js": "^1.10.19",
"moment": "^2.29.1",
"qrcode.react": "^3.1.0",

View File

@@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {Button, Card, Col, ConfigProvider, Input, List, Popover, Radio, Result, Row, Select, Space, Switch, Upload} from "antd";
import {Button, Card, Col, ConfigProvider, Input, InputNumber, List, Popover, Radio, Result, Row, Select, Space, Switch, Upload} from "antd";
import {CopyOutlined, LinkOutlined, UploadOutlined} from "@ant-design/icons";
import * as ApplicationBackend from "./backend/ApplicationBackend";
import * as CertBackend from "./backend/CertBackend";
@@ -199,7 +199,7 @@ class ApplicationEditPage extends React.Component {
}
parseApplicationField(key, value) {
if (["expireInHours", "refreshExpireInHours", "offset"].includes(key)) {
if (["offset"].includes(key)) {
value = Setting.myParseInt(value);
}
return value;
@@ -394,8 +394,8 @@ class ApplicationEditPage extends React.Component {
{Setting.getLabel(i18next.t("application:Token expire"), i18next.t("application:Token expire - Tooltip"))} :
</Col>
<Col span={22} >
<Input style={{width: "150px"}} value={this.state.application.expireInHours} suffix="Hours" onChange={e => {
this.updateApplicationField("expireInHours", e.target.value);
<InputNumber style={{width: "150px"}} value={this.state.application.expireInHours} min={1} step={1} precision={0} addonAfter="Hours" onChange={value => {
this.updateApplicationField("expireInHours", value);
}} />
</Col>
</Row>
@@ -404,8 +404,28 @@ class ApplicationEditPage extends React.Component {
{Setting.getLabel(i18next.t("application:Refresh token expire"), i18next.t("application:Refresh token expire - Tooltip"))} :
</Col>
<Col span={22} >
<Input style={{width: "150px"}} value={this.state.application.refreshExpireInHours} suffix="Hours" onChange={e => {
this.updateApplicationField("refreshExpireInHours", e.target.value);
<InputNumber style={{width: "150px"}} value={this.state.application.refreshExpireInHours} min={1} step={1} precision={0} addonAfter="Hours" onChange={value => {
this.updateApplicationField("refreshExpireInHours", value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("application:Failed signin limit"), i18next.t("application:Failed signin limit - Tooltip"))} :
</Col>
<Col span={22} >
<InputNumber style={{width: "150px"}} value={this.state.application.failedSigninLimit} min={1} step={1} precision={0} addonAfter="Times" onChange={value => {
this.updateApplicationField("failedSigninLimit", value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("application:Failed signin frozen time"), i18next.t("application:Failed signin frozen time - Tooltip"))} :
</Col>
<Col span={22} >
<InputNumber style={{width: "150px"}} value={this.state.application.failedSigninfrozenTime} min={1} step={1} precision={0} addonAfter="Minutes" onChange={value => {
this.updateApplicationField("failedSigninfrozenTime", value);
}} />
</Col>
</Row>
@@ -676,7 +696,7 @@ class ApplicationEditPage extends React.Component {
<br />
<Button style={{marginBottom: "10px"}} type="primary" shape="round" icon={<CopyOutlined />} onClick={() => {
copy(`${window.location.origin}/api/saml/metadata?application=admin/${encodeURIComponent(this.state.applicationName)}`);
Setting.showMessage("success", i18next.t("application:SAML metadata URL copied to clipboard successfully"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}
>
{i18next.t("application:Copy SAML metadata URL")}
@@ -885,7 +905,7 @@ class ApplicationEditPage extends React.Component {
<Space>
<Button icon={<CopyOutlined />} onClick={() => {
copy(item.code);
Setting.showMessage("success", i18next.t("application:Invitation code copied to clipboard successfully"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}
}>
{i18next.t("general:Copy")}
@@ -939,7 +959,7 @@ class ApplicationEditPage extends React.Component {
<Col span={previewGrid}>
<Button style={{marginBottom: "10px"}} type="primary" shape="round" icon={<CopyOutlined />} onClick={() => {
copy(`${window.location.origin}${signUpUrl}`);
Setting.showMessage("success", i18next.t("application:Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}
>
{i18next.t("application:Copy signup page URL")}
@@ -971,7 +991,7 @@ class ApplicationEditPage extends React.Component {
<Col span={previewGrid}>
<Button style={{marginBottom: "10px", marginTop: Setting.isMobile() ? "15px" : "0"}} type="primary" shape="round" icon={<CopyOutlined />} onClick={() => {
copy(`${window.location.origin}${signInUrl}`);
Setting.showMessage("success", i18next.t("application:Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}
>
{i18next.t("application:Copy signin page URL")}
@@ -1004,7 +1024,7 @@ class ApplicationEditPage extends React.Component {
<Col span={previewGrid}>
<Button style={{marginBottom: "10px"}} type="primary" shape="round" icon={<CopyOutlined />} onClick={() => {
copy(`${window.location.origin}${promptUrl}`);
Setting.showMessage("success", i18next.t("application:Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}
>
{i18next.t("application:Copy prompt page URL")}

View File

@@ -230,7 +230,7 @@ class CertEditPage extends React.Component {
<Col span={editorWidth} >
<Button style={{marginRight: "10px", marginBottom: "10px"}} disabled={this.state.cert.certificate === ""} onClick={() => {
copy(this.state.cert.certificate);
Setting.showMessage("success", i18next.t("cert:Certificate copied to clipboard successfully"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}
>
{i18next.t("cert:Copy certificate")}
@@ -253,7 +253,7 @@ class CertEditPage extends React.Component {
<Col span={editorWidth} >
<Button style={{marginRight: "10px", marginBottom: "10px"}} disabled={this.state.cert.privateKey === ""} onClick={() => {
copy(this.state.cert.privateKey);
Setting.showMessage("success", i18next.t("cert:Private key copied to clipboard successfully"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}
>
{i18next.t("cert:Copy private key")}

View File

@@ -287,7 +287,7 @@ class PricingEditPage extends React.Component {
<Col>
<Button style={{marginBottom: "10px", marginTop: Setting.isMobile() ? "15px" : "0"}} type="primary" shape="round" icon={<CopyOutlined />} onClick={() => {
copy(`${window.location.origin}${pricingUrl}`);
Setting.showMessage("success", i18next.t("pricing:pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}
>
{i18next.t("pricing:Copy pricing page URL")}

View File

@@ -197,6 +197,12 @@ class ProviderEditPage extends React.Component {
} else {
return Setting.getLabel(i18next.t("provider:Client secret"), i18next.t("provider:Client secret - Tooltip"));
}
case "Storage":
if (provider.type === "Google Cloud Storage") {
return Setting.getLabel(i18next.t("provider:Service account JSON"), i18next.t("provider:Service account JSON - Tooltip"));
} else {
return Setting.getLabel(i18next.t("provider:Client secret"), i18next.t("provider:Client secret - Tooltip"));
}
case "Email":
if (provider.type === "Azure ACS") {
return Setting.getLabel(i18next.t("provider:Secret key"), i18next.t("provider:Secret key - Tooltip"));
@@ -305,6 +311,9 @@ class ProviderEditPage extends React.Component {
} else if (provider.type === "Infoflow") {
text = i18next.t("provider:Agent ID");
tooltip = i18next.t("provider:Agent ID - Tooltip");
} else if (provider.type === "AzureADB2C") {
text = i18next.t("provider:User flow");
tooltip = i18next.t("provider:User flow - Tooltip");
}
} else if (provider.category === "SMS") {
if (provider.type === "Twilio SMS" || provider.type === "Azure ACS") {
@@ -521,6 +530,13 @@ class ProviderEditPage extends React.Component {
this.updateProviderField("scopes", "openid profile email");
this.updateProviderField("customTokenUrl", "https://door.casdoor.com/api/login/oauth/access_token");
this.updateProviderField("customUserInfoUrl", "https://door.casdoor.com/api/userinfo");
} else if (value === "Custom HTTP SMS") {
this.updateProviderField("endpoint", "https://example.com/send-custom-http-sms");
this.updateProviderField("method", "GET");
this.updateProviderField("title", "code");
} else if (value === "Custom HTTP Email") {
this.updateProviderField("endpoint", "https://example.com/send-custom-http-email");
this.updateProviderField("method", "POST");
} else if (value === "Custom HTTP") {
this.updateProviderField("method", "GET");
this.updateProviderField("title", "");
@@ -668,9 +684,11 @@ class ProviderEditPage extends React.Component {
(this.state.provider.category === "Captcha" && this.state.provider.type === "Default") ||
(this.state.provider.category === "Web3") ||
(this.state.provider.category === "Storage" && this.state.provider.type === "Local File System") ||
(this.state.provider.category === "SMS" && this.state.provider.type === "Custom HTTP SMS") ||
(this.state.provider.category === "Notification" && (this.state.provider.type === "Google Chat" || this.state.provider.type === "Custom HTTP")) ? null : (
<React.Fragment>
{
(this.state.provider.category === "Storage" && this.state.provider.type === "Google Cloud Storage") ||
(this.state.provider.category === "Email" && this.state.provider.type === "Azure ACS") ||
(this.state.provider.category === "Notification" && (this.state.provider.type === "Line" || this.state.provider.type === "Telegram" || this.state.provider.type === "Bark" || this.state.provider.type === "Discord" || this.state.provider.type === "Slack" || this.state.provider.type === "Pushbullet" || this.state.provider.type === "Pushover" || this.state.provider.type === "Lark" || this.state.provider.type === "Microsoft Teams")) ? null : (
<Row style={{marginTop: "20px"}} >
@@ -743,7 +761,7 @@ class ProviderEditPage extends React.Component {
)
}
{
this.state.provider.type !== "ADFS" && this.state.provider.type !== "AzureAD" && 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.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"))} :
@@ -756,7 +774,7 @@ class ProviderEditPage extends React.Component {
</Row>
)
}
{this.state.provider.category === "Storage" ? (
{this.state.provider.category === "Storage" || ["Custom HTTP SMS", "Custom HTTP Email"].includes(this.state.provider.type) ? (
<div>
{["Local File System"].includes(this.state.provider.type) ? null : (
<Row style={{marginTop: "20px"}} >
@@ -770,7 +788,7 @@ class ProviderEditPage extends React.Component {
</Col>
</Row>
)}
{["Local File System", "MinIO", "Tencent Cloud COS", "Google Cloud Storage", "Qiniu Cloud Kodo"].includes(this.state.provider.type) ? null : (
{["Custom HTTP SMS", "Local File System", "MinIO", "Tencent Cloud COS", "Google Cloud Storage", "Qiniu Cloud Kodo"].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"))} :
@@ -782,7 +800,7 @@ class ProviderEditPage extends React.Component {
</Col>
</Row>
)}
{["Local File System"].includes(this.state.provider.type) ? null : (
{["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"))} :
@@ -794,17 +812,19 @@ class ProviderEditPage extends React.Component {
</Col>
</Row>
)}
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={2}>
{Setting.getLabel(i18next.t("provider:Path prefix"), i18next.t("provider:Path prefix - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.provider.pathPrefix} onChange={e => {
this.updateProviderField("pathPrefix", e.target.value);
}} />
</Col>
</Row>
{["MinIO", "Google Cloud Storage", "Qiniu Cloud Kodo"].includes(this.state.provider.type) ? null : (
{["Custom HTTP SMS"].includes(this.state.provider.type) ? null : (
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={2}>
{Setting.getLabel(i18next.t("provider:Path prefix"), i18next.t("provider:Path prefix - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.provider.pathPrefix} onChange={e => {
this.updateProviderField("pathPrefix", e.target.value);
}} />
</Col>
</Row>
)}
{["Custom HTTP SMS", "MinIO", "Google Cloud Storage", "Qiniu Cloud Kodo"].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"))} :
@@ -974,7 +994,7 @@ class ProviderEditPage extends React.Component {
</React.Fragment>
) : this.state.provider.category === "SMS" ? (
<React.Fragment>
{["Twilio SMS", "Amazon SNS", "Azure ACS", "Msg91 SMS", "Infobip SMS"].includes(this.state.provider.type) ?
{["Custom HTTP SMS", "Twilio SMS", "Amazon SNS", "Azure ACS", "Msg91 SMS", "Infobip SMS"].includes(this.state.provider.type) ?
null :
(<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
@@ -988,7 +1008,7 @@ class ProviderEditPage extends React.Component {
</Row>
)
}
{["Infobip SMS"].includes(this.state.provider.type) ?
{["Custom HTTP SMS", "Infobip SMS"].includes(this.state.provider.type) ?
null :
(<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
@@ -1002,6 +1022,39 @@ class ProviderEditPage extends React.Component {
</Row>
)
}
{
!["Custom HTTP SMS", "Custom HTTP Email"].includes(this.state.provider.type) ? null : (
<React.Fragment>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={2}>
{Setting.getLabel(i18next.t("general:Method"), i18next.t("provider:Method - Tooltip"))} :
</Col>
<Col span={22} >
<Select virtual={false} style={{width: "100%"}} value={this.state.provider.method} onChange={value => {
this.updateProviderField("method", value);
}}>
{
[
{id: "GET", name: "GET"},
{id: "POST", name: "POST"},
].map((method, index) => <Option key={index} value={method.id}>{method.name}</Option>)
}
</Select>
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("provider:Parameter"), i18next.t("provider:Parameter - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.provider.title} onChange={e => {
this.updateProviderField("title", e.target.value);
}} />
</Col>
</Row>
</React.Fragment>
)
}
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("provider:SMS Test"), i18next.t("provider:SMS Test - Tooltip"))} :
@@ -1026,7 +1079,7 @@ class ProviderEditPage extends React.Component {
</Col>
<Col span={2} >
<Button style={{marginLeft: "10px", marginBottom: "5px"}} type="primary"
disabled={!Setting.isValidPhone(this.state.provider.receiver)}
disabled={!Setting.isValidPhone(this.state.provider.receiver) && (this.state.provider.type !== "Custom HTTP SMS" || this.state.provider.endpoint === "")}
onClick={() => ProviderEditTestSms.sendTestSms(this.state.provider, "+" + Setting.getCountryCode(this.state.provider.content) + this.state.provider.receiver)} >
{i18next.t("provider:Send Testing SMS")}
</Button>
@@ -1110,7 +1163,7 @@ class ProviderEditPage extends React.Component {
<Col span={1}>
<Button type="primary" onClick={() => {
copy(`${authConfig.serverUrl}/api/acs`);
Setting.showMessage("success", i18next.t("provider:Link copied to clipboard successfully"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}>
{i18next.t("provider:Copy")}
</Button>
@@ -1126,7 +1179,7 @@ class ProviderEditPage extends React.Component {
<Col span={1}>
<Button type="primary" onClick={() => {
copy(`${authConfig.serverUrl}/api/acs`);
Setting.showMessage("success", i18next.t("provider:Link copied to clipboard successfully"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}>
{i18next.t("provider:Copy")}
</Button>
@@ -1155,7 +1208,7 @@ class ProviderEditPage extends React.Component {
(this.state.provider.type === "Alipay") ? (
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:Root Cert"), i18next.t("general:Root Cert - Tooltip"))} :
{Setting.getLabel(i18next.t("general:Root cert"), i18next.t("general:Root cert - Tooltip"))} :
</Col>
<Col span={22} >
<Select virtual={false} style={{width: "100%"}} value={this.state.provider.metadata} onChange={(value => {this.updateProviderField("metadata", value);})}>

View File

@@ -248,7 +248,7 @@ class ResourceListPage extends BaseListPage {
<div>
<Button onClick={() => {
copy(record.url);
Setting.showMessage("success", i18next.t("provider:Link copied to clipboard successfully"));
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}
>
{i18next.t("resource:Copy Link")}

View File

@@ -143,6 +143,10 @@ export const OtherProviderInfo = {
logo: `${StaticBaseUrl}/img/social_msg91.ico`,
url: "https://control.msg91.com/app/",
},
"Custom HTTP SMS": {
logo: `${StaticBaseUrl}/img/social_default.png`,
url: "https://casdoor.org/docs/provider/sms/overview",
},
"Mock SMS": {
logo: `${StaticBaseUrl}/img/social_default.png`,
url: "",
@@ -165,6 +169,10 @@ export const OtherProviderInfo = {
logo: `${StaticBaseUrl}/img/social_azure.png`,
url: "https://learn.microsoft.com/zh-cn/azure/communication-services",
},
"Custom HTTP Email": {
logo: `${StaticBaseUrl}/img/social_default.png`,
url: "https://casdoor.org/docs/provider/email/overview",
},
},
Storage: {
"Local File System": {
@@ -916,7 +924,8 @@ export function getProviderTypeOptions(category) {
{id: "Casdoor", name: "Casdoor"},
{id: "Infoflow", name: "Infoflow"},
{id: "Apple", name: "Apple"},
{id: "AzureAD", name: "AzureAD"},
{id: "AzureAD", name: "Azure AD"},
{id: "AzureADB2C", name: "Azure AD B2C"},
{id: "Slack", name: "Slack"},
{id: "Steam", name: "Steam"},
{id: "Bilibili", name: "Bilibili"},
@@ -981,6 +990,7 @@ export function getProviderTypeOptions(category) {
{id: "SUBMAIL", name: "SUBMAIL"},
{id: "Mailtrap", name: "Mailtrap"},
{id: "Azure ACS", name: "Azure ACS"},
{id: "Custom HTTP Email", name: "Custom HTTP Email"},
]
);
} else if (category === "SMS") {
@@ -989,6 +999,8 @@ export function getProviderTypeOptions(category) {
{id: "Aliyun SMS", name: "Alibaba Cloud SMS"},
{id: "Amazon SNS", name: "Amazon SNS"},
{id: "Azure ACS", name: "Azure ACS"},
{id: "Custom HTTP SMS", name: "Custom HTTP SMS"},
{id: "Mock SMS", name: "Mock SMS"},
{id: "Infobip SMS", name: "Infobip SMS"},
{id: "Tencent Cloud SMS", name: "Tencent Cloud SMS"},
{id: "Baidu Cloud SMS", name: "Baidu Cloud SMS"},

View File

@@ -280,12 +280,12 @@ class SubscriptionEditPage extends React.Component {
this.updateSubscriptionField("state", value);
})}
options={[
{value: "Pending", name: i18next.t("permission:Pending")},
{value: "Active", name: i18next.t("permission:Active")},
{value: "Upcoming", name: i18next.t("permission:Upcoming")},
{value: "Expired", name: i18next.t("permission:Expired")},
{value: "Error", name: i18next.t("permission:Error")},
{value: "Suspended", name: i18next.t("permission:Suspended")},
{value: "Pending", name: i18next.t("subscription:Pending")},
{value: "Active", name: i18next.t("subscription:Active")},
{value: "Upcoming", name: i18next.t("subscription:Upcoming")},
{value: "Expired", name: i18next.t("subscription:Expired")},
{value: "Error", name: i18next.t("subscription:Error")},
{value: "Suspended", name: i18next.t("subscription:Suspended")},
].map((item) => Setting.getOption(item.name, item.value))}
/>
</Col>

View File

@@ -201,17 +201,17 @@ class SubscriptionListPage extends BaseListPage {
render: (text, record, index) => {
switch (text) {
case "Pending":
return Setting.getTag("processing", i18next.t("permission:Pending"), <ExclamationCircleOutlined />);
return Setting.getTag("processing", i18next.t("subscription:Pending"), <ExclamationCircleOutlined />);
case "Active":
return Setting.getTag("success", i18next.t("permission:Active"), <SyncOutlined spin />);
return Setting.getTag("success", i18next.t("subscription:Active"), <SyncOutlined spin />);
case "Upcoming":
return Setting.getTag("warning", i18next.t("permission:Upcoming"), <ClockCircleOutlined />);
return Setting.getTag("warning", i18next.t("subscription:Upcoming"), <ClockCircleOutlined />);
case "Expired":
return Setting.getTag("warning", i18next.t("permission:Expired"), <ClockCircleOutlined />);
return Setting.getTag("warning", i18next.t("subscription:Expired"), <ClockCircleOutlined />);
case "Error":
return Setting.getTag("error", i18next.t("permission:Error"), <CloseCircleOutlined />);
return Setting.getTag("error", i18next.t("subscription:Error"), <CloseCircleOutlined />);
case "Suspended":
return Setting.getTag("default", i18next.t("permission:Suspended"), <MinusCircleOutlined />);
return Setting.getTag("default", i18next.t("subscription:Suspended"), <MinusCircleOutlined />);
default:
return null;
}

View File

@@ -17,6 +17,10 @@ import {Button, Card, Col, Input, Row} from "antd";
import * as TokenBackend from "./backend/TokenBackend";
import * as Setting from "./Setting";
import i18next from "i18next";
import copy from "copy-to-clipboard";
import {jwtDecode} from "jwt-decode";
const {TextArea} = Input;
class TokenEditPage extends React.Component {
constructor(props) {
@@ -69,7 +73,20 @@ class TokenEditPage extends React.Component {
});
}
parseAccessToken(accessToken) {
try {
const parsedHeader = JSON.stringify(jwtDecode(accessToken, {header: true}), null, 2);
const parsedPayload = JSON.stringify(jwtDecode(accessToken), null, 2);
const res = parsedHeader + "." + parsedPayload;
return res;
} catch (error) {
return error.message;
}
}
renderToken() {
const editorWidth = Setting.isMobile() ? 22 : 9;
const parsedResult = this.parseAccessToken(this.state.token.accessToken);
return (
<Card size="small" title={
<div>
@@ -81,7 +98,7 @@ class TokenEditPage extends React.Component {
} style={(Setting.isMobile()) ? {margin: "5px"} : {}} type="inner">
<Row style={{marginTop: "10px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("general:Name")}:
{Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.token.name} onChange={e => {
@@ -91,7 +108,7 @@ class TokenEditPage extends React.Component {
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("general:Application")}:
{Setting.getLabel(i18next.t("general:Application"), i18next.t("general:Application - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.token.application} onChange={e => {
@@ -101,7 +118,7 @@ class TokenEditPage extends React.Component {
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("general:Organization")}:
{Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} :
</Col>
<Col span={22} >
<Input disabled={!Setting.isAdminUser(this.props.account)} value={this.state.token.organization} onChange={e => {
@@ -111,7 +128,7 @@ class TokenEditPage extends React.Component {
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("general:User")}:
{Setting.getLabel(i18next.t("general:User"), i18next.t("general:User - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.token.user} onChange={e => {
@@ -121,7 +138,7 @@ class TokenEditPage extends React.Component {
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("token:Authorization code")}:
{Setting.getLabel(i18next.t("token:Authorization code"), i18next.t("token:Authorization code - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.token.code} onChange={e => {
@@ -131,17 +148,7 @@ class TokenEditPage extends React.Component {
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("token:Access token")}:
</Col>
<Col span={22} >
<Input value={this.state.token.accessToken} onChange={e => {
this.updateTokenField("accessToken", e.target.value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("token:Expires in")}:
{Setting.getLabel(i18next.t("token:Expires in"), i18next.t("token:Expires in - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.token.expiresIn} onChange={e => {
@@ -151,7 +158,7 @@ class TokenEditPage extends React.Component {
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("provider:Scope")}:
{Setting.getLabel(i18next.t("provider:Scope"), i18next.t("provider:Scope - Tooltip"))}
</Col>
<Col span={22} >
<Input value={this.state.token.scope} onChange={e => {
@@ -161,7 +168,7 @@ class TokenEditPage extends React.Component {
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("token:Token type")}:
{Setting.getLabel(i18next.t("token:Token type"), i18next.t("token:Token type - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.token.tokenType} onChange={e => {
@@ -169,6 +176,37 @@ class TokenEditPage extends React.Component {
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("token:Access token"), i18next.t("token:Access token - Tooltip"))} :
</Col>
<Col span={editorWidth} >
<Button type="primary" style={{marginRight: "10px", marginBottom: "10px"}} disabled={this.state.token.accessToken === ""} onClick={() => {
copy(this.state.token.accessToken);
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}
>
{i18next.t("token:Copy access token")}
</Button>
<TextArea autoSize={{minRows: 10, maxRows: 200}} value={this.state.token.accessToken} onChange={e => {
this.updateTokenField("accessToken", e.target.value);
}} />
</Col>
<Col span={1} />
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("token:Parsed result"), i18next.t("token:Parsed result - Tooltip"))} :
</Col>
<Col span={editorWidth} >
<Button type="primary" style={{marginRight: "10px", marginBottom: "10px"}} disabled={!parsedResult.includes("\"alg\":")} onClick={() => {
copy(parsedResult);
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}}
>
{i18next.t("token:Copy parsed result")}
</Button>
<TextArea autoSize={{minRows: 10, maxRows: 200}} value={parsedResult} />
</Col>
</Row>
</Card>
);
}

View File

@@ -374,12 +374,9 @@ class UserEditPage extends React.Component {
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:Avatar"), i18next.t("general:Avatar - Tooltip"))} :
</Col>
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("general:Preview")}:
</Col>
<Col>
{this.renderImage(this.state.user.avatar, i18next.t("user:Upload a photo"), i18next.t("user:Set new profile picture"), "avatar", false)}
</Col>
{
this.renderImage(this.state.user.avatar, i18next.t("user:Upload a photo"), i18next.t("user:Set new profile picture"), "avatar", false)
}
</Row>
);
} else if (accountItem.name === "User type") {
@@ -550,9 +547,6 @@ class UserEditPage extends React.Component {
</Col>
<Col span={22} >
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("general:Preview")}:
</Col>
{
[
{name: "ID card front", value: "idCardFront"},
@@ -975,7 +969,7 @@ class UserEditPage extends React.Component {
renderImage(imgUrl, title, set, tag, disabled) {
return (
<Col span={4} style={{textAlign: "center", margin: "auto"}} key={tag}>
<Col span={4} style={{textAlign: "center", margin: "auto", marginLeft: "20px"}} key={tag}>
{
imgUrl ?
<div style={{marginBottom: "10px"}}>
@@ -986,7 +980,7 @@ class UserEditPage extends React.Component {
:
<Col style={{height: "78%", border: "1px dotted grey", borderRadius: 3, marginBottom: "10px"}}>
<div style={{fontSize: 30, margin: 10}}>+</div>
<div style={{verticalAlign: "middle", marginBottom: 10}}>{`Upload ${title}...`}</div>
<div style={{verticalAlign: "middle", marginBottom: 10}}>{`(${i18next.t("general:empty")})`}</div>
</Col>
}
<CropperDivModal disabled={disabled} tag={tag} setTitle={set} buttonText={`${title}...`} title={title} user={this.state.user} organization={this.state.organizations.find(organization => organization.name === this.state.organizationName)} />

View File

@@ -325,6 +325,10 @@ class UserListPage extends BaseListPage {
sorter: true,
...this.getColumnSearchProps("tag"),
render: (text, record, index) => {
if (this.state.organization?.tags?.length === 0) {
return text;
}
const tagMap = {};
this.state.organization?.tags?.map((tag, index) => {
const tokens = tag.split("|");

View File

@@ -0,0 +1,32 @@
// Copyright 2023 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 {createButton} from "react-social-login-buttons";
import {StaticBaseUrl} from "../Setting";
function Icon({width = 24, height = 24, color}) {
return <img src={`${StaticBaseUrl}/buttons/azuread.svg`} alt="Sign in with Azure AD B2C" style={{width: 24, height: 24}} />;
}
const config = {
text: "Sign in with Azure AD B2C",
icon: Icon,
iconFormat: name => `fa fa-${name}`,
style: {background: "#ffffff", color: "#000000"},
activeStyle: {background: "#ededee"},
};
const AzureADB2CLoginButton = createButton(config);
export default AzureADB2CLoginButton;

View File

@@ -16,11 +16,11 @@ import {createButton} from "react-social-login-buttons";
import {StaticBaseUrl} from "../Setting";
function Icon({width = 24, height = 24, color}) {
return <img src={`${StaticBaseUrl}/buttons/azuread.svg`} alt="Sign in with AzureAD" style={{width: 24, height: 24}} />;
return <img src={`${StaticBaseUrl}/buttons/azuread.svg`} alt="Sign in with Azure AD" style={{width: 24, height: 24}} />;
}
const config = {
text: "Sign in with AzureAD",
text: "Sign in with Azure AD",
icon: Icon,
iconFormat: name => `fa fa-${name}`,
style: {background: "#ffffff", color: "#000000"},

View File

@@ -100,6 +100,10 @@ const authInfo = {
scope: "user.read",
endpoint: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
},
AzureADB2C: {
scope: "openid",
endpoint: "https://tenant.b2clogin.com/tenant.onmicrosoft.com/userflow/oauth2/v2.0/authorize",
},
Slack: {
scope: "users:read",
endpoint: "https://slack.com/oauth/authorize",
@@ -406,6 +410,8 @@ export function getAuthUrl(application, provider, method) {
|| provider.type === "Twitch" || provider.type === "Typetalk" || provider.type === "Uber" || provider.type === "VK" || provider.type === "Wepay"
|| provider.type === "Xero" || provider.type === "Yahoo" || provider.type === "Yammer" || provider.type === "Yandex" || provider.type === "Zoom") {
return `${endpoint}?client_id=${provider.clientId}&redirect_uri=${redirectUri}&scope=${scope}&response_type=code&state=${state}`;
} else if (provider.type === "AzureADB2C") {
return `https://${provider.domain}.b2clogin.com/${provider.domain}.onmicrosoft.com/${provider.appId}/oauth2/v2.0/authorize?client_id=${provider.clientId}&nonce=defaultNonce&redirect_uri=${encodeURIComponent(redirectUri)}&scope=${scope}&response_type=code&state=${state}&prompt=login`;
} else if (provider.type === "DingTalk") {
return `${endpoint}?client_id=${provider.clientId}&redirect_uri=${redirectUri}&scope=${scope}&response_type=code&prompt=consent&state=${state}`;
} else if (provider.type === "WeChat") {

View File

@@ -35,6 +35,7 @@ import AlipayLoginButton from "./AlipayLoginButton";
import InfoflowLoginButton from "./InfoflowLoginButton";
import AppleLoginButton from "./AppleLoginButton";
import AzureADLoginButton from "./AzureADLoginButton";
import AzureADB2CLoginButton from "./AzureADB2CLoginButton";
import SlackLoginButton from "./SlackLoginButton";
import SteamLoginButton from "./SteamLoginButton";
import BilibiliLoginButton from "./BilibiliLoginButton";
@@ -85,6 +86,8 @@ function getSigninButton(provider) {
return <AppleLoginButton text={text} align={"center"} />;
} else if (provider.type === "AzureAD") {
return <AzureADLoginButton text={text} align={"center"} />;
} else if (provider.type === "AzureADB2C") {
return <AzureADB2CLoginButton text={text} align={"center"} />;
} else if (provider.type === "Slack") {
return <SlackLoginButton text={text} align={"center"} />;
} else if (provider.type === "Steam") {

View File

@@ -27,18 +27,10 @@ export const MfaVerifyTotpForm = ({mfaProps, onFinish}) => {
<Col span={24}>
<Space>
<Input value={mfaProps.secret} />
<Button
type="primary"
shape="round"
icon={<CopyOutlined />}
onClick={() => {
copy(`${mfaProps.secret}`);
Setting.showMessage(
"success",
i18next.t("mfa:Multi-factor secret to clipboard successfully")
);
}}
/>
<Button type="primary" shape="round" icon={<CopyOutlined />} onClick={() => {
copy(`${mfaProps.secret}`);
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}} />
</Space>
</Col>
</React.Fragment>

View File

@@ -153,11 +153,12 @@ export function sendCode(captchaType, captchaToken, clientSecret, method, countr
});
}
export function verifyCaptcha(captchaType, captchaToken, clientSecret) {
export function verifyCaptcha(owner, name, captchaType, captchaToken, clientSecret) {
const formData = new FormData();
formData.append("captchaType", captchaType);
formData.append("captchaToken", captchaToken);
formData.append("clientSecret", clientSecret);
formData.append("applicationId", `${owner}/${name}`);
return fetch(`${Setting.ServerUrl}/api/verify-captcha`, {
method: "POST",
credentials: "include",

View File

@@ -50,7 +50,7 @@ export const CaptchaPreview = (props) => {
};
const onOk = (captchaType, captchaToken, clientSecret) => {
UserBackend.verifyCaptcha(captchaType, captchaToken, clientSecret).then(() => {
UserBackend.verifyCaptcha(owner, name, captchaType, captchaToken, clientSecret).then(() => {
setVisible(false);
});
};

View File

@@ -12,7 +12,9 @@
"Policies": "Policies",
"Policies - Tooltip": "Casbin policy rules",
"Rule type": "Rule type",
"Sync policies successfully": "Sync policies successfully"
"Sync policies successfully": "Sync policies successfully",
"Use same DB": "Use same DB",
"Use same DB - Tooltip": "Use same DB - Tooltip"
},
"application": {
"Always": "Always",
@@ -30,6 +32,8 @@
"Edit Application": "Edit Application",
"Enable Email linking": "Enable Email linking",
"Enable Email linking - Tooltip": "When using 3rd-party providers to log in, if there is a user in the organization with the same Email, the 3rd-party login method will be automatically associated with that user",
"Enable SAML C14N10": "Enable SAML C14N10",
"Enable SAML C14N10 - Tooltip": "Enable SAML C14N10 - Tooltip",
"Enable SAML compression": "Enable SAML compression",
"Enable SAML compression - Tooltip": "Whether to compress SAML response messages when Casdoor is used as SAML idp",
"Enable WebAuthn signin": "Enable WebAuthn signin",
@@ -42,6 +46,10 @@
"Enable signin session - Tooltip": "Whether Casdoor maintains a session after logging into Casdoor from the application",
"Enable signup": "Enable signup",
"Enable signup - Tooltip": "Whether to allow users to register a new account",
"Failed signin frozen time": "Failed signin frozen time",
"Failed signin frozen time - Tooltip": "Failed signin frozen time - Tooltip",
"Failed signin limit": "Failed signin limit",
"Failed signin limit - Tooltip": "Failed signin limit - Tooltip",
"Failed to sign in": "Failed to sign in",
"File uploaded successfully": "File uploaded successfully",
"First, last": "First, last",
@@ -60,7 +68,6 @@
"Input": "Input",
"Invitation code": "Invitation code",
"Invitation code - Tooltip": "Invitation code - Tooltip",
"Invitation code copied to clipboard successfully": "Invitation code copied to clipboard successfully",
"Left": "Left",
"Logged in successfully": "Logged in successfully",
"Logged out successfully": "Logged out successfully",
@@ -73,7 +80,6 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -86,7 +92,6 @@
"Rule": "Rule",
"SAML metadata": "SAML metadata",
"SAML metadata - Tooltip": "The metadata of SAML protocol",
"SAML metadata URL copied to clipboard successfully": "SAML metadata URL copied to clipboard successfully",
"SAML reply URL": "SAML reply URL",
"Select": "Select",
"Side panel HTML": "Side panel HTML",
@@ -95,11 +100,9 @@
"Sign Up Error": "Sign Up Error",
"Signin": "Signin",
"Signin (Default True)": "Signin (Default True)",
"Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Signin session": "Signin session",
"Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire",
@@ -113,7 +116,6 @@
"Bit size - Tooltip": "Secret key length",
"Certificate": "Certificate",
"Certificate - Tooltip": "Public key certificate, used for decrypting the JWT signature of the Access Token. This certificate usually needs to be deployed on the Casdoor SDK side (i.e., the application) to parse the JWT",
"Certificate copied to clipboard successfully": "Certificate copied to clipboard successfully",
"Copy certificate": "Copy certificate",
"Copy private key": "Copy private key",
"Crypto algorithm": "Crypto algorithm",
@@ -126,7 +128,6 @@
"New Cert": "New Cert",
"Private key": "Private key",
"Private key - Tooltip": "Private key corresponding to the public key certificate",
"Private key copied to clipboard successfully": "Private key copied to clipboard successfully",
"Scope - Tooltip": "Usage scenarios of the certificate",
"Type - Tooltip": "Type of certificate"
},
@@ -191,6 +192,7 @@
"Click to Upload": "Click to Upload",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
"Copy": "Copy",
"Created time": "Created time",
"Custom": "Custom",
@@ -200,6 +202,8 @@
"Default application - Tooltip": "Default application for users registered directly from the organization page",
"Default avatar": "Default avatar",
"Default avatar - Tooltip": "Default avatar used when newly registered users do not set an avatar image",
"Default password": "Default password",
"Default password - Tooltip": "Default password - Tooltip",
"Delete": "Delete",
"Description": "Description",
"Description - Tooltip": "Detailed description information for reference, Casdoor itself will not use it",
@@ -218,8 +222,10 @@
"Failed to connect to server": "Failed to connect to server",
"Failed to delete": "Failed to delete",
"Failed to enable": "Failed to enable",
"Failed to get TermsOfUse URL": "Failed to get TermsOfUse URL",
"Failed to remove": "Failed to remove",
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
@@ -251,6 +257,8 @@
"MFA items - Tooltip": "MFA items - Tooltip",
"Master password": "Master password",
"Master password - Tooltip": "Can be used to log in to all users under this organization, making it convenient for administrators to log in as this user to solve technical issues",
"Master verification code": "Master verification code",
"Master verification code - Tooltip": "Master verification code - Tooltip",
"Menu": "Menu",
"Method": "Method",
"Model": "Model",
@@ -272,6 +280,8 @@
"Password salt - Tooltip": "Random parameter used for password encryption",
"Password type": "Password type",
"Password type - Tooltip": "Storage format of passwords in the database",
"Payment": "Payment",
"Payment - Tooltip": "Payment - Tooltip",
"Payments": "Payments",
"Permissions": "Permissions",
"Permissions - Tooltip": "Permissions owned by this user",
@@ -283,6 +293,8 @@
"Plans - Tooltip": "Plans - Tooltip",
"Preview": "Preview",
"Preview - Tooltip": "Preview the configured effects",
"Pricing": "Pricing",
"Pricing - Tooltip": "Pricing - Tooltip",
"Pricings": "Pricings",
"Products": "Products",
"Provider": "Provider",
@@ -296,6 +308,10 @@
"Role - Tooltip": "Role - Tooltip",
"Roles": "Roles",
"Roles - Tooltip": "Roles that the user belongs to",
"Root cert": "Root cert",
"Root cert - Tooltip": "Root cert - Tooltip",
"SAML attributes": "SAML attributes",
"SAML attributes - Tooltip": "SAML attributes - Tooltip",
"Save": "Save",
"Save & Exit": "Save & Exit",
"Session ID": "Session ID",
@@ -318,6 +334,7 @@
"Successfully removed": "Successfully removed",
"Successfully saved": "Successfully saved",
"Successfully sent": "Successfully sent",
"Successfully synced": "Successfully synced",
"Supported country codes": "Supported country codes",
"Supported country codes - Tooltip": "Country codes supported by the organization. These codes can be selected as a prefix when sending SMS verification codes",
"Sure to delete": "Sure to delete",
@@ -440,7 +457,6 @@
"Multi-factor methods": "Multi-factor methods",
"Multi-factor recover": "Multi-factor recover",
"Multi-factor recover description": "Multi-factor recover description",
"Multi-factor secret to clipboard successfully": "Multi-factor secret to clipboard successfully",
"Or copy the secret to your Authenticator App": "Or copy the secret to your Authenticator App",
"Passcode": "Passcode",
"Please bind your email first, the system will automatically uses the mail for multi-factor authentication": "Please bind your email first, the system will automatically uses the mail for multi-factor authentication",
@@ -573,11 +589,13 @@
"plan": {
"Edit Plan": "Edit Plan",
"New Plan": "New Plan",
"Price per month": "Price per month",
"Price per month - Tooltip": "Price per month - Tooltip",
"Price per year": "Price per year",
"Price per year - Tooltip": "Price per year - Tooltip",
"per month": "per month"
"Period": "Period",
"Period - Tooltip": "Period - Tooltip",
"Price": "Price",
"Price - Tooltip": "Price - Tooltip",
"Related product": "Related product",
"per month": "per month",
"per year": "per year"
},
"pricing": {
"Copy pricing page URL": "Copy pricing page URL",
@@ -589,7 +607,7 @@
"Trial duration": "Trial duration",
"Trial duration - Tooltip": "Trial duration period",
"days trial available!": "days trial available!",
"pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser"
"paid-user do not have active subscription or pending subscription, please select a plan to buy": "paid-user do not have active subscription or pending subscription, please select a plan to buy"
},
"product": {
"Alipay": "Alipay",
@@ -600,17 +618,16 @@
"Detail - Tooltip": "Detail of product",
"Dummy": "Dummy",
"Edit Product": "Edit Product",
"I have completed the payment": "I have completed the payment",
"Image": "Image",
"Image - Tooltip": "Image of product",
"New Product": "New Product",
"Pay": "Pay",
"PayPal": "PayPal",
"Payment cancelled": "Payment cancelled",
"Payment failed": "Payment failed",
"Payment providers": "Payment providers",
"Payment providers - Tooltip": "Providers of payment services",
"Placing order...": "Placing order...",
"Please provide your username in the remark": "Please provide your username in the remark",
"Please scan the QR code to pay": "Please scan the QR code to pay",
"Price": "Price",
"Price - Tooltip": "Price of product",
"Quantity": "Quantity",
@@ -672,8 +689,8 @@
"Content": "Content",
"Content - Tooltip": "Content - Tooltip",
"Copy": "Copy",
"DB Test": "DB Test",
"DB Test - Tooltip": "DB Test - Tooltip",
"DB test": "DB test",
"DB test - Tooltip": "DB test - Tooltip",
"Disable SSL": "Disable SSL",
"Disable SSL - Tooltip": "Whether to disable SSL protocol when communicating with STMP server",
"Domain": "Domain",
@@ -700,7 +717,10 @@
"Internal": "Internal",
"Issuer URL": "Issuer URL",
"Issuer URL - Tooltip": "Issuer URL",
"Link copied to clipboard successfully": "Link copied to clipboard successfully",
"Key ID": "Key ID",
"Key ID - Tooltip": "Key ID - Tooltip",
"Key text": "Key text",
"Key text - Tooltip": "Key text - Tooltip",
"Metadata": "Metadata",
"Metadata - Tooltip": "SAML metadata",
"Method - Tooltip": "Login method, QR code or silent login",
@@ -754,6 +774,10 @@
"Sender Id - Tooltip": "Sender Id - Tooltip",
"Sender number": "Sender number",
"Sender number - Tooltip": "Sender number - Tooltip",
"Service ID identifier": "Service ID identifier",
"Service ID identifier - Tooltip": "Service ID identifier - Tooltip",
"Service account JSON": "Service account JSON",
"Service account JSON - Tooltip": "Service account JSON - Tooltip",
"Sign Name": "Sign Name",
"Sign Name - Tooltip": "Name of the signature to be used",
"Sign request": "Sign request",
@@ -764,12 +788,15 @@
"Signup HTML": "Signup HTML",
"Signup HTML - Edit": "Signup HTML - Edit",
"Signup HTML - Tooltip": "Custom HTML for replacing the default signup page style",
"Signup group": "Signup group",
"Silent": "Silent",
"Site key": "Site key",
"Site key - Tooltip": "Site key",
"Sliding Validation": "Sliding Validation",
"Sub type": "Sub type",
"Sub type - Tooltip": "Sub type",
"Team ID": "Team ID",
"Team ID - Tooltip": "Team ID - Tooltip",
"Template code": "Template code",
"Template code - Tooltip": "Template code",
"Test Email": "Test Email",
@@ -780,6 +807,8 @@
"Token URL - Tooltip": "Token URL",
"Type": "Type",
"Type - Tooltip": "Select a type",
"User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping",
"User mapping - Tooltip": "User mapping - Tooltip",
"UserInfo URL": "UserInfo URL",
@@ -801,6 +830,8 @@
"New Role": "New Role",
"Sub domains": "Sub domains",
"Sub domains - Tooltip": "Domains included in the current role",
"Sub groups": "Sub groups",
"Sub groups - Tooltip": "Sub groups - Tooltip",
"Sub roles": "Sub roles",
"Sub roles - Tooltip": "Roles included in the current role",
"Sub users": "Sub users",
@@ -812,6 +843,9 @@
"Confirm": "Confirm",
"Decline": "Decline",
"Have account?": "Have account?",
"Label": "Label",
"Label HTML": "Label HTML",
"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",
"Please confirm your password!": "Please confirm your password!",
@@ -830,6 +864,11 @@
"Please select your country/region!": "Please select your country/region!",
"Terms of Use": "Terms of Use",
"Terms of Use - Tooltip": "Terms of use that users need to read and agree to during registration",
"Text 1": "Text 1",
"Text 2": "Text 2",
"Text 3": "Text 3",
"Text 4": "Text 4",
"Text 5": "Text 5",
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
"The input is not invoice title!": "The input is not invoice title!",
"The input is not valid Email!": "The input is not valid Email!",
@@ -841,14 +880,19 @@
"sign in now": "sign in now"
},
"subscription": {
"Duration": "Duration",
"Duration - Tooltip": "Subscription duration",
"Active": "Active",
"Edit Subscription": "Edit Subscription",
"End date": "End date",
"End date - Tooltip": "End date",
"End time": "End time",
"End time - Tooltip": "End time - Tooltip",
"Error": "Error",
"Expired": "Expired",
"New Subscription": "New Subscription",
"Start date": "Start date",
"Start date - Tooltip": "Start date"
"Pending": "Pending",
"Period": "Period",
"Start time": "Start time",
"Start time - Tooltip": "Start time - Tooltip",
"Suspended": "Suspended",
"Upcoming": "Upcoming"
},
"syncer": {
"Affiliation table": "Affiliation table",
@@ -872,6 +916,8 @@
"Is read-only": "Is read-only",
"Is read-only - Tooltip": "Is read-only - Tooltip",
"New Syncer": "New Syncer",
"SSL mode": "SSL mode",
"SSL mode - Tooltip": "SSL mode - Tooltip",
"Sync interval": "Sync interval",
"Sync interval - Tooltip": "Unit in seconds",
"Table": "Table",
@@ -913,11 +959,19 @@
},
"token": {
"Access token": "Access token",
"Access token - Tooltip": "Access token - Tooltip",
"Authorization code": "Authorization code",
"Authorization code - Tooltip": "Authorization code - Tooltip",
"Copy access token": "Copy access token",
"Copy parsed result": "Copy parsed result",
"Edit Token": "Edit Token",
"Expires in": "Expires in",
"Expires in - Tooltip": "Expires in - Tooltip",
"New Token": "New Token",
"Token type": "Token type"
"Parsed result": "Parsed result",
"Parsed result - Tooltip": "Parsed result - Tooltip",
"Token type": "Token type",
"Token type - Tooltip": "Token type - Tooltip"
},
"user": {
"3rd-party logins": "3rd-party logins",
@@ -974,6 +1028,8 @@
"Managed accounts": "Managed accounts",
"Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication",
"Name": "Name",
"Name format": "Name format",
"New Email": "New Email",
"New Password": "New Password",
"New User": "New User",
@@ -1011,6 +1067,7 @@
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Upload a photo",
"Value": "Value",
"Values": "Values",
"Verification code sent": "Verification code sent",
"WebAuthn credentials": "WebAuthn credentials",

View File

@@ -12,7 +12,9 @@
"Policies": "Richtlinien",
"Policies - Tooltip": "Casbin Richtlinienregeln",
"Rule type": "Rule type",
"Sync policies successfully": "Richtlinien synchronisiert"
"Sync policies successfully": "Richtlinien synchronisiert",
"Use same DB": "Use same DB",
"Use same DB - Tooltip": "Use same DB - Tooltip"
},
"application": {
"Always": "Immer",
@@ -30,6 +32,8 @@
"Edit Application": "Bearbeitungsanwendung",
"Enable Email linking": "E-Mail-Verknüpfung aktivieren",
"Enable Email linking - Tooltip": "Bei der Verwendung von Drittanbietern zur Anmeldung wird, wenn es in der Organisation einen Benutzer mit der gleichen E-Mail gibt, automatisch die Drittanbieter-Anmelde-Methode mit diesem Benutzer verbunden",
"Enable SAML C14N10": "Enable SAML C14N10",
"Enable SAML C14N10 - Tooltip": "Enable SAML C14N10 - Tooltip",
"Enable SAML compression": "Aktivieren Sie SAML-Komprimierung",
"Enable SAML compression - Tooltip": "Ob SAML-Antwortnachrichten komprimiert werden sollen, wenn Casdoor als SAML-IdP verwendet wird",
"Enable WebAuthn signin": "Anmeldung mit WebAuthn aktivieren",
@@ -42,6 +46,10 @@
"Enable signin session - Tooltip": "Ob Casdoor eine Sitzung aufrechterhält, nachdem man sich von der Anwendung aus bei Casdoor angemeldet hat",
"Enable signup": "Registrierung aktivieren",
"Enable signup - Tooltip": "Ob Benutzern erlaubt werden soll, ein neues Konto zu registrieren",
"Failed signin frozen time": "Failed signin frozen time",
"Failed signin frozen time - Tooltip": "Failed signin frozen time - Tooltip",
"Failed signin limit": "Failed signin limit",
"Failed signin limit - Tooltip": "Failed signin limit - Tooltip",
"Failed to sign in": "Fehler bei der Anmeldung",
"File uploaded successfully": "Datei erfolgreich hochgeladen",
"First, last": "First, last",
@@ -60,7 +68,6 @@
"Input": "Input",
"Invitation code": "Invitation code",
"Invitation code - Tooltip": "Invitation code - Tooltip",
"Invitation code copied to clipboard successfully": "Invitation code copied to clipboard successfully",
"Left": "Links",
"Logged in successfully": "Erfolgreich eingeloggt",
"Logged out successfully": "Erfolgreich ausgeloggt",
@@ -73,7 +80,6 @@
"Please input your application!": "Bitte geben Sie Ihre Anwendung ein!",
"Please input your organization!": "Bitte geben Sie Ihre Organisation ein!",
"Please select a HTML file": "Bitte wählen Sie eine HTML-Datei aus",
"Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Die URL der Seite wurde erfolgreich in die Zwischenablage kopiert. Bitte fügen Sie sie in einen Inkognito-Tab oder einen anderen Browser ein",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Weiterleitungs-URL",
@@ -86,7 +92,6 @@
"Rule": "Regel",
"SAML metadata": "SAML-Metadaten",
"SAML metadata - Tooltip": "Die Metadaten des SAML-Protokolls",
"SAML metadata URL copied to clipboard successfully": "SAML-Metadaten URL erfolgreich in die Zwischenablage kopiert",
"SAML reply URL": "SAML Reply-URL",
"Select": "Select",
"Side panel HTML": "Sidepanel-HTML",
@@ -95,11 +100,9 @@
"Sign Up Error": "Registrierungsfehler",
"Signin": "Signin",
"Signin (Default True)": "Signin (Default True)",
"Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Die URL der Anmeldeseite wurde in die Zwischenablage kopiert. Bitte fügen Sie sie in einen Inkognito-Tab oder einen anderen Browser ein",
"Signin session": "Anmeldesession",
"Signup items": "Registrierungs Items",
"Signup items - Tooltip": "Items, die Benutzer ausfüllen müssen, wenn sie neue Konten registrieren",
"Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Die URL der Registrierungsseite wurde in die Zwischenablage kopiert. Bitte fügen Sie sie in einen Inkognito-Tab oder einen anderen Browser ein",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "Die Anwendung erlaubt es nicht, ein neues Konto zu registrieren",
"Token expire": "Token läuft ab",
@@ -113,7 +116,6 @@
"Bit size - Tooltip": "Länge des Secret-Keys",
"Certificate": "Zertifikat",
"Certificate - Tooltip": "Public-Key-Zertifikat, das zum Entschlüsseln der JWT-Signatur des Access Tokens verwendet wird. Dieses Zertifikat muss normalerweise auf der Casdoor SDK-Seite (d. h. der Anwendung) bereitgestellt werden, um das JWT zu parsen",
"Certificate copied to clipboard successfully": "Zertifikat in die Zwischenablage kopiert",
"Copy certificate": "Kopieren Sie das Zertifikat",
"Copy private key": "Private-Key kopieren",
"Crypto algorithm": "Kryptoalgorithmus",
@@ -126,7 +128,6 @@
"New Cert": "Neues Zertifikat",
"Private key": "Private-Key",
"Private key - Tooltip": "Privater Schlüssel, der zum öffentlichen Schlüsselzertifikat gehört",
"Private key copied to clipboard successfully": "Private-Key wurde erfolgreich in die Zwischenablage kopiert",
"Scope - Tooltip": "Nutzungsszenarien des Zertifikats",
"Type - Tooltip": "Art des Zertifikats"
},
@@ -191,6 +192,7 @@
"Click to Upload": "Klicken Sie zum Hochladen",
"Close": "Schließen",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
"Copy": "Copy",
"Created time": "Erstellte Zeit",
"Custom": "Custom",
@@ -200,6 +202,8 @@
"Default application - Tooltip": "Standard-Anwendung für Benutzer, die direkt von der Organisationsseite registriert wurden",
"Default avatar": "Standard-Avatar",
"Default avatar - Tooltip": "Standard-Avatar, der verwendet wird, wenn neu registrierte Benutzer kein Avatar-Bild festlegen",
"Default password": "Default password",
"Default password - Tooltip": "Default password - Tooltip",
"Delete": "Löschen",
"Description": "Beschreibung",
"Description - Tooltip": "Detaillierte Beschreibungsinformationen zur Referenz, Casdoor selbst wird es nicht verwenden",
@@ -218,8 +222,10 @@
"Failed to connect to server": "Die Verbindung zum Server konnte nicht hergestellt werden",
"Failed to delete": "Konnte nicht gelöscht werden",
"Failed to enable": "Failed to enable",
"Failed to get TermsOfUse URL": "Failed to get TermsOfUse URL",
"Failed to remove": "Failed to remove",
"Failed to save": "Konnte nicht gespeichert werden",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon-URL, die auf allen Casdoor-Seiten der Organisation verwendet wird",
@@ -251,6 +257,8 @@
"MFA items - Tooltip": "MFA items - Tooltip",
"Master password": "Hauptpasswort",
"Master password - Tooltip": "Kann zum Einloggen aller Benutzer unter dieser Organisation verwendet werden, was es Administratoren bequem macht, sich als dieser Benutzer einzuloggen, um technische Probleme zu lösen",
"Master verification code": "Master verification code",
"Master verification code - Tooltip": "Master verification code - Tooltip",
"Menu": "Menü",
"Method": "Methode",
"Model": "Modell",
@@ -272,6 +280,8 @@
"Password salt - Tooltip": "Zufälliger Parameter, der für die Verschlüsselung von Passwörtern verwendet wird",
"Password type": "Passworttyp",
"Password type - Tooltip": "Speicherformat von Passwörtern in der Datenbank",
"Payment": "Payment",
"Payment - Tooltip": "Payment - Tooltip",
"Payments": "Zahlungen",
"Permissions": "Rechte",
"Permissions - Tooltip": "Berechtigungen, die diesem Benutzer gehören",
@@ -283,6 +293,8 @@
"Plans - Tooltip": "Plans - Tooltip",
"Preview": "Vorschau",
"Preview - Tooltip": "Vorschau der konfigurierten Effekte",
"Pricing": "Pricing",
"Pricing - Tooltip": "Pricing - Tooltip",
"Pricings": "Preise",
"Products": "Produkte",
"Provider": "Anbieter",
@@ -296,6 +308,10 @@
"Role - Tooltip": "Role - Tooltip",
"Roles": "Rollen",
"Roles - Tooltip": "Rollen, denen der Benutzer angehört",
"Root cert": "Root cert",
"Root cert - Tooltip": "Root cert - Tooltip",
"SAML attributes": "SAML attributes",
"SAML attributes - Tooltip": "SAML attributes - Tooltip",
"Save": "Speichern",
"Save & Exit": "Speichern und verlassen",
"Session ID": "Session-ID",
@@ -318,6 +334,7 @@
"Successfully removed": "Successfully removed",
"Successfully saved": "Erfolgreich gespeichert",
"Successfully sent": "Successfully sent",
"Successfully synced": "Successfully synced",
"Supported country codes": "Unterstützte Ländercodes",
"Supported country codes - Tooltip": "Ländercodes, die von der Organisation unterstützt werden. Diese Codes können als Präfix ausgewählt werden, wenn SMS-Verifizierungscodes gesendet werden",
"Sure to delete": "Sicher zu löschen",
@@ -440,7 +457,6 @@
"Multi-factor methods": "Multi-factor methods",
"Multi-factor recover": "Multi-factor recover",
"Multi-factor recover description": "Multi-factor recover description",
"Multi-factor secret to clipboard successfully": "Multi-factor secret to clipboard successfully",
"Or copy the secret to your Authenticator App": "Or copy the secret to your Authenticator App",
"Passcode": "Passcode",
"Please bind your email first, the system will automatically uses the mail for multi-factor authentication": "Please bind your email first, the system will automatically uses the mail for multi-factor authentication",
@@ -573,11 +589,13 @@
"plan": {
"Edit Plan": "Edit Plan",
"New Plan": "New Plan",
"Price per month": "Price per month",
"Price per month - Tooltip": "Price per month - Tooltip",
"Price per year": "Price per year",
"Price per year - Tooltip": "Price per year - Tooltip",
"per month": "pro Monat"
"Period": "Period",
"Period - Tooltip": "Period - Tooltip",
"Price": "Price",
"Price - Tooltip": "Price - Tooltip",
"Related product": "Related product",
"per month": "pro Monat",
"per year": "per year"
},
"pricing": {
"Copy pricing page URL": "Preisseite URL kopieren",
@@ -589,7 +607,7 @@
"Trial duration": "Testphase Dauer",
"Trial duration - Tooltip": "Dauer der Testphase",
"days trial available!": "Tage Testphase verfügbar!",
"pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Preisseite URL erfolgreich in die Zwischenablage kopiert. Bitte fügen Sie sie in ein Inkognito-Fenster oder einen anderen Browser ein."
"paid-user do not have active subscription or pending subscription, please select a plan to buy": "paid-user do not have active subscription or pending subscription, please select a plan to buy"
},
"product": {
"Alipay": "Alipay",
@@ -600,17 +618,16 @@
"Detail - Tooltip": "Detail des Produkts",
"Dummy": "Dummy",
"Edit Product": "Produkt bearbeiten",
"I have completed the payment": "Ich habe die Zahlung abgeschlossen",
"Image": "Bild",
"Image - Tooltip": "Bild des Produkts",
"New Product": "Neues Produkt",
"Pay": "Zahlen",
"PayPal": "PayPal",
"Payment cancelled": "Payment cancelled",
"Payment failed": "Payment failed",
"Payment providers": "Zahlungsprovider",
"Payment providers - Tooltip": "Provider von Zahlungsdiensten",
"Placing order...": "Bestellung aufgeben...",
"Please provide your username in the remark": "Bitte geben Sie Ihren Benutzernamen in der Anmerkung an",
"Please scan the QR code to pay": "Bitte scannen Sie den QR-Code, um zu bezahlen",
"Price": "Preis",
"Price - Tooltip": "Preis des Produkts",
"Quantity": "Menge",
@@ -672,8 +689,8 @@
"Content": "Content",
"Content - Tooltip": "Content - Tooltip",
"Copy": "Kopieren",
"DB Test": "DB Test",
"DB Test - Tooltip": "DB Test - Tooltip",
"DB test": "DB test",
"DB test - Tooltip": "DB test - Tooltip",
"Disable SSL": "SSL deaktivieren",
"Disable SSL - Tooltip": "Ob die Deaktivierung des SSL-Protokolls bei der Kommunikation mit dem STMP-Server erfolgen soll",
"Domain": "Domäne",
@@ -700,7 +717,10 @@
"Internal": "Internal",
"Issuer URL": "Issuer-URL",
"Issuer URL - Tooltip": "Emittenten-URL",
"Link copied to clipboard successfully": "Link wurde erfolgreich in die Zwischenablage kopiert",
"Key ID": "Key ID",
"Key ID - Tooltip": "Key ID - Tooltip",
"Key text": "Key text",
"Key text - Tooltip": "Key text - Tooltip",
"Metadata": "Metadaten",
"Metadata - Tooltip": "SAML-Metadaten",
"Method - Tooltip": "Anmeldeverfahren, QR-Code oder Silent-Login",
@@ -754,6 +774,10 @@
"Sender Id - Tooltip": "Sender Id - Tooltip",
"Sender number": "Sender number",
"Sender number - Tooltip": "Sender number - Tooltip",
"Service ID identifier": "Service ID identifier",
"Service ID identifier - Tooltip": "Service ID identifier - Tooltip",
"Service account JSON": "Service account JSON",
"Service account JSON - Tooltip": "Service account JSON - Tooltip",
"Sign Name": "Signatur Namen",
"Sign Name - Tooltip": "Name der Signatur, die verwendet werden soll",
"Sign request": "Unterschriftsanforderung",
@@ -764,12 +788,15 @@
"Signup HTML": "Registrierungs-HTML",
"Signup HTML - Edit": "Registrierung HTML - Bearbeiten",
"Signup HTML - Tooltip": "Benutzerdefiniertes HTML zur Ersetzung des Standard-Registrierungs-Seitenstils",
"Signup group": "Signup group",
"Silent": "Silent",
"Site key": "Site-Key",
"Site key - Tooltip": "Seitenschlüssel",
"Sliding Validation": "Sliding Validation",
"Sub type": "Untertyp",
"Sub type - Tooltip": "Unterart",
"Team ID": "Team ID",
"Team ID - Tooltip": "Team ID - Tooltip",
"Template code": "Template-Code",
"Template code - Tooltip": "Template-Code",
"Test Email": "Test E-Mail",
@@ -780,6 +807,8 @@
"Token URL - Tooltip": "Token-URL",
"Type": "Typ",
"Type - Tooltip": "Wählen Sie einen Typ aus",
"User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping",
"User mapping - Tooltip": "User mapping - Tooltip",
"UserInfo URL": "UserInfo-URL",
@@ -801,6 +830,8 @@
"New Role": "Neue Rolle",
"Sub domains": "Subdomains",
"Sub domains - Tooltip": "In der aktuellen Rolle enthaltene Domains",
"Sub groups": "Sub groups",
"Sub groups - Tooltip": "Sub groups - Tooltip",
"Sub roles": "Unterrollen",
"Sub roles - Tooltip": "Rollen, die in der aktuellen Rolle enthalten sind",
"Sub users": "Unterbenutzer",
@@ -812,6 +843,9 @@
"Confirm": "Bestätigen",
"Decline": "Abnahme",
"Have account?": "Haben Sie ein Konto?",
"Label": "Label",
"Label HTML": "Label HTML",
"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",
"Please confirm your password!": "Bitte bestätige dein Passwort!",
@@ -830,6 +864,11 @@
"Please select your country/region!": "Bitte wählen Sie Ihr Land/Ihre Region aus!",
"Terms of Use": "Nutzungsbedingungen",
"Terms of Use - Tooltip": "Nutzungsbedingungen, die Benutzer während der Registrierung lesen und akzeptieren müssen",
"Text 1": "Text 1",
"Text 2": "Text 2",
"Text 3": "Text 3",
"Text 4": "Text 4",
"Text 5": "Text 5",
"The input is not invoice Tax ID!": "Die Eingabe ist keine Rechnungssteuer-ID!",
"The input is not invoice title!": "Der Eingabewert ist nicht die Rechnungsbezeichnung!",
"The input is not valid Email!": "Die Eingabe ist keine gültige E-Mail-Adresse!",
@@ -841,14 +880,19 @@
"sign in now": "Jetzt anmelden"
},
"subscription": {
"Duration": "Laufzeit",
"Duration - Tooltip": "Laufzeit des Abonnements",
"Active": "Active",
"Edit Subscription": "Edit Subscription",
"End date": "Enddatum",
"End date - Tooltip": "Enddatum",
"End time": "End time",
"End time - Tooltip": "End time - Tooltip",
"Error": "Error",
"Expired": "Expired",
"New Subscription": "New Subscription",
"Start date": "Startdatum",
"Start date - Tooltip": "Startdatum"
"Pending": "Pending",
"Period": "Period",
"Start time": "Start time",
"Start time - Tooltip": "Start time - Tooltip",
"Suspended": "Suspended",
"Upcoming": "Upcoming"
},
"syncer": {
"Affiliation table": "Zuordnungstabelle",
@@ -872,6 +916,8 @@
"Is read-only": "Is read-only",
"Is read-only - Tooltip": "Is read-only - Tooltip",
"New Syncer": "Neuer Syncer",
"SSL mode": "SSL mode",
"SSL mode - Tooltip": "SSL mode - Tooltip",
"Sync interval": "Synchronisierungsintervall",
"Sync interval - Tooltip": "Einheit in Sekunden",
"Table": "Tabelle",
@@ -913,11 +959,19 @@
},
"token": {
"Access token": "Access-Token",
"Access token - Tooltip": "Access token - Tooltip",
"Authorization code": "Authorisierungscode",
"Authorization code - Tooltip": "Authorization code - Tooltip",
"Copy access token": "Copy access token",
"Copy parsed result": "Copy parsed result",
"Edit Token": "Edit-Token bearbeiten",
"Expires in": "läuft ab in",
"Expires in - Tooltip": "Expires in - Tooltip",
"New Token": "Neuer Token",
"Token type": "Token-Typ"
"Parsed result": "Parsed result",
"Parsed result - Tooltip": "Parsed result - Tooltip",
"Token type": "Token-Typ",
"Token type - Tooltip": "Token type - Tooltip"
},
"user": {
"3rd-party logins": "Drittanbieter-Logins",
@@ -974,6 +1028,8 @@
"Managed accounts": "Verwaltete Konten",
"Modify password...": "Passwort ändern...",
"Multi-factor authentication": "Multi-factor authentication",
"Name": "Name",
"Name format": "Name format",
"New Email": "Neue E-Mail",
"New Password": "Neues Passwort",
"New User": "Neuer Benutzer",
@@ -1011,6 +1067,7 @@
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Lade ein Foto hoch",
"Value": "Value",
"Values": "Werte",
"Verification code sent": "Bestätigungscode gesendet",
"WebAuthn credentials": "WebAuthn-Anmeldeinformationen",

View File

@@ -12,7 +12,9 @@
"Policies": "Policies",
"Policies - Tooltip": "Casbin policy rules",
"Rule type": "Rule type",
"Sync policies successfully": "Sync policies successfully"
"Sync policies successfully": "Sync policies successfully",
"Use same DB": "Use same DB",
"Use same DB - Tooltip": "Use the same DB as Casdoor"
},
"application": {
"Always": "Always",
@@ -30,6 +32,8 @@
"Edit Application": "Edit Application",
"Enable Email linking": "Enable Email linking",
"Enable Email linking - Tooltip": "When using 3rd-party providers to log in, if there is a user in the organization with the same Email, the 3rd-party login method will be automatically associated with that user",
"Enable SAML C14N10": "Enable SAML C14N10",
"Enable SAML C14N10 - Tooltip": "Use C14N10 instead of C14N11 in SAML",
"Enable SAML compression": "Enable SAML compression",
"Enable SAML compression - Tooltip": "Whether to compress SAML response messages when Casdoor is used as SAML idp",
"Enable WebAuthn signin": "Enable WebAuthn signin",
@@ -42,6 +46,10 @@
"Enable signin session - Tooltip": "Whether Casdoor maintains a session after logging into Casdoor from the application",
"Enable signup": "Enable signup",
"Enable signup - Tooltip": "Whether to allow users to register a new account",
"Failed signin frozen time": "Failed signin frozen time",
"Failed signin frozen time - Tooltip": "Failed signin frozen time - Tooltip",
"Failed signin limit": "Failed signin limit",
"Failed signin limit - Tooltip": "Failed signin limit - Tooltip",
"Failed to sign in": "Failed to sign in",
"File uploaded successfully": "File uploaded successfully",
"First, last": "First, last",
@@ -60,7 +68,6 @@
"Input": "Input",
"Invitation code": "Invitation code",
"Invitation code - Tooltip": "Invitation code - Tooltip",
"Invitation code copied to clipboard successfully": "Invitation code copied to clipboard successfully",
"Left": "Left",
"Logged in successfully": "Logged in successfully",
"Logged out successfully": "Logged out successfully",
@@ -73,7 +80,6 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -86,7 +92,6 @@
"Rule": "Rule",
"SAML metadata": "SAML metadata",
"SAML metadata - Tooltip": "The metadata of SAML protocol",
"SAML metadata URL copied to clipboard successfully": "SAML metadata URL copied to clipboard successfully",
"SAML reply URL": "SAML reply URL",
"Select": "Select",
"Side panel HTML": "Side panel HTML",
@@ -95,11 +100,9 @@
"Sign Up Error": "Sign Up Error",
"Signin": "Signin",
"Signin (Default True)": "Signin (Default True)",
"Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Signin session": "Signin session",
"Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire",
@@ -113,7 +116,6 @@
"Bit size - Tooltip": "Secret key length",
"Certificate": "Certificate",
"Certificate - Tooltip": "Public key certificate, used for decrypting the JWT signature of the Access Token. This certificate usually needs to be deployed on the Casdoor SDK side (i.e., the application) to parse the JWT",
"Certificate copied to clipboard successfully": "Certificate copied to clipboard successfully",
"Copy certificate": "Copy certificate",
"Copy private key": "Copy private key",
"Crypto algorithm": "Crypto algorithm",
@@ -126,7 +128,6 @@
"New Cert": "New Cert",
"Private key": "Private key",
"Private key - Tooltip": "Private key corresponding to the public key certificate",
"Private key copied to clipboard successfully": "Private key copied to clipboard successfully",
"Scope - Tooltip": "Usage scenarios of the certificate",
"Type - Tooltip": "Type of certificate"
},
@@ -191,6 +192,7 @@
"Click to Upload": "Click to Upload",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
"Copy": "Copy",
"Created time": "Created time",
"Custom": "Custom",
@@ -200,6 +202,8 @@
"Default application - Tooltip": "Default application for users registered directly from the organization page",
"Default avatar": "Default avatar",
"Default avatar - Tooltip": "Default avatar used when newly registered users do not set an avatar image",
"Default password": "Default password",
"Default password - Tooltip": "When adding new user, if the user's password is not specified, the default password will be used as the user's password",
"Delete": "Delete",
"Description": "Description",
"Description - Tooltip": "Detailed description information for reference, Casdoor itself will not use it",
@@ -218,8 +222,10 @@
"Failed to connect to server": "Failed to connect to server",
"Failed to delete": "Failed to delete",
"Failed to enable": "Failed to enable",
"Failed to get TermsOfUse URL": "Failed to get TermsOfUse URL",
"Failed to remove": "Failed to remove",
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
@@ -251,6 +257,8 @@
"MFA items - Tooltip": "MFA items - Tooltip",
"Master password": "Master password",
"Master password - Tooltip": "Can be used to log in to all users under this organization, making it convenient for administrators to log in as this user to solve technical issues",
"Master verification code": "Master verification code",
"Master verification code - Tooltip": "When the master verification code is set, all email and SMS verification codes sent under this organization will use this fixed code. It's mainly used for automated testing and CI purposes and is generally not used in normal environments",
"Menu": "Menu",
"Method": "Method",
"Model": "Model",
@@ -272,6 +280,8 @@
"Password salt - Tooltip": "Random parameter used for password encryption",
"Password type": "Password type",
"Password type - Tooltip": "Storage format of passwords in the database",
"Payment": "Payment",
"Payment - Tooltip": "Payment - Tooltip",
"Payments": "Payments",
"Permissions": "Permissions",
"Permissions - Tooltip": "Permissions owned by this user",
@@ -283,6 +293,8 @@
"Plans - Tooltip": "Plans - Tooltip",
"Preview": "Preview",
"Preview - Tooltip": "Preview the configured effects",
"Pricing": "Pricing",
"Pricing - Tooltip": "Pricing - Tooltip",
"Pricings": "Pricings",
"Products": "Products",
"Provider": "Provider",
@@ -296,6 +308,10 @@
"Role - Tooltip": "Role - Tooltip",
"Roles": "Roles",
"Roles - Tooltip": "Roles that the user belongs to",
"Root cert": "Root cert",
"Root cert - Tooltip": "Root cert - Tooltip",
"SAML attributes": "SAML attributes",
"SAML attributes - Tooltip": "SAML attributes - Tooltip",
"Save": "Save",
"Save & Exit": "Save & Exit",
"Session ID": "Session ID",
@@ -318,6 +334,7 @@
"Successfully removed": "Successfully removed",
"Successfully saved": "Successfully saved",
"Successfully sent": "Successfully sent",
"Successfully synced": "Successfully synced",
"Supported country codes": "Supported country codes",
"Supported country codes - Tooltip": "Country codes supported by the organization. These codes can be selected as a prefix when sending SMS verification codes",
"Sure to delete": "Sure to delete",
@@ -440,7 +457,6 @@
"Multi-factor methods": "Multi-factor methods",
"Multi-factor recover": "Multi-factor recover",
"Multi-factor recover description": "Multi-factor recover description",
"Multi-factor secret to clipboard successfully": "Multi-factor secret to clipboard successfully",
"Or copy the secret to your Authenticator App": "Or copy the secret to your Authenticator App",
"Passcode": "Passcode",
"Please bind your email first, the system will automatically uses the mail for multi-factor authentication": "Please bind your email first, the system will automatically uses the mail for multi-factor authentication",
@@ -573,11 +589,13 @@
"plan": {
"Edit Plan": "Edit Plan",
"New Plan": "New Plan",
"Price per month": "Price per month",
"Price per month - Tooltip": "Price per month - Tooltip",
"Price per year": "Price per year",
"Price per year - Tooltip": "Price per year - Tooltip",
"per month": "per month"
"Period": "Period",
"Period - Tooltip": "Period for the plan",
"Price": "Price",
"Price - Tooltip": "Price needs to pay to subscribe the plan",
"Related product": "Related product",
"per month": "per month",
"per year": "per year"
},
"pricing": {
"Copy pricing page URL": "Copy pricing page URL",
@@ -589,7 +607,7 @@
"Trial duration": "Trial duration",
"Trial duration - Tooltip": "Trial duration period",
"days trial available!": "days trial available!",
"pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser"
"paid-user do not have active subscription or pending subscription, please select a plan to buy": "paid-user do not have active subscription or pending subscription, please select a plan to buy"
},
"product": {
"Alipay": "Alipay",
@@ -600,17 +618,16 @@
"Detail - Tooltip": "Detail of product",
"Dummy": "Dummy",
"Edit Product": "Edit Product",
"I have completed the payment": "I have completed the payment",
"Image": "Image",
"Image - Tooltip": "Image of product",
"New Product": "New Product",
"Pay": "Pay",
"PayPal": "PayPal",
"Payment cancelled": "Payment cancelled",
"Payment failed": "Payment failed",
"Payment providers": "Payment providers",
"Payment providers - Tooltip": "Providers of payment services",
"Placing order...": "Placing order...",
"Please provide your username in the remark": "Please provide your username in the remark",
"Please scan the QR code to pay": "Please scan the QR code to pay",
"Price": "Price",
"Price - Tooltip": "Price of product",
"Quantity": "Quantity",
@@ -672,8 +689,8 @@
"Content": "Content",
"Content - Tooltip": "Content - Tooltip",
"Copy": "Copy",
"DB Test": "DB Test",
"DB Test - Tooltip": "DB Test - Tooltip",
"DB test": "DB test",
"DB test - Tooltip": "Test the connectivity to the database",
"Disable SSL": "Disable SSL",
"Disable SSL - Tooltip": "Whether to disable SSL protocol when communicating with STMP server",
"Domain": "Domain",
@@ -700,7 +717,10 @@
"Internal": "Internal",
"Issuer URL": "Issuer URL",
"Issuer URL - Tooltip": "Issuer URL",
"Link copied to clipboard successfully": "Link copied to clipboard successfully",
"Key ID": "Key ID",
"Key ID - Tooltip": "Key ID",
"Key text": "Key text",
"Key text - Tooltip": "Key text",
"Metadata": "Metadata",
"Metadata - Tooltip": "SAML metadata",
"Method - Tooltip": "Login method, QR code or silent login",
@@ -754,6 +774,10 @@
"Sender Id - Tooltip": "Sender Id - Tooltip",
"Sender number": "Sender number",
"Sender number - Tooltip": "Sender number - Tooltip",
"Service ID identifier": "Service ID identifier",
"Service ID identifier - Tooltip": "Service ID identifier",
"Service account JSON": "Service account JSON",
"Service account JSON - Tooltip": "The JSON file content for the service account",
"Sign Name": "Sign Name",
"Sign Name - Tooltip": "Name of the signature to be used",
"Sign request": "Sign request",
@@ -764,12 +788,15 @@
"Signup HTML": "Signup HTML",
"Signup HTML - Edit": "Signup HTML - Edit",
"Signup HTML - Tooltip": "Custom HTML for replacing the default signup page style",
"Signup group": "Signup group",
"Silent": "Silent",
"Site key": "Site key",
"Site key - Tooltip": "Site key",
"Sliding Validation": "Sliding Validation",
"Sub type": "Sub type",
"Sub type - Tooltip": "Sub type",
"Team ID": "Team ID",
"Team ID - Tooltip": "Team ID",
"Template code": "Template code",
"Template code - Tooltip": "Template code",
"Test Email": "Test Email",
@@ -780,6 +807,8 @@
"Token URL - Tooltip": "Token URL",
"Type": "Type",
"Type - Tooltip": "Select a type",
"User flow": "User flow",
"User flow - Tooltip": "User flow",
"User mapping": "User mapping",
"User mapping - Tooltip": "User mapping - Tooltip",
"UserInfo URL": "UserInfo URL",
@@ -801,6 +830,8 @@
"New Role": "New Role",
"Sub domains": "Sub domains",
"Sub domains - Tooltip": "Domains included in the current role",
"Sub groups": "Sub groups",
"Sub groups - Tooltip": "Groups included in the current role",
"Sub roles": "Sub roles",
"Sub roles - Tooltip": "Roles included in the current role",
"Sub users": "Sub users",
@@ -812,6 +843,9 @@
"Confirm": "Confirm",
"Decline": "Decline",
"Have account?": "Have account?",
"Label": "Label",
"Label HTML": "Label HTML",
"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",
"Please confirm your password!": "Please confirm your password!",
@@ -830,6 +864,11 @@
"Please select your country/region!": "Please select your country/region!",
"Terms of Use": "Terms of Use",
"Terms of Use - Tooltip": "Terms of use that users need to read and agree to during registration",
"Text 1": "Text 1",
"Text 2": "Text 2",
"Text 3": "Text 3",
"Text 4": "Text 4",
"Text 5": "Text 5",
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
"The input is not invoice title!": "The input is not invoice title!",
"The input is not valid Email!": "The input is not valid Email!",
@@ -841,14 +880,19 @@
"sign in now": "sign in now"
},
"subscription": {
"Duration": "Duration",
"Duration - Tooltip": "Subscription duration",
"Active": "Active",
"Edit Subscription": "Edit Subscription",
"End date": "End date",
"End date - Tooltip": "End date",
"End time": "End time",
"End time - Tooltip": "End time of the subscription",
"Error": "Error",
"Expired": "Expired",
"New Subscription": "New Subscription",
"Start date": "Start date",
"Start date - Tooltip": "Start date"
"Pending": "Pending",
"Period": "Period",
"Start time": "Start time",
"Start time - Tooltip": "Start time of the subscription",
"Suspended": "Suspended",
"Upcoming": "Upcoming"
},
"syncer": {
"Affiliation table": "Affiliation table",
@@ -872,6 +916,8 @@
"Is read-only": "Is read-only",
"Is read-only - Tooltip": "Is read-only - Tooltip",
"New Syncer": "New Syncer",
"SSL mode": "SSL mode",
"SSL mode - Tooltip": "The SSL mode used when connecting to the database",
"Sync interval": "Sync interval",
"Sync interval - Tooltip": "Unit in seconds",
"Table": "Table",
@@ -913,11 +959,19 @@
},
"token": {
"Access token": "Access token",
"Access token - Tooltip": "Access token - Tooltip",
"Authorization code": "Authorization code",
"Authorization code - Tooltip": "Authorization code - Tooltip",
"Copy access token": "Copy access token",
"Copy parsed result": "Copy parsed result",
"Edit Token": "Edit Token",
"Expires in": "Expires in",
"Expires in - Tooltip": "Expires in - Tooltip",
"New Token": "New Token",
"Token type": "Token type"
"Parsed result": "Parsed result",
"Parsed result - Tooltip": "Parsed result - Tooltip",
"Token type": "Token type",
"Token type - Tooltip": "Token type - Tooltip"
},
"user": {
"3rd-party logins": "3rd-party logins",
@@ -974,6 +1028,8 @@
"Managed accounts": "Managed accounts",
"Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication",
"Name": "Name",
"Name format": "Name format",
"New Email": "New Email",
"New Password": "New Password",
"New User": "New User",
@@ -1011,6 +1067,7 @@
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Upload a photo",
"Value": "Value",
"Values": "Values",
"Verification code sent": "Verification code sent",
"WebAuthn credentials": "WebAuthn credentials",

View File

@@ -12,7 +12,9 @@
"Policies": "Políticas",
"Policies - Tooltip": "Reglas de política de Casbin",
"Rule type": "Rule type",
"Sync policies successfully": "Sincronizar políticas correctamente"
"Sync policies successfully": "Sincronizar políticas correctamente",
"Use same DB": "Use same DB",
"Use same DB - Tooltip": "Use same DB - Tooltip"
},
"application": {
"Always": "siempre",
@@ -30,6 +32,8 @@
"Edit Application": "Editar solicitud",
"Enable Email linking": "Habilitar enlace de correo electrónico",
"Enable Email linking - Tooltip": "Cuando se utilizan proveedores externos de inicio de sesión, si hay un usuario en la organización con el mismo correo electrónico, el método de inicio de sesión externo se asociará automáticamente con ese usuario",
"Enable SAML C14N10": "Enable SAML C14N10",
"Enable SAML C14N10 - Tooltip": "Enable SAML C14N10 - Tooltip",
"Enable SAML compression": "Activar la compresión SAML",
"Enable SAML compression - Tooltip": "Si comprimir o no los mensajes de respuesta SAML cuando se utiliza Casdoor como proveedor de identidad SAML",
"Enable WebAuthn signin": "Permite iniciar sesión con WebAuthn",
@@ -42,6 +46,10 @@
"Enable signin session - Tooltip": "Si Casdoor mantiene una sesión después de iniciar sesión en Casdoor desde la aplicación",
"Enable signup": "Habilitar registro",
"Enable signup - Tooltip": "Ya sea permitir que los usuarios registren una nueva cuenta",
"Failed signin frozen time": "Failed signin frozen time",
"Failed signin frozen time - Tooltip": "Failed signin frozen time - Tooltip",
"Failed signin limit": "Failed signin limit",
"Failed signin limit - Tooltip": "Failed signin limit - Tooltip",
"Failed to sign in": "Error al iniciar sesión",
"File uploaded successfully": "Archivo subido exitosamente",
"First, last": "First, last",
@@ -60,7 +68,6 @@
"Input": "Input",
"Invitation code": "Invitation code",
"Invitation code - Tooltip": "Invitation code - Tooltip",
"Invitation code copied to clipboard successfully": "Invitation code copied to clipboard successfully",
"Left": "Izquierda",
"Logged in successfully": "Acceso satisfactorio",
"Logged out successfully": "Cerró sesión exitosamente",
@@ -73,7 +80,6 @@
"Please input your application!": "¡Por favor, ingrese su solicitud!",
"Please input your organization!": "¡Por favor, ingrese su organización!",
"Please select a HTML file": "Por favor, seleccione un archivo HTML",
"Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "URL de la página de acceso exitosamente copiada al portapapeles, por favor péguela en la ventana de incógnito o en otro navegador",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redireccionar URL",
@@ -86,7 +92,6 @@
"Rule": "Regla",
"SAML metadata": "Metadatos de SAML",
"SAML metadata - Tooltip": "Los metadatos del protocolo SAML",
"SAML metadata URL copied to clipboard successfully": "La URL de metadatos de SAML se ha copiado correctamente en el portapapeles",
"SAML reply URL": "URL de respuesta SAML",
"Select": "Select",
"Side panel HTML": "Panel lateral HTML",
@@ -95,11 +100,9 @@
"Sign Up Error": "Error de registro",
"Signin": "Signin",
"Signin (Default True)": "Signin (Default True)",
"Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "La URL de la página de inicio de sesión fue copiada al portapapeles exitosamente, por favor péguela en una ventana de incógnito o en otro navegador",
"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",
"Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "La URL de la página de registro se ha copiado correctamente en el portapapeles. Por favor, péguela en una ventana de incógnito o en otro navegador",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "La aplicación no permite registrarse una cuenta nueva",
"Token expire": "Token expirado",
@@ -113,7 +116,6 @@
"Bit size - Tooltip": "Longitud de clave secreta",
"Certificate": "Certificado",
"Certificate - Tooltip": "certificado de clave pública, utilizado para desencriptar la firma JWT del Token de Acceso. Este certificado generalmente debe ser desplegado en el lado del SDK de Casdoor (es decir, en la aplicación) para analizar el JWT",
"Certificate copied to clipboard successfully": "Certificado copiado al portapapeles exitosamente",
"Copy certificate": "Certificado de copia",
"Copy private key": "Copiar clave privada",
"Crypto algorithm": "Algoritmo criptográfico",
@@ -126,7 +128,6 @@
"New Cert": "ificado",
"Private key": "Clave privada",
"Private key - Tooltip": "Clave privada correspondiente al certificado de clave pública",
"Private key copied to clipboard successfully": "Clave privada copiada al portapapeles correctamente",
"Scope - Tooltip": "Escenarios de uso del certificado",
"Type - Tooltip": "Tipo de certificado"
},
@@ -191,6 +192,7 @@
"Click to Upload": "Haz clic para cargar",
"Close": "Cerca",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
"Copy": "Copy",
"Created time": "Tiempo creado",
"Custom": "Custom",
@@ -200,6 +202,8 @@
"Default application - Tooltip": "Aplicación predeterminada para usuarios registrados directamente desde la página de la organización",
"Default avatar": "Avatar predeterminado",
"Default avatar - Tooltip": "Avatar predeterminado utilizado cuando los usuarios recién registrados no establecen una imagen de avatar",
"Default password": "Default password",
"Default password - Tooltip": "Default password - Tooltip",
"Delete": "Eliminar",
"Description": "Descripción",
"Description - Tooltip": "Información detallada de descripción para referencia, Casdoor en sí no la utilizará",
@@ -218,8 +222,10 @@
"Failed to connect to server": "No se pudo conectar al servidor",
"Failed to delete": "No se pudo eliminar",
"Failed to enable": "Failed to enable",
"Failed to get TermsOfUse URL": "Failed to get TermsOfUse URL",
"Failed to remove": "Failed to remove",
"Failed to save": "No se pudo guardar",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon (ícono de favoritos)",
"Favicon - Tooltip": "URL del icono Favicon utilizado en todas las páginas de Casdoor de la organización",
@@ -251,6 +257,8 @@
"MFA items - Tooltip": "MFA items - Tooltip",
"Master password": "Contraseña maestra",
"Master password - Tooltip": "Se puede usar para iniciar sesión en todos los usuarios de esta organización, lo que hace conveniente que los administradores inicien sesión como este usuario para resolver problemas técnicos",
"Master verification code": "Master verification code",
"Master verification code - Tooltip": "Master verification code - Tooltip",
"Menu": "Menú",
"Method": "Método",
"Model": "Modelo",
@@ -272,6 +280,8 @@
"Password salt - Tooltip": "Parámetro aleatorio utilizado para la encriptación de contraseñas",
"Password type": "Tipo de contraseña",
"Password type - Tooltip": "Formato de almacenamiento de contraseñas en la base de datos",
"Payment": "Payment",
"Payment - Tooltip": "Payment - Tooltip",
"Payments": "Pagos",
"Permissions": "Permisos",
"Permissions - Tooltip": "Permisos propiedad de este usuario",
@@ -283,6 +293,8 @@
"Plans - Tooltip": "Plans - Tooltip",
"Preview": "Avance",
"Preview - Tooltip": "Vista previa de los efectos configurados",
"Pricing": "Pricing",
"Pricing - Tooltip": "Pricing - Tooltip",
"Pricings": "Precios",
"Products": "Productos",
"Provider": "Proveedor",
@@ -296,6 +308,10 @@
"Role - Tooltip": "Role - Tooltip",
"Roles": "Roles",
"Roles - Tooltip": "Roles a los que pertenece el usuario",
"Root cert": "Root cert",
"Root cert - Tooltip": "Root cert - Tooltip",
"SAML attributes": "SAML attributes",
"SAML attributes - Tooltip": "SAML attributes - Tooltip",
"Save": "Guardar",
"Save & Exit": "Guardar y salir",
"Session ID": "ID de sesión",
@@ -318,6 +334,7 @@
"Successfully removed": "Successfully removed",
"Successfully saved": "Guardado exitosamente",
"Successfully sent": "Successfully sent",
"Successfully synced": "Successfully synced",
"Supported country codes": "Códigos de país admitidos",
"Supported country codes - Tooltip": "Códigos de país compatibles con la organización. Estos códigos se pueden seleccionar como prefijo al enviar códigos de verificación SMS",
"Sure to delete": "Seguro que eliminar",
@@ -440,7 +457,6 @@
"Multi-factor methods": "Multi-factor methods",
"Multi-factor recover": "Multi-factor recover",
"Multi-factor recover description": "Multi-factor recover description",
"Multi-factor secret to clipboard successfully": "Multi-factor secret to clipboard successfully",
"Or copy the secret to your Authenticator App": "Or copy the secret to your Authenticator App",
"Passcode": "Passcode",
"Please bind your email first, the system will automatically uses the mail for multi-factor authentication": "Please bind your email first, the system will automatically uses the mail for multi-factor authentication",
@@ -573,11 +589,13 @@
"plan": {
"Edit Plan": "Edit Plan",
"New Plan": "New Plan",
"Price per month": "Price per month",
"Price per month - Tooltip": "Price per month - Tooltip",
"Price per year": "Price per year",
"Price per year - Tooltip": "Price per year - Tooltip",
"per month": "por mes"
"Period": "Period",
"Period - Tooltip": "Period - Tooltip",
"Price": "Price",
"Price - Tooltip": "Price - Tooltip",
"Related product": "Related product",
"per month": "por mes",
"per year": "per year"
},
"pricing": {
"Copy pricing page URL": "Copiar URL de la página de precios",
@@ -589,7 +607,7 @@
"Trial duration": "Duración del período de prueba",
"Trial duration - Tooltip": "Duración del período de prueba",
"days trial available!": "días de prueba disponibles",
"pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "URL de la página de precios copiada correctamente al portapapeles, péguela en una ventana de incógnito u otro navegador"
"paid-user do not have active subscription or pending subscription, please select a plan to buy": "paid-user do not have active subscription or pending subscription, please select a plan to buy"
},
"product": {
"Alipay": "Alipay",
@@ -600,17 +618,16 @@
"Detail - Tooltip": "Detalle del producto",
"Dummy": "Dummy",
"Edit Product": "Editar Producto",
"I have completed the payment": "He completado el pago",
"Image": "Imagen",
"Image - Tooltip": "Imagen del producto",
"New Product": "Nuevo producto",
"Pay": "Pagar",
"PayPal": "PayPal",
"Payment cancelled": "Payment cancelled",
"Payment failed": "Payment failed",
"Payment providers": "Proveedores de pago",
"Payment providers - Tooltip": "Proveedores de servicios de pago",
"Placing order...": "Haciendo un pedido...",
"Please provide your username in the remark": "Por favor proporcione su nombre de usuario en el comentario",
"Please scan the QR code to pay": "Por favor, escanee el código QR para pagar",
"Price": "Precio",
"Price - Tooltip": "Precio del producto",
"Quantity": "Cantidad",
@@ -672,8 +689,8 @@
"Content": "Content",
"Content - Tooltip": "Content - Tooltip",
"Copy": "Copiar",
"DB Test": "DB Test",
"DB Test - Tooltip": "DB Test - Tooltip",
"DB test": "DB test",
"DB test - Tooltip": "DB test - Tooltip",
"Disable SSL": "Desactivar SSL",
"Disable SSL - Tooltip": "¿Hay que desactivar el protocolo SSL al comunicarse con el servidor STMP?",
"Domain": "Dominio",
@@ -700,7 +717,10 @@
"Internal": "Internal",
"Issuer URL": "URL del emisor",
"Issuer URL - Tooltip": "URL del emisor",
"Link copied to clipboard successfully": "Enlace copiado al portapapeles satisfactoriamente",
"Key ID": "Key ID",
"Key ID - Tooltip": "Key ID - Tooltip",
"Key text": "Key text",
"Key text - Tooltip": "Key text - Tooltip",
"Metadata": "Metadatos",
"Metadata - Tooltip": "Metadatos SAML",
"Method - Tooltip": "Método de inicio de sesión, código QR o inicio de sesión silencioso",
@@ -754,6 +774,10 @@
"Sender Id - Tooltip": "Sender Id - Tooltip",
"Sender number": "Sender number",
"Sender number - Tooltip": "Sender number - Tooltip",
"Service ID identifier": "Service ID identifier",
"Service ID identifier - Tooltip": "Service ID identifier - Tooltip",
"Service account JSON": "Service account JSON",
"Service account JSON - Tooltip": "Service account JSON - Tooltip",
"Sign Name": "Firma de Nombre",
"Sign Name - Tooltip": "Nombre de la firma a ser utilizada",
"Sign request": "Solicitud de firma",
@@ -764,12 +788,15 @@
"Signup HTML": "Registro HTML",
"Signup HTML - Edit": "Registro HTML - Editar",
"Signup HTML - Tooltip": "HTML personalizado para reemplazar el estilo predeterminado de la página de registro",
"Signup group": "Signup group",
"Silent": "Silent",
"Site key": "Clave del sitio",
"Site key - Tooltip": "Clave del sitio",
"Sliding Validation": "Sliding Validation",
"Sub type": "Subtipo",
"Sub type - Tooltip": "Subtipo",
"Team ID": "Team ID",
"Team ID - Tooltip": "Team ID - Tooltip",
"Template code": "Código de plantilla",
"Template code - Tooltip": "Código de plantilla",
"Test Email": "Correo de prueba",
@@ -780,6 +807,8 @@
"Token URL - Tooltip": "URL de token",
"Type": "Tipo",
"Type - Tooltip": "Seleccionar un tipo",
"User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping",
"User mapping - Tooltip": "User mapping - Tooltip",
"UserInfo URL": "URL de información del usuario",
@@ -801,6 +830,8 @@
"New Role": "Nuevo rol",
"Sub domains": "Subdominios",
"Sub domains - Tooltip": "Dominios incluidos en el rol actual",
"Sub groups": "Sub groups",
"Sub groups - Tooltip": "Sub groups - Tooltip",
"Sub roles": "Roles secundarios",
"Sub roles - Tooltip": "Roles incluidos en el rol actual",
"Sub users": "Subusuarios",
@@ -812,6 +843,9 @@
"Confirm": "Confirmar",
"Decline": "Declive",
"Have account?": "¿Tiene una cuenta?",
"Label": "Label",
"Label HTML": "Label HTML",
"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",
"Please confirm your password!": "¡Por favor confirma tu contraseña!",
@@ -830,6 +864,11 @@
"Please select your country/region!": "¡Por favor seleccione su país/región!",
"Terms of Use": "Términos de uso",
"Terms of Use - Tooltip": "Términos de uso que los usuarios necesitan leer y aceptar durante el registro",
"Text 1": "Text 1",
"Text 2": "Text 2",
"Text 3": "Text 3",
"Text 4": "Text 4",
"Text 5": "Text 5",
"The input is not invoice Tax ID!": "¡La entrada no es el ID fiscal de la factura!",
"The input is not invoice title!": "¡El entrada no es el título de la factura!",
"The input is not valid Email!": "¡La entrada no es un correo electrónico válido!",
@@ -841,14 +880,19 @@
"sign in now": "Inicie sesión ahora"
},
"subscription": {
"Duration": "Duración",
"Duration - Tooltip": "Duración de la suscripción",
"Active": "Active",
"Edit Subscription": "Edit Subscription",
"End date": "Fecha de finalización",
"End date - Tooltip": "Fecha de finalización",
"End time": "End time",
"End time - Tooltip": "End time - Tooltip",
"Error": "Error",
"Expired": "Expired",
"New Subscription": "New Subscription",
"Start date": "Fecha de inicio",
"Start date - Tooltip": "Fecha de inicio"
"Pending": "Pending",
"Period": "Period",
"Start time": "Start time",
"Start time - Tooltip": "Start time - Tooltip",
"Suspended": "Suspended",
"Upcoming": "Upcoming"
},
"syncer": {
"Affiliation table": "Tabla de afiliación",
@@ -872,6 +916,8 @@
"Is read-only": "Is read-only",
"Is read-only - Tooltip": "Is read-only - Tooltip",
"New Syncer": "Nuevo Syncer",
"SSL mode": "SSL mode",
"SSL mode - Tooltip": "SSL mode - Tooltip",
"Sync interval": "Intervalo de sincronización",
"Sync interval - Tooltip": "Unidad en segundos",
"Table": "Mesa",
@@ -913,11 +959,19 @@
},
"token": {
"Access token": "Token de acceso",
"Access token - Tooltip": "Access token - Tooltip",
"Authorization code": "Código de autorización",
"Authorization code - Tooltip": "Authorization code - Tooltip",
"Copy access token": "Copy access token",
"Copy parsed result": "Copy parsed result",
"Edit Token": "Editar Token",
"Expires in": "Caduca en",
"Expires in - Tooltip": "Expires in - Tooltip",
"New Token": "Nuevo token",
"Token type": "Tipo de token"
"Parsed result": "Parsed result",
"Parsed result - Tooltip": "Parsed result - Tooltip",
"Token type": "Tipo de token",
"Token type - Tooltip": "Token type - Tooltip"
},
"user": {
"3rd-party logins": "Inicio de sesión de terceros",
@@ -974,6 +1028,8 @@
"Managed accounts": "Cuentas gestionadas",
"Modify password...": "Modificar contraseña...",
"Multi-factor authentication": "Multi-factor authentication",
"Name": "Name",
"Name format": "Name format",
"New Email": "Nuevo correo electrónico",
"New Password": "Nueva contraseña",
"New User": "Nuevo Usuario",
@@ -1011,6 +1067,7 @@
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Subir una foto",
"Value": "Value",
"Values": "Valores",
"Verification code sent": "Código de verificación enviado",
"WebAuthn credentials": "Credenciales de WebAuthn",

View File

@@ -12,7 +12,9 @@
"Policies": "Policies",
"Policies - Tooltip": "Casbin policy rules",
"Rule type": "Rule type",
"Sync policies successfully": "Sync policies successfully"
"Sync policies successfully": "Sync policies successfully",
"Use same DB": "Use same DB",
"Use same DB - Tooltip": "Use same DB - Tooltip"
},
"application": {
"Always": "Always",
@@ -30,6 +32,8 @@
"Edit Application": "Edit Application",
"Enable Email linking": "Enable Email linking",
"Enable Email linking - Tooltip": "When using 3rd-party providers to log in, if there is a user in the organization with the same Email, the 3rd-party login method will be automatically associated with that user",
"Enable SAML C14N10": "Enable SAML C14N10",
"Enable SAML C14N10 - Tooltip": "Enable SAML C14N10 - Tooltip",
"Enable SAML compression": "Enable SAML compression",
"Enable SAML compression - Tooltip": "Whether to compress SAML response messages when Casdoor is used as SAML idp",
"Enable WebAuthn signin": "Enable WebAuthn signin",
@@ -42,6 +46,10 @@
"Enable signin session - Tooltip": "Whether Casdoor maintains a session after logging into Casdoor from the application",
"Enable signup": "Enable signup",
"Enable signup - Tooltip": "Whether to allow users to register a new account",
"Failed signin frozen time": "Failed signin frozen time",
"Failed signin frozen time - Tooltip": "Failed signin frozen time - Tooltip",
"Failed signin limit": "Failed signin limit",
"Failed signin limit - Tooltip": "Failed signin limit - Tooltip",
"Failed to sign in": "Failed to sign in",
"File uploaded successfully": "File uploaded successfully",
"First, last": "First, last",
@@ -60,7 +68,6 @@
"Input": "Input",
"Invitation code": "Invitation code",
"Invitation code - Tooltip": "Invitation code - Tooltip",
"Invitation code copied to clipboard successfully": "Invitation code copied to clipboard successfully",
"Left": "Left",
"Logged in successfully": "Logged in successfully",
"Logged out successfully": "Logged out successfully",
@@ -73,7 +80,6 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -86,7 +92,6 @@
"Rule": "Rule",
"SAML metadata": "SAML metadata",
"SAML metadata - Tooltip": "The metadata of SAML protocol",
"SAML metadata URL copied to clipboard successfully": "SAML metadata URL copied to clipboard successfully",
"SAML reply URL": "SAML reply URL",
"Select": "Select",
"Side panel HTML": "Side panel HTML",
@@ -95,11 +100,9 @@
"Sign Up Error": "Sign Up Error",
"Signin": "Signin",
"Signin (Default True)": "Signin (Default True)",
"Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Signin session": "Signin session",
"Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire",
@@ -113,7 +116,6 @@
"Bit size - Tooltip": "Secret key length",
"Certificate": "Certificate",
"Certificate - Tooltip": "Public key certificate, used for decrypting the JWT signature of the Access Token. This certificate usually needs to be deployed on the Casdoor SDK side (i.e., the application) to parse the JWT",
"Certificate copied to clipboard successfully": "Certificate copied to clipboard successfully",
"Copy certificate": "Copy certificate",
"Copy private key": "Copy private key",
"Crypto algorithm": "Crypto algorithm",
@@ -126,7 +128,6 @@
"New Cert": "New Cert",
"Private key": "Private key",
"Private key - Tooltip": "Private key corresponding to the public key certificate",
"Private key copied to clipboard successfully": "Private key copied to clipboard successfully",
"Scope - Tooltip": "Usage scenarios of the certificate",
"Type - Tooltip": "Type of certificate"
},
@@ -191,6 +192,7 @@
"Click to Upload": "Click to Upload",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
"Copy": "Copy",
"Created time": "Created time",
"Custom": "Custom",
@@ -200,6 +202,8 @@
"Default application - Tooltip": "Default application for users registered directly from the organization page",
"Default avatar": "Default avatar",
"Default avatar - Tooltip": "Default avatar used when newly registered users do not set an avatar image",
"Default password": "Default password",
"Default password - Tooltip": "Default password - Tooltip",
"Delete": "Delete",
"Description": "Description",
"Description - Tooltip": "Detailed description information for reference, Casdoor itself will not use it",
@@ -218,8 +222,10 @@
"Failed to connect to server": "Failed to connect to server",
"Failed to delete": "Failed to delete",
"Failed to enable": "Failed to enable",
"Failed to get TermsOfUse URL": "Failed to get TermsOfUse URL",
"Failed to remove": "Failed to remove",
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
@@ -251,6 +257,8 @@
"MFA items - Tooltip": "MFA items - Tooltip",
"Master password": "Master password",
"Master password - Tooltip": "Can be used to log in to all users under this organization, making it convenient for administrators to log in as this user to solve technical issues",
"Master verification code": "Master verification code",
"Master verification code - Tooltip": "Master verification code - Tooltip",
"Menu": "Menu",
"Method": "Method",
"Model": "Model",
@@ -272,6 +280,8 @@
"Password salt - Tooltip": "Random parameter used for password encryption",
"Password type": "Password type",
"Password type - Tooltip": "Storage format of passwords in the database",
"Payment": "Payment",
"Payment - Tooltip": "Payment - Tooltip",
"Payments": "Payments",
"Permissions": "Permissions",
"Permissions - Tooltip": "Permissions owned by this user",
@@ -283,6 +293,8 @@
"Plans - Tooltip": "Plans - Tooltip",
"Preview": "Preview",
"Preview - Tooltip": "Preview the configured effects",
"Pricing": "Pricing",
"Pricing - Tooltip": "Pricing - Tooltip",
"Pricings": "Pricings",
"Products": "Products",
"Provider": "Provider",
@@ -296,6 +308,10 @@
"Role - Tooltip": "Role - Tooltip",
"Roles": "Roles",
"Roles - Tooltip": "Roles that the user belongs to",
"Root cert": "Root cert",
"Root cert - Tooltip": "Root cert - Tooltip",
"SAML attributes": "SAML attributes",
"SAML attributes - Tooltip": "SAML attributes - Tooltip",
"Save": "Save",
"Save & Exit": "Save & Exit",
"Session ID": "Session ID",
@@ -318,6 +334,7 @@
"Successfully removed": "Successfully removed",
"Successfully saved": "Successfully saved",
"Successfully sent": "Successfully sent",
"Successfully synced": "Successfully synced",
"Supported country codes": "Supported country codes",
"Supported country codes - Tooltip": "Country codes supported by the organization. These codes can be selected as a prefix when sending SMS verification codes",
"Sure to delete": "Sure to delete",
@@ -440,7 +457,6 @@
"Multi-factor methods": "Multi-factor methods",
"Multi-factor recover": "Multi-factor recover",
"Multi-factor recover description": "Multi-factor recover description",
"Multi-factor secret to clipboard successfully": "Multi-factor secret to clipboard successfully",
"Or copy the secret to your Authenticator App": "Or copy the secret to your Authenticator App",
"Passcode": "Passcode",
"Please bind your email first, the system will automatically uses the mail for multi-factor authentication": "Please bind your email first, the system will automatically uses the mail for multi-factor authentication",
@@ -573,11 +589,13 @@
"plan": {
"Edit Plan": "Edit Plan",
"New Plan": "New Plan",
"Price per month": "Price per month",
"Price per month - Tooltip": "Price per month - Tooltip",
"Price per year": "Price per year",
"Price per year - Tooltip": "Price per year - Tooltip",
"per month": "per month"
"Period": "Period",
"Period - Tooltip": "Period - Tooltip",
"Price": "Price",
"Price - Tooltip": "Price - Tooltip",
"Related product": "Related product",
"per month": "per month",
"per year": "per year"
},
"pricing": {
"Copy pricing page URL": "Copy pricing page URL",
@@ -589,7 +607,7 @@
"Trial duration": "Trial duration",
"Trial duration - Tooltip": "Trial duration period",
"days trial available!": "days trial available!",
"pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser"
"paid-user do not have active subscription or pending subscription, please select a plan to buy": "paid-user do not have active subscription or pending subscription, please select a plan to buy"
},
"product": {
"Alipay": "Alipay",
@@ -600,17 +618,16 @@
"Detail - Tooltip": "Detail of product",
"Dummy": "Dummy",
"Edit Product": "Edit Product",
"I have completed the payment": "I have completed the payment",
"Image": "Image",
"Image - Tooltip": "Image of product",
"New Product": "New Product",
"Pay": "Pay",
"PayPal": "PayPal",
"Payment cancelled": "Payment cancelled",
"Payment failed": "Payment failed",
"Payment providers": "Payment providers",
"Payment providers - Tooltip": "Providers of payment services",
"Placing order...": "Placing order...",
"Please provide your username in the remark": "Please provide your username in the remark",
"Please scan the QR code to pay": "Please scan the QR code to pay",
"Price": "Price",
"Price - Tooltip": "Price of product",
"Quantity": "Quantity",
@@ -672,8 +689,8 @@
"Content": "Content",
"Content - Tooltip": "Content - Tooltip",
"Copy": "Copy",
"DB Test": "DB Test",
"DB Test - Tooltip": "DB Test - Tooltip",
"DB test": "DB test",
"DB test - Tooltip": "DB test - Tooltip",
"Disable SSL": "Disable SSL",
"Disable SSL - Tooltip": "Whether to disable SSL protocol when communicating with STMP server",
"Domain": "Domain",
@@ -700,7 +717,10 @@
"Internal": "Internal",
"Issuer URL": "Issuer URL",
"Issuer URL - Tooltip": "Issuer URL",
"Link copied to clipboard successfully": "Link copied to clipboard successfully",
"Key ID": "Key ID",
"Key ID - Tooltip": "Key ID - Tooltip",
"Key text": "Key text",
"Key text - Tooltip": "Key text - Tooltip",
"Metadata": "Metadata",
"Metadata - Tooltip": "SAML metadata",
"Method - Tooltip": "Login method, QR code or silent login",
@@ -754,6 +774,10 @@
"Sender Id - Tooltip": "Sender Id - Tooltip",
"Sender number": "Sender number",
"Sender number - Tooltip": "Sender number - Tooltip",
"Service ID identifier": "Service ID identifier",
"Service ID identifier - Tooltip": "Service ID identifier - Tooltip",
"Service account JSON": "Service account JSON",
"Service account JSON - Tooltip": "Service account JSON - Tooltip",
"Sign Name": "Sign Name",
"Sign Name - Tooltip": "Name of the signature to be used",
"Sign request": "Sign request",
@@ -764,12 +788,15 @@
"Signup HTML": "Signup HTML",
"Signup HTML - Edit": "Signup HTML - Edit",
"Signup HTML - Tooltip": "Custom HTML for replacing the default signup page style",
"Signup group": "Signup group",
"Silent": "Silent",
"Site key": "Site key",
"Site key - Tooltip": "Site key",
"Sliding Validation": "Sliding Validation",
"Sub type": "Sub type",
"Sub type - Tooltip": "Sub type",
"Team ID": "Team ID",
"Team ID - Tooltip": "Team ID - Tooltip",
"Template code": "Template code",
"Template code - Tooltip": "Template code",
"Test Email": "Test Email",
@@ -780,6 +807,8 @@
"Token URL - Tooltip": "Token URL",
"Type": "Type",
"Type - Tooltip": "Select a type",
"User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping",
"User mapping - Tooltip": "User mapping - Tooltip",
"UserInfo URL": "UserInfo URL",
@@ -801,6 +830,8 @@
"New Role": "New Role",
"Sub domains": "Sub domains",
"Sub domains - Tooltip": "Domains included in the current role",
"Sub groups": "Sub groups",
"Sub groups - Tooltip": "Sub groups - Tooltip",
"Sub roles": "Sub roles",
"Sub roles - Tooltip": "Roles included in the current role",
"Sub users": "Sub users",
@@ -812,6 +843,9 @@
"Confirm": "Confirm",
"Decline": "Decline",
"Have account?": "Have account?",
"Label": "Label",
"Label HTML": "Label HTML",
"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",
"Please confirm your password!": "Please confirm your password!",
@@ -830,6 +864,11 @@
"Please select your country/region!": "Please select your country/region!",
"Terms of Use": "Terms of Use",
"Terms of Use - Tooltip": "Terms of use that users need to read and agree to during registration",
"Text 1": "Text 1",
"Text 2": "Text 2",
"Text 3": "Text 3",
"Text 4": "Text 4",
"Text 5": "Text 5",
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
"The input is not invoice title!": "The input is not invoice title!",
"The input is not valid Email!": "The input is not valid Email!",
@@ -841,14 +880,19 @@
"sign in now": "sign in now"
},
"subscription": {
"Duration": "Duration",
"Duration - Tooltip": "Subscription duration",
"Active": "Active",
"Edit Subscription": "Edit Subscription",
"End date": "End date",
"End date - Tooltip": "End date",
"End time": "End time",
"End time - Tooltip": "End time - Tooltip",
"Error": "Error",
"Expired": "Expired",
"New Subscription": "New Subscription",
"Start date": "Start date",
"Start date - Tooltip": "Start date"
"Pending": "Pending",
"Period": "Period",
"Start time": "Start time",
"Start time - Tooltip": "Start time - Tooltip",
"Suspended": "Suspended",
"Upcoming": "Upcoming"
},
"syncer": {
"Affiliation table": "Affiliation table",
@@ -872,6 +916,8 @@
"Is read-only": "Is read-only",
"Is read-only - Tooltip": "Is read-only - Tooltip",
"New Syncer": "New Syncer",
"SSL mode": "SSL mode",
"SSL mode - Tooltip": "SSL mode - Tooltip",
"Sync interval": "Sync interval",
"Sync interval - Tooltip": "Unit in seconds",
"Table": "Table",
@@ -913,11 +959,19 @@
},
"token": {
"Access token": "Access token",
"Access token - Tooltip": "Access token - Tooltip",
"Authorization code": "Authorization code",
"Authorization code - Tooltip": "Authorization code - Tooltip",
"Copy access token": "Copy access token",
"Copy parsed result": "Copy parsed result",
"Edit Token": "Edit Token",
"Expires in": "Expires in",
"Expires in - Tooltip": "Expires in - Tooltip",
"New Token": "New Token",
"Token type": "Token type"
"Parsed result": "Parsed result",
"Parsed result - Tooltip": "Parsed result - Tooltip",
"Token type": "Token type",
"Token type - Tooltip": "Token type - Tooltip"
},
"user": {
"3rd-party logins": "3rd-party logins",
@@ -974,6 +1028,8 @@
"Managed accounts": "Managed accounts",
"Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication",
"Name": "Name",
"Name format": "Name format",
"New Email": "New Email",
"New Password": "New Password",
"New User": "New User",
@@ -1011,6 +1067,7 @@
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Upload a photo",
"Value": "Value",
"Values": "Values",
"Verification code sent": "Verification code sent",
"WebAuthn credentials": "WebAuthn credentials",

View File

@@ -12,7 +12,9 @@
"Policies": "Policies",
"Policies - Tooltip": "Casbin policy rules",
"Rule type": "Rule type",
"Sync policies successfully": "Sync policies successfully"
"Sync policies successfully": "Sync policies successfully",
"Use same DB": "Use same DB",
"Use same DB - Tooltip": "Use same DB - Tooltip"
},
"application": {
"Always": "Always",
@@ -30,6 +32,8 @@
"Edit Application": "Edit Application",
"Enable Email linking": "Enable Email linking",
"Enable Email linking - Tooltip": "When using 3rd-party providers to log in, if there is a user in the organization with the same Email, the 3rd-party login method will be automatically associated with that user",
"Enable SAML C14N10": "Enable SAML C14N10",
"Enable SAML C14N10 - Tooltip": "Enable SAML C14N10 - Tooltip",
"Enable SAML compression": "Enable SAML compression",
"Enable SAML compression - Tooltip": "Whether to compress SAML response messages when Casdoor is used as SAML idp",
"Enable WebAuthn signin": "Enable WebAuthn signin",
@@ -42,6 +46,10 @@
"Enable signin session - Tooltip": "Whether Casdoor maintains a session after logging into Casdoor from the application",
"Enable signup": "Enable signup",
"Enable signup - Tooltip": "Whether to allow users to register a new account",
"Failed signin frozen time": "Failed signin frozen time",
"Failed signin frozen time - Tooltip": "Failed signin frozen time - Tooltip",
"Failed signin limit": "Failed signin limit",
"Failed signin limit - Tooltip": "Failed signin limit - Tooltip",
"Failed to sign in": "Failed to sign in",
"File uploaded successfully": "File uploaded successfully",
"First, last": "First, last",
@@ -60,7 +68,6 @@
"Input": "Input",
"Invitation code": "Invitation code",
"Invitation code - Tooltip": "Invitation code - Tooltip",
"Invitation code copied to clipboard successfully": "Invitation code copied to clipboard successfully",
"Left": "Left",
"Logged in successfully": "Logged in successfully",
"Logged out successfully": "Logged out successfully",
@@ -73,7 +80,6 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -86,7 +92,6 @@
"Rule": "Rule",
"SAML metadata": "SAML metadata",
"SAML metadata - Tooltip": "The metadata of SAML protocol",
"SAML metadata URL copied to clipboard successfully": "SAML metadata URL copied to clipboard successfully",
"SAML reply URL": "SAML reply URL",
"Select": "Select",
"Side panel HTML": "Side panel HTML",
@@ -95,11 +100,9 @@
"Sign Up Error": "Sign Up Error",
"Signin": "Signin",
"Signin (Default True)": "Signin (Default True)",
"Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Signin session": "Signin session",
"Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire",
@@ -113,7 +116,6 @@
"Bit size - Tooltip": "Secret key length",
"Certificate": "Certificate",
"Certificate - Tooltip": "Public key certificate, used for decrypting the JWT signature of the Access Token. This certificate usually needs to be deployed on the Casdoor SDK side (i.e., the application) to parse the JWT",
"Certificate copied to clipboard successfully": "Certificate copied to clipboard successfully",
"Copy certificate": "Copy certificate",
"Copy private key": "Copy private key",
"Crypto algorithm": "Crypto algorithm",
@@ -126,7 +128,6 @@
"New Cert": "New Cert",
"Private key": "Private key",
"Private key - Tooltip": "Private key corresponding to the public key certificate",
"Private key copied to clipboard successfully": "Private key copied to clipboard successfully",
"Scope - Tooltip": "Usage scenarios of the certificate",
"Type - Tooltip": "Type of certificate"
},
@@ -191,6 +192,7 @@
"Click to Upload": "Click to Upload",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
"Copy": "Copy",
"Created time": "Created time",
"Custom": "Custom",
@@ -200,6 +202,8 @@
"Default application - Tooltip": "Default application for users registered directly from the organization page",
"Default avatar": "Default avatar",
"Default avatar - Tooltip": "Default avatar used when newly registered users do not set an avatar image",
"Default password": "Default password",
"Default password - Tooltip": "Default password - Tooltip",
"Delete": "Delete",
"Description": "Description",
"Description - Tooltip": "Detailed description information for reference, Casdoor itself will not use it",
@@ -218,8 +222,10 @@
"Failed to connect to server": "Failed to connect to server",
"Failed to delete": "Failed to delete",
"Failed to enable": "Failed to enable",
"Failed to get TermsOfUse URL": "Failed to get TermsOfUse URL",
"Failed to remove": "Failed to remove",
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
@@ -251,6 +257,8 @@
"MFA items - Tooltip": "MFA items - Tooltip",
"Master password": "Master password",
"Master password - Tooltip": "Can be used to log in to all users under this organization, making it convenient for administrators to log in as this user to solve technical issues",
"Master verification code": "Master verification code",
"Master verification code - Tooltip": "Master verification code - Tooltip",
"Menu": "Menu",
"Method": "Method",
"Model": "Model",
@@ -272,6 +280,8 @@
"Password salt - Tooltip": "Random parameter used for password encryption",
"Password type": "Password type",
"Password type - Tooltip": "Storage format of passwords in the database",
"Payment": "Payment",
"Payment - Tooltip": "Payment - Tooltip",
"Payments": "Payments",
"Permissions": "Permissions",
"Permissions - Tooltip": "Permissions owned by this user",
@@ -283,6 +293,8 @@
"Plans - Tooltip": "Plans - Tooltip",
"Preview": "Preview",
"Preview - Tooltip": "Preview the configured effects",
"Pricing": "Pricing",
"Pricing - Tooltip": "Pricing - Tooltip",
"Pricings": "Pricings",
"Products": "Products",
"Provider": "Provider",
@@ -296,6 +308,10 @@
"Role - Tooltip": "Role - Tooltip",
"Roles": "Roles",
"Roles - Tooltip": "Roles that the user belongs to",
"Root cert": "Root cert",
"Root cert - Tooltip": "Root cert - Tooltip",
"SAML attributes": "SAML attributes",
"SAML attributes - Tooltip": "SAML attributes - Tooltip",
"Save": "Save",
"Save & Exit": "Save & Exit",
"Session ID": "Session ID",
@@ -318,6 +334,7 @@
"Successfully removed": "Successfully removed",
"Successfully saved": "Successfully saved",
"Successfully sent": "Successfully sent",
"Successfully synced": "Successfully synced",
"Supported country codes": "Supported country codes",
"Supported country codes - Tooltip": "Country codes supported by the organization. These codes can be selected as a prefix when sending SMS verification codes",
"Sure to delete": "Sure to delete",
@@ -440,7 +457,6 @@
"Multi-factor methods": "Multi-factor methods",
"Multi-factor recover": "Multi-factor recover",
"Multi-factor recover description": "Multi-factor recover description",
"Multi-factor secret to clipboard successfully": "Multi-factor secret to clipboard successfully",
"Or copy the secret to your Authenticator App": "Or copy the secret to your Authenticator App",
"Passcode": "Passcode",
"Please bind your email first, the system will automatically uses the mail for multi-factor authentication": "Please bind your email first, the system will automatically uses the mail for multi-factor authentication",
@@ -573,11 +589,13 @@
"plan": {
"Edit Plan": "Edit Plan",
"New Plan": "New Plan",
"Price per month": "Price per month",
"Price per month - Tooltip": "Price per month - Tooltip",
"Price per year": "Price per year",
"Price per year - Tooltip": "Price per year - Tooltip",
"per month": "per month"
"Period": "Period",
"Period - Tooltip": "Period - Tooltip",
"Price": "Price",
"Price - Tooltip": "Price - Tooltip",
"Related product": "Related product",
"per month": "per month",
"per year": "per year"
},
"pricing": {
"Copy pricing page URL": "Copy pricing page URL",
@@ -589,7 +607,7 @@
"Trial duration": "Trial duration",
"Trial duration - Tooltip": "Trial duration period",
"days trial available!": "days trial available!",
"pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser"
"paid-user do not have active subscription or pending subscription, please select a plan to buy": "paid-user do not have active subscription or pending subscription, please select a plan to buy"
},
"product": {
"Alipay": "Alipay",
@@ -600,17 +618,16 @@
"Detail - Tooltip": "Detail of product",
"Dummy": "Dummy",
"Edit Product": "Edit Product",
"I have completed the payment": "I have completed the payment",
"Image": "Image",
"Image - Tooltip": "Image of product",
"New Product": "New Product",
"Pay": "Pay",
"PayPal": "PayPal",
"Payment cancelled": "Payment cancelled",
"Payment failed": "Payment failed",
"Payment providers": "Payment providers",
"Payment providers - Tooltip": "Providers of payment services",
"Placing order...": "Placing order...",
"Please provide your username in the remark": "Please provide your username in the remark",
"Please scan the QR code to pay": "Please scan the QR code to pay",
"Price": "Price",
"Price - Tooltip": "Price of product",
"Quantity": "Quantity",
@@ -672,8 +689,8 @@
"Content": "Content",
"Content - Tooltip": "Content - Tooltip",
"Copy": "Copy",
"DB Test": "DB Test",
"DB Test - Tooltip": "DB Test - Tooltip",
"DB test": "DB test",
"DB test - Tooltip": "DB test - Tooltip",
"Disable SSL": "Disable SSL",
"Disable SSL - Tooltip": "Whether to disable SSL protocol when communicating with STMP server",
"Domain": "Domain",
@@ -700,7 +717,10 @@
"Internal": "Internal",
"Issuer URL": "Issuer URL",
"Issuer URL - Tooltip": "Issuer URL",
"Link copied to clipboard successfully": "Link copied to clipboard successfully",
"Key ID": "Key ID",
"Key ID - Tooltip": "Key ID - Tooltip",
"Key text": "Key text",
"Key text - Tooltip": "Key text - Tooltip",
"Metadata": "Metadata",
"Metadata - Tooltip": "SAML metadata",
"Method - Tooltip": "Login method, QR code or silent login",
@@ -754,6 +774,10 @@
"Sender Id - Tooltip": "Sender Id - Tooltip",
"Sender number": "Sender number",
"Sender number - Tooltip": "Sender number - Tooltip",
"Service ID identifier": "Service ID identifier",
"Service ID identifier - Tooltip": "Service ID identifier - Tooltip",
"Service account JSON": "Service account JSON",
"Service account JSON - Tooltip": "Service account JSON - Tooltip",
"Sign Name": "Sign Name",
"Sign Name - Tooltip": "Name of the signature to be used",
"Sign request": "Sign request",
@@ -764,12 +788,15 @@
"Signup HTML": "Signup HTML",
"Signup HTML - Edit": "Signup HTML - Edit",
"Signup HTML - Tooltip": "Custom HTML for replacing the default signup page style",
"Signup group": "Signup group",
"Silent": "Silent",
"Site key": "Site key",
"Site key - Tooltip": "Site key",
"Sliding Validation": "Sliding Validation",
"Sub type": "Sub type",
"Sub type - Tooltip": "Sub type",
"Team ID": "Team ID",
"Team ID - Tooltip": "Team ID - Tooltip",
"Template code": "Template code",
"Template code - Tooltip": "Template code",
"Test Email": "Test Email",
@@ -780,6 +807,8 @@
"Token URL - Tooltip": "Token URL",
"Type": "Type",
"Type - Tooltip": "Select a type",
"User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping",
"User mapping - Tooltip": "User mapping - Tooltip",
"UserInfo URL": "UserInfo URL",
@@ -801,6 +830,8 @@
"New Role": "New Role",
"Sub domains": "Sub domains",
"Sub domains - Tooltip": "Domains included in the current role",
"Sub groups": "Sub groups",
"Sub groups - Tooltip": "Sub groups - Tooltip",
"Sub roles": "Sub roles",
"Sub roles - Tooltip": "Roles included in the current role",
"Sub users": "Sub users",
@@ -812,6 +843,9 @@
"Confirm": "Confirm",
"Decline": "Decline",
"Have account?": "Have account?",
"Label": "Label",
"Label HTML": "Label HTML",
"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",
"Please confirm your password!": "Please confirm your password!",
@@ -830,6 +864,11 @@
"Please select your country/region!": "Please select your country/region!",
"Terms of Use": "Terms of Use",
"Terms of Use - Tooltip": "Terms of use that users need to read and agree to during registration",
"Text 1": "Text 1",
"Text 2": "Text 2",
"Text 3": "Text 3",
"Text 4": "Text 4",
"Text 5": "Text 5",
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
"The input is not invoice title!": "The input is not invoice title!",
"The input is not valid Email!": "The input is not valid Email!",
@@ -841,14 +880,19 @@
"sign in now": "sign in now"
},
"subscription": {
"Duration": "Duration",
"Duration - Tooltip": "Subscription duration",
"Active": "Active",
"Edit Subscription": "Edit Subscription",
"End date": "End date",
"End date - Tooltip": "End date",
"End time": "End time",
"End time - Tooltip": "End time - Tooltip",
"Error": "Error",
"Expired": "Expired",
"New Subscription": "New Subscription",
"Start date": "Start date",
"Start date - Tooltip": "Start date"
"Pending": "Pending",
"Period": "Period",
"Start time": "Start time",
"Start time - Tooltip": "Start time - Tooltip",
"Suspended": "Suspended",
"Upcoming": "Upcoming"
},
"syncer": {
"Affiliation table": "Affiliation table",
@@ -872,6 +916,8 @@
"Is read-only": "Is read-only",
"Is read-only - Tooltip": "Is read-only - Tooltip",
"New Syncer": "New Syncer",
"SSL mode": "SSL mode",
"SSL mode - Tooltip": "SSL mode - Tooltip",
"Sync interval": "Sync interval",
"Sync interval - Tooltip": "Unit in seconds",
"Table": "Table",
@@ -913,11 +959,19 @@
},
"token": {
"Access token": "Access token",
"Access token - Tooltip": "Access token - Tooltip",
"Authorization code": "Authorization code",
"Authorization code - Tooltip": "Authorization code - Tooltip",
"Copy access token": "Copy access token",
"Copy parsed result": "Copy parsed result",
"Edit Token": "Edit Token",
"Expires in": "Expires in",
"Expires in - Tooltip": "Expires in - Tooltip",
"New Token": "New Token",
"Token type": "Token type"
"Parsed result": "Parsed result",
"Parsed result - Tooltip": "Parsed result - Tooltip",
"Token type": "Token type",
"Token type - Tooltip": "Token type - Tooltip"
},
"user": {
"3rd-party logins": "3rd-party logins",
@@ -974,6 +1028,8 @@
"Managed accounts": "Managed accounts",
"Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication",
"Name": "Name",
"Name format": "Name format",
"New Email": "New Email",
"New Password": "New Password",
"New User": "New User",
@@ -1011,6 +1067,7 @@
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Upload a photo",
"Value": "Value",
"Values": "Values",
"Verification code sent": "Verification code sent",
"WebAuthn credentials": "WebAuthn credentials",

View File

@@ -12,7 +12,9 @@
"Policies": "Règles",
"Policies - Tooltip": "Règles de Casbin",
"Rule type": "Type de règle",
"Sync policies successfully": "Synchronisation des règles réussie"
"Sync policies successfully": "Synchronisation des règles réussie",
"Use same DB": "Use same DB",
"Use same DB - Tooltip": "Use same DB - Tooltip"
},
"application": {
"Always": "Toujours",
@@ -30,6 +32,8 @@
"Edit Application": "Modifier l'application",
"Enable Email linking": "Autoriser à lier l'e-mail",
"Enable Email linking - Tooltip": "Lorsqu'un fournisseur tiers est utilisé pour se connecter, si un compte existe dans l'organisation avec la même adresse e-mail, la méthode de connexion tierce sera automatiquement associée à ce compte",
"Enable SAML C14N10": "Enable SAML C14N10",
"Enable SAML C14N10 - Tooltip": "Enable SAML C14N10 - Tooltip",
"Enable SAML compression": "Activer la compression SAML",
"Enable SAML compression - Tooltip": "Compresser ou non les messages de réponse SAML lorsque Casdoor est utilisé en tant que fournisseur d'identité SAML",
"Enable WebAuthn signin": "Autoriser la connexion via WebAuthn",
@@ -42,6 +46,10 @@
"Enable signin session - Tooltip": "Conserver une session après la connexion à Casdoor à partir de l'application",
"Enable signup": "Activer l'inscription",
"Enable signup - Tooltip": "Autoriser la création de nouveaux comptes",
"Failed signin frozen time": "Failed signin frozen time",
"Failed signin frozen time - Tooltip": "Failed signin frozen time - Tooltip",
"Failed signin limit": "Failed signin limit",
"Failed signin limit - Tooltip": "Failed signin limit - Tooltip",
"Failed to sign in": "Échec de la connexion",
"File uploaded successfully": "Fichier téléchargé avec succès",
"First, last": "Prénom, nom",
@@ -60,7 +68,6 @@
"Input": "Saisie",
"Invitation code": "Code d'invitation",
"Invitation code - Tooltip": "Code d'invitation - infobulle",
"Invitation code copied to clipboard successfully": "Code d'invitation copié dans le presse-papiers avec succès",
"Left": "Gauche",
"Logged in successfully": "Connexion réussie",
"Logged out successfully": "Déconnexion réussie",
@@ -73,7 +80,6 @@
"Please input your application!": "Veuillez saisir votre application !",
"Please input your organization!": "Veuillez saisir votre organisation !",
"Please select a HTML file": "Veuillez sélectionner un fichier HTML",
"Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "URL de la page de saisie copiée avec succès dans le presse-papiers, veuillez la coller dans une fenêtre de navigation privée ou dans un autre navigateur",
"Random": "Aléatoire",
"Real name": "Nom complet",
"Redirect URL": "URL de redirection",
@@ -86,7 +92,6 @@
"Rule": "Règle",
"SAML metadata": "Métadonnées SAML",
"SAML metadata - Tooltip": "Les métadonnées du protocole SAML",
"SAML metadata URL copied to clipboard successfully": "URL des métadonnées SAML copiée dans le presse-papiers avec succès",
"SAML reply URL": "URL de réponse SAML",
"Select": "Sélectionner",
"Side panel HTML": "HTML du panneau latéral",
@@ -95,11 +100,9 @@
"Sign Up Error": "Erreur d'inscription",
"Signin": "Connexion",
"Signin (Default True)": "Connexion (Vrai par défaut)",
"Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "L'URL de la page de connexion a été copiée avec succès dans le presse-papiers, veuillez la coller dans une fenêtre de navigation privée ou dans un autre navigateur",
"Signin session": "Session de connexion",
"Signup items": "Champs d'inscription",
"Signup items - Tooltip": "Champs à remplir lors de l'enregistrement de nouveaux comptes",
"Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "URL de la page d'inscription copiée avec succès dans le presse-papiers, veuillez la coller dans une fenêtre de navigation privée ou dans un autre navigateur",
"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",
"Token expire": "Expiration du jeton",
@@ -113,7 +116,6 @@
"Bit size - Tooltip": "Longueur de la clé secrète",
"Certificate": "Certificat",
"Certificate - Tooltip": "Certificat de clé publique, utilisé pour décrypter la signature JWT du jeton d'accès. Ce certificat doit généralement être déployé du côté du SDK Casdoor (c'est-à-dire de l'application) pour analyser le JWT",
"Certificate copied to clipboard successfully": "Certificat copié dans le presse-papiers avec succès",
"Copy certificate": "Copier le certificat",
"Copy private key": "Copier la clé privée",
"Crypto algorithm": "Algorithme cryptographique",
@@ -126,7 +128,6 @@
"New Cert": "Nouveau Certificat",
"Private key": "Clé privée",
"Private key - Tooltip": "Clé privée correspondant au certificat de la clé publique",
"Private key copied to clipboard successfully": "Clé privée copiée dans le presse-papiers avec succès",
"Scope - Tooltip": "Scénarios d'utilisation du certificat",
"Type - Tooltip": "Type de certificat"
},
@@ -191,6 +192,7 @@
"Click to Upload": "Cliquer pour télécharger",
"Close": "Fermer",
"Confirm": "Confirmer",
"Copied to clipboard successfully": "Copied to clipboard successfully",
"Copy": "Copier",
"Created time": "Date de création",
"Custom": "Personnalisée",
@@ -200,6 +202,8 @@
"Default application - Tooltip": "Application par défaut pour les comptes enregistrés directement depuis la page de l'organisation",
"Default avatar": "Avatar par défaut",
"Default avatar - Tooltip": "Avatar par défaut utilisé lorsque des comptes nouvellement enregistrés ne définissent pas d'image d'avatar",
"Default password": "Default password",
"Default password - Tooltip": "Default password - Tooltip",
"Delete": "Supprimer",
"Description": "Description",
"Description - Tooltip": "Description détaillée pour référence, Casdoor ne l'utilisera pas en soi",
@@ -218,8 +222,10 @@
"Failed to connect to server": "Échec de la connexion au serveur",
"Failed to delete": "Échec de la suppression",
"Failed to enable": "Échec de l'activation",
"Failed to get TermsOfUse URL": "Failed to get TermsOfUse URL",
"Failed to remove": "Échec de la suppression",
"Failed to save": "Échec de sauvegarde",
"Failed to sync": "Failed to sync",
"Failed to verify": "Échec de la vérification",
"Favicon": "Icône du site",
"Favicon - Tooltip": "L'URL de l'icône « favicon » utilisée dans toutes les pages Casdoor de l'organisation",
@@ -251,6 +257,8 @@
"MFA items - Tooltip": "Types d'authentification multifacteur - Infobulle",
"Master password": "Mot de passe passe-partout",
"Master password - Tooltip": "Mot de passe qui peut être utilisé pour se connecter à tous les comptes sous cette organisation, ce qui facilite la connexion des administrateurs et administratrices en tant que ce compte pour résoudre les problèmes techniques",
"Master verification code": "Master verification code",
"Master verification code - Tooltip": "Master verification code - Tooltip",
"Menu": "Menu",
"Method": "Méthode",
"Model": "Modèle",
@@ -272,6 +280,8 @@
"Password salt - Tooltip": "Paramètre aléatoire utilisé pour le chiffrement des mots de passe",
"Password type": "Type de mot de passe",
"Password type - Tooltip": "Format de stockage des mots de passe dans la base de données",
"Payment": "Payment",
"Payment - Tooltip": "Payment - Tooltip",
"Payments": "Paiements",
"Permissions": "Permissions",
"Permissions - Tooltip": "Permissions détenues par ce compte",
@@ -283,6 +293,8 @@
"Plans - Tooltip": "Offres - Infobulle",
"Preview": "Aperçu",
"Preview - Tooltip": "Prévisualisation des effets configurés",
"Pricing": "Pricing",
"Pricing - Tooltip": "Pricing - Tooltip",
"Pricings": "Tarifs",
"Products": "Produits",
"Provider": "Fournisseur",
@@ -296,6 +308,10 @@
"Role - Tooltip": "Rôle - Infobulle",
"Roles": "Rôles",
"Roles - Tooltip": "Les rôles auxquels le compte appartient",
"Root cert": "Root cert",
"Root cert - Tooltip": "Root cert - Tooltip",
"SAML attributes": "SAML attributes",
"SAML attributes - Tooltip": "SAML attributes - Tooltip",
"Save": "Enregistrer",
"Save & Exit": "Enregistrer et quitter",
"Session ID": "Identifiant de session",
@@ -318,6 +334,7 @@
"Successfully removed": "Retiré avec succès",
"Successfully saved": "Enregistré avec succès",
"Successfully sent": "Envoyé avec succès",
"Successfully synced": "Successfully synced",
"Supported country codes": "Indicatifs téléphoniques acceptés",
"Supported country codes - Tooltip": "Indicatifs téléphoniques internationaux acceptés par l'organisation. Ces indicatifs peuvent être sélectionnés comme préfixe lors de l'envoi de codes de vérification par SMS",
"Sure to delete": "Certain⋅e de supprimer",
@@ -440,7 +457,6 @@
"Multi-factor methods": "Méthodes d'authentification multifacteur",
"Multi-factor recover": "Restauration de l'authentification multifacteur",
"Multi-factor recover description": "Description de la restauration de l'authentification multifacteur",
"Multi-factor secret to clipboard successfully": "Clé secrète d'authentification multifacteur copiée avec succès",
"Or copy the secret to your Authenticator App": "Ou copiez la clé secrète dans votre application d'authentification",
"Passcode": "Code d'accès",
"Please bind your email first, the system will automatically uses the mail for multi-factor authentication": "Veuillez lier votre e-mail en premier, le système l'utilisera automatiquement pour l'authentification multifacteur",
@@ -573,11 +589,13 @@
"plan": {
"Edit Plan": "Modifier l'offre",
"New Plan": "Nouvelle offre",
"Price per month": "Prix par mois",
"Price per month - Tooltip": "Prix par mois - Infobulle",
"Price per year": "Prix annuel",
"Price per year - Tooltip": "Prix annuel - Infobulle",
"per month": "par mois"
"Period": "Period",
"Period - Tooltip": "Period - Tooltip",
"Price": "Price",
"Price - Tooltip": "Price - Tooltip",
"Related product": "Related product",
"per month": "par mois",
"per year": "per year"
},
"pricing": {
"Copy pricing page URL": "Copier l'URL de la page tarifs",
@@ -589,7 +607,7 @@
"Trial duration": "Durée de l'essai",
"Trial duration - Tooltip": "Durée de la période d'essai",
"days trial available!": "jours d'essai disponibles !",
"pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "URL de la page tarifs copiée avec succès dans le presse-papiers, veuillez la coller dans une fenêtre de navigation privée ou un autre navigateur"
"paid-user do not have active subscription or pending subscription, please select a plan to buy": "paid-user do not have active subscription or pending subscription, please select a plan to buy"
},
"product": {
"Alipay": "Alipay",
@@ -600,17 +618,16 @@
"Detail - Tooltip": "Détail du produit",
"Dummy": "Exemple",
"Edit Product": "Modifier le produit",
"I have completed the payment": "J'ai effectué le paiement",
"Image": "Image",
"Image - Tooltip": "Image du produit",
"New Product": "Nouveau produit",
"Pay": "Payer",
"PayPal": "PayPal",
"Payment cancelled": "Payment cancelled",
"Payment failed": "Payment failed",
"Payment providers": "Fournisseurs de paiement",
"Payment providers - Tooltip": "Fournisseurs de services de paiement",
"Placing order...": "Passer une commande...",
"Please provide your username in the remark": "Veuillez indiquer votre identifiant dans la remarque",
"Please scan the QR code to pay": "Veuillez scanner le code QR pour effectuer le paiement",
"Price": "Prix",
"Price - Tooltip": "Prix du produit",
"Quantity": "Quantité",
@@ -672,8 +689,8 @@
"Content": "Contenu",
"Content - Tooltip": "Contenu - Infobulle",
"Copy": "Copie",
"DB Test": "Test de la BD",
"DB Test - Tooltip": "Test de la BD - Infobulle",
"DB test": "DB test",
"DB test - Tooltip": "DB test - Tooltip",
"Disable SSL": "Désactiver SSL",
"Disable SSL - Tooltip": "Désactiver le protocole SSL lors de la communication avec le serveur STMP",
"Domain": "Domaine",
@@ -700,7 +717,10 @@
"Internal": "Interne",
"Issuer URL": "URL de l'émetteur",
"Issuer URL - Tooltip": "URL de l'émetteur",
"Link copied to clipboard successfully": "Lien copié avec succès dans le presse-papiers",
"Key ID": "Key ID",
"Key ID - Tooltip": "Key ID - Tooltip",
"Key text": "Key text",
"Key text - Tooltip": "Key text - Tooltip",
"Metadata": "Métadonnées",
"Metadata - Tooltip": "Métadonnées SAML",
"Method - Tooltip": "Méthode de connexion, code QR ou connexion silencieuse",
@@ -754,6 +774,10 @@
"Sender Id - Tooltip": "ID de l'expéditeur - Infobulle",
"Sender number": "Numéro de l'expéditeur",
"Sender number - Tooltip": "Numéro de l'expéditeur - Infobulle",
"Service ID identifier": "Service ID identifier",
"Service ID identifier - Tooltip": "Service ID identifier - Tooltip",
"Service account JSON": "Service account JSON",
"Service account JSON - Tooltip": "Service account JSON - Tooltip",
"Sign Name": "Nom de signature",
"Sign Name - Tooltip": "Nom de la signature à utiliser",
"Sign request": "Demande de signature",
@@ -764,12 +788,15 @@
"Signup HTML": "HTML de la page d'inscription",
"Signup HTML - Edit": "HTML de la page d'inscription - Modifier",
"Signup HTML - Tooltip": "HTML personnalisé pour remplacer le style par défaut de la page d'inscription",
"Signup group": "Signup group",
"Silent": "Silencieux",
"Site key": "Clé de site",
"Site key - Tooltip": "Clé de site",
"Sliding Validation": "Validation glissante",
"Sub type": "Sous-type",
"Sub type - Tooltip": "Sous-type",
"Team ID": "Team ID",
"Team ID - Tooltip": "Team ID - Tooltip",
"Template code": "Code modèle",
"Template code - Tooltip": "Code de modèle",
"Test Email": "E-mail de test",
@@ -780,6 +807,8 @@
"Token URL - Tooltip": "URL de jeton",
"Type": "Type de texte",
"Type - Tooltip": "Sélectionnez un type",
"User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip",
"User mapping": "Association de compte",
"User mapping - Tooltip": "Mapping utilisateur - Infobulle",
"UserInfo URL": "URL d'informations utilisateur",
@@ -801,6 +830,8 @@
"New Role": "Nouveau rôle",
"Sub domains": "Domaines",
"Sub domains - Tooltip": "Domaines pour lesquels s'appliquent le rôle ou la permission",
"Sub groups": "Sub groups",
"Sub groups - Tooltip": "Sub groups - Tooltip",
"Sub roles": "Rôles",
"Sub roles - Tooltip": "Rôles pour lesquels s'appliquent le rôle ou la permission",
"Sub users": "Comptes",
@@ -812,6 +843,9 @@
"Confirm": "Confirmer",
"Decline": "Décliner",
"Have account?": "Avez-vous un compte ?",
"Label": "Label",
"Label HTML": "Label HTML",
"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",
"Please confirm your password!": "Veuillez confirmer votre mot de passe !",
@@ -830,6 +864,11 @@
"Please select your country/region!": "Veuillez sélectionner votre pays/région !",
"Terms of Use": "Conditions d'utilisation",
"Terms of Use - Tooltip": "Conditions d'utilisation qui doivent être lus acceptés lors de l'enregistrement du compte",
"Text 1": "Text 1",
"Text 2": "Text 2",
"Text 3": "Text 3",
"Text 4": "Text 4",
"Text 5": "Text 5",
"The input is not invoice Tax ID!": "L'entrée n'est pas l'identifiant fiscal de la facture !",
"The input is not invoice title!": "L'entrée n'est pas un nom ou une dénomination sociale !",
"The input is not valid Email!": "L'entrée n'est pas une adresse e-mail valide !",
@@ -841,14 +880,19 @@
"sign in now": "Connectez-vous maintenant"
},
"subscription": {
"Duration": "Durée",
"Duration - Tooltip": "Durée de l'abonnement",
"Active": "Active",
"Edit Subscription": "Modifier labonnement",
"End date": "Date de fin",
"End date - Tooltip": "Date de fin",
"End time": "End time",
"End time - Tooltip": "End time - Tooltip",
"Error": "Error",
"Expired": "Expired",
"New Subscription": "Nouvel abonnement",
"Start date": "Date de début",
"Start date - Tooltip": "Date de début"
"Pending": "Pending",
"Period": "Period",
"Start time": "Start time",
"Start time - Tooltip": "Start time - Tooltip",
"Suspended": "Suspended",
"Upcoming": "Upcoming"
},
"syncer": {
"Affiliation table": "Table d'affiliation",
@@ -872,6 +916,8 @@
"Is read-only": "Est en lecture seule",
"Is read-only - Tooltip": "En lecture seule - Infobulle",
"New Syncer": "Nouveau synchroniseur",
"SSL mode": "SSL mode",
"SSL mode - Tooltip": "SSL mode - Tooltip",
"Sync interval": "Intervalle de synchronisation",
"Sync interval - Tooltip": "Unité en secondes",
"Table": "Tableau",
@@ -913,11 +959,19 @@
},
"token": {
"Access token": "Token d'accès",
"Access token - Tooltip": "Access token - Tooltip",
"Authorization code": "Code d'autorisation",
"Authorization code - Tooltip": "Authorization code - Tooltip",
"Copy access token": "Copy access token",
"Copy parsed result": "Copy parsed result",
"Edit Token": "Modifier le jeton",
"Expires in": "Expire dans",
"Expires in - Tooltip": "Expires in - Tooltip",
"New Token": "Nouveau jeton",
"Token type": "Type de jeton"
"Parsed result": "Parsed result",
"Parsed result - Tooltip": "Parsed result - Tooltip",
"Token type": "Type de jeton",
"Token type - Tooltip": "Token type - Tooltip"
},
"user": {
"3rd-party logins": "Services de connexions tiers",
@@ -974,6 +1028,8 @@
"Managed accounts": "Comptes gérés",
"Modify password...": "Modifier le mot de passe...",
"Multi-factor authentication": "Authentification multifacteur",
"Name": "Name",
"Name format": "Name format",
"New Email": "Nouvelle adresse e-mail",
"New Password": "Nouveau mot de passe",
"New User": "Nouveau compte",
@@ -1011,6 +1067,7 @@
"Upload ID card front picture": "Télécharger une photo de l'endroit de la pièce d'identité",
"Upload ID card with person picture": "Télécharger une photo la pièce d'identité avec une personne",
"Upload a photo": "Télécharger une photo",
"Value": "Value",
"Values": "Valeurs",
"Verification code sent": "Code de vérification envoyé",
"WebAuthn credentials": "Identifiants WebAuthn",

View File

@@ -12,7 +12,9 @@
"Policies": "Policies",
"Policies - Tooltip": "Casbin policy rules",
"Rule type": "Rule type",
"Sync policies successfully": "Sync policies successfully"
"Sync policies successfully": "Sync policies successfully",
"Use same DB": "Use same DB",
"Use same DB - Tooltip": "Use same DB - Tooltip"
},
"application": {
"Always": "Always",
@@ -30,6 +32,8 @@
"Edit Application": "Edit Application",
"Enable Email linking": "Enable Email linking",
"Enable Email linking - Tooltip": "When using 3rd-party providers to log in, if there is a user in the organization with the same Email, the 3rd-party login method will be automatically associated with that user",
"Enable SAML C14N10": "Enable SAML C14N10",
"Enable SAML C14N10 - Tooltip": "Enable SAML C14N10 - Tooltip",
"Enable SAML compression": "Enable SAML compression",
"Enable SAML compression - Tooltip": "Whether to compress SAML response messages when Casdoor is used as SAML idp",
"Enable WebAuthn signin": "Enable WebAuthn signin",
@@ -42,6 +46,10 @@
"Enable signin session - Tooltip": "Whether Casdoor maintains a session after logging into Casdoor from the application",
"Enable signup": "Enable signup",
"Enable signup - Tooltip": "Whether to allow users to register a new account",
"Failed signin frozen time": "Failed signin frozen time",
"Failed signin frozen time - Tooltip": "Failed signin frozen time - Tooltip",
"Failed signin limit": "Failed signin limit",
"Failed signin limit - Tooltip": "Failed signin limit - Tooltip",
"Failed to sign in": "Failed to sign in",
"File uploaded successfully": "File uploaded successfully",
"First, last": "First, last",
@@ -60,7 +68,6 @@
"Input": "Input",
"Invitation code": "Invitation code",
"Invitation code - Tooltip": "Invitation code - Tooltip",
"Invitation code copied to clipboard successfully": "Invitation code copied to clipboard successfully",
"Left": "Left",
"Logged in successfully": "Logged in successfully",
"Logged out successfully": "Logged out successfully",
@@ -73,7 +80,6 @@
"Please input your application!": "Please input your application!",
"Please input your organization!": "Please input your organization!",
"Please select a HTML file": "Please select a HTML file",
"Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Random": "Random",
"Real name": "Real name",
"Redirect URL": "Redirect URL",
@@ -86,7 +92,6 @@
"Rule": "Rule",
"SAML metadata": "SAML metadata",
"SAML metadata - Tooltip": "The metadata of SAML protocol",
"SAML metadata URL copied to clipboard successfully": "SAML metadata URL copied to clipboard successfully",
"SAML reply URL": "SAML reply URL",
"Select": "Select",
"Side panel HTML": "Side panel HTML",
@@ -95,11 +100,9 @@
"Sign Up Error": "Sign Up Error",
"Signin": "Signin",
"Signin (Default True)": "Signin (Default True)",
"Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Signin session": "Signin session",
"Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire",
@@ -113,7 +116,6 @@
"Bit size - Tooltip": "Secret key length",
"Certificate": "Certificate",
"Certificate - Tooltip": "Public key certificate, used for decrypting the JWT signature of the Access Token. This certificate usually needs to be deployed on the Casdoor SDK side (i.e., the application) to parse the JWT",
"Certificate copied to clipboard successfully": "Certificate copied to clipboard successfully",
"Copy certificate": "Copy certificate",
"Copy private key": "Copy private key",
"Crypto algorithm": "Crypto algorithm",
@@ -126,7 +128,6 @@
"New Cert": "New Cert",
"Private key": "Private key",
"Private key - Tooltip": "Private key corresponding to the public key certificate",
"Private key copied to clipboard successfully": "Private key copied to clipboard successfully",
"Scope - Tooltip": "Usage scenarios of the certificate",
"Type - Tooltip": "Type of certificate"
},
@@ -191,6 +192,7 @@
"Click to Upload": "Click to Upload",
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
"Copy": "Copy",
"Created time": "Created time",
"Custom": "Custom",
@@ -200,6 +202,8 @@
"Default application - Tooltip": "Default application for users registered directly from the organization page",
"Default avatar": "Default avatar",
"Default avatar - Tooltip": "Default avatar used when newly registered users do not set an avatar image",
"Default password": "Default password",
"Default password - Tooltip": "Default password - Tooltip",
"Delete": "Delete",
"Description": "Description",
"Description - Tooltip": "Detailed description information for reference, Casdoor itself will not use it",
@@ -218,8 +222,10 @@
"Failed to connect to server": "Failed to connect to server",
"Failed to delete": "Failed to delete",
"Failed to enable": "Failed to enable",
"Failed to get TermsOfUse URL": "Failed to get TermsOfUse URL",
"Failed to remove": "Failed to remove",
"Failed to save": "Failed to save",
"Failed to sync": "Failed to sync",
"Failed to verify": "Failed to verify",
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
@@ -251,6 +257,8 @@
"MFA items - Tooltip": "MFA items - Tooltip",
"Master password": "Master password",
"Master password - Tooltip": "Can be used to log in to all users under this organization, making it convenient for administrators to log in as this user to solve technical issues",
"Master verification code": "Master verification code",
"Master verification code - Tooltip": "Master verification code - Tooltip",
"Menu": "Menu",
"Method": "Method",
"Model": "Model",
@@ -272,6 +280,8 @@
"Password salt - Tooltip": "Random parameter used for password encryption",
"Password type": "Password type",
"Password type - Tooltip": "Storage format of passwords in the database",
"Payment": "Payment",
"Payment - Tooltip": "Payment - Tooltip",
"Payments": "Payments",
"Permissions": "Permissions",
"Permissions - Tooltip": "Permissions owned by this user",
@@ -283,6 +293,8 @@
"Plans - Tooltip": "Plans - Tooltip",
"Preview": "Preview",
"Preview - Tooltip": "Preview the configured effects",
"Pricing": "Pricing",
"Pricing - Tooltip": "Pricing - Tooltip",
"Pricings": "Pricings",
"Products": "Products",
"Provider": "Provider",
@@ -296,6 +308,10 @@
"Role - Tooltip": "Role - Tooltip",
"Roles": "Roles",
"Roles - Tooltip": "Roles that the user belongs to",
"Root cert": "Root cert",
"Root cert - Tooltip": "Root cert - Tooltip",
"SAML attributes": "SAML attributes",
"SAML attributes - Tooltip": "SAML attributes - Tooltip",
"Save": "Save",
"Save & Exit": "Save & Exit",
"Session ID": "Session ID",
@@ -318,6 +334,7 @@
"Successfully removed": "Successfully removed",
"Successfully saved": "Successfully saved",
"Successfully sent": "Successfully sent",
"Successfully synced": "Successfully synced",
"Supported country codes": "Supported country codes",
"Supported country codes - Tooltip": "Country codes supported by the organization. These codes can be selected as a prefix when sending SMS verification codes",
"Sure to delete": "Sure to delete",
@@ -440,7 +457,6 @@
"Multi-factor methods": "Multi-factor methods",
"Multi-factor recover": "Multi-factor recover",
"Multi-factor recover description": "Multi-factor recover description",
"Multi-factor secret to clipboard successfully": "Multi-factor secret to clipboard successfully",
"Or copy the secret to your Authenticator App": "Or copy the secret to your Authenticator App",
"Passcode": "Passcode",
"Please bind your email first, the system will automatically uses the mail for multi-factor authentication": "Please bind your email first, the system will automatically uses the mail for multi-factor authentication",
@@ -573,11 +589,13 @@
"plan": {
"Edit Plan": "Edit Plan",
"New Plan": "New Plan",
"Price per month": "Price per month",
"Price per month - Tooltip": "Price per month - Tooltip",
"Price per year": "Price per year",
"Price per year - Tooltip": "Price per year - Tooltip",
"per month": "per month"
"Period": "Period",
"Period - Tooltip": "Period - Tooltip",
"Price": "Price",
"Price - Tooltip": "Price - Tooltip",
"Related product": "Related product",
"per month": "per month",
"per year": "per year"
},
"pricing": {
"Copy pricing page URL": "Copy pricing page URL",
@@ -589,7 +607,7 @@
"Trial duration": "Trial duration",
"Trial duration - Tooltip": "Trial duration period",
"days trial available!": "days trial available!",
"pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "pricing page URL copied to clipboard successfully, please paste it into the incognito window or another browser"
"paid-user do not have active subscription or pending subscription, please select a plan to buy": "paid-user do not have active subscription or pending subscription, please select a plan to buy"
},
"product": {
"Alipay": "Alipay",
@@ -600,17 +618,16 @@
"Detail - Tooltip": "Detail of product",
"Dummy": "Dummy",
"Edit Product": "Edit Product",
"I have completed the payment": "I have completed the payment",
"Image": "Image",
"Image - Tooltip": "Image of product",
"New Product": "New Product",
"Pay": "Pay",
"PayPal": "PayPal",
"Payment cancelled": "Payment cancelled",
"Payment failed": "Payment failed",
"Payment providers": "Payment providers",
"Payment providers - Tooltip": "Providers of payment services",
"Placing order...": "Placing order...",
"Please provide your username in the remark": "Please provide your username in the remark",
"Please scan the QR code to pay": "Please scan the QR code to pay",
"Price": "Price",
"Price - Tooltip": "Price of product",
"Quantity": "Quantity",
@@ -672,8 +689,8 @@
"Content": "Content",
"Content - Tooltip": "Content - Tooltip",
"Copy": "Copy",
"DB Test": "DB Test",
"DB Test - Tooltip": "DB Test - Tooltip",
"DB test": "DB test",
"DB test - Tooltip": "DB test - Tooltip",
"Disable SSL": "Disable SSL",
"Disable SSL - Tooltip": "Whether to disable SSL protocol when communicating with STMP server",
"Domain": "Domain",
@@ -700,7 +717,10 @@
"Internal": "Internal",
"Issuer URL": "Issuer URL",
"Issuer URL - Tooltip": "Issuer URL",
"Link copied to clipboard successfully": "Link copied to clipboard successfully",
"Key ID": "Key ID",
"Key ID - Tooltip": "Key ID - Tooltip",
"Key text": "Key text",
"Key text - Tooltip": "Key text - Tooltip",
"Metadata": "Metadata",
"Metadata - Tooltip": "SAML metadata",
"Method - Tooltip": "Login method, QR code or silent login",
@@ -754,6 +774,10 @@
"Sender Id - Tooltip": "Sender Id - Tooltip",
"Sender number": "Sender number",
"Sender number - Tooltip": "Sender number - Tooltip",
"Service ID identifier": "Service ID identifier",
"Service ID identifier - Tooltip": "Service ID identifier - Tooltip",
"Service account JSON": "Service account JSON",
"Service account JSON - Tooltip": "Service account JSON - Tooltip",
"Sign Name": "Sign Name",
"Sign Name - Tooltip": "Name of the signature to be used",
"Sign request": "Sign request",
@@ -764,12 +788,15 @@
"Signup HTML": "Signup HTML",
"Signup HTML - Edit": "Signup HTML - Edit",
"Signup HTML - Tooltip": "Custom HTML for replacing the default signup page style",
"Signup group": "Signup group",
"Silent": "Silent",
"Site key": "Site key",
"Site key - Tooltip": "Site key",
"Sliding Validation": "Sliding Validation",
"Sub type": "Sub type",
"Sub type - Tooltip": "Sub type",
"Team ID": "Team ID",
"Team ID - Tooltip": "Team ID - Tooltip",
"Template code": "Template code",
"Template code - Tooltip": "Template code",
"Test Email": "Test Email",
@@ -780,6 +807,8 @@
"Token URL - Tooltip": "Token URL",
"Type": "Type",
"Type - Tooltip": "Select a type",
"User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping",
"User mapping - Tooltip": "User mapping - Tooltip",
"UserInfo URL": "UserInfo URL",
@@ -801,6 +830,8 @@
"New Role": "New Role",
"Sub domains": "Sub domains",
"Sub domains - Tooltip": "Domains included in the current role",
"Sub groups": "Sub groups",
"Sub groups - Tooltip": "Sub groups - Tooltip",
"Sub roles": "Sub roles",
"Sub roles - Tooltip": "Roles included in the current role",
"Sub users": "Sub users",
@@ -812,6 +843,9 @@
"Confirm": "Confirm",
"Decline": "Decline",
"Have account?": "Have account?",
"Label": "Label",
"Label HTML": "Label HTML",
"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",
"Please confirm your password!": "Please confirm your password!",
@@ -830,6 +864,11 @@
"Please select your country/region!": "Please select your country/region!",
"Terms of Use": "Terms of Use",
"Terms of Use - Tooltip": "Terms of use that users need to read and agree to during registration",
"Text 1": "Text 1",
"Text 2": "Text 2",
"Text 3": "Text 3",
"Text 4": "Text 4",
"Text 5": "Text 5",
"The input is not invoice Tax ID!": "The input is not invoice Tax ID!",
"The input is not invoice title!": "The input is not invoice title!",
"The input is not valid Email!": "The input is not valid Email!",
@@ -841,14 +880,19 @@
"sign in now": "sign in now"
},
"subscription": {
"Duration": "Duration",
"Duration - Tooltip": "Subscription duration",
"Active": "Active",
"Edit Subscription": "Edit Subscription",
"End date": "End date",
"End date - Tooltip": "End date",
"End time": "End time",
"End time - Tooltip": "End time - Tooltip",
"Error": "Error",
"Expired": "Expired",
"New Subscription": "New Subscription",
"Start date": "Start date",
"Start date - Tooltip": "Start date"
"Pending": "Pending",
"Period": "Period",
"Start time": "Start time",
"Start time - Tooltip": "Start time - Tooltip",
"Suspended": "Suspended",
"Upcoming": "Upcoming"
},
"syncer": {
"Affiliation table": "Affiliation table",
@@ -872,6 +916,8 @@
"Is read-only": "Is read-only",
"Is read-only - Tooltip": "Is read-only - Tooltip",
"New Syncer": "New Syncer",
"SSL mode": "SSL mode",
"SSL mode - Tooltip": "SSL mode - Tooltip",
"Sync interval": "Sync interval",
"Sync interval - Tooltip": "Unit in seconds",
"Table": "Table",
@@ -913,11 +959,19 @@
},
"token": {
"Access token": "Access token",
"Access token - Tooltip": "Access token - Tooltip",
"Authorization code": "Authorization code",
"Authorization code - Tooltip": "Authorization code - Tooltip",
"Copy access token": "Copy access token",
"Copy parsed result": "Copy parsed result",
"Edit Token": "Edit Token",
"Expires in": "Expires in",
"Expires in - Tooltip": "Expires in - Tooltip",
"New Token": "New Token",
"Token type": "Token type"
"Parsed result": "Parsed result",
"Parsed result - Tooltip": "Parsed result - Tooltip",
"Token type": "Token type",
"Token type - Tooltip": "Token type - Tooltip"
},
"user": {
"3rd-party logins": "3rd-party logins",
@@ -974,6 +1028,8 @@
"Managed accounts": "Managed accounts",
"Modify password...": "Modify password...",
"Multi-factor authentication": "Multi-factor authentication",
"Name": "Name",
"Name format": "Name format",
"New Email": "New Email",
"New Password": "New Password",
"New User": "New User",
@@ -1011,6 +1067,7 @@
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Upload a photo",
"Value": "Value",
"Values": "Values",
"Verification code sent": "Verification code sent",
"WebAuthn credentials": "WebAuthn credentials",

Some files were not shown because too many files have changed in this diff Show More