From 0e3e88de3a102053c81c4489b2867924d4b44119 Mon Sep 17 00:00:00 2001 From: Benoit Bordigoni Date: Tue, 19 Mar 2024 12:13:08 +0100 Subject: [PATCH 1/2] fix: add secret converter for all IdP plugin --- .../api/idp/core/plugin/impl/IdentityProviderManagerImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java index 91728f3fd07..eff3b619142 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java @@ -16,6 +16,7 @@ package io.gravitee.rest.api.idp.core.plugin.impl; import io.gravitee.common.util.RelaxedPropertySource; +import io.gravitee.node.api.secrets.model.Secret; import io.gravitee.plugin.core.api.Plugin; import io.gravitee.plugin.core.api.PluginContextFactory; import io.gravitee.plugin.core.internal.AnnotationBasedPluginContextConfigurer; @@ -129,6 +130,8 @@ public ConfigurableEnvironment environment() { protected void customizePropertySources(MutablePropertySources propertySources) { propertySources.addFirst(new RelaxedPropertySource(plugin.id(), properties)); super.customizePropertySources(propertySources); + this.getConversionService().addConverter(Secret.class, byte[].class, Secret::asBytes); + this.getConversionService().addConverter(Secret.class, String.class, Secret::asString); } }; } From 4a0c50fc172690129c6ec0357b7e9e66168baf63 Mon Sep 17 00:00:00 2001 From: Benoit Bordigoni Date: Thu, 21 Mar 2024 10:17:28 +0100 Subject: [PATCH 2/2] fix: use a more generic way to convert a Secret into a property --- .../impl/IdentityProviderManagerImpl.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java index eff3b619142..3c3177d1eeb 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java @@ -27,12 +27,17 @@ import io.gravitee.rest.api.idp.core.plugin.IdentityProviderDefinition; import io.gravitee.rest.api.idp.core.plugin.IdentityProviderManager; import java.util.*; +import javax.annotation.Nonnull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Import; +import org.springframework.core.convert.ConversionService; +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.converter.ConverterFactory; +import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.StandardEnvironment; @@ -130,7 +135,21 @@ public ConfigurableEnvironment environment() { protected void customizePropertySources(MutablePropertySources propertySources) { propertySources.addFirst(new RelaxedPropertySource(plugin.id(), properties)); super.customizePropertySources(propertySources); - this.getConversionService().addConverter(Secret.class, byte[].class, Secret::asBytes); + + // add missing converters in this newly created environment + // this syntax allows a property of any kind to be converted from a secret. eg. Secret +> String -> Double + this.getConversionService() + .addConverterFactory( + new ConverterFactory() { + final ConversionService conversionService = DefaultConversionService.getSharedInstance(); + + @Nonnull + public Converter getConverter(@Nonnull Class targetType) { + return source -> conversionService.convert(source.asString(), targetType); + } + } + ); + // byte[] has to be created separately this.getConversionService().addConverter(Secret.class, String.class, Secret::asString); } };