diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a7cf07e9df..30f9db44a5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: with: node_version: '18' buf_version: 'latest' - go_version: '1.20' + go_version: '1.21' console: uses: ./.github/workflows/console.yml @@ -35,7 +35,7 @@ jobs: needs: [core, console, version] uses: ./.github/workflows/compile.yml with: - go_version: '1.20' + go_version: '1.21' core_cache_key: ${{ needs.core.outputs.cache_key }} console_cache_key: ${{ needs.console.outputs.cache_key }} core_cache_path: ${{ needs.core.outputs.cache_path }} @@ -46,7 +46,7 @@ jobs: needs: core uses: ./.github/workflows/core-unit-test.yml with: - go_version: '1.20' + go_version: '1.21' core_cache_key: ${{ needs.core.outputs.cache_key }} core_cache_path: ${{ needs.core.outputs.cache_path }} @@ -54,7 +54,7 @@ jobs: needs: core uses: ./.github/workflows/core-integration-test.yml with: - go_version: '1.20' + go_version: '1.21' core_cache_key: ${{ needs.core.outputs.cache_key }} core_cache_path: ${{ needs.core.outputs.cache_path }} @@ -62,7 +62,7 @@ jobs: needs: [core, console] uses: ./.github/workflows/lint.yml with: - go_version: '1.20' + go_version: '1.21' node_version: '18' buf_version: 'latest' go_lint_version: 'v1.53.2' diff --git a/.golangci.yaml b/.golangci.yaml index 7768c32d62..bc14721197 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -8,7 +8,7 @@ issues: run: concurrency: 4 timeout: 10m - go: '1.19' + go: '1.21' skip-dirs: - .artifacts - .backups diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2b04c7d361..128eb61a5a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -135,7 +135,7 @@ ZITADEL uses [golangci-lint](https://golangci-lint.run) for code quality checks. The commands in this section are tested against the following software versions: - [Docker version 20.10.17](https://docs.docker.com/engine/install/) -- [Go version 1.20](https://go.dev/doc/install) +- [Go version 1.21](https://go.dev/doc/install) - [Delve 1.9.1](https://github.com/go-delve/delve/tree/v1.9.1/Documentation/installation) Make some changes to the source code, then run the database locally. diff --git a/README.md b/README.md index 14f4dd5560..3756fef915 100644 --- a/README.md +++ b/README.md @@ -4,21 +4,23 @@
@@ -94,7 +96,7 @@ Authentication - Single Sign On (SSO) - Passwordless with FIDO2 support (Including Passkeys) - Username / Password -- Multifactor authentication with OTP, U2F +- Multifactor authentication with OTP, U2F, Email OTP, SMS OTP - LDAP - [OpenID Connect certified](https://openid.net/certification/#OPs) => [OIDC Endpoints](https://zitadel.com/docs/apis/openidoauth/endpoints) - [SAML 2.0](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html) => [SAML Endpoints](https://zitadel.com/docs/apis/saml/endpoints) @@ -103,12 +105,12 @@ Authentication Multi-Tenancy - [Identity Brokering](https://zitadel.com/docs/guides/integrate/identity-brokering) with templates for popular identity providers - [Delegate role management to third-parties](https://zitadel.com/docs/guides/manage/console/projects) -- Domain discovery +- [Domain discovery](https://zitadel.com/docs/guides/solution-scenarios/domain-discovery) Integration - [GRPC and REST APIs](https://zitadel.com/docs/apis/introduction) - [Actions](https://zitadel.com/docs/apis/actions/introduction) to call any API, send webhooks, adjust workflows, or customize tokens -- Role Based Access Control (RBAC) +- [Role Based Access Control (RBAC)](https://zitadel.com/docs/guides/integrate/retrieve-user-roles) Self-Service - [Self-registration](https://zitadel.com/docs/concepts/features/selfservice#registration) including verification diff --git a/cmd/defaults.yaml b/cmd/defaults.yaml index 7f90aca5c9..10424663fe 100644 --- a/cmd/defaults.yaml +++ b/cmd/defaults.yaml @@ -307,6 +307,7 @@ Login: MaxAge: 12h # ZITADEL_LOGIN_CACHE_MAXAGE # 168h is 7 days, one week SharedMaxAge: 168h # ZITADEL_LOGIN_CACHE_SHAREDMAXAGE + DefaultOTPEmailURLV2: "/otp/verify?loginName={{.LoginName}}&code={{.Code}}" # ZITADEL_LOGIN_CACHE_DEFAULTOTPEMAILURLV2 Console: ShortCache: @@ -370,10 +371,10 @@ SystemDefaults: MachineKeySize: 2048 # ZITADEL_SYSTEMDEFAULTS_SECRETGENERATORS_MACHINEKEYSIZE ApplicationKeySize: 2048 # ZITADEL_SYSTEMDEFAULTS_SECRETGENERATORS_APPLICATIONKEYSIZE PasswordHasher: - # Set hasher configuration for user passwords. - # Passwords previously hashed with a different algorithm - # or cost are automatically re-hashed using this config, - # upon password validation or update. + # Set hasher configuration for user passwords. + # Passwords previously hashed with a different algorithm + # or cost are automatically re-hashed using this config, + # upon password validation or update. Hasher: Algorithm: "bcrypt" # ZITADEL_SYSTEMDEFAULTS_PASSWORDHASHER_HASHER_ALGORITHM Cost: 14 # ZITADEL_SYSTEMDEFAULTS_PASSWORDHASHER_HASHER_COST @@ -687,6 +688,7 @@ DefaultInstance: # If the host of the sender is different from ExternalDomain set DefaultInstance.DomainPolicy.SMTPSenderAddressMatchesInstanceDomain to false From: # ZITADEL_DEFAULTINSTANCE_SMTPCONFIGURATION_SMTP_FROM FromName: # ZITADEL_DEFAULTINSTANCE_SMTPCONFIGURATION_SMTP_FROMNAME + ReplyToAddress: # ZITADEL_DEFAULTINSTANCE_SMTPCONFIGURATION_SMTP_REPLYTOADDRESS MessageTexts: - MessageTextType: InitCode Language: de diff --git a/cmd/start/start.go b/cmd/start/start.go index 1191e19b21..f8d69dea51 100644 --- a/cmd/start/start.go +++ b/cmd/start/start.go @@ -222,7 +222,25 @@ func startZitadel(config *Config, masterKey string, server chan<- *Server) error actionsLogstoreSvc := logstore.New(queries, usageReporter, actionsExecutionDBEmitter, actionsExecutionStdoutEmitter) actions.SetLogstoreService(actionsLogstoreSvc) - notification.Start(ctx, config.Projections.Customizations["notifications"], config.Projections.Customizations["notificationsquotas"], config.Projections.Customizations["telemetry"], *config.Telemetry, config.ExternalDomain, config.ExternalPort, config.ExternalSecure, commands, queries, eventstoreClient, assets.AssetAPIFromDomain(config.ExternalSecure, config.ExternalPort), config.SystemDefaults.Notifications.FileSystemPath, keys.User, keys.SMTP, keys.SMS) + notification.Start( + ctx, + config.Projections.Customizations["notifications"], + config.Projections.Customizations["notificationsquotas"], + config.Projections.Customizations["telemetry"], + *config.Telemetry, + config.ExternalDomain, + config.ExternalPort, + config.ExternalSecure, + commands, + queries, + eventstoreClient, + assets.AssetAPIFromDomain(config.ExternalSecure, config.ExternalPort), + config.Login.DefaultOTPEmailURLV2, + config.SystemDefaults.Notifications.FileSystemPath, + keys.User, + keys.SMTP, + keys.SMS, + ) router := mux.NewRouter() tlsConfig, err := config.TLS.Config() @@ -362,7 +380,7 @@ func startAPIs( apis.RegisterHandlerOnPrefix(idp.HandlerPrefix, idp.NewHandler(commands, queries, keys.IDPConfig, config.ExternalSecure, instanceInterceptor.Handler)) - userAgentInterceptor, err := middleware.NewUserAgentHandler(config.UserAgentCookie, keys.UserAgentCookieKey, id.SonyFlakeGenerator(), config.ExternalSecure, login.EndpointResources) + userAgentInterceptor, err := middleware.NewUserAgentHandler(config.UserAgentCookie, keys.UserAgentCookieKey, id.SonyFlakeGenerator(), config.ExternalSecure, login.EndpointResources, login.EndpointExternalLoginCallbackFormPost) if err != nil { return err } diff --git a/console/angular.json b/console/angular.json index 076f905fe4..1301e6686b 100644 --- a/console/angular.json +++ b/console/angular.json @@ -56,8 +56,8 @@ "budgets": [ { "type": "initial", - "maximumWarning": "6mb", - "maximumError": "7mb" + "maximumWarning": "8mb", + "maximumError": "9mb" }, { "type": "anyComponentStyle", diff --git a/console/src/app/modules/filter-events/filter-events.component.ts b/console/src/app/modules/filter-events/filter-events.component.ts index 381482bc50..158a767ce3 100644 --- a/console/src/app/modules/filter-events/filter-events.component.ts +++ b/console/src/app/modules/filter-events/filter-events.component.ts @@ -173,7 +173,43 @@ export class FilterEventsComponent implements OnInit { return this.adminService .listEventTypes(req) .then((list) => { - this.eventTypes = list.eventTypesList ?? []; + this.eventTypes = + list.eventTypesList.sort((a, b) => { + if (b.localized && b.localized.localizedMessage) { + if (a.localized && a.localized.localizedMessage) { + if (a.localized.localizedMessage < b.localized.localizedMessage) { + return -1; + } + if (a.localized.localizedMessage > b.localized.localizedMessage) { + return 1; + } + } else { + if (a.type < b.localized.localizedMessage) { + return -1; + } + if (a.type > b.localized.localizedMessage) { + return 1; + } + } + } else { + if (a.localized && a.localized.localizedMessage) { + if (a.localized.localizedMessage < b.type) { + return -1; + } + if (a.localized.localizedMessage > b.type) { + return 1; + } + } else { + if (a.type < b.type) { + return -1; + } + if (a.type > b.type) { + return 1; + } + } + } + return 0; + }) ?? []; }) .catch((error) => { this.toast.showError(error); diff --git a/console/src/app/modules/idp-table/idp-table.component.html b/console/src/app/modules/idp-table/idp-table.component.html index 2990f196dc..72801d58ad 100644 --- a/console/src/app/modules/idp-table/idp-table.component.html +++ b/console/src/app/modules/idp-table/idp-table.component.html @@ -80,6 +80,11 @@ Active Directory / LDAP +