public void subscribeClientToTopics(MqttSubscribeMessage msg, String clientID, String username, MQTTConnection mqttConnection) { // verify which topics of the subscribe ongoing has read access permission int messageID = messageId(msg); List<MqttTopicSubscription> ackTopics = authorizator.verifyTopicsReadAccess(clientID, username, msg); MqttSubAckMessage ackMessage = doAckMessageFromValidateFilters(ackTopics, messageID); // store topics subscriptions in session List<Subscription> newSubscriptions = ackTopics.stream() .filter(req -> req.qualityOfService() != FAILURE) .map(req -> { final Topic topic = new Topic(req.topicName()); return new Subscription(clientID, topic, req.qualityOfService()); }).collect(Collectors.toList()); for (Subscription subscription : newSubscriptions) { subscriptions.add(subscription); } // add the subscriptions to Session Session session = sessionRegistry.retrieve(clientID); session.addSubscriptions(newSubscriptions); // send ack message mqttConnection.sendSubAckMessage(messageID, ackMessage); publishRetainedMessagesForSubscriptions(clientID, newSubscriptions); for (Subscription subscription : newSubscriptions) { interceptor.notifyTopicSubscribed(subscription, username); } }
Topic topic = new Topic(req.topicName()); if (!policy.canRead(topic, username, clientID)) { ackTopics.add(new MqttTopicSubscription(topic.toString(), FAILURE)); } else { MqttQoS qos; LOG.debug("Client will be subscribed to the topic CId={}, username: {}, messageId: {}, topic: {}", clientID, username, messageId, topic); qos = req.qualityOfService(); } else { LOG.warn("Topic filter is not valid CId={}, username: {}, messageId: {}, topic: {}", clientID, qos = FAILURE; ackTopics.add(new MqttTopicSubscription(topic.toString(), qos));
public SubscribeBuilder addSubscription(MqttQoS qos, String topic) { if (subscriptions == null) { subscriptions = new ArrayList<MqttTopicSubscription>(5); } subscriptions.add(new MqttTopicSubscription(topic, qos)); return this; }
private List<String> toList(){ return Optional.ofNullable(topics). map(mqttTopicSubscriptions -> mqttTopicSubscriptions.stream(). map(mqttTopicSubscription -> mqttTopicSubscription.topicName()).collect(Collectors.toList())) .orElse(null); }
/** * Create the SUBACK response from a list of topicFilters */ private MqttSubAckMessage doAckMessageFromValidateFilters(List<MqttTopicSubscription> topicFilters, int messageId) { List<Integer> grantedQoSLevels = new ArrayList<>(); for (MqttTopicSubscription req : topicFilters) { grantedQoSLevels.add(req.qualityOfService().value()); } MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.SUBACK, false, AT_MOST_ONCE, false, 0); MqttSubAckPayload payload = new MqttSubAckPayload(grantedQoSLevels); return new MqttSubAckMessage(fixedHeader, from(messageId), payload); }
throw new ValidateException(new ErrorEntity(ErrorCode.INVALID)); requestSubscriptions.add(new MqttTopicSubscription(subscription.getTopic(), requestQos)); String topic = requestSubscriptions.get(i).topic(); List<String> topicLevels = Topics.sanitize(topic); grantedSubscriptions.add(new MqttTopicSubscriptionGranted(topic, grantedQoS));
@Override public List<MqttGrantedQoS> authSubscribe(String clientId, String userName, List<MqttTopicSubscription> requestSubscriptions) { List<MqttGrantedQoS> r = new ArrayList<>(); requestSubscriptions.forEach(subscription -> { if (!this.allowDollar && subscription.topic().startsWith("$")) r.add(MqttGrantedQoS.NOT_GRANTED); else if (subscription.topic().equals(this.deniedTopic)) r.add(MqttGrantedQoS.NOT_GRANTED); else r.add(MqttGrantedQoS.valueOf(subscription.requestedQos().value())); }); return r; }
public static Message<MqttPacketIdVariableHeader, MqttSubscribePayloadGranted> fromMqttMessage(MqttSubscribeMessage msg, List<MqttGrantedQoS> grantedQoSes, MqttVersion version, String clientId, String userName, String brokerId) { // forge topic subscriptions List<MqttTopicSubscriptionGranted> subscriptions = new ArrayList<>(); for (int i = 0; i < msg.payload().subscriptions().size(); i++) { MqttTopicSubscriptionGranted subscription = new MqttTopicSubscriptionGranted(msg.payload().subscriptions().get(i).topic(), grantedQoSes.get(i)); subscriptions.add(subscription); } return new Message<>(msg.fixedHeader(), new MqttAdditionalHeader(version, clientId, userName, brokerId), msg.variableHeader(), new MqttSubscribePayloadGranted(subscriptions)); }
private static Result<MqttSubscribePayload> decodeSubscribePayload( ByteBuf buffer, int bytesRemainingInVariablePart) { final List<MqttTopicSubscription> subscribeTopics = new ArrayList<MqttTopicSubscription>(); int numberOfBytesConsumed = 0; while (numberOfBytesConsumed < bytesRemainingInVariablePart) { final Result<String> decodedTopicName = decodeString(buffer); numberOfBytesConsumed += decodedTopicName.numberOfBytesConsumed; int qos = buffer.readUnsignedByte() & 0x03; numberOfBytesConsumed++; subscribeTopics.add(new MqttTopicSubscription(decodedTopicName.value, MqttQoS.valueOf(qos))); } return new Result<MqttSubscribePayload>(new MqttSubscribePayload(subscribeTopics), numberOfBytesConsumed); }
/** * 订阅 */ @Override public void subscribe(Channel channel, MqttSubscribeMessage mqttSubscribeMessage) { Set<String> topics = mqttSubscribeMessage.payload().topicSubscriptions().stream().map(mqttTopicSubscription -> mqttTopicSubscription.topicName() ).collect(Collectors.toSet()); mqttChannelService.suscribeSuccess(mqttChannelService.getDeviceId(channel), topics); subBack(channel, mqttSubscribeMessage, topics.size()); }
/** * As per MQTT Spec. Subscribes this client to a number of MQTT topics. * * @param subscriptions * @return An array of integers representing the list of accepted QoS for each topic. * @throws Exception */ int[] addSubscriptions(List<MqttTopicSubscription> subscriptions) throws Exception { int[] qos = new int[subscriptions.size()]; for (int i = 0; i < subscriptions.size(); i++) { addSubscription(subscriptions.get(i)); qos[i] = subscriptions.get(i).qualityOfService().value(); } return qos; }
private static void validateTopicSubscription( MqttTopicSubscription expected, MqttTopicSubscription actual) { assertEquals("MqttTopicSubscription Topic mismatch ", expected.topic(), actual.topic()); assertEquals( "MqttTopicSubscription Qos mismatch ", expected.requestedQos(), actual.requestedQos()); }
if (!this.validator.isTopicFilterValid(subscription.topic())) { logger.debug("Protocol violation: Client {} subscription {} is not valid based on configuration, disconnect the client", this.clientId, subscription.topic()); ctx.close(); return; String topic = requestSubscriptions.get(i).topic(); List<String> topicLevels = Topics.sanitize(topic);
String topicName = topic.topicName(); byte[] topicNameBytes = encodeStringUtf8(topicName); payloadBufferSize += 2 + topicNameBytes.length; String topicName = topic.topicName(); byte[] topicNameBytes = encodeStringUtf8(topicName); buf.writeShort(topicNameBytes.length); buf.writeBytes(topicNameBytes, 0, topicNameBytes.length); buf.writeByte(topic.qualityOfService().value());
Topic topic = new Topic(req.topicName()); if (!m_authorizator.canRead(topic, username, clientSession.clientID)) { ackTopics.add(new MqttTopicSubscription(topic.toString(), FAILURE)); } else { MqttQoS qos; LOG.debug("Client will be subscribed to the topic CId={}, username={}, messageId={}, topic={}", clientID, username, messageId, topic); qos = req.qualityOfService(); } else { LOG.warn("Topic filter is not valid CId={}, username={}, messageId={}, topic={}", clientID, qos = FAILURE; ackTopics.add(new MqttTopicSubscription(topic.toString(), qos));
public SubscribeBuilder addSubscription(MqttQoS qos, String topic) { if (subscriptions == null) { subscriptions = new ArrayList<MqttTopicSubscription>(5); } subscriptions.add(new MqttTopicSubscription(topic, qos)); return this; }
void clean() throws Exception { for (MqttTopicSubscription mqttTopicSubscription : session.getSessionState().getSubscriptions()) { removeSubscription(mqttTopicSubscription.topicName()); } } }
/** * As per MQTT Spec. Subscribes this client to a number of MQTT topics. * * @param subscriptions * @return An array of integers representing the list of accepted QoS for each topic. * @throws Exception */ int[] addSubscriptions(List<MqttTopicSubscription> subscriptions) throws Exception { int[] qos = new int[subscriptions.size()]; for (int i = 0; i < subscriptions.size(); i++) { addSubscription(subscriptions.get(i)); qos[i] = subscriptions.get(i).qualityOfService().value(); } return qos; }
String topicName = topic.topic(); byte[] topicNameBytes = encodeStringUtf8(topicName); payloadBufferSize += 2 + topicNameBytes.length; String topicName = topic.topic(); byte[] topicNameBytes = encodeStringUtf8(topicName); buf.writeShort(topicNameBytes.length); buf.writeBytes(topicNameBytes, 0, topicNameBytes.length); buf.writeByte(topic.requestedQos().value());
List<Integer> grantQoss = new ArrayList<>(); topicSubscriptions.forEach(s -> { String topic = s.topicName(); int actualQos = MessageUtil.actualQos(s.qualityOfService().value()); grantQoss.add(actualQos); subscriptionStore.append(