From 7b2ebf3e1e748459daa9e1645c633bd4857791f6 Mon Sep 17 00:00:00 2001 From: Roberto Cortez Date: Mon, 25 Sep 2023 17:15:35 +0100 Subject: [PATCH] Register SecretKeysHandlerFactory with SmallRyeConfigBuilder (#1009) --- .../config/SmallRyeConfigBuilder.java | 69 +++++++++++++++++-- .../config/SecretKeysHandlerTest.java | 28 ++++++-- 2 files changed, 87 insertions(+), 10 deletions(-) diff --git a/implementation/src/main/java/io/smallrye/config/SmallRyeConfigBuilder.java b/implementation/src/main/java/io/smallrye/config/SmallRyeConfigBuilder.java index 6ff759781..61ec772f6 100644 --- a/implementation/src/main/java/io/smallrye/config/SmallRyeConfigBuilder.java +++ b/implementation/src/main/java/io/smallrye/config/SmallRyeConfigBuilder.java @@ -28,7 +28,6 @@ import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -65,7 +64,7 @@ public class SmallRyeConfigBuilder implements ConfigBuilder { private final List profiles = new ArrayList<>(); private final Set secretKeys = new HashSet<>(); private final List interceptors = new ArrayList<>(); - private final List secretKeysHandlers = new ArrayList<>(); + private final List secretKeysHandlers = new ArrayList<>(); private ConfigValidator validator = ConfigValidator.EMPTY; private final Map defaultValues = new HashMap<>(); private final ConfigMappingProvider.Builder mappingsBuilder = ConfigMappingProvider.builder(); @@ -328,11 +327,30 @@ public OptionalInt getPriority() { interceptors.add(new InterceptorWithPriority(new ConfigSourceInterceptorFactory() { @Override public ConfigSourceInterceptor getInterceptor(final ConfigSourceInterceptorContext context) { + List secretKeysHandlers = new ArrayList<>(); + for (SecretKeysHandlerWithName secretKeysHandler : SmallRyeConfigBuilder.this.secretKeysHandlers) { + secretKeysHandlers.add(secretKeysHandler.getSecretKeysHandler(new ConfigSourceContext() { + @Override + public ConfigValue getValue(final String name) { + return context.proceed(name); + } + + @Override + public List getProfiles() { + throw new UnsupportedOperationException(); + } + + @Override + public Iterator iterateNames() { + return context.iterateNames(); + } + })); + } + if (isAddDiscoveredSecretKeysHandlers()) { secretKeysHandlers.addAll(discoverSecretKeysHandlers(context)); } - return new SecretKeysHandlerConfigSourceInterceptor( - isAddDiscoveredSecretKeysHandlers() || !secretKeysHandlers.isEmpty(), secretKeysHandlers); + return new SecretKeysHandlerConfigSourceInterceptor(true, secretKeysHandlers); } @Override @@ -459,8 +477,17 @@ public SmallRyeConfigBuilder withInterceptorFactories(ConfigSourceInterceptorFac return this; } - public SmallRyeConfigBuilder withSecretKeysHandlers(SecretKeysHandler... secretKeysHandler) { - this.secretKeysHandlers.addAll(Arrays.asList(secretKeysHandler)); + public SmallRyeConfigBuilder withSecretKeysHandlers(SecretKeysHandler... secretKeysHandlers) { + for (SecretKeysHandler secretKeysHandler : secretKeysHandlers) { + this.secretKeysHandlers.add(new SecretKeysHandlerWithName(secretKeysHandler)); + } + return this; + } + + public SmallRyeConfigBuilder withSecretKeyHandlerFactories(SecretKeysHandlerFactory... secretKeyHandlerFactories) { + for (SecretKeysHandlerFactory secretKeyHandlerFactory : secretKeyHandlerFactories) { + this.secretKeysHandlers.add(new SecretKeysHandlerWithName(secretKeyHandlerFactory)); + } return this; } @@ -744,4 +771,34 @@ private static int getPriority(final Class kl } } } + + static class SecretKeysHandlerWithName { + private final SecretKeysHandlerFactory factory; + + SecretKeysHandlerWithName(SecretKeysHandler secretKeysHandler) { + this(new SecretKeysHandlerFactory() { + @Override + public SecretKeysHandler getSecretKeysHandler(final ConfigSourceContext context) { + return secretKeysHandler; + } + + @Override + public String getName() { + return secretKeysHandler.getName(); + } + }); + } + + SecretKeysHandlerWithName(SecretKeysHandlerFactory factory) { + this.factory = factory; + } + + io.smallrye.config.SecretKeysHandler getSecretKeysHandler(ConfigSourceContext context) { + return factory.getSecretKeysHandler(context); + } + + String getName() { + return factory.getName(); + } + } } diff --git a/implementation/src/test/java/io/smallrye/config/SecretKeysHandlerTest.java b/implementation/src/test/java/io/smallrye/config/SecretKeysHandlerTest.java index a39a04d51..146398eb3 100644 --- a/implementation/src/test/java/io/smallrye/config/SecretKeysHandlerTest.java +++ b/implementation/src/test/java/io/smallrye/config/SecretKeysHandlerTest.java @@ -1,7 +1,6 @@ package io.smallrye.config; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.NoSuchElementException; @@ -42,13 +41,34 @@ public String getName() { } @Test - void disabled() { + void handlerFactory() { SmallRyeConfig config = new SmallRyeConfigBuilder() + .withDefaultValue("context.handler", "decoded") .addDefaultInterceptors() - .setAddDiscoveredSecretKeysHandlers(false) + .withSecretKeyHandlerFactories(new SecretKeysHandlerFactory() { + @Override + public SecretKeysHandler getSecretKeysHandler(final ConfigSourceContext context) { + return new SecretKeysHandler() { + @Override + public String decode(final String secret) { + return context.getValue("context.handler").getValue(); + } + + @Override + public String getName() { + return "handler"; + } + }; + } + + @Override + public String getName() { + return "handler"; + } + }) .withDefaultValue("my.secret", "${handler::secret}") .build(); - assertNotNull(config.getRawValue("my.secret")); + assertEquals("decoded", config.getRawValue("my.secret")); } }