mirror of
https://github.com/zitadel/zitadel.git
synced 2025-04-21 10:01:32 +00:00
Merge branch 'refs/heads/main' into next
# Conflicts: # cmd/start/start.go # docs/sidebars.js # internal/api/grpc/action/v3alpha/execution_integration_test.go # internal/api/grpc/action/v3alpha/query_integration_test.go # internal/api/grpc/action/v3alpha/target_integration_test.go # internal/api/grpc/feature/v2beta/converter.go # internal/api/grpc/feature/v2beta/converter_test.go # internal/api/grpc/oidc/v2beta/oidc.go # internal/api/grpc/resources/action/v3alpha/server_integration_test.go # internal/api/grpc/settings/v2beta/server.go # internal/api/grpc/user/v2/query_integration_test.go # internal/api/grpc/user/v2beta/query.go # internal/api/grpc/user/v2beta/query_integration_test.go # internal/auth/repository/eventsourcing/eventstore/auth_request_test.go # internal/command/user_idp_link_test.go # internal/crypto/crypto.go # internal/integration/assert.go # internal/integration/client.go # proto/zitadel/action/v3alpha/target.proto # proto/zitadel/feature/v2/instance.proto # proto/zitadel/org/v2/org_service.proto # proto/zitadel/resources/action/v3alpha/action_service.proto # proto/zitadel/resources/action/v3alpha/execution.proto # proto/zitadel/resources/action/v3alpha/query.proto # proto/zitadel/user/v2/user_service.proto
This commit is contained in:
commit
bdae824e8c
8
.github/pull_request_template.md
vendored
8
.github/pull_request_template.md
vendored
@ -21,7 +21,7 @@ For example:
|
|||||||
|
|
||||||
Replace this example with links to related issues, discussions, discord threads, or other sources with more context.
|
Replace this example with links to related issues, discussions, discord threads, or other sources with more context.
|
||||||
Use the Closing #issue syntax for issues that are resolved with this PR.
|
Use the Closing #issue syntax for issues that are resolved with this PR.
|
||||||
- Closes #123
|
- Closes #xxx
|
||||||
- Discussion #456
|
- Discussion #xxx
|
||||||
- Follow-up for PR #789
|
- Follow-up for PR #xxx
|
||||||
- https://discord.com/channels/123/456
|
- https://discord.com/channels/xxx/xxx
|
||||||
|
@ -3,6 +3,31 @@
|
|||||||
Dear community!
|
Dear community!
|
||||||
We're excited to announce bi-weekly office hours.
|
We're excited to announce bi-weekly office hours.
|
||||||
|
|
||||||
|
## #4 Login UI deepdive
|
||||||
|
|
||||||
|
Dear community,
|
||||||
|
|
||||||
|
We are back from the summer pause with interesting topics.
|
||||||
|
We will showcase the new Login UI, provide insights into the application's architecture, session API, packages, OIDC middleware, customization options and settings, and offer a look ahead at upcoming features.
|
||||||
|
|
||||||
|
## What to expect:
|
||||||
|
|
||||||
|
* **Architecture of the Login UI**: Explore how server-side and client-side components interact within the new Login UI and NextJS framework.
|
||||||
|
* **Session API**: Understand the workings of the Session API
|
||||||
|
* **OIDC middleware configuration**: Learn how OIDC functions with the new Login UI and the necessary steps for a complete flow.
|
||||||
|
* **Customization Options / Settings**: Discover how to personalize the login and which ZITADEL settings are implemented.
|
||||||
|
* **Outlook**: Gain insights into future features
|
||||||
|
* **Q&A**
|
||||||
|
|
||||||
|
## Details:
|
||||||
|
|
||||||
|
* **Target Audience**: Developers using ZITADEL / Contributors
|
||||||
|
* **Topic**: New login UI and repo
|
||||||
|
* **Duration**: about 1 hour
|
||||||
|
* **When**: Wednesday 14th of August 19:00 UTC
|
||||||
|
* **Platform**: ZITADEL Discrod Server (Join us here: https://discord.gg/zitadel-927474939156643850?event=1270661421952274442)
|
||||||
|
|
||||||
|
|
||||||
## #2 New Resources and Settings APIs
|
## #2 New Resources and Settings APIs
|
||||||
|
|
||||||
**Shape the future of ZITADEL Let's redesign the API for a better developer experience!**
|
**Shape the future of ZITADEL Let's redesign the API for a better developer experience!**
|
||||||
|
File diff suppressed because one or more lines are too long
@ -1,6 +1,7 @@
|
|||||||
package initialise
|
package initialise
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/mitchellh/mapstructure"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"github.com/zitadel/logging"
|
"github.com/zitadel/logging"
|
||||||
|
|
||||||
@ -17,7 +18,10 @@ type Config struct {
|
|||||||
func MustNewConfig(v *viper.Viper) *Config {
|
func MustNewConfig(v *viper.Viper) *Config {
|
||||||
config := new(Config)
|
config := new(Config)
|
||||||
err := v.Unmarshal(config,
|
err := v.Unmarshal(config,
|
||||||
viper.DecodeHook(database.DecodeHook),
|
viper.DecodeHook(mapstructure.ComposeDecodeHookFunc(
|
||||||
|
database.DecodeHook,
|
||||||
|
mapstructure.TextUnmarshallerHookFunc(),
|
||||||
|
)),
|
||||||
)
|
)
|
||||||
logging.OnError(err).Fatal("unable to read config")
|
logging.OnError(err).Fatal("unable to read config")
|
||||||
|
|
||||||
|
@ -74,6 +74,7 @@ func mustNewConfig(v *viper.Viper, config any) {
|
|||||||
database.DecodeHook,
|
database.DecodeHook,
|
||||||
actions.HTTPConfigDecodeHook,
|
actions.HTTPConfigDecodeHook,
|
||||||
hook.EnumHookFunc(internal_authz.MemberTypeString),
|
hook.EnumHookFunc(internal_authz.MemberTypeString),
|
||||||
|
mapstructure.TextUnmarshallerHookFunc(),
|
||||||
)),
|
)),
|
||||||
)
|
)
|
||||||
logging.OnError(err).Fatal("unable to read default config")
|
logging.OnError(err).Fatal("unable to read default config")
|
||||||
|
@ -44,7 +44,7 @@ Migrate only copies events2 and unique constraints`,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func copyEventstore(ctx context.Context, config *Migration) {
|
func copyEventstore(ctx context.Context, config *Migration) {
|
||||||
sourceClient, err := db.Connect(config.Source, false, dialect.DBPurposeQuery)
|
sourceClient, err := db.Connect(config.Source, false, dialect.DBPurposeEventPusher)
|
||||||
logging.OnError(err).Fatal("unable to connect to source database")
|
logging.OnError(err).Fatal("unable to connect to source database")
|
||||||
defer sourceClient.Close()
|
defer sourceClient.Close()
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ func MustNewConfig(v *viper.Viper) *Config {
|
|||||||
mapstructure.StringToTimeHookFunc(time.RFC3339),
|
mapstructure.StringToTimeHookFunc(time.RFC3339),
|
||||||
mapstructure.StringToSliceHookFunc(","),
|
mapstructure.StringToSliceHookFunc(","),
|
||||||
hook.EnumHookFunc(internal_authz.MemberTypeString),
|
hook.EnumHookFunc(internal_authz.MemberTypeString),
|
||||||
|
mapstructure.TextUnmarshallerHookFunc(),
|
||||||
)),
|
)),
|
||||||
)
|
)
|
||||||
logging.OnError(err).Fatal("unable to read default config")
|
logging.OnError(err).Fatal("unable to read default config")
|
||||||
|
@ -74,6 +74,7 @@ func MustNewConfig(v *viper.Viper) *Config {
|
|||||||
mapstructure.StringToTimeDurationHookFunc(),
|
mapstructure.StringToTimeDurationHookFunc(),
|
||||||
mapstructure.StringToTimeHookFunc(time.RFC3339),
|
mapstructure.StringToTimeHookFunc(time.RFC3339),
|
||||||
mapstructure.StringToSliceHookFunc(","),
|
mapstructure.StringToSliceHookFunc(","),
|
||||||
|
mapstructure.TextUnmarshallerHookFunc(),
|
||||||
)),
|
)),
|
||||||
)
|
)
|
||||||
logging.OnError(err).Fatal("unable to read default config")
|
logging.OnError(err).Fatal("unable to read default config")
|
||||||
@ -139,6 +140,7 @@ func MustNewSteps(v *viper.Viper) *Steps {
|
|||||||
mapstructure.StringToTimeDurationHookFunc(),
|
mapstructure.StringToTimeDurationHookFunc(),
|
||||||
mapstructure.StringToTimeHookFunc(time.RFC3339),
|
mapstructure.StringToTimeHookFunc(time.RFC3339),
|
||||||
mapstructure.StringToSliceHookFunc(","),
|
mapstructure.StringToSliceHookFunc(","),
|
||||||
|
mapstructure.TextUnmarshallerHookFunc(),
|
||||||
)),
|
)),
|
||||||
)
|
)
|
||||||
logging.OnError(err).Fatal("unable to read steps")
|
logging.OnError(err).Fatal("unable to read steps")
|
||||||
|
@ -31,6 +31,7 @@ import (
|
|||||||
"github.com/zitadel/zitadel/internal/query/projection"
|
"github.com/zitadel/zitadel/internal/query/projection"
|
||||||
static_config "github.com/zitadel/zitadel/internal/static/config"
|
static_config "github.com/zitadel/zitadel/internal/static/config"
|
||||||
metrics "github.com/zitadel/zitadel/internal/telemetry/metrics/config"
|
metrics "github.com/zitadel/zitadel/internal/telemetry/metrics/config"
|
||||||
|
profiler "github.com/zitadel/zitadel/internal/telemetry/profiler/config"
|
||||||
tracing "github.com/zitadel/zitadel/internal/telemetry/tracing/config"
|
tracing "github.com/zitadel/zitadel/internal/telemetry/tracing/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -41,12 +42,15 @@ type Config struct {
|
|||||||
ExternalDomain string
|
ExternalDomain string
|
||||||
ExternalSecure bool
|
ExternalSecure bool
|
||||||
TLS network.TLS
|
TLS network.TLS
|
||||||
|
InstanceHostHeaders []string
|
||||||
|
PublicHostHeaders []string
|
||||||
HTTP2HostHeader string
|
HTTP2HostHeader string
|
||||||
HTTP1HostHeader string
|
HTTP1HostHeader string
|
||||||
WebAuthNName string
|
WebAuthNName string
|
||||||
Database database.Config
|
Database database.Config
|
||||||
Tracing tracing.Config
|
Tracing tracing.Config
|
||||||
Metrics metrics.Config
|
Metrics metrics.Config
|
||||||
|
Profiler profiler.Config
|
||||||
Projections projection.Config
|
Projections projection.Config
|
||||||
Auth auth_es.Config
|
Auth auth_es.Config
|
||||||
Admin admin_es.Config
|
Admin admin_es.Config
|
||||||
@ -98,6 +102,7 @@ func MustNewConfig(v *viper.Viper) *Config {
|
|||||||
mapstructure.StringToTimeDurationHookFunc(),
|
mapstructure.StringToTimeDurationHookFunc(),
|
||||||
mapstructure.StringToTimeHookFunc(time.RFC3339),
|
mapstructure.StringToTimeHookFunc(time.RFC3339),
|
||||||
mapstructure.StringToSliceHookFunc(","),
|
mapstructure.StringToSliceHookFunc(","),
|
||||||
|
mapstructure.TextUnmarshallerHookFunc(),
|
||||||
)),
|
)),
|
||||||
)
|
)
|
||||||
logging.OnError(err).Fatal("unable to read config")
|
logging.OnError(err).Fatal("unable to read config")
|
||||||
@ -111,6 +116,9 @@ func MustNewConfig(v *viper.Viper) *Config {
|
|||||||
err = config.Metrics.NewMeter()
|
err = config.Metrics.NewMeter()
|
||||||
logging.OnError(err).Fatal("unable to set meter")
|
logging.OnError(err).Fatal("unable to set meter")
|
||||||
|
|
||||||
|
err = config.Profiler.NewProfiler()
|
||||||
|
logging.OnError(err).Fatal("unable to set profiler")
|
||||||
|
|
||||||
id.Configure(config.Machine)
|
id.Configure(config.Machine)
|
||||||
actions.SetHTTPConfig(&config.Actions.HTTP)
|
actions.SetHTTPConfig(&config.Actions.HTTP)
|
||||||
|
|
||||||
|
@ -34,16 +34,18 @@ import (
|
|||||||
"github.com/zitadel/zitadel/internal/api"
|
"github.com/zitadel/zitadel/internal/api"
|
||||||
"github.com/zitadel/zitadel/internal/api/assets"
|
"github.com/zitadel/zitadel/internal/api/assets"
|
||||||
internal_authz "github.com/zitadel/zitadel/internal/api/authz"
|
internal_authz "github.com/zitadel/zitadel/internal/api/authz"
|
||||||
action_v3_alpha "github.com/zitadel/zitadel/internal/api/grpc/action/v3alpha"
|
|
||||||
"github.com/zitadel/zitadel/internal/api/grpc/admin"
|
"github.com/zitadel/zitadel/internal/api/grpc/admin"
|
||||||
"github.com/zitadel/zitadel/internal/api/grpc/auth"
|
"github.com/zitadel/zitadel/internal/api/grpc/auth"
|
||||||
feature_v2 "github.com/zitadel/zitadel/internal/api/grpc/feature/v2"
|
feature_v2 "github.com/zitadel/zitadel/internal/api/grpc/feature/v2"
|
||||||
feature_v2beta "github.com/zitadel/zitadel/internal/api/grpc/feature/v2beta"
|
feature_v2beta "github.com/zitadel/zitadel/internal/api/grpc/feature/v2beta"
|
||||||
|
idp_v2 "github.com/zitadel/zitadel/internal/api/grpc/idp/v2"
|
||||||
"github.com/zitadel/zitadel/internal/api/grpc/management"
|
"github.com/zitadel/zitadel/internal/api/grpc/management"
|
||||||
oidc_v2 "github.com/zitadel/zitadel/internal/api/grpc/oidc/v2"
|
oidc_v2 "github.com/zitadel/zitadel/internal/api/grpc/oidc/v2"
|
||||||
oidc_v2beta "github.com/zitadel/zitadel/internal/api/grpc/oidc/v2beta"
|
oidc_v2beta "github.com/zitadel/zitadel/internal/api/grpc/oidc/v2beta"
|
||||||
org_v2 "github.com/zitadel/zitadel/internal/api/grpc/org/v2"
|
org_v2 "github.com/zitadel/zitadel/internal/api/grpc/org/v2"
|
||||||
org_v2beta "github.com/zitadel/zitadel/internal/api/grpc/org/v2beta"
|
org_v2beta "github.com/zitadel/zitadel/internal/api/grpc/org/v2beta"
|
||||||
|
action_v3_alpha "github.com/zitadel/zitadel/internal/api/grpc/resources/action/v3alpha"
|
||||||
|
"github.com/zitadel/zitadel/internal/api/grpc/resources/webkey/v3"
|
||||||
session_v2 "github.com/zitadel/zitadel/internal/api/grpc/session/v2"
|
session_v2 "github.com/zitadel/zitadel/internal/api/grpc/session/v2"
|
||||||
session_v2beta "github.com/zitadel/zitadel/internal/api/grpc/session/v2beta"
|
session_v2beta "github.com/zitadel/zitadel/internal/api/grpc/session/v2beta"
|
||||||
settings_v2 "github.com/zitadel/zitadel/internal/api/grpc/settings/v2"
|
settings_v2 "github.com/zitadel/zitadel/internal/api/grpc/settings/v2"
|
||||||
@ -59,6 +61,7 @@ import (
|
|||||||
"github.com/zitadel/zitadel/internal/api/robots_txt"
|
"github.com/zitadel/zitadel/internal/api/robots_txt"
|
||||||
"github.com/zitadel/zitadel/internal/api/saml"
|
"github.com/zitadel/zitadel/internal/api/saml"
|
||||||
"github.com/zitadel/zitadel/internal/api/ui/console"
|
"github.com/zitadel/zitadel/internal/api/ui/console"
|
||||||
|
"github.com/zitadel/zitadel/internal/api/ui/console/path"
|
||||||
"github.com/zitadel/zitadel/internal/api/ui/login"
|
"github.com/zitadel/zitadel/internal/api/ui/login"
|
||||||
auth_es "github.com/zitadel/zitadel/internal/auth/repository/eventsourcing"
|
auth_es "github.com/zitadel/zitadel/internal/auth/repository/eventsourcing"
|
||||||
"github.com/zitadel/zitadel/internal/authz"
|
"github.com/zitadel/zitadel/internal/authz"
|
||||||
@ -346,7 +349,7 @@ func startAPIs(
|
|||||||
}
|
}
|
||||||
oidcPrefixes := []string{"/.well-known/openid-configuration", "/oidc/v1", "/oauth/v2"}
|
oidcPrefixes := []string{"/.well-known/openid-configuration", "/oidc/v1", "/oauth/v2"}
|
||||||
// always set the origin in the context if available in the http headers, no matter for what protocol
|
// always set the origin in the context if available in the http headers, no matter for what protocol
|
||||||
router.Use(middleware.WithOrigin(config.ExternalSecure))
|
router.Use(middleware.WithOrigin(config.ExternalSecure, config.HTTP1HostHeader, config.HTTP2HostHeader, config.InstanceHostHeaders, config.PublicHostHeaders))
|
||||||
systemTokenVerifier, err := internal_authz.StartSystemTokenVerifierFromConfig(http_util.BuildHTTP(config.ExternalDomain, config.ExternalPort, config.ExternalSecure), config.SystemAPIUsers)
|
systemTokenVerifier, err := internal_authz.StartSystemTokenVerifierFromConfig(http_util.BuildHTTP(config.ExternalDomain, config.ExternalPort, config.ExternalSecure), config.SystemAPIUsers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -374,7 +377,7 @@ func startAPIs(
|
|||||||
http_util.WithMaxAge(int(math.Floor(config.Quotas.Access.ExhaustedCookieMaxAge.Seconds()))),
|
http_util.WithMaxAge(int(math.Floor(config.Quotas.Access.ExhaustedCookieMaxAge.Seconds()))),
|
||||||
)
|
)
|
||||||
limitingAccessInterceptor := middleware.NewAccessInterceptor(accessSvc, exhaustedCookieHandler, &config.Quotas.Access.AccessConfig)
|
limitingAccessInterceptor := middleware.NewAccessInterceptor(accessSvc, exhaustedCookieHandler, &config.Quotas.Access.AccessConfig)
|
||||||
apis, err := api.New(ctx, config.Port, router, queries, verifier, config.InternalAuthZ, tlsConfig, config.HTTP2HostHeader, config.HTTP1HostHeader, config.ExternalDomain, limitingAccessInterceptor)
|
apis, err := api.New(ctx, config.Port, router, queries, verifier, config.InternalAuthZ, tlsConfig, config.ExternalDomain, append(config.InstanceHostHeaders, config.PublicHostHeaders...), limitingAccessInterceptor)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error creating api %w", err)
|
return nil, fmt.Errorf("error creating api %w", err)
|
||||||
}
|
}
|
||||||
@ -396,25 +399,25 @@ func startAPIs(
|
|||||||
if err := apis.RegisterServer(ctx, system.CreateServer(commands, queries, config.Database.DatabaseName(), config.DefaultInstance, config.ExternalDomain), tlsConfig); err != nil {
|
if err := apis.RegisterServer(ctx, system.CreateServer(commands, queries, config.Database.DatabaseName(), config.DefaultInstance, config.ExternalDomain), tlsConfig); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterServer(ctx, admin.CreateServer(config.Database.DatabaseName(), commands, queries, config.SystemDefaults, config.ExternalSecure, keys.User, config.AuditLogRetention), tlsConfig); err != nil {
|
if err := apis.RegisterServer(ctx, admin.CreateServer(config.Database.DatabaseName(), commands, queries, keys.User, config.AuditLogRetention), tlsConfig); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterServer(ctx, management.CreateServer(commands, queries, config.SystemDefaults, keys.User, config.ExternalSecure), tlsConfig); err != nil {
|
if err := apis.RegisterServer(ctx, management.CreateServer(commands, queries, config.SystemDefaults, keys.User), tlsConfig); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterServer(ctx, auth.CreateServer(commands, queries, authRepo, config.SystemDefaults, keys.User, config.ExternalSecure), tlsConfig); err != nil {
|
if err := apis.RegisterServer(ctx, auth.CreateServer(commands, queries, authRepo, config.SystemDefaults, keys.User), tlsConfig); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterService(ctx, user_v2beta.CreateServer(commands, queries, keys.User, keys.IDPConfig, idp.CallbackURL(config.ExternalSecure), idp.SAMLRootURL(config.ExternalSecure), assets.AssetAPI(config.ExternalSecure), permissionCheck)); err != nil {
|
if err := apis.RegisterService(ctx, user_v2beta.CreateServer(commands, queries, keys.User, keys.IDPConfig, idp.CallbackURL(), idp.SAMLRootURL(), assets.AssetAPI(), permissionCheck)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterService(ctx, user_v2.CreateServer(commands, queries, keys.User, keys.IDPConfig, idp.CallbackURL(config.ExternalSecure), idp.SAMLRootURL(config.ExternalSecure), assets.AssetAPI(config.ExternalSecure), permissionCheck)); err != nil {
|
if err := apis.RegisterService(ctx, user_v2.CreateServer(commands, queries, keys.User, keys.IDPConfig, idp.CallbackURL(), idp.SAMLRootURL(), assets.AssetAPI(), permissionCheck)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterService(ctx, session_v2beta.CreateServer(commands, queries)); err != nil {
|
if err := apis.RegisterService(ctx, session_v2beta.CreateServer(commands, queries)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterService(ctx, settings_v2beta.CreateServer(commands, queries, config.ExternalSecure)); err != nil {
|
if err := apis.RegisterService(ctx, settings_v2beta.CreateServer(commands, queries)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterService(ctx, org_v2beta.CreateServer(commands, queries, permissionCheck)); err != nil {
|
if err := apis.RegisterService(ctx, org_v2beta.CreateServer(commands, queries, permissionCheck)); err != nil {
|
||||||
@ -426,7 +429,7 @@ func startAPIs(
|
|||||||
if err := apis.RegisterService(ctx, session_v2.CreateServer(commands, queries)); err != nil {
|
if err := apis.RegisterService(ctx, session_v2.CreateServer(commands, queries)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterService(ctx, settings_v2.CreateServer(commands, queries, config.ExternalSecure)); err != nil {
|
if err := apis.RegisterService(ctx, settings_v2.CreateServer(commands, queries)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterService(ctx, org_v2.CreateServer(commands, queries, permissionCheck)); err != nil {
|
if err := apis.RegisterService(ctx, org_v2.CreateServer(commands, queries, permissionCheck)); err != nil {
|
||||||
@ -435,17 +438,23 @@ func startAPIs(
|
|||||||
if err := apis.RegisterService(ctx, feature_v2.CreateServer(commands, queries)); err != nil {
|
if err := apis.RegisterService(ctx, feature_v2.CreateServer(commands, queries)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterService(ctx, action_v3_alpha.CreateServer(commands, queries, domain.AllFunctions, apis.ListGrpcMethods, apis.ListGrpcServices)); err != nil {
|
if err := apis.RegisterService(ctx, idp_v2.CreateServer(commands, queries, permissionCheck)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := apis.RegisterService(ctx, action_v3_alpha.CreateServer(config.SystemDefaults, commands, queries, domain.AllFunctions, apis.ListGrpcMethods, apis.ListGrpcServices)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := apis.RegisterService(ctx, user_schema_v3_alpha.CreateServer(commands, queries)); err != nil {
|
if err := apis.RegisterService(ctx, user_schema_v3_alpha.CreateServer(commands, queries)); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
instanceInterceptor := middleware.InstanceInterceptor(queries, config.HTTP1HostHeader, config.ExternalDomain, login.IgnoreInstanceEndpoints...)
|
if err := apis.RegisterService(ctx, webkey.CreateServer(commands, queries)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
instanceInterceptor := middleware.InstanceInterceptor(queries, config.ExternalDomain, login.IgnoreInstanceEndpoints...)
|
||||||
assetsCache := middleware.AssetsCacheInterceptor(config.AssetStorage.Cache.MaxAge, config.AssetStorage.Cache.SharedMaxAge)
|
assetsCache := middleware.AssetsCacheInterceptor(config.AssetStorage.Cache.MaxAge, config.AssetStorage.Cache.SharedMaxAge)
|
||||||
apis.RegisterHandlerOnPrefix(assets.HandlerPrefix, assets.NewHandler(commands, verifier, config.InternalAuthZ, id.SonyFlakeGenerator(), store, queries, middleware.CallDurationHandler, instanceInterceptor.Handler, assetsCache.Handler, limitingAccessInterceptor.Handle))
|
apis.RegisterHandlerOnPrefix(assets.HandlerPrefix, assets.NewHandler(commands, verifier, config.InternalAuthZ, id.SonyFlakeGenerator(), store, queries, middleware.CallDurationHandler, instanceInterceptor.Handler, assetsCache.Handler, limitingAccessInterceptor.Handle))
|
||||||
|
|
||||||
apis.RegisterHandlerOnPrefix(idp.HandlerPrefix, idp.NewHandler(commands, queries, keys.IDPConfig, config.ExternalSecure, instanceInterceptor.Handler))
|
apis.RegisterHandlerOnPrefix(idp.HandlerPrefix, idp.NewHandler(commands, queries, keys.IDPConfig, instanceInterceptor.Handler))
|
||||||
|
|
||||||
userAgentInterceptor, err := middleware.NewUserAgentHandler(config.UserAgentCookie, keys.UserAgentCookieKey, id.SonyFlakeGenerator(), config.ExternalSecure, login.EndpointResources, login.EndpointExternalLoginCallbackFormPost, login.EndpointSAMLACS)
|
userAgentInterceptor, err := middleware.NewUserAgentHandler(config.UserAgentCookie, keys.UserAgentCookieKey, id.SonyFlakeGenerator(), config.ExternalSecure, login.EndpointResources, login.EndpointExternalLoginCallbackFormPost, login.EndpointSAMLACS)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -482,8 +491,8 @@ func startAPIs(
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to start console: %w", err)
|
return nil, fmt.Errorf("unable to start console: %w", err)
|
||||||
}
|
}
|
||||||
apis.RegisterHandlerOnPrefix(console.HandlerPrefix, c)
|
apis.RegisterHandlerOnPrefix(path.HandlerPrefix, c)
|
||||||
consolePath := console.HandlerPrefix + "/"
|
consolePath := path.HandlerPrefix + "/"
|
||||||
l, err := login.CreateLogin(
|
l, err := login.CreateLogin(
|
||||||
config.Login,
|
config.Login,
|
||||||
commands,
|
commands,
|
||||||
|
@ -28,8 +28,8 @@
|
|||||||
"@fortawesome/angular-fontawesome": "^0.13.0",
|
"@fortawesome/angular-fontawesome": "^0.13.0",
|
||||||
"@fortawesome/fontawesome-svg-core": "^6.4.2",
|
"@fortawesome/fontawesome-svg-core": "^6.4.2",
|
||||||
"@fortawesome/free-brands-svg-icons": "^6.4.2",
|
"@fortawesome/free-brands-svg-icons": "^6.4.2",
|
||||||
"@grpc/grpc-js": "^1.9.3",
|
"@grpc/grpc-js": "^1.11.1",
|
||||||
"@netlify/framework-info": "^9.8.10",
|
"@netlify/framework-info": "^9.8.13",
|
||||||
"@ngx-translate/core": "^15.0.0",
|
"@ngx-translate/core": "^15.0.0",
|
||||||
"angular-oauth2-oidc": "^15.0.1",
|
"angular-oauth2-oidc": "^15.0.1",
|
||||||
"angularx-qrcode": "^16.0.0",
|
"angularx-qrcode": "^16.0.0",
|
||||||
@ -42,7 +42,7 @@
|
|||||||
"google-protobuf": "^3.21.2",
|
"google-protobuf": "^3.21.2",
|
||||||
"grpc-web": "^1.4.1",
|
"grpc-web": "^1.4.1",
|
||||||
"i18n-iso-countries": "^7.7.0",
|
"i18n-iso-countries": "^7.7.0",
|
||||||
"libphonenumber-js": "^1.10.49",
|
"libphonenumber-js": "^1.11.4",
|
||||||
"material-design-icons-iconfont": "^6.1.1",
|
"material-design-icons-iconfont": "^6.1.1",
|
||||||
"moment": "^2.29.4",
|
"moment": "^2.29.4",
|
||||||
"ngx-color": "^9.0.0",
|
"ngx-color": "^9.0.0",
|
||||||
@ -50,7 +50,7 @@
|
|||||||
"rxjs": "~7.8.0",
|
"rxjs": "~7.8.0",
|
||||||
"tinycolor2": "^1.6.0",
|
"tinycolor2": "^1.6.0",
|
||||||
"tslib": "^2.6.2",
|
"tslib": "^2.6.2",
|
||||||
"uuid": "^9.0.1",
|
"uuid": "^10.0.0",
|
||||||
"zone.js": "~0.13.3"
|
"zone.js": "~0.13.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@ -60,24 +60,24 @@
|
|||||||
"@angular-eslint/eslint-plugin-template": "16.2.0",
|
"@angular-eslint/eslint-plugin-template": "16.2.0",
|
||||||
"@angular-eslint/schematics": "16.2.0",
|
"@angular-eslint/schematics": "16.2.0",
|
||||||
"@angular-eslint/template-parser": "16.2.0",
|
"@angular-eslint/template-parser": "16.2.0",
|
||||||
"@angular/cli": "^16.2.2",
|
"@angular/cli": "^16.2.14",
|
||||||
"@angular/compiler-cli": "^16.2.5",
|
"@angular/compiler-cli": "^16.2.5",
|
||||||
"@angular/language-service": "^16.2.5",
|
"@angular/language-service": "^16.2.5",
|
||||||
"@bufbuild/buf": "^1.23.1",
|
"@bufbuild/buf": "^1.34.0",
|
||||||
"@types/file-saver": "^2.0.7",
|
"@types/file-saver": "^2.0.7",
|
||||||
"@types/google-protobuf": "^3.15.3",
|
"@types/google-protobuf": "^3.15.3",
|
||||||
"@types/jasmine": "~5.1.4",
|
"@types/jasmine": "~5.1.4",
|
||||||
"@types/jasminewd2": "~2.0.13",
|
"@types/jasminewd2": "~2.0.13",
|
||||||
"@types/jsonwebtoken": "^9.0.5",
|
"@types/jsonwebtoken": "^9.0.6",
|
||||||
"@types/node": "^20.7.0",
|
"@types/node": "^20.7.0",
|
||||||
"@types/opentype.js": "^1.3.8",
|
"@types/opentype.js": "^1.3.8",
|
||||||
"@types/qrcode": "^1.5.2",
|
"@types/qrcode": "^1.5.2",
|
||||||
"@types/uuid": "^9.0.7",
|
"@types/uuid": "^10.0.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.59.11",
|
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
||||||
"@typescript-eslint/parser": "^5.60.1",
|
"@typescript-eslint/parser": "^5.60.1",
|
||||||
"codelyzer": "^6.0.2",
|
"codelyzer": "^6.0.2",
|
||||||
"eslint": "^8.50.0",
|
"eslint": "^8.50.0",
|
||||||
"jasmine-core": "~4.6.0",
|
"jasmine-core": "~5.2.0",
|
||||||
"jasmine-spec-reporter": "~7.0.0",
|
"jasmine-spec-reporter": "~7.0.0",
|
||||||
"karma": "^6.4.2",
|
"karma": "^6.4.2",
|
||||||
"karma-chrome-launcher": "^3.2.0",
|
"karma-chrome-launcher": "^3.2.0",
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
useragent: type === OIDCAppType.OIDC_APP_TYPE_USER_AGENT,
|
useragent: type === OIDCAppType.OIDC_APP_TYPE_USER_AGENT,
|
||||||
native: type === OIDCAppType.OIDC_APP_TYPE_NATIVE,
|
native: type === OIDCAppType.OIDC_APP_TYPE_NATIVE,
|
||||||
api: isApiApp,
|
api: isApiApp,
|
||||||
saml: type === 'SAML'
|
saml: type === 'SAML',
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<ng-content></ng-content>
|
<ng-content></ng-content>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
fontSize: fontSize - 1 + 'px',
|
fontSize: fontSize - 1 + 'px',
|
||||||
fontWeight: fontWeight,
|
fontWeight: fontWeight,
|
||||||
background: (themeService.isDarkTheme | async) ? color[900] : color[300],
|
background: (themeService.isDarkTheme | async) ? color[900] : color[300],
|
||||||
color: (themeService.isDarkTheme | async) ? color[200] : color[900]
|
color: (themeService.isDarkTheme | async) ? color[200] : color[900],
|
||||||
}"
|
}"
|
||||||
[ngClass]="{ active: active }"
|
[ngClass]="{ active: active }"
|
||||||
>
|
>
|
||||||
|
@ -66,8 +66,8 @@
|
|||||||
mode: {
|
mode: {
|
||||||
name: 'javascript',
|
name: 'javascript',
|
||||||
json: true,
|
json: true,
|
||||||
statementIndent: 2
|
statementIndent: 2,
|
||||||
}
|
},
|
||||||
}"
|
}"
|
||||||
></ngx-codemirror>
|
></ngx-codemirror>
|
||||||
</div>
|
</div>
|
||||||
|
@ -101,7 +101,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: idp.state === IDPState.IDP_STATE_ACTIVE,
|
active: idp.state === IDPState.IDP_STATE_ACTIVE,
|
||||||
inactive: idp.state === IDPState.IDP_STATE_INACTIVE
|
inactive: idp.state === IDPState.IDP_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
>{{ 'IDP.STATES.' + idp.state | translate }}</span
|
>{{ 'IDP.STATES.' + idp.state | translate }}</span
|
||||||
>
|
>
|
||||||
@ -142,7 +142,7 @@
|
|||||||
? 'iam.idp.write'
|
? 'iam.idp.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'org.idp.write'
|
? 'org.idp.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -162,7 +162,7 @@
|
|||||||
? 'iam.idp.write'
|
? 'iam.idp.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'org.idp.write'
|
? 'org.idp.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -186,7 +186,7 @@
|
|||||||
? 'iam.idp.write'
|
? 'iam.idp.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'org.idp.write'
|
? 'org.idp.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: user.state === UserState.USER_STATE_ACTIVE,
|
active: user.state === UserState.USER_STATE_ACTIVE,
|
||||||
inactive: user.state === UserState.USER_STATE_INACTIVE
|
inactive: user.state === UserState.USER_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ 'USER.DATA.STATE' + user.state | translate }}
|
{{ 'USER.DATA.STATE' + user.state | translate }}
|
||||||
@ -57,7 +57,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: instance.state === State.INSTANCE_STATE_RUNNING,
|
active: instance.state === State.INSTANCE_STATE_RUNNING,
|
||||||
inactive: instance.state === State.INSTANCE_STATE_STOPPED || instance.state === State.INSTANCE_STATE_STOPPING
|
inactive: instance.state === State.INSTANCE_STATE_STOPPED || instance.state === State.INSTANCE_STATE_STOPPING,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ 'IAM.STATE.' + instance.state | translate }}
|
{{ 'IAM.STATE.' + instance.state | translate }}
|
||||||
@ -164,7 +164,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: project.state === ProjectState.PROJECT_STATE_ACTIVE,
|
active: project.state === ProjectState.PROJECT_STATE_ACTIVE,
|
||||||
inactive: project.state === ProjectState.PROJECT_STATE_INACTIVE
|
inactive: project.state === ProjectState.PROJECT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ 'PROJECT.STATE.' + project.state | translate }}
|
{{ 'PROJECT.STATE.' + project.state | translate }}
|
||||||
@ -199,7 +199,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: grantedProject.state === ProjectGrantState.PROJECT_GRANT_STATE_ACTIVE,
|
active: grantedProject.state === ProjectGrantState.PROJECT_GRANT_STATE_ACTIVE,
|
||||||
inactive: grantedProject.state === ProjectGrantState.PROJECT_GRANT_STATE_INACTIVE
|
inactive: grantedProject.state === ProjectGrantState.PROJECT_GRANT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ 'PROJECT.STATE.' + grantedProject.state | translate }}
|
{{ 'PROJECT.STATE.' + grantedProject.state | translate }}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
warn: type === 'WARN',
|
warn: type === 'WARN',
|
||||||
alert: type === 'ALERT',
|
alert: type === 'ALERT',
|
||||||
success: type === 'SUCCESS',
|
success: type === 'SUCCESS',
|
||||||
fit: fitWidth
|
fit: fitWidth,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<i *ngIf="type === 'INFO'" class="icon las la-info"></i>
|
<i *ngIf="type === 'INFO'" class="icon las la-info"></i>
|
||||||
|
@ -64,14 +64,14 @@
|
|||||||
<div
|
<div
|
||||||
class="icon-wrapper"
|
class="icon-wrapper"
|
||||||
[ngStyle]="{
|
[ngStyle]="{
|
||||||
background: (themeService.isDarkTheme | async) ? action.darkcolor + 50 : action.lightcolor + 50
|
background: (themeService.isDarkTheme | async) ? action.darkcolor + 50 : action.lightcolor + 50,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inner"
|
class="inner"
|
||||||
[ngStyle]="{
|
[ngStyle]="{
|
||||||
background: (themeService.isDarkTheme | async) ? action.darkcolor : action.lightcolor,
|
background: (themeService.isDarkTheme | async) ? action.darkcolor : action.lightcolor,
|
||||||
color: (themeService.isDarkTheme | async) ? action.lightcolor : action.darkcolor
|
color: (themeService.isDarkTheme | async) ? action.lightcolor : action.darkcolor,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<i class="{{ action.iconClasses }}"></i>
|
<i class="{{ action.iconClasses }}"></i>
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
mat-button
|
mat-button
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: pinnedorg.id === org.id,
|
active: pinnedorg.id === org.id,
|
||||||
'border-bottom': pinned.selected.length && i === pinned.selected.length - 1
|
'border-bottom': pinned.selected.length && i === pinned.selected.length - 1,
|
||||||
}"
|
}"
|
||||||
[disabled]="!pinnedorg.id"
|
[disabled]="!pinnedorg.id"
|
||||||
*ngFor="let pinnedorg of pinned.selected; index as i"
|
*ngFor="let pinnedorg of pinned.selected; index as i"
|
||||||
|
@ -70,7 +70,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: org.state === OrgState.ORG_STATE_ACTIVE,
|
active: org.state === OrgState.ORG_STATE_ACTIVE,
|
||||||
inactive: org.state === OrgState.ORG_STATE_INACTIVE
|
inactive: org.state === OrgState.ORG_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
*ngIf="org.state"
|
*ngIf="org.state"
|
||||||
>{{ 'ORG.STATE.' + org.state | translate }}</span
|
>{{ 'ORG.STATE.' + org.state | translate }}</span
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -44,7 +44,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -98,7 +98,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -124,7 +124,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -147,7 +147,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -63,7 +63,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -90,7 +90,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -112,7 +112,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -135,7 +135,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -215,7 +215,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -241,7 +241,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -276,7 +276,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -305,7 +305,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -334,7 +334,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -357,7 +357,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -380,7 +380,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -403,7 +403,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -426,7 +426,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -452,7 +452,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: twilio.state === SMSProviderConfigState.SMS_PROVIDER_CONFIG_ACTIVE,
|
active: twilio.state === SMSProviderConfigState.SMS_PROVIDER_CONFIG_ACTIVE,
|
||||||
inactive: twilio.state === SMSProviderConfigState.SMS_PROVIDER_CONFIG_INACTIVE
|
inactive: twilio.state === SMSProviderConfigState.SMS_PROVIDER_CONFIG_INACTIVE,
|
||||||
}"
|
}"
|
||||||
>{{ 'SETTING.SMS.SMSPROVIDERSTATE.' + twilio.state | translate }}</span
|
>{{ 'SETTING.SMS.SMSPROVIDERSTATE.' + twilio.state | translate }}</span
|
||||||
>
|
>
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -152,7 +152,7 @@
|
|||||||
? 'iam.policy.delete'
|
? 'iam.policy.delete'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.delete'
|
? 'policy.delete'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -176,7 +176,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -243,7 +243,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -273,7 +273,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -314,7 +314,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -344,7 +344,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -387,7 +387,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -409,7 +409,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -432,7 +432,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -455,7 +455,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -482,7 +482,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -504,7 +504,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -527,7 +527,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -549,7 +549,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -594,7 +594,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -632,7 +632,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -671,7 +671,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
@ -699,7 +699,7 @@
|
|||||||
? 'iam.policy.write'
|
? 'iam.policy.write'
|
||||||
: serviceType === PolicyComponentServiceType.MGMT
|
: serviceType === PolicyComponentServiceType.MGMT
|
||||||
? 'policy.write'
|
? 'policy.write'
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async) === false
|
| async) === false
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
? $any(project)?.id
|
? $any(project)?.id
|
||||||
: projectType === ProjectType.PROJECTTYPE_GRANTED
|
: projectType === ProjectType.PROJECTTYPE_GRANTED
|
||||||
? $any(project)?.projectId
|
? $any(project)?.projectId
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async
|
| async
|
||||||
@ -36,7 +36,7 @@
|
|||||||
? $any(project)?.id
|
? $any(project)?.id
|
||||||
: projectType === ProjectType.PROJECTTYPE_GRANTED
|
: projectType === ProjectType.PROJECTTYPE_GRANTED
|
||||||
? $any(project)?.projectId
|
? $any(project)?.projectId
|
||||||
: ''
|
: '',
|
||||||
]
|
]
|
||||||
| hasRole
|
| hasRole
|
||||||
| async
|
| async
|
||||||
@ -52,7 +52,7 @@
|
|||||||
: projectType === ProjectType.PROJECTTYPE_GRANTED
|
: projectType === ProjectType.PROJECTTYPE_GRANTED
|
||||||
? $any(project)?.projectId
|
? $any(project)?.projectId
|
||||||
: '',
|
: '',
|
||||||
'project.member.delete'
|
'project.member.delete',
|
||||||
]"
|
]"
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
@ -76,7 +76,7 @@
|
|||||||
: projectType === ProjectType.PROJECTTYPE_GRANTED
|
: projectType === ProjectType.PROJECTTYPE_GRANTED
|
||||||
? $any(project)?.projectId
|
? $any(project)?.projectId
|
||||||
: '',
|
: '',
|
||||||
'project.member.write'
|
'project.member.write',
|
||||||
]"
|
]"
|
||||||
>
|
>
|
||||||
<button color="primary" (click)="openAddMember()" class="cnsl-action-button" mat-raised-button>
|
<button color="primary" (click)="openAddMember()" class="cnsl-action-button" mat-raised-button>
|
||||||
|
@ -47,7 +47,7 @@
|
|||||||
matTooltip="{{ 'PROJECT.STATE.' + shortcut.state | translate }}"
|
matTooltip="{{ 'PROJECT.STATE.' + shortcut.state | translate }}"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: shortcut.state === ProjectState.PROJECT_STATE_ACTIVE,
|
active: shortcut.state === ProjectState.PROJECT_STATE_ACTIVE,
|
||||||
inactive: shortcut.state === ProjectState.PROJECT_STATE_INACTIVE
|
inactive: shortcut.state === ProjectState.PROJECT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
></div>
|
></div>
|
||||||
</a>
|
</a>
|
||||||
@ -85,7 +85,7 @@
|
|||||||
matTooltip="{{ 'PROJECT.STATE.' + shortcut.state | translate }}"
|
matTooltip="{{ 'PROJECT.STATE.' + shortcut.state | translate }}"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: shortcut.state === ProjectState.PROJECT_STATE_ACTIVE,
|
active: shortcut.state === ProjectState.PROJECT_STATE_ACTIVE,
|
||||||
inactive: shortcut.state === ProjectState.PROJECT_STATE_INACTIVE
|
inactive: shortcut.state === ProjectState.PROJECT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
></div>
|
></div>
|
||||||
</a>
|
</a>
|
||||||
@ -124,7 +124,7 @@
|
|||||||
matTooltip="{{ 'PROJECT.STATE.' + shortcut.state | translate }}"
|
matTooltip="{{ 'PROJECT.STATE.' + shortcut.state | translate }}"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: shortcut.state === ProjectState.PROJECT_STATE_ACTIVE,
|
active: shortcut.state === ProjectState.PROJECT_STATE_ACTIVE,
|
||||||
inactive: shortcut.state === ProjectState.PROJECT_STATE_INACTIVE
|
inactive: shortcut.state === ProjectState.PROJECT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
></div>
|
></div>
|
||||||
</a>
|
</a>
|
||||||
@ -174,7 +174,7 @@
|
|||||||
matTooltip="{{ 'PROJECT.STATE.' + shortcut.state | translate }}"
|
matTooltip="{{ 'PROJECT.STATE.' + shortcut.state | translate }}"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: shortcut.state === ProjectState.PROJECT_STATE_ACTIVE,
|
active: shortcut.state === ProjectState.PROJECT_STATE_ACTIVE,
|
||||||
inactive: shortcut.state === ProjectState.PROJECT_STATE_INACTIVE
|
inactive: shortcut.state === ProjectState.PROJECT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
'/instance/smtpprovider/sendgrid/create',
|
'/instance/smtpprovider/sendgrid/create',
|
||||||
'/instance/smtpprovider/mailchimp/create',
|
'/instance/smtpprovider/mailchimp/create',
|
||||||
'/instance/smtpprovider/brevo/create',
|
'/instance/smtpprovider/brevo/create',
|
||||||
'/instance/smtpprovider/outlook/create'
|
'/instance/smtpprovider/outlook/create',
|
||||||
]"
|
]"
|
||||||
[timestamp]="configsResult?.details?.viewTimestamp"
|
[timestamp]="configsResult?.details?.viewTimestamp"
|
||||||
[selection]="selection"
|
[selection]="selection"
|
||||||
|
@ -71,7 +71,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: action.state === ActionState.ACTION_STATE_ACTIVE,
|
active: action.state === ActionState.ACTION_STATE_ACTIVE,
|
||||||
inactive: action.state === ActionState.ACTION_STATE_INACTIVE
|
inactive: action.state === ActionState.ACTION_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ 'FLOWS.STATES.' + action.state | translate }}</span
|
{{ 'FLOWS.STATES.' + action.state | translate }}</span
|
||||||
|
@ -81,7 +81,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: action.state === ActionState.ACTION_STATE_ACTIVE,
|
active: action.state === ActionState.ACTION_STATE_ACTIVE,
|
||||||
inactive: action.state === ActionState.ACTION_STATE_INACTIVE
|
inactive: action.state === ActionState.ACTION_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ 'FLOWS.STATES.' + action.state | translate }}</span
|
{{ 'FLOWS.STATES.' + action.state | translate }}</span
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
[options]="{
|
[options]="{
|
||||||
lineNumbers: true,
|
lineNumbers: true,
|
||||||
theme: 'material',
|
theme: 'material',
|
||||||
mode: 'javascript'
|
mode: 'javascript',
|
||||||
}"
|
}"
|
||||||
></ngx-codemirror>
|
></ngx-codemirror>
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
'creationDate',
|
'creationDate',
|
||||||
'changeDate',
|
'changeDate',
|
||||||
'roleNamesList',
|
'roleNamesList',
|
||||||
'actions'
|
'actions',
|
||||||
]"
|
]"
|
||||||
[disableWrite]="(['user.grant.write$'] | hasRole | async) === false"
|
[disableWrite]="(['user.grant.write$'] | hasRole | async) === false"
|
||||||
[disableDelete]="(['user.grant.delete$'] | hasRole | async) === false"
|
[disableDelete]="(['user.grant.delete$'] | hasRole | async) === false"
|
||||||
|
@ -21,14 +21,14 @@
|
|||||||
<div
|
<div
|
||||||
class="icon-wrapper"
|
class="icon-wrapper"
|
||||||
[ngStyle]="{
|
[ngStyle]="{
|
||||||
background: (themeService.isDarkTheme | async) ? greendark + 50 : greenlight + 50
|
background: (themeService.isDarkTheme | async) ? greendark + 50 : greenlight + 50,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inner"
|
class="inner"
|
||||||
[ngStyle]="{
|
[ngStyle]="{
|
||||||
background: (themeService.isDarkTheme | async) ? greendark : greenlight,
|
background: (themeService.isDarkTheme | async) ? greendark : greenlight,
|
||||||
color: (themeService.isDarkTheme | async) ? greenlight : greendark
|
color: (themeService.isDarkTheme | async) ? greenlight : greendark,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<i class="las la-play"></i>
|
<i class="las la-play"></i>
|
||||||
@ -45,14 +45,14 @@
|
|||||||
<div
|
<div
|
||||||
class="icon-wrapper"
|
class="icon-wrapper"
|
||||||
[ngStyle]="{
|
[ngStyle]="{
|
||||||
background: (themeService.isDarkTheme | async) ? bluedark + 50 : bluelight + 50
|
background: (themeService.isDarkTheme | async) ? bluedark + 50 : bluelight + 50,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inner"
|
class="inner"
|
||||||
[ngStyle]="{
|
[ngStyle]="{
|
||||||
background: (themeService.isDarkTheme | async) ? bluedark : bluelight,
|
background: (themeService.isDarkTheme | async) ? bluedark : bluelight,
|
||||||
color: (themeService.isDarkTheme | async) ? bluelight : bluedark
|
color: (themeService.isDarkTheme | async) ? bluelight : bluedark,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<i class="las la-file-alt"></i>
|
<i class="las la-file-alt"></i>
|
||||||
@ -69,14 +69,14 @@
|
|||||||
<div
|
<div
|
||||||
class="icon-wrapper"
|
class="icon-wrapper"
|
||||||
[ngStyle]="{
|
[ngStyle]="{
|
||||||
background: (themeService.isDarkTheme | async) ? cyandark + 50 : cyanlight + 50
|
background: (themeService.isDarkTheme | async) ? cyandark + 50 : cyanlight + 50,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="inner"
|
class="inner"
|
||||||
[ngStyle]="{
|
[ngStyle]="{
|
||||||
background: (themeService.isDarkTheme | async) ? cyandark : cyanlight,
|
background: (themeService.isDarkTheme | async) ? cyandark : cyanlight,
|
||||||
color: (themeService.isDarkTheme | async) ? cyanlight : cyandark
|
color: (themeService.isDarkTheme | async) ? cyanlight : cyandark,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<i class="las la-play"></i>
|
<i class="las la-play"></i>
|
||||||
|
@ -233,7 +233,7 @@
|
|||||||
[options]="{
|
[options]="{
|
||||||
lineNumbers: true,
|
lineNumbers: true,
|
||||||
theme: 'material',
|
theme: 'material',
|
||||||
mode: 'application/xml'
|
mode: 'application/xml',
|
||||||
}"
|
}"
|
||||||
></ngx-codemirror>
|
></ngx-codemirror>
|
||||||
</div>
|
</div>
|
||||||
@ -524,7 +524,7 @@
|
|||||||
[options]="{
|
[options]="{
|
||||||
lineNumbers: true,
|
lineNumbers: true,
|
||||||
theme: 'material',
|
theme: 'material',
|
||||||
mode: 'application/xml'
|
mode: 'application/xml',
|
||||||
}"
|
}"
|
||||||
></ngx-codemirror>
|
></ngx-codemirror>
|
||||||
</div>
|
</div>
|
||||||
|
@ -218,7 +218,7 @@
|
|||||||
[options]="{
|
[options]="{
|
||||||
lineNumbers: true,
|
lineNumbers: true,
|
||||||
theme: 'material',
|
theme: 'material',
|
||||||
mode: 'application/xml'
|
mode: 'application/xml',
|
||||||
}"
|
}"
|
||||||
></ngx-codemirror>
|
></ngx-codemirror>
|
||||||
</div>
|
</div>
|
||||||
|
@ -65,7 +65,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: app.state === AppState.APP_STATE_ACTIVE,
|
active: app.state === AppState.APP_STATE_ACTIVE,
|
||||||
inactive: app.state === AppState.APP_STATE_INACTIVE
|
inactive: app.state === AppState.APP_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ 'APP.PAGES.DETAIL.STATE.' + app?.state | translate }}
|
{{ 'APP.PAGES.DETAIL.STATE.' + app?.state | translate }}
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
matTooltip="{{ 'PROJECT.STATE.' + grantedProject.state | translate }}"
|
matTooltip="{{ 'PROJECT.STATE.' + grantedProject.state | translate }}"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: grantedProject.state === ProjectGrantState.PROJECT_GRANT_STATE_ACTIVE,
|
active: grantedProject.state === ProjectGrantState.PROJECT_GRANT_STATE_ACTIVE,
|
||||||
inactive: grantedProject.state === ProjectGrantState.PROJECT_GRANT_STATE_INACTIVE
|
inactive: grantedProject.state === ProjectGrantState.PROJECT_GRANT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -104,7 +104,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: grant.state === ProjectGrantState.PROJECT_GRANT_STATE_ACTIVE,
|
active: grant.state === ProjectGrantState.PROJECT_GRANT_STATE_ACTIVE,
|
||||||
inactive: grant.state === ProjectGrantState.PROJECT_GRANT_STATE_INACTIVE
|
inactive: grant.state === ProjectGrantState.PROJECT_GRANT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ 'PROJECT.GRANT.STATES.' + grant.state | translate }}
|
{{ 'PROJECT.GRANT.STATES.' + grant.state | translate }}
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
class="state-dot"
|
class="state-dot"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: item.state === ProjectState.PROJECT_STATE_ACTIVE,
|
active: item.state === ProjectState.PROJECT_STATE_ACTIVE,
|
||||||
inactive: item.state === ProjectState.PROJECT_STATE_INACTIVE
|
inactive: item.state === ProjectState.PROJECT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
@ -62,7 +62,7 @@
|
|||||||
class="state-dot"
|
class="state-dot"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: item.state === ProjectState.PROJECT_STATE_ACTIVE,
|
active: item.state === ProjectState.PROJECT_STATE_ACTIVE,
|
||||||
inactive: item.state === ProjectState.PROJECT_STATE_INACTIVE
|
inactive: item.state === ProjectState.PROJECT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -95,7 +95,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: project.state === ProjectState.PROJECT_STATE_ACTIVE,
|
active: project.state === ProjectState.PROJECT_STATE_ACTIVE,
|
||||||
inactive: project.state === ProjectState.PROJECT_STATE_INACTIVE
|
inactive: project.state === ProjectState.PROJECT_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
*ngIf="project.state"
|
*ngIf="project.state"
|
||||||
>{{ 'PROJECT.STATE.' + project.state | translate }}</span
|
>{{ 'PROJECT.STATE.' + project.state | translate }}</span
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_READY,
|
active: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_READY,
|
||||||
inactive: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_NOT_READY
|
inactive: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_NOT_READY,
|
||||||
}"
|
}"
|
||||||
>{{ 'USER.PASSWORDLESS.STATE.' + mfa.state | translate }}</span
|
>{{ 'USER.PASSWORDLESS.STATE.' + mfa.state | translate }}</span
|
||||||
>
|
>
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_READY,
|
active: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_READY,
|
||||||
inactive: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_NOT_READY
|
inactive: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_NOT_READY,
|
||||||
}"
|
}"
|
||||||
>{{ 'USER.MFA.STATE.' + mfa.state | translate }}</span
|
>{{ 'USER.MFA.STATE.' + mfa.state | translate }}</span
|
||||||
>
|
>
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_READY,
|
active: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_READY,
|
||||||
inactive: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_NOT_READY
|
inactive: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_NOT_READY,
|
||||||
}"
|
}"
|
||||||
>{{ 'USER.PASSWORDLESS.STATE.' + mfa.state | translate }}</span
|
>{{ 'USER.PASSWORDLESS.STATE.' + mfa.state | translate }}</span
|
||||||
>
|
>
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_READY,
|
active: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_READY,
|
||||||
inactive: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_NOT_READY
|
inactive: mfa.state === AuthFactorState.AUTH_FACTOR_STATE_NOT_READY,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ 'USER.MFA.STATE.' + mfa.state | translate }}
|
{{ 'USER.MFA.STATE.' + mfa.state | translate }}
|
||||||
|
@ -57,11 +57,14 @@
|
|||||||
</cnsl-action-keys>
|
</cnsl-action-keys>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
</ng-template>
|
||||||
<cnsl-filter-user
|
<cnsl-filter-user
|
||||||
|
actions
|
||||||
*ngIf="!selection.hasValue()"
|
*ngIf="!selection.hasValue()"
|
||||||
(filterChanged)="applySearchQuery($any($event))"
|
(filterChanged)="applySearchQuery($any($event))"
|
||||||
(filterOpen)="filterOpen = $event"
|
(filterOpen)="filterOpen = $event"
|
||||||
></cnsl-filter-user>
|
></cnsl-filter-user>
|
||||||
|
<ng-template cnslHasRole [hasRole]="['user.write']" actions>
|
||||||
<button
|
<button
|
||||||
(click)="gotoRouterLink(['/users', type === Type.TYPE_HUMAN ? 'create' : 'create-machine'])"
|
(click)="gotoRouterLink(['/users', type === Type.TYPE_HUMAN ? 'create' : 'create-machine'])"
|
||||||
color="primary"
|
color="primary"
|
||||||
@ -194,7 +197,7 @@
|
|||||||
class="state"
|
class="state"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
active: user.state === UserState.USER_STATE_ACTIVE,
|
active: user.state === UserState.USER_STATE_ACTIVE,
|
||||||
inactive: user.state === UserState.USER_STATE_INACTIVE
|
inactive: user.state === UserState.USER_STATE_INACTIVE,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
{{ 'USER.DATA.STATE' + user.state | translate }}
|
{{ 'USER.DATA.STATE' + user.state | translate }}
|
||||||
|
@ -2058,10 +2058,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Ако е избрано, ще бъде създаден акаунт, ако все още не съществува.",
|
"ISAUTOCREATION_DESC": "Ако е избрано, ще бъде създаден акаунт, ако все още не съществува.",
|
||||||
"ISAUTOUPDATE": "Автоматична актуализация",
|
"ISAUTOUPDATE": "Автоматична актуализация",
|
||||||
"ISAUTOUPDATE_DESC": "Ако е избрано, акаунтите се актуализират при повторно удостоверяване.",
|
"ISAUTOUPDATE_DESC": "Ако е избрано, акаунтите се актуализират при повторно удостоверяване.",
|
||||||
"ISCREATIONALLOWED": "Създаването на акаунт е разрешено",
|
"ISCREATIONALLOWED": "Създаването на акаунт е разрешено (ръчно)",
|
||||||
"ISCREATIONALLOWED_DESC": "Определя дали могат да се създават акаунти.",
|
"ISCREATIONALLOWED_DESC": "Определя дали могат да се създават акаунти с помощта на външен акаунт. Деактивирай, ако потребителите не трябва да могат да редактират информация за акаунта, когато автоматичното създаване е активирано.",
|
||||||
"ISLINKINGALLOWED": "Свързването на акаунти е разрешено",
|
"ISLINKINGALLOWED": "Свързването на акаунти е разрешено (ръчно)",
|
||||||
"ISLINKINGALLOWED_DESC": "Определя дали дадена самоличност може да бъде свързана със съществуващ акаунт.",
|
"ISLINKINGALLOWED_DESC": "Определя дали дадена самоличност може да бъде свързана със съществуващ акаунт. Деактивирай, ако потребителите трябва да могат да свързват само предлагания акаунт в случай на активно автоматично свързване.",
|
||||||
"AUTOLINKING_DESC": "Определя дали идентичността ще бъде подканена да бъде свързана със съществуващ профил.",
|
"AUTOLINKING_DESC": "Определя дали идентичността ще бъде подканена да бъде свързана със съществуващ профил.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Изключено",
|
"0": "Изключено",
|
||||||
|
@ -2063,10 +2063,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Pokud je vybráno, účet bude vytvořen, pokud ještě neexistuje.",
|
"ISAUTOCREATION_DESC": "Pokud je vybráno, účet bude vytvořen, pokud ještě neexistuje.",
|
||||||
"ISAUTOUPDATE": "Automatická aktualizace",
|
"ISAUTOUPDATE": "Automatická aktualizace",
|
||||||
"ISAUTOUPDATE_DESC": "Pokud je vybráno, účty jsou aktualizovány při opětovné autentizaci.",
|
"ISAUTOUPDATE_DESC": "Pokud je vybráno, účty jsou aktualizovány při opětovné autentizaci.",
|
||||||
"ISCREATIONALLOWED": "Je povoleno vytváření účtu",
|
"ISCREATIONALLOWED": "Vytvoření účtu povoleno (ručně)",
|
||||||
"ISCREATIONALLOWED_DESC": "Určuje, zda lze vytvářet účty.",
|
"ISCREATIONALLOWED_DESC": "Určuje, zda mohou být účty vytvořeny pomocí externího účtu. Zakázat, pokud uživatelé by neměli být schopni upravovat informace o účtu, když je automatické vytváření povoleno.",
|
||||||
"ISLINKINGALLOWED": "Je povoleno propojení účtů",
|
"ISLINKINGALLOWED": "Propojení účtu povoleno (ručně)",
|
||||||
"ISLINKINGALLOWED_DESC": "Určuje, zda lze identitu propojit s existujícím účtem.",
|
"ISLINKINGALLOWED_DESC": "Určuje, zda identita může být ručně propojena s existujícím účtem. Zakázat, pokud by uživatelé měli být povoleni pouze propojit navrhovaný účet v případě aktivního automatického propojení.",
|
||||||
"AUTOLINKING_DESC": "Určuje, zda se bude identita vyzývat k propojení se stávajícím účtem.",
|
"AUTOLINKING_DESC": "Určuje, zda se bude identita vyzývat k propojení se stávajícím účtem.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Vypnuto",
|
"0": "Vypnuto",
|
||||||
|
@ -3,13 +3,13 @@
|
|||||||
"DESCRIPTIONS": {
|
"DESCRIPTIONS": {
|
||||||
"METADATA_TITLE": "Metadaten",
|
"METADATA_TITLE": "Metadaten",
|
||||||
"HOME": {
|
"HOME": {
|
||||||
"TITLE": "Leg los mit ZITADEL",
|
"TITLE": "Mit ZITADEL loslegen",
|
||||||
"NEXT": {
|
"NEXT": {
|
||||||
"TITLE": "Deine nächsten Schritte",
|
"TITLE": "Die nächsten Schritte",
|
||||||
"DESCRIPTION": "Führe die folgenden Schritte durch, um deine Anwendung zu sichern.",
|
"DESCRIPTION": "Führe die folgenden Schritte aus, um deine Anwendung zu sichern.",
|
||||||
"CREATE_PROJECT": {
|
"CREATE_PROJECT": {
|
||||||
"TITLE": "Erstelle ein Projekt",
|
"TITLE": "Erstelle ein Projekt",
|
||||||
"DESCRIPTION": "Füge ein Projekt hinzu und definiere seine Rollen und Berechtigungen."
|
"DESCRIPTION": "Füge ein Projekt hinzu und definiere Rollen und Berechtigungen."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"MORE_SHORTCUTS": {
|
"MORE_SHORTCUTS": {
|
||||||
@ -29,12 +29,12 @@
|
|||||||
},
|
},
|
||||||
"ORG": {
|
"ORG": {
|
||||||
"TITLE": "Organisation",
|
"TITLE": "Organisation",
|
||||||
"DESCRIPTION": "Eine Organisation beherbergt Benutzer, Projekte mit Apps, Identitätsanbieter und Einstellungen wie Unternehmensbranding. Möchtest du Einstellungen über mehrere Organisationen hinweg teilen? Konfiguriere Standardeinstellungen.",
|
"DESCRIPTION": "Eine Organisation enthält Benutzer, Projekte mit Apps, Identitätsanbieter und Einstellungen wie Unternehmensbranding. Möchtest du Einstellungen über mehrere Organisationen hinweg teilen? Nutze hierfür die Standardeinstellungen.",
|
||||||
"METADATA": "Füge der Organisation benutzerdefinierte Attribute hinzu, wie ihren Standort oder einen Identifikator in einem anderen System. Du kannst diese Informationen in deinen Aktionen nutzen."
|
"METADATA": "Füge der Organisation benutzerdefinierte Attribute hinzu, wie ihren Standort oder einen Identifikator in einem anderen System. Du kannst diese Informationen in den Aktionen nutzen."
|
||||||
},
|
},
|
||||||
"PROJECTS": {
|
"PROJECTS": {
|
||||||
"TITLE": "Projekte",
|
"TITLE": "Projekte",
|
||||||
"DESCRIPTION": "Ein Projekt beherbergt eine oder mehrere Anwendungen, die du nutzen kannst, um deine Benutzer zu authentifizieren. Außerdem kannst du deine Benutzer mit Projekten autorisieren. Um Benutzern aus anderen Organisationen das Einloggen in deine Anwendungen zu erlauben, gewähre ihnen Zugriff auf dein Projekt.<br/><br/>Wenn du ein Projekt nicht finden kannst, kontaktiere den Projekteigentümer oder jemanden mit den entsprechenden Rechten, um Zugang zu erhalten.",
|
"DESCRIPTION": "Ein Projekt enthält eine oder mehrere Anwendungen, die du nutzen kannst, um deine Benutzer zu authentifizieren. Außerdem kannst du deine Benutzer mit Projekten autorisieren. Um Benutzern aus anderen Organisationen das Einloggen in deine Anwendungen zu erlauben, gewähre ihnen Zugriff auf dein Projekt.<br/><br/>Wenn du ein Projekt nicht finden kannst, kontaktiere den Projekteigentümer oder jemanden mit den entsprechenden Rechten, um Zugang zu erhalten.",
|
||||||
"OWNED": {
|
"OWNED": {
|
||||||
"TITLE": "Eigene Projekte",
|
"TITLE": "Eigene Projekte",
|
||||||
"DESCRIPTION": "Dies sind die Projekte, die du besitzt. Du kannst die Einstellungen, Berechtigungen und Anwendungen dieser Projekte verwalten."
|
"DESCRIPTION": "Dies sind die Projekte, die du besitzt. Du kannst die Einstellungen, Berechtigungen und Anwendungen dieser Projekte verwalten."
|
||||||
@ -45,17 +45,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"USERS": {
|
"USERS": {
|
||||||
"TITLE": "Users",
|
"TITLE": "Benutzer",
|
||||||
"DESCRIPTION": "Ein Benutzer ist ein Mensch oder eine Maschine, die auf deine Anwendungen zugreifen kann.",
|
"DESCRIPTION": "Ein Benutzer ist ein Mensch oder ein Computer, der auf deine Anwendungen zugreifen kann.",
|
||||||
"HUMANS": {
|
"HUMANS": {
|
||||||
"TITLE": "Users",
|
"TITLE": "Benutzer",
|
||||||
"DESCRIPTION": "User authentifizieren sich interaktiv in einer Browsersitzung mit einer Anmeldeaufforderung.",
|
"DESCRIPTION": "Benutzer authentifizieren sich interaktiv in einer Browsersitzung mit einem Login-Formular.",
|
||||||
"METADATA": "Füge dem Benutzer benutzerdefinierte Attribute hinzu, wie die Abteilung. Du kannst diese Informationen in deinen Aktionen nutzen."
|
"METADATA": "Füge dem Benutzer benutzerdefinierte Attribute hinzu, wie die Abteilung. Du kannst diese Informationen in den Aktionen nutzen."
|
||||||
},
|
},
|
||||||
"MACHINES": {
|
"MACHINES": {
|
||||||
"TITLE": "Service users",
|
"TITLE": "Service-Benutzer",
|
||||||
"DESCRIPTION": "Maschinen authentifizieren sich nicht-interaktiv mit einem JWT Bearer-Token, das mit einem privaten Schlüssel signiert ist. Sie können auch ein persönliches Zugangstoken verwenden.",
|
"DESCRIPTION": "Service-Benutzer authentifizieren sich nicht-interaktiv mit einem JWT Bearer-Token, welches mit einem privaten Schlüssel signiert ist. Sie können auch ein persönliches Zugangstoken verwenden.",
|
||||||
"METADATA": "Füge dem Benutzer benutzerdefinierte Attribute hinzu, wie das authentifizierende System. Du kannst diese Informationen in deinen Aktionen nutzen."
|
"METADATA": "Füge dem Benutzer benutzerdefinierte Attribute hinzu, wie das authentifizierende System. Du kannst diese Informationen in den Aktionen nutzen."
|
||||||
},
|
},
|
||||||
"SELF": {
|
"SELF": {
|
||||||
"METADATA": "Füge deinem Benutzer benutzerdefinierte Attribute hinzu, wie deine Abteilung. Du kannst diese Informationen in den Aktionen deiner Organisation nutzen."
|
"METADATA": "Füge deinem Benutzer benutzerdefinierte Attribute hinzu, wie deine Abteilung. Du kannst diese Informationen in den Aktionen deiner Organisation nutzen."
|
||||||
@ -63,32 +63,32 @@
|
|||||||
},
|
},
|
||||||
"AUTHORIZATIONS": {
|
"AUTHORIZATIONS": {
|
||||||
"TITLE": "Berechtigungen",
|
"TITLE": "Berechtigungen",
|
||||||
"DESCRIPTION": "Berechtigungen definieren die Zugriffsrechte eines Benutzers auf ein Projekt. Du kannst einem Benutzer Zugriff auf ein Projekt gewähren und die Rollen des Benutzers innerhalb dieses Projekts definieren."
|
"DESCRIPTION": "Berechtigungen definieren die Zugriffsrechte eines Benutzers auf ein Projekt. Du kannst einem Benutzer Zugriff auf ein Projekt gewähren und die Rollen des Benutzers innerhalb dieses Projekts einstellen."
|
||||||
},
|
},
|
||||||
"ACTIONS": {
|
"ACTIONS": {
|
||||||
"TITLE": "Aktionen",
|
"TITLE": "Aktionen",
|
||||||
"DESCRIPTION": "Führe benutzerdefinierten Code bei Ereignissen aus, die auftreten, während sich deine Benutzer bei ZITADEL authentifizieren. Automatisiere deine Prozesse, bereichere die Metadaten deiner Benutzer und deren Token oder benachrichtige externe Systeme.",
|
"DESCRIPTION": "Führe eigenen Code bei Ereignissen aus, die auftreten, während sich deine Benutzer bei ZITADEL authentifizieren. Automatisiere deine Prozesse, erweitere die Metadaten deiner Benutzer und deren Token oder benachrichtige externe Systeme.",
|
||||||
"SCRIPTS": {
|
"SCRIPTS": {
|
||||||
"TITLE": "Skripte",
|
"TITLE": "Skripte",
|
||||||
"DESCRIPTION": "Schreibe deinen JavaScript-Code einmal und löse ihn in mehreren Flows aus."
|
"DESCRIPTION": "Schreibe einmalig deinen JavaScript-Code und löse ihn in mehreren Flows aus."
|
||||||
},
|
},
|
||||||
"FLOWS": {
|
"FLOWS": {
|
||||||
"TITLE": "Flows",
|
"TITLE": "Flows",
|
||||||
"DESCRIPTION": "Wähle einen Authentifizierungsflow und löse deine Aktion bei einem spezifischen Ereignis innerhalb dieses Flows aus."
|
"DESCRIPTION": "Wähle einen Authentifizierungsflow und löse deine Aktionen bei einem spezifischen Ereignis innerhalb dieses Flows aus."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"SETTINGS": {
|
"SETTINGS": {
|
||||||
"INSTANCE": {
|
"INSTANCE": {
|
||||||
"TITLE": "Standardeinstellungen",
|
"TITLE": "Standardeinstellungen",
|
||||||
"DESCRIPTION": "Standardeinstellungen für alle Organisationen. Mit den richtigen Berechtigungen können einige davon in den Organisationseinstellungen überschrieben werden."
|
"DESCRIPTION": "Standardeinstellungen gelten für alle Organisationen. Mit den richtigen Berechtigungen können einige davon in den Organisationseinstellungen überschrieben werden."
|
||||||
},
|
},
|
||||||
"ORG": {
|
"ORG": {
|
||||||
"TITLE": "Organisationseinstellungen",
|
"TITLE": "Organisationseinstellungen",
|
||||||
"DESCRIPTION": "Passe die Einstellungen deiner Organisation an."
|
"DESCRIPTION": "Passe die Einstellungen einer Organisation an."
|
||||||
},
|
},
|
||||||
"FEATURES": {
|
"FEATURES": {
|
||||||
"TITLE": "Funktionseinstellungen",
|
"TITLE": "Funktionseinstellungen",
|
||||||
"DESCRIPTION": "Schalten Sie Funktionen für Ihre Instanz frei."
|
"DESCRIPTION": "Schalte Funktionen für deine Instanz frei."
|
||||||
},
|
},
|
||||||
"IDPS": {
|
"IDPS": {
|
||||||
"TITLE": "Identitätsanbieter",
|
"TITLE": "Identitätsanbieter",
|
||||||
@ -100,7 +100,7 @@
|
|||||||
},
|
},
|
||||||
"CALLBACK": {
|
"CALLBACK": {
|
||||||
"TITLE": "Konfiguriere deinen {{ provider }}-Identitätsanbieter",
|
"TITLE": "Konfiguriere deinen {{ provider }}-Identitätsanbieter",
|
||||||
"DESCRIPTION": "Bevor du ZITADEL konfigurieren kannst, gib diese URL an deinen Identitätsanbieter weiter, um die Browserumleitung zurück zu ZITADEL nach der Authentifizierung zu ermöglichen."
|
"DESCRIPTION": "Bevor du ZITADEL konfigurieren kannst, gib diese URL an deinen Identitätsanbieter weiter, um die Weiterleitung zurück zu ZITADEL nach der Authentifizierung zu ermöglichen."
|
||||||
},
|
},
|
||||||
"JWT": {
|
"JWT": {
|
||||||
"TITLE": "Verwende JWTs als föderierte Identitäten",
|
"TITLE": "Verwende JWTs als föderierte Identitäten",
|
||||||
@ -112,11 +112,11 @@
|
|||||||
},
|
},
|
||||||
"AUTOFILL": {
|
"AUTOFILL": {
|
||||||
"TITLE": "Benutzerdaten automatisch ausfüllen",
|
"TITLE": "Benutzerdaten automatisch ausfüllen",
|
||||||
"DESCRIPTION": "Verwende eine Aktion, um das Benutzererlebnis zu verbessern. Du kannst das Registrierungsformular von ZITADEL mit Werten vom Identitätsanbieter vorab ausfüllen."
|
"DESCRIPTION": "Verwende eine Aktion, um das Benutzererlebnis zu verbessern. Du kannst das Registrierungsformular von ZITADEL mit Daten des Identitätsanbieter vorab ausfüllen."
|
||||||
},
|
},
|
||||||
"ACTIVATE": {
|
"ACTIVATE": {
|
||||||
"TITLE": "Aktiviere den IdP",
|
"TITLE": "Aktiviere den IdP",
|
||||||
"DESCRIPTION": "Dein IdP ist noch nicht aktiv. Aktiviere ihn, um deinen Benutzern das Einloggen zu ermöglichen."
|
"DESCRIPTION": "Dein IdP ist noch nicht aktiv. Aktiviere ihn, um Benutzern das Einloggen zu ermöglichen."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"PW_COMPLEXITY": {
|
"PW_COMPLEXITY": {
|
||||||
@ -129,7 +129,7 @@
|
|||||||
},
|
},
|
||||||
"PRIVACY_POLICY": {
|
"PRIVACY_POLICY": {
|
||||||
"TITLE": "Externe Links",
|
"TITLE": "Externe Links",
|
||||||
"DESCRIPTION": "Leiten Sie Ihre Benutzer zu benutzerdefinierten externen Ressourcen, die auf der Anmeldeseite angezeigt werden. Benutzer müssen die Nutzungsbedingungen und Datenschutzrichtlinien akzeptieren, bevor sie sich anmelden können. Ändern Sie den Link zu Ihrer Dokumentation oder legen Sie eine leere Zeichenfolge fest, um die Dokumentationsschaltfläche in der Konsole auszublenden. Fügen Sie in der Konsole einen benutzerdefinierten externen Link und einen benutzerdefinierten Text für diesen Link hinzu oder setzen Sie sie leer, um diese Schaltfläche auszublenden."
|
"DESCRIPTION": "Leite die Benutzer zu benutzerdefinierten externen Ressourcen, die auf der Anmeldeseite angezeigt werden. Benutzer müssen die Nutzungsbedingungen und Datenschutzrichtlinien akzeptieren, bevor sie sich anmelden können. Ändere den Link zur Dokumentation oder lege eine leere Zeichenfolge fest, um den Dokumentations-Button in der Konsole auszublenden. Füge in der Konsole einen benutzerdefinierten externen Link und einen benutzerdefinierten Text für diesen Link hinzu oder lasse ihn leer, um diesen Button auszublenden."
|
||||||
},
|
},
|
||||||
"SMTP_PROVIDER": {
|
"SMTP_PROVIDER": {
|
||||||
"TITLE": "SMTP-Einstellungen",
|
"TITLE": "SMTP-Einstellungen",
|
||||||
@ -137,7 +137,7 @@
|
|||||||
},
|
},
|
||||||
"SMS_PROVIDER": {
|
"SMS_PROVIDER": {
|
||||||
"TITLE": "SMS-Einstellungen",
|
"TITLE": "SMS-Einstellungen",
|
||||||
"DESCRIPTION": "Um alle ZITADEL-Funktionen freizuschalten, konfiguriere Twilio, um SMS-Nachrichten an deine Benutzer zu senden."
|
"DESCRIPTION": "Um alle ZITADEL-Funktionen zu nutzen, konfiguriere Twilio, um SMS-Nachrichten an deine Benutzer zu senden."
|
||||||
},
|
},
|
||||||
"IAM_EVENTS": {
|
"IAM_EVENTS": {
|
||||||
"TITLE": "Ereignisse",
|
"TITLE": "Ereignisse",
|
||||||
@ -145,32 +145,32 @@
|
|||||||
},
|
},
|
||||||
"IAM_FAILED_EVENTS": {
|
"IAM_FAILED_EVENTS": {
|
||||||
"TITLE": "Fehlgeschlagene Ereignisse",
|
"TITLE": "Fehlgeschlagene Ereignisse",
|
||||||
"DESCRIPTION": "Diese Seite zeigt alle fehlgeschlagenen Ereignisse in deiner Instanz. Wenn ZITADEL sich nicht wie erwartet verhält, überprüfe immer zuerst diese Liste."
|
"DESCRIPTION": "Diese Seite zeigt alle fehlerhaften Ereignisse deiner Instanz. Wenn ZITADEL sich nicht wie erwartet verhält, überprüfe immer zuerst diese Liste."
|
||||||
},
|
},
|
||||||
"IAM_VIEWS": {
|
"IAM_VIEWS": {
|
||||||
"TITLE": "Ansichten",
|
"TITLE": "Datenbankansichten",
|
||||||
"DESCRIPTION": "Diese Seite zeigt alle deine Datenbankansichten und wann sie ihr letztes Ereignis verarbeitet haben. Wenn dir einige Daten fehlen, überprüfe, ob die Ansicht aktuell ist."
|
"DESCRIPTION": "Diese Seite zeigt alle deine Datenbankansichten und wann sie ihr letztes Ereignis verarbeitet haben. Wenn einige Daten fehlen, überprüfe, ob die Ansicht aktuell ist."
|
||||||
},
|
},
|
||||||
"LANGUAGES": {
|
"LANGUAGES": {
|
||||||
"TITLE": "Sprachen",
|
"TITLE": "Sprachen",
|
||||||
"DESCRIPTION": "Beschränke die Sprachen, in die das Anmeldeformular und die Benachrichtigungsnachrichten übersetzt werden. Wenn du einige der Sprachen deaktivieren möchtest, ziehe sie in den Abschnitt Nicht erlaubte Sprachen. Du kannst eine erlaubte Sprache als Standardsprache festlegen. Wenn die bevorzugte Sprache eines Benutzers nicht erlaubt ist, wird die Standardsprache verwendet."
|
"DESCRIPTION": "Beschränke die Sprachen, in die das Anmeldeformular und die Benachrichtigungsnachrichten übersetzt werden. Wenn du einige der Sprachen deaktivieren möchtest, ziehe sie in den Abschnitt \"Nicht erlaubte Sprachen\". Du kannst eine erlaubte Sprache als Standardsprache festlegen. Wenn die bevorzugte Sprache eines Benutzers nicht erlaubt ist, wird die Standardsprache verwendet."
|
||||||
},
|
},
|
||||||
"SECRET_GENERATORS": {
|
"SECRET_GENERATORS": {
|
||||||
"TITLE": "Secret Generators",
|
"TITLE": "Secret-Generator",
|
||||||
"DESCRIPTION": "Definiere die Komplexität und Lebensdauer deiner Geheimnisse. Eine höhere Komplexität und Lebensdauer verbessert die Sicherheit, eine niedrigere Komplexität und Lebensdauer verbessert die Entschlüsselungsleistung."
|
"DESCRIPTION": "Definiere die Komplexität und Lebensdauer deiner Secrets. Eine höhere Komplexität und Lebensdauer verbessert die Sicherheit, eine niedrigere Komplexität und Lebensdauer verschlechtert die Sicherheit."
|
||||||
},
|
},
|
||||||
"SECURITY": {
|
"SECURITY": {
|
||||||
"TITLE": "Sicherheitseinstellungen",
|
"TITLE": "Sicherheitseinstellungen",
|
||||||
"DESCRIPTION": "Aktiviere ZITADEL-Funktionen, die Sicherheitsauswirkungen haben können. Du solltest wirklich wissen, was du tust, bevor du diese Einstellungen änderst."
|
"DESCRIPTION": "Aktiviere ZITADEL-Funktionen, die Auswirkungen auf die Sicherheit haben können. Du solltest wirklich wissen, was du tust, bevor du diese Einstellungen änderst."
|
||||||
},
|
},
|
||||||
"OIDC": {
|
"OIDC": {
|
||||||
"TITLE": "OpenID Connect Einstellungen",
|
"TITLE": "OpenID Connect Einstellungen",
|
||||||
"DESCRIPTION": "Konfiguriere die Lebensdauer deiner OIDC-Token. Verwende kürzere Lebensdauern, um die Sicherheit deiner Benutzer zu erhöhen, verwende längere Lebensdauern, um die Bequemlichkeit deiner Benutzer zu erhöhen.",
|
"DESCRIPTION": "Konfiguriere die Lebensdauer deiner OIDC-Token. Verwende eine kürzere Lebensdauer, um die Sicherheit deiner Benutzer zu erhöhen, verwende längere Lebensdauern, um die Bequemlichkeit deiner Benutzer zu erhöhen.",
|
||||||
"LABEL_HOURS": "Maximale Lebensdauer in Stunden",
|
"LABEL_HOURS": "Maximale Lebensdauer in Stunden",
|
||||||
"LABEL_DAYS": "Maximale Lebensdauer in Tagen",
|
"LABEL_DAYS": "Maximale Lebensdauer in Tagen",
|
||||||
"ACCESS_TOKEN": {
|
"ACCESS_TOKEN": {
|
||||||
"TITLE": "Zugangstoken",
|
"TITLE": "Zugangstoken",
|
||||||
"DESCRIPTION": "Das Zugangstoken wird verwendet, um einen Benutzer zu authentifizieren. Es ist ein kurzlebiges Token, das verwendet wird, um auf die Daten des Benutzers zuzugreifen. Verwende eine kurze Lebensdauer, um das Risiko eines unbefugten Zugriffs zu minimieren. Zugangstoken können automatisch mit einem Aktualisierungstoken erneuert werden."
|
"DESCRIPTION": "Das Zugangstoken wird verwendet, um einen Benutzer zu authentifizieren. Es ist ein kurzlebiges Token, das verwendet wird, um auf die Nutzerdaten zuzugreifen. Verwende eine kurze Lebensdauer, um das Risiko eines unbefugten Zugriffs zu minimieren. Zugangstoken können automatisch mit einem Aktualisierungstoken erneuert werden."
|
||||||
},
|
},
|
||||||
"ID_TOKEN": {
|
"ID_TOKEN": {
|
||||||
"TITLE": "ID-Token",
|
"TITLE": "ID-Token",
|
||||||
@ -178,7 +178,7 @@
|
|||||||
},
|
},
|
||||||
"REFRESH_TOKEN": {
|
"REFRESH_TOKEN": {
|
||||||
"TITLE": "Aktualisierungstoken",
|
"TITLE": "Aktualisierungstoken",
|
||||||
"DESCRIPTION": "Das Aktualisierungstoken wird verwendet, um ein neues Zugangstoken zu erhalten. Es ist ein langfristiges Token, das verwendet wird, um das Zugangstoken zu erneuern. Ein Benutzer muss sich manuell neu authentifizieren, wenn das Aktualisierungstoken abläuft."
|
"DESCRIPTION": "Das Aktualisierungstoken wird verwendet, um einen neuen Zugangstoken zu erhalten. Es ist ein langlebiges Token, welches verwendet wird, um das Zugangstoken zu erneuern. Ein Benutzer muss sich manuell neu authentifizieren, wenn das Aktualisierungstoken abläuft."
|
||||||
},
|
},
|
||||||
"REFRESH_TOKEN_IDLE": {
|
"REFRESH_TOKEN_IDLE": {
|
||||||
"TITLE": "Inaktives Aktualisierungstoken",
|
"TITLE": "Inaktives Aktualisierungstoken",
|
||||||
@ -202,22 +202,22 @@
|
|||||||
},
|
},
|
||||||
"LOGIN_TEXTS": {
|
"LOGIN_TEXTS": {
|
||||||
"TITLE": "Texte der Anmeldeoberfläche",
|
"TITLE": "Texte der Anmeldeoberfläche",
|
||||||
"DESCRIPTION": "Passe die Texte deines Anmeldeformulars an. Wenn ein Text leer ist, zeigt der Platzhalter den Standardwert an. Wenn du einige der Sprachen deaktivieren möchtest, beschränke sie in den Spracheinstellungen deiner Instanz."
|
"DESCRIPTION": "Passe die Texte des Anmeldeformulars an. Wenn ein Text leer ist, zeigt der Platzhalter den Standardwert an. Wenn du einige Sprachen deaktivieren möchtest, beschränke sie in den Spracheinstellungen deiner Instanz."
|
||||||
},
|
},
|
||||||
"DOMAINS": {
|
"DOMAINS": {
|
||||||
"TITLE": "Domain-Einstellungen",
|
"TITLE": "Domain-Einstellungen",
|
||||||
"DESCRIPTION": "Definiere Einschränkungen für deine Domains und konfiguriere deine Anmeldenamen-Muster.",
|
"DESCRIPTION": "Definiere Einschränkungen für deine Domains und konfiguriere ein Anmeldenamen-Muster.",
|
||||||
"REQUIRE_VERIFICATION": {
|
"REQUIRE_VERIFICATION": {
|
||||||
"TITLE": "Verifizierung benutzerdefinierter Domains erforderlich",
|
"TITLE": "Verifizierung eigener Domains erforderlich",
|
||||||
"DESCRIPTION": "Wenn dies aktiviert ist, müssen Organisationsdomänen verifiziert werden, bevor sie für die Domainerkennung oder die Benutzernamenergänzung verwendet werden können."
|
"DESCRIPTION": "Wenn dies aktiviert ist, müssen Organisationsdomänen verifiziert werden, bevor sie für die Domainerkennung oder die Benutzernamenergänzung verwendet werden können."
|
||||||
},
|
},
|
||||||
"LOGIN_NAME_PATTERN": {
|
"LOGIN_NAME_PATTERN": {
|
||||||
"TITLE": "Muster für Anmeldenamen",
|
"TITLE": "Muster für Anmeldenamen",
|
||||||
"DESCRIPTION": "Steuere das Muster der Anmeldenamen deiner Benutzer. ZITADEL wählt die Organisation deiner Benutzer aus, sobald sie ihren Anmeldenamen eingeben. Daher müssen die Anmeldenamen über alle Organisationen hinweg einzigartig sein. Wenn du Benutzer hast, die Konten in mehreren Domains haben, kannst du die Einzigartigkeit sicherstellen, indem du deine Anmeldenamen mit der Organisationsdomain ergänzt."
|
"DESCRIPTION": "Erstelle ein Muster für die Anmeldenamen deiner Benutzer. ZITADEL wählt die Organisation deiner Benutzer aus, sobald sie ihren Anmeldenamen eingeben. Daher müssen die Anmeldenamen über alle Organisationen hinweg einzigartig sein. Wenn du Benutzer hast, die Konten in mehreren Domains haben, kannst du die Einzigartigkeit sicherstellen, indem du deine Anmeldenamen mit der Organisationsdomain ergänzt."
|
||||||
},
|
},
|
||||||
"DOMAIN_VERIFICATION": {
|
"DOMAIN_VERIFICATION": {
|
||||||
"TITLE": "Domain-Verifizierung",
|
"TITLE": "Domain-Verifizierung",
|
||||||
"DESCRIPTION": "Erlaube deiner Organisation nur die Verwendung der Domains, die sie tatsächlich kontrolliert. Wenn aktiviert, werden Organisationsdomänen periodisch durch DNS- oder HTTP-Challenge verifiziert, bevor sie verwendet werden können. Dies ist eine Sicherheitsfunktion, um Domain-Hijacking zu verhindern."
|
"DESCRIPTION": "Erlaube deiner Organisation nur die Verwendung von Domains, die sie tatsächlich kontrolliert. Wenn aktiviert, werden Organisationsdomänen periodisch durch eine DNS- oder HTTP-Challenge verifiziert, bevor sie verwendet werden können. Dies ist eine Sicherheitsfunktion, um Domain-Hijacking zu verhindern."
|
||||||
},
|
},
|
||||||
"SMTP_SENDER_ADDRESS": {
|
"SMTP_SENDER_ADDRESS": {
|
||||||
"TITLE": "SMTP-Absenderadresse",
|
"TITLE": "SMTP-Absenderadresse",
|
||||||
@ -226,28 +226,28 @@
|
|||||||
},
|
},
|
||||||
"LOGIN": {
|
"LOGIN": {
|
||||||
"LIFETIMES": {
|
"LIFETIMES": {
|
||||||
"TITLE": "Login-Lebensdauern",
|
"TITLE": "Login-Lebensdauer",
|
||||||
"DESCRIPTION": "Verbessere deine Sicherheit, indem du einige maximale Lebensdauern im Zusammenhang mit dem Login reduzierst.",
|
"DESCRIPTION": "Verbessere deine Sicherheit, indem du einige maximale Lebensdauern im Zusammenhang mit dem Login reduzierst.",
|
||||||
"LABEL": "Maximale Lebensdauer in Stunden",
|
"LABEL": "Maximale Lebensdauer in Stunden",
|
||||||
"PW_CHECK": {
|
"PW_CHECK": {
|
||||||
"TITLE": "Passwortüberprüfung",
|
"TITLE": "Passwortüberprüfung",
|
||||||
"DESCRIPTION": "Nach diesem Zeitraum müssen sich Benutzer erneut mit ihrem Passwort authentifizieren."
|
"DESCRIPTION": "Nach diesem Zeitraum müssen sich Benutzer erneut mit ihrem Passwort anmelden."
|
||||||
},
|
},
|
||||||
"EXT_LOGIN_CHECK": {
|
"EXT_LOGIN_CHECK": {
|
||||||
"TITLE": "Externe Login-Überprüfung",
|
"TITLE": "Externe Login-Überprüfung",
|
||||||
"DESCRIPTION": "Deine Benutzer werden in diesen Zeiträumen zu ihren externen Identitätsanbietern umgeleitet."
|
"DESCRIPTION": "Deine Benutzer werden in nach diesem Zeitraum zu ihren externen Identitätsanbietern weitergeleitet."
|
||||||
},
|
},
|
||||||
"MULTI_FACTOR_INIT": {
|
"MULTI_FACTOR_INIT": {
|
||||||
"TITLE": "Multifaktor-Initialisierungsüberprüfung",
|
"TITLE": "Multifaktor-Initialisierungsüberprüfung",
|
||||||
"DESCRIPTION": "Deine Benutzer werden aufgefordert, in diesen Zeiträumen einen zweiten Faktor oder einen Multifaktor einzurichten, falls sie dies noch nicht getan haben. Eine Lebensdauer von 0 deaktiviert diese Aufforderung."
|
"DESCRIPTION": "Deine Benutzer werden aufgefordert, in diesem Zeitraum einen zweiten Faktor oder einen Multifaktor einzurichten, falls sie dies noch nicht getan haben. Eine Lebensdauer von 0 deaktiviert diese Aufforderung."
|
||||||
},
|
},
|
||||||
"SECOND_FACTOR_CHECK": {
|
"SECOND_FACTOR_CHECK": {
|
||||||
"TITLE": "Zweiter-Faktor-Überprüfung",
|
"TITLE": "Zweiter-Faktor-Überprüfung",
|
||||||
"DESCRIPTION": "Deine Benutzer müssen ihren zweiten Faktor in diesen Zeiträumen erneut validieren."
|
"DESCRIPTION": "Deine Benutzer müssen ihren zweiten Faktor nach diesem Zeitraum erneut validieren."
|
||||||
},
|
},
|
||||||
"MULTI_FACTOR_CHECK": {
|
"MULTI_FACTOR_CHECK": {
|
||||||
"TITLE": "Multifaktor-Überprüfung",
|
"TITLE": "Multifaktor-Überprüfung",
|
||||||
"DESCRIPTION": "Deine Benutzer müssen ihren Multifaktor in diesen Zeiträumen erneut validieren."
|
"DESCRIPTION": "Deine Benutzer müssen ihren Multifaktor nach diesem Zeitraum erneut validieren."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"FORM": {
|
"FORM": {
|
||||||
@ -267,7 +267,7 @@
|
|||||||
},
|
},
|
||||||
"EXTERNAL_LOGIN_ALLOWED": {
|
"EXTERNAL_LOGIN_ALLOWED": {
|
||||||
"TITLE": "Externer Login erlaubt",
|
"TITLE": "Externer Login erlaubt",
|
||||||
"DESCRIPTION": "Erlaube deinen Benutzern, sich mit einem externen Identitätsanbieter einzuloggen, anstatt den ZITADEL-Benutzer zum Einloggen zu verwenden."
|
"DESCRIPTION": "Erlaube deinen Benutzern, sich mit einem externen Identitätsanbieter einzuloggen, anstatt den ZITADEL-Benutzer zum Anmelden zu verwenden."
|
||||||
},
|
},
|
||||||
"HIDE_PASSWORD_RESET": {
|
"HIDE_PASSWORD_RESET": {
|
||||||
"TITLE": "Passwort-Reset ausgeblendet",
|
"TITLE": "Passwort-Reset ausgeblendet",
|
||||||
@ -303,7 +303,7 @@
|
|||||||
"LINKS": {
|
"LINKS": {
|
||||||
"CONTACT": "Kontakt",
|
"CONTACT": "Kontakt",
|
||||||
"TOS": "Nutzungsbedingungen",
|
"TOS": "Nutzungsbedingungen",
|
||||||
"PP": "Datenschutz-Bestimmungen"
|
"PP": "Datenschutzerklärung"
|
||||||
},
|
},
|
||||||
"THEME": {
|
"THEME": {
|
||||||
"DARK": "Dunkel",
|
"DARK": "Dunkel",
|
||||||
@ -311,7 +311,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"HOME": {
|
"HOME": {
|
||||||
"WELCOME": "Loslegen mit ZITADEL",
|
"WELCOME": "Mit ZITADEL loslegen",
|
||||||
"DISCLAIMER": "ZITADEL behandelt Deine Daten vertraulich und sicher.",
|
"DISCLAIMER": "ZITADEL behandelt Deine Daten vertraulich und sicher.",
|
||||||
"DISCLAIMERLINK": "Mehr Informationen zur Sicherheit",
|
"DISCLAIMERLINK": "Mehr Informationen zur Sicherheit",
|
||||||
"DOCUMENTATION": {
|
"DOCUMENTATION": {
|
||||||
@ -328,15 +328,15 @@
|
|||||||
"SHORTCUTS": "Shortcuts",
|
"SHORTCUTS": "Shortcuts",
|
||||||
"SETTINGS": "Verfügbare Shortcuts",
|
"SETTINGS": "Verfügbare Shortcuts",
|
||||||
"PROJECTS": "Projekte",
|
"PROJECTS": "Projekte",
|
||||||
"REORDER": "Zum Verschieben Kachel halten un ziehen",
|
"REORDER": "Zum Verschieben Kachel halten und ziehen",
|
||||||
"ADD": "Zum Hinzufügen Kachel halten und ziehen"
|
"ADD": "Zum Hinzufügen Kachel halten und ziehen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ONBOARDING": {
|
"ONBOARDING": {
|
||||||
"DESCRIPTION": "Dein Onboarding-prozess",
|
"DESCRIPTION": "Dein Onboarding-Prozess",
|
||||||
"MOREDESCRIPTION": "mehr Shortcuts",
|
"MOREDESCRIPTION": "mehr Shortcuts",
|
||||||
"COMPLETED": "abgeschlossen",
|
"COMPLETED": "Abgeschlossen",
|
||||||
"DISMISS": "schließen",
|
"DISMISS": "Schließen",
|
||||||
"CARD": {
|
"CARD": {
|
||||||
"TITLE": "Bringe deine Instanz zum Laufen",
|
"TITLE": "Bringe deine Instanz zum Laufen",
|
||||||
"DESCRIPTION": "Diese Checkliste hilft bei der Einrichtung Ihrer Instanz und führt Sie durch die wichtigsten Schritte"
|
"DESCRIPTION": "Diese Checkliste hilft bei der Einrichtung Ihrer Instanz und führt Sie durch die wichtigsten Schritte"
|
||||||
@ -344,11 +344,11 @@
|
|||||||
"MILESTONES": {
|
"MILESTONES": {
|
||||||
"instance.policy.label.added": {
|
"instance.policy.label.added": {
|
||||||
"title": "Branding anpassen",
|
"title": "Branding anpassen",
|
||||||
"description": "Definiere Farben und Form des Login-UIs und uploade deine Logos und Icons.",
|
"description": "Definiere Farben und Form des Login-UIs und füge deine Logos und Icons hinzu.",
|
||||||
"action": "Branding anpassen"
|
"action": "Branding anpassen"
|
||||||
},
|
},
|
||||||
"instance.smtp.config.added": {
|
"instance.smtp.config.added": {
|
||||||
"title": "SMTP Benachrichtigungseinstellungen",
|
"title": "SMTP-Einstellungen",
|
||||||
"description": "Konfiguriere deinen Mailserver.",
|
"description": "Konfiguriere deinen Mailserver.",
|
||||||
"action": "SMTP einrichten"
|
"action": "SMTP einrichten"
|
||||||
},
|
},
|
||||||
@ -359,7 +359,7 @@
|
|||||||
},
|
},
|
||||||
"APPLICATION_CREATED": {
|
"APPLICATION_CREATED": {
|
||||||
"title": "Registriere deine App",
|
"title": "Registriere deine App",
|
||||||
"description": "Registriere deine erste Web-, native, API oder SAML-Applikation und konfiguriere den Authentification-flow.",
|
"description": "Registriere deine erste Web-, Nativ-, API- oder SAML-Applikation und konfiguriere den Authentification-Flow.",
|
||||||
"action": "App registrieren"
|
"action": "App registrieren"
|
||||||
},
|
},
|
||||||
"AUTHENTICATION_SUCCEEDED_ON_APPLICATION": {
|
"AUTHENTICATION_SUCCEEDED_ON_APPLICATION": {
|
||||||
@ -369,12 +369,12 @@
|
|||||||
},
|
},
|
||||||
"user.human.added": {
|
"user.human.added": {
|
||||||
"title": "Erfasse Benutzer",
|
"title": "Erfasse Benutzer",
|
||||||
"description": "Erstelle Benutzer die später deine Apps nutzen können.",
|
"description": "Erstelle Benutzer, die später deine Apps nutzen können.",
|
||||||
"action": "Benutzer erfassen"
|
"action": "Benutzer erfassen"
|
||||||
},
|
},
|
||||||
"user.grant.added": {
|
"user.grant.added": {
|
||||||
"title": "Berechtige Benutzer",
|
"title": "Berechtige Benutzer",
|
||||||
"description": "Erlaube es deinen Nutzern auf deine Apps zuzugreifen und gebe ihnen Rollen.",
|
"description": "Erlaube es deinen Nutzern, auf deine Apps zuzugreifen und gebe ihnen Rollen.",
|
||||||
"action": "Benutzer berechtigen"
|
"action": "Benutzer berechtigen"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -425,7 +425,7 @@
|
|||||||
"DEVMODEWARN": "Der Dev-Modus ist standardmäßig aktiviert. Sie können Werte für die Produktion später aktualisieren.",
|
"DEVMODEWARN": "Der Dev-Modus ist standardmäßig aktiviert. Sie können Werte für die Produktion später aktualisieren.",
|
||||||
"GUIDE": "Guide",
|
"GUIDE": "Guide",
|
||||||
"BROWSEEXAMPLES": "Beispiele durchsuchen",
|
"BROWSEEXAMPLES": "Beispiele durchsuchen",
|
||||||
"DUPLICATEAPPRENAME": "Es gibt bereits eine App mit demselben Neme. Bitte wählen Sie einen anderen Namen.",
|
"DUPLICATEAPPRENAME": "Es gibt bereits eine App mit gleichem Namen. Bitte wähle einen anderen Namen.",
|
||||||
"DIALOG": {
|
"DIALOG": {
|
||||||
"CHANGE": {
|
"CHANGE": {
|
||||||
"TITLE": "Framework ändern",
|
"TITLE": "Framework ändern",
|
||||||
@ -454,7 +454,7 @@
|
|||||||
"CONTINUE": "Weiter",
|
"CONTINUE": "Weiter",
|
||||||
"CONTINUEWITH": "Mit {{value}} fortfahren",
|
"CONTINUEWITH": "Mit {{value}} fortfahren",
|
||||||
"BACK": "Zurück",
|
"BACK": "Zurück",
|
||||||
"CLOSE": "Schliessen",
|
"CLOSE": "Schließen",
|
||||||
"CLEAR": "Zurücksetzen",
|
"CLEAR": "Zurücksetzen",
|
||||||
"CANCEL": "Abbrechen",
|
"CANCEL": "Abbrechen",
|
||||||
"INFO": "Info",
|
"INFO": "Info",
|
||||||
@ -465,21 +465,21 @@
|
|||||||
"DELETE": "Löschen",
|
"DELETE": "Löschen",
|
||||||
"REMOVE": "Entfernen",
|
"REMOVE": "Entfernen",
|
||||||
"VERIFY": "Verifizieren",
|
"VERIFY": "Verifizieren",
|
||||||
"FINISH": "Abschliessen",
|
"FINISH": "Abschließen",
|
||||||
"FINISHED": "Fertig",
|
"FINISHED": "Fertig",
|
||||||
"CHANGE": "Ändern",
|
"CHANGE": "Ändern",
|
||||||
"REACTIVATE": "Aktivieren",
|
"REACTIVATE": "Aktivieren",
|
||||||
"ACTIVATE": "Aktivieren",
|
"ACTIVATE": "Aktivieren",
|
||||||
"DEACTIVATE": "Deaktivieren",
|
"DEACTIVATE": "Deaktivieren",
|
||||||
"REFRESH": "Aktualisieren",
|
"REFRESH": "Aktualisieren",
|
||||||
"LOGIN": "Einloggen",
|
"LOGIN": "Anmelden",
|
||||||
"EDIT": "Bearbeiten",
|
"EDIT": "Bearbeiten",
|
||||||
"PIN": "Anpinnen",
|
"PIN": "Anpinnen",
|
||||||
"CONFIGURE": "Konfigurieren",
|
"CONFIGURE": "Konfigurieren",
|
||||||
"SEND": "Senden",
|
"SEND": "Senden",
|
||||||
"NEWVALUE": "Neuer Wert",
|
"NEWVALUE": "Neuer Wert",
|
||||||
"RESTORE": "Wiederherstellen",
|
"RESTORE": "Wiederherstellen",
|
||||||
"CONTINUEWITHOUTSAVE": "Ohne speichern fortfahren",
|
"CONTINUEWITHOUTSAVE": "Ohne Speichern fortfahren",
|
||||||
"OF": "von",
|
"OF": "von",
|
||||||
"PREVIOUS": "Zurück",
|
"PREVIOUS": "Zurück",
|
||||||
"NEXT": "Weiter",
|
"NEXT": "Weiter",
|
||||||
@ -490,7 +490,7 @@
|
|||||||
"UNSAVEDCHANGES": "Nicht gespeicherte Änderungen",
|
"UNSAVEDCHANGES": "Nicht gespeicherte Änderungen",
|
||||||
"UNSAVED": {
|
"UNSAVED": {
|
||||||
"DIALOG": {
|
"DIALOG": {
|
||||||
"DESCRIPTION": "Möchten Sie diese neue Aktion wirklich verwerfen? Ihre Aktion geht verloren",
|
"DESCRIPTION": "Möchtest du diese neue Aktion wirklich verwerfen? Alle Änderungen gehen verloren",
|
||||||
"CANCEL": "Abbrechen",
|
"CANCEL": "Abbrechen",
|
||||||
"DISCARD": "Verwerfen"
|
"DISCARD": "Verwerfen"
|
||||||
}
|
}
|
||||||
@ -513,7 +513,7 @@
|
|||||||
"ORG_OWNER_VIEWER": "Hat die Leseberechtigung, die gesamte Organisation zu überprüfen",
|
"ORG_OWNER_VIEWER": "Hat die Leseberechtigung, die gesamte Organisation zu überprüfen",
|
||||||
"ORG_USER_PERMISSION_EDITOR": "Verfügt über die Berechtigung zum Verwalten von User grants",
|
"ORG_USER_PERMISSION_EDITOR": "Verfügt über die Berechtigung zum Verwalten von User grants",
|
||||||
"ORG_PROJECT_PERMISSION_EDITOR": "Hat die Berechtigung, Projektberechtigungen für externe Organisationen zu verwalten",
|
"ORG_PROJECT_PERMISSION_EDITOR": "Hat die Berechtigung, Projektberechtigungen für externe Organisationen zu verwalten",
|
||||||
"ORG_PROJECT_CREATOR": "Hat die Berechtigung, seine eigenen Projekte und zugrunde liegenden Einstellungen zu erstellen",
|
"ORG_PROJECT_CREATOR": "Hat die Berechtigung, seine eigenen Projekte und dessen Einstellungen zu erstellen",
|
||||||
"ORG_ADMIN_IMPERSONATOR": "Hat die Berechtigung, sich als Administrator und Endbenutzer der Organisation auszugeben",
|
"ORG_ADMIN_IMPERSONATOR": "Hat die Berechtigung, sich als Administrator und Endbenutzer der Organisation auszugeben",
|
||||||
"ORG_END_USER_IMPERSONATOR": "Hat die Berechtigung, sich als Endbenutzer der Organisation auszugeben",
|
"ORG_END_USER_IMPERSONATOR": "Hat die Berechtigung, sich als Endbenutzer der Organisation auszugeben",
|
||||||
"PROJECT_OWNER": "Hat die Berechtigung für das gesamte Projekt",
|
"PROJECT_OWNER": "Hat die Berechtigung für das gesamte Projekt",
|
||||||
@ -525,16 +525,16 @@
|
|||||||
},
|
},
|
||||||
"OVERLAYS": {
|
"OVERLAYS": {
|
||||||
"ORGSWITCHER": {
|
"ORGSWITCHER": {
|
||||||
"TEXT": "Alle Organisationseinstellungen und Tabellen basieren auf dieser ausgewählten Organisation. Klicken Sie auf diese Schaltfläche, um die Organisation zu wechseln oder eine neue zu erstellen."
|
"TEXT": "Alle Organisationseinstellungen und Tabellen basieren auf dieser ausgewählten Organisation. Klicke auf diese Schaltfläche, um die Organisation zu wechseln oder eine neue zu erstellen."
|
||||||
},
|
},
|
||||||
"INSTANCE": {
|
"INSTANCE": {
|
||||||
"TEXT": "Klicken Sie hier, um zu den Instanceeinstellungen zu gelangen. Beachten Sie, dass Sie nur Zugriff auf diese Schaltfläche haben, wenn Sie über erweiterte Berechtigungen verfügen."
|
"TEXT": "Klicke hier, um zu den Instanz-Einstellungen zu gelangen. Beachte, dass du nur Zugriff auf diese Schaltfläche hast, wenn du über erweiterte Berechtigungen verfügst."
|
||||||
},
|
},
|
||||||
"PROFILE": {
|
"PROFILE": {
|
||||||
"TEXT": "Hier können Sie zwischen Ihren Benutzerkonten wechseln und Ihre Sessions und Ihr Profil verwalten."
|
"TEXT": "Hier kannst du zwischen Benutzerkonten wechseln und deine Sessions und Profil verwalten."
|
||||||
},
|
},
|
||||||
"NAV": {
|
"NAV": {
|
||||||
"TEXT": "Diese Navigation ändert sich basierend auf Ihrer Organisation oder Instanz"
|
"TEXT": "Diese Navigation ändert sich basierend auf deiner Organisation oder Instanz"
|
||||||
},
|
},
|
||||||
"CONTEXTCHANGED": {
|
"CONTEXTCHANGED": {
|
||||||
"TEXT": "Achtung! Soeben wurde die Organisation gewechselt."
|
"TEXT": "Achtung! Soeben wurde die Organisation gewechselt."
|
||||||
@ -572,8 +572,8 @@
|
|||||||
"ME": "Zum eigenen Profil",
|
"ME": "Zum eigenen Profil",
|
||||||
"PROJECTS": "Zu den <strong>P</strong>rojekten",
|
"PROJECTS": "Zu den <strong>P</strong>rojekten",
|
||||||
"USERS": "Zu den Benutzern",
|
"USERS": "Zu den Benutzern",
|
||||||
"USERGRANTS": "Zu den <strong>A</strong>uthentisierungen",
|
"USERGRANTS": "Zu den <strong>A</strong>utorisierungen",
|
||||||
"ACTIONS": "Zu den Aktionen und Abläufe",
|
"ACTIONS": "Zu den Aktionen und Flows",
|
||||||
"DOMAINS": "Zu den <strong>D</strong>omains"
|
"DOMAINS": "Zu den <strong>D</strong>omains"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -585,7 +585,7 @@
|
|||||||
},
|
},
|
||||||
"ERRORS": {
|
"ERRORS": {
|
||||||
"REQUIRED": "Bitte fülle dieses Feld aus.",
|
"REQUIRED": "Bitte fülle dieses Feld aus.",
|
||||||
"ATLEASTONE": "Geben Sie mindestens einen Wert an.",
|
"ATLEASTONE": "Gebe mindestens einen Wert an.",
|
||||||
"TOKENINVALID": {
|
"TOKENINVALID": {
|
||||||
"TITLE": "Du bist abgemeldet",
|
"TITLE": "Du bist abgemeldet",
|
||||||
"DESCRIPTION": "Klicke auf \"Einloggen\", um Dich erneut anzumelden."
|
"DESCRIPTION": "Klicke auf \"Einloggen\", um Dich erneut anzumelden."
|
||||||
@ -594,11 +594,11 @@
|
|||||||
"TITLE": "Deine Instanz ist blockiert.",
|
"TITLE": "Deine Instanz ist blockiert.",
|
||||||
"DESCRIPTION": "Bitte kontaktiere den Administrator deiner ZITADEL Instanz."
|
"DESCRIPTION": "Bitte kontaktiere den Administrator deiner ZITADEL Instanz."
|
||||||
},
|
},
|
||||||
"INVALID_FORMAT": "Das Format is ungültig.",
|
"INVALID_FORMAT": "Das Format ist ungültig.",
|
||||||
"NOTANEMAIL": "Der eingegebene Wert ist keine E-Mail Adresse.",
|
"NOTANEMAIL": "Der eingegebene Wert ist keine E-Mail Adresse.",
|
||||||
"MINLENGTH": "Muss mindestens {{requiredLength}} Zeichen lang sein.",
|
"MINLENGTH": "Muss mindestens {{requiredLength}} Zeichen lang sein.",
|
||||||
"MAXLENGTH": "Muss weniger als {{requiredLength}} Zeichen enthalten",
|
"MAXLENGTH": "Muss weniger als {{requiredLength}} Zeichen enthalten",
|
||||||
"UPPERCASEMISSING": "Muss einen Grossbuchstaben beinhalten.",
|
"UPPERCASEMISSING": "Muss einen Großbuchstaben beinhalten.",
|
||||||
"LOWERCASEMISSING": "Muss einen Kleinbuchstaben beinhalten.",
|
"LOWERCASEMISSING": "Muss einen Kleinbuchstaben beinhalten.",
|
||||||
"SYMBOLERROR": "Muss ein Symbol/Satzzeichen beinhalten.",
|
"SYMBOLERROR": "Muss ein Symbol/Satzzeichen beinhalten.",
|
||||||
"NUMBERERROR": "Muss eine Ziffer beinhalten.",
|
"NUMBERERROR": "Muss eine Ziffer beinhalten.",
|
||||||
@ -658,7 +658,7 @@
|
|||||||
},
|
},
|
||||||
"SENDEMAILDIALOG": {
|
"SENDEMAILDIALOG": {
|
||||||
"TITLE": "Email Benachrichtigung senden",
|
"TITLE": "Email Benachrichtigung senden",
|
||||||
"DESCRIPTION": "Klicken Sie den untenstehenden Button um ein Verifizierung-E-Mail an die aktuelle Adresse zu versenden oder ändern Sie die Emailadresse in dem Feld.",
|
"DESCRIPTION": "Klicken Sie den untenstehenden Button um ein Verifizierungs-E-Mail an die aktuelle Adresse zu versenden oder ändern Sie die E-Maila-Adresse in dem Feld.",
|
||||||
"NEWEMAIL": "Neue Email"
|
"NEWEMAIL": "Neue Email"
|
||||||
},
|
},
|
||||||
"SECRETDIALOG": {
|
"SECRETDIALOG": {
|
||||||
@ -715,10 +715,10 @@
|
|||||||
"ADD_DESCRIPTION": "Wählen Sie eine der verfügbaren Optionen für das Erstellen einer passwortlosen Authentifizierungsmethode.",
|
"ADD_DESCRIPTION": "Wählen Sie eine der verfügbaren Optionen für das Erstellen einer passwortlosen Authentifizierungsmethode.",
|
||||||
"SEND_DESCRIPTION": "Senden Sie sich einen Registrierungslink an Ihre E-Mail Adresse.",
|
"SEND_DESCRIPTION": "Senden Sie sich einen Registrierungslink an Ihre E-Mail Adresse.",
|
||||||
"SEND": "Registrierungslink senden",
|
"SEND": "Registrierungslink senden",
|
||||||
"SENT": "Die email wurde erfolgreich zugestellt. Kontrollieren Sie Ihr Postfach um mit dem Setup fortzufahren.",
|
"SENT": "Die E-Mail wurde erfolgreich zugestellt. Kontrollieren Sie Ihr Postfach, um mit dem Setup fortzufahren.",
|
||||||
"QRCODE_DESCRIPTION": "QR-Code zum scannen mit einem anderen Gerät generieren.",
|
"QRCODE_DESCRIPTION": "QR-Code zum Scannen mit einem anderen Gerät generieren.",
|
||||||
"QRCODE": "QR-Code generieren",
|
"QRCODE": "QR-Code generieren",
|
||||||
"QRCODE_SCAN": "Scannen Sie diesen QR Code um mit dem Setup auf Ihrem Gerät fortzufahren.",
|
"QRCODE_SCAN": "Scannen Sie diesen QR-Code, um mit dem Setup auf Ihrem Gerät fortzufahren.",
|
||||||
"NEW_DESCRIPTION": "Verwenden Sie dieses Gerät um Passwortlos aufzusetzen.",
|
"NEW_DESCRIPTION": "Verwenden Sie dieses Gerät um Passwortlos aufzusetzen.",
|
||||||
"NEW": "Hinzufügen"
|
"NEW": "Hinzufügen"
|
||||||
}
|
}
|
||||||
@ -744,9 +744,9 @@
|
|||||||
"OTPSMS": "OTP (One-Time Password) mit SMS",
|
"OTPSMS": "OTP (One-Time Password) mit SMS",
|
||||||
"OTPEMAIL": "OTP (One-Time Password) mit E-Mail",
|
"OTPEMAIL": "OTP (One-Time Password) mit E-Mail",
|
||||||
"SETUPOTPSMSDESCRIPTION": "Möchten Sie diese Telefonnummer als zweiten OTP-Faktor (Einmalpasswort) einrichten?",
|
"SETUPOTPSMSDESCRIPTION": "Möchten Sie diese Telefonnummer als zweiten OTP-Faktor (Einmalpasswort) einrichten?",
|
||||||
"OTPSMSSUCCESS": "OTP Faktor erfolgrech hinzugefügt.",
|
"OTPSMSSUCCESS": "OTP-Faktor erfolgrech hinzugefügt.",
|
||||||
"OTPSMSPHONEMUSTBEVERIFIED": "Um diese Methode nutzen zu können, muss Ihr Telefon verifiziert werden.",
|
"OTPSMSPHONEMUSTBEVERIFIED": "Um diese Methode nutzen zu können, muss Ihr Telefon verifiziert werden.",
|
||||||
"OTPEMAILSUCCESS": "OTP Faktor erfolgrech hinzugefügt.",
|
"OTPEMAILSUCCESS": "OTP-Faktor erfolgrech hinzugefügt.",
|
||||||
"TYPE": {
|
"TYPE": {
|
||||||
"0": "Keine MFA definiert",
|
"0": "Keine MFA definiert",
|
||||||
"1": "OTP",
|
"1": "OTP",
|
||||||
@ -768,13 +768,13 @@
|
|||||||
"EXTERNALIDP": {
|
"EXTERNALIDP": {
|
||||||
"TITLE": "Externe Identitäts-Provider",
|
"TITLE": "Externe Identitäts-Provider",
|
||||||
"DESC": "",
|
"DESC": "",
|
||||||
"IDPCONFIGID": "Idp Konfig ID",
|
"IDPCONFIGID": "IDP Konfig ID",
|
||||||
"IDPNAME": "Idp Name",
|
"IDPNAME": "IDP Name",
|
||||||
"USERDISPLAYNAME": "Externer Name",
|
"USERDISPLAYNAME": "Externer Name",
|
||||||
"EXTERNALUSERID": "Externe Benutzer ID",
|
"EXTERNALUSERID": "Externe Benutzer ID",
|
||||||
"EMPTY": "Kein IDP gefunden",
|
"EMPTY": "Kein IDP gefunden",
|
||||||
"DIALOG": {
|
"DIALOG": {
|
||||||
"DELETE_TITLE": "Idp entfernen",
|
"DELETE_TITLE": "IDP entfernen",
|
||||||
"DELETE_DESCRIPTION": "Sie sind im Begriff einen Identitätsanbieter zu entfernen. Wollen Sie dies wirklich tun?"
|
"DELETE_DESCRIPTION": "Sie sind im Begriff einen Identitätsanbieter zu entfernen. Wollen Sie dies wirklich tun?"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -786,11 +786,11 @@
|
|||||||
"PHONESECTION": "Telefonnummer",
|
"PHONESECTION": "Telefonnummer",
|
||||||
"PASSWORDSECTION": "Setze ein initiales Passwort.",
|
"PASSWORDSECTION": "Setze ein initiales Passwort.",
|
||||||
"ADDRESSANDPHONESECTION": "Telefonnummer",
|
"ADDRESSANDPHONESECTION": "Telefonnummer",
|
||||||
"INITMAILDESCRIPTION": "Wenn beide Optionen ausgewählt sind, wird keine E-Mail zur Initialisierung gesendet. Wenn nur eine der Optionen ausgewählt ist, wird eine E-Mail zur Aufforderung der Bereitstellung oder Verifikation der Daten gesendet."
|
"INITMAILDESCRIPTION": "Wenn beide Optionen ausgewählt sind, wird keine E-Mail zur Initialisierung gesendet. Wenn nur eine der Optionen ausgewählt ist, wird eine E-Mail zur Verifikation der Daten gesendet."
|
||||||
},
|
},
|
||||||
"CODEDIALOG": {
|
"CODEDIALOG": {
|
||||||
"TITLE": "Telefonnummer verifizieren",
|
"TITLE": "Telefonnummer verifizieren",
|
||||||
"DESCRIPTION": "Gebe Deinen erhaltenen Code ein, um die Telefonnummer zu bestätigen.",
|
"DESCRIPTION": "Gebe den erhaltenen Code ein, um die Telefonnummer zu bestätigen.",
|
||||||
"CODE": "Code"
|
"CODE": "Code"
|
||||||
},
|
},
|
||||||
"DATA": {
|
"DATA": {
|
||||||
@ -807,7 +807,7 @@
|
|||||||
"TITLE": "Profil",
|
"TITLE": "Profil",
|
||||||
"EMAIL": "E-Mail",
|
"EMAIL": "E-Mail",
|
||||||
"PHONE": "Telefonnummer",
|
"PHONE": "Telefonnummer",
|
||||||
"PHONE_HINT": "Verwenden das Symbol + gefolgt von der Landesvorwahl des Anrufers oder wählen Sie das Land aus der Dropdown-Liste aus und geben anschließend die Telefonnummer ein",
|
"PHONE_HINT": "Verwenden das Symbol + gefolgt von der Landesvorwahl des Anrufers oder wähle das Land aus der Dropdown-Liste aus und gebe anschließend die Telefonnummer ein.",
|
||||||
"USERNAME": "Benutzername",
|
"USERNAME": "Benutzername",
|
||||||
"CHANGEUSERNAME": "bearbeiten",
|
"CHANGEUSERNAME": "bearbeiten",
|
||||||
"CHANGEUSERNAME_TITLE": "Benutzername ändern",
|
"CHANGEUSERNAME_TITLE": "Benutzername ändern",
|
||||||
@ -821,13 +821,13 @@
|
|||||||
"GENDER": "Geschlecht",
|
"GENDER": "Geschlecht",
|
||||||
"PASSWORD": "Passwort",
|
"PASSWORD": "Passwort",
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"UPLOADTITLE": "Profilfoto uploaden",
|
"UPLOADTITLE": "Profilfoto hochladen",
|
||||||
"UPLOADBTN": "Datei auswählen",
|
"UPLOADBTN": "Datei auswählen",
|
||||||
"UPLOAD": "Hochladen",
|
"UPLOAD": "Hochladen",
|
||||||
"CURRENT": "Aktuelles Bild",
|
"CURRENT": "Aktuelles Bild",
|
||||||
"PREVIEW": "Vorschau",
|
"PREVIEW": "Vorschau",
|
||||||
"DELETESUCCESS": "Erfolgreich gelöscht!",
|
"DELETESUCCESS": "Erfolgreich gelöscht!",
|
||||||
"CROPPERERROR": "Ein Fehler beim hochladen Ihrer Datei ist fehlgeschlagen. Versuchen Sie es mit ggf mit einem anderen Format und Grösse."
|
"CROPPERERROR": "Das Hochladen deiner Datei ist fehlgeschlagen. Versuche es mit ggf. mit einem anderen Format und Größe."
|
||||||
},
|
},
|
||||||
"COUNTRY": "Land"
|
"COUNTRY": "Land"
|
||||||
},
|
},
|
||||||
@ -858,7 +858,7 @@
|
|||||||
},
|
},
|
||||||
"ADDED": {
|
"ADDED": {
|
||||||
"TITLE": "Schlüssel wurde erstellt",
|
"TITLE": "Schlüssel wurde erstellt",
|
||||||
"DESCRIPTION": "Speichern Sie den Schlüssen. Der Schlüssel kann später nicht nochmal aufgerufen werden!"
|
"DESCRIPTION": "Speichern Sie den Schlüssel. Der Schlüssel kann später nicht nochmal aufgerufen werden!"
|
||||||
},
|
},
|
||||||
"KEYTYPES": {
|
"KEYTYPES": {
|
||||||
"1": "JSON"
|
"1": "JSON"
|
||||||
@ -881,8 +881,8 @@
|
|||||||
"CONFIRMINITIAL": "Passwort wiederholen",
|
"CONFIRMINITIAL": "Passwort wiederholen",
|
||||||
"RESET": "Passwort zurücksetzen",
|
"RESET": "Passwort zurücksetzen",
|
||||||
"SET": "Passwort neu setzen",
|
"SET": "Passwort neu setzen",
|
||||||
"RESENDNOTIFICATION": "Email zum Zurücksetzen senden",
|
"RESENDNOTIFICATION": "E-Mail zum Zurücksetzen senden",
|
||||||
"REQUIRED": "Bitte prüfe, dass alle notwendigen Felder ausgefüllt sind.",
|
"REQUIRED": "Bitte prüfe, ob alle notwendigen Felder ausgefüllt sind.",
|
||||||
"MINLENGTHERROR": "Muss mindestens {{value}} Zeichen lang sein.",
|
"MINLENGTHERROR": "Muss mindestens {{value}} Zeichen lang sein.",
|
||||||
"MAXLENGTHERROR": "Muss weniger als {{value}} Zeichen umfassen."
|
"MAXLENGTHERROR": "Muss weniger als {{value}} Zeichen umfassen."
|
||||||
},
|
},
|
||||||
@ -901,11 +901,11 @@
|
|||||||
"EMAIL": {
|
"EMAIL": {
|
||||||
"TITLE": "E-Mail",
|
"TITLE": "E-Mail",
|
||||||
"VALID": "Validiert",
|
"VALID": "Validiert",
|
||||||
"ISVERIFIED": "Email Verifiziert",
|
"ISVERIFIED": "Email verifiziert",
|
||||||
"ISVERIFIEDDESC": "Wenn die Email als verifiziert angegeben wird, wird keine Verifikationsmail an den Benutzer versendet.",
|
"ISVERIFIEDDESC": "Wenn die Email als verifiziert angegeben wird, wird keine Verifikationsmail an den Benutzer versendet.",
|
||||||
"RESEND": "Verifikationsmail erneut senden",
|
"RESEND": "Verifikationsmail erneut senden",
|
||||||
"EDITTITLE": "Email ändern",
|
"EDITTITLE": "Email ändern",
|
||||||
"EDITDESC": "Geben Sie die neue Email in dem darunterliegenden Feld ein!"
|
"EDITDESC": "Geben Sie die neue Email in das Feld unten ein!"
|
||||||
},
|
},
|
||||||
"PHONE": {
|
"PHONE": {
|
||||||
"TITLE": "Telefon",
|
"TITLE": "Telefon",
|
||||||
@ -913,10 +913,10 @@
|
|||||||
"RESEND": "Verifikationsnachricht erneut senden",
|
"RESEND": "Verifikationsnachricht erneut senden",
|
||||||
"EDITTITLE": "Nummer ändern",
|
"EDITTITLE": "Nummer ändern",
|
||||||
"EDITVALUE": "Telefonnummer",
|
"EDITVALUE": "Telefonnummer",
|
||||||
"EDITDESC": "Geben Sie die neue Nummer in dem darunterliegenden Feld ein!",
|
"EDITDESC": "Geben Sie die neue Nummer in das Feld unten ein!",
|
||||||
"DELETETITLE": "Telefonnummer löschen",
|
"DELETETITLE": "Telefonnummer löschen",
|
||||||
"DELETEDESC": "Wollen Sie die Telefonnummer wirklich löschen?",
|
"DELETEDESC": "Wollen Sie die Telefonnummer wirklich löschen?",
|
||||||
"OTPSMSREMOVALWARNING": "Dieses Konto verwendet diese Telefonnummer als zweiten Faktor. Wenn Sie fortfahren können Sie nicht mehr darauf zugreifen."
|
"OTPSMSREMOVALWARNING": "Dieses Konto verwendet diese Telefonnummer als zweiten Faktor. Wenn Sie fortfahren, können Sie nicht mehr darauf zugreifen."
|
||||||
},
|
},
|
||||||
"RESENDCODE": "Code erneut senden",
|
"RESENDCODE": "Code erneut senden",
|
||||||
"ENTERCODE": "Verifizieren",
|
"ENTERCODE": "Verifizieren",
|
||||||
@ -924,7 +924,7 @@
|
|||||||
},
|
},
|
||||||
"GRANTS": {
|
"GRANTS": {
|
||||||
"TITLE": "Benutzerberechtigungen",
|
"TITLE": "Benutzerberechtigungen",
|
||||||
"DESCRIPTION": "Erteile diesem Benutzer Verwaltunszugriff auf bestimmte Projekte.",
|
"DESCRIPTION": "Erteile diesem Benutzer Verwaltungszugriff auf bestimmte Projekte.",
|
||||||
"CREATE": {
|
"CREATE": {
|
||||||
"TITLE": "Benutzerberechtigung erstellen",
|
"TITLE": "Benutzerberechtigung erstellen",
|
||||||
"DESCRIPTION": "Suche nach der Organisation, dem Projekt und den verfügbaren Rollen."
|
"DESCRIPTION": "Suche nach der Organisation, dem Projekt und den verfügbaren Rollen."
|
||||||
@ -957,7 +957,7 @@
|
|||||||
"EXTERNAL": "Um einen Benutzer Ihrer eigenen Organisation zu berechtigen, ",
|
"EXTERNAL": "Um einen Benutzer Ihrer eigenen Organisation zu berechtigen, ",
|
||||||
"CLICKHERE": "klicke hier"
|
"CLICKHERE": "klicke hier"
|
||||||
},
|
},
|
||||||
"SIGNEDOUT": "Du bist abgemeldet. Klicke auf \"Anmelden\", um Dich erneut anzumelden.",
|
"SIGNEDOUT": "Du wurdest abgemeldet. Klicke auf \"Anmelden\", um Dich erneut anzumelden.",
|
||||||
"SIGNEDOUT_BTN": "Anmelden",
|
"SIGNEDOUT_BTN": "Anmelden",
|
||||||
"EDITACCOUNT": "Konto bearbeiten",
|
"EDITACCOUNT": "Konto bearbeiten",
|
||||||
"ADDACCOUNT": "Konto hinzufügen",
|
"ADDACCOUNT": "Konto hinzufügen",
|
||||||
@ -966,9 +966,9 @@
|
|||||||
"TOAST": {
|
"TOAST": {
|
||||||
"CREATED": "Benutzer erfolgreich erstellt.",
|
"CREATED": "Benutzer erfolgreich erstellt.",
|
||||||
"SAVED": "Profil gespeichert.",
|
"SAVED": "Profil gespeichert.",
|
||||||
"USERNAMECHANGED": "Username geändert.",
|
"USERNAMECHANGED": "Benutzername geändert.",
|
||||||
"EMAILSAVED": "E-Mail gespeichert.",
|
"EMAILSAVED": "E-Mail gespeichert.",
|
||||||
"INITEMAILSENT": "Initialisierung Email gesendet.",
|
"INITEMAILSENT": "Initialisierungs-Email gesendet.",
|
||||||
"PHONESAVED": "Telefonnummer gespeichert.",
|
"PHONESAVED": "Telefonnummer gespeichert.",
|
||||||
"PHONEREMOVED": "Telefonnummer gelöscht.",
|
"PHONEREMOVED": "Telefonnummer gelöscht.",
|
||||||
"PHONEVERIFIED": "Telefonnummer bestätigt.",
|
"PHONEVERIFIED": "Telefonnummer bestätigt.",
|
||||||
@ -986,10 +986,10 @@
|
|||||||
"SELECTEDDEACTIVATED": "Selektierte Benutzer deaktiviert.",
|
"SELECTEDDEACTIVATED": "Selektierte Benutzer deaktiviert.",
|
||||||
"SELECTEDKEYSDELETED": "Selektierte Schlüssel gelöscht.",
|
"SELECTEDKEYSDELETED": "Selektierte Schlüssel gelöscht.",
|
||||||
"KEYADDED": "Schlüssel hinzugefügt!",
|
"KEYADDED": "Schlüssel hinzugefügt!",
|
||||||
"MACHINEADDED": "Service User erstellt!",
|
"MACHINEADDED": "Service-Benutzer erstellt!",
|
||||||
"DELETED": "Benutzer erfolgreich gelöscht!",
|
"DELETED": "Benutzer erfolgreich gelöscht!",
|
||||||
"UNLOCKED": "Benutzer erfolgreich freigeschaltet!",
|
"UNLOCKED": "Benutzer erfolgreich freigeschaltet!",
|
||||||
"PASSWORDLESSREGISTRATIONSENT": "Link via email versendet.",
|
"PASSWORDLESSREGISTRATIONSENT": "Link via E-Mail versendet.",
|
||||||
"SECRETGENERATED": "Secret erfolgreich generiert!",
|
"SECRETGENERATED": "Secret erfolgreich generiert!",
|
||||||
"SECRETREMOVED": "Secret erfolgreich gelöscht!"
|
"SECRETREMOVED": "Secret erfolgreich gelöscht!"
|
||||||
},
|
},
|
||||||
@ -998,14 +998,14 @@
|
|||||||
"DESCRIPTION": "Dies sind alle Mitgliedschaften des Benutzers. Du kannst die entsprechenden Rechte auch auf der Organisations-, Projekt-, oder IAM-Detailseite aufrufen und modifizieren.",
|
"DESCRIPTION": "Dies sind alle Mitgliedschaften des Benutzers. Du kannst die entsprechenden Rechte auch auf der Organisations-, Projekt-, oder IAM-Detailseite aufrufen und modifizieren.",
|
||||||
"ORGCONTEXT": "Sie sehen alle Organisationen und Projekte, die mit der aktuell gewählten Organisation in Verbindung stehen.",
|
"ORGCONTEXT": "Sie sehen alle Organisationen und Projekte, die mit der aktuell gewählten Organisation in Verbindung stehen.",
|
||||||
"USERCONTEXT": "Sie sehen alle Organisationen und Projekte auf denen Sie berechtigt sind inklusive aller zur Auswahl stehenden Organisationen.",
|
"USERCONTEXT": "Sie sehen alle Organisationen und Projekte auf denen Sie berechtigt sind inklusive aller zur Auswahl stehenden Organisationen.",
|
||||||
"CREATIONDATE": "Erstelldatum",
|
"CREATIONDATE": "Erstellungsdatum",
|
||||||
"CHANGEDATE": "Letzte Änderung",
|
"CHANGEDATE": "Letzte Änderung",
|
||||||
"DISPLAYNAME": "Anzeigename",
|
"DISPLAYNAME": "Anzeigename",
|
||||||
"REMOVE": "Entfernen",
|
"REMOVE": "Entfernen",
|
||||||
"TYPE": "Typ",
|
"TYPE": "Typ",
|
||||||
"ORGID": "Organisation ID",
|
"ORGID": "Organisation ID",
|
||||||
"UPDATED": "Membership wurde geändert.",
|
"UPDATED": "Mitgliedschaft wurde geändert.",
|
||||||
"NOPERMISSIONTOEDIT": "Ihnen fehlt die benötigte Berechtigung um Rollen zu ändern!",
|
"NOPERMISSIONTOEDIT": "Ihnen fehlt die benötigte Berechtigung, um Rollen zu ändern!",
|
||||||
"TYPES": {
|
"TYPES": {
|
||||||
"UNKNOWN": "Unbekannt",
|
"UNKNOWN": "Unbekannt",
|
||||||
"ORG": "Organisation",
|
"ORG": "Organisation",
|
||||||
@ -1028,7 +1028,7 @@
|
|||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Token löschen",
|
"TITLE": "Token löschen",
|
||||||
"DESCRIPTION": "Sie sind im Begriff das Token unwiderruflich zu löschen. Wollen Sie dies wirklich tun?"
|
"DESCRIPTION": "Sie sind im Begriff, das Token unwiderruflich zu löschen. Wollen Sie dies wirklich tun?"
|
||||||
},
|
},
|
||||||
"DELETED": "Personal Access Token gelöscht."
|
"DELETED": "Personal Access Token gelöscht."
|
||||||
}
|
}
|
||||||
@ -1060,7 +1060,7 @@
|
|||||||
"ALLOWEDTOFAIL": "Scheitern erlaubt",
|
"ALLOWEDTOFAIL": "Scheitern erlaubt",
|
||||||
"ALLOWEDTOFAILWARN": {
|
"ALLOWEDTOFAILWARN": {
|
||||||
"TITLE": "Warnung",
|
"TITLE": "Warnung",
|
||||||
"DESCRIPTION": "Wenn du diese Einstellung deaktivierst, kann es dazu führen, dass sich Benutzer deiner Organisation nicht mehr anmelden können. Ausserdem kannst du dann nicht mehr auf die Konsole zugreifen, um die Action zu deaktivieren. Wir empfehlen, einen Administratorbenutzer in einer separaten Organisation zu erstellen oder Skripte zuerst in einer Entwicklungsumgebung oder einer Entwicklungsorganisation zu testen."
|
"DESCRIPTION": "Wenn du diese Einstellung deaktivierst, kann dies dazu führen, dass sich Benutzer deiner Organisation nicht mehr anmelden können. Außerdem kannst du dann nicht mehr auf die Konsole zugreifen, um die Aktion zu deaktivieren. Wir empfehlen, einen Administratorbenutzer in einer separaten Organisation zu erstellen oder Skripte zuerst in einer Entwicklungsumgebung oder einer Entwicklungsorganisation zu testen."
|
||||||
},
|
},
|
||||||
"SCRIPT": "Script",
|
"SCRIPT": "Script",
|
||||||
"FLOWTYPE": "Flow Typ",
|
"FLOWTYPE": "Flow Typ",
|
||||||
@ -1076,18 +1076,18 @@
|
|||||||
},
|
},
|
||||||
"DELETEACTION": {
|
"DELETEACTION": {
|
||||||
"TITLE": "Aktion löschen?",
|
"TITLE": "Aktion löschen?",
|
||||||
"DESCRIPTION": "Sie sind im Begriff eine Aktion zu löschen. Dieser Vorgang kann nicht zurückgesetzt werden. Sind Sie sicher?",
|
"DESCRIPTION": "Du bist im Begriff, eine Aktion zu löschen. Dieser Vorgang kann nicht rückgängig gemacht werden. Bist du dir sicher?",
|
||||||
"DELETE_SUCCESS": "Aktion erfolgreich gelöscht."
|
"DELETE_SUCCESS": "Aktion erfolgreich gelöscht."
|
||||||
},
|
},
|
||||||
"CLEAR": {
|
"CLEAR": {
|
||||||
"TITLE": "Flow zurücksetzen?",
|
"TITLE": "Flow zurücksetzen?",
|
||||||
"DESCRIPTION": "Sie sind im Begriff den Flow mitsamt seinen Triggern und Aktionen zurückzusetzen. Diese Änderung kann nicht wiederhergestellt werden."
|
"DESCRIPTION": "Du bist im Begriff, den Flow mitsamt seinen Triggern und Aktionen zurückzusetzen. Diese Änderung kann nicht rückgängig gemacht werden."
|
||||||
},
|
},
|
||||||
"REMOVEACTIONSLIST": {
|
"REMOVEACTIONSLIST": {
|
||||||
"TITLE": "Ausgewählte Aktionen löschen?",
|
"TITLE": "Ausgewählte Aktionen löschen?",
|
||||||
"DESCRIPTION": "Wollen Sie die gewählten Aktionen wirklich löschen?"
|
"DESCRIPTION": "Wollen Sie die gewählten Aktionen wirklich löschen?"
|
||||||
},
|
},
|
||||||
"ABOUTNAME": "Der Name der Aktion und der Name der Funktion im Javascript müssen identisch sein"
|
"ABOUTNAME": "Der Name der Aktion und der Name der Funktion im Javascript müssen identisch sein."
|
||||||
},
|
},
|
||||||
"TOAST": {
|
"TOAST": {
|
||||||
"ACTIONSSET": "Aktionen gesetzt",
|
"ACTIONSSET": "Aktionen gesetzt",
|
||||||
@ -1102,7 +1102,7 @@
|
|||||||
},
|
},
|
||||||
"EVENTSTORE": {
|
"EVENTSTORE": {
|
||||||
"TITLE": "IAM Speicher Administration",
|
"TITLE": "IAM Speicher Administration",
|
||||||
"DESCRIPTION": "Verwalte Speicher Einstellungen von ZITADEL."
|
"DESCRIPTION": "Verwalte Speicher-Einstellungen von ZITADEL."
|
||||||
},
|
},
|
||||||
"MEMBER": {
|
"MEMBER": {
|
||||||
"TITLE": "Manager",
|
"TITLE": "Manager",
|
||||||
@ -1130,7 +1130,7 @@
|
|||||||
"CLEARED": "View wurde erfolgreich zurückgesetzt!",
|
"CLEARED": "View wurde erfolgreich zurückgesetzt!",
|
||||||
"DIALOG": {
|
"DIALOG": {
|
||||||
"VIEW_CLEAR_TITLE": "View zurücksetzen?",
|
"VIEW_CLEAR_TITLE": "View zurücksetzen?",
|
||||||
"VIEW_CLEAR_DESCRIPTION": "Sie sind im Begriff eine View zu löschen. Durch das Löschen einer View wird ein Prozess gestartet, bei dem Daten für Endbenutzer möglicherweise nicht oder verzögert verfügbar sind. Sind Sie sicher?"
|
"VIEW_CLEAR_DESCRIPTION": "Du bist im Begriff eine View zu löschen. Durch das Löschen einer View wird ein Prozess gestartet, bei dem Daten für Endbenutzer möglicherweise nicht oder verzögert verfügbar sind. Bist du dir sicher?"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"FAILEDEVENTS": {
|
"FAILEDEVENTS": {
|
||||||
@ -1212,7 +1212,7 @@
|
|||||||
"CREATIONDATE": "Erstelldatum",
|
"CREATIONDATE": "Erstelldatum",
|
||||||
"DATECHANGED": "Geändert",
|
"DATECHANGED": "Geändert",
|
||||||
"FILTER": "Filter",
|
"FILTER": "Filter",
|
||||||
"FILTERPLACEHOLDER": "Filtern Sie nach dem Namen",
|
"FILTERPLACEHOLDER": "Nach dem Namen filtern",
|
||||||
"LIST": "Organisationen",
|
"LIST": "Organisationen",
|
||||||
"LISTDESCRIPTION": "Wähle eine Organisation aus.",
|
"LISTDESCRIPTION": "Wähle eine Organisation aus.",
|
||||||
"ACTIVE": "Aktiv",
|
"ACTIVE": "Aktiv",
|
||||||
@ -1266,7 +1266,7 @@
|
|||||||
"DOMAINS": {
|
"DOMAINS": {
|
||||||
"NEW": "Domain hinzufügen",
|
"NEW": "Domain hinzufügen",
|
||||||
"TITLE": "Verifizierte Domains",
|
"TITLE": "Verifizierte Domains",
|
||||||
"DESCRIPTION": "Konfiguriere die Domains, die für Domain discovery und als Suffix für die Benutzer verwendet werden können.",
|
"DESCRIPTION": "Konfiguriere die Domains, die für Domain Discovery und als Suffix für die Benutzer verwendet werden können.",
|
||||||
"SETPRIMARY": "Primäre Domain setzen",
|
"SETPRIMARY": "Primäre Domain setzen",
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Domain löschen?",
|
"TITLE": "Domain löschen?",
|
||||||
@ -1274,7 +1274,7 @@
|
|||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Domain hinzufügen",
|
"TITLE": "Domain hinzufügen",
|
||||||
"DESCRIPTION": "Du bist im Begriff, Deiner Organisation eine Domain hinzuzufügen. Die Domain kann für Domain discovery genutzt werden und als Suffix für deine Benutzernamen."
|
"DESCRIPTION": "Du bist im Begriff, Deiner Organisation eine Domain hinzuzufügen. Die Domain kann für Domain Discovery genutzt werden und als Suffix für deine Benutzernamen."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"STATE": {
|
"STATE": {
|
||||||
@ -1303,15 +1303,15 @@
|
|||||||
"DIALOG": {
|
"DIALOG": {
|
||||||
"DEACTIVATE": {
|
"DEACTIVATE": {
|
||||||
"TITLE": "Organisation deaktivieren",
|
"TITLE": "Organisation deaktivieren",
|
||||||
"DESCRIPTION": "Sie sind im Begriff Ihre Organisation zu deaktivieren. User können Sich danach nicht mehr anmelden? Wollen Sie fortfahren?"
|
"DESCRIPTION": "Sie sind im Begriff, Ihre Organisation zu deaktivieren. Benutzer können Sich danach nicht mehr anmelden? Wollen Sie fortfahren?"
|
||||||
},
|
},
|
||||||
"REACTIVATE": {
|
"REACTIVATE": {
|
||||||
"TITLE": "Organisation reaktivieren",
|
"TITLE": "Organisation reaktivieren",
|
||||||
"DESCRIPTION": "Sie sind im Begriff Ihre Organisation zu reaktivieren. User können Sich danach wieder anmelden? Wollen Sie fortfahren?"
|
"DESCRIPTION": "Sie sind im Begriff, Ihre Organisation zu reaktivieren. Benutzer können Sich danach wieder anmelden? Wollen Sie fortfahren?"
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Organisation löschen",
|
"TITLE": "Organisation löschen",
|
||||||
"DESCRIPTION": "Sie sind im Begriff Ihre Organisation endgültig zu löschen. Damit wird ein Prozess eingeleitet, bei dem alle organisationsbezogenen Daten gelöscht werden. Diese Aktion kann vorerst nicht rückgängig gemacht werden!",
|
"DESCRIPTION": "Sie sind im Begriff, Ihre Organisation endgültig zu löschen. Damit wird ein Prozess eingeleitet, bei dem alle organisationsbezogenen Daten gelöscht werden. Diese Aktion kann vorerst nicht rückgängig gemacht werden!",
|
||||||
"TYPENAME": "Wiederholen Sie '{{value}}', um den Benutzer zu löschen.",
|
"TYPENAME": "Wiederholen Sie '{{value}}', um den Benutzer zu löschen.",
|
||||||
"ORGNAME": "Loginname",
|
"ORGNAME": "Loginname",
|
||||||
"BTN": "Endgültig löschen"
|
"BTN": "Endgültig löschen"
|
||||||
@ -1385,10 +1385,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"SMTP": {
|
"SMTP": {
|
||||||
"TITLE": "SMTP Einstellungen",
|
"TITLE": "SMTP-Einstellungen",
|
||||||
"DESCRIPTION": "Beschreibung",
|
"DESCRIPTION": "Beschreibung",
|
||||||
"SENDERADDRESS": "Sender Email-Adresse",
|
"SENDERADDRESS": "Absender Email-Adresse",
|
||||||
"SENDERNAME": "Sender Name",
|
"SENDERNAME": "Name des Absenders",
|
||||||
"REPLYTOADDRESS": "Reply-to-Adresse",
|
"REPLYTOADDRESS": "Reply-to-Adresse",
|
||||||
"HOSTANDPORT": "Host und Port",
|
"HOSTANDPORT": "Host und Port",
|
||||||
"USER": "Benutzer",
|
"USER": "Benutzer",
|
||||||
@ -1398,7 +1398,7 @@
|
|||||||
"TLS": "Transport Layer Security (TLS)",
|
"TLS": "Transport Layer Security (TLS)",
|
||||||
"SAVED": "Erfolgreich gespeichert.",
|
"SAVED": "Erfolgreich gespeichert.",
|
||||||
"NOCHANGES": "Keine Änderungen!",
|
"NOCHANGES": "Keine Änderungen!",
|
||||||
"REQUIREDWARN": "Damit Mails von Ihrer Domain verschickt werden können, müssen Sie Ihre SMTP Einstellungen konfigurieren."
|
"REQUIREDWARN": "Damit Mails von Ihrer Domain verschickt werden können, müssen Sie Ihre SMTP-Einstellungen konfigurieren."
|
||||||
},
|
},
|
||||||
"SMS": {
|
"SMS": {
|
||||||
"PROVIDERS": "Anbieter",
|
"PROVIDERS": "Anbieter",
|
||||||
@ -1415,7 +1415,7 @@
|
|||||||
"ACTIVATED": "Anbieter aktiviert.",
|
"ACTIVATED": "Anbieter aktiviert.",
|
||||||
"DEACTIVATED": "Anbieter deaktiviert.",
|
"DEACTIVATED": "Anbieter deaktiviert.",
|
||||||
"TWILIO": {
|
"TWILIO": {
|
||||||
"SID": "Sid",
|
"SID": "SID",
|
||||||
"TOKEN": "Token",
|
"TOKEN": "Token",
|
||||||
"SENDERNUMBER": "Sender Number",
|
"SENDERNUMBER": "Sender Number",
|
||||||
"ADDED": "Twilio erfolgreich hinzugefügt.",
|
"ADDED": "Twilio erfolgreich hinzugefügt.",
|
||||||
@ -1431,7 +1431,7 @@
|
|||||||
"TYPE": {
|
"TYPE": {
|
||||||
"1": "Email Initialisierungscode",
|
"1": "Email Initialisierungscode",
|
||||||
"2": "Email Verifikationscode",
|
"2": "Email Verifikationscode",
|
||||||
"3": "Telefonnummer Verificationscode",
|
"3": "Telefonnummer Verifikationscode",
|
||||||
"4": "Passwort Zurücksetzen Code",
|
"4": "Passwort Zurücksetzen Code",
|
||||||
"5": "Passwordless Initialisierungscode",
|
"5": "Passwordless Initialisierungscode",
|
||||||
"6": "Applicationssecret",
|
"6": "Applicationssecret",
|
||||||
@ -1448,7 +1448,7 @@
|
|||||||
},
|
},
|
||||||
"SECURITY": {
|
"SECURITY": {
|
||||||
"IFRAMETITLE": "iFrame",
|
"IFRAMETITLE": "iFrame",
|
||||||
"IFRAMEDESCRIPTION": "Mit dieser Einstellung wird die CSP so eingestellt, dass Framing von einer Reihe zulässiger Domänen zugelassen wird. Beachten Sie, dass Sie durch die Aktivierung der Verwendung von iFrames das Risiko eingehen, Clickjacking zu ermöglichen.",
|
"IFRAMEDESCRIPTION": "Mit dieser Einstellung wird die Content-Security-Policy (CSP) so eingestellt, dass Framing von einer Reihe zulässiger Domänen zugelassen wird. Beachten Sie, dass Sie durch die Aktivierung der Verwendung von iFrames das Risiko eingehen, Clickjacking zu ermöglichen.",
|
||||||
"IFRAMEENABLED": "iFrame zulassen",
|
"IFRAMEENABLED": "iFrame zulassen",
|
||||||
"ALLOWEDORIGINS": "Zulässige URLs",
|
"ALLOWEDORIGINS": "Zulässige URLs",
|
||||||
"IMPERSONATIONTITLE": "Identitätswechsel",
|
"IMPERSONATIONTITLE": "Identitätswechsel",
|
||||||
@ -1522,10 +1522,10 @@
|
|||||||
"RELEASEFONT": "Jetzt loslassen",
|
"RELEASEFONT": "Jetzt loslassen",
|
||||||
"USEOFLOGO": "Ihr Logo wird im Login sowie emails verwendet, während das Icon für kleinere UI-Elemente wie den Organisationswechsel in der Konsole verwendet wird",
|
"USEOFLOGO": "Ihr Logo wird im Login sowie emails verwendet, während das Icon für kleinere UI-Elemente wie den Organisationswechsel in der Konsole verwendet wird",
|
||||||
"MAXSIZE": "Die maximale Grösse von Uploads ist mit 524kB begrenzt",
|
"MAXSIZE": "Die maximale Grösse von Uploads ist mit 524kB begrenzt",
|
||||||
"EMAILNOSVG": "Das SVG Dateiformat wird nicht in emails unterstützt. Laden Sie deshalb ihr Logo im PNG oder einem anderen unterstützten Format hoch.",
|
"EMAILNOSVG": "Das SVG Dateiformat wird nicht in E-Mails unterstützt. Laden Sie deshalb ihr Logo im PNG oder einem anderen unterstützten Format hoch.",
|
||||||
"MAXSIZEEXCEEDED": "Maximale Grösse von 524kB überschritten",
|
"MAXSIZEEXCEEDED": "Maximale Grösse von 524kB überschritten",
|
||||||
"NOSVGSUPPORTED": "SVG werden nicht unterstützt!",
|
"NOSVGSUPPORTED": "SVGs werden nicht unterstützt!",
|
||||||
"FONTINLOGINONLY": "Die Schriftart wird momentan nur im Login interface angezeigt.",
|
"FONTINLOGINONLY": "Die Schriftart wird momentan nur im Login Interface angezeigt.",
|
||||||
"BACKGROUNDCOLOR": "Hintergrundfarbe",
|
"BACKGROUNDCOLOR": "Hintergrundfarbe",
|
||||||
"PRIMARYCOLOR": "Primärfarbe",
|
"PRIMARYCOLOR": "Primärfarbe",
|
||||||
"WARNCOLOR": "Warnfarbe",
|
"WARNCOLOR": "Warnfarbe",
|
||||||
@ -1538,8 +1538,8 @@
|
|||||||
"TITLE": "Anmeldung",
|
"TITLE": "Anmeldung",
|
||||||
"SECOND": "mit ZITADEL-Konto anmelden.",
|
"SECOND": "mit ZITADEL-Konto anmelden.",
|
||||||
"ERROR": "Benutzer konnte nicht gefunden werden!",
|
"ERROR": "Benutzer konnte nicht gefunden werden!",
|
||||||
"PRIMARYBUTTON": "weiter",
|
"PRIMARYBUTTON": "Weiter",
|
||||||
"SECONDARYBUTTON": "registrieren"
|
"SECONDARYBUTTON": "Registrieren"
|
||||||
},
|
},
|
||||||
"THEMEMODE": {
|
"THEMEMODE": {
|
||||||
"THEME_MODE_AUTO": "Automatischer Modus",
|
"THEME_MODE_AUTO": "Automatischer Modus",
|
||||||
@ -1579,7 +1579,7 @@
|
|||||||
"DOCSLINK": "Link zu Dokumenten (Console)",
|
"DOCSLINK": "Link zu Dokumenten (Console)",
|
||||||
"CUSTOMLINK": "Benutzerdefinierter Link (Console)",
|
"CUSTOMLINK": "Benutzerdefinierter Link (Console)",
|
||||||
"CUSTOMLINKTEXT": "Benutzerdefinierter Linktext (Console)",
|
"CUSTOMLINKTEXT": "Benutzerdefinierter Linktext (Console)",
|
||||||
"SAVED": "Saved successfully!",
|
"SAVED": "Gespeichert!",
|
||||||
"RESET_TITLE": "Standardwerte wiederherstellen",
|
"RESET_TITLE": "Standardwerte wiederherstellen",
|
||||||
"RESET_DESCRIPTION": "Sie sind im Begriff die Standardlinks für die AGBs und Datenschutzrichtlinie wiederherzustellen. Wollen Sie fortfahren?"
|
"RESET_DESCRIPTION": "Sie sind im Begriff die Standardlinks für die AGBs und Datenschutzrichtlinie wiederherzustellen. Wollen Sie fortfahren?"
|
||||||
},
|
},
|
||||||
@ -1706,14 +1706,14 @@
|
|||||||
"EXPIREWARNDAYS": "Ablauf Warnung nach Tagen",
|
"EXPIREWARNDAYS": "Ablauf Warnung nach Tagen",
|
||||||
"MAXAGEDAYS": "Maximale Gültigkeit in Tagen",
|
"MAXAGEDAYS": "Maximale Gültigkeit in Tagen",
|
||||||
"USERLOGINMUSTBEDOMAIN": "Organisationsdomain dem Loginname hinzufügen",
|
"USERLOGINMUSTBEDOMAIN": "Organisationsdomain dem Loginname hinzufügen",
|
||||||
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "If you enable this setting, all loginnames will be suffixed with the organization domain. If this settings is disabled, you have to ensure that usernames are unique over all organizations.",
|
"USERLOGINMUSTBEDOMAIN_DESCRIPTION": "Wenn Sie diese Einstellung aktivieren, werden alle Loginnamen mit dem Suffix der Organisationsdomäne versehen. Wenn diese Einstellung deaktiviert ist, müssen Sie sicherstellen, dass die Benutzernamen für alle Organisationen eindeutig sind.",
|
||||||
"VALIDATEORGDOMAINS": "Verifizierung des Organisations Domain erforderlich (DNS- oder HTTP-Herausforderung)",
|
"VALIDATEORGDOMAINS": "Verifizierung des Organisations Domain erforderlich (DNS- oder HTTP-Herausforderung)",
|
||||||
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP Sender Adresse entspricht Instanzdomain",
|
"SMTPSENDERADDRESSMATCHESINSTANCEDOMAIN": "SMTP Sender Adresse entspricht Instanzdomain",
|
||||||
"ALLOWUSERNAMEPASSWORD_DESC": "Der konventionelle Login mit Benutzername und Passwort wird erlaubt.",
|
"ALLOWUSERNAMEPASSWORD_DESC": "Der konventionelle Login mit Benutzername und Passwort wird erlaubt.",
|
||||||
"ALLOWEXTERNALIDP_DESC": "Der Login wird für die darunter liegenden Identitätsanbieter erlaubt.",
|
"ALLOWEXTERNALIDP_DESC": "Der Login wird für die darunter liegenden Identitätsanbieter erlaubt.",
|
||||||
"ALLOWREGISTER_DESC": "Ist die Option gewählt, erscheint im Login ein zusätzlicher Schritt zum Registrieren eines Benutzers.",
|
"ALLOWREGISTER_DESC": "Ist die Option gewählt, erscheint im Login ein zusätzlicher Schritt zum Registrieren eines Benutzers.",
|
||||||
"FORCEMFA": "MFA erzwingen",
|
"FORCEMFA": "MFA erzwingen",
|
||||||
"FORCEMFALOCALONLY": "MFA für lokale Users erzwingen",
|
"FORCEMFALOCALONLY": "MFA für lokale Benutzer erzwingen",
|
||||||
"FORCEMFALOCALONLY_DESC": "Ist die Option gewählt, müssen lokal authentifizierte Benutzer einen zweiten Faktor für den Login verwenden.",
|
"FORCEMFALOCALONLY_DESC": "Ist die Option gewählt, müssen lokal authentifizierte Benutzer einen zweiten Faktor für den Login verwenden.",
|
||||||
"HIDEPASSWORDRESET_DESC": "Ist die Option gewählt, ist es nicht möglich im Login das Passwort zurück zusetzen via Passwort vergessen Link.",
|
"HIDEPASSWORDRESET_DESC": "Ist die Option gewählt, ist es nicht möglich im Login das Passwort zurück zusetzen via Passwort vergessen Link.",
|
||||||
"HIDELOGINNAMESUFFIX": "Loginname Suffix ausblenden",
|
"HIDELOGINNAMESUFFIX": "Loginname Suffix ausblenden",
|
||||||
@ -2020,7 +2020,7 @@
|
|||||||
},
|
},
|
||||||
"GITLAB": {
|
"GITLAB": {
|
||||||
"TITLE": "Gitlab Provider",
|
"TITLE": "Gitlab Provider",
|
||||||
"DESCRIPTION": "Geben Sie die erforderlichen Daten für Ihren Gitlab Self Hosted Identitätsprovider ein."
|
"DESCRIPTION": "Geben Sie die erforderlichen Daten für Ihren Gitlab Identitätsprovider ein."
|
||||||
},
|
},
|
||||||
"GITLABSELFHOSTED": {
|
"GITLABSELFHOSTED": {
|
||||||
"TITLE": "Gitlab Self hosted Provider",
|
"TITLE": "Gitlab Self hosted Provider",
|
||||||
@ -2051,13 +2051,13 @@
|
|||||||
},
|
},
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"ISAUTOCREATION": "Automatisches Erstellen",
|
"ISAUTOCREATION": "Automatisches Erstellen",
|
||||||
"ISAUTOCREATION_DESC": "Legt fest ob ein Konto erstellt wird, falls es noch nicht existiert.",
|
"ISAUTOCREATION_DESC": "Legt fest, ob ein Konto erstellt wird, falls es noch nicht existiert.",
|
||||||
"ISAUTOUPDATE": "Automatisches Update",
|
"ISAUTOUPDATE": "Automatisches Update",
|
||||||
"ISAUTOUPDATE_DESC": "Legt fest ob Konten bei der erneuten Authentifizierung aktualisiert werden.",
|
"ISAUTOUPDATE_DESC": "Legt fest, ob Konten bei der erneuten Authentifizierung aktualisiert werden.",
|
||||||
"ISCREATIONALLOWED": "Account erstellen erlaubt",
|
"ISCREATIONALLOWED": "Kontoerstellung erlaubt (manuell)",
|
||||||
"ISCREATIONALLOWED_DESC": "Legt fest, ob Konten erstellt werden können.",
|
"ISCREATIONALLOWED_DESC": "Bestimmt, ob Konten mit einem externen Konto erstellt werden können. Deaktiviere, wenn Benutzer Kontoinformationen nicht bearbeiten können sollen, wenn die automatische Erstellung aktiviert ist.",
|
||||||
"ISLINKINGALLOWED": "Account linking erlaubt",
|
"ISLINKINGALLOWED": "Kontoverknüpfung erlaubt (manuell)",
|
||||||
"ISLINKINGALLOWED_DESC": "Legt fest, ob eine Identität mit einem bestehenden Konto verknüpft werden kann.",
|
"ISLINKINGALLOWED_DESC": "Bestimmt, ob eine Identität manuell mit einem bestehenden Konto verknüpft werden kann. Deaktiviere, wenn Benutzer nur das vorgeschlagene Konto im Falle einer aktiven automatischen Verknüpfung verknüpfen dürfen.",
|
||||||
"AUTOLINKING_DESC": "Legt fest, ob eine Identität aufgefordert wird, mit einem vorhandenen Konto verknüpft zu werden.",
|
"AUTOLINKING_DESC": "Legt fest, ob eine Identität aufgefordert wird, mit einem vorhandenen Konto verknüpft zu werden.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Deaktiviert",
|
"0": "Deaktiviert",
|
||||||
@ -2170,12 +2170,12 @@
|
|||||||
},
|
},
|
||||||
"TOAST": {
|
"TOAST": {
|
||||||
"SAVED": "Erfolgreich gespeichert.",
|
"SAVED": "Erfolgreich gespeichert.",
|
||||||
"REACTIVATED": "Idp reaktiviert.",
|
"REACTIVATED": "IDP reaktiviert.",
|
||||||
"DEACTIVATED": "Idp deaktiviert.",
|
"DEACTIVATED": "IDP deaktiviert.",
|
||||||
"SELECTEDREACTIVATED": "Selektierte Idps reaktiviert.",
|
"SELECTEDREACTIVATED": "Selektierte IDPs reaktiviert.",
|
||||||
"SELECTEDDEACTIVATED": "Selektierte Idps deaktiviert.",
|
"SELECTEDDEACTIVATED": "Selektierte IDPs deaktiviert.",
|
||||||
"SELECTEDKEYSDELETED": "Selektierte Idps gelöscht.",
|
"SELECTEDKEYSDELETED": "Selektierte IDPs gelöscht.",
|
||||||
"DELETED": "Idp erfolgreich gelöscht!",
|
"DELETED": "IDP erfolgreich gelöscht!",
|
||||||
"ADDED": "Erfolgreich hinzugefügt.",
|
"ADDED": "Erfolgreich hinzugefügt.",
|
||||||
"REMOVED": "Erfolgreich entfernt."
|
"REMOVED": "Erfolgreich entfernt."
|
||||||
},
|
},
|
||||||
@ -2200,7 +2200,7 @@
|
|||||||
"TOAST": {
|
"TOAST": {
|
||||||
"ADDED": "Erfolgreich hinzugefügt.",
|
"ADDED": "Erfolgreich hinzugefügt.",
|
||||||
"SAVED": "Erfolgreich gespeichert.",
|
"SAVED": "Erfolgreich gespeichert.",
|
||||||
"DELETED": "Mfa erfolgreich gelöscht!"
|
"DELETED": "MFA erfolgreich gelöscht!"
|
||||||
},
|
},
|
||||||
"TYPE": "Typ",
|
"TYPE": "Typ",
|
||||||
"MULTIFACTORTYPES": {
|
"MULTIFACTORTYPES": {
|
||||||
@ -2235,12 +2235,12 @@
|
|||||||
"SMTP": {
|
"SMTP": {
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"TITLE": "SMTP-Anbieter",
|
"TITLE": "SMTP-Anbieter",
|
||||||
"DESCRIPTION": "Dies sind die SMTP-Anbieter für Ihre ZITADEL-Instanz. Aktivieren Sie diejenige, die Sie zum Senden von Benachrichtigungen an Ihre Benutzer verwenden möchten.",
|
"DESCRIPTION": "Dies sind die SMTP-Anbieter für diese ZITADEL-Instanz. Aktiviere diejenige, die du zum Senden von Benachrichtigungen an deine Benutzer verwenden möchtest.",
|
||||||
"EMPTY": "Kein SMTP-Anbieter verfügbar",
|
"EMPTY": "Kein SMTP-Anbieter verfügbar",
|
||||||
"ACTIVATED": "Aktiviert",
|
"ACTIVATED": "Aktiviert",
|
||||||
"ACTIVATE": "Anbieter aktivieren",
|
"ACTIVATE": "Anbieter aktivieren",
|
||||||
"DEACTIVATE": "Anbieter deaktivieren",
|
"DEACTIVATE": "Anbieter deaktivieren",
|
||||||
"TEST": "Testen Sie Ihren Anbieter",
|
"TEST": "Teste den Anbieter",
|
||||||
"TYPE": "Typ",
|
"TYPE": "Typ",
|
||||||
"DIALOG": {
|
"DIALOG": {
|
||||||
"ACTIVATED": "Die SMTP-Konfiguration wurde aktiviert",
|
"ACTIVATED": "Die SMTP-Konfiguration wurde aktiviert",
|
||||||
@ -2301,7 +2301,7 @@
|
|||||||
"DESCRIPTION": "Hier kannst Du Deine Applikationen bearbeiten und deren Konfiguration anpassen.",
|
"DESCRIPTION": "Hier kannst Du Deine Applikationen bearbeiten und deren Konfiguration anpassen.",
|
||||||
"CREATE": "Applikation erstellen",
|
"CREATE": "Applikation erstellen",
|
||||||
"CREATE_SELECT_PROJECT": "Wähle zuerst dein Projekt aus",
|
"CREATE_SELECT_PROJECT": "Wähle zuerst dein Projekt aus",
|
||||||
"CREATE_NEW_PROJECT": "oder erstelle ein neues <a href='{{url}}' title='Create project'>hier</a>.",
|
"CREATE_NEW_PROJECT": "oder erstelle ein neues <a href='{{url}}' title='Projekt erstellen'>hier</a>.",
|
||||||
"CREATE_DESC_TITLE": "Gebe die Daten der Anwendung Schritt für Schritt ein.",
|
"CREATE_DESC_TITLE": "Gebe die Daten der Anwendung Schritt für Schritt ein.",
|
||||||
"CREATE_DESC_SUB": "Es wird automatisch eine empfohlene Konfiguration generiert.",
|
"CREATE_DESC_SUB": "Es wird automatisch eine empfohlene Konfiguration generiert.",
|
||||||
"STATE": "Status",
|
"STATE": "Status",
|
||||||
@ -2311,7 +2311,7 @@
|
|||||||
"DELETE": "App löschen",
|
"DELETE": "App löschen",
|
||||||
"JUMPTOPROJECT": "Um Rollen, Berechtigungen und mehr zu konfigurieren, navigieren Sie zum Projekt.",
|
"JUMPTOPROJECT": "Um Rollen, Berechtigungen und mehr zu konfigurieren, navigieren Sie zum Projekt.",
|
||||||
"DETAIL": {
|
"DETAIL": {
|
||||||
"TITLE": "Detail",
|
"TITLE": "Details",
|
||||||
"STATE": {
|
"STATE": {
|
||||||
"0": "Nicht definiert",
|
"0": "Nicht definiert",
|
||||||
"1": "Aktiv",
|
"1": "Aktiv",
|
||||||
@ -2320,7 +2320,7 @@
|
|||||||
},
|
},
|
||||||
"DIALOG": {
|
"DIALOG": {
|
||||||
"CONFIG": {
|
"CONFIG": {
|
||||||
"TITLE": "OIDC configuration ändern"
|
"TITLE": "OIDC Konfiguration ändern"
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "App löschen",
|
"TITLE": "App löschen",
|
||||||
@ -2345,8 +2345,8 @@
|
|||||||
},
|
},
|
||||||
"NAMEDIALOG": {
|
"NAMEDIALOG": {
|
||||||
"TITLE": "App umbenennen",
|
"TITLE": "App umbenennen",
|
||||||
"DESCRIPTION": "Geben Sie den neuen Namen für Ihre App an!",
|
"DESCRIPTION": "Geben Sie den neuen Namen für Ihre App ein",
|
||||||
"NAME": "Appname"
|
"NAME": "App-Name"
|
||||||
},
|
},
|
||||||
"NAME": "Name",
|
"NAME": "Name",
|
||||||
"TYPE": "Anwendungstyp",
|
"TYPE": "Anwendungstyp",
|
||||||
@ -2362,7 +2362,7 @@
|
|||||||
"TITLEFIRST": "Name der Applikation.",
|
"TITLEFIRST": "Name der Applikation.",
|
||||||
"TYPETITLE": "Art der Anwendung",
|
"TYPETITLE": "Art der Anwendung",
|
||||||
"OIDC": {
|
"OIDC": {
|
||||||
"WELLKNOWN": "Weitere Links können vom <a href='{{url}}' title='Discovery endpoint' target='_blank'>Discovery endpoint</a> abgerufen werden.",
|
"WELLKNOWN": "Weitere Links können vom <a href='{{url}}' title='Discovery Endpoint' target='_blank'>Discovery Endpoint</a> abgerufen werden.",
|
||||||
"INFO": {
|
"INFO": {
|
||||||
"ISSUER": "Issuer",
|
"ISSUER": "Issuer",
|
||||||
"CLIENTID": "Client Id"
|
"CLIENTID": "Client Id"
|
||||||
@ -2394,7 +2394,7 @@
|
|||||||
"POSTLOGOUTREDIRECT": "URIs für Post-Log-out",
|
"POSTLOGOUTREDIRECT": "URIs für Post-Log-out",
|
||||||
"RESPONSESECTION": "Antworttypen",
|
"RESPONSESECTION": "Antworttypen",
|
||||||
"GRANTSECTION": "Berechtigungstypen",
|
"GRANTSECTION": "Berechtigungstypen",
|
||||||
"GRANTTITLE": "Wähle Deine Berechtigungstypen aus. Hinweis: \"Implizit\" ist nur für browser-basierte Anwendungen verfügbar.",
|
"GRANTTITLE": "Wähle Deine Berechtigungstypen aus. Hinweis: \"Implizit\" ist nur für Browser-basierte Anwendungen verfügbar.",
|
||||||
"APPTYPE": {
|
"APPTYPE": {
|
||||||
"0": "Web",
|
"0": "Web",
|
||||||
"1": "User Agent",
|
"1": "User Agent",
|
||||||
@ -2424,7 +2424,7 @@
|
|||||||
"TOKENTYPE": "Auth Token Typ",
|
"TOKENTYPE": "Auth Token Typ",
|
||||||
"TOKENTYPE0": "Bearer Token",
|
"TOKENTYPE0": "Bearer Token",
|
||||||
"TOKENTYPE1": "JWT",
|
"TOKENTYPE1": "JWT",
|
||||||
"UNSECUREREDIRECT": "Wir hoffen, Du weisst, was Du tust.",
|
"UNSECUREREDIRECT": "Wir hoffen, Du weißt, was Du tust.",
|
||||||
"OVERVIEWSECTION": "Übersicht",
|
"OVERVIEWSECTION": "Übersicht",
|
||||||
"OVERVIEWTITLE": "Deine Konfiguration ist bereit. Du kannst sie hier nochmals prüfen.",
|
"OVERVIEWTITLE": "Deine Konfiguration ist bereit. Du kannst sie hier nochmals prüfen.",
|
||||||
"ACCESSTOKENROLEASSERTION": "Benutzerrollen dem Access Token hinzufügen",
|
"ACCESSTOKENROLEASSERTION": "Benutzerrollen dem Access Token hinzufügen",
|
||||||
@ -2440,7 +2440,7 @@
|
|||||||
"APPTYPE": {
|
"APPTYPE": {
|
||||||
"WEB": {
|
"WEB": {
|
||||||
"TITLE": "Web",
|
"TITLE": "Web",
|
||||||
"DESCRIPTION": "Standard Web applications wie .net, PHP, Node.js, Java, etc."
|
"DESCRIPTION": "Standard Web applications wie .NET, PHP, Node.js, Java, etc."
|
||||||
},
|
},
|
||||||
"NATIVE": {
|
"NATIVE": {
|
||||||
"TITLE": "Native",
|
"TITLE": "Native",
|
||||||
@ -2448,14 +2448,14 @@
|
|||||||
},
|
},
|
||||||
"USERAGENT": {
|
"USERAGENT": {
|
||||||
"TITLE": "User Agent",
|
"TITLE": "User Agent",
|
||||||
"DESCRIPTION": "Single Page Applications (SPA) und grundsätzlich alle im Browser aufgeführten JS Frameworks"
|
"DESCRIPTION": "Single Page Applications (SPA) und grundsätzlich alle im Browser aufgeführten JS-Frameworks"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"INFO": {
|
"INFO": {
|
||||||
"CLIENTID": "Client Id"
|
"CLIENTID": "Client ID"
|
||||||
},
|
},
|
||||||
"REGENERATESECRET": "Client Secret neu generieren",
|
"REGENERATESECRET": "Client Secret neu generieren",
|
||||||
"SELECTION": {
|
"SELECTION": {
|
||||||
@ -2479,12 +2479,12 @@
|
|||||||
"METADATAOPT3": "Option 3: Erstellen Sie spontan eine minimale Metadatendatei mit ENTITYID und ACS-URL",
|
"METADATAOPT3": "Option 3: Erstellen Sie spontan eine minimale Metadatendatei mit ENTITYID und ACS-URL",
|
||||||
"UPLOAD": "XML-Datei hochladen",
|
"UPLOAD": "XML-Datei hochladen",
|
||||||
"METADATA": "Metadaten",
|
"METADATA": "Metadaten",
|
||||||
"METADATAFROMFILE": "Metadata aus Datei",
|
"METADATAFROMFILE": "Metadaten aus Datei",
|
||||||
"CERTIFICATE": "SAML-Zertifikat",
|
"CERTIFICATE": "SAML-Zertifikat",
|
||||||
"DOWNLOADCERT": "Laden Sie das SAML-Zertifikat herunter",
|
"DOWNLOADCERT": "SAML-Zertifikat herunterladen",
|
||||||
"CREATEMETADATA": "Create metadata",
|
"CREATEMETADATA": "Metadaten erstellen",
|
||||||
"ENTITYID": "Entity ID",
|
"ENTITYID": "Entity ID",
|
||||||
"ACSURL": "ACS endpoint URL"
|
"ACSURL": "ACS Endpoint URL"
|
||||||
},
|
},
|
||||||
"AUTHMETHODS": {
|
"AUTHMETHODS": {
|
||||||
"CODE": {
|
"CODE": {
|
||||||
@ -2509,7 +2509,7 @@
|
|||||||
},
|
},
|
||||||
"IMPLICIT": {
|
"IMPLICIT": {
|
||||||
"TITLE": "Implicit",
|
"TITLE": "Implicit",
|
||||||
"DESCRIPTION": "Erhalte die Token direkt vom authorize Endpoint"
|
"DESCRIPTION": "Erhalte die Token direkt vom Authorize-Endpoint"
|
||||||
},
|
},
|
||||||
"DEVICECODE": {
|
"DEVICECODE": {
|
||||||
"TITLE": "Device Code",
|
"TITLE": "Device Code",
|
||||||
@ -2536,7 +2536,7 @@
|
|||||||
"0": "Unbekannt",
|
"0": "Unbekannt",
|
||||||
"1": "Weiblich",
|
"1": "Weiblich",
|
||||||
"2": "Männlich",
|
"2": "Männlich",
|
||||||
"3": "Anderes"
|
"3": "Divers"
|
||||||
},
|
},
|
||||||
"LANGUAGES": {
|
"LANGUAGES": {
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
@ -2565,7 +2565,7 @@
|
|||||||
"1": "Berechtigtes Projekt",
|
"1": "Berechtigtes Projekt",
|
||||||
"4": "Projekt"
|
"4": "Projekt"
|
||||||
},
|
},
|
||||||
"EDITROLE": "Rollen editieren",
|
"EDITROLE": "Rollen bearbeiten",
|
||||||
"EDITFOR": "Bearbeiten Sie die Rollen für den Benutzer: {{value}}",
|
"EDITFOR": "Bearbeiten Sie die Rollen für den Benutzer: {{value}}",
|
||||||
"DIALOG": {
|
"DIALOG": {
|
||||||
"DELETE_TITLE": "Manager entfernen",
|
"DELETE_TITLE": "Manager entfernen",
|
||||||
|
@ -2066,10 +2066,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "If selected, an account will be created if it does not exist yet.",
|
"ISAUTOCREATION_DESC": "If selected, an account will be created if it does not exist yet.",
|
||||||
"ISAUTOUPDATE": "Automatic update",
|
"ISAUTOUPDATE": "Automatic update",
|
||||||
"ISAUTOUPDATE_DESC": "If selected, accounts are updated on reauthentication.",
|
"ISAUTOUPDATE_DESC": "If selected, accounts are updated on reauthentication.",
|
||||||
"ISCREATIONALLOWED": "Account creation allowed",
|
"ISCREATIONALLOWED": "Account creation allowed (manually)",
|
||||||
"ISCREATIONALLOWED_DESC": "Determines whether accounts can be created.",
|
"ISCREATIONALLOWED_DESC": "Determines whether accounts can be created using an external account. Disable if users should not be able to edit account information when auto_creation is enabled.",
|
||||||
"ISLINKINGALLOWED": "Account linking allowed",
|
"ISLINKINGALLOWED": "Account linking allowed (manually)",
|
||||||
"ISLINKINGALLOWED_DESC": "Determines whether an identity can be linked to an existing account.",
|
"ISLINKINGALLOWED_DESC": "Determines whether an identity can be manually linked to an existing account. Disable if users should only be allowed to link the proposed account in case of active auto_linking.",
|
||||||
"AUTOLINKING_DESC": "Determines whether an identity will be prompted to be linked to an existing account.",
|
"AUTOLINKING_DESC": "Determines whether an identity will be prompted to be linked to an existing account.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Disabled",
|
"0": "Disabled",
|
||||||
|
@ -2059,10 +2059,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Si se selecciona, una cuenta se creará si aún no existiera.",
|
"ISAUTOCREATION_DESC": "Si se selecciona, una cuenta se creará si aún no existiera.",
|
||||||
"ISAUTOUPDATE": "Actualización automática",
|
"ISAUTOUPDATE": "Actualización automática",
|
||||||
"ISAUTOUPDATE_DESC": "Si se selecciona, las cuentas se actualizarán en la reautenticación.",
|
"ISAUTOUPDATE_DESC": "Si se selecciona, las cuentas se actualizarán en la reautenticación.",
|
||||||
"ISCREATIONALLOWED": "Creación de cuentas permitida",
|
"ISCREATIONALLOWED": "Creación de cuenta permitida (manualmente)",
|
||||||
"ISCREATIONALLOWED_DESC": "Determina si se pueden crear cuentas.",
|
"ISCREATIONALLOWED_DESC": "Determina si las cuentas se pueden crear usando una cuenta externa. Deshabilita si los usuarios no deberían poder editar la información de la cuenta cuando la creación automática está habilitada.",
|
||||||
"ISLINKINGALLOWED": "Permitida la vinculación de cuentas",
|
"ISLINKINGALLOWED": "Enlace de cuenta permitido (manualmente)",
|
||||||
"ISLINKINGALLOWED_DESC": "Determina si una identidad puede vincularse a una cuenta existente.",
|
"ISLINKINGALLOWED_DESC": "Determina si una identidad se puede vincular manualmente a una cuenta existente. Deshabilita si los usuarios solo deberían poder vincular la cuenta propuesta en caso de vinculación automática activa.",
|
||||||
"AUTOLINKING_DESC": "Determina si se pedirá a una identidad que se vincule a una cuenta existente.",
|
"AUTOLINKING_DESC": "Determina si se pedirá a una identidad que se vincule a una cuenta existente.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Desactivado",
|
"0": "Desactivado",
|
||||||
|
@ -2058,10 +2058,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Détermine si un compte sera créé s'il n'existe pas déjà.",
|
"ISAUTOCREATION_DESC": "Détermine si un compte sera créé s'il n'existe pas déjà.",
|
||||||
"ISAUTOUPDATE": "Mise à jour automatique",
|
"ISAUTOUPDATE": "Mise à jour automatique",
|
||||||
"ISAUTOUPDATE_DESC": "Si cette option est sélectionnée, les comptes sont mis à jour lors de la réauthentification.",
|
"ISAUTOUPDATE_DESC": "Si cette option est sélectionnée, les comptes sont mis à jour lors de la réauthentification.",
|
||||||
"ISCREATIONALLOWED": "Création de comptes autorisée",
|
"ISCREATIONALLOWED": "Création de compte autorisée (manuellement)",
|
||||||
"ISCREATIONALLOWED_DESC": "Détermine si des comptes peuvent être créés.",
|
"ISCREATIONALLOWED_DESC": "Détermine si les comptes peuvent être créés à l'aide d'un compte externe. Désactivez si les utilisateurs ne doivent pas pouvoir modifier les informations du compte lorsque la création automatique est activée.",
|
||||||
"ISLINKINGALLOWED": "Liaison de comptes autorisée",
|
"ISLINKINGALLOWED": "Liaison de compte autorisée (manuellement)",
|
||||||
"ISLINKINGALLOWED_DESC": "Détermine si une identité peut être liée à un compte existant.",
|
"ISLINKINGALLOWED_DESC": "Détermine si une identité peut être liée manuellement à un compte existant. Désactivez si les utilisateurs ne doivent pouvoir lier que le compte proposé en cas de liaison automatique active.",
|
||||||
"AUTOLINKING_DESC": "Détermine si une identité sera invitée à être liée à un compte existant.",
|
"AUTOLINKING_DESC": "Détermine si une identité sera invitée à être liée à un compte existant.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Désactivé",
|
"0": "Désactivé",
|
||||||
|
@ -2058,10 +2058,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Se selezionato, verrà creato un account se non esiste ancora.",
|
"ISAUTOCREATION_DESC": "Se selezionato, verrà creato un account se non esiste ancora.",
|
||||||
"ISAUTOUPDATE": "Aggiornamento automatico",
|
"ISAUTOUPDATE": "Aggiornamento automatico",
|
||||||
"ISAUTOUPDATE_DESC": "Se selezionato, gli account vengono aggiornati alla riautenticazione.",
|
"ISAUTOUPDATE_DESC": "Se selezionato, gli account vengono aggiornati alla riautenticazione.",
|
||||||
"ISCREATIONALLOWED": "Creazione consentita",
|
"ISCREATIONALLOWED": "Creazione account consentita (manualmente)",
|
||||||
"ISCREATIONALLOWED_DESC": "Determina se i conti possono essere creati.",
|
"ISCREATIONALLOWED_DESC": "Determina se gli account possono essere creati utilizzando un account esterno. Disabilita se gli utenti non dovrebbero essere in grado di modificare le informazioni dell'account quando la creazione automatica è abilitata.",
|
||||||
"ISLINKINGALLOWED": "Collegamento consentito",
|
"ISLINKINGALLOWED": "Collegamento account consentito (manualmente)",
|
||||||
"ISLINKINGALLOWED_DESC": "Determina se un'identità può essere collegata a un account esistente.",
|
"ISLINKINGALLOWED_DESC": "Determina se un'identità può essere collegata manualmente a un account esistente. Disabilita se gli utenti dovrebbero essere autorizzati solo a collegare l'account proposto in caso di collegamento automatico attivo.",
|
||||||
"AUTOLINKING_DESC": "Determina se un'identità verrà invitata a essere collegata a un account esistente.",
|
"AUTOLINKING_DESC": "Determina se un'identità verrà invitata a essere collegata a un account esistente.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Disabilitato",
|
"0": "Disabilitato",
|
||||||
|
@ -2054,10 +2054,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "選択した場合、アカウントがまだ存在しない場合はアカウントが作成されます。",
|
"ISAUTOCREATION_DESC": "選択した場合、アカウントがまだ存在しない場合はアカウントが作成されます。",
|
||||||
"ISAUTOUPDATE": "自動更新",
|
"ISAUTOUPDATE": "自動更新",
|
||||||
"ISAUTOUPDATE_DESC": "選択した場合、アカウントは再認証時に更新されます。",
|
"ISAUTOUPDATE_DESC": "選択した場合、アカウントは再認証時に更新されます。",
|
||||||
"ISCREATIONALLOWED": "アカウント作成を許可",
|
"ISCREATIONALLOWED": "アカウント作成を許可 (手動)",
|
||||||
"ISCREATIONALLOWED_DESC": "アカウントを作成できるかどうかを決めます。",
|
"ISCREATIONALLOWED_DESC": "外部アカウントを使用してアカウントを作成できるかどうかを決定します。 自動作成が有効になっている場合、ユーザーがアカウント情報を編集できないようにするには、無効にします。",
|
||||||
"ISLINKINGALLOWED": "アカウントリンクを許可",
|
"ISLINKINGALLOWED": "アカウントリンクを許可 (手動)",
|
||||||
"ISLINKINGALLOWED_DESC": "IDを既存のアカウントにリンクできるかどうかを決めます。",
|
"ISLINKINGALLOWED_DESC": "アイデンティティを手動で既存のアカウントにリンクできるかどうかを決定します。 自動リンクがアクティブな場合は、ユーザーが提案されたアカウントのみをリンクできるようにするには、無効にします。",
|
||||||
"AUTOLINKING_DESC": "アイデンティティが既存のアカウントにリンクされるように促されるかどうかを決定します。",
|
"AUTOLINKING_DESC": "アイデンティティが既存のアカウントにリンクされるように促されるかどうかを決定します。",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "無効",
|
"0": "無効",
|
||||||
|
@ -2061,10 +2061,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Доколку е избрано, корисничка сметка ќе биде креиран ако сè уште не постои.",
|
"ISAUTOCREATION_DESC": "Доколку е избрано, корисничка сметка ќе биде креиран ако сè уште не постои.",
|
||||||
"ISAUTOUPDATE": "Автоматско ажурирање",
|
"ISAUTOUPDATE": "Автоматско ажурирање",
|
||||||
"ISAUTOUPDATE_DESC": "Доколку е избрано, корисничките сметки се ажурираат при повторно најавување.",
|
"ISAUTOUPDATE_DESC": "Доколку е избрано, корисничките сметки се ажурираат при повторно најавување.",
|
||||||
"ISCREATIONALLOWED": "Дозволено креирање на кориснички сметки",
|
"ISCREATIONALLOWED": "Создавање на сметка дозволено (рачно)",
|
||||||
"ISCREATIONALLOWED_DESC": "Одредува дали може да се креираат кориснички сметки.",
|
"ISCREATIONALLOWED_DESC": "Одредува дали сметките можат да се создадат со користење на надворешна сметка. Деактивирај ако корисниците не треба да можат да уредуваат информации за сметката кога автоматското создавање е овозможено.",
|
||||||
"ISLINKINGALLOWED": "Дозволено поврзување на кориснички сметки",
|
"ISLINKINGALLOWED": "Поврзување на сметка дозволено (рачно)",
|
||||||
"ISLINKINGALLOWED_DESC": "Одредува дали може да се поврзе идентитет со постоечка корисничка сметка.",
|
"ISLINKINGALLOWED_DESC": "Одредува дали идентитет може да биде рачно поврзан со постоечка сметка. Деактивирај ако корисниците треба да можат да поврзуваат само предложената сметка во случај на активно автоматско поврзување.",
|
||||||
"AUTOLINKING_DESC": "Одредува дали ќе се бара идентитетот да биде поврзан со постоечки профил.",
|
"AUTOLINKING_DESC": "Одредува дали ќе се бара идентитетот да биде поврзан со постоечки профил.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Исклучено",
|
"0": "Исклучено",
|
||||||
|
@ -2066,10 +2066,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Als geselecteerd, wordt een account aangemaakt als het nog niet bestaat.",
|
"ISAUTOCREATION_DESC": "Als geselecteerd, wordt een account aangemaakt als het nog niet bestaat.",
|
||||||
"ISAUTOUPDATE": "Automatische update",
|
"ISAUTOUPDATE": "Automatische update",
|
||||||
"ISAUTOUPDATE_DESC": "Als geselecteerd, worden accounts bijgewerkt bij opnieuw authenticeren.",
|
"ISAUTOUPDATE_DESC": "Als geselecteerd, worden accounts bijgewerkt bij opnieuw authenticeren.",
|
||||||
"ISCREATIONALLOWED": "Account creatie toegestaan",
|
"ISCREATIONALLOWED": "Accountaanmaak toegestaan (handmatig)",
|
||||||
"ISCREATIONALLOWED_DESC": "Bepaalt of accounts kunnen worden aangemaakt.",
|
"ISCREATIONALLOWED_DESC": "Bepaalt of accounts kunnen worden aangemaakt met behulp van een extern account. Schakel uit als gebruikers accountinformatie niet mogen kunnen bewerken wanneer auto-aanmaak is ingeschakeld.",
|
||||||
"ISLINKINGALLOWED": "Account koppeling toegestaan",
|
"ISLINKINGALLOWED": "Accountkoppeling toegestaan (handmatig)",
|
||||||
"ISLINKINGALLOWED_DESC": "Bepaalt of een identiteit kan worden gekoppeld aan een bestaand account.",
|
"ISLINKINGALLOWED_DESC": "Bepaalt of een identiteit handmatig kan worden gekoppeld aan een bestaand account. Schakel uit als gebruikers alleen het voorgestelde account mogen kunnen koppelen in geval van actieve auto-koppeling.",
|
||||||
"AUTOLINKING_DESC": "Bepaalt of een identiteit wordt gevraagd om te worden gekoppeld aan een bestaand account.",
|
"AUTOLINKING_DESC": "Bepaalt of een identiteit wordt gevraagd om te worden gekoppeld aan een bestaand account.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Uitgeschakeld",
|
"0": "Uitgeschakeld",
|
||||||
|
@ -2057,10 +2057,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Jeśli zostanie wybrana, konto zostanie utworzone, jeśli jeszcze nie istnieje.",
|
"ISAUTOCREATION_DESC": "Jeśli zostanie wybrana, konto zostanie utworzone, jeśli jeszcze nie istnieje.",
|
||||||
"ISAUTOUPDATE": "Automatyczna aktualizacja",
|
"ISAUTOUPDATE": "Automatyczna aktualizacja",
|
||||||
"ISAUTOUPDATE_DESC": "Jeśli zaznaczone, konta są aktualizowane przy ponownym uwierzytelnianiu.",
|
"ISAUTOUPDATE_DESC": "Jeśli zaznaczone, konta są aktualizowane przy ponownym uwierzytelnianiu.",
|
||||||
"ISCREATIONALLOWED": "tworzenie dozwolone",
|
"ISCREATIONALLOWED": "Tworzenie konta dozwolone (ręcznie)",
|
||||||
"ISCREATIONALLOWED_DESC": "Określa, czy można tworzyć konta.",
|
"ISCREATIONALLOWED_DESC": "Określa, czy konta mogą być tworzone przy użyciu konta zewnętrznego. Wyłącz, jeśli użytkownicy nie powinni mieć możliwości edytowania informacji o koncie, gdy automatyczne tworzenie jest włączone.",
|
||||||
"ISLINKINGALLOWED": "dozwolone łączenie rachunków",
|
"ISLINKINGALLOWED": "Łączenie kont dozwolone (ręcznie)",
|
||||||
"ISLINKINGALLOWED_DESC": "Określa, czy tożsamość może być powiązana z istniejącym kontem.",
|
"ISLINKINGALLOWED_DESC": "Określa, czy tożsamość może być ręcznie połączona z istniejącym kontem. Wyłącz, jeśli użytkownicy powinni mieć możliwość łączenia tylko proponowanego konta w przypadku aktywnego automatycznego łączenia.",
|
||||||
"AUTOLINKING_DESC": "Określa, czy tożsamość będzie proszona o połączenie z istniejącym kontem.",
|
"AUTOLINKING_DESC": "Określa, czy tożsamość będzie proszona o połączenie z istniejącym kontem.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Wyłączone",
|
"0": "Wyłączone",
|
||||||
|
@ -2059,10 +2059,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Se selecionado, uma conta será criada se ainda não existir.",
|
"ISAUTOCREATION_DESC": "Se selecionado, uma conta será criada se ainda não existir.",
|
||||||
"ISAUTOUPDATE": "Atualização Automática",
|
"ISAUTOUPDATE": "Atualização Automática",
|
||||||
"ISAUTOUPDATE_DESC": "Se selecionado, as contas são atualizadas ao serem reautenticadas.",
|
"ISAUTOUPDATE_DESC": "Se selecionado, as contas são atualizadas ao serem reautenticadas.",
|
||||||
"ISCREATIONALLOWED": "Criação de Conta Permitida",
|
"ISCREATIONALLOWED": "Criação de conta permitida (manualmente)",
|
||||||
"ISCREATIONALLOWED_DESC": "Determina se as contas podem ser criadas.",
|
"ISCREATIONALLOWED_DESC": "Determina se contas podem ser criadas usando uma conta externa. Desative se os usuários não devem poder editar informações da conta quando a criação automática está ativada.",
|
||||||
"ISLINKINGALLOWED": "Vinculação de Conta Permitida",
|
"ISLINKINGALLOWED": "Vinculação de conta permitida (manualmente)",
|
||||||
"ISLINKINGALLOWED_DESC": "Determina se uma identidade pode ser vinculada a uma conta existente.",
|
"ISLINKINGALLOWED_DESC": "Determina se uma identidade pode ser vinculada manualmente a uma conta existente. Desative se os usuários só devem poder vincular a conta proposta em caso de vinculação automática ativa.",
|
||||||
"AUTOLINKING_DESC": "Determina se uma identidade será solicitada a ser vinculada a uma conta existente.",
|
"AUTOLINKING_DESC": "Determina se uma identidade será solicitada a ser vinculada a uma conta existente.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Desativado",
|
"0": "Desativado",
|
||||||
|
@ -2148,10 +2148,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Если этот флажок установлен, учетная запись будет создана, если она еще не существует.",
|
"ISAUTOCREATION_DESC": "Если этот флажок установлен, учетная запись будет создана, если она еще не существует.",
|
||||||
"ISAUTOUPDATE": "Автоматическое обновление",
|
"ISAUTOUPDATE": "Автоматическое обновление",
|
||||||
"ISAUTOUPDATE_DESC": "Если этот флажок установлен, учетные записи обновляются при повторной аутентификации.",
|
"ISAUTOUPDATE_DESC": "Если этот флажок установлен, учетные записи обновляются при повторной аутентификации.",
|
||||||
"ISCREATIONALLOWED": "Создание учетной записи разрешено",
|
"ISCREATIONALLOWED": "Создание аккаунта разрешено (вручную)",
|
||||||
"ISCREATIONALLOWED_DESC": "Определяет, можно ли создавать учетные записи.",
|
"ISCREATIONALLOWED_DESC": "Определяет, можно ли создавать учетные записи с использованием внешней учетной записи. Отключите, если пользователи не должны иметь возможность редактировать информацию об аккаунте при включенном автоматическом создании.",
|
||||||
"ISLINKINGALLOWED": "Привязка аккаунтов разрешена",
|
"ISLINKINGALLOWED": "Связывание аккаунтов разрешено (вручную)",
|
||||||
"ISLINKINGALLOWED_DESC": "Определяет, можно ли связать личность с существующей учетной записью.",
|
"ISLINKINGALLOWED_DESC": "Определяет, можно ли вручную связать идентификатор с существующим аккаунтом. Отключите, если пользователям разрешено связывать только предлагаемый аккаунт в случае активного автоматического связывания.",
|
||||||
"AUTOLINKING_DESC": "Определяет, будет ли запрошено связать идентификацию с существующим аккаунтом.",
|
"AUTOLINKING_DESC": "Определяет, будет ли запрошено связать идентификацию с существующим аккаунтом.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Отключено",
|
"0": "Отключено",
|
||||||
|
@ -2070,10 +2070,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "Om valt, skapas ett konto om det inte redan finns.",
|
"ISAUTOCREATION_DESC": "Om valt, skapas ett konto om det inte redan finns.",
|
||||||
"ISAUTOUPDATE": "Automatisk uppdatering",
|
"ISAUTOUPDATE": "Automatisk uppdatering",
|
||||||
"ISAUTOUPDATE_DESC": "Om valt, uppdateras konton vid återautentisering.",
|
"ISAUTOUPDATE_DESC": "Om valt, uppdateras konton vid återautentisering.",
|
||||||
"ISCREATIONALLOWED": "Kontoskapande tillåtet",
|
"ISCREATIONALLOWED": "Kontoinrättning tillåten (manuellt)",
|
||||||
"ISCREATIONALLOWED_DESC": "Avgör om konton kan skapas.",
|
"ISCREATIONALLOWED_DESC": "Bestämmer om konton kan skapas med hjälp av ett externt konto. Avaktivera om användare inte ska kunna redigera kontoinformation när automatisk skapelse är aktiverad.",
|
||||||
"ISLINKINGALLOWED": "Kontolänkning tillåten",
|
"ISLINKINGALLOWED": "Kontolänkning tillåten (manuellt)",
|
||||||
"ISLINKINGALLOWED_DESC": "Avgör om en identitet kan länkas till ett befintligt konto.",
|
"ISLINKINGALLOWED_DESC": "Bestämmer om en identitet kan länkas manuellt till ett befintligt konto. Avaktivera om användare bara ska kunna länka det föreslagna kontot vid aktiv automatisk länkning.",
|
||||||
"AUTOLINKING_DESC": "Avgör om en identitet kommer att uppmanas att länkas till ett befintligt konto.",
|
"AUTOLINKING_DESC": "Avgör om en identitet kommer att uppmanas att länkas till ett befintligt konto.",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "Inaktiverad",
|
"0": "Inaktiverad",
|
||||||
|
@ -2057,10 +2057,10 @@
|
|||||||
"ISAUTOCREATION_DESC": "如果选择了,如果账户还不存在,就会创建一个账户。",
|
"ISAUTOCREATION_DESC": "如果选择了,如果账户还不存在,就会创建一个账户。",
|
||||||
"ISAUTOUPDATE": "正在自动更新",
|
"ISAUTOUPDATE": "正在自动更新",
|
||||||
"ISAUTOUPDATE_DESC": "如果选择,账户将在重新认证时更新。",
|
"ISAUTOUPDATE_DESC": "如果选择,账户将在重新认证时更新。",
|
||||||
"ISCREATIONALLOWED": "是否允许创作",
|
"ISCREATIONALLOWED": "允许创建账户(手动)",
|
||||||
"ISCREATIONALLOWED_DESC": "确定是否可以创建账户。",
|
"ISCREATIONALLOWED_DESC": "确定是否可以使用外部账户创建账户。如果用户在启用自动创建时不应该能够编辑账户信息,请禁用。",
|
||||||
"ISLINKINGALLOWED": "是否允许连接",
|
"ISLINKINGALLOWED": "允许链接账户(手动)",
|
||||||
"ISLINKINGALLOWED_DESC": "确定一个身份是否可以与一个现有的账户相联系。",
|
"ISLINKINGALLOWED_DESC": "确定是否可以手动将身份链接到现有账户。如果用户只能在激活自动链接的情况下链接建议的账户,请禁用。",
|
||||||
"AUTOLINKING_DESC": "确定是否提示将身份链接到现有帐户。",
|
"AUTOLINKING_DESC": "确定是否提示将身份链接到现有帐户。",
|
||||||
"AUTOLINKINGTYPE": {
|
"AUTOLINKINGTYPE": {
|
||||||
"0": "已禁用",
|
"0": "已禁用",
|
||||||
|
5133
console/yarn.lock
5133
console/yarn.lock
File diff suppressed because it is too large
Load Diff
@ -466,7 +466,7 @@ message DeleteTargetResponse {
|
|||||||
|
|
||||||
message SearchTargetsRequest {
|
message SearchTargetsRequest {
|
||||||
// list limitations and ordering.
|
// list limitations and ordering.
|
||||||
zitadel.resources.object.v3alpha.ListQuery query = 2;
|
zitadel.resources.object.v3alpha.SearchQuery query = 2;
|
||||||
// the field the result is sorted.
|
// the field the result is sorted.
|
||||||
zitadel.resources.action.v3alpha.TargetFieldName sorting_column = 3 [
|
zitadel.resources.action.v3alpha.TargetFieldName sorting_column = 3 [
|
||||||
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
|
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
|
||||||
@ -526,7 +526,7 @@ message DeleteExecutionResponse {
|
|||||||
|
|
||||||
message SearchExecutionsRequest {
|
message SearchExecutionsRequest {
|
||||||
// list limitations and ordering.
|
// list limitations and ordering.
|
||||||
zitadel.resources.object.v3alpha.ListQuery query = 1;
|
zitadel.resources.object.v3alpha.SearchQuery query = 1;
|
||||||
// Define the criteria to query for.
|
// Define the criteria to query for.
|
||||||
repeated zitadel.resources.action.v3alpha.ExecutionSearchFilter filters = 2;
|
repeated zitadel.resources.action.v3alpha.ExecutionSearchFilter filters = 2;
|
||||||
}
|
}
|
||||||
|
@ -66,14 +66,14 @@ enum AutoLinkingOption {
|
|||||||
}
|
}
|
||||||
|
|
||||||
message Options {
|
message Options {
|
||||||
bool is_linking_allowed = 1 [
|
bool is_manual_linking_allowed = 1 [
|
||||||
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
|
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
|
||||||
description: "Enable if users should be able to link an existing ZITADEL user with an external account.";
|
description: "Enable if users should be able to link an existing ZITADEL user with an external account. Disable if users should only be allowed to link the proposed account in case of active auto_linking.";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
bool is_creation_allowed = 2 [
|
bool is_manual_creation_allowed = 2 [
|
||||||
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
|
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
|
||||||
description: "Enable if users should be able to create a new account in ZITADEL when using an external account.";
|
description: "Enable if users should be able to create a new account in ZITADEL when using an external account. Disable if users should not be able to edit account information when auto_creation is enabled.";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
bool is_auto_creation = 3 [
|
bool is_auto_creation = 3 [
|
||||||
|
@ -292,7 +292,7 @@ message DeleteIDPResponse {
|
|||||||
message SearchIDPsRequest {
|
message SearchIDPsRequest {
|
||||||
optional zitadel.object.v3alpha.RequestContext ctx = 1;
|
optional zitadel.object.v3alpha.RequestContext ctx = 1;
|
||||||
// list limitations and ordering.
|
// list limitations and ordering.
|
||||||
zitadel.resources.object.v3alpha.ListQuery query = 2;
|
zitadel.resources.object.v3alpha.SearchQuery query = 2;
|
||||||
// the field the result is sorted.
|
// the field the result is sorted.
|
||||||
zitadel.resources.idp.v3alpha.IDPFieldName sorting_column = 3 [
|
zitadel.resources.idp.v3alpha.IDPFieldName sorting_column = 3 [
|
||||||
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
|
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
|
||||||
|
@ -170,3 +170,18 @@ For event there are 3 levels the condition can be defined:
|
|||||||
- All, handling any event in ZITADEL
|
- All, handling any event in ZITADEL
|
||||||
|
|
||||||
The concept of events can be found under [Events](/concepts/architecture/software#events)
|
The concept of events can be found under [Events](/concepts/architecture/software#events)
|
||||||
|
|
||||||
|
### Error forwarding
|
||||||
|
|
||||||
|
If you want to forward a specific error from the Target through ZITADEL, you can provide a response from the Target with status code 200 and a JSON in the following format:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"forwardedStatusCode": 403,
|
||||||
|
"forwardedErrorMessage": "Call is forbidden through the IP AllowList definition"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Only values from 400 to 499 will be forwarded through ZITADEL, other StatusCodes will end in a PreconditionFailed error.
|
||||||
|
|
||||||
|
If the Target returns any other status code than >= 200 and < 299, the execution is looked at as failed, and a PreconditionFailed error is logged.
|
||||||
|
@ -21,7 +21,7 @@ Please refer to our guides how to [authenticate users](/docs/guides/integrate/lo
|
|||||||
|
|
||||||
For user authentication on devices with limited accessibility (eg, SmartTV, Smart Watch etc.) use the [device authorization grant](/docs/guides/integrate/login/oidc/device-authorization).
|
For user authentication on devices with limited accessibility (eg, SmartTV, Smart Watch etc.) use the [device authorization grant](/docs/guides/integrate/login/oidc/device-authorization).
|
||||||
|
|
||||||
Additionally, you can use the [session API](../apis/resources/session_service/) to authenticate users, for example by building a [custom login UI](/docs/guides/integrate/login-ui/).
|
Additionally, you can use the [session API](../apis/resources/session_service_v2/) to authenticate users, for example by building a [custom login UI](/docs/guides/integrate/login-ui/).
|
||||||
|
|
||||||
### Authenticate service users and machines
|
### Authenticate service users and machines
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ The [OIDC Playground](/docs/apis/openidoauth/authrequest) is for testing OpenID
|
|||||||
|
|
||||||
### Custom
|
### Custom
|
||||||
|
|
||||||
ZITADEL allows to authenticate users by creating a session with the [Session API](/docs/apis/resources/session_service) or get OIDC authentication request details with the [OIDC service API](/docs/apis/resources/oidc_service).
|
ZITADEL allows to authenticate users by creating a session with the [Session API](/docs/apis/resources/session_service_v2) or get OIDC authentication request details with the [OIDC service API](/docs/apis/resources/oidc_service).
|
||||||
User authorizations can be [retrieved as roles from our APIs](/docs/guides/integrate/retrieve-user-roles).
|
User authorizations can be [retrieved as roles from our APIs](/docs/guides/integrate/retrieve-user-roles).
|
||||||
|
|
||||||
Refer to our guide to learn how to [build your own login UI](/docs/guides/integrate/login-ui)
|
Refer to our guide to learn how to [build your own login UI](/docs/guides/integrate/login-ui)
|
||||||
@ -54,9 +54,9 @@ Refer to our guide to learn how to [build your own login UI](/docs/guides/integr
|
|||||||
|
|
||||||
ZITADEL provides APIs for each [core resource](/docs/apis/v2):
|
ZITADEL provides APIs for each [core resource](/docs/apis/v2):
|
||||||
|
|
||||||
- [User](/docs/apis/resources/user_service)
|
- [User](/docs/apis/resources/user_service_v2)
|
||||||
- [Session](/docs/apis/resources/session_service)
|
- [Session](/docs/apis/resources/session_service_v2)
|
||||||
- [Settings](/docs/apis/resources/settings_service)
|
- [Settings](/docs/apis/resources/settings_service_v2)
|
||||||
|
|
||||||
:::info
|
:::info
|
||||||
We are migrating to a resource-based API approach.
|
We are migrating to a resource-based API approach.
|
||||||
|
@ -65,8 +65,8 @@ The [RFC 8252 specification](https://tools.ietf.org/html/rfc8252) defines how
|
|||||||
Basically, there are two major points in this specification:
|
Basically, there are two major points in this specification:
|
||||||
|
|
||||||
1. It recommends to use [PKCE](https://oauth.net/2/pkce/)
|
1. It recommends to use [PKCE](https://oauth.net/2/pkce/)
|
||||||
2. It does not allow third party apps to open the browser for the login process,
|
2. It does not allow third party apps to use an embedded web view for the login process,
|
||||||
the app must open the login page within the embedded browser view
|
the app must open the login page within the default browser
|
||||||
|
|
||||||
First install [http](https://pub.dev/packages/http) a library for making HTTP calls,
|
First install [http](https://pub.dev/packages/http) a library for making HTTP calls,
|
||||||
then [`flutter_web_auth_2`](https://pub.dev/packages/flutter_web_auth_2) and a secure storage to store the auth / refresh tokens [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage).
|
then [`flutter_web_auth_2`](https://pub.dev/packages/flutter_web_auth_2) and a secure storage to store the auth / refresh tokens [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage).
|
||||||
|
@ -8,7 +8,7 @@ import ServiceuserJWT from "../imports/_serviceuser_jwt.mdx";
|
|||||||
import ServiceuserRole from "../imports/_serviceuser_role.mdx";
|
import ServiceuserRole from "../imports/_serviceuser_role.mdx";
|
||||||
import SetupPylon from "../imports/_setup_pylon.mdx";
|
import SetupPylon from "../imports/_setup_pylon.mdx";
|
||||||
|
|
||||||
This integration guide demonstrates the recommended way to incorporate ZITADEL into your Pylon service.
|
This integration guide demonstrates the recommended way to incorporate ZITADEL into your [Pylon](https://pylon.cronit.io) service.
|
||||||
It explains how to check the token validity in the API and how to check for permissions.
|
It explains how to check the token validity in the API and how to check for permissions.
|
||||||
|
|
||||||
By the end of this guide, your application will have three different endpoint which are public, private(valid token) and private-scoped(valid token with specific role).
|
By the end of this guide, your application will have three different endpoint which are public, private(valid token) and private-scoped(valid token with specific role).
|
||||||
@ -301,4 +301,4 @@ curl -H "Authorization: Bearer $TOKEN" -X GET http://localhost:3000/api/me/messa
|
|||||||
|
|
||||||
Congratulations! You have successfully integrated your Pylon with ZITADEL!
|
Congratulations! You have successfully integrated your Pylon with ZITADEL!
|
||||||
|
|
||||||
If you get stuck, consider checking out their [documentation](https://pylon.cronit.io/). If you face issues, contact Pylon or raise an issue on [GitHub](https://github.com/getcronit/pylon/issues).
|
If you get stuck, consider checking out their [documentation](https://pylon.cronit.io). If you face issues, contact Pylon or raise an issue on [GitHub](https://github.com/getcronit/pylon/issues).
|
||||||
|
@ -147,9 +147,11 @@ When configuring external IdP templates in ZITADEL, several common settings enab
|
|||||||
|
|
||||||
- **Automatic update**: This feature, when activated, allows ZITADEL to automatically update a user's profile information whenever changes are detected in the user's account on the external IdP. For example, if a user changes their last name in their Google or Microsoft account, ZITADEL will reflect this update in the user's account upon their next login.
|
- **Automatic update**: This feature, when activated, allows ZITADEL to automatically update a user's profile information whenever changes are detected in the user's account on the external IdP. For example, if a user changes their last name in their Google or Microsoft account, ZITADEL will reflect this update in the user's account upon their next login.
|
||||||
|
|
||||||
- **Account creation allowed**: Determines whether new user accounts can be created in ZITADEL through the external IdP authentication process. Enabling this setting is crucial for allowing users who are new to your application to register and create accounts seamlessly via their existing external IdP accounts.
|
- **Account creation allowed (manually)**: Determines whether new user accounts can be created in ZITADEL through the external IdP authentication process. Enabling this setting is crucial for allowing users who are new to your application to register and create accounts seamlessly via their existing external IdP accounts. However, if you rely on the **automatic creation** and want to prevent users to manually create their accounts or edit information during the automatic process, you need to disable this option.
|
||||||
|
|
||||||
- **Account linking allowed**: Enables existing ZITADEL accounts to be linked with identities from external IdPs. It requires that a linkable ZITADEL account already exists for the user attempting to log in with an external IdP. Account linking is beneficial for users who wish to associate multiple login methods with their ZITADEL account, providing flexibility and convenience in how they access your application.
|
- **Account linking allowed (manually)**: Enables existing ZITADEL accounts to be linked with identities from external IdPs. It requires that a linkable ZITADEL account already exists for the user attempting to log in with an external IdP. Account linking is beneficial for users who wish to associate multiple login methods with their ZITADEL account, providing flexibility and convenience in how they access your application. However, if you rely on an **automatic linking option** and want to prevent users to manually link their accounts, you need to disable this option.
|
||||||
|
|
||||||
|
- **Automatic linking options**: Enables existing ZITADEL accounts to be linked with identities from external IdPs. If not disabled, ZITADEL will check for an existing account with the configured criteria (username or email) and prompt the user to link the account.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Your user has successfully authenticated, and now you ask them if they want to s
|
|||||||
When the user starts the configuration, first you want to show them the possible methods.
|
When the user starts the configuration, first you want to show them the possible methods.
|
||||||
You can either list it implicitly or call the settings service from ZITADEL to get what is configured on the login settings.
|
You can either list it implicitly or call the settings service from ZITADEL to get what is configured on the login settings.
|
||||||
|
|
||||||
More detailed information about the API: [Get Login Settings Documentation](/apis/resources/settings_service/settings-service-get-login-settings)
|
More detailed information about the API: [Get Login Settings Documentation](/apis/resources/settings_service_v2/settings-service-get-login-settings)
|
||||||
|
|
||||||
Request Example:
|
Request Example:
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
When your user is done using your application and clicks on the logout button, you have to send a request to the terminate session endpoint.
|
When your user is done using your application and clicks on the logout button, you have to send a request to the terminate session endpoint.
|
||||||
[Terminate Session Documentation](/docs/apis/resources/session_service/session-service-delete-session)
|
[Terminate Session Documentation](/docs/apis/resources/session_service_v2/session-service-delete-session)
|
||||||
|
|
||||||
Sessions can be terminated by either:
|
Sessions can be terminated by either:
|
||||||
- the authenticated user
|
- the authenticated user
|
||||||
|
@ -3,7 +3,7 @@ If you want to build your own select account/account picker, you have to cache t
|
|||||||
We recommend storing a list of the session Ids with the corresponding session token in a cookie.
|
We recommend storing a list of the session Ids with the corresponding session token in a cookie.
|
||||||
The list of session IDs can be sent in the “search sessions” request to get a detailed list of sessions for the account selection.
|
The list of session IDs can be sent in the “search sessions” request to get a detailed list of sessions for the account selection.
|
||||||
|
|
||||||
[Search Sessions Documentation](/docs/apis/resources/session_service/session-service-list-sessions)
|
[Search Sessions Documentation](/docs/apis/resources/session_service_v2/session-service-list-sessions)
|
||||||
|
|
||||||
### Request
|
### Request
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
Now that you have successfully authenticated in the browser, you can update the session of the user.
|
Now that you have successfully authenticated in the browser, you can update the session of the user.
|
||||||
Fill the webAuthN checks with the credential assertion data you get from the browser.
|
Fill the webAuthN checks with the credential assertion data you get from the browser.
|
||||||
|
|
||||||
More detailed information about the API: [Update Session Documentation](/apis/resources/session_service/session-service-set-session)
|
More detailed information about the API: [Update Session Documentation](/apis/resources/session_service_v2/session-service-set-session)
|
||||||
|
|
||||||
Example Request:
|
Example Request:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ Send the following two URLs in the request body:
|
|||||||
2. ErrorURL: Page that should be shown when an error happens during the authentication
|
2. ErrorURL: Page that should be shown when an error happens during the authentication
|
||||||
|
|
||||||
In the response, you will get an authentication URL of the provider you like.
|
In the response, you will get an authentication URL of the provider you like.
|
||||||
[Start Identity Provider Intent Documentation](/docs/apis/resources/user_service/user-service-start-identity-provider-intent)
|
[Start Identity Provider Intent Documentation](/docs/apis/resources/user_service_v2/user-service-start-identity-provider-intent)
|
||||||
|
|
||||||
### Request
|
### Request
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ After the user has successfully authenticated, a redirect to the ZITADEL backend
|
|||||||
ZITADEL will take the information of the provider. After this, a redirect will be made to either the success page in case of a successful login or to the error page in case of a failure will be performed. In the parameters, you will provide the IDP intentID, a token, and optionally, if a user could be found, a user ID.
|
ZITADEL will take the information of the provider. After this, a redirect will be made to either the success page in case of a successful login or to the error page in case of a failure will be performed. In the parameters, you will provide the IDP intentID, a token, and optionally, if a user could be found, a user ID.
|
||||||
|
|
||||||
To get the information of the provider, make a request to ZITADEL.
|
To get the information of the provider, make a request to ZITADEL.
|
||||||
[Retrieve Identity Provider Intent Documentation](/docs/apis/resources/user_service/user-service-retrieve-identity-provider-intent)
|
[Retrieve Identity Provider Intent Documentation](/docs/apis/resources/user_service_v2/user-service-retrieve-identity-provider-intent)
|
||||||
|
|
||||||
### Request
|
### Request
|
||||||
```bash
|
```bash
|
||||||
@ -155,7 +155,7 @@ Fill the IdP links in the create user request to add a user with an external log
|
|||||||
The idpId is the ID of the provider in ZITADEL, the idpExternalId is the ID of the user in the external identity provider; usually, this is sent in the “sub”.
|
The idpId is the ID of the provider in ZITADEL, the idpExternalId is the ID of the user in the external identity provider; usually, this is sent in the “sub”.
|
||||||
The display name is used to list the linkings on the users.
|
The display name is used to list the linkings on the users.
|
||||||
|
|
||||||
[Create User API Documentation](/docs/apis/resources/user_service/user-service-add-human-user)
|
[Create User API Documentation](/docs/apis/resources/user_service_v2/user-service-add-human-user)
|
||||||
|
|
||||||
#### Request
|
#### Request
|
||||||
```bash
|
```bash
|
||||||
@ -193,7 +193,7 @@ curl --request POST \
|
|||||||
If you didn't get a user ID in the parameters to your success page, you know that there is no existing user in ZITADEL with that provider and you can register a new user (read previous section), or link it to an existing account.
|
If you didn't get a user ID in the parameters to your success page, you know that there is no existing user in ZITADEL with that provider and you can register a new user (read previous section), or link it to an existing account.
|
||||||
|
|
||||||
If you want to link/connect to an existing account you can perform the add identity provider link request.
|
If you want to link/connect to an existing account you can perform the add identity provider link request.
|
||||||
[Add IDP Link to existing user documentation](/docs/apis/resources/user_service/user-service-add-idp-link)
|
[Add IDP Link to existing user documentation](/docs/apis/resources/user_service_v2/user-service-add-idp-link)
|
||||||
|
|
||||||
#### Request
|
#### Request
|
||||||
```bash
|
```bash
|
||||||
|
@ -35,7 +35,7 @@ To show the user the QR to register TOTP with his Authenticator App like Google/
|
|||||||
Generate the QR Code with the URI from the response.
|
Generate the QR Code with the URI from the response.
|
||||||
For users that do not have a QR Code reader make sure to also show the secret, to enable manual configuration.
|
For users that do not have a QR Code reader make sure to also show the secret, to enable manual configuration.
|
||||||
|
|
||||||
More detailed information about the API: [Start TOTP Registration Documentation](/apis/resources/user_service/user-service-register-totp)
|
More detailed information about the API: [Start TOTP Registration Documentation](/apis/resources/user_service_v2/user-service-register-totp)
|
||||||
|
|
||||||
Request Example:
|
Request Example:
|
||||||
|
|
||||||
@ -67,7 +67,7 @@ Response Example:
|
|||||||
When the user has added the account to the authenticator app, the code from the App has to be entered to finish the registration.
|
When the user has added the account to the authenticator app, the code from the App has to be entered to finish the registration.
|
||||||
This code has to be sent to the verify endpoint in ZITADEL.
|
This code has to be sent to the verify endpoint in ZITADEL.
|
||||||
|
|
||||||
More detailed information about the API: [Verify TOTP Documentation](/apis/resources/user_service/user-service-verify-totp-registration)
|
More detailed information about the API: [Verify TOTP Documentation](/apis/resources/user_service_v2/user-service-verify-totp-registration)
|
||||||
|
|
||||||
Request Example:
|
Request Example:
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ curl --request POST \
|
|||||||
To be able to check the TOTP you need a session with a checked user. This can either happen before the TOTP check or at the same time.
|
To be able to check the TOTP you need a session with a checked user. This can either happen before the TOTP check or at the same time.
|
||||||
In this example we do two separate requests. So the first step is to create a new Sessions.
|
In this example we do two separate requests. So the first step is to create a new Sessions.
|
||||||
|
|
||||||
More detailed information about the API: [Create new session Documentation](/apis/resources/session_service/session-service-create-session)
|
More detailed information about the API: [Create new session Documentation](/apis/resources/session_service_v2/session-service-create-session)
|
||||||
|
|
||||||
Example Request
|
Example Request
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ Example Response
|
|||||||
Now you can show the code field to the user, where the code needs to be entered from the Authenticator App.
|
Now you can show the code field to the user, where the code needs to be entered from the Authenticator App.
|
||||||
With that code you have to update the existing session with a totp check.
|
With that code you have to update the existing session with a totp check.
|
||||||
|
|
||||||
More detailed information about the API: [Update session Documentation](/apis/resources/session_service/session-service-set-session)
|
More detailed information about the API: [Update session Documentation](/apis/resources/session_service_v2/session-service-set-session)
|
||||||
|
|
||||||
Example Request
|
Example Request
|
||||||
```bash
|
```bash
|
||||||
@ -169,7 +169,7 @@ With an empty returnCode object in the request, ZITADEL will not send the code,
|
|||||||
|
|
||||||
If you don't want the user to verify the phone number, you can also create it directly as verified, by sending the isVerified attribute.
|
If you don't want the user to verify the phone number, you can also create it directly as verified, by sending the isVerified attribute.
|
||||||
|
|
||||||
More detailed information about the API: [Add phone](/apis/resources/user_service/user-service-set-phone)
|
More detailed information about the API: [Add phone](/apis/resources/user_service_v2/user-service-set-phone)
|
||||||
|
|
||||||
Example Request:
|
Example Request:
|
||||||
|
|
||||||
@ -190,7 +190,7 @@ curl --request POST \
|
|||||||
The next step is to show a screen, so the user is able to enter the code for verifying the phone number.
|
The next step is to show a screen, so the user is able to enter the code for verifying the phone number.
|
||||||
Send a verify phone request with the code in the body.
|
Send a verify phone request with the code in the body.
|
||||||
|
|
||||||
More detailed information about the API: [Verify phone](/apis/resources/user_service/user-service-verify-phone)
|
More detailed information about the API: [Verify phone](/apis/resources/user_service_v2/user-service-verify-phone)
|
||||||
|
|
||||||
Example Request:
|
Example Request:
|
||||||
```bash
|
```bash
|
||||||
@ -208,7 +208,7 @@ curl --request POST \
|
|||||||
|
|
||||||
Now that the user has a verified phone number you can enable SMS OTP on the user.
|
Now that the user has a verified phone number you can enable SMS OTP on the user.
|
||||||
|
|
||||||
More detailed information about the API: [Add OTP SMS for a user](/apis/resources/user_service/user-service-add-otpsms)
|
More detailed information about the API: [Add OTP SMS for a user](/apis/resources/user_service_v2/user-service-add-otpsms)
|
||||||
|
|
||||||
Example Request:
|
Example Request:
|
||||||
```bash
|
```bash
|
||||||
@ -231,7 +231,7 @@ To be able to check the SMS Code you need a session with a checked user.
|
|||||||
When creating the session you can already start the sms challenge, this will only be executed if the user check was successful.
|
When creating the session you can already start the sms challenge, this will only be executed if the user check was successful.
|
||||||
You can tell the challenge, if the code should be returned (returnCode: true) or if ZITADEL should send it (returnCode: false).
|
You can tell the challenge, if the code should be returned (returnCode: true) or if ZITADEL should send it (returnCode: false).
|
||||||
|
|
||||||
More detailed information about the API: [Create new session Documentation](/apis/resources/session_service/session-service-create-session)
|
More detailed information about the API: [Create new session Documentation](/apis/resources/session_service_v2/session-service-create-session)
|
||||||
|
|
||||||
Example Request
|
Example Request
|
||||||
|
|
||||||
@ -296,7 +296,7 @@ For the Email second factor the already verified email address will be taken.
|
|||||||
|
|
||||||
As the user already has a verified E-Mail address you can enable E-Mail OTP on the user.
|
As the user already has a verified E-Mail address you can enable E-Mail OTP on the user.
|
||||||
|
|
||||||
More detailed information about the API: [Add OTP Email for a user](/apis/resources/user_service/user-service-add-otp-email)
|
More detailed information about the API: [Add OTP Email for a user](/apis/resources/user_service_v2/user-service-add-otp-email)
|
||||||
|
|
||||||
Example Request:
|
Example Request:
|
||||||
```bash
|
```bash
|
||||||
@ -319,7 +319,7 @@ To be able to check the Email Code you need a session with a checked user.
|
|||||||
When creating the session you can already start the sms challenge, this will only be executed if the user check was successful.
|
When creating the session you can already start the sms challenge, this will only be executed if the user check was successful.
|
||||||
You can tell the challenge, if the code should be returned (returnCode: true) or if ZITADEL should send it (returnCode: false).
|
You can tell the challenge, if the code should be returned (returnCode: true) or if ZITADEL should send it (returnCode: false).
|
||||||
|
|
||||||
More detailed information about the API: [Create new session Documentation](/apis/resources/session_service/session-service-create-session)
|
More detailed information about the API: [Create new session Documentation](/apis/resources/session_service_v2/session-service-create-session)
|
||||||
|
|
||||||
Example Request
|
Example Request
|
||||||
|
|
||||||
@ -380,7 +380,7 @@ curl --request PATCH \
|
|||||||
The user has selected to setup Universal Second Factor (U2F).
|
The user has selected to setup Universal Second Factor (U2F).
|
||||||
To be able to authenticate in the browser you have to start the u2f registration within ZITADEL.
|
To be able to authenticate in the browser you have to start the u2f registration within ZITADEL.
|
||||||
|
|
||||||
More detailed information about the API: [Start U2F Registration Documentation](/apis/resources/user_service/user-service-register-u-2-f)
|
More detailed information about the API: [Start U2F Registration Documentation](/apis/resources/user_service_v2/user-service-register-u-2-f)
|
||||||
|
|
||||||
Request Example:
|
Request Example:
|
||||||
|
|
||||||
@ -450,7 +450,7 @@ Include the public key credential you got from the browser in your request.
|
|||||||
You can give the U2F a name, which makes it easier for the user to identify the registered authentication methods.
|
You can give the U2F a name, which makes it easier for the user to identify the registered authentication methods.
|
||||||
Example: Google Pixel, iCloud Keychain, Yubikey, etc
|
Example: Google Pixel, iCloud Keychain, Yubikey, etc
|
||||||
|
|
||||||
More detailed information about the API: [Verify U2F Documentation](/apis/resources/user_service/user-service-verify-u-2-f-registration)
|
More detailed information about the API: [Verify U2F Documentation](/apis/resources/user_service_v2/user-service-verify-u-2-f-registration)
|
||||||
|
|
||||||
Example Request:
|
Example Request:
|
||||||
|
|
||||||
@ -491,7 +491,7 @@ In the creat session request you can check for the user and directly initiate th
|
|||||||
For U2F you can choose between "USER_VERIFICATION_REQUIREMENT_PREFERRED" and "USER_VERIFICATION_REQUIREMENT_DISCOURAGED" for the challenge.
|
For U2F you can choose between "USER_VERIFICATION_REQUIREMENT_PREFERRED" and "USER_VERIFICATION_REQUIREMENT_DISCOURAGED" for the challenge.
|
||||||
Best practice is using discouraged, as this doesn't require the user to enter a PIN. With `preferred` the user might be prompted for the PIN, but it is not necessary.
|
Best practice is using discouraged, as this doesn't require the user to enter a PIN. With `preferred` the user might be prompted for the PIN, but it is not necessary.
|
||||||
|
|
||||||
More detailed information about the API: [Create new session Documentation](/apis/resources/session_service/session-service-create-session)
|
More detailed information about the API: [Create new session Documentation](/apis/resources/session_service_v2/session-service-create-session)
|
||||||
|
|
||||||
Example Request
|
Example Request
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ The endpoint will redirect you to the domain of your UI on the path /login and a
|
|||||||
### Get Auth Request by ID
|
### Get Auth Request by ID
|
||||||
|
|
||||||
With the ID from the redirect before you will now be able to get the information of the auth request.
|
With the ID from the redirect before you will now be able to get the information of the auth request.
|
||||||
[Get Auth Request By ID Documentation](/docs/apis/resources/oidc_service/oidc-service-get-auth-request)
|
[Get Auth Request By ID Documentation](/docs/apis/resources/oidc_service_v2/oidc-service-get-auth-request)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl --request GET \
|
curl --request GET \
|
||||||
@ -80,7 +80,7 @@ Response Example:
|
|||||||
### Perform Login
|
### Perform Login
|
||||||
|
|
||||||
After you have initialized the OIDC flow you can implement the login.
|
After you have initialized the OIDC flow you can implement the login.
|
||||||
Implement all the steps you like the user the go trough by [creating](/docs/apis/resources/session_service/session-service-create-session) and [updating](/docs/apis/resources/session_service/session-service-set-session) the user-session.
|
Implement all the steps you like the user the go trough by [creating](/docs/apis/resources/session_service_v2/session-service-create-session) and [updating](/docs/apis/resources/session_service/session-service-set-session) the user-session.
|
||||||
|
|
||||||
Read the following resources for more information about the different checks:
|
Read the following resources for more information about the different checks:
|
||||||
- [Username and Password](./username-password)
|
- [Username and Password](./username-password)
|
||||||
@ -95,7 +95,7 @@ On the create and update user session request you will always get a session toke
|
|||||||
|
|
||||||
The latest session token has to be sent to the following request:
|
The latest session token has to be sent to the following request:
|
||||||
|
|
||||||
Read more about the [Finalize Auth Request Documentation](/docs/apis/resources/oidc_service/oidc-service-create-callback)
|
Read more about the [Finalize Auth Request Documentation](/docs/apis/resources/oidc_service_v2/oidc-service-create-callback)
|
||||||
|
|
||||||
Make sure that the authorization header is from the same account that you originally sent in the client id header ```x-zitadel-login-client: <userid>``` on the authorize endpoint.
|
Make sure that the authorization header is from the same account that you originally sent in the client id header ```x-zitadel-login-client: <userid>``` on the authorize endpoint.
|
||||||
```bash
|
```bash
|
||||||
@ -145,4 +145,4 @@ In case the ZITADEL backend is not able to determine which session to terminate
|
|||||||
|
|
||||||
```/logout?post_logout_redirect=```
|
```/logout?post_logout_redirect=```
|
||||||
|
|
||||||
Prompt the user to select a session, terminate it using the [corresponding endpoint](/docs/apis/resources/session_service/session-service-delete-session) and send the user to the `post_logout_redirect` URL.
|
Prompt the user to select a session, terminate it using the [corresponding endpoint](/docs/apis/resources/session_service_v2/session-service-delete-session) and send the user to the `post_logout_redirect` URL.
|
||||||
|
@ -27,7 +27,7 @@ When you want to send a link to your user, that enables them to register a new p
|
|||||||
|
|
||||||
If you asked ZITADEL to send the link to the user please make sure to populate the link with the needed values that point towards your registration UI.
|
If you asked ZITADEL to send the link to the user please make sure to populate the link with the needed values that point towards your registration UI.
|
||||||
|
|
||||||
More detailed information about the API: [Send Registration Link Documentation](/apis/resources/user_service/user-service-create-passkey-registration-link)
|
More detailed information about the API: [Send Registration Link Documentation](/apis/resources/user_service_v2/user-service-create-passkey-registration-link)
|
||||||
|
|
||||||
Request Example:
|
Request Example:
|
||||||
Send either the sendLink or the returnCode (empty message) in the request body, depending on the use case you have.
|
Send either the sendLink or the returnCode (empty message) in the request body, depending on the use case you have.
|
||||||
@ -74,7 +74,7 @@ By specifying the authenticator type you can choose if the passkey should be cro
|
|||||||
|
|
||||||
The API response will provide you the public key credential options, this will be used by the browser to obtain a signed challenge.
|
The API response will provide you the public key credential options, this will be used by the browser to obtain a signed challenge.
|
||||||
|
|
||||||
More detailed information about the API: [Start Passkey Registration Documentation](/apis/resources/user_service/user-service-register-passkey)
|
More detailed information about the API: [Start Passkey Registration Documentation](/apis/resources/user_service_v2/user-service-register-passkey)
|
||||||
|
|
||||||
Request Example:
|
Request Example:
|
||||||
The code only has to be filled if the user did get a registration code.
|
The code only has to be filled if the user did get a registration code.
|
||||||
@ -179,7 +179,7 @@ Include the public key credential you got from the browser in your request.
|
|||||||
You can give the Passkey a name, which makes it easier for the user to identify the registered authentication methods.
|
You can give the Passkey a name, which makes it easier for the user to identify the registered authentication methods.
|
||||||
Example: Google Pixel, iCloud Keychain, Yubikey, etc
|
Example: Google Pixel, iCloud Keychain, Yubikey, etc
|
||||||
|
|
||||||
More detailed information about the API: [Verify Passkey Registration Documentation](/apis/resources/user_service/user-service-verify-passkey-registration)
|
More detailed information about the API: [Verify Passkey Registration Documentation](/apis/resources/user_service_v2/user-service-verify-passkey-registration)
|
||||||
|
|
||||||
Example Request:
|
Example Request:
|
||||||
|
|
||||||
@ -218,7 +218,7 @@ First step is to ask the user for his username and create a new session with the
|
|||||||
When creating the new session make sure to include the challenge for passkey, resp. webAuthN with a required user verification and the domain of your login UI.
|
When creating the new session make sure to include the challenge for passkey, resp. webAuthN with a required user verification and the domain of your login UI.
|
||||||
The response will include the public key credential request options for the passkey in the challenges.
|
The response will include the public key credential request options for the passkey in the challenges.
|
||||||
|
|
||||||
More detailed information about the API: [Create Session Documentation](/apis/resources/session_service/session-service-create-session)
|
More detailed information about the API: [Create Session Documentation](/apis/resources/session_service_v2/session-service-create-session)
|
||||||
|
|
||||||
Example Request:
|
Example Request:
|
||||||
```bash
|
```bash
|
||||||
|
@ -16,7 +16,7 @@ The goal is to send the user a verification code, which can be entered to verify
|
|||||||
|
|
||||||
There are two possible ways: You can either let ZITADEL send the notification with the verification code, or you can ask ZITADEL for returning the code and send the email by yourself.
|
There are two possible ways: You can either let ZITADEL send the notification with the verification code, or you can ask ZITADEL for returning the code and send the email by yourself.
|
||||||
|
|
||||||
[Request Password Reset Documentation](/apis/resources/user_service/user-service-password-reset)
|
[Request Password Reset Documentation](/apis/resources/user_service_v2/user-service-password-reset)
|
||||||
|
|
||||||
### ZITADEL sends the verification message
|
### ZITADEL sends the verification message
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ From a user experience perspective it is nice to prefill the verification code,
|
|||||||
As soon as the user has typed the new password, you can send the change password request.
|
As soon as the user has typed the new password, you can send the change password request.
|
||||||
The change password request allows you to set a new password for the user.
|
The change password request allows you to set a new password for the user.
|
||||||
|
|
||||||
[Change Password Documentation](/apis/resources/user_service/user-service-set-password)
|
[Change Password Documentation](/apis/resources/user_service_v2/user-service-set-password)
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
This request can be used in the password reset flow as well as to let your user change the password manually.
|
This request can be used in the password reset flow as well as to let your user change the password manually.
|
||||||
|
@ -46,8 +46,8 @@ If a user successfully authenticated using username and password, a session coul
|
|||||||
Your application would then need to check whether these `factors` are enough, esp. if the `verifiedAt` of both are within
|
Your application would then need to check whether these `factors` are enough, esp. if the `verifiedAt` of both are within
|
||||||
an acceptable time range.
|
an acceptable time range.
|
||||||
|
|
||||||
To get the current state of the session, you can call the [GetSession endpoint](/apis/resources/session_service/session-service-get-session),
|
To get the current state of the session, you can call the [GetSession endpoint](/apis/resources/session_service_v2/session-service-get-session),
|
||||||
resp. you can get several by [searching sessions](/apis/resources/session_service/session-service-list-sessions).
|
resp. you can get several by [searching sessions](/apis/resources/session_service_v2/session-service-list-sessions).
|
||||||
|
|
||||||
## Expiration
|
## Expiration
|
||||||
|
|
||||||
|
@ -9,10 +9,11 @@ The typescript repository contains all TypeScript and JavaScript packages and ap
|
|||||||
## Included Apps And Packages
|
## Included Apps And Packages
|
||||||
|
|
||||||
- **[login](./typescript-repo#new-login-ui)**: The future login UI used by ZITADEL Cloud, powered by Next.js
|
- **[login](./typescript-repo#new-login-ui)**: The future login UI used by ZITADEL Cloud, powered by Next.js
|
||||||
- `@zitadel/server`: core components for establishing node client connection, grpc stub
|
- `@zitadel/proto`: Typescript implementation of Protocol Buffers, suitable for web browsers and Node.js.
|
||||||
- `@zitadel/client`: core components for establishing web client connection, grpc stub
|
- `@zitadel/client`: Core components for establishing a client connection
|
||||||
- `@zitadel/react`: shared React utilities and components built with Tailwind CSS
|
- `@zitadel/node`: Core components for establishing a server connection
|
||||||
- `@zitadel/next`: shared Next.js utilities
|
- `@zitadel/react`: Shared React Utilities and components built with Tailwind CSS
|
||||||
|
- `@zitadel/next`: Shared Next.js Utilities
|
||||||
- `@zitadel/tsconfig`: shared `tsconfig.json`s used throughout the monorepo
|
- `@zitadel/tsconfig`: shared `tsconfig.json`s used throughout the monorepo
|
||||||
- `eslint-config-zitadel`: ESLint preset
|
- `eslint-config-zitadel`: ESLint preset
|
||||||
|
|
||||||
@ -43,14 +44,14 @@ _Note that the illustration is just a representation of the architecture and may
|
|||||||
The flow starts by the `/authorize` endpoint which is intercepted by the login and forwarded to ZITADEL.
|
The flow starts by the `/authorize` endpoint which is intercepted by the login and forwarded to ZITADEL.
|
||||||
ZITADEL interprets the request and specifically redirects back to the login app.
|
ZITADEL interprets the request and specifically redirects back to the login app.
|
||||||
It does so by redirecting to `/login`.
|
It does so by redirecting to `/login`.
|
||||||
The login is then able to load an [AuthRequest](/docs/apis/resources/oidc_service/oidc-service-get-auth-request#get-oidc-auth-request-details).
|
The login is then able to load an [AuthRequest](/docs/apis/resources/oidc_service_v2/oidc-service-get-auth-request#get-oidc-auth-request-details).
|
||||||
|
|
||||||
The Auth Request defines how users proceed to authenticate. If no special prompts or scopes are set, the login brings up the `/loginname` page.
|
The Auth Request defines how users proceed to authenticate. If no special prompts or scopes are set, the login brings up the `/loginname` page.
|
||||||
The /loginname page allows to enter loginname or email of a user. User discovery is implemented at /api/loginname and if the user is found, they will be redirected to the available authentication method page.
|
The /loginname page allows to enter loginname or email of a user. User discovery is implemented at /api/loginname and if the user is found, they will be redirected to the available authentication method page.
|
||||||
Right after the user is found, a session is created and set as cookie.
|
Right after the user is found, a session is created and set as cookie.
|
||||||
This cookie is then hydrated with more information once the users continues.
|
This cookie is then hydrated with more information once the users continues.
|
||||||
The OIDC Auth request is always passed in the url to have a context to the ongoing authentication flow.
|
The OIDC Auth request is always passed in the url to have a context to the ongoing authentication flow.
|
||||||
If enough user information is retrieved and the user is authenticated according to the policies, the flow is finalized by [requesting a the callback url](/docs/apis/resources/oidc_service/oidc-service-create-callback) for the auth request and the user is redirected back to the application.
|
If enough user information is retrieved and the user is authenticated according to the policies, the flow is finalized by [requesting a the callback url](/docs/apis/resources/oidc_service_v2/oidc-service-create-callback) for the auth request and the user is redirected back to the application.
|
||||||
The application can then request a token calling the /token endpoint of the login which is proxied to the ZITADEL API.
|
The application can then request a token calling the /token endpoint of the login which is proxied to the ZITADEL API.
|
||||||
|
|
||||||
### Implemented features
|
### Implemented features
|
||||||
@ -69,7 +70,7 @@ The application can then request a token calling the /token endpoint of the logi
|
|||||||
- Scopes
|
- Scopes
|
||||||
- [x] `openid email profile address``
|
- [x] `openid email profile address``
|
||||||
- [x] `offline access`
|
- [x] `offline access`
|
||||||
- [ ] `urn:zitadel:iam:org:idp:id:{idp_id}`
|
- [x] `urn:zitadel:iam:org:idp:id:{idp_id}`
|
||||||
- [x] `urn:zitadel:iam:org:project:id:zitadel:aud`
|
- [x] `urn:zitadel:iam:org:project:id:zitadel:aud`
|
||||||
- [x] `urn:zitadel:iam:org:id:{orgid}`
|
- [x] `urn:zitadel:iam:org:id:{orgid}`
|
||||||
- [x] `urn:zitadel:iam:org:domain:primary:{domain}`
|
- [x] `urn:zitadel:iam:org:domain:primary:{domain}`
|
||||||
|
@ -10,7 +10,7 @@ sidebar_label: Username and Password
|
|||||||
## Register
|
## Register
|
||||||
|
|
||||||
First, we create a new user with a username and password. In the example below we add a user with profile data, a verified email address, and a password.
|
First, we create a new user with a username and password. In the example below we add a user with profile data, a verified email address, and a password.
|
||||||
[Create User Documentation](/apis/resources/user_service/user-service-add-human-user)
|
[Create User Documentation](/apis/resources/user_service_v2/user-service-add-human-user)
|
||||||
|
|
||||||
### Custom Fields
|
### Custom Fields
|
||||||
|
|
||||||
@ -88,8 +88,8 @@ Return Code:
|
|||||||
|
|
||||||
To check what is allowed on your instance, call the settings service for more information.
|
To check what is allowed on your instance, call the settings service for more information.
|
||||||
The following requests can be useful for registration:
|
The following requests can be useful for registration:
|
||||||
- [Get Login Settings](/apis/resources/settings_service/settings-service-get-login-settings) To find out which authentication possibilities are enabled (password, identity provider, etc.)
|
- [Get Login Settings](/apis/resources/settings_service_v2/settings-service-get-login-settings) To find out which authentication possibilities are enabled (password, identity provider, etc.)
|
||||||
- [Get Password Complexity Settings](/apis/resources/settings_service/settings-service-get-password-complexity-settings) to find out how the password should look like (length, characters, etc.)
|
- [Get Password Complexity Settings](/apis/resources/settings_service_v2/settings-service-get-password-complexity-settings) to find out how the password should look like (length, characters, etc.)
|
||||||
|
|
||||||
## Create Session with User Check
|
## Create Session with User Check
|
||||||
|
|
||||||
@ -103,9 +103,9 @@ The create and update session endpoints will always return a session ID and an o
|
|||||||
If you do not rely on the OIDC standard you can directly use the token.
|
If you do not rely on the OIDC standard you can directly use the token.
|
||||||
Send it to the Get Session Endpoint to find out how the user has authenticated.
|
Send it to the Get Session Endpoint to find out how the user has authenticated.
|
||||||
|
|
||||||
- [Create new session Documentation](/apis/resources/session_service/session-service-create-session)
|
- [Create new session Documentation](/apis/resources/session_service_v2/session-service-create-session)
|
||||||
- [Update an existing session Documentation](/apis/resources/session_service/session-service-set-session)
|
- [Update an existing session Documentation](/apis/resources/session_service_v2/session-service-set-session)
|
||||||
- [Get Session Documentation](/apis/resources/session_service/session-service-get-session)
|
- [Get Session Documentation](/apis/resources/session_service_v2/session-service-get-session)
|
||||||
|
|
||||||
### Request
|
### Request
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ There are more [differences between SAML and OIDC](https://zitadel.com/blog/saml
|
|||||||
|
|
||||||
### ZITADEL's Session API
|
### ZITADEL's Session API
|
||||||
|
|
||||||
ZITADEL's [Session API](/docs/apis/resources/session_service) provides developers with a straightforward method to manage user sessions within their applications.
|
ZITADEL's [Session API](/docs/apis/resources/session_service_v2) provides developers with a straightforward method to manage user sessions within their applications.
|
||||||
The Session API is not an industry-standard and can be used instead of OpenID Connect or SAML to authenticate users by [building your own custom login user interface](/docs/guides/integrate/login-ui).
|
The Session API is not an industry-standard and can be used instead of OpenID Connect or SAML to authenticate users by [building your own custom login user interface](/docs/guides/integrate/login-ui).
|
||||||
|
|
||||||
#### Tokens in the Session API
|
#### Tokens in the Session API
|
||||||
|
@ -119,7 +119,7 @@ You can find all the guides here: [Build your own login UI](/docs/guides/integra
|
|||||||
|
|
||||||
#### Custom fields
|
#### Custom fields
|
||||||
|
|
||||||
The [create user request](/docs/apis/resources/user_service/user-service-add-human-user) also allows you to add [metadata](/docs/guides/manage/customize/user-metadata) (key, value) to the user.
|
The [create user request](/docs/apis/resources/user_service_v2/user-service-add-human-user) also allows you to add [metadata](/docs/guides/manage/customize/user-metadata) (key, value) to the user.
|
||||||
This gives you the possibility to collect additional data from your users during the registration process and store it directly to the user in ZITADEL.
|
This gives you the possibility to collect additional data from your users during the registration process and store it directly to the user in ZITADEL.
|
||||||
Those metadata can also directly be included in the [token](/docs/guides/manage/customize/user-metadata#use-tokens-to-get-user-metadata) of the user.
|
Those metadata can also directly be included in the [token](/docs/guides/manage/customize/user-metadata#use-tokens-to-get-user-metadata) of the user.
|
||||||
We recommend storing business relevant data in the database of your application, and only authentication and authorization relevant data in ZITADEL to follow the separation of concern pattern.
|
We recommend storing business relevant data in the database of your application, and only authentication and authorization relevant data in ZITADEL to follow the separation of concern pattern.
|
||||||
|
@ -52,7 +52,7 @@ When planning your application consider the following questions about User Authe
|
|||||||
- Do you offer Login via Identity Provider?
|
- Do you offer Login via Identity Provider?
|
||||||
- Which languages do you have to provide?
|
- Which languages do you have to provide?
|
||||||
|
|
||||||
When looking at this questions, you may have to admit that building an Identity Management System is much more complex and complicated than you thought initially and implementing if yourself may be too much work.
|
When looking at these questions, you may have to admit that building an Identity Management System is much more complex and complicated than you thought initially and implementing if yourself may be too much work.
|
||||||
Particularly because you should focus building your applications.
|
Particularly because you should focus building your applications.
|
||||||
|
|
||||||
### Federation
|
### Federation
|
||||||
|
@ -56,7 +56,7 @@ Be aware that you won't automatically have the organizations context when you ac
|
|||||||
## Generated Subdomains
|
## Generated Subdomains
|
||||||
|
|
||||||
ZITADEL creates random subdomains for [each new virtual instance](/concepts/structure/instance#multiple-virtual-instances).
|
ZITADEL creates random subdomains for [each new virtual instance](/concepts/structure/instance#multiple-virtual-instances).
|
||||||
You can immediately access the ZITADEL Console an APIs using these subdomains without further actions.
|
You can immediately access the ZITADEL Console and APIs using these subdomains without further actions.
|
||||||
|
|
||||||
## More Information
|
## More Information
|
||||||
|
|
||||||
|
29
docs/docs/support/advisory/a10011.md
Normal file
29
docs/docs/support/advisory/a10011.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
title: Technical Advisory 10011
|
||||||
|
---
|
||||||
|
|
||||||
|
## Date and Version
|
||||||
|
|
||||||
|
Version: 2.60.0
|
||||||
|
|
||||||
|
Date: TBD
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Version 2.60.0 allows more combinations in the identity provider options. As of now, **automatic creation** and **automatic linking options** were only considered if the corresponding **allowed option** (account creation / linking allowed) was enabled.
|
||||||
|
|
||||||
|
Starting with this release, this is no longer needed and allows administrators to address cases, where only an **automatic creation** is allowed, but users themselves should not be allowed to **manually** create new accounts using an identity provider or edit the information during the process.
|
||||||
|
Also, allowing users to only link to the proposed existing account is now possible with an enabled **automatic linking option**, while disabling **account linking allowed**.
|
||||||
|
|
||||||
|
## Statement
|
||||||
|
|
||||||
|
This change was tracked in the following PR:
|
||||||
|
[feat(idp): provide auto only options](https://github.com/zitadel/zitadel/pull/8420), which was released in Version [2.60.0](https://github.com/zitadel/zitadel/releases/tag/v2.60.0)
|
||||||
|
|
||||||
|
## Mitigation
|
||||||
|
|
||||||
|
If you previously enabled one of the **automatic** options with the corresponding **allowed** option, be sure that this is the intended behavior.
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
Once this update has been released and deployed, the **automatic** options can be activated with the corresponding **allowed** option.
|
@ -178,6 +178,18 @@ We understand that these advisories may include breaking changes, and we aim to
|
|||||||
<td>2.53.0</td>
|
<td>2.53.0</td>
|
||||||
<td>2024-05-28</td>
|
<td>2024-05-28</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="./advisory/a10011">A-10011</a>
|
||||||
|
</td>
|
||||||
|
<td>Identity Provider options: allow "auto" only</td>
|
||||||
|
<td>Breaking Behavior Change</td>
|
||||||
|
<td>
|
||||||
|
Version 2.60.0 allows more combinations in the identity provider options. Due to this there might be unexpected behavior changes.
|
||||||
|
</td>
|
||||||
|
<td>2.53.0</td>
|
||||||
|
<td>2024-05-28</td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
## Subscribe to our Mailing List
|
## Subscribe to our Mailing List
|
||||||
|
@ -333,13 +333,21 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
action_v3: {
|
action_v3: {
|
||||||
specPath: ".artifacts/openapi/zitadel/action/v3alpha/action_service.swagger.json",
|
specPath: ".artifacts/openapi/zitadel/resources/action/v3alpha/action_service.swagger.json",
|
||||||
outputDir: "docs/apis/resources/action_service_v3",
|
outputDir: "docs/apis/resources/action_service_v3",
|
||||||
sidebarOptions: {
|
sidebarOptions: {
|
||||||
groupPathsBy: "tag",
|
groupPathsBy: "tag",
|
||||||
categoryLinkSource: "auto",
|
categoryLinkSource: "auto",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
webkey_v3: {
|
||||||
|
specPath: ".artifacts/openapi/zitadel/resources/webkey/v3alpha/webkey_service.swagger.json",
|
||||||
|
outputDir: "docs/apis/resources/webkey_service_v3",
|
||||||
|
sidebarOptions: {
|
||||||
|
groupPathsBy: "tag",
|
||||||
|
categoryLinkSource: "auto",
|
||||||
|
},
|
||||||
|
},
|
||||||
feature_v2: {
|
feature_v2: {
|
||||||
specPath: ".artifacts/openapi/zitadel/feature/v2/feature_service.swagger.json",
|
specPath: ".artifacts/openapi/zitadel/feature/v2/feature_service.swagger.json",
|
||||||
outputDir: "docs/apis/resources/feature_service_v2",
|
outputDir: "docs/apis/resources/feature_service_v2",
|
||||||
@ -348,6 +356,22 @@ module.exports = {
|
|||||||
categoryLinkSource: "auto",
|
categoryLinkSource: "auto",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
org_v2: {
|
||||||
|
specPath: ".artifacts/openapi/zitadel/org/v2/org_service.swagger.json",
|
||||||
|
outputDir: "docs/apis/resources/org_service_v2",
|
||||||
|
sidebarOptions: {
|
||||||
|
groupPathsBy: "tag",
|
||||||
|
categoryLinkSource: "auto",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
idp_v2: {
|
||||||
|
specPath: ".artifacts/openapi/zitadel/idp/v2/idp_service.swagger.json",
|
||||||
|
outputDir: "docs/apis/resources/idp_service_v2",
|
||||||
|
sidebarOptions: {
|
||||||
|
groupPathsBy: "tag",
|
||||||
|
categoryLinkSource: "auto",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
@ -673,12 +673,36 @@ module.exports = {
|
|||||||
link: {
|
link: {
|
||||||
type: "generated-index",
|
type: "generated-index",
|
||||||
title: "Feature Service API",
|
title: "Feature Service API",
|
||||||
slug: "/apis/resources/feature_service/v2",
|
slug: "/apis/resources/feature_service_v2",
|
||||||
description:
|
description:
|
||||||
'This API is intended to manage features for ZITADEL. Feature settings that are available on multiple "levels", such as instance and organization. The higher level instance acts as a default for the lower level. When a feature is set on multiple levels, the lower level takes precedence. Features can be experimental where ZITADEL will assume a sane default, such as disabled. When over time confidence in such a feature grows, ZITADEL can default to enabling the feature. As a final step we might choose to always enable a feature and remove the setting from this API, reserving the proto field number. Such removal is not considered a breaking change. Setting a removed field will effectively result in a no-op.\n'
|
'This API is intended to manage features for ZITADEL. Feature settings that are available on multiple "levels", such as instance and organization. The higher level instance acts as a default for the lower level. When a feature is set on multiple levels, the lower level takes precedence. Features can be experimental where ZITADEL will assume a sane default, such as disabled. When over time confidence in such a feature grows, ZITADEL can default to enabling the feature. As a final step we might choose to always enable a feature and remove the setting from this API, reserving the proto field number. Such removal is not considered a breaking change. Setting a removed field will effectively result in a no-op.\n'
|
||||||
},
|
},
|
||||||
items: require("./docs/apis/resources/feature_service_v2/sidebar.ts"),
|
items: require("./docs/apis/resources/feature_service_v2/sidebar.ts"),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: "category",
|
||||||
|
label: "Organization Lifecycle",
|
||||||
|
link: {
|
||||||
|
type: "generated-index",
|
||||||
|
title: "Organization Service API",
|
||||||
|
slug: "/apis/resources/org_service/v2",
|
||||||
|
description:
|
||||||
|
'This API is intended to manage organizations for ZITADEL. \n'
|
||||||
|
},
|
||||||
|
items: require("./docs/apis/resources/org_service_v2/sidebar.ts"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "category",
|
||||||
|
label: "Identity Provider Lifecycle",
|
||||||
|
link: {
|
||||||
|
type: "generated-index",
|
||||||
|
title: "Identity Provider Service API",
|
||||||
|
slug: "/apis/resources/idp_service_v2",
|
||||||
|
description:
|
||||||
|
'This API is intended to manage identity providers (IdPs) for ZITADEL.\n'
|
||||||
|
},
|
||||||
|
items: require("./docs/apis/resources/idp_service_v2/sidebar.ts"),
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -732,6 +756,20 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
items: require("./docs/apis/resources/action_service_v3/sidebar.ts"),
|
items: require("./docs/apis/resources/action_service_v3/sidebar.ts"),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: "category",
|
||||||
|
label: "Web key Lifecycle (Preview)",
|
||||||
|
link: {
|
||||||
|
type: "generated-index",
|
||||||
|
title: "Web Key Service API (Preview)",
|
||||||
|
slug: "/apis/resources/webkey_service_v3",
|
||||||
|
description:
|
||||||
|
"This API is intended to manage web keys for a ZITADEL instance, used to sign and validate OIDC tokens.\n" +
|
||||||
|
"\n" +
|
||||||
|
"This project is in preview state. It can AND will continue breaking until a stable version is released.",
|
||||||
|
},
|
||||||
|
items: require("./docs/apis/resources/webkey_service_v3/sidebar.ts"),
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -25,8 +25,9 @@ describe('organizations', () => {
|
|||||||
|
|
||||||
it('should delete an org', () => {
|
it('should delete an org', () => {
|
||||||
cy.visit(orgsPath);
|
cy.visit(orgsPath);
|
||||||
|
cy.wait(2000);
|
||||||
cy.contains('tr', newOrg).click();
|
cy.contains('tr', newOrg).click();
|
||||||
cy.wait(3000);
|
cy.wait(1000);
|
||||||
cy.get('[data-e2e="actions"]').click();
|
cy.get('[data-e2e="actions"]').click();
|
||||||
cy.get('[data-e2e="delete"]', { timeout: 1000 }).should('be.visible').click();
|
cy.get('[data-e2e="delete"]', { timeout: 1000 }).should('be.visible').click();
|
||||||
cy.get('[data-e2e="confirm-dialog-input"]').focus().clear().type(newOrg);
|
cy.get('[data-e2e="confirm-dialog-input"]').focus().clear().type(newOrg);
|
||||||
|
@ -1,24 +1,27 @@
|
|||||||
import { ensureExternalLinksSettingsSet } from 'support/api/external-links-settings';
|
import { ensureExternalLinksSettingsSet } from 'support/api/external-links-settings';
|
||||||
import { apiAuth } from '../../support/api/apiauth';
|
import { apiAuth } from '../../support/api/apiauth';
|
||||||
|
|
||||||
describe('instance external link settings', () => {
|
describe('external link settings', () => {
|
||||||
const externalLinkSettingsPath = `/instance?id=privacypolicy`;
|
const tosLink = '';
|
||||||
|
const privacyPolicyLink = '';
|
||||||
const tosLink = 'https://zitadel.com/docs/legal/terms-of-service';
|
|
||||||
const privacyPolicyLink = 'https://zitadel.com/docs/legal/privacy-policy';
|
|
||||||
const helpLink = '';
|
const helpLink = '';
|
||||||
const supportEmail = '';
|
const supportEmail = '';
|
||||||
const customLink = '';
|
const customLink = '';
|
||||||
const customLinkText = '';
|
const customLinkText = '';
|
||||||
const docsLink = 'https://zitadel.com/docs';
|
const docsLink = 'https://zitadel.com/docs';
|
||||||
|
|
||||||
beforeEach(`ensure they are set`, () => {
|
beforeEach(`reset`, () => {
|
||||||
apiAuth().then((apiCallProperties) => {
|
apiAuth().then((apiCallProperties) => {
|
||||||
ensureExternalLinksSettingsSet(apiCallProperties, tosLink, privacyPolicyLink, docsLink);
|
ensureExternalLinksSettingsSet(apiCallProperties, tosLink, privacyPolicyLink, docsLink);
|
||||||
cy.visit(externalLinkSettingsPath);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('instance', () => {
|
||||||
|
|
||||||
|
beforeEach(`visit`, () => {
|
||||||
|
cy.visit(`/instance?id=privacypolicy`);
|
||||||
|
});
|
||||||
|
|
||||||
it(`should have default settings`, () => {
|
it(`should have default settings`, () => {
|
||||||
cy.get('[formcontrolname="tosLink"]').should('value', tosLink);
|
cy.get('[formcontrolname="tosLink"]').should('value', tosLink);
|
||||||
cy.get('[formcontrolname="privacyLink"]').should('value', privacyPolicyLink);
|
cy.get('[formcontrolname="privacyLink"]').should('value', privacyPolicyLink);
|
||||||
@ -52,20 +55,9 @@ describe('instance external link settings', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('instance external link settings', () => {
|
describe('org', () => {
|
||||||
const externalLinkSettingsPath = `/org-settings?id=privacypolicy`;
|
beforeEach(`visit`, () => {
|
||||||
|
cy.visit(`/org-settings?id=privacypolicy`);
|
||||||
const tosLink = 'https://zitadel.com/docs/legal/terms-of-service';
|
|
||||||
const privacyPolicyLink = 'https://zitadel.com/docs/legal/privacy-policy';
|
|
||||||
const helpLink = '';
|
|
||||||
const supportEmail = '';
|
|
||||||
const customLink = '';
|
|
||||||
const customLinkText = '';
|
|
||||||
const docsLink = 'https://zitadel.com/docs';
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.context().as('ctx');
|
|
||||||
cy.visit(externalLinkSettingsPath);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should have default settings`, () => {
|
it(`should have default settings`, () => {
|
||||||
@ -102,3 +94,5 @@ describe('instance external link settings', () => {
|
|||||||
cy.get('[formcontrolname="docsLink"]').should('value', docsLink);
|
cy.get('[formcontrolname="docsLink"]').should('value', docsLink);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
@ -11,12 +11,11 @@ export function ensureExternalLinksSettingsSet(api: API, tosLink: string, privac
|
|||||||
id: body.policy.id,
|
id: body.policy.id,
|
||||||
entity: null,
|
entity: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (
|
if (
|
||||||
body.policy &&
|
body.policy &&
|
||||||
body.policy.tosLink === tosLink &&
|
(body.policy.tosLink || '') === tosLink &&
|
||||||
body.policy.privacyLink === privacyPolicyLink &&
|
(body.policy.privacyLink || '') === privacyPolicyLink &&
|
||||||
body.policy.docsLink === docsLink
|
(body.policy.docsLink || '') === docsLink
|
||||||
) {
|
) {
|
||||||
return { ...result, entity: body.policy };
|
return { ...result, entity: body.policy };
|
||||||
}
|
}
|
||||||
|
3
go.mod
3
go.mod
@ -3,6 +3,7 @@ module github.com/zitadel/zitadel
|
|||||||
go 1.22.2
|
go 1.22.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
cloud.google.com/go/profiler v0.4.1
|
||||||
cloud.google.com/go/storage v1.43.0
|
cloud.google.com/go/storage v1.43.0
|
||||||
github.com/BurntSushi/toml v1.4.0
|
github.com/BurntSushi/toml v1.4.0
|
||||||
github.com/DATA-DOG/go-sqlmock v1.5.2
|
github.com/DATA-DOG/go-sqlmock v1.5.2
|
||||||
@ -103,7 +104,7 @@ require (
|
|||||||
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
|
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/protobuf v1.5.4 // indirect
|
||||||
github.com/google/go-tpm v0.9.0 // indirect
|
github.com/google/go-tpm v0.9.0 // indirect
|
||||||
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd // indirect
|
github.com/google/pprof v0.0.0-20240528025155-186aa0362fba // indirect
|
||||||
github.com/google/s2a-go v0.1.7 // indirect
|
github.com/google/s2a-go v0.1.7 // indirect
|
||||||
github.com/jackc/puddle/v2 v2.2.1 // indirect
|
github.com/jackc/puddle/v2 v2.2.1 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
|
||||||
|
6
go.sum
6
go.sum
@ -16,6 +16,8 @@ cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuA
|
|||||||
cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng=
|
cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng=
|
||||||
cloud.google.com/go/monitoring v1.19.0 h1:NCXf8hfQi+Kmr56QJezXRZ6GPb80ZI7El1XztyUuLQI=
|
cloud.google.com/go/monitoring v1.19.0 h1:NCXf8hfQi+Kmr56QJezXRZ6GPb80ZI7El1XztyUuLQI=
|
||||||
cloud.google.com/go/monitoring v1.19.0/go.mod h1:25IeMR5cQ5BoZ8j1eogHE5VPJLlReQ7zFp5OiLgiGZw=
|
cloud.google.com/go/monitoring v1.19.0/go.mod h1:25IeMR5cQ5BoZ8j1eogHE5VPJLlReQ7zFp5OiLgiGZw=
|
||||||
|
cloud.google.com/go/profiler v0.4.1 h1:Q7+lOvikTGMJ/IAWocpYYGit4SIIoILmVZfEEWTORSY=
|
||||||
|
cloud.google.com/go/profiler v0.4.1/go.mod h1:LBrtEX6nbvhv1w/e5CPZmX9ajGG9BGLtGbv56Tg4SHs=
|
||||||
cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
|
cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
|
||||||
cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
|
cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
|
||||||
cloud.google.com/go/trace v1.10.7 h1:gK8z2BIJQ3KIYGddw9RJLne5Fx0FEXkrEQzPaeEYVvk=
|
cloud.google.com/go/trace v1.10.7 h1:gK8z2BIJQ3KIYGddw9RJLne5Fx0FEXkrEQzPaeEYVvk=
|
||||||
@ -313,8 +315,8 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
|||||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=
|
github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=
|
||||||
github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=
|
github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=
|
||||||
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=
|
github.com/google/pprof v0.0.0-20240528025155-186aa0362fba h1:ql1qNgCyOB7iAEk8JTNM+zJrgIbnyCKX/wdlyPufP5g=
|
||||||
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
|
github.com/google/pprof v0.0.0-20240528025155-186aa0362fba/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
|
github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
|
||||||
github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
|
github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
|
||||||
|
@ -61,7 +61,7 @@ func Trigger(ctx context.Context, orgID, userID string, trigger TriggerMethod, r
|
|||||||
authz.GetInstance(ctx).InstanceID(),
|
authz.GetInstance(ctx).InstanceID(),
|
||||||
orgID,
|
orgID,
|
||||||
userID,
|
userID,
|
||||||
http_utils.ComposedOrigin(ctx),
|
http_utils.DomainContext(ctx).Origin(), // TODO: origin?
|
||||||
trigger,
|
trigger,
|
||||||
ai.Method,
|
ai.Method,
|
||||||
ai.Path,
|
ai.Path,
|
||||||
@ -78,7 +78,7 @@ func TriggerGRPCWithContext(ctx context.Context, trigger TriggerMethod) {
|
|||||||
authz.GetInstance(ctx).InstanceID(),
|
authz.GetInstance(ctx).InstanceID(),
|
||||||
authz.GetCtxData(ctx).OrgID,
|
authz.GetCtxData(ctx).OrgID,
|
||||||
authz.GetCtxData(ctx).UserID,
|
authz.GetCtxData(ctx).UserID,
|
||||||
http_utils.ComposedOrigin(ctx),
|
http_utils.DomainContext(ctx).Origin(), // TODO: origin?
|
||||||
trigger,
|
trigger,
|
||||||
ai.Method,
|
ai.Method,
|
||||||
ai.Path,
|
ai.Path,
|
||||||
|
@ -32,7 +32,7 @@ type API struct {
|
|||||||
verifier internal_authz.APITokenVerifier
|
verifier internal_authz.APITokenVerifier
|
||||||
health healthCheck
|
health healthCheck
|
||||||
router *mux.Router
|
router *mux.Router
|
||||||
http1HostName string
|
hostHeaders []string
|
||||||
grpcGateway *server.Gateway
|
grpcGateway *server.Gateway
|
||||||
healthServer *health.Server
|
healthServer *health.Server
|
||||||
accessInterceptor *http_mw.AccessInterceptor
|
accessInterceptor *http_mw.AccessInterceptor
|
||||||
@ -75,7 +75,8 @@ func New(
|
|||||||
verifier internal_authz.APITokenVerifier,
|
verifier internal_authz.APITokenVerifier,
|
||||||
authZ internal_authz.Config,
|
authZ internal_authz.Config,
|
||||||
tlsConfig *tls.Config,
|
tlsConfig *tls.Config,
|
||||||
http2HostName, http1HostName, externalDomain string,
|
externalDomain string,
|
||||||
|
hostHeaders []string,
|
||||||
accessInterceptor *http_mw.AccessInterceptor,
|
accessInterceptor *http_mw.AccessInterceptor,
|
||||||
) (_ *API, err error) {
|
) (_ *API, err error) {
|
||||||
api := &API{
|
api := &API{
|
||||||
@ -83,13 +84,13 @@ func New(
|
|||||||
verifier: verifier,
|
verifier: verifier,
|
||||||
health: queries,
|
health: queries,
|
||||||
router: router,
|
router: router,
|
||||||
http1HostName: http1HostName,
|
|
||||||
queries: queries,
|
queries: queries,
|
||||||
accessInterceptor: accessInterceptor,
|
accessInterceptor: accessInterceptor,
|
||||||
|
hostHeaders: hostHeaders,
|
||||||
}
|
}
|
||||||
|
|
||||||
api.grpcServer = server.CreateServer(api.verifier, authZ, queries, http2HostName, externalDomain, tlsConfig, accessInterceptor.AccessService())
|
api.grpcServer = server.CreateServer(api.verifier, authZ, queries, externalDomain, tlsConfig, accessInterceptor.AccessService())
|
||||||
api.grpcGateway, err = server.CreateGateway(ctx, port, http1HostName, accessInterceptor, tlsConfig)
|
api.grpcGateway, err = server.CreateGateway(ctx, port, hostHeaders, accessInterceptor, tlsConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -112,9 +113,8 @@ func (a *API) RegisterServer(ctx context.Context, grpcServer server.WithGatewayP
|
|||||||
ctx,
|
ctx,
|
||||||
grpcServer,
|
grpcServer,
|
||||||
a.port,
|
a.port,
|
||||||
a.http1HostName,
|
a.hostHeaders,
|
||||||
a.accessInterceptor,
|
a.accessInterceptor,
|
||||||
a.queries,
|
|
||||||
tlsConfig,
|
tlsConfig,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -55,9 +55,9 @@ func (h *Handler) Storage() static.Storage {
|
|||||||
return h.storage
|
return h.storage
|
||||||
}
|
}
|
||||||
|
|
||||||
func AssetAPI(externalSecure bool) func(context.Context) string {
|
func AssetAPI() func(context.Context) string {
|
||||||
return func(ctx context.Context) string {
|
return func(ctx context.Context) string {
|
||||||
return http_util.BuildOrigin(authz.GetInstance(ctx).RequestedHost(), externalSecure) + HandlerPrefix
|
return http_util.DomainContext(ctx).Origin() + HandlerPrefix
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,8 +18,6 @@ type Instance interface {
|
|||||||
ProjectID() string
|
ProjectID() string
|
||||||
ConsoleClientID() string
|
ConsoleClientID() string
|
||||||
ConsoleApplicationID() string
|
ConsoleApplicationID() string
|
||||||
RequestedDomain() string
|
|
||||||
RequestedHost() string
|
|
||||||
DefaultLanguage() language.Tag
|
DefaultLanguage() language.Tag
|
||||||
DefaultOrganisationID() string
|
DefaultOrganisationID() string
|
||||||
SecurityPolicyAllowedOrigins() []string
|
SecurityPolicyAllowedOrigins() []string
|
||||||
@ -30,8 +28,8 @@ type Instance interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type InstanceVerifier interface {
|
type InstanceVerifier interface {
|
||||||
InstanceByHost(ctx context.Context, host string) (Instance, error)
|
InstanceByHost(ctx context.Context, host, publicDomain string) (Instance, error)
|
||||||
InstanceByID(ctx context.Context) (Instance, error)
|
InstanceByID(ctx context.Context, id string) (Instance, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type instance struct {
|
type instance struct {
|
||||||
@ -68,14 +66,6 @@ func (i *instance) ConsoleApplicationID() string {
|
|||||||
return i.appID
|
return i.appID
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *instance) RequestedDomain() string {
|
|
||||||
return i.domain
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *instance) RequestedHost() string {
|
|
||||||
return i.domain
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *instance) DefaultLanguage() language.Tag {
|
func (i *instance) DefaultLanguage() language.Tag {
|
||||||
return language.Und
|
return language.Und
|
||||||
}
|
}
|
||||||
@ -116,16 +106,6 @@ func WithInstanceID(ctx context.Context, id string) context.Context {
|
|||||||
return context.WithValue(ctx, instanceKey, &instance{id: id})
|
return context.WithValue(ctx, instanceKey, &instance{id: id})
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithRequestedDomain(ctx context.Context, domain string) context.Context {
|
|
||||||
i, ok := ctx.Value(instanceKey).(*instance)
|
|
||||||
if !ok {
|
|
||||||
i = new(instance)
|
|
||||||
}
|
|
||||||
|
|
||||||
i.domain = domain
|
|
||||||
return context.WithValue(ctx, instanceKey, i)
|
|
||||||
}
|
|
||||||
|
|
||||||
func WithConsole(ctx context.Context, projectID, appID string) context.Context {
|
func WithConsole(ctx context.Context, projectID, appID string) context.Context {
|
||||||
i, ok := ctx.Value(instanceKey).(*instance)
|
i, ok := ctx.Value(instanceKey).(*instance)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -118,14 +118,6 @@ func (m *mockInstance) DefaultOrganisationID() string {
|
|||||||
return "orgID"
|
return "orgID"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *mockInstance) RequestedDomain() string {
|
|
||||||
return "zitadel.cloud"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockInstance) RequestedHost() string {
|
|
||||||
return "zitadel.cloud:443"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockInstance) SecurityPolicyAllowedOrigins() []string {
|
func (m *mockInstance) SecurityPolicyAllowedOrigins() []string {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,877 +0,0 @@
|
|||||||
//go:build integration
|
|
||||||
|
|
||||||
package action_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
"google.golang.org/protobuf/types/known/durationpb"
|
|
||||||
|
|
||||||
"github.com/zitadel/zitadel/internal/domain"
|
|
||||||
"github.com/zitadel/zitadel/internal/integration"
|
|
||||||
action "github.com/zitadel/zitadel/pkg/grpc/action/v3alpha"
|
|
||||||
"github.com/zitadel/zitadel/pkg/grpc/object/v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestServer_GetTargetByID(t *testing.T) {
|
|
||||||
ensureFeatureEnabled(t)
|
|
||||||
type args struct {
|
|
||||||
ctx context.Context
|
|
||||||
dep func(context.Context, *action.GetTargetByIDRequest, *action.GetTargetByIDResponse) error
|
|
||||||
req *action.GetTargetByIDRequest
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
want *action.GetTargetByIDResponse
|
|
||||||
wantErr bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "missing permission",
|
|
||||||
args: args{
|
|
||||||
ctx: Tester.WithAuthorization(context.Background(), integration.OrgOwner),
|
|
||||||
req: &action.GetTargetByIDRequest{},
|
|
||||||
},
|
|
||||||
wantErr: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "not found",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
req: &action.GetTargetByIDRequest{TargetId: "notexisting"},
|
|
||||||
},
|
|
||||||
wantErr: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "get, ok",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.GetTargetByIDRequest, response *action.GetTargetByIDResponse) error {
|
|
||||||
name := fmt.Sprint(time.Now().UnixNano() + 1)
|
|
||||||
resp := Tester.CreateTarget(ctx, t, name, "https://example.com", domain.TargetTypeWebhook, false)
|
|
||||||
request.TargetId = resp.GetId()
|
|
||||||
|
|
||||||
response.Target.TargetId = resp.GetId()
|
|
||||||
response.Target.Name = name
|
|
||||||
response.Target.Details.ResourceOwner = resp.GetDetails().GetResourceOwner()
|
|
||||||
response.Target.Details.ChangeDate = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Target.Details.Sequence = resp.GetDetails().GetSequence()
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.GetTargetByIDRequest{},
|
|
||||||
},
|
|
||||||
want: &action.GetTargetByIDResponse{
|
|
||||||
Target: &action.Target{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Endpoint: "https://example.com",
|
|
||||||
TargetType: &action.Target_RestWebhook{
|
|
||||||
RestWebhook: &action.SetRESTWebhook{},
|
|
||||||
},
|
|
||||||
Timeout: durationpb.New(10 * time.Second),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "get, async, ok",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.GetTargetByIDRequest, response *action.GetTargetByIDResponse) error {
|
|
||||||
name := fmt.Sprint(time.Now().UnixNano() + 1)
|
|
||||||
resp := Tester.CreateTarget(ctx, t, name, "https://example.com", domain.TargetTypeAsync, false)
|
|
||||||
request.TargetId = resp.GetId()
|
|
||||||
|
|
||||||
response.Target.TargetId = resp.GetId()
|
|
||||||
response.Target.Name = name
|
|
||||||
response.Target.Details.ResourceOwner = resp.GetDetails().GetResourceOwner()
|
|
||||||
response.Target.Details.ChangeDate = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Target.Details.Sequence = resp.GetDetails().GetSequence()
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.GetTargetByIDRequest{},
|
|
||||||
},
|
|
||||||
want: &action.GetTargetByIDResponse{
|
|
||||||
Target: &action.Target{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Endpoint: "https://example.com",
|
|
||||||
TargetType: &action.Target_RestAsync{
|
|
||||||
RestAsync: &action.SetRESTAsync{},
|
|
||||||
},
|
|
||||||
Timeout: durationpb.New(10 * time.Second),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "get, webhook interruptOnError, ok",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.GetTargetByIDRequest, response *action.GetTargetByIDResponse) error {
|
|
||||||
name := fmt.Sprint(time.Now().UnixNano() + 1)
|
|
||||||
resp := Tester.CreateTarget(ctx, t, name, "https://example.com", domain.TargetTypeWebhook, true)
|
|
||||||
request.TargetId = resp.GetId()
|
|
||||||
|
|
||||||
response.Target.TargetId = resp.GetId()
|
|
||||||
response.Target.Name = name
|
|
||||||
response.Target.Details.ResourceOwner = resp.GetDetails().GetResourceOwner()
|
|
||||||
response.Target.Details.ChangeDate = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Target.Details.Sequence = resp.GetDetails().GetSequence()
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.GetTargetByIDRequest{},
|
|
||||||
},
|
|
||||||
want: &action.GetTargetByIDResponse{
|
|
||||||
Target: &action.Target{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Endpoint: "https://example.com",
|
|
||||||
TargetType: &action.Target_RestWebhook{
|
|
||||||
RestWebhook: &action.SetRESTWebhook{
|
|
||||||
InterruptOnError: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Timeout: durationpb.New(10 * time.Second),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "get, call, ok",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.GetTargetByIDRequest, response *action.GetTargetByIDResponse) error {
|
|
||||||
name := fmt.Sprint(time.Now().UnixNano() + 1)
|
|
||||||
resp := Tester.CreateTarget(ctx, t, name, "https://example.com", domain.TargetTypeCall, false)
|
|
||||||
request.TargetId = resp.GetId()
|
|
||||||
|
|
||||||
response.Target.TargetId = resp.GetId()
|
|
||||||
response.Target.Name = name
|
|
||||||
response.Target.Details.ResourceOwner = resp.GetDetails().GetResourceOwner()
|
|
||||||
response.Target.Details.ChangeDate = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Target.Details.Sequence = resp.GetDetails().GetSequence()
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.GetTargetByIDRequest{},
|
|
||||||
},
|
|
||||||
want: &action.GetTargetByIDResponse{
|
|
||||||
Target: &action.Target{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Endpoint: "https://example.com",
|
|
||||||
TargetType: &action.Target_RestCall{
|
|
||||||
RestCall: &action.SetRESTCall{
|
|
||||||
InterruptOnError: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Timeout: durationpb.New(10 * time.Second),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "get, call interruptOnError, ok",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.GetTargetByIDRequest, response *action.GetTargetByIDResponse) error {
|
|
||||||
name := fmt.Sprint(time.Now().UnixNano() + 1)
|
|
||||||
resp := Tester.CreateTarget(ctx, t, name, "https://example.com", domain.TargetTypeCall, true)
|
|
||||||
request.TargetId = resp.GetId()
|
|
||||||
|
|
||||||
response.Target.TargetId = resp.GetId()
|
|
||||||
response.Target.Name = name
|
|
||||||
response.Target.Details.ResourceOwner = resp.GetDetails().GetResourceOwner()
|
|
||||||
response.Target.Details.ChangeDate = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Target.Details.Sequence = resp.GetDetails().GetSequence()
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.GetTargetByIDRequest{},
|
|
||||||
},
|
|
||||||
want: &action.GetTargetByIDResponse{
|
|
||||||
Target: &action.Target{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Endpoint: "https://example.com",
|
|
||||||
TargetType: &action.Target_RestCall{
|
|
||||||
RestCall: &action.SetRESTCall{
|
|
||||||
InterruptOnError: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Timeout: durationpb.New(10 * time.Second),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.dep != nil {
|
|
||||||
err := tt.args.dep(tt.args.ctx, tt.args.req, tt.want)
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
retryDuration := 5 * time.Second
|
|
||||||
if ctxDeadline, ok := CTX.Deadline(); ok {
|
|
||||||
retryDuration = time.Until(ctxDeadline)
|
|
||||||
}
|
|
||||||
|
|
||||||
require.EventuallyWithT(t, func(ttt *assert.CollectT) {
|
|
||||||
got, getErr := Client.GetTargetByID(tt.args.ctx, tt.args.req)
|
|
||||||
if tt.wantErr {
|
|
||||||
assert.Error(ttt, getErr, "Error: "+getErr.Error())
|
|
||||||
} else {
|
|
||||||
assert.NoError(ttt, getErr)
|
|
||||||
|
|
||||||
integration.AssertDetails(t, tt.want.GetTarget(), got.GetTarget())
|
|
||||||
|
|
||||||
assert.Equal(t, tt.want.Target, got.Target)
|
|
||||||
}
|
|
||||||
|
|
||||||
}, retryDuration, time.Millisecond*100, "timeout waiting for expected execution result")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestServer_ListTargets(t *testing.T) {
|
|
||||||
ensureFeatureEnabled(t)
|
|
||||||
type args struct {
|
|
||||||
ctx context.Context
|
|
||||||
dep func(context.Context, *action.ListTargetsRequest, *action.ListTargetsResponse) error
|
|
||||||
req *action.ListTargetsRequest
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
want *action.ListTargetsResponse
|
|
||||||
wantErr bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "missing permission",
|
|
||||||
args: args{
|
|
||||||
ctx: Tester.WithAuthorization(context.Background(), integration.OrgOwner),
|
|
||||||
req: &action.ListTargetsRequest{},
|
|
||||||
},
|
|
||||||
wantErr: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "list, not found",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
req: &action.ListTargetsRequest{
|
|
||||||
Queries: []*action.TargetSearchQuery{
|
|
||||||
{Query: &action.TargetSearchQuery_InTargetIdsQuery{
|
|
||||||
InTargetIdsQuery: &action.InTargetIDsQuery{
|
|
||||||
TargetIds: []string{"notfound"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &action.ListTargetsResponse{
|
|
||||||
Details: &object.ListDetails{
|
|
||||||
TotalResult: 0,
|
|
||||||
},
|
|
||||||
Result: []*action.Target{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "list single id",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.ListTargetsRequest, response *action.ListTargetsResponse) error {
|
|
||||||
name := fmt.Sprint(time.Now().UnixNano() + 1)
|
|
||||||
resp := Tester.CreateTarget(ctx, t, name, "https://example.com", domain.TargetTypeWebhook, false)
|
|
||||||
request.Queries[0].Query = &action.TargetSearchQuery_InTargetIdsQuery{
|
|
||||||
InTargetIdsQuery: &action.InTargetIDsQuery{
|
|
||||||
TargetIds: []string{resp.GetId()},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
response.Details.Timestamp = resp.GetDetails().GetChangeDate()
|
|
||||||
//response.Details.ProcessedSequence = resp.GetDetails().GetSequence()
|
|
||||||
|
|
||||||
response.Result[0].Details.ChangeDate = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Result[0].Details.Sequence = resp.GetDetails().GetSequence()
|
|
||||||
response.Result[0].TargetId = resp.GetId()
|
|
||||||
response.Result[0].Name = name
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.ListTargetsRequest{
|
|
||||||
Queries: []*action.TargetSearchQuery{{}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &action.ListTargetsResponse{
|
|
||||||
Details: &object.ListDetails{
|
|
||||||
TotalResult: 1,
|
|
||||||
},
|
|
||||||
Result: []*action.Target{
|
|
||||||
{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Endpoint: "https://example.com",
|
|
||||||
TargetType: &action.Target_RestWebhook{
|
|
||||||
RestWebhook: &action.SetRESTWebhook{
|
|
||||||
InterruptOnError: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Timeout: durationpb.New(10 * time.Second),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
name: "list single name",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.ListTargetsRequest, response *action.ListTargetsResponse) error {
|
|
||||||
name := fmt.Sprint(time.Now().UnixNano() + 1)
|
|
||||||
resp := Tester.CreateTarget(ctx, t, name, "https://example.com", domain.TargetTypeWebhook, false)
|
|
||||||
request.Queries[0].Query = &action.TargetSearchQuery_TargetNameQuery{
|
|
||||||
TargetNameQuery: &action.TargetNameQuery{
|
|
||||||
TargetName: name,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
response.Details.Timestamp = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Details.ProcessedSequence = resp.GetDetails().GetSequence()
|
|
||||||
|
|
||||||
response.Result[0].Details.ChangeDate = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Result[0].Details.Sequence = resp.GetDetails().GetSequence()
|
|
||||||
response.Result[0].TargetId = resp.GetId()
|
|
||||||
response.Result[0].Name = name
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.ListTargetsRequest{
|
|
||||||
Queries: []*action.TargetSearchQuery{{}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &action.ListTargetsResponse{
|
|
||||||
Details: &object.ListDetails{
|
|
||||||
TotalResult: 1,
|
|
||||||
},
|
|
||||||
Result: []*action.Target{
|
|
||||||
{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Endpoint: "https://example.com",
|
|
||||||
TargetType: &action.Target_RestWebhook{
|
|
||||||
RestWebhook: &action.SetRESTWebhook{
|
|
||||||
InterruptOnError: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Timeout: durationpb.New(10 * time.Second),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "list multiple id",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.ListTargetsRequest, response *action.ListTargetsResponse) error {
|
|
||||||
name1 := fmt.Sprint(time.Now().UnixNano() + 1)
|
|
||||||
name2 := fmt.Sprint(time.Now().UnixNano() + 3)
|
|
||||||
name3 := fmt.Sprint(time.Now().UnixNano() + 5)
|
|
||||||
resp1 := Tester.CreateTarget(ctx, t, name1, "https://example.com", domain.TargetTypeWebhook, false)
|
|
||||||
resp2 := Tester.CreateTarget(ctx, t, name2, "https://example.com", domain.TargetTypeCall, true)
|
|
||||||
resp3 := Tester.CreateTarget(ctx, t, name3, "https://example.com", domain.TargetTypeAsync, false)
|
|
||||||
request.Queries[0].Query = &action.TargetSearchQuery_InTargetIdsQuery{
|
|
||||||
InTargetIdsQuery: &action.InTargetIDsQuery{
|
|
||||||
TargetIds: []string{resp1.GetId(), resp2.GetId(), resp3.GetId()},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
response.Details.Timestamp = resp3.GetDetails().GetChangeDate()
|
|
||||||
response.Details.ProcessedSequence = resp3.GetDetails().GetSequence()
|
|
||||||
|
|
||||||
response.Result[0].Details.ChangeDate = resp1.GetDetails().GetChangeDate()
|
|
||||||
response.Result[0].Details.Sequence = resp1.GetDetails().GetSequence()
|
|
||||||
response.Result[0].TargetId = resp1.GetId()
|
|
||||||
response.Result[0].Name = name1
|
|
||||||
response.Result[1].Details.ChangeDate = resp2.GetDetails().GetChangeDate()
|
|
||||||
response.Result[1].Details.Sequence = resp2.GetDetails().GetSequence()
|
|
||||||
response.Result[1].TargetId = resp2.GetId()
|
|
||||||
response.Result[1].Name = name2
|
|
||||||
response.Result[2].Details.ChangeDate = resp3.GetDetails().GetChangeDate()
|
|
||||||
response.Result[2].Details.Sequence = resp3.GetDetails().GetSequence()
|
|
||||||
response.Result[2].TargetId = resp3.GetId()
|
|
||||||
response.Result[2].Name = name3
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.ListTargetsRequest{
|
|
||||||
Queries: []*action.TargetSearchQuery{{}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &action.ListTargetsResponse{
|
|
||||||
Details: &object.ListDetails{
|
|
||||||
TotalResult: 3,
|
|
||||||
},
|
|
||||||
Result: []*action.Target{
|
|
||||||
{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Endpoint: "https://example.com",
|
|
||||||
TargetType: &action.Target_RestWebhook{
|
|
||||||
RestWebhook: &action.SetRESTWebhook{
|
|
||||||
InterruptOnError: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Timeout: durationpb.New(10 * time.Second),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Endpoint: "https://example.com",
|
|
||||||
TargetType: &action.Target_RestCall{
|
|
||||||
RestCall: &action.SetRESTCall{
|
|
||||||
InterruptOnError: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Timeout: durationpb.New(10 * time.Second),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Endpoint: "https://example.com",
|
|
||||||
TargetType: &action.Target_RestAsync{
|
|
||||||
RestAsync: &action.SetRESTAsync{},
|
|
||||||
},
|
|
||||||
Timeout: durationpb.New(10 * time.Second),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.dep != nil {
|
|
||||||
err := tt.args.dep(tt.args.ctx, tt.args.req, tt.want)
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
retryDuration := 5 * time.Second
|
|
||||||
if ctxDeadline, ok := CTX.Deadline(); ok {
|
|
||||||
retryDuration = time.Until(ctxDeadline)
|
|
||||||
}
|
|
||||||
|
|
||||||
require.EventuallyWithT(t, func(ttt *assert.CollectT) {
|
|
||||||
got, listErr := Client.ListTargets(tt.args.ctx, tt.args.req)
|
|
||||||
if tt.wantErr {
|
|
||||||
assert.Error(ttt, listErr, "Error: "+listErr.Error())
|
|
||||||
} else {
|
|
||||||
assert.NoError(ttt, listErr)
|
|
||||||
}
|
|
||||||
if listErr != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// always first check length, otherwise its failed anyway
|
|
||||||
assert.Len(ttt, got.Result, len(tt.want.Result))
|
|
||||||
for i := range tt.want.Result {
|
|
||||||
assert.Contains(ttt, got.Result, tt.want.Result[i])
|
|
||||||
}
|
|
||||||
integration.AssertListDetails(t, tt.want, got)
|
|
||||||
}, retryDuration, time.Millisecond*100, "timeout waiting for expected execution result")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestServer_ListExecutions(t *testing.T) {
|
|
||||||
ensureFeatureEnabled(t)
|
|
||||||
targetResp := Tester.CreateTarget(CTX, t, "", "https://example.com", domain.TargetTypeWebhook, false)
|
|
||||||
|
|
||||||
type args struct {
|
|
||||||
ctx context.Context
|
|
||||||
dep func(context.Context, *action.ListExecutionsRequest, *action.ListExecutionsResponse) error
|
|
||||||
req *action.ListExecutionsRequest
|
|
||||||
}
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args args
|
|
||||||
want *action.ListExecutionsResponse
|
|
||||||
wantErr bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "missing permission",
|
|
||||||
args: args{
|
|
||||||
ctx: Tester.WithAuthorization(context.Background(), integration.OrgOwner),
|
|
||||||
req: &action.ListExecutionsRequest{},
|
|
||||||
},
|
|
||||||
wantErr: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "list request single condition",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.ListExecutionsRequest, response *action.ListExecutionsResponse) error {
|
|
||||||
cond := request.Queries[0].GetInConditionsQuery().GetConditions()[0]
|
|
||||||
resp := Tester.SetExecution(ctx, t, cond, executionTargetsSingleTarget(targetResp.GetId()))
|
|
||||||
|
|
||||||
response.Details.Timestamp = resp.GetDetails().GetChangeDate()
|
|
||||||
// response.Details.ProcessedSequence = resp.GetDetails().GetSequence()
|
|
||||||
|
|
||||||
// Set expected response with used values for SetExecution
|
|
||||||
response.Result[0].Details.ChangeDate = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Result[0].Details.Sequence = resp.GetDetails().GetSequence()
|
|
||||||
response.Result[0].Condition = cond
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.ListExecutionsRequest{
|
|
||||||
Queries: []*action.SearchQuery{{
|
|
||||||
Query: &action.SearchQuery_InConditionsQuery{
|
|
||||||
InConditionsQuery: &action.InConditionsQuery{
|
|
||||||
Conditions: []*action.Condition{{
|
|
||||||
ConditionType: &action.Condition_Request{
|
|
||||||
Request: &action.RequestExecution{
|
|
||||||
Condition: &action.RequestExecution_Method{
|
|
||||||
Method: "/zitadel.session.v2.SessionService/GetSession",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &action.ListExecutionsResponse{
|
|
||||||
Details: &object.ListDetails{
|
|
||||||
TotalResult: 1,
|
|
||||||
},
|
|
||||||
Result: []*action.Execution{
|
|
||||||
{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Condition: &action.Condition{
|
|
||||||
ConditionType: &action.Condition_Request{
|
|
||||||
Request: &action.RequestExecution{
|
|
||||||
Condition: &action.RequestExecution_Method{
|
|
||||||
Method: "/zitadel.session.v2.SessionService/GetSession",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Targets: executionTargetsSingleTarget(targetResp.GetId()),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "list request single target",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.ListExecutionsRequest, response *action.ListExecutionsResponse) error {
|
|
||||||
target := Tester.CreateTarget(CTX, t, "", "https://example.com", domain.TargetTypeWebhook, false)
|
|
||||||
// add target as query to the request
|
|
||||||
request.Queries[0] = &action.SearchQuery{
|
|
||||||
Query: &action.SearchQuery_TargetQuery{
|
|
||||||
TargetQuery: &action.TargetQuery{
|
|
||||||
TargetId: target.GetId(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
cond := &action.Condition{
|
|
||||||
ConditionType: &action.Condition_Request{
|
|
||||||
Request: &action.RequestExecution{
|
|
||||||
Condition: &action.RequestExecution_Method{
|
|
||||||
Method: "/zitadel.management.v1.ManagementService/UpdateAction",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
targets := executionTargetsSingleTarget(target.GetId())
|
|
||||||
resp := Tester.SetExecution(ctx, t, cond, targets)
|
|
||||||
|
|
||||||
response.Details.Timestamp = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Details.ProcessedSequence = resp.GetDetails().GetSequence()
|
|
||||||
|
|
||||||
response.Result[0].Details.ChangeDate = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Result[0].Details.Sequence = resp.GetDetails().GetSequence()
|
|
||||||
response.Result[0].Condition = cond
|
|
||||||
response.Result[0].Targets = targets
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.ListExecutionsRequest{
|
|
||||||
Queries: []*action.SearchQuery{{}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &action.ListExecutionsResponse{
|
|
||||||
Details: &object.ListDetails{
|
|
||||||
TotalResult: 1,
|
|
||||||
},
|
|
||||||
Result: []*action.Execution{
|
|
||||||
{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
Condition: &action.Condition{},
|
|
||||||
Targets: executionTargetsSingleTarget(""),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
name: "list request single include",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.ListExecutionsRequest, response *action.ListExecutionsResponse) error {
|
|
||||||
cond := &action.Condition{
|
|
||||||
ConditionType: &action.Condition_Request{
|
|
||||||
Request: &action.RequestExecution{
|
|
||||||
Condition: &action.RequestExecution_Method{
|
|
||||||
Method: "/zitadel.management.v1.ManagementService/GetAction",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
Tester.SetExecution(ctx, t, cond, executionTargetsSingleTarget(targetResp.GetId()))
|
|
||||||
request.Queries[0].GetIncludeQuery().Include = cond
|
|
||||||
|
|
||||||
includeCond := &action.Condition{
|
|
||||||
ConditionType: &action.Condition_Request{
|
|
||||||
Request: &action.RequestExecution{
|
|
||||||
Condition: &action.RequestExecution_Method{
|
|
||||||
Method: "/zitadel.management.v1.ManagementService/ListActions",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
includeTargets := executionTargetsSingleInclude(cond)
|
|
||||||
resp2 := Tester.SetExecution(ctx, t, includeCond, includeTargets)
|
|
||||||
|
|
||||||
response.Details.Timestamp = resp2.GetDetails().GetChangeDate()
|
|
||||||
response.Details.ProcessedSequence = resp2.GetDetails().GetSequence()
|
|
||||||
|
|
||||||
response.Result[0].Details.ChangeDate = resp2.GetDetails().GetChangeDate()
|
|
||||||
response.Result[0].Details.Sequence = resp2.GetDetails().GetSequence()
|
|
||||||
response.Result[0].Condition = includeCond
|
|
||||||
response.Result[0].Targets = includeTargets
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.ListExecutionsRequest{
|
|
||||||
Queries: []*action.SearchQuery{{
|
|
||||||
Query: &action.SearchQuery_IncludeQuery{
|
|
||||||
IncludeQuery: &action.IncludeQuery{},
|
|
||||||
},
|
|
||||||
}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &action.ListExecutionsResponse{
|
|
||||||
Details: &object.ListDetails{
|
|
||||||
TotalResult: 1,
|
|
||||||
},
|
|
||||||
Result: []*action.Execution{
|
|
||||||
{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "list multiple conditions",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.ListExecutionsRequest, response *action.ListExecutionsResponse) error {
|
|
||||||
|
|
||||||
cond1 := request.Queries[0].GetInConditionsQuery().GetConditions()[0]
|
|
||||||
targets1 := executionTargetsSingleTarget(targetResp.GetId())
|
|
||||||
resp1 := Tester.SetExecution(ctx, t, cond1, targets1)
|
|
||||||
response.Result[0].Details.ChangeDate = resp1.GetDetails().GetChangeDate()
|
|
||||||
response.Result[0].Details.Sequence = resp1.GetDetails().GetSequence()
|
|
||||||
response.Result[0].Condition = cond1
|
|
||||||
response.Result[0].Targets = targets1
|
|
||||||
|
|
||||||
cond2 := request.Queries[0].GetInConditionsQuery().GetConditions()[1]
|
|
||||||
targets2 := executionTargetsSingleTarget(targetResp.GetId())
|
|
||||||
resp2 := Tester.SetExecution(ctx, t, cond2, targets2)
|
|
||||||
response.Result[1].Details.ChangeDate = resp2.GetDetails().GetChangeDate()
|
|
||||||
response.Result[1].Details.Sequence = resp2.GetDetails().GetSequence()
|
|
||||||
response.Result[1].Condition = cond2
|
|
||||||
response.Result[1].Targets = targets2
|
|
||||||
|
|
||||||
cond3 := request.Queries[0].GetInConditionsQuery().GetConditions()[2]
|
|
||||||
targets3 := executionTargetsSingleTarget(targetResp.GetId())
|
|
||||||
resp3 := Tester.SetExecution(ctx, t, cond3, targets3)
|
|
||||||
response.Result[2].Details.ChangeDate = resp3.GetDetails().GetChangeDate()
|
|
||||||
response.Result[2].Details.Sequence = resp3.GetDetails().GetSequence()
|
|
||||||
response.Result[2].Condition = cond3
|
|
||||||
response.Result[2].Targets = targets3
|
|
||||||
|
|
||||||
response.Details.Timestamp = resp3.GetDetails().GetChangeDate()
|
|
||||||
response.Details.ProcessedSequence = resp3.GetDetails().GetSequence()
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.ListExecutionsRequest{
|
|
||||||
Queries: []*action.SearchQuery{{
|
|
||||||
Query: &action.SearchQuery_InConditionsQuery{
|
|
||||||
InConditionsQuery: &action.InConditionsQuery{
|
|
||||||
Conditions: []*action.Condition{
|
|
||||||
{
|
|
||||||
ConditionType: &action.Condition_Request{
|
|
||||||
Request: &action.RequestExecution{
|
|
||||||
Condition: &action.RequestExecution_Method{
|
|
||||||
Method: "/zitadel.session.v2.SessionService/GetSession",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ConditionType: &action.Condition_Request{
|
|
||||||
Request: &action.RequestExecution{
|
|
||||||
Condition: &action.RequestExecution_Method{
|
|
||||||
Method: "/zitadel.session.v2.SessionService/CreateSession",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ConditionType: &action.Condition_Request{
|
|
||||||
Request: &action.RequestExecution{
|
|
||||||
Condition: &action.RequestExecution_Method{
|
|
||||||
Method: "/zitadel.session.v2.SessionService/SetSession",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &action.ListExecutionsResponse{
|
|
||||||
Details: &object.ListDetails{
|
|
||||||
TotalResult: 3,
|
|
||||||
},
|
|
||||||
Result: []*action.Execution{
|
|
||||||
{
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
Details: &object.Details{
|
|
||||||
ResourceOwner: Tester.Instance.InstanceID(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "list multiple conditions all types",
|
|
||||||
args: args{
|
|
||||||
ctx: CTX,
|
|
||||||
dep: func(ctx context.Context, request *action.ListExecutionsRequest, response *action.ListExecutionsResponse) error {
|
|
||||||
targets := executionTargetsSingleTarget(targetResp.GetId())
|
|
||||||
for i, cond := range request.Queries[0].GetInConditionsQuery().GetConditions() {
|
|
||||||
resp := Tester.SetExecution(ctx, t, cond, targets)
|
|
||||||
response.Result[i].Details.ChangeDate = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Result[i].Details.Sequence = resp.GetDetails().GetSequence()
|
|
||||||
response.Result[i].Condition = cond
|
|
||||||
response.Result[i].Targets = targets
|
|
||||||
|
|
||||||
// filled with info of last sequence
|
|
||||||
response.Details.Timestamp = resp.GetDetails().GetChangeDate()
|
|
||||||
response.Details.ProcessedSequence = resp.GetDetails().GetSequence()
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
req: &action.ListExecutionsRequest{
|
|
||||||
Queries: []*action.SearchQuery{{
|
|
||||||
Query: &action.SearchQuery_InConditionsQuery{
|
|
||||||
InConditionsQuery: &action.InConditionsQuery{
|
|
||||||
Conditions: []*action.Condition{
|
|
||||||
{ConditionType: &action.Condition_Request{Request: &action.RequestExecution{Condition: &action.RequestExecution_Method{Method: "/zitadel.session.v2.SessionService/GetSession"}}}},
|
|
||||||
{ConditionType: &action.Condition_Request{Request: &action.RequestExecution{Condition: &action.RequestExecution_Service{Service: "zitadel.session.v2.SessionService"}}}},
|
|
||||||
{ConditionType: &action.Condition_Request{Request: &action.RequestExecution{Condition: &action.RequestExecution_All{All: true}}}},
|
|
||||||
{ConditionType: &action.Condition_Response{Response: &action.ResponseExecution{Condition: &action.ResponseExecution_Method{Method: "/zitadel.session.v2.SessionService/GetSession"}}}},
|
|
||||||
{ConditionType: &action.Condition_Response{Response: &action.ResponseExecution{Condition: &action.ResponseExecution_Service{Service: "zitadel.session.v2.SessionService"}}}},
|
|
||||||
{ConditionType: &action.Condition_Response{Response: &action.ResponseExecution{Condition: &action.ResponseExecution_All{All: true}}}},
|
|
||||||
{ConditionType: &action.Condition_Event{Event: &action.EventExecution{Condition: &action.EventExecution_Event{Event: "user.added"}}}},
|
|
||||||
{ConditionType: &action.Condition_Event{Event: &action.EventExecution{Condition: &action.EventExecution_Group{Group: "user"}}}},
|
|
||||||
{ConditionType: &action.Condition_Event{Event: &action.EventExecution{Condition: &action.EventExecution_All{All: true}}}},
|
|
||||||
{ConditionType: &action.Condition_Function{Function: &action.FunctionExecution{Name: "Action.Flow.Type.ExternalAuthentication.Action.TriggerType.PostAuthentication"}}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &action.ListExecutionsResponse{
|
|
||||||
Details: &object.ListDetails{
|
|
||||||
TotalResult: 10,
|
|
||||||
},
|
|
||||||
Result: []*action.Execution{
|
|
||||||
{Details: &object.Details{ResourceOwner: Tester.Instance.InstanceID()}},
|
|
||||||
{Details: &object.Details{ResourceOwner: Tester.Instance.InstanceID()}},
|
|
||||||
{Details: &object.Details{ResourceOwner: Tester.Instance.InstanceID()}},
|
|
||||||
{Details: &object.Details{ResourceOwner: Tester.Instance.InstanceID()}},
|
|
||||||
{Details: &object.Details{ResourceOwner: Tester.Instance.InstanceID()}},
|
|
||||||
{Details: &object.Details{ResourceOwner: Tester.Instance.InstanceID()}},
|
|
||||||
{Details: &object.Details{ResourceOwner: Tester.Instance.InstanceID()}},
|
|
||||||
{Details: &object.Details{ResourceOwner: Tester.Instance.InstanceID()}},
|
|
||||||
{Details: &object.Details{ResourceOwner: Tester.Instance.InstanceID()}},
|
|
||||||
{Details: &object.Details{ResourceOwner: Tester.Instance.InstanceID()}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
if tt.args.dep != nil {
|
|
||||||
err := tt.args.dep(tt.args.ctx, tt.args.req, tt.want)
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
retryDuration := 5 * time.Second
|
|
||||||
if ctxDeadline, ok := CTX.Deadline(); ok {
|
|
||||||
retryDuration = time.Until(ctxDeadline)
|
|
||||||
}
|
|
||||||
|
|
||||||
require.EventuallyWithT(t, func(ttt *assert.CollectT) {
|
|
||||||
got, listErr := Client.ListExecutions(tt.args.ctx, tt.args.req)
|
|
||||||
if tt.wantErr {
|
|
||||||
assert.Error(t, listErr, "Error: "+listErr.Error())
|
|
||||||
} else {
|
|
||||||
assert.NoError(t, listErr)
|
|
||||||
}
|
|
||||||
if listErr != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// always first check length, otherwise its failed anyway
|
|
||||||
assert.Len(t, got.Result, len(tt.want.Result))
|
|
||||||
for i := range tt.want.Result {
|
|
||||||
// as not sorted, all elements have to be checked
|
|
||||||
// workaround as oneof elements can only be checked with assert.EqualExportedValues()
|
|
||||||
if j, found := containExecution(got.Result, tt.want.Result[i]); found {
|
|
||||||
assert.EqualExportedValues(t, tt.want.Result[i], got.Result[j])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
integration.AssertListDetails(t, tt.want, got)
|
|
||||||
}, retryDuration, time.Millisecond*100, "timeout waiting for expected execution result")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func containExecution(executionList []*action.Execution, execution *action.Execution) (int, bool) {
|
|
||||||
for i, exec := range executionList {
|
|
||||||
if reflect.DeepEqual(exec.Details, execution.Details) {
|
|
||||||
return i, true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0, false
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user