From 6eafca287220faa647759a0a2ab8c5ee79d8479c Mon Sep 17 00:00:00 2001 From: gayathri <66356931+grvijayan@users.noreply.github.com> Date: Tue, 14 Jul 2026 13:50:09 +0200 Subject: [PATCH] feat: update GetActiveIdentityProviders to return Zitadel in the IdP list (#12422) # Which Problems Are Solved This PR extends the Settings Login API (v2 and v2beta) to include ZITADEL IdP in the list of IdPs returned by `GetActiveIdentityProviders` # How the Problems Are Solved - Added `IDENTITY_PROVIDER_TYPE_ZITADEL` to Settings IdentityProviderType enums (v2 and v2beta) and updated domain display name handling. - Updated Settings gRPC converters (v2 and v2beta) to map `domain.IDPTypeZitadel` to the new proto enum value - Added unit/integration tests # Additional Changes Correctly map `domain.IDPTypeApple` to `IdentityProviderType_IDENTITY_PROVIDER_TYPE_APPLE` in v2beta instead of unspecified. # Additional Context - Closes https://github.com/zitadel/zitadel/issues/12401 --------- Co-authored-by: Livio Spring <9405495+livio-a@users.noreply.github.com> --- .../v2/integration_test/query_test.go | 24 +++++++++++++++++++ .../grpc/settings/v2/settings_converter.go | 2 ++ .../settings/v2/settings_converter_test.go | 4 ++++ .../settings/v2beta/settings_converter.go | 5 ++-- .../v2beta/settings_converter_test.go | 8 +++++++ internal/domain/idp.go | 2 ++ .../zitadel/settings/v2/login_settings.proto | 1 + .../settings/v2beta/login_settings.proto | 4 +++- 8 files changed, 47 insertions(+), 3 deletions(-) diff --git a/internal/api/grpc/settings/v2/integration_test/query_test.go b/internal/api/grpc/settings/v2/integration_test/query_test.go index f0bca4a4f..3c58366c8 100644 --- a/internal/api/grpc/settings/v2/integration_test/query_test.go +++ b/internal/api/grpc/settings/v2/integration_test/query_test.go @@ -692,3 +692,27 @@ func assertPaginationResponse(t *assert.CollectT, expected *filter.PaginationRes assert.Equal(t, expected.AppliedLimit, actual.AppliedLimit) assert.Equal(t, expected.TotalResult, actual.TotalResult) } + +func TestServer_GetActiveIdentityProviders_ZitadelType(t *testing.T) { + instance := integration.NewInstance(CTX) + iamOwnerCTX := instance.WithAuthorizationToken(CTX, integration.UserTypeIAMOwner) + + idpName := integration.IDPName() + idpResp := instance.AddZitadelProvider(iamOwnerCTX, idpName) + instance.AddProviderToDefaultLoginPolicy(iamOwnerCTX, idpResp.GetId()) + + retryDuration, tick := integration.WaitForAndTickWithMaxDuration(iamOwnerCTX, time.Minute) + assert.EventuallyWithT(t, func(ct *assert.CollectT) { + got, err := instance.Client.SettingsV2.GetActiveIdentityProviders(iamOwnerCTX, &settings.GetActiveIdentityProvidersRequest{}) + if !assert.NoError(ct, err) { + return + } + providers := got.GetIdentityProviders() + if !assert.Len(ct, providers, 1) { + return + } + assert.Equal(ct, idpResp.GetId(), providers[0].GetId()) + assert.Equal(ct, idpName, providers[0].GetName()) + assert.Equal(ct, settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_ZITADEL, providers[0].GetType()) + }, retryDuration, tick) +} diff --git a/internal/api/grpc/settings/v2/settings_converter.go b/internal/api/grpc/settings/v2/settings_converter.go index 061f6cbc9..597cc5774 100644 --- a/internal/api/grpc/settings/v2/settings_converter.go +++ b/internal/api/grpc/settings/v2/settings_converter.go @@ -232,6 +232,8 @@ func idpTypeToPb(idpType domain.IDPType) settings.IdentityProviderType { return settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_APPLE case domain.IDPTypeSAML: return settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_SAML + case domain.IDPTypeZitadel: + return settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_ZITADEL default: return settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_UNSPECIFIED } diff --git a/internal/api/grpc/settings/v2/settings_converter_test.go b/internal/api/grpc/settings/v2/settings_converter_test.go index d459c51b2..408324abf 100644 --- a/internal/api/grpc/settings/v2/settings_converter_test.go +++ b/internal/api/grpc/settings/v2/settings_converter_test.go @@ -511,6 +511,10 @@ func Test_idpTypeToPb(t *testing.T) { args: args{domain.IDPTypeSAML}, want: settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_SAML, }, + { + args: args{domain.IDPTypeZitadel}, + want: settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_ZITADEL, + }, { args: args{99}, want: settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_UNSPECIFIED, diff --git a/internal/api/grpc/settings/v2beta/settings_converter.go b/internal/api/grpc/settings/v2beta/settings_converter.go index ad4ad2eba..cc22e0d28 100644 --- a/internal/api/grpc/settings/v2beta/settings_converter.go +++ b/internal/api/grpc/settings/v2beta/settings_converter.go @@ -219,8 +219,9 @@ func idpTypeToPb(idpType domain.IDPType) settings.IdentityProviderType { case domain.IDPTypeSAML: return settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_SAML case domain.IDPTypeApple: - // Handle all remaining cases so the linter succeeds - return settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_UNSPECIFIED + return settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_APPLE + case domain.IDPTypeZitadel: + return settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_ZITADEL default: return settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_UNSPECIFIED } diff --git a/internal/api/grpc/settings/v2beta/settings_converter_test.go b/internal/api/grpc/settings/v2beta/settings_converter_test.go index 99c60f262..26e17d180 100644 --- a/internal/api/grpc/settings/v2beta/settings_converter_test.go +++ b/internal/api/grpc/settings/v2beta/settings_converter_test.go @@ -470,6 +470,14 @@ func Test_idpTypeToPb(t *testing.T) { args: args{domain.IDPTypeSAML}, want: settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_SAML, }, + { + args: args{domain.IDPTypeApple}, + want: settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_APPLE, + }, + { + args: args{domain.IDPTypeZitadel}, + want: settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_ZITADEL, + }, { args: args{99}, want: settings.IdentityProviderType_IDENTITY_PROVIDER_TYPE_UNSPECIFIED, diff --git a/internal/domain/idp.go b/internal/domain/idp.go index c0fac9fd9..442c49910 100644 --- a/internal/domain/idp.go +++ b/internal/domain/idp.go @@ -86,6 +86,8 @@ func (t IDPType) DisplayName() string { return "Google" case IDPTypeApple: return "Apple" + case IDPTypeZitadel: + return "ZITADEL" case IDPTypeUnspecified, IDPTypeOIDC, IDPTypeJWT, diff --git a/proto/zitadel/settings/v2/login_settings.proto b/proto/zitadel/settings/v2/login_settings.proto index f396b1626..f9ced7c39 100644 --- a/proto/zitadel/settings/v2/login_settings.proto +++ b/proto/zitadel/settings/v2/login_settings.proto @@ -185,4 +185,5 @@ enum IdentityProviderType { IDENTITY_PROVIDER_TYPE_GOOGLE = 10; IDENTITY_PROVIDER_TYPE_SAML = 11; IDENTITY_PROVIDER_TYPE_APPLE = 12; + IDENTITY_PROVIDER_TYPE_ZITADEL = 13; } diff --git a/proto/zitadel/settings/v2beta/login_settings.proto b/proto/zitadel/settings/v2beta/login_settings.proto index dd809becc..a784d2b70 100644 --- a/proto/zitadel/settings/v2beta/login_settings.proto +++ b/proto/zitadel/settings/v2beta/login_settings.proto @@ -148,5 +148,7 @@ enum IdentityProviderType { IDENTITY_PROVIDER_TYPE_GITLAB = 8; IDENTITY_PROVIDER_TYPE_GITLAB_SELF_HOSTED = 9; IDENTITY_PROVIDER_TYPE_GOOGLE = 10; - IDENTITY_PROVIDER_TYPE_SAML=11; + IDENTITY_PROVIDER_TYPE_SAML = 11; + IDENTITY_PROVIDER_TYPE_APPLE = 12; + IDENTITY_PROVIDER_TYPE_ZITADEL = 13; }