This is an automated email from the ASF dual-hosted git repository.

jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/main by this push:
     new 415d6eed26 Use LazySecretKeysHandler for Jasypt Config
415d6eed26 is described below

commit 415d6eed26bb6a677faff0fbd978dbbbe12e400d
Author: Roberto Cortez <[email protected]>
AuthorDate: Fri Jun 14 14:49:43 2024 +0100

    Use LazySecretKeysHandler for Jasypt Config
---
 .../jasypt/deployment/JasyptProcessor.java         |   2 +-
 .../devui/JasyptUtilsDevUIProcessor.java           |   2 +-
 .../jasypt/JasyptPasswordNotProvidedTest.java      |  21 ++-
 .../JasyptPasswordSysEnvValueMissingTest.java      |  21 ++-
 .../jasypt/JasyptPasswordSysValueMissingTest.java  |  21 ++-
 .../jasypt/CamelJasyptBuildTimeConfig.java         |  16 +--
 .../component/jasypt/CamelJasyptConfig.java        | 100 ++++++++++---
 .../component/jasypt/CamelJasyptDevUIService.java  |  19 ++-
 .../jasypt/CamelJasyptPropertiesParserHolder.java  |   4 -
 .../CamelJasyptSecretKeysHandlerFactory.java       | 160 ++++-----------------
 10 files changed, 187 insertions(+), 179 deletions(-)

diff --git 
a/extensions/jasypt/deployment/src/main/java/org/apache/camel/quarkus/component/jasypt/deployment/JasyptProcessor.java
 
b/extensions/jasypt/deployment/src/main/java/org/apache/camel/quarkus/component/jasypt/deployment/JasyptProcessor.java
index bd87b43d00..4e22772179 100644
--- 
a/extensions/jasypt/deployment/src/main/java/org/apache/camel/quarkus/component/jasypt/deployment/JasyptProcessor.java
+++ 
b/extensions/jasypt/deployment/src/main/java/org/apache/camel/quarkus/component/jasypt/deployment/JasyptProcessor.java
@@ -81,7 +81,7 @@ class JasyptProcessor {
 
         @Override
         public boolean getAsBoolean() {
-            return config.enabled;
+            return config.enabled();
         }
     }
 }
diff --git 
a/extensions/jasypt/deployment/src/main/java/org/apache/camel/quarkus/component/jasypt/deployment/devui/JasyptUtilsDevUIProcessor.java
 
b/extensions/jasypt/deployment/src/main/java/org/apache/camel/quarkus/component/jasypt/deployment/devui/JasyptUtilsDevUIProcessor.java
index fd39facf28..96abf86c05 100644
--- 
a/extensions/jasypt/deployment/src/main/java/org/apache/camel/quarkus/component/jasypt/deployment/devui/JasyptUtilsDevUIProcessor.java
+++ 
b/extensions/jasypt/deployment/src/main/java/org/apache/camel/quarkus/component/jasypt/deployment/devui/JasyptUtilsDevUIProcessor.java
@@ -49,7 +49,7 @@ public class JasyptUtilsDevUIProcessor {
 
         @Override
         public boolean getAsBoolean() {
-            return config.enabled;
+            return config.enabled();
         }
     }
 }
diff --git 
a/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordNotProvidedTest.java
 
b/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordNotProvidedTest.java
index e7af5c50a6..1cf46bb3b8 100644
--- 
a/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordNotProvidedTest.java
+++ 
b/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordNotProvidedTest.java
@@ -17,6 +17,9 @@
 package org.apache.camel.quarkus.component.jasypt;
 
 import io.quarkus.test.QuarkusUnitTest;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jasypt.JasyptPropertiesParser;
+import org.apache.camel.component.properties.PropertiesComponent;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
@@ -25,11 +28,27 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 public class JasyptPasswordNotProvidedTest {
     @RegisterExtension
     static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
+            .overrideConfigKey("greeting.secret", 
"ENC(GKJfy64eBDzxUuQCfArd6OjnAaW/oM9e)")
             .setExpectedException(IllegalStateException.class)
-            .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));
+            .setArchiveProducer(() -> 
ShrinkWrap.create(JavaArchive.class).addClass(JasyptRoutes.class));
 
     @Test
     void passwordNotProvidedThrowsException() {
         // Nothing to test as we just verify the application fails to start
     }
+
+    public static final class JasyptRoutes extends RouteBuilder {
+        @Override
+        public void configure() {
+            JasyptPropertiesParser jasypt = new JasyptPropertiesParser();
+            jasypt.setPassword("2s3cr3t");
+
+            PropertiesComponent component = (PropertiesComponent) 
getContext().getPropertiesComponent();
+            jasypt.setPropertiesComponent(component);
+            component.setPropertiesParser(jasypt);
+
+            from("direct:decryptManualConfiguration")
+                    .setBody().simple("{{greeting.secret}}");
+        }
+    }
 }
diff --git 
a/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordSysEnvValueMissingTest.java
 
b/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordSysEnvValueMissingTest.java
index 10299440b1..9bf7fbe1de 100644
--- 
a/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordSysEnvValueMissingTest.java
+++ 
b/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordSysEnvValueMissingTest.java
@@ -17,6 +17,9 @@
 package org.apache.camel.quarkus.component.jasypt;
 
 import io.quarkus.test.QuarkusUnitTest;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jasypt.JasyptPropertiesParser;
+import org.apache.camel.component.properties.PropertiesComponent;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
@@ -27,12 +30,28 @@ public class JasyptPasswordSysEnvValueMissingTest {
 
     @RegisterExtension
     static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
+            .overrideConfigKey("greeting.secret", 
"ENC(GKJfy64eBDzxUuQCfArd6OjnAaW/oM9e)")
             .overrideConfigKey("quarkus.camel.jasypt.password", "sysenv:" + 
PASSWORD_VAR_NAME)
             .setExpectedException(IllegalStateException.class)
-            .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));
+            .setArchiveProducer(() -> 
ShrinkWrap.create(JavaArchive.class).addClass(JasyptRoutes.class));
 
     @Test
     void nonExistentPasswordEnvironmentVariableHandledGracefully() {
         // Nothing to test as we just verify the application fails to start
     }
+
+    public static final class JasyptRoutes extends RouteBuilder {
+        @Override
+        public void configure() {
+            JasyptPropertiesParser jasypt = new JasyptPropertiesParser();
+            jasypt.setPassword("2s3cr3t");
+
+            PropertiesComponent component = (PropertiesComponent) 
getContext().getPropertiesComponent();
+            jasypt.setPropertiesComponent(component);
+            component.setPropertiesParser(jasypt);
+
+            from("direct:decryptManualConfiguration")
+                    .setBody().simple("{{greeting.secret}}");
+        }
+    }
 }
diff --git 
a/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordSysValueMissingTest.java
 
b/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordSysValueMissingTest.java
index b78a6486c5..d4f783eba9 100644
--- 
a/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordSysValueMissingTest.java
+++ 
b/extensions/jasypt/deployment/src/test/java/org/apache/camel/quarkus/component/jasypt/JasyptPasswordSysValueMissingTest.java
@@ -17,6 +17,9 @@
 package org.apache.camel.quarkus.component.jasypt;
 
 import io.quarkus.test.QuarkusUnitTest;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jasypt.JasyptPropertiesParser;
+import org.apache.camel.component.properties.PropertiesComponent;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
@@ -27,12 +30,28 @@ public class JasyptPasswordSysValueMissingTest {
 
     @RegisterExtension
     static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
+            .overrideConfigKey("greeting.secret", 
"ENC(GKJfy64eBDzxUuQCfArd6OjnAaW/oM9e)")
             .overrideConfigKey("quarkus.camel.jasypt.password", "sys:" + 
PASSWORD_PROPERTY_NAME)
             .setExpectedException(IllegalStateException.class)
-            .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));
+            .setArchiveProducer(() -> 
ShrinkWrap.create(JavaArchive.class).addClass(JasyptRoutes.class));
 
     @Test
     void nonExistentPasswordSystemPropertyHandledGracefully() {
         // Nothing to test as we just verify the application fails to start
     }
+
+    public static final class JasyptRoutes extends RouteBuilder {
+        @Override
+        public void configure() {
+            JasyptPropertiesParser jasypt = new JasyptPropertiesParser();
+            jasypt.setPassword("2s3cr3t");
+
+            PropertiesComponent component = (PropertiesComponent) 
getContext().getPropertiesComponent();
+            jasypt.setPropertiesComponent(component);
+            component.setPropertiesParser(jasypt);
+
+            from("direct:decryptManualConfiguration")
+                    .setBody().simple("{{greeting.secret}}");
+        }
+    }
 }
diff --git 
a/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptBuildTimeConfig.java
 
b/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptBuildTimeConfig.java
index 074d90955e..f0325ee5d4 100644
--- 
a/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptBuildTimeConfig.java
+++ 
b/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptBuildTimeConfig.java
@@ -16,21 +16,19 @@
  */
 package org.apache.camel.quarkus.component.jasypt;
 
-import io.quarkus.runtime.annotations.ConfigItem;
 import io.quarkus.runtime.annotations.ConfigPhase;
 import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
+import io.smallrye.config.WithDefault;
 
-/**
- * Note: This class exists mainly for documentation purposes. The actual 
configuration values
- * are read via the SmallRye config internals within the SecretKeysHandler.
- */
-@ConfigRoot(name = "camel.jasypt", phase = 
ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
-public class CamelJasyptBuildTimeConfig {
+@ConfigMapping(prefix = "quarkus.camel.jasypt")
+@ConfigRoot(phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
+public interface CamelJasyptBuildTimeConfig {
     /**
      * Setting this option to false will disable Jasypt integration with 
Quarkus SmallRye configuration.
      * You can however, manually configure Jasypt with Camel in the 'classic' 
way of manually configuring
      * JasyptPropertiesParser and PropertiesComponent. Refer to the usage 
section for more details.
      */
-    @ConfigItem(defaultValue = "true")
-    public boolean enabled;
+    @WithDefault("true")
+    boolean enabled();
 }
diff --git 
a/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptConfig.java
 
b/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptConfig.java
index 420689a1c2..20a9085ace 100644
--- 
a/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptConfig.java
+++ 
b/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptConfig.java
@@ -16,29 +16,34 @@
  */
 package org.apache.camel.quarkus.component.jasypt;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.Optional;
+import java.util.Set;
 
-import io.quarkus.runtime.annotations.ConfigItem;
 import io.quarkus.runtime.annotations.ConfigPhase;
 import io.quarkus.runtime.annotations.ConfigRoot;
+import io.smallrye.config.ConfigMapping;
+import io.smallrye.config.WithDefault;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.StringHelper;
 import org.jasypt.encryption.pbe.StandardPBEByteEncryptor;
+import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
+import org.jasypt.encryption.pbe.config.PBEConfig;
+import org.jasypt.iv.NoIvGenerator;
 import org.jasypt.iv.RandomIvGenerator;
 import org.jasypt.salt.RandomSaltGenerator;
 
-/**
- * Note: This class exists mainly for documentation purposes. The actual 
configuration values
- * are read via the SmallRye config internals within the SecretKeysHandler.
- */
-@ConfigRoot(name = "camel.jasypt", phase = ConfigPhase.RUN_TIME)
-public class CamelJasyptConfig {
-    static final String NAME = "camel-jasypt";
-    static final String DEFAULT_ALGORITHM = 
StandardPBEByteEncryptor.DEFAULT_ALGORITHM;
+@ConfigMapping(prefix = "quarkus.camel.jasypt")
+@ConfigRoot(phase = ConfigPhase.RUN_TIME)
+public interface CamelJasyptConfig {
+    String NAME = "camel-jasypt";
+    String DEFAULT_ALGORITHM = StandardPBEByteEncryptor.DEFAULT_ALGORITHM;
 
     /**
      * The algorithm to be used for decryption.
      */
-    @ConfigItem(defaultValue = DEFAULT_ALGORITHM)
-    public String algorithm;
+    @WithDefault(DEFAULT_ALGORITHM)
+    String algorithm();
 
     /**
      * The master password used by Jasypt for decrypting configuration values.
@@ -48,25 +53,82 @@ public class CamelJasyptConfig {
      * <code>sysenv:</code> will look up the value from the OS system 
environment with the given key.
      * <p>
      */
-    @ConfigItem
-    public Optional<String> password;
+    Optional<String> password();
 
     /**
      * Configures the Jasypt StandardPBEStringEncryptor with a 
RandomIvGenerator using the given algorithm.
      */
-    @ConfigItem(defaultValue = 
RandomIvGenerator.DEFAULT_SECURE_RANDOM_ALGORITHM)
-    public String randomIvGeneratorAlgorithm;
+    @WithDefault(RandomIvGenerator.DEFAULT_SECURE_RANDOM_ALGORITHM)
+    String randomIvGeneratorAlgorithm();
 
     /**
      * Configures the Jasypt StandardPBEStringEncryptor with a 
RandomSaltGenerator using the given algorithm.
      */
-    @ConfigItem(defaultValue = 
RandomSaltGenerator.DEFAULT_SECURE_RANDOM_ALGORITHM)
-    public String randomSaltGeneratorAlgorithm;
+    @WithDefault(RandomSaltGenerator.DEFAULT_SECURE_RANDOM_ALGORITHM)
+    String randomSaltGeneratorAlgorithm();
 
     /**
      * The fully qualified class name of an 
org.apache.camel.quarkus.component.jasypt.JasyptConfigurationCustomizer
      * implementation. This provides the optional capability of having full 
control over the Jasypt configuration.
      */
-    @ConfigItem
-    public Optional<String> configurationCustomizerClassName;
+    Optional<String> configurationCustomizerClassName();
+
+    String SYS_CONFIG_PREFIX = "sys:";
+    String SYS_ENV_CONFIG_PREFIX = "sysenv:";
+    Set<String> ALGORITHMS_THAT_REQUIRE_IV = Set.of(
+            "PBEWITHHMACSHA1ANDAES_128",
+            "PBEWITHHMACSHA1ANDAES_256",
+            "PBEWITHHMACSHA224ANDAES_128",
+            "PBEWITHHMACSHA224ANDAES_256",
+            "PBEWITHHMACSHA256ANDAES_128",
+            "PBEWITHHMACSHA256ANDAES_256",
+            "PBEWITHHMACSHA384ANDAES_128",
+            "PBEWITHHMACSHA384ANDAES_256",
+            "PBEWITHHMACSHA512ANDAES_128",
+            "PBEWITHHMACSHA512ANDAES_256");
+
+    default PBEConfig pbeConfig() {
+        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
+
+        String password = null;
+        if (password().isPresent()) {
+            password = password().get();
+            if (ObjectHelper.isNotEmpty(password)) {
+                // Preserve backwards compat with the Camel way of configuring 
the master password
+                if (password.startsWith(SYS_ENV_CONFIG_PREFIX)) {
+                    password = System.getenv(StringHelper.after(password, 
SYS_ENV_CONFIG_PREFIX));
+                } else if (password.startsWith(SYS_CONFIG_PREFIX)) {
+                    password = System.getProperty(StringHelper.after(password, 
SYS_CONFIG_PREFIX));
+                }
+            }
+        }
+
+        config.setPassword(password);
+        config.setAlgorithm(algorithm());
+        
config.setIvGenerator(ALGORITHMS_THAT_REQUIRE_IV.contains(algorithm().toUpperCase())
+                ? new RandomIvGenerator(randomIvGeneratorAlgorithm()) : new 
NoIvGenerator());
+        config.setSaltGenerator(new 
RandomSaltGenerator(randomSaltGeneratorAlgorithm()));
+
+        if (configurationCustomizerClassName().isPresent()) {
+            try {
+                Class<?> encryptorClass = 
Thread.currentThread().getContextClassLoader()
+                        .loadClass(configurationCustomizerClassName().get());
+                JasyptConfigurationCustomizer customizer = 
(JasyptConfigurationCustomizer) encryptorClass
+                        .getDeclaredConstructor().newInstance();
+                customizer.customize(config);
+            } catch (ClassNotFoundException | InvocationTargetException | 
InstantiationException | IllegalAccessException
+                    | NoSuchMethodException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        // Avoid potentially confusing runtime NPEs and fail fast if no 
password has been configured
+        try {
+            config.getPassword();
+        } catch (NullPointerException e) {
+            throw new IllegalStateException("The jasypt password has not been 
configured.");
+        }
+
+        return config;
+    }
 }
diff --git 
a/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptDevUIService.java
 
b/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptDevUIService.java
index f8508423d3..a41ec68e8e 100644
--- 
a/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptDevUIService.java
+++ 
b/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptDevUIService.java
@@ -21,19 +21,18 @@ import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
 
 @ApplicationScoped
 public class CamelJasyptDevUIService {
+    private final StandardPBEStringEncryptor encryptor;
+
+    public CamelJasyptDevUIService(CamelJasyptConfig jasyptConfig) {
+        encryptor = new StandardPBEStringEncryptor();
+        encryptor.setConfig(jasyptConfig.pbeConfig());
+    }
+
     public String encryptText(String text) {
-        StandardPBEStringEncryptor encryptor = 
CamelJasyptPropertiesParserHolder.getEncryptor();
-        if (encryptor != null) {
-            return encryptor.encrypt(text);
-        }
-        return null;
+        return encryptor.encrypt(text);
     }
 
     public String decryptText(String text) {
-        StandardPBEStringEncryptor encryptor = 
CamelJasyptPropertiesParserHolder.getEncryptor();
-        if (encryptor != null) {
-            return encryptor.decrypt(text);
-        }
-        return null;
+        return encryptor.decrypt(text);
     }
 }
diff --git 
a/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptPropertiesParserHolder.java
 
b/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptPropertiesParserHolder.java
index c9fbaf8374..5f33e37733 100644
--- 
a/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptPropertiesParserHolder.java
+++ 
b/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptPropertiesParserHolder.java
@@ -44,8 +44,4 @@ class CamelJasyptPropertiesParserHolder {
             ENCRYPTOR = encryptor;
         }
     }
-
-    static StandardPBEStringEncryptor getEncryptor() {
-        return ENCRYPTOR;
-    }
 }
diff --git 
a/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptSecretKeysHandlerFactory.java
 
b/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptSecretKeysHandlerFactory.java
index 163baecfce..393014bbfd 100644
--- 
a/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptSecretKeysHandlerFactory.java
+++ 
b/extensions/jasypt/runtime/src/main/java/org/apache/camel/quarkus/component/jasypt/CamelJasyptSecretKeysHandlerFactory.java
@@ -16,159 +16,55 @@
  */
 package org.apache.camel.quarkus.component.jasypt;
 
-import java.lang.reflect.InvocationTargetException;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-import java.util.Set;
-
 import io.smallrye.config.ConfigSourceContext;
-import io.smallrye.config.ConfigValue;
 import io.smallrye.config.SecretKeysHandler;
 import io.smallrye.config.SecretKeysHandlerFactory;
+import io.smallrye.config.SmallRyeConfig;
+import io.smallrye.config.SmallRyeConfigBuilder;
 import org.apache.camel.component.jasypt.JasyptPropertiesParser;
-import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.StringHelper;
 import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
-import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
-import org.jasypt.iv.IvGenerator;
-import org.jasypt.iv.NoIvGenerator;
-import org.jasypt.iv.RandomIvGenerator;
-import org.jasypt.salt.RandomSaltGenerator;
-import org.jasypt.salt.SaltGenerator;
-
-import static 
org.apache.camel.quarkus.component.jasypt.CamelJasyptConfig.DEFAULT_ALGORITHM;
 
 public class CamelJasyptSecretKeysHandlerFactory implements 
SecretKeysHandlerFactory {
-    private static final String CONFIG_PREFIX = "quarkus.camel.jasypt.";
-    private static final String SYS_CONFIG_PREFIX = "sys:";
-    private static final String SYS_ENV_CONFIG_PREFIX = "sysenv:";
-    private static final Set<String> ALGORITHMS_THAT_REQUIRE_IV = Set.of(
-            "PBEWITHHMACSHA1ANDAES_128",
-            "PBEWITHHMACSHA1ANDAES_256",
-            "PBEWITHHMACSHA224ANDAES_128",
-            "PBEWITHHMACSHA224ANDAES_256",
-            "PBEWITHHMACSHA256ANDAES_128",
-            "PBEWITHHMACSHA256ANDAES_256",
-            "PBEWITHHMACSHA384ANDAES_128",
-            "PBEWITHHMACSHA384ANDAES_256",
-            "PBEWITHHMACSHA512ANDAES_128",
-            "PBEWITHHMACSHA512ANDAES_256");
     private final JasyptPropertiesParser parser = 
CamelJasyptPropertiesParserHolder.getJasyptPropertiesParser();
-    private boolean enabled = true;
 
     @Override
     public SecretKeysHandler getSecretKeysHandler(ConfigSourceContext context) 
{
-        configureJasypt(context);
-
-        return new SecretKeysHandler() {
+        return new LazySecretKeysHandler(new SecretKeysHandlerFactory() {
             @Override
-            public String decode(String secret) {
-                return parser.parseProperty("", secret, null);
+            public SecretKeysHandler getSecretKeysHandler(final 
ConfigSourceContext context) {
+                SmallRyeConfig config = new SmallRyeConfigBuilder()
+                        .withSources(new 
ConfigSourceContext.ConfigSourceContextConfigSource(context))
+                        .withMapping(CamelJasyptConfig.class)
+                        .withMapping(CamelJasyptBuildTimeConfig.class)
+                        .build();
+
+                CamelJasyptConfig jasyptConfig = 
config.getConfigMapping(CamelJasyptConfig.class);
+                StandardPBEStringEncryptor encryptor = new 
StandardPBEStringEncryptor();
+                encryptor.setConfig(jasyptConfig.pbeConfig());
+                CamelJasyptPropertiesParserHolder.setEncryptor(encryptor);
+
+                return new SecretKeysHandler() {
+                    @Override
+                    public String decode(String secret) {
+                        return parser.parseProperty("", secret, null);
+                    }
+
+                    @Override
+                    public String getName() {
+                        return 
CamelJasyptSecretKeysHandlerFactory.this.getName();
+                    }
+                };
             }
 
             @Override
             public String getName() {
-                return CamelJasyptConfig.NAME;
+                return CamelJasyptSecretKeysHandlerFactory.this.getName();
             }
-        };
+        });
     }
 
     @Override
     public String getName() {
         return CamelJasyptConfig.NAME;
     }
-
-    private void configureJasypt(ConfigSourceContext context) {
-        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
-
-        String algorithm = getAlgorithm(context);
-        config.setPassword(getPassword(context));
-        config.setAlgorithm(algorithm);
-        config.setIvGenerator(getIvGenerator(algorithm, context));
-        config.setSaltGenerator(getSaltGenerator(context));
-        customizeConfiguration(config, context);
-
-        StandardPBEStringEncryptor encryptor = new 
StandardPBEStringEncryptor();
-        encryptor.setConfig(config);
-
-        // Avoid potentially confusing runtime NPEs and fail fast if no 
password has been configured
-        try {
-            config.getPassword();
-        } catch (NullPointerException e) {
-            throw new IllegalStateException("The jasypt password has not been 
configured.");
-        }
-
-        CamelJasyptPropertiesParserHolder.setEncryptor(encryptor);
-    }
-
-    private String getPassword(ConfigSourceContext context) {
-        Optional<String> passwordOptional = getOptionalConfigValue(context, 
"password");
-        if (passwordOptional.isPresent()) {
-            String password = passwordOptional.get();
-            if (ObjectHelper.isNotEmpty(password)) {
-                // Preserve backwards compat with the Camel way of configuring 
the master password
-                if (password.startsWith(SYS_ENV_CONFIG_PREFIX)) {
-                    password = System.getenv(StringHelper.after(password, 
SYS_ENV_CONFIG_PREFIX));
-                } else if (password.startsWith(SYS_CONFIG_PREFIX)) {
-                    password = System.getProperty(StringHelper.after(password, 
SYS_CONFIG_PREFIX));
-                }
-            }
-            return password;
-        }
-        return null;
-    }
-
-    private String getAlgorithm(ConfigSourceContext context) {
-        return getConfigValue(context, "algorithm", DEFAULT_ALGORITHM);
-    }
-
-    private IvGenerator getIvGenerator(String algorithm, ConfigSourceContext 
context) {
-        if (ObjectHelper.isNotEmpty(algorithm) && 
ALGORITHMS_THAT_REQUIRE_IV.contains(algorithm.toUpperCase())) {
-            String ivGeneratorAlgorithm = getConfigValue(context, 
"random-iv-generator-algorithm",
-                    RandomSaltGenerator.DEFAULT_SECURE_RANDOM_ALGORITHM);
-            return new RandomIvGenerator(ivGeneratorAlgorithm);
-        }
-        return new NoIvGenerator();
-    }
-
-    private SaltGenerator getSaltGenerator(ConfigSourceContext context) {
-        String algorithm = getConfigValue(context, 
"random-salt-generator-algorithm",
-                RandomSaltGenerator.DEFAULT_SECURE_RANDOM_ALGORITHM);
-        return new RandomSaltGenerator(algorithm);
-    }
-
-    private void customizeConfiguration(EnvironmentStringPBEConfig config, 
ConfigSourceContext context) {
-        Optional<String> customizerClassName = getOptionalConfigValue(context, 
"configuration-customizer-class-name");
-        if (customizerClassName.isPresent()) {
-            try {
-                Class<?> encryptorClass = 
Thread.currentThread().getContextClassLoader().loadClass(customizerClassName.get());
-                JasyptConfigurationCustomizer customizer = 
(JasyptConfigurationCustomizer) encryptorClass
-                        .getDeclaredConstructor().newInstance();
-                customizer.customize(config);
-            } catch (ClassNotFoundException | InvocationTargetException | 
InstantiationException | IllegalAccessException
-                    | NoSuchMethodException e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-
-    private String getConfigValue(ConfigSourceContext context, String key, 
String defaultValue) {
-        String configKey = CONFIG_PREFIX + key;
-        ConfigValue value = context.getValue(configKey);
-        if (value != null) {
-            return value.getValue();
-        }
-        if (defaultValue != null) {
-            return defaultValue;
-        }
-        throw new NoSuchElementException("Property value for %s was not 
found".formatted(configKey));
-    }
-
-    private Optional<String> getOptionalConfigValue(ConfigSourceContext 
context, String key) {
-        ConfigValue value = context.getValue(CONFIG_PREFIX + key);
-        if (value != null) {
-            return Optional.of(value.getValue());
-        }
-        return Optional.empty();
-    }
 }

Reply via email to