You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cs...@apache.org on 2017/04/25 12:47:14 UTC

activemq git commit: AMQ-6661 - Fix Auto MQTT protocol detection

Repository: activemq
Updated Branches:
  refs/heads/master 4bf3152fa -> 808a4c5c1


AMQ-6661 - Fix Auto MQTT protocol detection

Protocol detection now takes into account the variable length header in
the CONNECT packet.


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

Branch: refs/heads/master
Commit: 808a4c5c173bf789326d33ed6bbbc7a6544bf8e0
Parents: 4bf3152
Author: Christopher L. Shannon (cshannon) <ch...@gmail.com>
Authored: Tue Apr 25 08:45:44 2017 -0400
Committer: Christopher L. Shannon (cshannon) <ch...@gmail.com>
Committed: Tue Apr 25 08:47:08 2017 -0400

----------------------------------------------------------------------
 .../protocol/MqttProtocolVerifier.java          | 32 +++++++++++---------
 .../activemq/transport/mqtt/MQTTTest.java       | 27 +++++++++++++++++
 2 files changed, 44 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/808a4c5c/activemq-broker/src/main/java/org/apache/activemq/transport/protocol/MqttProtocolVerifier.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/transport/protocol/MqttProtocolVerifier.java b/activemq-broker/src/main/java/org/apache/activemq/transport/protocol/MqttProtocolVerifier.java
index e989f7e..0943336 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/transport/protocol/MqttProtocolVerifier.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/transport/protocol/MqttProtocolVerifier.java
@@ -16,30 +16,32 @@
  */
 package org.apache.activemq.transport.protocol;
 
+import java.nio.ByteBuffer;
+
 /**
  *
  *
  */
 public class MqttProtocolVerifier implements ProtocolVerifier {
 
-    /* (non-Javadoc)
-     * @see org.apache.activemq.broker.transport.protocol.ProtocolVerifier#isProtocol(byte[])
-     */
     @Override
     public boolean isProtocol(byte[] value) {
-        boolean mqtt311 = value[4] == 77 && // M
-                value[5] == 81 && // Q
-                value[6] == 84 && // T
-                value[7] == 84;   // T
-
-        boolean mqtt31  = value[4] == 77  && // M
-                        value[5] == 81  && // Q
-                        value[6] == 73  && // I
-                        value[7] == 115;   // s
+       ByteBuffer buf = ByteBuffer.wrap(value);
 
-        return mqtt311 || mqtt31;
+       if (!(buf.get() == 16 && validateRemainingLength(buf) && buf.get() == (byte) 0)) {
+           return false;
+       }
+       byte b = buf.get() ;
+       return ((b == 4 || b == 6) && (buf.get() == 77));
     }
 
-
-
+    private boolean validateRemainingLength(ByteBuffer buffer) {
+       byte msb = (byte) 0b10000000;
+       for (byte i = 0; i < 4; i++) {
+          if ((buffer.get() & msb) != msb) {
+             return true;
+          }
+       }
+       return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/activemq/blob/808a4c5c/activemq-mqtt/src/test/java/org/apache/activemq/transport/mqtt/MQTTTest.java
----------------------------------------------------------------------
diff --git a/activemq-mqtt/src/test/java/org/apache/activemq/transport/mqtt/MQTTTest.java b/activemq-mqtt/src/test/java/org/apache/activemq/transport/mqtt/MQTTTest.java
index 5e28b2a..791e798 100644
--- a/activemq-mqtt/src/test/java/org/apache/activemq/transport/mqtt/MQTTTest.java
+++ b/activemq-mqtt/src/test/java/org/apache/activemq/transport/mqtt/MQTTTest.java
@@ -1961,4 +1961,31 @@ public class MQTTTest extends MQTTTestSupport {
 
         connection.disconnect();
     }
+
+    @Test
+    public void testConnectWithLargePassword() throws Exception {
+       for (String version : Arrays.asList("3.1", "3.1.1")) {
+          String longString = new String(new char[65535]);
+
+          BlockingConnection connection = null;
+          try {
+             MQTT mqtt = createMQTTConnection("test-" + version, true);
+             mqtt.setUserName(longString);
+             mqtt.setPassword(longString);
+             mqtt.setConnectAttemptsMax(1);
+             mqtt.setVersion(version);
+             connection = mqtt.blockingConnection();
+             connection.connect();
+             final BlockingConnection con = connection;
+             assertTrue(Wait.waitFor(new Wait.Condition() {
+                 @Override
+                 public boolean isSatisified() throws Exception {
+                     return con.isConnected();
+                 }
+             }));
+          } finally {
+             if (connection != null && connection.isConnected()) connection.disconnect();
+          }
+       }
+    }
 }