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();
+ }
+ }
+ }
}