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:15 +0300
commitd0cd34dc80c6682369c359b8f41751965ab130b4 (patch)
tree80cf6770dcd5b085531293fe551e536bad9001b3
parentc561f28d7e3df0f4e33e016eb164d68a2cca0ce2 (diff)
Better handling of MQTT 5 CONNACK Reason Codes
* map MQTT 5 reason codes to a legacy ClientError values * prohibit reason codes not allowed for MQTT 5 CONNACK (see section 3.2.2.2 for details) Change-Id: Ia5f5c2a55c9cf7477409b7f5bf670768b42eb979 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r--src/mqtt/qmqttconnection.cpp45
1 files changed, 44 insertions, 1 deletions
diff --git a/src/mqtt/qmqttconnection.cpp b/src/mqtt/qmqttconnection.cpp
index 76c04c9..a85e12d 100644
--- a/src/mqtt/qmqttconnection.cpp
+++ b/src/mqtt/qmqttconnection.cpp
@@ -1459,9 +1459,52 @@ void QMqttConnection::finalize_connack()
m_clientPrivate->m_serverConnectionProperties = serverProp;
m_receiveAliases.resize(m_clientPrivate->m_serverConnectionProperties.maximumTopicAlias());
m_publishAliases.resize(m_clientPrivate->m_connectionProperties.maximumTopicAlias());
- if (connectResultValue != 0) {
+
+ // 3.2.2.2
+ switch (QMqtt::ReasonCode(connectResultValue)) {
+ case QMqtt::ReasonCode::Success:
+ break;
+ case QMqtt::ReasonCode::MalformedPacket:
+ case QMqtt::ReasonCode::ProtocolError:
+ closeConnection(QMqttClient::ProtocolViolation);
+ return;
+ case QMqtt::ReasonCode::UnsupportedProtocolVersion:
+ closeConnection(QMqttClient::InvalidProtocolVersion);
+ return;
+ case QMqtt::ReasonCode::InvalidClientId:
+ closeConnection(QMqttClient::IdRejected);
+ return;
+ case QMqtt::ReasonCode::ServerNotAvailable:
+ case QMqtt::ReasonCode::ServerBusy:
+ case QMqtt::ReasonCode::UseAnotherServer:
+ case QMqtt::ReasonCode::ServerMoved:
+ closeConnection(QMqttClient::ServerUnavailable);
+ return;
+ case QMqtt::ReasonCode::InvalidUserNameOrPassword:
+ closeConnection(QMqttClient::BadUsernameOrPassword);
+ return;
+ case QMqtt::ReasonCode::NotAuthorized:
+ closeConnection(QMqttClient::NotAuthorized);
+ return;
+ case QMqtt::ReasonCode::UnspecifiedError:
+ closeConnection(QMqttClient::UnknownError);
+ return;
+ case QMqtt::ReasonCode::ImplementationSpecificError:
+ case QMqtt::ReasonCode::ClientBanned:
+ case QMqtt::ReasonCode::InvalidAuthenticationMethod:
+ case QMqtt::ReasonCode::InvalidTopicName:
+ case QMqtt::ReasonCode::PacketTooLarge:
+ case QMqtt::ReasonCode::QuotaExceeded:
+ case QMqtt::ReasonCode::InvalidPayloadFormat:
+ case QMqtt::ReasonCode::RetainNotSupported:
+ case QMqtt::ReasonCode::QoSNotSupported:
+ case QMqtt::ReasonCode::ExceededConnectionRate:
closeConnection(QMqttClient::Mqtt5SpecificError);
return;
+ default:
+ qCDebug(lcMqttConnection) << "Received illegal CONNACK reason code:" << connectResultValue;
+ closeConnection(QMqttClient::ProtocolViolation);
+ return;
}
}