This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch secret-raw in repository https://gitbox.apache.org/repos/asf/camel-kafka-connector.git
commit f654f09a116eda8c53ff2a58521021e3be86d58d Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Aug 7 13:12:01 2020 +0200 Building endpoint uris should for secret options automatic use RAW() syntax for the value so we wont have encoding issue for passwords or access tokens etc. --- core/pom.xml | 5 ++++ .../camel/kafkaconnector/utils/TaskHelper.java | 32 ++++++++++++++++++++++ .../camel/kafkaconnector/CamelSinkTaskTest.java | 14 ++++++++++ 3 files changed, 51 insertions(+) diff --git a/core/pom.xml b/core/pom.xml index e536120..4ac2672 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -136,6 +136,11 @@ <artifactId>camel-cassandraql</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-aws2-sqs</artifactId> + <scope>test</scope> + </dependency> </dependencies> <build> diff --git a/core/src/main/java/org/apache/camel/kafkaconnector/utils/TaskHelper.java b/core/src/main/java/org/apache/camel/kafkaconnector/utils/TaskHelper.java index 672f13b..321fd8d 100644 --- a/core/src/main/java/org/apache/camel/kafkaconnector/utils/TaskHelper.java +++ b/core/src/main/java/org/apache/camel/kafkaconnector/utils/TaskHelper.java @@ -26,6 +26,9 @@ import org.apache.camel.LoggingLevel; import org.apache.camel.catalog.RuntimeCamelCatalog; import org.apache.camel.kafkaconnector.CamelSinkConnectorConfig; import org.apache.camel.kafkaconnector.CamelSourceConnectorConfig; +import org.apache.camel.tooling.model.BaseOptionModel; +import org.apache.camel.tooling.model.ComponentModel; +import org.apache.camel.tooling.model.JsonMapper; import org.apache.kafka.common.config.AbstractConfig; import org.apache.kafka.connect.connector.ConnectRecord; import org.apache.kafka.connect.source.SourceRecord; @@ -37,10 +40,32 @@ public final class TaskHelper { } public static String buildUrl(RuntimeCamelCatalog rcc, Map<String, String> props, String componentSchema, String endpointPropertiesPrefix, String pathPropertiesPrefix) throws URISyntaxException { + ComponentModel cm = null; + if (componentSchema != null) { + String json = rcc.componentJSonSchema(componentSchema); + if (json != null) { + cm = JsonMapper.generateComponentModel(json); + } + } + Map<String, String> filteredProps = new HashMap<>(); props.keySet().stream() .filter(k -> k.startsWith(endpointPropertiesPrefix) || k.startsWith(pathPropertiesPrefix)) .forEach(k -> filteredProps.put(k.replace(endpointPropertiesPrefix, "").replace(pathPropertiesPrefix, ""), props.get(k))); + + if (cm != null) { + // secret options should have their values in RAW mode so we can preseve credentials/passwords etc in uri encodings + for (String k : filteredProps.keySet()) { + if (isSecretOption(rcc, cm, k)) { + String value = filteredProps.get(k); + if (value != null && !value.startsWith("RAW(")) { + value = "RAW(" + value + ")"; + filteredProps.put(k, value); + } + } + } + } + return rcc.asEndpointUri(componentSchema, filteredProps, false); } @@ -135,4 +160,11 @@ public final class TaskHelper { } } + private static boolean isSecretOption(RuntimeCamelCatalog rcc, ComponentModel cm, String endpointName) { + return cm.getEndpointOptions().stream() + .filter(o -> o.getName().equals(endpointName)) + .findFirst() + .map(BaseOptionModel::isSecret).orElse(false); + } + } diff --git a/core/src/test/java/org/apache/camel/kafkaconnector/CamelSinkTaskTest.java b/core/src/test/java/org/apache/camel/kafkaconnector/CamelSinkTaskTest.java index dd82ff6..b9af651 100644 --- a/core/src/test/java/org/apache/camel/kafkaconnector/CamelSinkTaskTest.java +++ b/core/src/test/java/org/apache/camel/kafkaconnector/CamelSinkTaskTest.java @@ -632,4 +632,18 @@ public class CamelSinkTaskTest { sinkTask.stop(); } + @Test + public void testSecretRaw() { + Map<String, String> props = new HashMap<>(); + props.put(CamelSinkConnectorConfig.TOPIC_CONF, TOPIC_NAME); + props.put("camel.sink.endpoint.secretKey", "se+ret"); + props.put("camel.sink.endpoint.accessKey", "MoreSe+ret$"); + props.put(CamelSinkConnectorConfig.CAMEL_SINK_COMPONENT_CONF, "aws2-sqs"); + + CamelSinkTask sinkTask = new CamelSinkTask(); + sinkTask.start(props); + + sinkTask.stop(); + } + }