From ce00cf22db3a4f76ca001682b0fd4252dc1b9991 Mon Sep 17 00:00:00 2001 From: Stefan Benz <46600784+stebenz@users.noreply.github.com> Date: Tue, 26 Aug 2025 14:18:13 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20define=20base=20uri=20for=20login=20v2?= =?UTF-8?q?=20feature=20as=20string=20to=20make=20it=20config=E2=80=A6=20(?= =?UTF-8?q?#10533)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …urable # Which Problems Are Solved BaseURI defined in environment variables or configuration files was ignored for Login v2 feature flag. # How the Problems Are Solved Define BaseURI as string so that the environment variables and configuration files can be parsed into it. # Additional Changes None # Additional Context Closes #10405 (cherry picked from commit 2a78fdfe1f22bb77e5b03909298dcb0513f7e11a) --- cmd/setup/config_test.go | 9 ++++- cmd/start/config_test.go | 9 ++++- internal/command/instance.go | 53 ++++++++++++++++++++++++++- internal/command/instance_features.go | 9 ++++- 4 files changed, 74 insertions(+), 6 deletions(-) diff --git a/cmd/setup/config_test.go b/cmd/setup/config_test.go index 6c087fe4021..d8bb6f627e4 100644 --- a/cmd/setup/config_test.go +++ b/cmd/setup/config_test.go @@ -37,6 +37,9 @@ DefaultInstance: Features: LoginDefaultOrg: true UserSchema: true + LoginV2: + Required: true + BaseURI: 'http://zitadel:8080' Log: Level: info Actions: @@ -44,9 +47,13 @@ Actions: DenyList: [] `}, want: func(t *testing.T, config *Config) { - assert.Equal(t, config.DefaultInstance.Features, &command.InstanceFeatures{ + assert.Equal(t, config.DefaultInstance.Features, &command.InstanceSetupFeatures{ LoginDefaultOrg: gu.Ptr(true), UserSchema: gu.Ptr(true), + LoginV2: &command.InstanceSetupFeatureLoginV2{ + Required: true, + BaseURI: gu.Ptr("http://zitadel:8080"), + }, }) }, }, { diff --git a/cmd/start/config_test.go b/cmd/start/config_test.go index 3c8328e5573..3fd48272885 100644 --- a/cmd/start/config_test.go +++ b/cmd/start/config_test.go @@ -74,6 +74,9 @@ DefaultInstance: Features: LoginDefaultOrg: true UserSchema: true + LoginV2: + Required: true + BaseURI: 'http://zitadel:8080' Log: Level: info Actions: @@ -81,9 +84,13 @@ Actions: DenyList: [] `}, want: func(t *testing.T, config *Config) { - assert.Equal(t, config.DefaultInstance.Features, &command.InstanceFeatures{ + assert.Equal(t, config.DefaultInstance.Features, &command.InstanceSetupFeatures{ LoginDefaultOrg: gu.Ptr(true), UserSchema: gu.Ptr(true), + LoginV2: &command.InstanceSetupFeatureLoginV2{ + Required: true, + BaseURI: gu.Ptr("http://zitadel:8080"), + }, }) }, }, { diff --git a/internal/command/instance.go b/internal/command/instance.go index 8a686262d71..0df2e39ff7a 100644 --- a/internal/command/instance.go +++ b/internal/command/instance.go @@ -2,6 +2,7 @@ package command import ( "context" + "net/url" "strings" "time" @@ -14,6 +15,7 @@ import ( "github.com/zitadel/zitadel/internal/crypto" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore" + "github.com/zitadel/zitadel/internal/feature" "github.com/zitadel/zitadel/internal/i18n" "github.com/zitadel/zitadel/internal/id" "github.com/zitadel/zitadel/internal/notification/channels/smtp" @@ -122,12 +124,59 @@ type InstanceSetup struct { SMTPConfiguration *SMTPConfiguration OIDCSettings *OIDCSettings Quotas *SetQuotas - Features *InstanceFeatures + Features *InstanceSetupFeatures Limits *SetLimits Restrictions *SetRestrictions RolePermissionMappings []authz.RoleMapping } +type InstanceSetupFeatures struct { + LoginDefaultOrg *bool + UserSchema *bool + TokenExchange *bool + ImprovedPerformance []feature.ImprovedPerformanceType + DebugOIDCParentError *bool + OIDCSingleV1SessionTermination *bool + EnableBackChannelLogout *bool + LoginV2 *InstanceSetupFeatureLoginV2 + PermissionCheckV2 *bool + ConsoleUseV2UserApi *bool +} + +type InstanceSetupFeatureLoginV2 struct { + Required bool `json:"required,omitempty"` + BaseURI *string `json:"base_uri,omitempty"` +} + +func (f *InstanceSetupFeatures) ToInstanceFeatures() (_ *InstanceFeatures, err error) { + if f == nil { + return nil, nil + } + var loginV2 *feature.LoginV2 + if f.LoginV2 != nil { + loginV2 = &feature.LoginV2{Required: f.LoginV2.Required} + if f.LoginV2.BaseURI != nil { + loginV2.BaseURI, err = url.Parse(*f.LoginV2.BaseURI) + if err != nil { + return nil, err + } + } + } + + return &InstanceFeatures{ + LoginDefaultOrg: f.LoginDefaultOrg, + UserSchema: f.UserSchema, + TokenExchange: f.TokenExchange, + ImprovedPerformance: f.ImprovedPerformance, + DebugOIDCParentError: f.DebugOIDCParentError, + OIDCSingleV1SessionTermination: f.OIDCSingleV1SessionTermination, + EnableBackChannelLogout: f.EnableBackChannelLogout, + LoginV2: loginV2, + PermissionCheckV2: f.PermissionCheckV2, + ConsoleUseV2UserApi: f.ConsoleUseV2UserApi, + }, nil +} + type SMTPConfiguration struct { Description string SMTP smtp.SMTP @@ -421,7 +470,7 @@ func setupQuotas(commands *Commands, validations *[]preparation.Validation, setQ return nil } -func setupFeatures(validations *[]preparation.Validation, features *InstanceFeatures, instanceID string) { +func setupFeatures(validations *[]preparation.Validation, features *InstanceSetupFeatures, instanceID string) { if features != nil { *validations = append(*validations, prepareSetFeatures(instanceID, features)) } diff --git a/internal/command/instance_features.go b/internal/command/instance_features.go index 0497b639244..df1369ad37f 100644 --- a/internal/command/instance_features.go +++ b/internal/command/instance_features.go @@ -57,11 +57,16 @@ func (c *Commands) SetInstanceFeatures(ctx context.Context, f *InstanceFeatures) return pushedEventsToObjectDetails(events), nil } -func prepareSetFeatures(instanceID string, f *InstanceFeatures) preparation.Validation { +func prepareSetFeatures(instanceID string, f *InstanceSetupFeatures) preparation.Validation { return func() (preparation.CreateCommands, error) { + features, err := f.ToInstanceFeatures() + if err != nil { + return nil, err + } + return func(ctx context.Context, _ preparation.FilterToQueryReducer) ([]eventstore.Command, error) { wm := NewInstanceFeaturesWriteModel(instanceID) - return wm.setCommands(ctx, f), nil + return wm.setCommands(ctx, features), nil }, nil } }