summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2020-02-27 05:23:39 +0300
committerKonstantin Ritt <ritt.ks@gmail.com>2020-04-02 02:39:26 +0300
commit6a441b4d67af4b0b2da85c932edfab435ec264f8 (patch)
treed0e2dc599a6c4e3ca8f7982d155939d8309068b7
parentd0cd34dc80c6682369c359b8f41751965ab130b4 (diff)
Better handling of MQTT SUBACK Reason Codes
prohibit reason codes not allowed for MQTT <=5 SUBACK (see section 3.9.3 for details) Change-Id: Ic433d14cd1c787da584e311c04273b676f4b450a Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r--src/mqtt/qmqttconnection.cpp33
1 files changed, 29 insertions, 4 deletions
diff --git a/src/mqtt/qmqttconnection.cpp b/src/mqtt/qmqttconnection.cpp
index a85e12d..f2b44da 100644
--- a/src/mqtt/qmqttconnection.cpp
+++ b/src/mqtt/qmqttconnection.cpp
@@ -1532,8 +1532,13 @@ void QMqttConnection::finalize_suback()
quint8 reason = readBufferTyped<quint8>(&m_missingData);
sub->d_func()->m_reasonCode = QMqtt::ReasonCode(reason);
- qCDebug(lcMqttConnectionVerbose) << "Finalize SUBACK: id:" << id << "qos:" << reason;
- if (reason <= 2) {
+
+ // 3.9.3
+ switch (QMqtt::ReasonCode(reason)) {
+ case QMqtt::ReasonCode::SubscriptionQoSLevel0:
+ case QMqtt::ReasonCode::SubscriptionQoSLevel1:
+ case QMqtt::ReasonCode::SubscriptionQoSLevel2:
+ qCDebug(lcMqttConnectionVerbose) << "Finalize SUBACK: id:" << id << "qos:" << reason;
// The broker might have a different support level for QoS than what
// the client requested
if (reason != sub->qos()) {
@@ -1541,9 +1546,29 @@ void QMqttConnection::finalize_suback()
emit sub->qosChanged(reason);
}
sub->setState(QMqttSubscription::Subscribed);
- } else {
- qCDebug(lcMqttConnection) << "Subscription for id " << id << " failed. Reason Code:" << reason;
+ break;
+ case QMqtt::ReasonCode::UnspecifiedError:
+ qCWarning(lcMqttConnection) << "Subscription for id " << id << " failed. Reason Code:" << reason;
sub->setState(QMqttSubscription::Error);
+ break;
+ case QMqtt::ReasonCode::ImplementationSpecificError:
+ case QMqtt::ReasonCode::NotAuthorized:
+ case QMqtt::ReasonCode::InvalidTopicFilter:
+ case QMqtt::ReasonCode::MessageIdInUse:
+ case QMqtt::ReasonCode::QuotaExceeded:
+ case QMqtt::ReasonCode::SharedSubscriptionsNotSupported:
+ case QMqtt::ReasonCode::SubscriptionIdsNotSupported:
+ case QMqtt::ReasonCode::WildCardSubscriptionsNotSupported:
+ if (m_clientPrivate->m_protocolVersion == QMqttClient::MQTT_5_0) {
+ qCWarning(lcMqttConnection) << "Subscription for id " << id << " failed. Reason Code:" << reason;
+ sub->setState(QMqttSubscription::Error);
+ break;
+ }
+ Q_FALLTHROUGH();
+ default:
+ qCWarning(lcMqttConnection) << "Received illegal SUBACK reason code:" << reason;
+ closeConnection(QMqttClient::ProtocolViolation);
+ break;
}
}
}