Browse Source

Improved IP Filter to delete next handlers from pipeline

pull/6049/head
Andrii Shvaika 5 years ago
parent
commit
92842e0f0e
  1. 13
      common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java
  2. 2
      common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/limits/IpFilter.java
  3. 24
      common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/limits/ProxyIpFilter.java

13
common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java

@ -188,7 +188,16 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
}
InetSocketAddress getAddress(ChannelHandlerContext ctx) {
return ctx.channel().attr(MqttTransportService.ADDRESS).get();
var address = ctx.channel().attr(MqttTransportService.ADDRESS).get();
if (address == null) {
log.trace("[{}] Received empty address.", ctx.channel().id());
InetSocketAddress remoteAddress = (InetSocketAddress) ctx.channel().remoteAddress();
log.trace("[{}] Going to use address: {}", ctx.channel().id(), remoteAddress);
return remoteAddress;
} else {
log.trace("[{}] Received address: {}", ctx.channel().id(), address);
}
return address;
}
void processMqttMsg(ChannelHandlerContext ctx, MqttMessage msg) {
@ -757,7 +766,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
}
void processConnect(ChannelHandlerContext ctx, MqttConnectMessage msg) {
log.debug("[{}] Processing connect msg for client: {}!", sessionId, msg.payload().clientIdentifier());
log.debug("[{}][{}] Processing connect msg for client: {}!", address, sessionId, msg.payload().clientIdentifier());
String userName = msg.payload().userName();
String clientId = msg.payload().clientIdentifier();
if (DataConstants.PROVISION.equals(userName) || DataConstants.PROVISION.equals(clientId)) {

2
common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/limits/IpFilter.java

@ -36,7 +36,9 @@ public class IpFilter extends AbstractRemoteAddressFilter<InetSocketAddress> {
@Override
protected boolean accept(ChannelHandlerContext ctx, InetSocketAddress remoteAddress) throws Exception {
log.trace("[{}] Received msg: {}", ctx.channel().id(), remoteAddress);
if(context.checkAddress(remoteAddress)){
log.trace("[{}] Setting address: {}", ctx.channel().id(), remoteAddress);
ctx.channel().attr(MqttTransportService.ADDRESS).set(remoteAddress);
return true;
} else {

24
common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/limits/ProxyIpFilter.java

@ -38,23 +38,31 @@ public class ProxyIpFilter extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if(msg instanceof HAProxyMessage){
log.trace("[{}] Received msg: {}", ctx.channel().id(), msg);
if (msg instanceof HAProxyMessage) {
HAProxyMessage proxyMsg = (HAProxyMessage) msg;
if(proxyMsg.sourceAddress() != null && proxyMsg.sourcePort() > 0) {
if (proxyMsg.sourceAddress() != null && proxyMsg.sourcePort() > 0) {
InetSocketAddress address = new InetSocketAddress(proxyMsg.sourceAddress(), proxyMsg.sourcePort());
if(!context.checkAddress(address)){
ctx.close();
if (!context.checkAddress(address)) {
closeChannel(ctx);
} else {
log.trace("[{}] Setting address: {}", ctx.channel().id(), address);
ctx.channel().attr(MqttTransportService.ADDRESS).set(address);
// We no longer need this channel in the pipeline. Similar to HAProxyMessageDecoder
ctx.pipeline().remove(this);
}
} else {
log.debug("Received local health-check connection message: {}", proxyMsg);
ctx.close();
log.trace("Received local health-check connection message: {}", proxyMsg);
closeChannel(ctx);
}
} else {
super.channelRead(ctx, msg);
}
}
private void closeChannel(ChannelHandlerContext ctx) {
while (ctx.pipeline().last() != this) {
ctx.pipeline().removeLast();
}
ctx.pipeline().remove(this);
ctx.close();
}
}

Loading…
Cancel
Save