diff --git a/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java b/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java index d0a2925aca491d..d6ef1a0d701819 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/configuration/BuildTimeConfigurationReader.java @@ -27,6 +27,7 @@ import java.util.SortedSet; import java.util.TreeMap; +import io.smallrye.config.SecretKeys; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.config.spi.ConfigSource; import org.eclipse.microprofile.config.spi.Converter; @@ -319,7 +320,7 @@ public List getBuildTimeVisibleMappings() { } public ReadResult readConfiguration(final SmallRyeConfig config) { - return new ReadOperation(config).run(); + return SecretKeys.doUnlocked(() -> new ReadOperation(config).run()); } final class ReadOperation { diff --git a/integration-tests/test-extension/extension/deployment/src/test/java/io/quarkus/config/SecretKeysConfigInterceptorFactory.java b/integration-tests/test-extension/extension/deployment/src/test/java/io/quarkus/config/SecretKeysConfigInterceptorFactory.java new file mode 100644 index 00000000000000..9bb4f8acfa2d3d --- /dev/null +++ b/integration-tests/test-extension/extension/deployment/src/test/java/io/quarkus/config/SecretKeysConfigInterceptorFactory.java @@ -0,0 +1,15 @@ +package io.quarkus.config; + +import java.util.Set; + +import io.smallrye.config.ConfigSourceInterceptor; +import io.smallrye.config.ConfigSourceInterceptorContext; +import io.smallrye.config.ConfigSourceInterceptorFactory; +import io.smallrye.config.SecretKeysConfigSourceInterceptor; + +public class SecretKeysConfigInterceptorFactory implements ConfigSourceInterceptorFactory { + @Override + public ConfigSourceInterceptor getInterceptor(final ConfigSourceInterceptorContext configSourceInterceptorContext) { + return new SecretKeysConfigSourceInterceptor(Set.of("secrets.my.secret")); + } +} diff --git a/integration-tests/test-extension/extension/deployment/src/test/java/io/quarkus/config/SecretKeysConfigTest.java b/integration-tests/test-extension/extension/deployment/src/test/java/io/quarkus/config/SecretKeysConfigTest.java new file mode 100644 index 00000000000000..c13f7c2c2fdb1c --- /dev/null +++ b/integration-tests/test-extension/extension/deployment/src/test/java/io/quarkus/config/SecretKeysConfigTest.java @@ -0,0 +1,45 @@ +package io.quarkus.config; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import javax.inject.Inject; + +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusUnitTest; +import io.smallrye.config.ConfigMapping; +import io.smallrye.config.SmallRyeConfig; + +public class SecretKeysConfigTest { + @RegisterExtension + static final QuarkusUnitTest TEST = new QuarkusUnitTest() + .withApplicationRoot((jar) -> jar + .addClass(SecretKeysConfigInterceptorFactory.class) + .addAsServiceProvider("io.smallrye.config.ConfigSourceInterceptorFactory", + SecretKeysConfigInterceptorFactory.class.getName())) + .overrideConfigKey("secrets.my.secret", "secret"); + + @Inject + SmallRyeConfig config; + @Inject + @ConfigProperty(name = "secrets.my.secret") + String secret; + @Inject + MappingSecret mappingSecret; + + @Test + void secrets() { + assertThrows(SecurityException.class, () -> config.getConfigValue("secrets.my.secret")); + + assertEquals("secret", secret); + assertEquals("secret", mappingSecret.secret()); + } + + @ConfigMapping(prefix = "secrets.my") + interface MappingSecret { + String secret(); + } +}