Skip to content

Commit

Permalink
Fix support for enhanced authentication (#2132)
Browse files Browse the repository at this point in the history
* Implement enhanced authentication for client and server.

* Update samples

* Add abstraction layer

* Merge master

* Use dedicated class for public API.

* Update release notes

* Rename methods to fit naming scheme

* Fix unit tests and samples
  • Loading branch information
chkr1011 authored Dec 25, 2024
1 parent f13b3eb commit 9dbe1e4
Show file tree
Hide file tree
Showing 26 changed files with 1,071 additions and 666 deletions.
525 changes: 292 additions & 233 deletions Samples/Client/Client_Connection_Samples.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using MQTTnet.Packets;

namespace MQTTnet.Server.EnhancedAuthentication;

public sealed class ExchangeEnhancedAuthenticationOptions
{
public byte[] AuthenticationData { get; set; }

public string ReasonString { get; set; }

public List<MqttUserProperty> UserProperties { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Text;
using MQTTnet.Packets;

namespace MQTTnet.Server.EnhancedAuthentication;

public sealed class ExchangeEnhancedAuthenticationOptionsFactory
{
readonly ExchangeEnhancedAuthenticationOptions _options = new();

public ExchangeEnhancedAuthenticationOptions Build()
{
return _options;
}

public ExchangeEnhancedAuthenticationOptionsFactory WithAuthenticationData(byte[] authenticationData)
{
_options.AuthenticationData = authenticationData;

return this;
}

public ExchangeEnhancedAuthenticationOptionsFactory WithAuthenticationData(string authenticationData)
{
if (authenticationData == null)
{
_options.AuthenticationData = null;
}
else
{
_options.AuthenticationData = Encoding.UTF8.GetBytes(authenticationData);
}

return this;
}

public ExchangeEnhancedAuthenticationOptionsFactory WithReasonString(string reasonString)
{
_options.ReasonString = reasonString;

return this;
}

public ExchangeEnhancedAuthenticationOptionsFactory WithUserProperties(List<MqttUserProperty> userProperties)
{
_options.UserProperties = userProperties;

return this;
}

public ExchangeEnhancedAuthenticationOptionsFactory WithUserProperty(string name, string value)
{
if (name == null)
{
throw new ArgumentNullException(nameof(name));
}

if (_options.UserProperties == null)
{
_options.UserProperties = new List<MqttUserProperty>();
}

_options.UserProperties.Add(new MqttUserProperty(name, value));

return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using MQTTnet.Packets;

namespace MQTTnet.Server.EnhancedAuthentication;

public sealed class ExchangeEnhancedAuthenticationResult
{
public string ReasonString { get; set; }

public List<MqttUserProperty> UserProperties { get; set; }

public byte[] AuthenticationData { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using MQTTnet.Packets;

namespace MQTTnet.Server.EnhancedAuthentication;

public static class ExchangeEnhancedAuthenticationResultFactory
{
public static ExchangeEnhancedAuthenticationResult Create(MqttAuthPacket authPacket)
{
ArgumentNullException.ThrowIfNull(authPacket);

return new ExchangeEnhancedAuthenticationResult
{
AuthenticationData = authPacket.AuthenticationData,

ReasonString = authPacket.ReasonString,
UserProperties = authPacket.UserProperties
};
}

public static ExchangeEnhancedAuthenticationResult Create(MqttDisconnectPacket disconnectPacket)
{
ArgumentNullException.ThrowIfNull(disconnectPacket);

return new ExchangeEnhancedAuthenticationResult
{
AuthenticationData = null,
ReasonString = disconnectPacket.ReasonString,
UserProperties = disconnectPacket.UserProperties

// SessionExpiryInterval makes no sense because the connection is not yet made!
// ServerReferences makes no sense when the client initiated a DISCONNECT!
};
}
}
Loading

0 comments on commit 9dbe1e4

Please sign in to comment.