String clientIdentifier = payload.clientIdentifier(); if (!isValidClientId(mqttVersion, clientIdentifier)) { throw new MqttIdentifierRejectedException("invalid clientIdentifier: " + clientIdentifier); String willTopic = payload.willTopic(); byte[] willTopicBytes = willTopic != null ? encodeStringUtf8(willTopic) : EmptyArrays.EMPTY_BYTES; byte[] willMessage = payload.willMessageInBytes(); byte[] willMessageBytes = willMessage != null ? willMessage : EmptyArrays.EMPTY_BYTES; if (variableHeader.isWillFlag()) { String userName = payload.userName(); byte[] userNameBytes = userName != null ? encodeStringUtf8(userName) : EmptyArrays.EMPTY_BYTES; if (variableHeader.hasUserName()) { byte[] password = payload.passwordInBytes(); byte[] passwordBytes = password != null ? password : EmptyArrays.EMPTY_BYTES; if (variableHeader.hasPassword()) {
public MqttConnectMessage build() { MqttFixedHeader mqttFixedHeader = new MqttFixedHeader(MqttMessageType.CONNECT, false, MqttQoS.AT_MOST_ONCE, false, 0); MqttConnectVariableHeader mqttConnectVariableHeader = new MqttConnectVariableHeader( version.protocolName(), version.protocolLevel(), hasUser, hasPassword, willRetain, willQos.value(), willFlag, cleanSession, keepAliveSecs); MqttConnectPayload mqttConnectPayload = new MqttConnectPayload(clientId, willTopic, willMessage, username, password); return new MqttConnectMessage(mqttFixedHeader, mqttConnectVariableHeader, mqttConnectPayload); } }
private boolean login(MqttConnectMessage msg, final String clientId) { // handle user authentication if (msg.variableHeader().hasUserName()) { byte[] pwd = null; if (msg.variableHeader().hasPassword()) { pwd = msg.payload().password().getBytes(StandardCharsets.UTF_8); } else if (!brokerConfig.isAllowAnonymous()) { LOG.error("Client didn't supply any password and MQTT anonymous mode is disabled CId={}", clientId); return false; } final String login = msg.payload().userName(); if (!authenticator.checkValid(clientId, login, pwd)) { LOG.error("Authenticator has rejected the MQTT credentials CId={}, username={}", clientId, login); return false; } NettyUtils.userName(channel, login); } else if (!brokerConfig.isAllowAnonymous()) { LOG.error("Client didn't supply any credentials and MQTT anonymous mode is disabled. CId={}", clientId); return false; } return true; }
@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)); } }
private Session.Will createWill(MqttConnectMessage msg) { final ByteBuf willPayload = Unpooled.copiedBuffer(msg.payload().willMessageInBytes()); final String willTopic = msg.payload().willTopic(); final boolean retained = msg.variableHeader().isWillRetain(); final MqttQoS qos = MqttQoS.valueOf(msg.variableHeader().willQos()); return new Session.Will(willTopic, willPayload, qos, retained); }
msg.payload().willTopic(), msg.payload().willMessage(), msg.variableHeader().willQos(), msg.variableHeader().isWillRetain()); msg.variableHeader().hasPassword()) ? new MqttAuthImpl( msg.payload().userName(), msg.payload().password()) : null; boolean isZeroBytes = (msg.payload().clientIdentifier() == null) || msg.payload().clientIdentifier().isEmpty(); clientIdentifier = msg.payload().clientIdentifier(); } else if (this.options.isAutoClientId()) { clientIdentifier = UUID.randomUUID().toString();
private static void validateConnectPayload(MqttConnectPayload expected, MqttConnectPayload actual) { assertEquals( "MqttConnectPayload ClientId mismatch ", expected.clientId(), actual.clientId()); assertEquals("MqttConnectPayload UserName mismatch ", expected.userName(), actual.userName()); assertEquals("MqttConnectPayload Password mismatch ", expected.password(), actual.password()); assertEquals("MqttConnectPayload WillMessage mismatch ", expected.willMessage(), actual.willMessage()); assertEquals("MqttConnectPayload WillTopic mismatch ", expected.willTopic(), actual.willTopic()); }
.append(", isCleanSession=").append(connectHeader.isCleanSession()) .append(", keepAliveTimeSeconds=").append(connectHeader.keepAliveTimeSeconds()) .append(", clientIdentifier=").append(payload.clientIdentifier()) .append(", hasUserName=").append(connectHeader.hasUserName()); if (connectHeader.hasUserName()) { log.append(", userName=").append(payload.userName()); log.append(", willQos=").append(connectHeader.willQos()) .append(", isWillRetain=").append(connectHeader.isWillRetain()) .append(", willTopic=").append(payload.willTopic());
@Override public void handleMessage(Message message) { MqttClient client = (MqttClient) message.getClient(); MqttConnectMessage connectMessage = (MqttConnectMessage) message.getPayload(); MqttConnectReturnCode returnCode; MqttConnAckMessage ackMessage; ChannelHandlerContext ctx = client.getCtx(); if (!isClientIdValid(connectMessage.payload().clientIdentifier())) { returnCode = MqttConnectReturnCode.CONNECTION_REFUSED_IDENTIFIER_REJECTED; } else if (!checkUsername(connectMessage.payload().userName()) || !checkPassword(connectMessage.payload().passwordInBytes())) { returnCode = MqttConnectReturnCode.CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD; } else if (!isAuthorized(connectMessage)) { returnCode = MqttConnectReturnCode.CONNECTION_REFUSED_NOT_AUTHORIZED; } else if (client.isConnected()) { // protocol violation and disconnect ctx.fireUserEventTriggered(new DisconnectChannelEvent(ctx.channel())); return; } else if (!isServiceAviable(connectMessage)) { returnCode = MqttConnectReturnCode.CONNECTION_REFUSED_SERVER_UNAVAILABLE; } else { client.setId(connectMessage.payload().clientIdentifier()); client.setConnected(true); client.setCleanSession(connectMessage.variableHeader().isCleanSession()); ctx.channel().attr(ChannelConfiguration.CHANNEL_IDLE_TIME_ATTRIBUTE_KEY).set(connectMessage.variableHeader().keepAliveTimeSeconds()); returnCode = MqttConnectReturnCode.CONNECTION_ACCEPTED; } ackMessage = MessageUtil.getMqttConnackMessage(connectMessage, returnCode); ctx.writeAndFlush(ackMessage); }
void processConnect(MqttConnectMessage msg) { MqttConnectPayload payload = msg.payload(); String clientId = payload.clientIdentifier(); final String username = payload.userName(); LOG.trace("Processing CONNECT message. CId={} username: {} channel: {}", clientId, username, channel);
String deviceId = payload.clientIdentifier(); if (StringUtils.isBlank(deviceId)) { MqttConnectReturnCode connectReturnCode = MqttConnectReturnCode.CONNECTION_REFUSED_IDENTIFIER_REJECTED; && !baseAuthService.authorized(payload.userName(),payload.password())){ MqttConnectReturnCode connectReturnCode = MqttConnectReturnCode.CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD; connectBack(channel,connectReturnCode);
String deviceId = getDeviceId(channel); MqttChannel build = MqttChannel.builder().channel(channel).cleanSession(mqttConnectVariableHeader.isCleanSession()) .deviceId(payload.clientIdentifier()) .sessionStatus(SessionStatus.OPEN) .isWill(mqttConnectVariableHeader.isWillFlag()) if (connectSuccess(deviceId, build)) { // 初始化存储mqttchannel if (mqttConnectVariableHeader.isWillFlag()) { // 遗嘱消息标志 boolean b = doIf(mqttConnectVariableHeader, mqttConnectVariableHeader1 -> (payload.willMessage() != null) , mqttConnectVariableHeader1 -> (payload.willTopic() != null)); if (!b) { throw new ConnectionException("will message and will topic is not null"); qos(mqttConnectVariableHeader.willQos()) .willMessage(deviceId) .willTopic(payload.willTopic()) .isRetain(mqttConnectVariableHeader.isWillRetain()) .build(); willService.save(payload.clientIdentifier(), buildWill); } else { willService.del(payload.clientIdentifier()); boolean b = doIf(mqttConnectVariableHeader, mqttConnectVariableHeader1 -> (!mqttConnectVariableHeader1.isWillRetain()), mqttConnectVariableHeader1 -> (mqttConnectVariableHeader1.willQos() == 0)); ConcurrentLinkedQueue<SessionMessage> sessionMessages = clientSessionService.getByteBuf(payload.clientIdentifier()); doIfElse(sessionMessages, messages -> messages != null && !messages.isEmpty(), byteBufs -> { SessionMessage sessionMessage;
public String getClientID() { return msg.payload().clientIdentifier(); }
private void storeWillMessage(MqttConnectMessage msg, String clientId) { // Handle will flag if (msg.variableHeader().isWillFlag()) { MqttQoS willQos = MqttQoS.valueOf(msg.variableHeader().willQos()); LOG.debug("Configuring MQTT last will and testament CId={}, willQos={}, willTopic={}, willRetain={}", clientId, willQos, msg.payload().willTopic(), msg.variableHeader().isWillRetain()); byte[] willPayload = msg.payload().willMessage().getBytes(StandardCharsets.UTF_8); ByteBuffer bb = (ByteBuffer) ByteBuffer.allocate(willPayload.length).put(willPayload).flip(); // save the will testament in the clientID store WillMessage will = new WillMessage(msg.payload().willTopic(), bb, msg.variableHeader().isWillRetain(), willQos); m_willStore.put(clientId, will); LOG.debug("MQTT last will and testament has been configured. CId={}", clientId); } }
public String getUsername() { return msg.payload().userName(); }
public String getWillTopic() { return msg.payload().willTopic(); }
public byte[] getWillMessage() { return msg.payload().willMessage().getBytes(StandardCharsets.UTF_8); } }
public byte[] getPassword() { return msg.payload().password().getBytes(StandardCharsets.UTF_8); }
msg.payload().willTopic(), msg.payload().willMessage(), msg.variableHeader().willQos(), msg.variableHeader().isWillRetain()); msg.variableHeader().hasPassword()) ? new MqttAuth( msg.payload().userName(), msg.payload().password()) : null; boolean isZeroBytes = (msg.payload().clientIdentifier() == null) || msg.payload().clientIdentifier().isEmpty(); clientIdentifier = msg.payload().clientIdentifier(); } else if (this.options.isAutoClientId()) { clientIdentifier = UUID.randomUUID().toString();
String clientId = payload.clientId(); byte[] clientIdBytes = encodeStringUtf8(clientId); payloadBufferSize += 2 + clientIdBytes.length; String willTopic = payload.willTopic(); byte[] willTopicBytes = willTopic != null ? encodeStringUtf8(willTopic) : EmptyArrays.EMPTY_BYTES; String willMessage = payload.willMessage(); byte[] willMessageBytes = willMessage != null ? encodeStringUtf8(willMessage) : EmptyArrays.EMPTY_BYTES; if (variableHeader.willFlag()) { String userName = payload.userName(); byte[] userNameBytes = userName != null ? encodeStringUtf8(userName) : EmptyArrays.EMPTY_BYTES; if (variableHeader.userNameFlag()) { String password = payload.password(); byte[] passwordBytes = password != null ? encodeStringUtf8(password) : EmptyArrays.EMPTY_BYTES; if (variableHeader.passwordFlag()) {