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:15 +0300 |
commit | d0cd34dc80c6682369c359b8f41751965ab130b4 (patch) | |
tree | 80cf6770dcd5b085531293fe551e536bad9001b3 | |
parent | c561f28d7e3df0f4e33e016eb164d68a2cca0ce2 (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.cpp | 45 |
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; } } |