mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-15 00:15:15 +08:00
Added UserName property to various Server EventArgs. (#2123)
* Added UserName property to various Server EventArgs. * InjectedMqttApplicationMessage: Add SenderUserName property. * Reformat code * Reformat code --------- Co-authored-by: christian <6939810+chkr1011@users.noreply.github.com>
This commit is contained in:
@@ -10,9 +10,10 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
public sealed class ClientAcknowledgedPublishPacketEventArgs : EventArgs
|
public sealed class ClientAcknowledgedPublishPacketEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public ClientAcknowledgedPublishPacketEventArgs(string clientId, IDictionary sessionItems, MqttPublishPacket publishPacket, MqttPacketWithIdentifier acknowledgePacket)
|
public ClientAcknowledgedPublishPacketEventArgs(string clientId, string userName, IDictionary sessionItems, MqttPublishPacket publishPacket, MqttPacketWithIdentifier acknowledgePacket)
|
||||||
{
|
{
|
||||||
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
||||||
|
UserName = userName;
|
||||||
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
||||||
PublishPacket = publishPacket ?? throw new ArgumentNullException(nameof(publishPacket));
|
PublishPacket = publishPacket ?? throw new ArgumentNullException(nameof(publishPacket));
|
||||||
AcknowledgePacket = acknowledgePacket ?? throw new ArgumentNullException(nameof(acknowledgePacket));
|
AcknowledgePacket = acknowledgePacket ?? throw new ArgumentNullException(nameof(acknowledgePacket));
|
||||||
@@ -28,6 +29,11 @@ namespace MQTTnet.Server
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ClientId { get; }
|
public string ClientId { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user name of the client.
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets whether the PUBLISH packet is fully acknowledged. This is the case for PUBACK (QoS 1) and PUBCOMP (QoS 2.
|
/// Gets whether the PUBLISH packet is fully acknowledged. This is the case for PUBACK (QoS 1) and PUBCOMP (QoS 2.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using System;
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
using MQTTnet.Formatter;
|
using MQTTnet.Formatter;
|
||||||
using MQTTnet.Packets;
|
using MQTTnet.Packets;
|
||||||
|
|
||||||
@@ -56,6 +57,11 @@ namespace MQTTnet.Server
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string UserName => _connectPacket.Username;
|
public string UserName => _connectPacket.Username;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the password of the connected client.
|
||||||
|
/// </summary>
|
||||||
|
public string Password => Encoding.UTF8.GetString(_connectPacket.Password.AsSpan());
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the user properties sent by the client.
|
/// Gets the user properties sent by the client.
|
||||||
/// <remarks>MQTT 5.0.0+ feature.</remarks>
|
/// <remarks>MQTT 5.0.0+ feature.</remarks>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using System;
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
using MQTTnet.Packets;
|
using MQTTnet.Packets;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
|
|
||||||
@@ -13,20 +14,21 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
public sealed class ClientDisconnectedEventArgs : EventArgs
|
public sealed class ClientDisconnectedEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
|
readonly MqttConnectPacket _connectPacket;
|
||||||
readonly MqttDisconnectPacket _disconnectPacket;
|
readonly MqttDisconnectPacket _disconnectPacket;
|
||||||
|
|
||||||
public ClientDisconnectedEventArgs(
|
public ClientDisconnectedEventArgs(
|
||||||
string clientId,
|
MqttConnectPacket connectPacket,
|
||||||
MqttDisconnectPacket disconnectPacket,
|
MqttDisconnectPacket disconnectPacket,
|
||||||
MqttClientDisconnectType disconnectType,
|
MqttClientDisconnectType disconnectType,
|
||||||
EndPoint remoteEndPoint,
|
EndPoint remoteEndPoint,
|
||||||
IDictionary sessionItems)
|
IDictionary sessionItems)
|
||||||
{
|
{
|
||||||
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
|
||||||
DisconnectType = disconnectType;
|
DisconnectType = disconnectType;
|
||||||
RemoteEndPoint = remoteEndPoint;
|
RemoteEndPoint = remoteEndPoint;
|
||||||
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
||||||
|
|
||||||
|
_connectPacket = connectPacket;
|
||||||
// The DISCONNECT packet can be null in case of a non clean disconnect or session takeover.
|
// The DISCONNECT packet can be null in case of a non clean disconnect or session takeover.
|
||||||
_disconnectPacket = disconnectPacket;
|
_disconnectPacket = disconnectPacket;
|
||||||
}
|
}
|
||||||
@@ -35,7 +37,17 @@ namespace MQTTnet.Server
|
|||||||
/// Gets the client identifier.
|
/// Gets the client identifier.
|
||||||
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
|
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string ClientId { get; }
|
public string ClientId => _connectPacket.ClientId;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user name of the client.
|
||||||
|
/// </summary>
|
||||||
|
public string UserName => _connectPacket.Username;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the password of the client.
|
||||||
|
/// </summary>
|
||||||
|
public string Password => Encoding.UTF8.GetString(_connectPacket.Password.AsSpan());
|
||||||
|
|
||||||
public MqttClientDisconnectType DisconnectType { get; }
|
public MqttClientDisconnectType DisconnectType { get; }
|
||||||
|
|
||||||
|
|||||||
@@ -10,9 +10,10 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
public sealed class ClientSubscribedTopicEventArgs : EventArgs
|
public sealed class ClientSubscribedTopicEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public ClientSubscribedTopicEventArgs(string clientId, MqttTopicFilter topicFilter, IDictionary sessionItems)
|
public ClientSubscribedTopicEventArgs(string clientId, string userName, MqttTopicFilter topicFilter, IDictionary sessionItems)
|
||||||
{
|
{
|
||||||
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
||||||
|
UserName = userName;
|
||||||
TopicFilter = topicFilter ?? throw new ArgumentNullException(nameof(topicFilter));
|
TopicFilter = topicFilter ?? throw new ArgumentNullException(nameof(topicFilter));
|
||||||
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
||||||
}
|
}
|
||||||
@@ -23,6 +24,11 @@ namespace MQTTnet.Server
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ClientId { get; }
|
public string ClientId { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user name of the client.
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
|
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
public sealed class ClientUnsubscribedTopicEventArgs : EventArgs
|
public sealed class ClientUnsubscribedTopicEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public ClientUnsubscribedTopicEventArgs(string clientId, string topicFilter, IDictionary sessionItems)
|
public ClientUnsubscribedTopicEventArgs(string clientId, string userName, string topicFilter, IDictionary sessionItems)
|
||||||
{
|
{
|
||||||
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
||||||
|
UserName = userName;
|
||||||
TopicFilter = topicFilter ?? throw new ArgumentNullException(nameof(topicFilter));
|
TopicFilter = topicFilter ?? throw new ArgumentNullException(nameof(topicFilter));
|
||||||
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
||||||
}
|
}
|
||||||
@@ -22,6 +23,11 @@ namespace MQTTnet.Server
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ClientId { get; }
|
public string ClientId { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user name of the client.
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
|
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -12,10 +12,11 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
public sealed class InterceptingPacketEventArgs : EventArgs
|
public sealed class InterceptingPacketEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public InterceptingPacketEventArgs(CancellationToken cancellationToken, string clientId, EndPoint remoteEndPoint, MqttPacket packet, IDictionary sessionItems)
|
public InterceptingPacketEventArgs(CancellationToken cancellationToken, string clientId, string userName, EndPoint remoteEndPoint, MqttPacket packet, IDictionary sessionItems)
|
||||||
{
|
{
|
||||||
CancellationToken = cancellationToken;
|
CancellationToken = cancellationToken;
|
||||||
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
||||||
|
UserName = userName;
|
||||||
RemoteEndPoint = remoteEndPoint;
|
RemoteEndPoint = remoteEndPoint;
|
||||||
Packet = packet ?? throw new ArgumentNullException(nameof(packet));
|
Packet = packet ?? throw new ArgumentNullException(nameof(packet));
|
||||||
SessionItems = sessionItems;
|
SessionItems = sessionItems;
|
||||||
@@ -32,6 +33,11 @@ namespace MQTTnet.Server
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ClientId { get; }
|
public string ClientId { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user name of the client.
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the endpoint of the sending or receiving client.
|
/// Gets the endpoint of the sending or receiving client.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -10,11 +10,12 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
public sealed class InterceptingPublishEventArgs : EventArgs
|
public sealed class InterceptingPublishEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public InterceptingPublishEventArgs(MqttApplicationMessage applicationMessage, CancellationToken cancellationToken, string clientId, IDictionary sessionItems)
|
public InterceptingPublishEventArgs(MqttApplicationMessage applicationMessage, CancellationToken cancellationToken, string clientId, string userName, IDictionary sessionItems)
|
||||||
{
|
{
|
||||||
ApplicationMessage = applicationMessage ?? throw new ArgumentNullException(nameof(applicationMessage));
|
ApplicationMessage = applicationMessage ?? throw new ArgumentNullException(nameof(applicationMessage));
|
||||||
CancellationToken = cancellationToken;
|
CancellationToken = cancellationToken;
|
||||||
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
ClientId = clientId ?? throw new ArgumentNullException(nameof(clientId));
|
||||||
|
UserName = userName;
|
||||||
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,6 +32,11 @@ namespace MQTTnet.Server
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ClientId { get; }
|
public string ClientId { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user name of the client.
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; }
|
||||||
|
|
||||||
public bool CloseConnection { get; set; }
|
public bool CloseConnection { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -15,12 +15,14 @@ namespace MQTTnet.Server
|
|||||||
public InterceptingSubscriptionEventArgs(
|
public InterceptingSubscriptionEventArgs(
|
||||||
CancellationToken cancellationToken,
|
CancellationToken cancellationToken,
|
||||||
string clientId,
|
string clientId,
|
||||||
|
string userName,
|
||||||
MqttSessionStatus session,
|
MqttSessionStatus session,
|
||||||
MqttTopicFilter topicFilter,
|
MqttTopicFilter topicFilter,
|
||||||
List<MqttUserProperty> userProperties)
|
List<MqttUserProperty> userProperties)
|
||||||
{
|
{
|
||||||
CancellationToken = cancellationToken;
|
CancellationToken = cancellationToken;
|
||||||
ClientId = clientId;
|
ClientId = clientId;
|
||||||
|
UserName = userName;
|
||||||
Session = session;
|
Session = session;
|
||||||
TopicFilter = topicFilter;
|
TopicFilter = topicFilter;
|
||||||
UserProperties = userProperties;
|
UserProperties = userProperties;
|
||||||
@@ -37,6 +39,11 @@ namespace MQTTnet.Server
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ClientId { get; }
|
public string ClientId { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user name of the client.
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets whether the broker should close the client connection.
|
/// Gets or sets whether the broker should close the client connection.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -12,10 +12,11 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
public sealed class InterceptingUnsubscriptionEventArgs : EventArgs
|
public sealed class InterceptingUnsubscriptionEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public InterceptingUnsubscriptionEventArgs(CancellationToken cancellationToken, string clientId, IDictionary sessionItems, string topic, List<MqttUserProperty> userProperties)
|
public InterceptingUnsubscriptionEventArgs(CancellationToken cancellationToken, string clientId, string userName, IDictionary sessionItems, string topic, List<MqttUserProperty> userProperties)
|
||||||
{
|
{
|
||||||
CancellationToken = cancellationToken;
|
CancellationToken = cancellationToken;
|
||||||
ClientId = clientId;
|
ClientId = clientId;
|
||||||
|
UserName = userName;
|
||||||
SessionItems = sessionItems;
|
SessionItems = sessionItems;
|
||||||
Topic = topic;
|
Topic = topic;
|
||||||
UserProperties = userProperties;
|
UserProperties = userProperties;
|
||||||
@@ -32,6 +33,11 @@ namespace MQTTnet.Server
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string ClientId { get; }
|
public string ClientId { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user name of the client.
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets whether the broker should close the client connection.
|
/// Gets or sets whether the broker should close the client connection.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
public sealed class SessionDeletedEventArgs : EventArgs
|
public sealed class SessionDeletedEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public SessionDeletedEventArgs(string id, IDictionary sessionItems)
|
public SessionDeletedEventArgs(string id, string userName, IDictionary sessionItems)
|
||||||
{
|
{
|
||||||
Id = id ?? throw new ArgumentNullException(nameof(id));
|
Id = id ?? throw new ArgumentNullException(nameof(id));
|
||||||
|
UserName = userName;
|
||||||
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
SessionItems = sessionItems ?? throw new ArgumentNullException(nameof(sessionItems));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,6 +21,11 @@ namespace MQTTnet.Server
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Id { get; }
|
public string Id { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the user name of the session.
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
|
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -23,4 +23,6 @@ public sealed class InjectedMqttApplicationMessage
|
|||||||
public IDictionary CustomSessionItems { get; set; }
|
public IDictionary CustomSessionItems { get; set; }
|
||||||
|
|
||||||
public string SenderClientId { get; set; } = string.Empty;
|
public string SenderClientId { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public string SenderUserName { get; set; }
|
||||||
}
|
}
|
||||||
@@ -101,7 +101,7 @@ public sealed class MqttClientSessionsManager : ISubscriptionChangedNotification
|
|||||||
{
|
{
|
||||||
if (_eventContainer.SessionDeletedEvent.HasHandlers && session != null)
|
if (_eventContainer.SessionDeletedEvent.HasHandlers && session != null)
|
||||||
{
|
{
|
||||||
var eventArgs = new SessionDeletedEventArgs(clientId, session.Items);
|
var eventArgs = new SessionDeletedEventArgs(clientId, session.UserName, session.Items);
|
||||||
await _eventContainer.SessionDeletedEvent.TryInvokeAsync(eventArgs, _logger).ConfigureAwait(false);
|
await _eventContainer.SessionDeletedEvent.TryInvokeAsync(eventArgs, _logger).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -117,6 +117,7 @@ public sealed class MqttClientSessionsManager : ISubscriptionChangedNotification
|
|||||||
|
|
||||||
public async Task<DispatchApplicationMessageResult> DispatchApplicationMessage(
|
public async Task<DispatchApplicationMessageResult> DispatchApplicationMessage(
|
||||||
string senderId,
|
string senderId,
|
||||||
|
string senderUserName,
|
||||||
IDictionary senderSessionItems,
|
IDictionary senderSessionItems,
|
||||||
MqttApplicationMessage applicationMessage,
|
MqttApplicationMessage applicationMessage,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
@@ -130,7 +131,7 @@ public sealed class MqttClientSessionsManager : ISubscriptionChangedNotification
|
|||||||
// Allow the user to intercept application message...
|
// Allow the user to intercept application message...
|
||||||
if (_eventContainer.InterceptingPublishEvent.HasHandlers)
|
if (_eventContainer.InterceptingPublishEvent.HasHandlers)
|
||||||
{
|
{
|
||||||
var interceptingPublishEventArgs = new InterceptingPublishEventArgs(applicationMessage, cancellationToken, senderId, senderSessionItems);
|
var interceptingPublishEventArgs = new InterceptingPublishEventArgs(applicationMessage, cancellationToken, senderId, senderUserName, senderSessionItems);
|
||||||
if (string.IsNullOrEmpty(interceptingPublishEventArgs.ApplicationMessage.Topic))
|
if (string.IsNullOrEmpty(interceptingPublishEventArgs.ApplicationMessage.Topic))
|
||||||
{
|
{
|
||||||
// This can happen if a topic alias us used but the topic is
|
// This can happen if a topic alias us used but the topic is
|
||||||
@@ -408,7 +409,12 @@ public sealed class MqttClientSessionsManager : ISubscriptionChangedNotification
|
|||||||
if (connectedClient.Id != null && !connectedClient.IsTakenOver && _eventContainer.ClientDisconnectedEvent.HasHandlers)
|
if (connectedClient.Id != null && !connectedClient.IsTakenOver && _eventContainer.ClientDisconnectedEvent.HasHandlers)
|
||||||
{
|
{
|
||||||
var disconnectType = connectedClient.DisconnectPacket != null ? MqttClientDisconnectType.Clean : MqttClientDisconnectType.NotClean;
|
var disconnectType = connectedClient.DisconnectPacket != null ? MqttClientDisconnectType.Clean : MqttClientDisconnectType.NotClean;
|
||||||
var eventArgs = new ClientDisconnectedEventArgs(connectedClient.Id, connectedClient.DisconnectPacket, disconnectType, endpoint, connectedClient.Session.Items);
|
var eventArgs = new ClientDisconnectedEventArgs(
|
||||||
|
connectedClient.ConnectPacket,
|
||||||
|
connectedClient.DisconnectPacket,
|
||||||
|
disconnectType,
|
||||||
|
endpoint,
|
||||||
|
connectedClient.Session.Items);
|
||||||
|
|
||||||
await _eventContainer.ClientDisconnectedEvent.InvokeAsync(eventArgs).ConfigureAwait(false);
|
await _eventContainer.ClientDisconnectedEvent.InvokeAsync(eventArgs).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@@ -592,7 +598,7 @@ public sealed class MqttClientSessionsManager : ISubscriptionChangedNotification
|
|||||||
if (_eventContainer.ClientDisconnectedEvent.HasHandlers)
|
if (_eventContainer.ClientDisconnectedEvent.HasHandlers)
|
||||||
{
|
{
|
||||||
var eventArgs = new ClientDisconnectedEventArgs(
|
var eventArgs = new ClientDisconnectedEventArgs(
|
||||||
oldConnectedClient.Id,
|
oldConnectedClient.ConnectPacket,
|
||||||
null,
|
null,
|
||||||
MqttClientDisconnectType.Takeover,
|
MqttClientDisconnectType.Takeover,
|
||||||
oldConnectedClient.RemoteEndPoint,
|
oldConnectedClient.RemoteEndPoint,
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ namespace MQTTnet.Server.Internal
|
|||||||
{
|
{
|
||||||
foreach (var finalTopicFilter in finalTopicFilters)
|
foreach (var finalTopicFilter in finalTopicFilters)
|
||||||
{
|
{
|
||||||
var eventArgs = new ClientSubscribedTopicEventArgs(_session.Id, finalTopicFilter, _session.Items);
|
var eventArgs = new ClientSubscribedTopicEventArgs(_session.Id, _session.UserName, finalTopicFilter, _session.Items);
|
||||||
await _eventContainer.ClientSubscribedTopicEvent.InvokeAsync(eventArgs).ConfigureAwait(false);
|
await _eventContainer.ClientSubscribedTopicEvent.InvokeAsync(eventArgs).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -297,7 +297,7 @@ namespace MQTTnet.Server.Internal
|
|||||||
{
|
{
|
||||||
foreach (var topicFilter in unsubscribePacket.TopicFilters)
|
foreach (var topicFilter in unsubscribePacket.TopicFilters)
|
||||||
{
|
{
|
||||||
var eventArgs = new ClientUnsubscribedTopicEventArgs(_session.Id, topicFilter, _session.Items);
|
var eventArgs = new ClientUnsubscribedTopicEventArgs(_session.Id, _session.UserName, topicFilter, _session.Items);
|
||||||
await _eventContainer.ClientUnsubscribedTopicEvent.InvokeAsync(eventArgs).ConfigureAwait(false);
|
await _eventContainer.ClientUnsubscribedTopicEvent.InvokeAsync(eventArgs).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -460,7 +460,7 @@ namespace MQTTnet.Server.Internal
|
|||||||
List<MqttUserProperty> userProperties,
|
List<MqttUserProperty> userProperties,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var eventArgs = new InterceptingSubscriptionEventArgs(cancellationToken, _session.Id, new MqttSessionStatus(_session), topicFilter, userProperties);
|
var eventArgs = new InterceptingSubscriptionEventArgs(cancellationToken, _session.Id, _session.UserName, new MqttSessionStatus(_session), topicFilter, userProperties);
|
||||||
|
|
||||||
if (topicFilter.QualityOfServiceLevel == MqttQualityOfServiceLevel.AtMostOnce)
|
if (topicFilter.QualityOfServiceLevel == MqttQualityOfServiceLevel.AtMostOnce)
|
||||||
{
|
{
|
||||||
@@ -493,7 +493,7 @@ namespace MQTTnet.Server.Internal
|
|||||||
List<MqttUserProperty> userProperties,
|
List<MqttUserProperty> userProperties,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var clientUnsubscribingTopicEventArgs = new InterceptingUnsubscriptionEventArgs(cancellationToken, _session.Id, _session.Items, topicFilter, userProperties)
|
var clientUnsubscribingTopicEventArgs = new InterceptingUnsubscriptionEventArgs(cancellationToken, _session.Id, _session.UserName, _session.Items, topicFilter, userProperties)
|
||||||
{
|
{
|
||||||
Response =
|
Response =
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -72,6 +72,8 @@ public sealed class MqttConnectedClient : IDisposable
|
|||||||
|
|
||||||
public MqttClientStatistics Statistics { get; } = new();
|
public MqttClientStatistics Statistics { get; } = new();
|
||||||
|
|
||||||
|
public string UserName => ConnectPacket.Username;
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
_cancellationToken?.Dispose();
|
_cancellationToken?.Dispose();
|
||||||
@@ -117,7 +119,7 @@ public sealed class MqttConnectedClient : IDisposable
|
|||||||
var willPublishPacket = MqttPublishPacketFactory.Create(Session.LatestConnectPacket);
|
var willPublishPacket = MqttPublishPacketFactory.Create(Session.LatestConnectPacket);
|
||||||
var willApplicationMessage = MqttApplicationMessageFactory.Create(willPublishPacket);
|
var willApplicationMessage = MqttApplicationMessageFactory.Create(willPublishPacket);
|
||||||
|
|
||||||
_ = _sessionsManager.DispatchApplicationMessage(Id, Session.Items, willApplicationMessage, CancellationToken.None);
|
_ = _sessionsManager.DispatchApplicationMessage(Id, UserName, Session.Items, willApplicationMessage, CancellationToken.None);
|
||||||
Session.WillMessageSent = true;
|
Session.WillMessageSent = true;
|
||||||
|
|
||||||
_logger.Info("Client '{0}': Published will message", Id);
|
_logger.Info("Client '{0}': Published will message", Id);
|
||||||
@@ -174,7 +176,7 @@ public sealed class MqttConnectedClient : IDisposable
|
|||||||
{
|
{
|
||||||
if (_eventContainer.ClientAcknowledgedPublishPacketEvent.HasHandlers)
|
if (_eventContainer.ClientAcknowledgedPublishPacketEvent.HasHandlers)
|
||||||
{
|
{
|
||||||
var eventArgs = new ClientAcknowledgedPublishPacketEventArgs(Id, Session.Items, publishPacket, acknowledgePacket);
|
var eventArgs = new ClientAcknowledgedPublishPacketEventArgs(Id, UserName, Session.Items, publishPacket, acknowledgePacket);
|
||||||
return _eventContainer.ClientAcknowledgedPublishPacketEvent.TryInvokeAsync(eventArgs, _logger);
|
return _eventContainer.ClientAcknowledgedPublishPacketEvent.TryInvokeAsync(eventArgs, _logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,7 +219,8 @@ public sealed class MqttConnectedClient : IDisposable
|
|||||||
|
|
||||||
var applicationMessage = MqttApplicationMessageFactory.Create(publishPacket);
|
var applicationMessage = MqttApplicationMessageFactory.Create(publishPacket);
|
||||||
|
|
||||||
var dispatchApplicationMessageResult = await _sessionsManager.DispatchApplicationMessage(Id, Session.Items, applicationMessage, cancellationToken).ConfigureAwait(false);
|
var dispatchApplicationMessageResult =
|
||||||
|
await _sessionsManager.DispatchApplicationMessage(Id, UserName, Session.Items, applicationMessage, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
if (dispatchApplicationMessageResult.CloseConnection)
|
if (dispatchApplicationMessageResult.CloseConnection)
|
||||||
{
|
{
|
||||||
@@ -339,7 +342,7 @@ public sealed class MqttConnectedClient : IDisposable
|
|||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
|
||||||
var interceptingPacketEventArgs = new InterceptingPacketEventArgs(cancellationToken, Id, RemoteEndPoint, packet, Session.Items);
|
var interceptingPacketEventArgs = new InterceptingPacketEventArgs(cancellationToken, Id, UserName, RemoteEndPoint, packet, Session.Items);
|
||||||
await _eventContainer.InterceptingOutboundPacketEvent.InvokeAsync(interceptingPacketEventArgs).ConfigureAwait(false);
|
await _eventContainer.InterceptingOutboundPacketEvent.InvokeAsync(interceptingPacketEventArgs).ConfigureAwait(false);
|
||||||
|
|
||||||
if (!interceptingPacketEventArgs.ProcessPacket || packet == null)
|
if (!interceptingPacketEventArgs.ProcessPacket || packet == null)
|
||||||
@@ -385,7 +388,7 @@ public sealed class MqttConnectedClient : IDisposable
|
|||||||
|
|
||||||
if (_eventContainer.InterceptingInboundPacketEvent.HasHandlers)
|
if (_eventContainer.InterceptingInboundPacketEvent.HasHandlers)
|
||||||
{
|
{
|
||||||
var interceptingPacketEventArgs = new InterceptingPacketEventArgs(cancellationToken, Id, RemoteEndPoint, currentPacket, Session.Items);
|
var interceptingPacketEventArgs = new InterceptingPacketEventArgs(cancellationToken, Id, UserName, RemoteEndPoint, currentPacket, Session.Items);
|
||||||
await _eventContainer.InterceptingInboundPacketEvent.InvokeAsync(interceptingPacketEventArgs).ConfigureAwait(false);
|
await _eventContainer.InterceptingInboundPacketEvent.InvokeAsync(interceptingPacketEventArgs).ConfigureAwait(false);
|
||||||
currentPacket = interceptingPacketEventArgs.Packet;
|
currentPacket = interceptingPacketEventArgs.Packet;
|
||||||
processPacket = interceptingPacketEventArgs.ProcessPacket;
|
processPacket = interceptingPacketEventArgs.ProcessPacket;
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ public sealed class MqttSession : IDisposable
|
|||||||
|
|
||||||
public string Id => _connectPacket.ClientId;
|
public string Id => _connectPacket.ClientId;
|
||||||
|
|
||||||
|
public string UserName => _connectPacket.Username;
|
||||||
|
|
||||||
public IDictionary Items { get; }
|
public IDictionary Items { get; }
|
||||||
|
|
||||||
public MqttConnectPacket LatestConnectPacket { get; set; }
|
public MqttConnectPacket LatestConnectPacket { get; set; }
|
||||||
|
|||||||
@@ -255,6 +255,7 @@ public class MqttServer : Disposable
|
|||||||
|
|
||||||
return _clientSessionsManager.DispatchApplicationMessage(
|
return _clientSessionsManager.DispatchApplicationMessage(
|
||||||
injectedApplicationMessage.SenderClientId,
|
injectedApplicationMessage.SenderClientId,
|
||||||
|
injectedApplicationMessage.SenderUserName,
|
||||||
sessionItems,
|
sessionItems,
|
||||||
injectedApplicationMessage.ApplicationMessage,
|
injectedApplicationMessage.ApplicationMessage,
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace MQTTnet.Tests.Server
|
|||||||
return CompletedTask.Instance;
|
return CompletedTask.Instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser"));
|
await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser", "ThePassword"));
|
||||||
|
|
||||||
await LongTestDelay();
|
await LongTestDelay();
|
||||||
|
|
||||||
@@ -39,6 +39,7 @@ namespace MQTTnet.Tests.Server
|
|||||||
Assert.IsTrue(eventArgs.RemoteEndPoint.ToString().Contains("127.0.0.1"));
|
Assert.IsTrue(eventArgs.RemoteEndPoint.ToString().Contains("127.0.0.1"));
|
||||||
Assert.AreEqual(MqttProtocolVersion.V311, eventArgs.ProtocolVersion);
|
Assert.AreEqual(MqttProtocolVersion.V311, eventArgs.ProtocolVersion);
|
||||||
Assert.AreEqual("TheUser", eventArgs.UserName);
|
Assert.AreEqual("TheUser", eventArgs.UserName);
|
||||||
|
Assert.AreEqual("ThePassword", eventArgs.Password);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,7 +57,7 @@ namespace MQTTnet.Tests.Server
|
|||||||
return CompletedTask.Instance;
|
return CompletedTask.Instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
var client = await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser"));
|
var client = await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser", "ThePassword"));
|
||||||
await client.DisconnectAsync();
|
await client.DisconnectAsync();
|
||||||
|
|
||||||
await LongTestDelay();
|
await LongTestDelay();
|
||||||
@@ -66,6 +67,9 @@ namespace MQTTnet.Tests.Server
|
|||||||
Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Client_Disconnected_Event)));
|
Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Client_Disconnected_Event)));
|
||||||
Assert.IsTrue(eventArgs.RemoteEndPoint.ToString().Contains("127.0.0.1"));
|
Assert.IsTrue(eventArgs.RemoteEndPoint.ToString().Contains("127.0.0.1"));
|
||||||
Assert.AreEqual(MqttClientDisconnectType.Clean, eventArgs.DisconnectType);
|
Assert.AreEqual(MqttClientDisconnectType.Clean, eventArgs.DisconnectType);
|
||||||
|
|
||||||
|
Assert.AreEqual("TheUser", eventArgs.UserName);
|
||||||
|
Assert.AreEqual("ThePassword", eventArgs.Password);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,7 +87,7 @@ namespace MQTTnet.Tests.Server
|
|||||||
return CompletedTask.Instance;
|
return CompletedTask.Instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
var client = await testEnvironment.ConnectClient();
|
var client = await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser"));
|
||||||
await client.SubscribeAsync("The/Topic", MqttQualityOfServiceLevel.AtLeastOnce);
|
await client.SubscribeAsync("The/Topic", MqttQualityOfServiceLevel.AtLeastOnce);
|
||||||
|
|
||||||
await LongTestDelay();
|
await LongTestDelay();
|
||||||
@@ -93,6 +97,7 @@ namespace MQTTnet.Tests.Server
|
|||||||
Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Client_Subscribed_Event)));
|
Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Client_Subscribed_Event)));
|
||||||
Assert.AreEqual("The/Topic", eventArgs.TopicFilter.Topic);
|
Assert.AreEqual("The/Topic", eventArgs.TopicFilter.Topic);
|
||||||
Assert.AreEqual(MqttQualityOfServiceLevel.AtLeastOnce, eventArgs.TopicFilter.QualityOfServiceLevel);
|
Assert.AreEqual(MqttQualityOfServiceLevel.AtLeastOnce, eventArgs.TopicFilter.QualityOfServiceLevel);
|
||||||
|
Assert.AreEqual("TheUser", eventArgs.UserName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +115,7 @@ namespace MQTTnet.Tests.Server
|
|||||||
return CompletedTask.Instance;
|
return CompletedTask.Instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
var client = await testEnvironment.ConnectClient();
|
var client = await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser"));
|
||||||
await client.UnsubscribeAsync("The/Topic");
|
await client.UnsubscribeAsync("The/Topic");
|
||||||
|
|
||||||
await LongTestDelay();
|
await LongTestDelay();
|
||||||
@@ -119,6 +124,7 @@ namespace MQTTnet.Tests.Server
|
|||||||
|
|
||||||
Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Client_Unsubscribed_Event)));
|
Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Client_Unsubscribed_Event)));
|
||||||
Assert.AreEqual("The/Topic", eventArgs.TopicFilter);
|
Assert.AreEqual("The/Topic", eventArgs.TopicFilter);
|
||||||
|
Assert.AreEqual("TheUser", eventArgs.UserName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +142,7 @@ namespace MQTTnet.Tests.Server
|
|||||||
return CompletedTask.Instance;
|
return CompletedTask.Instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
var client = await testEnvironment.ConnectClient();
|
var client = await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser"));
|
||||||
await client.PublishStringAsync("The_Topic", "The_Payload");
|
await client.PublishStringAsync("The_Topic", "The_Payload");
|
||||||
|
|
||||||
await LongTestDelay();
|
await LongTestDelay();
|
||||||
@@ -146,6 +152,7 @@ namespace MQTTnet.Tests.Server
|
|||||||
Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Application_Message_Received_Event)));
|
Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Application_Message_Received_Event)));
|
||||||
Assert.AreEqual("The_Topic", eventArgs.ApplicationMessage.Topic);
|
Assert.AreEqual("The_Topic", eventArgs.ApplicationMessage.Topic);
|
||||||
Assert.AreEqual("The_Payload", eventArgs.ApplicationMessage.ConvertPayloadToString());
|
Assert.AreEqual("The_Payload", eventArgs.ApplicationMessage.ConvertPayloadToString());
|
||||||
|
Assert.AreEqual("TheUser", eventArgs.UserName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user