diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2020-02-27 05:23:39 +0300 |
---|---|---|
committer | Konstantin Ritt <ritt.ks@gmail.com> | 2020-04-02 02:39:26 +0300 |
commit | 6a441b4d67af4b0b2da85c932edfab435ec264f8 (patch) | |
tree | d0e2dc599a6c4e3ca8f7982d155939d8309068b7 | |
parent | d0cd34dc80c6682369c359b8f41751965ab130b4 (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.cpp | 33 |
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; } } } |