Unused parameter in WithTryPrivate causing client to send incorrect version byte in header. (#2125)

* fix: unused tryPrivate parameter in WithTryPrivate

* Fix wrong usage of try private

---------

Co-authored-by: christian <6939810+chkr1011@users.noreply.github.com>
This commit is contained in:
Victornor
2024-12-10 19:37:29 +01:00
committed by GitHub
co-authored by christian
parent 8566fd5395
commit 981ea02149
4 changed files with 26 additions and 23 deletions
@@ -18,9 +18,9 @@ namespace MQTTnet.Formatter.V3
{ {
const int FixedHeaderSize = 1; const int FixedHeaderSize = 1;
static readonly MqttDisconnectPacket DisconnectPacket = new MqttDisconnectPacket(); static readonly MqttDisconnectPacket DisconnectPacket = new();
readonly MqttBufferReader _bufferReader = new MqttBufferReader(); readonly MqttBufferReader _bufferReader = new();
readonly MqttBufferWriter _bufferWriter; readonly MqttBufferWriter _bufferWriter;
readonly MqttProtocolVersion _mqttProtocolVersion; readonly MqttProtocolVersion _mqttProtocolVersion;
@@ -68,10 +68,8 @@ namespace MQTTnet.Formatter.V3
{ {
return DecodeConnAckPacketV311(receivedMqttPacket.Body); return DecodeConnAckPacketV311(receivedMqttPacket.Body);
} }
else
{ return DecodeConnAckPacket(receivedMqttPacket.Body);
return DecodeConnAckPacket(receivedMqttPacket.Body);
}
case MqttControlPacketType.Disconnect: case MqttControlPacketType.Disconnect:
return DisconnectPacket; return DisconnectPacket;
@@ -106,10 +104,6 @@ namespace MQTTnet.Formatter.V3
payload = publishPacket.Payload; payload = publishPacket.Payload;
remainingLength += (uint)payload.Length; remainingLength += (uint)payload.Length;
} }
else
{
publishPacket = null;
}
var remainingLengthSize = MqttBufferWriter.GetVariableByteIntegerSize(remainingLength); var remainingLengthSize = MqttBufferWriter.GetVariableByteIntegerSize(remainingLength);
@@ -481,7 +475,16 @@ namespace MQTTnet.Formatter.V3
ValidateConnectPacket(packet); ValidateConnectPacket(packet);
bufferWriter.WriteString("MQTT"); bufferWriter.WriteString("MQTT");
bufferWriter.WriteByte(4); // 3.1.2.2 Protocol Level 4
// 3.1.2.2 Protocol Level 4
var protocolVersion = 4;
if (packet.TryPrivate)
{
protocolVersion |= 0x80;
}
bufferWriter.WriteByte((byte)protocolVersion);
byte connectFlags = 0x0; byte connectFlags = 0x0;
if (packet.CleanSession) if (packet.CleanSession)
@@ -552,19 +555,15 @@ namespace MQTTnet.Formatter.V3
{ {
return EncodeConnectPacketV311(connectPacket, bufferWriter); return EncodeConnectPacketV311(connectPacket, bufferWriter);
} }
else
{ return EncodeConnectPacket(connectPacket, bufferWriter);
return EncodeConnectPacket(connectPacket, bufferWriter);
}
case MqttConnAckPacket connAckPacket: case MqttConnAckPacket connAckPacket:
if (_mqttProtocolVersion == MqttProtocolVersion.V311) if (_mqttProtocolVersion == MqttProtocolVersion.V311)
{ {
return EncodeConnAckPacketV311(connAckPacket, bufferWriter); return EncodeConnAckPacketV311(connAckPacket, bufferWriter);
} }
else
{ return EncodeConnAckPacket(connAckPacket, bufferWriter);
return EncodeConnAckPacket(connAckPacket, bufferWriter);
}
case MqttDisconnectPacket _: case MqttDisconnectPacket _:
return EncodeEmptyPacket(MqttControlPacketType.Disconnect); return EncodeEmptyPacket(MqttControlPacketType.Disconnect);
case MqttPingReqPacket _: case MqttPingReqPacket _:
+1 -1
View File
@@ -127,7 +127,7 @@ public sealed class MqttClientOptions
/// connect properly. /// connect properly.
/// </remarks> /// </remarks>
/// </summary> /// </summary>
public bool TryPrivate { get; set; } = true; public bool TryPrivate { get; set; } // Implementation in Mosquitto: https://github.com/eclipse-mosquitto/mosquitto/blob/3cbe805e71ac41a2a20cc9b2ea6b3b619f49554a/lib/send_connect.c#L153
/// <summary> /// <summary>
/// Gets or sets the user properties. /// Gets or sets the user properties.
@@ -361,9 +361,9 @@ public sealed class MqttClientOptionsBuilder
/// Not all brokers support this feature so it may be necessary to set it to false if your bridge does not connect /// Not all brokers support this feature so it may be necessary to set it to false if your bridge does not connect
/// properly. /// properly.
/// </summary> /// </summary>
public MqttClientOptionsBuilder WithTryPrivate(bool tryPrivate = true) public MqttClientOptionsBuilder WithTryPrivate(bool value = true)
{ {
_options.TryPrivate = true; _options.TryPrivate = value;
return this; return this;
} }
@@ -17,7 +17,11 @@ public static class MqttClientOptionsValidator
if (options.ProtocolVersion == MqttProtocolVersion.V500) if (options.ProtocolVersion == MqttProtocolVersion.V500)
{ {
// Everything is supported. if (options.TryPrivate)
{
throw new NotSupportedException("Feature TryPrivate only works with MQTT version 3.1 and 3.1.1.");
}
return; return;
} }