Added clinetID=empty then reject connect rule
This commit is contained in:
+6
-4
@@ -27,20 +27,22 @@ import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import org.dna.mqtt.moquette.messaging.spi.IMatchingCondition;
|
||||
import org.dna.mqtt.moquette.messaging.spi.ISessionsStore;
|
||||
import org.dna.mqtt.moquette.messaging.spi.IMessagesStore;
|
||||
import org.dna.mqtt.moquette.messaging.spi.ISessionsStore;
|
||||
import org.dna.mqtt.moquette.messaging.spi.impl.events.MessagingEvent;
|
||||
import org.dna.mqtt.moquette.messaging.spi.impl.events.OutputMessagingEvent;
|
||||
import org.dna.mqtt.moquette.messaging.spi.impl.events.PubAckEvent;
|
||||
import org.dna.mqtt.moquette.messaging.spi.impl.events.PublishEvent;
|
||||
import org.dna.mqtt.moquette.messaging.spi.impl.subscriptions.Subscription;
|
||||
import org.dna.mqtt.moquette.messaging.spi.impl.subscriptions.SubscriptionsStore;
|
||||
import org.dna.mqtt.moquette.proto.messages.PubCompMessage;
|
||||
import static org.dna.mqtt.moquette.parser.netty.Utils.VERSION_3_1;
|
||||
import static org.dna.mqtt.moquette.parser.netty.Utils.VERSION_3_1_1;
|
||||
import org.dna.mqtt.moquette.proto.messages.AbstractMessage;
|
||||
import org.dna.mqtt.moquette.proto.messages.AbstractMessage.QOSType;
|
||||
import org.dna.mqtt.moquette.proto.messages.ConnAckMessage;
|
||||
import org.dna.mqtt.moquette.proto.messages.ConnectMessage;
|
||||
import org.dna.mqtt.moquette.proto.messages.PubAckMessage;
|
||||
import org.dna.mqtt.moquette.proto.messages.PubCompMessage;
|
||||
import org.dna.mqtt.moquette.proto.messages.PubRecMessage;
|
||||
import org.dna.mqtt.moquette.proto.messages.PubRelMessage;
|
||||
import org.dna.mqtt.moquette.proto.messages.PublishMessage;
|
||||
@@ -142,7 +144,7 @@ class ProtocolProcessor implements EventHandler<ValueEvent> {
|
||||
|
||||
void processConnect(ServerChannel session, ConnectMessage msg) {
|
||||
LOG.debug("processConnect for client {}", msg.getClientID());
|
||||
if (msg.getProcotolVersion() != 0x03) {
|
||||
if (msg.getProcotolVersion() != VERSION_3_1 && msg.getProcotolVersion() != VERSION_3_1_1) {
|
||||
ConnAckMessage badProto = new ConnAckMessage();
|
||||
badProto.setReturnCode(ConnAckMessage.UNNACEPTABLE_PROTOCOL_VERSION);
|
||||
LOG.warn("processConnect sent bad proto ConnAck");
|
||||
@@ -151,7 +153,7 @@ class ProtocolProcessor implements EventHandler<ValueEvent> {
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.getClientID() == null || msg.getClientID().length() > 23) {
|
||||
if (msg.getClientID() == null || msg.getClientID().length() > 23 || msg.getClientID().length() == 0) {
|
||||
ConnAckMessage okResp = new ConnAckMessage();
|
||||
okResp.setReturnCode(ConnAckMessage.IDENTIFIER_REJECTED);
|
||||
session.write(okResp);
|
||||
|
||||
@@ -20,13 +20,13 @@ import java.io.IOException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import org.fusesource.mqtt.client.BlockingConnection;
|
||||
import org.fusesource.mqtt.client.MQTT;
|
||||
import org.fusesource.mqtt.client.Message;
|
||||
import org.fusesource.mqtt.client.QoS;
|
||||
import org.fusesource.mqtt.client.Topic;
|
||||
import org.fusesource.mqtt.client.Message;
|
||||
import org.junit.After;
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.*;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ public class ServerIntegrationPahoTest {
|
||||
|
||||
assertEquals("/topic", m_callback.getTopic());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Test
|
||||
public void testCleanSession_maintainClientSubscriptions() throws Exception {
|
||||
|
||||
+37
-1
@@ -17,8 +17,11 @@ package org.dna.mqtt.moquette.server;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import org.dna.mqtt.moquette.proto.messages.AbstractMessage;
|
||||
import org.dna.mqtt.moquette.proto.messages.AbstractMessage.QOSType;
|
||||
import org.dna.mqtt.moquette.proto.messages.ConnAckMessage;
|
||||
import org.dna.mqtt.moquette.proto.messages.ConnectMessage;
|
||||
import org.dna.mqtt.moquette.testclient.Client;
|
||||
import org.fusesource.mqtt.client.BlockingConnection;
|
||||
@@ -27,9 +30,9 @@ import org.fusesource.mqtt.client.Message;
|
||||
import org.fusesource.mqtt.client.QoS;
|
||||
import org.fusesource.mqtt.client.Topic;
|
||||
import org.junit.After;
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.*;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -121,4 +124,37 @@ public class ServerLowlevelMessagesIntegrationTests {
|
||||
assertEquals(willTestamentMsg, new String(msg.getPayload()));
|
||||
willSubscriber.disconnect();
|
||||
}
|
||||
|
||||
AbstractMessage receivedMsg;
|
||||
|
||||
@Test
|
||||
public void checkRejectConnectWithEmptyClientID() throws InterruptedException {
|
||||
LOG.info("*** checkRejectConnectWithEmptyClientID ***");
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
m_client.setCallback(new Client.ICallback() {
|
||||
|
||||
public void call(AbstractMessage msg) {
|
||||
receivedMsg = msg;
|
||||
latch.countDown();
|
||||
}
|
||||
});
|
||||
|
||||
int keepAlive = 2; //secs
|
||||
ConnectMessage connectMessage = new ConnectMessage();
|
||||
connectMessage.setProcotolVersion((byte) 4);
|
||||
connectMessage.setClientID("");
|
||||
connectMessage.setKeepAlive(keepAlive);
|
||||
connectMessage.setWillFlag(false);
|
||||
connectMessage.setWillQos((byte) QOSType.MOST_ONE.ordinal());
|
||||
|
||||
//Execute
|
||||
m_client.sendMessage(connectMessage);
|
||||
|
||||
latch.await(200, TimeUnit.MILLISECONDS);
|
||||
|
||||
assertTrue(receivedMsg instanceof ConnAckMessage);
|
||||
ConnAckMessage connAck = (ConnAckMessage) receivedMsg;
|
||||
assertEquals(ConnAckMessage.IDENTIFIER_REJECTED, connAck.getReturnCode());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import io.netty.channel.EventLoopGroup;
|
||||
import io.netty.channel.nio.NioEventLoopGroup;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
import io.netty.channel.socket.nio.NioSocketChannel;
|
||||
import java.util.concurrent.Callable;
|
||||
import org.dna.mqtt.commons.Constants;
|
||||
import org.dna.mqtt.moquette.parser.netty.MQTTDecoder;
|
||||
import org.dna.mqtt.moquette.parser.netty.MQTTEncoder;
|
||||
@@ -39,6 +40,10 @@ import org.slf4j.LoggerFactory;
|
||||
*/
|
||||
public class Client {
|
||||
|
||||
public static interface ICallback {
|
||||
void call(AbstractMessage msg);
|
||||
}
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Client.class);
|
||||
final ClientNettyMQTTHandler handler = new ClientNettyMQTTHandler();
|
||||
EventLoopGroup workerGroup;
|
||||
@@ -78,12 +83,20 @@ public class Client {
|
||||
}
|
||||
}
|
||||
|
||||
ICallback callback;
|
||||
public void setCallback(ICallback callback) {
|
||||
this.callback = callback;
|
||||
}
|
||||
|
||||
public void sendMessage(AbstractMessage msg) {
|
||||
m_channel.writeAndFlush(msg);
|
||||
}
|
||||
|
||||
void messageReceived(AbstractMessage msg) {
|
||||
LOG.info("Received message " + msg);
|
||||
if (this.callback != null) {
|
||||
this.callback.call(msg);
|
||||
}
|
||||
}
|
||||
|
||||
void setConnectionLost(boolean status) {
|
||||
|
||||
@@ -153,8 +153,8 @@ public class ConnectDecoder extends DemuxDecoder {
|
||||
int keepAlive = in.readUnsignedShort();
|
||||
message.setKeepAlive(keepAlive);
|
||||
|
||||
if ((remainingLength == 12 && message.getProcotolVersion() == 3) ||
|
||||
(remainingLength == 10 && message.getProcotolVersion() == 4)) {
|
||||
if ((remainingLength == 12 && message.getProcotolVersion() == VERSION_3_1) ||
|
||||
(remainingLength == 10 && message.getProcotolVersion() == VERSION_3_1_1)) {
|
||||
out.add(message);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user