Enhanced exception handling / logging for invalid messages

Signed-off-by: Maik Scheibler <[email protected]>
This commit is contained in:
Maik Scheibler
2019-01-28 13:18:28 +01:00
parent 07e6ab324f
commit 9a13c50e91
3 changed files with 25 additions and 9 deletions
@@ -16,8 +16,11 @@
package io.moquette.broker;
import java.io.IOException;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.mqtt.MqttMessage;
import io.netty.util.Attribute;
import io.netty.util.AttributeKey;
@@ -69,6 +72,25 @@ public final class NettyUtils {
return (String) channel.attr(NettyUtils.ATTR_KEY_USERNAME).get();
}
private NettyUtils() {
/**
* Validate that the provided message is an MqttMessage and that it does not contain a failed result.
*
* @param message to be validated
* @return the casted provided message
* @throws IOException in case of an fail message this will wrap the root cause
* @throws ClassCastException if the provided message is no MqttMessage
*/
public static MqttMessage validateMessage(Object message) throws IOException, ClassCastException {
MqttMessage msg = (MqttMessage) message;
if (msg.decoderResult() != null && msg.decoderResult().isFailure()) {
throw new IOException("invalid massage", msg.decoderResult().cause());
}
if (msg.fixedHeader() == null) {
throw new IOException("Unknown packet, no fixedHeader present, no cause provided");
}
return msg;
}
private NettyUtils() {
}
}
@@ -52,10 +52,7 @@ public class NewNettyMQTTHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object message) throws Exception {
MqttMessage msg = (MqttMessage) message;
if (msg.fixedHeader() == null) {
throw new IOException("Unknown packet");
}
MqttMessage msg = NettyUtils.validateMessage(message);
final MQTTConnection mqttConnection = mqttConnection(ctx.channel());
try {
mqttConnection.handleMessage(msg);
@@ -58,10 +58,7 @@ public class MQTTMessageLogger extends ChannelDuplexHandler {
if (!(message instanceof MqttMessage)) {
return;
}
MqttMessage msg = (MqttMessage) message;
if (msg.fixedHeader() == null) {
throw new IOException("Unknown packet");
}
MqttMessage msg = NettyUtils.validateMessage(message);
String clientID = NettyUtils.clientID(ctx.channel());
MqttMessageType messageType = msg.fixedHeader().messageType();
switch (messageType) {