diff --git a/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Amqp/Constants.cs b/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Amqp/Constants.cs index f28e9503d88..a5abc743860 100644 --- a/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Amqp/Constants.cs +++ b/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Amqp/Constants.cs @@ -34,5 +34,6 @@ public static class Constants public const string MessageAnnotationsConnectionModuleId = "iothub-connection-module-id"; public const string WebSocketSubProtocol = "AMQPWSB10"; public const string WebSocketListenerName = WebSocketSubProtocol +"-listener"; + public const string ServiceBusCbsSaslMechanismName = "MSSBCBS"; } } diff --git a/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Amqp/settings/AmqpSettingsProvider.cs b/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Amqp/settings/AmqpSettingsProvider.cs index c8cb2cf6ec7..78eff37b92a 100644 --- a/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Amqp/settings/AmqpSettingsProvider.cs +++ b/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Amqp/settings/AmqpSettingsProvider.cs @@ -53,7 +53,11 @@ void AddSaslProvider() // needs (i.e. old clients that are still using EXTERNAL for CBS). // saslProvider.AddHandler(new SaslExternalHandler()); - saslProvider.AddHandler(new SaslAnonymousHandler()); // CBS for other clients + // CBS + saslProvider.AddHandler(new SaslAnonymousHandler()); + + // CBS - used by some SDKs like C + saslProvider.AddHandler(new SaslAnonymousHandler(Constants.ServiceBusCbsSaslMechanismName)); // This handler implements SAS key based auth. saslProvider.AddHandler(new SaslPlainHandler(new EdgeHubSaslPlainAuthenticator(authenticator, identityFactory, iotHubHostName))); diff --git a/edge-hub/test/Microsoft.Azure.Devices.Edge.Hub.Amqp.Test/AmqpSettingsProviderTest.cs b/edge-hub/test/Microsoft.Azure.Devices.Edge.Hub.Amqp.Test/AmqpSettingsProviderTest.cs index 41219728ad3..0ecf32e5ae3 100644 --- a/edge-hub/test/Microsoft.Azure.Devices.Edge.Hub.Amqp.Test/AmqpSettingsProviderTest.cs +++ b/edge-hub/test/Microsoft.Azure.Devices.Edge.Hub.Amqp.Test/AmqpSettingsProviderTest.cs @@ -3,6 +3,9 @@ namespace Microsoft.Azure.Devices.Edge.Hub.Amqp.Test { using System; + using Microsoft.Azure.Amqp; + using Microsoft.Azure.Amqp.Sasl; + using Microsoft.Azure.Amqp.Transport; using Microsoft.Azure.Devices.Edge.Hub.Amqp.LinkHandlers; using Microsoft.Azure.Devices.Edge.Hub.Amqp.Settings; using Microsoft.Azure.Devices.Edge.Hub.Core; @@ -11,10 +14,10 @@ namespace Microsoft.Azure.Devices.Edge.Hub.Amqp.Test using Moq; using Xunit; + [Unit] public class AmqpSettingsProviderTest { - [Fact] - [Unit] + [Fact] public void TestInvalidInputsForGetDefaultAmqpSettings() { const string IotHubHostName = "restaurantatendofuniverse.azure-devices.net"; @@ -29,5 +32,40 @@ public void TestInvalidInputsForGetDefaultAmqpSettings() Assert.NotNull(AmqpSettingsProvider.GetDefaultAmqpSettings(IotHubHostName, authenticator.Object, identityFactory.Object, linkHandlerProvider, connectionProvider, new NullCredentialsCache())); } + + [Fact] + public void ValidateSettingsTest() + { + // Arrange + string iotHubHostName = "foo.azure-devices.net"; + var authenticator = Mock.Of(); + var identityFactory = Mock.Of(); + var linkHandlerProvider = Mock.Of(); + var connectionProvider = Mock.Of(); + + // Act + AmqpSettings settings = AmqpSettingsProvider.GetDefaultAmqpSettings(iotHubHostName, authenticator, identityFactory, linkHandlerProvider, connectionProvider, new NullCredentialsCache()); + + // Assert + Assert.NotNull(settings); + Assert.Equal(2, settings.TransportProviders.Count); + + var saslTransportProvider = settings.GetTransportProvider(); + Assert.NotNull(saslTransportProvider); + + SaslHandler anonHandler = saslTransportProvider.GetHandler("ANONYMOUS", false); + Assert.NotNull(anonHandler); + + SaslHandler plainHandler = saslTransportProvider.GetHandler("PLAIN", false); + Assert.NotNull(plainHandler); + + SaslHandler cbsHandler = saslTransportProvider.GetHandler(Amqp.Constants.ServiceBusCbsSaslMechanismName, false); + Assert.NotNull(cbsHandler); + + var amqpTransportProvider = settings.GetTransportProvider(); + Assert.NotNull(amqpTransportProvider); + + Assert.Equal(Amqp.Constants.AmqpVersion100, amqpTransportProvider.Versions[0]); + } } }