private boolean isServiceAviable(MqttConnectMessage connectMessage) { int version = connectMessage.variableHeader().version(); return version >= MIN_AVAILABLE_VERSION && version <= MAX_AVAILABLE_VERSION; }
public boolean isWillFlag() { return msg.variableHeader().isWillFlag(); }
public boolean isWillRetain() { return msg.variableHeader().isWillRetain(); }
public boolean isCleanSession() { return msg.variableHeader().isCleanSession(); }
public boolean isUserFlag() { return msg.variableHeader().hasUserName(); }
public boolean isPasswordFlag() { return msg.variableHeader().hasPassword(); }
public byte getProtocolVersion() { return (byte) msg.variableHeader().version(); }
public int getKeepAlive() { return msg.variableHeader().keepAliveTimeSeconds(); }
public String getProtocolName() { return msg.variableHeader().name(); }
public byte getWillQos() { return (byte) msg.variableHeader().willQos(); }
private void initializeKeepAliveTimeout(Channel channel, MqttConnectMessage msg, String clientId) { int keepAlive = msg.variableHeader().keepAliveTimeSeconds(); NettyUtils.keepAlive(channel, keepAlive); NettyUtils.cleanSession(channel, msg.variableHeader().isCleanSession()); NettyUtils.clientID(channel, clientId); int idleTime = Math.round(keepAlive * 1.5f); setIdleTime(channel.pipeline(), idleTime); LOG.debug("Connection has been configured CId={}, keepAlive={}, removeTemporaryQoS2={}, idleTime={}", clientId, keepAlive, msg.variableHeader().isCleanSession(), idleTime); }
private void copySessionConfig(MqttConnectMessage msg, Session session) { final boolean clean = msg.variableHeader().isCleanSession(); final Session.Will will; if (msg.variableHeader().isWillFlag()) { will = createWill(msg); } else { will = null; } session.update(clean, will); }
private boolean isNotProtocolVersion(MqttConnectMessage msg, MqttVersion version) { return msg.variableHeader().version() != version.protocolLevel(); }
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); }
private Session createNewSession(MQTTConnection mqttConnection, MqttConnectMessage msg, String clientId) { final boolean clean = msg.variableHeader().isCleanSession(); final Queue<SessionRegistry.EnqueuedMessage> sessionQueue = queues.computeIfAbsent(clientId, (String cli) -> queueRepository.createQueue(cli, clean)); final Session newSession; if (msg.variableHeader().isWillFlag()) { final Session.Will will = createWill(msg); newSession = new Session(clientId, clean, will, sessionQueue); } else { newSession = new Session(clean, clientId, sessionQueue); } newSession.markConnected(); newSession.bind(mqttConnection); return newSession; }
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; }
void bindToSession(MQTTConnection mqttConnection, MqttConnectMessage msg, String clientId) { boolean isSessionAlreadyStored = false; PostConnectAction postConnectAction = PostConnectAction.NONE; if (!pool.containsKey(clientId)) { // case 1 final Session newSession = createNewSession(mqttConnection, msg, clientId); // publish the session final Session previous = pool.putIfAbsent(clientId, newSession); final boolean success = previous == null; if (success) { LOG.trace("case 1, not existing session with CId {}", clientId); } else { postConnectAction = bindToExistingSession(mqttConnection, msg, clientId, newSession); isSessionAlreadyStored = true; } } else { final Session newSession = createNewSession(mqttConnection, msg, clientId); postConnectAction = bindToExistingSession(mqttConnection, msg, clientId, newSession); isSessionAlreadyStored = true; } final boolean msgCleanSessionFlag = msg.variableHeader().isCleanSession(); boolean isSessionAlreadyPresent = !msgCleanSessionFlag && isSessionAlreadyStored; mqttConnection.sendConnAck(isSessionAlreadyPresent); if (postConnectAction == PostConnectAction.SEND_STORED_MESSAGES) { final Session session = pool.get(clientId); session.sendQueuedMessagesWhileOffline(); } }
MqttConnectVariableHeader variableHeader = message.variableHeader(); MqttConnectPayload payload = message.payload(); MqttVersion mqttVersion = MqttVersion.fromProtocolNameAndLevel(variableHeader.name(),
@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); }
public static MqttConnAckMessage getMqttConnackMessage(MqttConnectMessage message, MqttConnectReturnCode returnCode) { assert message.fixedHeader().messageType() == MqttMessageType.CONNECT; MqttConnAckVariableHeader variableHeader = new MqttConnAckVariableHeader( returnCode, message.variableHeader().isCleanSession() ); MqttFixedHeader fixedHeader = new MqttFixedHeader( MqttMessageType.CONNACK, message.fixedHeader().isDup(), message.fixedHeader().qosLevel(), message.fixedHeader().isRetain(), 0); return new MqttConnAckMessage(fixedHeader, variableHeader); }