提交 562a5304 编写于 作者: C Christian Kratky

Add flag for secure connections.

上级 1e697a94
......@@ -25,6 +25,8 @@
* [Server] Added support for MQTTv5 clients. The server will still return _success_ for all cases at the moment even if more granular codes are available.
* [Server] Fixed issues in QoS 2 handling which leads to message loss.
* [Server] Replaced all events with proper async compatible handlers (BREAKING CHANGE!).
* [Server] The used logger instance is now propagated to the WebSocket server adapter.
* [Server] Added the flag "IsSecureConnection" which is set to true when the connection is encrypted.
* [MQTTnet Server] Added as first Alpha version.
* [Note] Due to MQTTv5 a lot of new classes were introduced. This required adding new namespaces as well. Most classes are backward compatible but new namespaces must be added.
......
......@@ -20,6 +20,7 @@ namespace MQTTnet.AspNetCore
}
public string Endpoint => Connection.ConnectionId;
public bool IsSecureConnection => false; // TODO: Fix detection.
public ConnectionContext Connection { get; }
public MqttPacketFormatterAdapter PacketFormatterAdapter { get; }
public event EventHandler ReadingPacketStarted;
......
......@@ -38,13 +38,14 @@ namespace MQTTnet.AspNetCore
if (webSocket == null) throw new ArgumentNullException(nameof(webSocket));
var endpoint = $"{httpContext.Connection.RemoteIpAddress}:{httpContext.Connection.RemotePort}";
var channel = new MqttWebSocketChannel(webSocket, endpoint);
var clientAdapter = new MqttChannelAdapter(channel, new MqttPacketFormatterAdapter(), _logger.CreateChildLogger(nameof(MqttWebSocketServerAdapter)));
var clientCertificate = await httpContext.Connection.GetClientCertificateAsync().ConfigureAwait(false);
var isSecureConnection = clientCertificate != null;
clientCertificate?.Dispose();
var channel = new MqttWebSocketChannel(webSocket, endpoint, isSecureConnection);
var clientAdapter = new MqttChannelAdapter(channel, new MqttPacketFormatterAdapter(), _logger.CreateChildLogger(nameof(MqttWebSocketServerAdapter)));
var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter);
ClientAcceptedHandler?.Invoke(eventArgs);
......
......@@ -26,6 +26,7 @@ namespace MQTTnet.Server.Mqtt
{
{ "client_id", context.ClientId },
{ "endpoint", context.Endpoint },
{ "is_secure_connection", context.IsSecureConnection },
{ "username", context.Username },
{ "password", context.Password },
{ "result", PythonConvert.Pythonfy(context.ReturnCode) }
......
......@@ -10,6 +10,8 @@ namespace MQTTnet.Adapter
{
string Endpoint { get; }
bool IsSecureConnection { get; }
MqttPacketFormatterAdapter PacketFormatterAdapter { get; }
event EventHandler ReadingPacketStarted;
......
......@@ -42,6 +42,8 @@ namespace MQTTnet.Adapter
public string Endpoint => _channel.Endpoint;
public bool IsSecureConnection => _channel.IsSecureConnection;
public MqttPacketFormatterAdapter PacketFormatterAdapter { get; }
public event EventHandler ReadingPacketStarted;
......
......@@ -7,6 +7,7 @@ namespace MQTTnet.Channel
public interface IMqttChannel : IDisposable
{
string Endpoint { get; }
bool IsSecureConnection { get; }
Task ConnectAsync(CancellationToken cancellationToken);
Task DisconnectAsync(CancellationToken cancellationToken);
......
using System;
using MQTTnet.Adapter;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using MQTTnet.Diagnostics;
using MQTTnet.Formatter;
......
......@@ -36,6 +36,8 @@ namespace MQTTnet.Implementations
_bufferSize = serverOptions.DefaultEndpointOptions.BufferSize;
CreateStreams();
IsSecureConnection = socket.Information.ProtectionLevel >= SocketProtectionLevel.Tls12;
}
public static Func<MqttClientTcpOptions, IEnumerable<ChainValidationResult>> CustomIgnorableServerCertificateErrorsResolver { get; set; }
......@@ -53,6 +55,8 @@ namespace MQTTnet.Implementations
}
}
public bool IsSecureConnection { get; }
public async Task ConnectAsync(CancellationToken cancellationToken)
{
if (_socket == null)
......
......@@ -27,6 +27,8 @@ namespace MQTTnet.Implementations
{
_clientOptions = clientOptions ?? throw new ArgumentNullException(nameof(clientOptions));
_options = (MqttClientTcpOptions)clientOptions.ChannelOptions;
IsSecureConnection = clientOptions.ChannelOptions?.TlsOptions?.UseTls == true;
}
/// <summary>
......@@ -37,6 +39,8 @@ namespace MQTTnet.Implementations
{
_socket = socket ?? throw new ArgumentNullException(nameof(socket));
IsSecureConnection = sslStream != null;
CreateStream(sslStream);
}
......@@ -45,6 +49,8 @@ namespace MQTTnet.Implementations
public string Endpoint => _socket?.RemoteEndPoint?.ToString();
public bool IsSecureConnection { get; }
public async Task ConnectAsync(CancellationToken cancellationToken)
{
if (_socket == null)
......
using System;
using System.Globalization;
using System.Net;
using System.Net.WebSockets;
using System.Security.Cryptography.X509Certificates;
......@@ -21,14 +22,18 @@ namespace MQTTnet.Implementations
_options = options ?? throw new ArgumentNullException(nameof(options));
}
public MqttWebSocketChannel(WebSocket webSocket, string endpoint)
public MqttWebSocketChannel(WebSocket webSocket, string endpoint, bool isSecureConnection)
{
_webSocket = webSocket ?? throw new ArgumentNullException(nameof(webSocket));
Endpoint = endpoint;
IsSecureConnection = isSecureConnection;
}
public string Endpoint { get; }
public bool IsSecureConnection { get; private set; }
public async Task ConnectAsync(CancellationToken cancellationToken)
{
var uri = _options.Uri;
......@@ -83,6 +88,8 @@ namespace MQTTnet.Implementations
await clientWebSocket.ConnectAsync(new Uri(uri), cancellationToken).ConfigureAwait(false);
_webSocket = clientWebSocket;
IsSecureConnection = uri.StartsWith("wss://", StringComparison.OrdinalIgnoreCase);
}
public async Task DisconnectAsync(CancellationToken cancellationToken)
......
......@@ -16,6 +16,8 @@ namespace MQTTnet.Internal
public string Endpoint { get; } = "<Test channel>";
public bool IsSecureConnection { get; } = false;
public Task ConnectAsync(CancellationToken cancellationToken)
{
return Task.FromResult(0);
......
......@@ -298,7 +298,8 @@ namespace MQTTnet.Server
connectPacket.Username,
connectPacket.Password,
connectPacket.WillMessage,
clientAdapter.Endpoint);
clientAdapter.Endpoint,
clientAdapter.IsSecureConnection);
var connectionValidator = _options.ConnectionValidator;
......
......@@ -4,13 +4,14 @@ namespace MQTTnet.Server
{
public class MqttConnectionValidatorContext
{
public MqttConnectionValidatorContext(string clientId, string username, string password, MqttApplicationMessage willMessage, string endpoint)
public MqttConnectionValidatorContext(string clientId, string username, string password, MqttApplicationMessage willMessage, string endpoint, bool isSecureConnection)
{
ClientId = clientId;
Username = username;
Password = password;
WillMessage = willMessage;
Endpoint = endpoint;
IsSecureConnection = isSecureConnection;
}
public string ClientId { get; }
......@@ -23,6 +24,8 @@ namespace MQTTnet.Server
public string Endpoint { get; }
public bool IsSecureConnection { get; }
public MqttConnectReturnCode ReturnCode { get; set; } = MqttConnectReturnCode.ConnectionAccepted;
}
}
......@@ -73,7 +73,9 @@ namespace MQTTnet.Benchmarks
_position = _buffer.Offset;
}
public string Endpoint { get; }
public string Endpoint { get; } = string.Empty;
public bool IsSecureConnection { get; } = false;
public void Reset()
{
......
......@@ -14,7 +14,9 @@ namespace MQTTnet.Tests.Mockups
public TestMqttCommunicationAdapter Partner { get; set; }
public string Endpoint { get; }
public string Endpoint { get; } = string.Empty;
public bool IsSecureConnection { get; } = false;
public MqttPacketFormatterAdapter PacketFormatterAdapter { get; } = new MqttPacketFormatterAdapter(MqttProtocolVersion.V311);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册