mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-20 19:58:57 +08:00
Merge branch 'master' of https://github.com/chkr1011/MQTTnet into feature/Reason_Code_In_Subscription_Interceptor
# Conflicts: # Source/MQTTnet/Server/Internal/MqttClientSessionsManager.cs
This commit is contained in:
@@ -19,11 +19,7 @@ namespace MQTTnet.Client.Options
|
|||||||
|
|
||||||
public Func<MqttClientCertificateValidationCallbackContext, bool> CertificateValidationHandler { get; set; }
|
public Func<MqttClientCertificateValidationCallbackContext, bool> CertificateValidationHandler { get; set; }
|
||||||
|
|
||||||
#if NETCOREAPP3_1 || NET5_0
|
public SslProtocols SslProtocol { get; set; } = SslProtocols.None;
|
||||||
public SslProtocols SslProtocol { get; set; } = SslProtocols.Tls13;
|
|
||||||
#else
|
|
||||||
public SslProtocols SslProtocol { get; set; } = SslProtocols.Tls12;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if WINDOWS_UWP
|
#if WINDOWS_UWP
|
||||||
public IEnumerable<IEnumerable<byte>> Certificates { get; set; }
|
public IEnumerable<IEnumerable<byte>> Certificates { get; set; }
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Security;
|
using System.Net.Security;
|
||||||
using System.Security.Authentication;
|
using System.Security.Authentication;
|
||||||
@@ -26,11 +26,7 @@ namespace MQTTnet.Client.Options
|
|||||||
public List<SslApplicationProtocol> ApplicationProtocols { get; set; }
|
public List<SslApplicationProtocol> ApplicationProtocols { get; set; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if NETCOREAPP3_1 || NET5_0
|
public SslProtocols SslProtocol { get; set; } = SslProtocols.None;
|
||||||
public SslProtocols SslProtocol { get; set; } = SslProtocols.Tls13;
|
|
||||||
#else
|
|
||||||
public SslProtocols SslProtocol { get; set; } = SslProtocols.Tls12;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
[Obsolete("This property will be removed soon. Use CertificateValidationHandler instead.")]
|
[Obsolete("This property will be removed soon. Use CertificateValidationHandler instead.")]
|
||||||
public Func<X509Certificate, X509Chain, SslPolicyErrors, IMqttClientOptions, bool> CertificateValidationCallback { get; set; }
|
public Func<X509Certificate, X509Chain, SslPolicyErrors, IMqttClientOptions, bool> CertificateValidationCallback { get; set; }
|
||||||
|
|||||||
@@ -107,9 +107,11 @@ namespace MQTTnet.Server.Internal
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
clientConnection = await CreateClientConnection(connectPacket, channelAdapter, connectionValidatorContext.SessionItems).ConfigureAwait(false);
|
|
||||||
|
|
||||||
connAckPacket = _connAckPacketFactory.Create(connectionValidatorContext);
|
connAckPacket = _connAckPacketFactory.Create(connectionValidatorContext);
|
||||||
|
|
||||||
|
// Pass connAckPacket so that IsSessionPresent flag can be set if the client session already exists
|
||||||
|
clientConnection = await CreateClientConnection(connectPacket, connAckPacket, channelAdapter, connectionValidatorContext.SessionItems).ConfigureAwait(false);
|
||||||
|
|
||||||
await channelAdapter.SendPacketAsync(connAckPacket, cancellationToken).ConfigureAwait(false);
|
await channelAdapter.SendPacketAsync(connAckPacket, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
await _eventDispatcher.SafeNotifyClientConnectedAsync(connectPacket, channelAdapter).ConfigureAwait(false);
|
await _eventDispatcher.SafeNotifyClientConnectedAsync(connectPacket, channelAdapter).ConfigureAwait(false);
|
||||||
@@ -517,7 +519,8 @@ namespace MQTTnet.Server.Internal
|
|||||||
}
|
}
|
||||||
|
|
||||||
async Task<MqttClientConnection> CreateClientConnection(
|
async Task<MqttClientConnection> CreateClientConnection(
|
||||||
MqttConnectPacket connectPacket,
|
MqttConnectPacket connectPacket,
|
||||||
|
MqttConnAckPacket connAckPacket,
|
||||||
IMqttChannelAdapter channelAdapter,
|
IMqttChannelAdapter channelAdapter,
|
||||||
IDictionary<object, object> sessionItems)
|
IDictionary<object, object> sessionItems)
|
||||||
{
|
{
|
||||||
@@ -543,6 +546,7 @@ namespace MQTTnet.Server.Internal
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
_logger.Verbose("Reusing existing session of client '{0}'.", connectPacket.ClientId);
|
_logger.Verbose("Reusing existing session of client '{0}'.", connectPacket.ClientId);
|
||||||
|
connAckPacket.IsSessionPresent = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using MQTTnet.Client;
|
using MQTTnet.Client;
|
||||||
using MQTTnet.Client.Options;
|
using MQTTnet.Client.Options;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
@@ -38,5 +38,57 @@ namespace MQTTnet.Tests.MQTTv5
|
|||||||
Assert.AreEqual(1, receivedMessagesCount);
|
Assert.AreEqual(1, receivedMessagesCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public async Task Validate_IsSessionPresent()
|
||||||
|
{
|
||||||
|
using (var testEnvironment = new TestEnvironment(TestContext))
|
||||||
|
{
|
||||||
|
// Create server with persistent sessions enabled
|
||||||
|
|
||||||
|
await testEnvironment.StartServer(o => o.WithPersistentSessions());
|
||||||
|
|
||||||
|
const string ClientId = "Client1";
|
||||||
|
|
||||||
|
// Create client without clean session and long session expiry interval
|
||||||
|
|
||||||
|
var client1 = await testEnvironment.ConnectClient(o => o
|
||||||
|
.WithProtocolVersion(MqttProtocolVersion.V500)
|
||||||
|
.WithTcpServer("127.0.0.1", testEnvironment.ServerPort)
|
||||||
|
.WithSessionExpiryInterval(9999)
|
||||||
|
.WithCleanSession(false)
|
||||||
|
.WithClientId(ClientId)
|
||||||
|
.Build()
|
||||||
|
);
|
||||||
|
|
||||||
|
// Disconnect; empty session should remain on server
|
||||||
|
|
||||||
|
await client1.DisconnectAsync();
|
||||||
|
|
||||||
|
// Simulate some time delay between connections
|
||||||
|
|
||||||
|
await Task.Delay(1000);
|
||||||
|
|
||||||
|
// Reconnect the same client ID to existing session
|
||||||
|
|
||||||
|
var client2 = testEnvironment.CreateClient();
|
||||||
|
var options = testEnvironment.Factory.CreateClientOptionsBuilder()
|
||||||
|
.WithProtocolVersion(MqttProtocolVersion.V500)
|
||||||
|
.WithTcpServer("127.0.0.1", testEnvironment.ServerPort)
|
||||||
|
.WithSessionExpiryInterval(9999)
|
||||||
|
.WithCleanSession(false)
|
||||||
|
.WithClientId(ClientId)
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
|
||||||
|
var result = await client2.ConnectAsync(options).ConfigureAwait(false);
|
||||||
|
|
||||||
|
await client2.DisconnectAsync();
|
||||||
|
|
||||||
|
// Session should be present
|
||||||
|
|
||||||
|
Assert.IsTrue(result.IsSessionPresent, "Session not present");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user