You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/07/23 19:30:50 UTC

[camel] branch main updated: Proposed changes to allow specify an instance of KeyStore explicitly (#5856)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new b4d7430  Proposed changes to allow specify an instance of KeyStore explicitly (#5856)
b4d7430 is described below

commit b4d74307b3f52c406a6ccd29087f63827523306a
Author: dk2k <dk...@users.noreply.github.com>
AuthorDate: Fri Jul 23 22:30:26 2021 +0300

    Proposed changes to allow specify an instance of KeyStore explicitly (#5856)
    
    * Proposed changes to allow specify an instance of KeyStore explicitly
    
    * removed WARN log message
    
    Co-authored-by: dk2k <dk...@ya.ru>
---
 .../camel/support/jsse/KeyStoreParameters.java     | 52 ++++++++++++++++++----
 1 file changed, 44 insertions(+), 8 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/support/jsse/KeyStoreParameters.java b/core/camel-api/src/main/java/org/apache/camel/support/jsse/KeyStoreParameters.java
index 5575cdb..33d1fe8a 100644
--- a/core/camel-api/src/main/java/org/apache/camel/support/jsse/KeyStoreParameters.java
+++ b/core/camel-api/src/main/java/org/apache/camel/support/jsse/KeyStoreParameters.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.security.GeneralSecurityException;
 import java.security.KeyStore;
+import java.security.KeyStoreException;
 import java.security.Security;
 import java.util.Enumeration;
 import java.util.LinkedList;
@@ -53,6 +54,12 @@ public class KeyStoreParameters extends JsseParameters {
     protected String provider;
 
     /**
+     * The optional key store, which has higher priority then value in resource below. If keyStore is non-null, resource
+     * isn't taken into account. This is helpful say for in-memory KeyStore composed by the user "on the fly".
+     */
+    protected KeyStore keyStore;
+
+    /**
      * The optional file path, class path resource, or URL of the resource used to load the key store.
      */
     protected String resource;
@@ -126,6 +133,16 @@ public class KeyStoreParameters extends JsseParameters {
     }
 
     /**
+     * Sets the optional key store, which has higher priority then value in resource. NB Don't forget to call
+     * setPassword() for password of this KeyStore.
+     *
+     * @param keyStore the KeyStore (may be {@code null})
+     */
+    public void setKeyStore(KeyStore keyStore) {
+        this.keyStore = keyStore;
+    }
+
+    /**
      * Creates a {@link KeyStoreParameters} instance based off of the configuration state of this instance. If
      * {@link #getType()} returns {@code null}, the default key store type is loaded, otherwise the type will be of that
      * specified.
@@ -134,12 +151,22 @@ public class KeyStoreParameters extends JsseParameters {
      * returns {@code null}, the instance will be empty. The loading of the resource, if not {@code null}, is attempted
      * by treating the resource as a file path, a class path resource, and a URL in that order. An exception is thrown
      * if the resource cannot be resolved to readable input stream using any of the above methods.
-     * 
+     *
      * @return                          a configured and loaded key store
      * @throws GeneralSecurityException if there is an error creating an instance with the given configuration
      * @throws IOException              if there is an error resolving the configured resource to an input stream
      */
     public KeyStore createKeyStore() throws GeneralSecurityException, IOException {
+        if (keyStore != null) {
+            if (LOG.isDebugEnabled()) {
+                List<String> aliases = extractAliases(keyStore);
+                LOG.debug(
+                        "KeyStore [{}], initialized from [{}], is using provider [{}], has type [{}], and contains aliases {}.",
+                        keyStore, this, keyStore.getProvider(), keyStore.getType(), aliases);
+            }
+            return keyStore;
+        }
+
         LOG.trace("Creating KeyStore instance from KeyStoreParameters [{}].", this);
 
         String ksType = this.parsePropertyValue(this.type);
@@ -167,13 +194,7 @@ public class KeyStoreParameters extends JsseParameters {
         }
 
         if (LOG.isDebugEnabled()) {
-            List<String> aliases = new LinkedList<>();
-
-            Enumeration<String> aliasEnum = ks.aliases();
-            while (aliasEnum.hasMoreElements()) {
-                aliases.add(aliasEnum.nextElement());
-            }
-
+            List<String> aliases = extractAliases(ks);
             LOG.debug("KeyStore [{}], initialized from [{}], is using provider [{}], has type [{}], and contains aliases {}.",
                     ks, this, ks.getProvider(), ks.getType(), aliases);
         }
@@ -181,6 +202,21 @@ public class KeyStoreParameters extends JsseParameters {
         return ks;
     }
 
+    private List<String> extractAliases(KeyStore ks) {
+        List<String> aliases = new LinkedList<>();
+
+        Enumeration<String> aliasEnum = null;
+        try {
+            aliasEnum = ks.aliases();
+        } catch (KeyStoreException e) {
+            e.printStackTrace();
+        }
+        while (aliasEnum.hasMoreElements()) {
+            aliases.add(aliasEnum.nextElement());
+        }
+        return aliases;
+    }
+
     @Override
     public String toString() {
         StringBuilder builder = new StringBuilder();