@Override
protected void channelRead0(ChannelHandlerContext ctx, MqttConnectMessage message) {
String username = message.payload().userName().trim().toLowerCase();
String token = new String(message.payload().passwordInBytes(), CharsetUtil.UTF_8);
TokenValue tokenValue = holder.tokenManager.getTokenValueByToken(token);
if (tokenValue == null || !tokenValue.user.email.equalsIgnoreCase(username)) {
log.debug("MqttHardwareLogic token is invalid. Token '{}', '{}'", token, ctx.channel().remoteAddress());
ctx.writeAndFlush(createConnAckMessage(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD), ctx.voidPromise());
return;
}
User user = tokenValue.user;
Device device = tokenValue.device;
DashBoard dash = tokenValue.dash;
ChannelPipeline pipeline = ctx.pipeline();
HardwareStateHolder hardwareStateHolder = new HardwareStateHolder(user, tokenValue.dash, device);
pipeline.replace(this, "HHArdwareMqttHandler", new MqttHardwareHandler(holder, hardwareStateHolder));
Session session = holder.sessionDao.getOrCreateSessionByUser(
hardwareStateHolder.userKey, ctx.channel().eventLoop());
if (session.isSameEventLoop(ctx)) {
completeLogin(ctx.channel(), session, user, dash, device, -1);
} else {
log.debug("Re registering hard channel. {}", ctx.channel());
ReregisterChannelUtil.reRegisterChannel(ctx, session, channelFuture ->
completeLogin(channelFuture.channel(), session, user, dash, device, -1));
}
}