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 2014/12/30 11:48:29 UTC

[02/11] camel git commit: -Added support for decrypting parts of property values -- Example property: some.endpoint=http://somehost?authUsername=username&authPassword=ENC(BjAoLxfpb1h)&token=ENC(ZWbB211g) -- Decrypted result: some.endpoint=http://somehost

-Added support for decrypting parts of property values
-- Example property: some.endpoint=http://somehost?authUsername=username&authPassword=ENC(BjAoLxfpb1h)&token=ENC(ZWbB211g)
-- Decrypted result: some.endpoint=http://somehost?authUsername=username&authPassword=password&token=sometoken
-Added possibility to provide a custom encryptor (setEncryptor).
-- Useful when the encryptor is provided through an osgi service.

Note: The password and algorithm property is ignored when the encryptor property is set.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e0634e43
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e0634e43
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e0634e43

Branch: refs/heads/master
Commit: e0634e438124f2db6fe9cb27afa0ed77422028cf
Parents: 400477f
Author: Marius Thøring <ma...@avinor.no>
Authored: Thu Dec 18 13:32:14 2014 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Dec 30 11:47:28 2014 +0100

----------------------------------------------------------------------
 .../jasypt/JasyptPropertiesParser.java          | 34 +++++----
 .../jasypt/JasyptPropertiesParserTest.java      | 76 +++++++++++++++-----
 2 files changed, 81 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/e0634e43/components/camel-jasypt/src/main/java/org/apache/camel/component/jasypt/JasyptPropertiesParser.java
----------------------------------------------------------------------
diff --git a/components/camel-jasypt/src/main/java/org/apache/camel/component/jasypt/JasyptPropertiesParser.java b/components/camel-jasypt/src/main/java/org/apache/camel/component/jasypt/JasyptPropertiesParser.java
old mode 100644
new mode 100755
index 68b8377..8a0e81c
--- a/components/camel-jasypt/src/main/java/org/apache/camel/component/jasypt/JasyptPropertiesParser.java
+++ b/components/camel-jasypt/src/main/java/org/apache/camel/component/jasypt/JasyptPropertiesParser.java
@@ -17,6 +17,8 @@
 package org.apache.camel.component.jasypt;
 
 import java.util.Properties;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.camel.component.properties.DefaultPropertiesParser;
 import org.apache.camel.util.ObjectHelper;
@@ -26,9 +28,9 @@ import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
  * A {@link org.apache.camel.component.properties.PropertiesParser} which is using
  * <a href="http://www.jasypt.org/">Jasypt</a> to decrypt any encrypted values.
  * <p/>
- * The values must be enclosed in the prefix and suffix token.
+ * The parts of the values which should be decrpted must be enclosed in the prefix and suffix token.
  *
- * @version 
+ * @version
  */
 public class JasyptPropertiesParser extends DefaultPropertiesParser {
 
@@ -39,6 +41,13 @@ public class JasyptPropertiesParser extends DefaultPropertiesParser {
     private String password;
     private String algorithm;
 
+    private Pattern pattern;
+
+    public JasyptPropertiesParser() {
+        String regex = JASYPT_PREFIX_TOKEN.replace("(", "\\(") + "(.+?)" + JASYPT_SUFFIX_TOKEN.replace(")", "\\)");
+        pattern = Pattern.compile(regex);
+    }
+
     public String getPassword() {
         return password;
     }
@@ -76,19 +85,20 @@ public class JasyptPropertiesParser extends DefaultPropertiesParser {
         return encryptor;
     }
 
+    public void setEncryptor(StandardPBEStringEncryptor encryptor) {
+        this.encryptor = encryptor;
+    }
+
     @Override
     public String parseProperty(String key, String value, Properties properties) {
-        // check if the value is using the tokens
-        String text = ObjectHelper.between(value, JASYPT_PREFIX_TOKEN, JASYPT_SUFFIX_TOKEN);
-        if (text == null) {
-            // not encrypted
-            log.trace("Property is not encrypted {}", text);
-            return value;
-        } else {
-            log.trace("Decrypting property {}", text);
-            // do not log the decrypted text as it could be sensitive information such as a password
-            return getEncryptor().decrypt(text);
+        log.trace(String.format("Parsing property '%s=%s'", key, value));
+        Matcher matcher = pattern.matcher(value);
+        while (matcher.find()) {
+            log.trace(String.format("Decrypting part '%s'", matcher.group(0)));
+            String decrypted = getEncryptor().decrypt(matcher.group(1));
+            value = value.replace(matcher.group(0), decrypted);
         }
+        return value;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/e0634e43/components/camel-jasypt/src/test/java/org/apache/camel/component/jasypt/JasyptPropertiesParserTest.java
----------------------------------------------------------------------
diff --git a/components/camel-jasypt/src/test/java/org/apache/camel/component/jasypt/JasyptPropertiesParserTest.java b/components/camel-jasypt/src/test/java/org/apache/camel/component/jasypt/JasyptPropertiesParserTest.java
old mode 100644
new mode 100755
index 93ea820..2113c01
--- a/components/camel-jasypt/src/test/java/org/apache/camel/component/jasypt/JasyptPropertiesParserTest.java
+++ b/components/camel-jasypt/src/test/java/org/apache/camel/component/jasypt/JasyptPropertiesParserTest.java
@@ -16,31 +16,73 @@
  */
 package org.apache.camel.component.jasypt;
 
-import junit.framework.TestCase;
+import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
+import org.junit.Before;
+import org.junit.Test;
 
-/**
- * @version 
- */
-public class JasyptPropertiesParserTest extends TestCase {
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+public class JasyptPropertiesParserTest {
+
+    private static final String KEY = "somekey";
+
+    private static final String ENCRYPTED_VALUE = "ENC(bsW9uV37gQ0QHFu7KO03Ww==)";
+    private static final String DECRYPTED_VALUE = "tiger";
 
-    public void testJasyptPropertiesParser() throws Exception {
-        JasyptPropertiesParser parser = new JasyptPropertiesParser();
-        parser.setPassword("secret");
+    private JasyptPropertiesParser jasyptPropertiesParser = new JasyptPropertiesParser();
+
+    @Before
+    public void before() {
+        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
+        encryptor.setPassword("secret");
+        jasyptPropertiesParser.setEncryptor(encryptor);
+    }
+
+    @Test
+    public void testPlainPropertyIsUntouched() {
+        String result = jasyptPropertiesParser.parseProperty(KEY, "abc?1=decrypted1&2=decrypted2&cde=()", null);
+        assertThat(result, is("abc?1=decrypted1&2=decrypted2&cde=()"));
+    }
 
-        assertEquals("foo", parser.parseProperty(null, "foo", null));
-        assertEquals("tiger", parser.parseProperty(null, "ENC(bsW9uV37gQ0QHFu7KO03Ww==)", null));
+    @Test
+    public void testDecryptsEncryptedProperty() {
+        String result = jasyptPropertiesParser.parseProperty(KEY, ENCRYPTED_VALUE, null);
+        assertThat(result, is(DECRYPTED_VALUE));
     }
 
-    public void testJasyptPropertiesParserSys() throws Exception {
+    @Test
+    public void testDecryptsSinglePartEncryptedProperty() {
+        String result = jasyptPropertiesParser.parseProperty(KEY, "abc?1=" + ENCRYPTED_VALUE + "&cde=()", null);
+        assertThat(result, is("abc?1=" + DECRYPTED_VALUE + "&cde=()"));
+    }
+
+    @Test
+    public void testDecryptsMultiPartEncryptedProperty() {
+        String result = jasyptPropertiesParser.parseProperty(KEY, "abc?1=" + ENCRYPTED_VALUE + "&2=" + ENCRYPTED_VALUE + "&cde=()", null);
+        assertThat(result, is("abc?1=" + DECRYPTED_VALUE + "&2=" + DECRYPTED_VALUE + "&cde=()"));
+    }
+
+    @Test
+    public void testUsesProvidedPasswordIfEncryptorIsNotSet() throws Exception {
+        jasyptPropertiesParser.setEncryptor(null);
+        jasyptPropertiesParser.setPassword("secret");
+
+        assertEquals("foo", jasyptPropertiesParser.parseProperty(KEY, "foo", null));
+        assertEquals(DECRYPTED_VALUE, jasyptPropertiesParser.parseProperty(KEY, ENCRYPTED_VALUE, null));
+    }
+
+    @Test
+    public void testUsesProvidedPasswordFromSystemPropertyIfEncryptorIsNotSet() throws Exception {
         System.setProperty("myfoo", "secret");
 
-        JasyptPropertiesParser parser = new JasyptPropertiesParser();
-        parser.setPassword("sys:myfoo");
+        jasyptPropertiesParser.setEncryptor(null);
+        jasyptPropertiesParser.setPassword("sys:myfoo");
 
-        assertEquals("foo", parser.parseProperty(null, "foo", null));
-        assertEquals("tiger", parser.parseProperty(null, "ENC(bsW9uV37gQ0QHFu7KO03Ww==)", null));
+        assertEquals("foo", jasyptPropertiesParser.parseProperty(KEY, "foo", null));
+        assertEquals(DECRYPTED_VALUE, jasyptPropertiesParser.parseProperty(KEY, ENCRYPTED_VALUE, null));
 
         System.clearProperty("myfoo");
     }
-
-}
+}
\ No newline at end of file