Repository: qpid-jms Updated Branches: refs/heads/master 8a6666650 -> 1f764abed
QPIDJMS-68: add support for disabling use of a SASL layer on connections Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/d5f91e8b Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/d5f91e8b Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/d5f91e8b Branch: refs/heads/master Commit: d5f91e8bc2e91b3a126efadc3f6fdc59d7815f84 Parents: 8a66666 Author: Robert Gemmell <[email protected]> Authored: Mon Jun 15 11:35:36 2015 +0100 Committer: Robert Gemmell <[email protected]> Committed: Mon Jun 15 11:35:36 2015 +0100 ---------------------------------------------------------------------- .../qpid/jms/provider/amqp/AmqpProvider.java | 19 ++++++++++++-- .../jms/integration/SaslIntegrationTest.java | 21 +++++++++++++++ .../qpid/jms/test/testpeer/TestAmqpPeer.java | 27 +++++++++++++++----- 3 files changed, 59 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d5f91e8b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpProvider.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpProvider.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpProvider.java index cd6fcc2..0286925 100644 --- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpProvider.java +++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/AmqpProvider.java @@ -107,6 +107,7 @@ public class AmqpProvider implements Provider, TransportListener { private String vhost; private boolean traceFrames; private boolean traceBytes; + private boolean saslLayer = true; private boolean presettleConsumers; private boolean presettleProducers; private long connectTimeout = JmsConnectionInfo.DEFAULT_CONNECT_TIMEOUT; @@ -270,8 +271,9 @@ public class AmqpProvider implements Provider, TransportListener { protonTransport.setIdleTimeout(idleTimeout); protonTransport.bind(protonConnection); protonConnection.collect(protonCollector); - Sasl sasl = protonTransport.sasl(); - if (sasl != null) { + Sasl sasl = null; + if (saslLayer) { + sasl = protonTransport.sasl(); sasl.client(); String hostname = getVhost(); @@ -888,6 +890,19 @@ public class AmqpProvider implements Provider, TransportListener { return this.traceBytes; } + public boolean isSaslLayer() { + return saslLayer; + } + + /** + * Sets whether a sasl layer is used for the connection or not. + * + * @param saslLayer true to enable the sasl layer, false to disable it. + */ + public void setSaslLayer(boolean saslLayer) { + this.saslLayer = saslLayer; + } + public String getVhost() { return vhost; } http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d5f91e8b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SaslIntegrationTest.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SaslIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SaslIntegrationTest.java index e731a9c..7ac5533 100644 --- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SaslIntegrationTest.java +++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SaslIntegrationTest.java @@ -224,4 +224,25 @@ public class SaslIntegrationTest extends QpidJmsTestCase { testPeer.waitForAllHandlersToComplete(1000); } } + + @Test(timeout = 5000) + public void testSaslLayerDisabledConnection() throws Exception { + try (TestAmqpPeer testPeer = new TestAmqpPeer();) { + // Expect a connection with no SASL layer. + testPeer.expectSaslLayerDisabledConnect(); + // Each connection creates a session for managing temporary destinations etc + testPeer.expectBegin(true); + + ConnectionFactory factory = new JmsConnectionFactory("amqp://localhost:" + testPeer.getServerPort() + "?amqp.saslLayer=false"); + Connection connection = factory.createConnection(); + // Set a clientID to provoke the actual AMQP connection process to occur. + connection.setClientID("clientName"); + + testPeer.waitForAllHandlersToComplete(1000); + assertNull(testPeer.getThrowable()); + + testPeer.expectClose(); + connection.close(); + } + } } http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d5f91e8b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java index cbfe514..312c111 100644 --- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java +++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java @@ -389,6 +389,27 @@ public class TestAmqpPeer implements AutoCloseable addHandler(saslInitMatcher); } + /** + * Expect a connection that does not use a SASL layer, but proceeds straight + * to the AMQP connection (useful to skip a stage for connections that don't + * require SASL, e.g. because of anonymous or client certificate authentication). + */ + public void expectSaslLayerDisabledConnect() + { + addHandler(new HeaderHandlerImpl(AmqpHeader.HEADER, AmqpHeader.HEADER)); + + OpenFrame openFrame = createOpenFrame(); + + OpenMatcher openMatcher = new OpenMatcher() + .withContainerId(notNullValue(String.class)) + .onSuccess(new FrameSender( + this, FrameType.AMQP, 0, + openFrame, + null)); + + addHandler(openMatcher); + } + public void expectAnonymousConnect(boolean authorize) { expectAnonymousConnect(authorize, null, null); @@ -627,12 +648,6 @@ public class TestAmqpPeer implements AutoCloseable addHandler(closeMatcher); } - public void expectHeaderAndOpen() - { - addHandler(new HeaderHandlerImpl(AmqpHeader.HEADER, AmqpHeader.HEADER)); - addHandler(new OpenMatcher()); - } - public void expectBegin(boolean expectSessionFlow) { final BeginMatcher beginMatcher = new BeginMatcher() --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
