mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-17 01:33:03 +08:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83b85b8059 | ||
|
|
db2c164dbf | ||
|
|
30426e5e1e |
@@ -10,12 +10,20 @@ namespace MQTTnet.Client
|
|||||||
{
|
{
|
||||||
public sealed class MqttClientCertificateValidationEventArgs : EventArgs
|
public sealed class MqttClientCertificateValidationEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public X509Certificate Certificate { get; set; }
|
public MqttClientCertificateValidationEventArgs(X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors, IMqttClientChannelOptions clientOptions)
|
||||||
|
{
|
||||||
|
Certificate = certificate ?? throw new ArgumentNullException(nameof(certificate));
|
||||||
|
Chain = chain ?? throw new ArgumentNullException(nameof(chain));
|
||||||
|
SslPolicyErrors = sslPolicyErrors;
|
||||||
|
ClientOptions = clientOptions ?? throw new ArgumentNullException(nameof(clientOptions));
|
||||||
|
}
|
||||||
|
|
||||||
public X509Chain Chain { get; set; }
|
public X509Certificate Certificate { get; }
|
||||||
|
|
||||||
public SslPolicyErrors SslPolicyErrors { get; set; }
|
public X509Chain Chain { get; }
|
||||||
|
|
||||||
public IMqttClientChannelOptions ClientOptions { get; set; }
|
public IMqttClientChannelOptions ClientOptions { get; }
|
||||||
|
|
||||||
|
public SslPolicyErrors SslPolicyErrors { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,14 @@ namespace MQTTnet.Client
|
|||||||
{
|
{
|
||||||
public static bool Handle(MqttClientCertificateValidationEventArgs eventArgs)
|
public static bool Handle(MqttClientCertificateValidationEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
if (eventArgs.SslPolicyErrors == SslPolicyErrors.None)
|
var sslPolicyErrors = eventArgs.SslPolicyErrors;
|
||||||
|
|
||||||
|
if (eventArgs.ClientOptions?.TlsOptions?.IgnoreCertificateChainErrors ?? false)
|
||||||
|
{
|
||||||
|
sslPolicyErrors &= ~SslPolicyErrors.RemoteCertificateChainErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sslPolicyErrors == SslPolicyErrors.None)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ namespace MQTTnet.Client
|
|||||||
{
|
{
|
||||||
public bool UseTls { get; set; }
|
public bool UseTls { get; set; }
|
||||||
|
|
||||||
public Func<MqttClientCertificateValidationEventArgs, bool> CertificateValidationHandler { get; set; }
|
public Func<MqttClientCertificateValidationEventArgs, bool> CertificateValidationHandler { get; set; } = MqttClientDefaultCertificateValidationHandler.Handle;
|
||||||
|
|
||||||
#if NET48 || NETCOREAPP3_1 || NET5 || NET6
|
#if NET48 || NETCOREAPP3_1 || NET5 || NET6
|
||||||
public SslProtocols SslProtocol { get; set; } = SslProtocols.Tls12 | SslProtocols.Tls13;
|
public SslProtocols SslProtocol { get; set; } = SslProtocols.Tls12 | SslProtocols.Tls13;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ namespace MQTTnet.Client
|
|||||||
{
|
{
|
||||||
public sealed class MqttClientTlsOptions
|
public sealed class MqttClientTlsOptions
|
||||||
{
|
{
|
||||||
public Func<MqttClientCertificateValidationEventArgs, bool> CertificateValidationHandler { get; set; }
|
public Func<MqttClientCertificateValidationEventArgs, bool> CertificateValidationHandler { get; set; } = MqttClientDefaultCertificateValidationHandler.Handle;
|
||||||
|
|
||||||
public bool UseTls { get; set; }
|
public bool UseTls { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -264,27 +264,15 @@ namespace MQTTnet.Implementations
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InternalUserCertificateValidationCallback(object sender, X509Certificate x509Certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
|
bool InternalUserCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
|
||||||
{
|
{
|
||||||
var certificateValidationHandler = _tcpOptions?.TlsOptions?.CertificateValidationHandler;
|
var certificateValidationHandler = _tcpOptions?.TlsOptions?.CertificateValidationHandler;
|
||||||
if (certificateValidationHandler != null)
|
if (certificateValidationHandler != null)
|
||||||
{
|
{
|
||||||
var eventArgs = new MqttClientCertificateValidationEventArgs
|
var eventArgs = new MqttClientCertificateValidationEventArgs(certificate, chain, sslPolicyErrors, _tcpOptions);
|
||||||
{
|
|
||||||
Certificate = x509Certificate,
|
|
||||||
Chain = chain,
|
|
||||||
SslPolicyErrors = sslPolicyErrors,
|
|
||||||
ClientOptions = _tcpOptions
|
|
||||||
};
|
|
||||||
|
|
||||||
return certificateValidationHandler(eventArgs);
|
return certificateValidationHandler(eventArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_tcpOptions?.TlsOptions?.IgnoreCertificateChainErrors ?? false)
|
|
||||||
{
|
|
||||||
sslPolicyErrors &= ~SslPolicyErrors.RemoteCertificateChainErrors;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sslPolicyErrors == SslPolicyErrors.None;
|
return sslPolicyErrors == SslPolicyErrors.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -224,14 +224,7 @@ namespace MQTTnet.Implementations
|
|||||||
clientWebSocket.Options.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
|
clientWebSocket.Options.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
|
||||||
{
|
{
|
||||||
// TODO: Find a way to add client options to same callback. Problem is that they have a different type.
|
// TODO: Find a way to add client options to same callback. Problem is that they have a different type.
|
||||||
var context = new MqttClientCertificateValidationEventArgs
|
var context = new MqttClientCertificateValidationEventArgs(certificate, chain, sslPolicyErrors, _options);
|
||||||
{
|
|
||||||
Certificate = certificate,
|
|
||||||
Chain = chain,
|
|
||||||
SslPolicyErrors = sslPolicyErrors,
|
|
||||||
ClientOptions = _options
|
|
||||||
};
|
|
||||||
|
|
||||||
return certificateValidationHandler(context);
|
return certificateValidationHandler(context);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -5,78 +5,13 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
// ReSharper disable MemberCanBePrivate.Global
|
|
||||||
|
|
||||||
namespace MQTTnet
|
namespace MQTTnet
|
||||||
{
|
{
|
||||||
public static class MqttApplicationMessageExtensions
|
public static class MqttApplicationMessageExtensions
|
||||||
{
|
{
|
||||||
public static short ConvertPayloadToByte(this MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
if (applicationMessage == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (applicationMessage.Payload.Length != 1)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Payload requires to be 1 bytes long.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return applicationMessage.Payload[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static short ConvertPayloadToInt16(this MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
if (applicationMessage == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (applicationMessage.Payload.Length != 2)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Payload requires to be 2 bytes long.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return BitConverter.ToInt16(applicationMessage.Payload, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int ConvertPayloadToInt32(this MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
if (applicationMessage == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (applicationMessage.Payload?.Length != 4)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Payload requires to be 4 bytes long.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return BitConverter.ToInt32(applicationMessage.Payload, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static long ConvertPayloadToInt64(this MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
if (applicationMessage == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (applicationMessage.Payload.Length != 8)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Payload requires to be 8 bytes long.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return BitConverter.ToInt64(applicationMessage.Payload, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string ConvertPayloadToString(this MqttApplicationMessage applicationMessage)
|
public static string ConvertPayloadToString(this MqttApplicationMessage applicationMessage)
|
||||||
{
|
{
|
||||||
if (applicationMessage == null)
|
if (applicationMessage == null) throw new ArgumentNullException(nameof(applicationMessage));
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (applicationMessage.Payload == null)
|
if (applicationMessage.Payload == null)
|
||||||
{
|
{
|
||||||
@@ -90,65 +25,5 @@ namespace MQTTnet
|
|||||||
|
|
||||||
return Encoding.UTF8.GetString(applicationMessage.Payload, 0, applicationMessage.Payload.Length);
|
return Encoding.UTF8.GetString(applicationMessage.Payload, 0, applicationMessage.Payload.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static decimal ParsePayloadToDecimal(this MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
if (applicationMessage == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
return decimal.Parse(ConvertPayloadToString(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double ParsePayloadToDouble(this MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
if (applicationMessage == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
return double.Parse(ConvertPayloadToString(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static short ParsePayloadToInt16(this MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
if (applicationMessage == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
return short.Parse(ConvertPayloadToString(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int ParsePayloadToInt32(this MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
if (applicationMessage == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
return int.Parse(ConvertPayloadToString(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static long ParsePayloadToInt64(this MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
if (applicationMessage == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
return long.Parse(ConvertPayloadToString(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float ParsePayloadToSingle(this MqttApplicationMessage applicationMessage)
|
|
||||||
{
|
|
||||||
if (applicationMessage == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(applicationMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
return float.Parse(ConvertPayloadToString(applicationMessage));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user