This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch fix/CAMEL-24077 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 4bf3c2fdaef94235bf0a586e23e023a1eb01aa9f Author: Claus Ibsen <[email protected]> AuthorDate: Wed Jul 15 16:34:36 2026 +0200 CAMEL-24077: camel-amqp - Only append SSL transport options when configured and URL-encode values Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../apache/camel/component/amqp/AMQPComponent.java | 30 ++++++++++++--- .../camel/component/amqp/AMQPConfigTest.java | 43 +++++++++++++++++++++- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/components/camel-amqp/src/main/java/org/apache/camel/component/amqp/AMQPComponent.java b/components/camel-amqp/src/main/java/org/apache/camel/component/amqp/AMQPComponent.java index fff7f6204dd2..145e7ab5693a 100644 --- a/components/camel-amqp/src/main/java/org/apache/camel/component/amqp/AMQPComponent.java +++ b/components/camel-amqp/src/main/java/org/apache/camel/component/amqp/AMQPComponent.java @@ -16,6 +16,8 @@ */ package org.apache.camel.component.amqp; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Set; @@ -116,12 +118,24 @@ public class AMQPComponent extends JmsComponent { sb.append(useSsl == Boolean.TRUE ? "amqps://" : "amqp://"); sb.append(host == null ? AMQP_DEFAULT_HOST : host).append(":").append(port == null ? AMQP_DEFAULT_PORT : port); if (useSsl == Boolean.TRUE) { - sb.append("?transport.trustStoreLocation=").append(trustStoreLocation == null ? "" : trustStoreLocation); - sb.append("&transport.trustStoreType=").append(trustStoreType); - sb.append("&transport.trustStorePassword=").append(trustStorePassword == null ? "" : trustStorePassword); - sb.append("&transport.keyStoreLocation=").append(keyStoreLocation == null ? "" : keyStoreLocation); - sb.append("&transport.keyStoreType=").append(keyStoreType); - sb.append("&transport.keyStorePassword=").append(keyStorePassword == null ? "" : keyStorePassword); + boolean first = true; + if (trustStoreLocation != null) { + sb.append('?'); + first = false; + sb.append("transport.trustStoreLocation=").append(urlEncode(trustStoreLocation)); + sb.append("&transport.trustStoreType=").append(urlEncode(trustStoreType)); + if (trustStorePassword != null) { + sb.append("&transport.trustStorePassword=").append(urlEncode(trustStorePassword)); + } + } + if (keyStoreLocation != null) { + sb.append(first ? '?' : '&'); + sb.append("transport.keyStoreLocation=").append(urlEncode(keyStoreLocation)); + sb.append("&transport.keyStoreType=").append(urlEncode(keyStoreType)); + if (keyStorePassword != null) { + sb.append("&transport.keyStorePassword=").append(urlEncode(keyStorePassword)); + } + } } JmsConnectionFactory connectionFactory = new JmsConnectionFactory(getUsername(), getPassword(), sb.toString()); @@ -282,4 +296,8 @@ public class AMQPComponent extends JmsComponent { public void setTrustStorePassword(String trustStorePassword) { this.trustStorePassword = trustStorePassword; } + + private static String urlEncode(String value) { + return URLEncoder.encode(value, StandardCharsets.UTF_8); + } } diff --git a/components/camel-amqp/src/test/java/org/apache/camel/component/amqp/AMQPConfigTest.java b/components/camel-amqp/src/test/java/org/apache/camel/component/amqp/AMQPConfigTest.java index eefdce6f9044..b23bd57d62e5 100644 --- a/components/camel-amqp/src/test/java/org/apache/camel/component/amqp/AMQPConfigTest.java +++ b/components/camel-amqp/src/test/java/org/apache/camel/component/amqp/AMQPConfigTest.java @@ -100,10 +100,36 @@ public class AMQPConfigTest { JmsConnectionFactory connectionFactory = (JmsConnectionFactory) amqpSslEnabledComponent.getConnectionFactory(); assertNull(connectionFactory.getUsername()); assertNull(connectionFactory.getPassword()); + assertEquals("amqps://localhost:5672", connectionFactory.getRemoteURI()); + assertEquals("topic://", connectionFactory.getTopicPrefix()); + } + + @Test + public void testTrustStoreOnlySslComponent() { + AMQPComponent component + = contextExtension.getContext().getComponent("amqps-trustonly", AMQPComponent.class); + assertTrue(component.getUseSsl()); + assertEquals("server-ca-truststore.p12", component.getTrustStoreLocation()); + assertNull(component.getKeyStoreLocation()); + + assertTrue(component.getConnectionFactory() instanceof JmsConnectionFactory); + JmsConnectionFactory connectionFactory = (JmsConnectionFactory) component.getConnectionFactory(); assertEquals( - "amqps://localhost:5672?transport.trustStoreLocation=&transport.trustStoreType=JKS&transport.trustStorePassword=&transport.keyStoreLocation=&transport.keyStoreType=JKS&transport.keyStorePassword=", + "amqps://localhost:5672?transport.trustStoreLocation=server-ca-truststore.p12&transport.trustStoreType=PKCS12&transport.trustStorePassword=securepass", + connectionFactory.getRemoteURI()); + } + + @Test + public void testSslUrlEncodedPassword() { + AMQPComponent component + = contextExtension.getContext().getComponent("amqps-specialchars", AMQPComponent.class); + assertTrue(component.getUseSsl()); + + assertTrue(component.getConnectionFactory() instanceof JmsConnectionFactory); + JmsConnectionFactory connectionFactory = (JmsConnectionFactory) component.getConnectionFactory(); + assertEquals( + "amqps://localhost:5672?transport.trustStoreLocation=%2Fpath%2Fto%2Fstore.jks&transport.trustStoreType=JKS&transport.trustStorePassword=p%40ss%3Dw%26rd", connectionFactory.getRemoteURI()); - assertEquals("topic://", connectionFactory.getTopicPrefix()); } @Test @@ -157,6 +183,19 @@ public class AMQPConfigTest { amqpSslEnabledComponent.setUseSsl(true); context.addComponent("amqps-enabled", amqpSslEnabledComponent); + AMQPComponent amqpTrustOnlyComponent = new AMQPComponent(); + amqpTrustOnlyComponent.setUseSsl(true); + amqpTrustOnlyComponent.setTrustStoreLocation("server-ca-truststore.p12"); + amqpTrustOnlyComponent.setTrustStorePassword("securepass"); + amqpTrustOnlyComponent.setTrustStoreType("PKCS12"); + context.addComponent("amqps-trustonly", amqpTrustOnlyComponent); + + AMQPComponent amqpSpecialCharsComponent = new AMQPComponent(); + amqpSpecialCharsComponent.setUseSsl(true); + amqpSpecialCharsComponent.setTrustStoreLocation("/path/to/store.jks"); + amqpSpecialCharsComponent.setTrustStorePassword("p@ss=w&rd"); + context.addComponent("amqps-specialchars", amqpSpecialCharsComponent); + AMQPComponent amqpPortOnlyComponent = new AMQPComponent(); amqpPortOnlyComponent.setPort(5556); context.addComponent("amqp-portonly", amqpPortOnlyComponent);
