From 06fb499d92820ec1f349a93a2e9383e58d5482b7 Mon Sep 17 00:00:00 2001 From: "Manuha Vancha (from Dev Box)" Date: Thu, 1 May 2025 16:09:33 -0700 Subject: [PATCH 1/5] Read auth mode from env for all sub commands --- src/AzureAuth.Test/AuthModeHelperTest.cs | 82 ++++++++++++++++++++++ src/AzureAuth/AuthModeHelper.cs | 54 ++++++++++++++ src/AzureAuth/Commands/Ado/CommandPat.cs | 14 +++- src/AzureAuth/Commands/Ado/CommandToken.cs | 11 ++- src/AzureAuth/Commands/CommandAad.cs | 43 +++--------- 5 files changed, 165 insertions(+), 39 deletions(-) create mode 100644 src/AzureAuth.Test/AuthModeHelperTest.cs create mode 100644 src/AzureAuth/AuthModeHelper.cs diff --git a/src/AzureAuth.Test/AuthModeHelperTest.cs b/src/AzureAuth.Test/AuthModeHelperTest.cs new file mode 100644 index 00000000..ad0d6f58 --- /dev/null +++ b/src/AzureAuth.Test/AuthModeHelperTest.cs @@ -0,0 +1,82 @@ +using FluentAssertions; +using Microsoft.Authentication.AzureAuth; +using Microsoft.Authentication.MSALWrapper; +using Microsoft.Authentication.TestHelper; +using Microsoft.Extensions.Logging; +using Microsoft.Office.Lasso.Interfaces; +using Microsoft.Office.Lasso.Telemetry; +using Moq; +using NLog.Targets; +using NUnit.Framework; + +namespace AzureAuth.Test +{ + public class AuthModeHelperTest + { + private Mock envMock; + private ILogger logger; + private MemoryTarget logTarget; + + [SetUp] + public void SetUp() + { + this.envMock = new Mock(); + (this.logger, this.logTarget) = MemoryLogger.Create(); + } + + [Test] + public void ReadAuthModeFromEnvOrSetDefault_ReturnsDefault_WhenEnvVarIsEmpty() + { + // Arrange + envMock.Setup(e => e.Get(It.IsAny())).Returns(string.Empty); + + // Act + var result = AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData(), logger); + + // Assert + result.Should().BeEquivalentTo(new[] { AuthMode.Default }); + } + + [Test] + public void ReadAuthModeFromEnvOrSetDefault_ReturnsParsedAuthModes_WhenEnvVarIsValid() + { + // Arrange + envMock.Setup(e => e.Get(It.IsAny())).Returns("Web,Broker"); + + // Act + var result = AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData(), logger); + + // Assert + result.Should().BeEquivalentTo(new[] { AuthMode.Web, AuthMode.Broker }); + } + + [Test] + public void ReadAuthModeFromEnvOrSetDefault_LogsErrorAndReturnsEmpty_WhenEnvVarIsInvalid() + { + // Arrange + envMock.Setup(e => e.Get(It.IsAny())).Returns("InvalidMode"); + + // Act + var result = AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData(), logger); + + // Assert + result.Should().BeEmpty(); + this.logTarget.Logs.Should().ContainMatch("Invalid value specified for environment variable*"); + } + + [Test] + public void ReadAuthModeFromEnvOrSetDefault_AddsEventData_WhenEnvVarIsValid() + { + // Arrange + var eventData = new EventData(); + envMock.Setup(e => e.Get(It.IsAny())).Returns("Web"); + + // Act + var result = AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(envMock.Object, eventData, logger); + + // Assert + var env_var = $"env_{EnvVars.AuthMode}"; + eventData.Properties[env_var.ToLower()].Should().Be("Web"); + } + } +} diff --git a/src/AzureAuth/AuthModeHelper.cs b/src/AzureAuth/AuthModeHelper.cs new file mode 100644 index 00000000..6af49d1d --- /dev/null +++ b/src/AzureAuth/AuthModeHelper.cs @@ -0,0 +1,54 @@ +using Microsoft.Authentication.AzureAuth.Commands; +using Microsoft.Authentication.MSALWrapper; +using Microsoft.Extensions.Logging; +using Microsoft.Office.Lasso.Interfaces; +using Microsoft.Office.Lasso.Telemetry; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Authentication.AzureAuth +{ + /// + /// Helper class for s. + /// + public static class AuthModeHelper + { + /// + /// Get the auth modes from the environment or set the default. + /// + /// The to use. + /// Event data to add the auth mode to. + /// The to use. + /// AuthModes. + public static IEnumerable ReadAuthModeFromEnvOrSetDefault(IEnv env, EventData eventData, ILogger logger) + { + var authModesFromEnv = env.Get(EnvVars.AuthMode); + + // If auth modes are not specified in the environment, then return the default. + if (string.IsNullOrEmpty(authModesFromEnv)) + { + return new[] { AuthMode.Default }; + } + + var result = new List(); + foreach (var val in authModesFromEnv.Split(',')) + { + if (Enum.TryParse(val, ignoreCase: true, out var mode)) + { + result.Add(mode); + } + else + { + logger.LogError($"Invalid value specified for environment variable {EnvVars.AuthMode}. Allowed values are: {CommandAad.AuthModeHelperText}"); + return new List(); + } + } + + eventData.Add($"env_{EnvVars.AuthMode}", authModesFromEnv); + return result; + } + } +} diff --git a/src/AzureAuth/Commands/Ado/CommandPat.cs b/src/AzureAuth/Commands/Ado/CommandPat.cs index 28494ebc..b13ef82c 100644 --- a/src/AzureAuth/Commands/Ado/CommandPat.cs +++ b/src/AzureAuth/Commands/Ado/CommandPat.cs @@ -7,6 +7,7 @@ namespace Microsoft.Authentication.AzureAuth.Commands.Ado using System.Collections.Generic; using System.Collections.Immutable; using System.IO; + using System.Linq; using McMaster.Extensions.CommandLineUtils; using Microsoft.Authentication.AdoPat; @@ -14,6 +15,7 @@ namespace Microsoft.Authentication.AzureAuth.Commands.Ado using Microsoft.Authentication.MSALWrapper; using Microsoft.Extensions.Logging; using Microsoft.Identity.Client.Extensions.Msal; + using Microsoft.Office.Lasso.Interfaces; using Microsoft.Office.Lasso.Telemetry; using Microsoft.VisualStudio.Services.DelegatedAuthorization; using Microsoft.VisualStudio.Services.OAuth; @@ -92,7 +94,7 @@ private enum OutputMode private string Tenant { get; set; } = AzureAuth.Ado.Constants.Tenant.Microsoft; [Option(CommandAad.ModeOption, CommandAad.AuthModeHelperText, CommandOptionType.MultipleValue)] - private IEnumerable AuthModes { get; set; } = new[] { AuthMode.Default }; + private IEnumerable AuthModes { get; set; } [Option(CommandAad.DomainOption, $"{CommandAad.DomainHelpText}\n[default: {AzureAuth.Ado.Constants.PreferredDomain}]", CommandOptionType.SingleValue)] private string Domain { get; set; } = AzureAuth.Ado.Constants.PreferredDomain; @@ -120,14 +122,22 @@ private ImmutableSortedSet Scopes /// The instance that is used for logging. /// An . /// Lasso injected command event data. + /// An to use. /// An integer status code. 0 for success and non-zero for failure. - public int OnExecute(ILogger logger, IPublicClientAuth publicClientAuth, CommandExecuteEventData eventData) + public int OnExecute(ILogger logger, IPublicClientAuth publicClientAuth, CommandExecuteEventData eventData, IEnv env) { if (!this.ValidOptions(logger)) { return 1; } + // If command line options for mode are not specified, then use the environment variables. + this.AuthModes ??= AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(env, eventData, logger); + if (!this.AuthModes.Any()) + { + return 1; + } + var accessToken = this.AccessToken(publicClientAuth, eventData); if (accessToken == null) { diff --git a/src/AzureAuth/Commands/Ado/CommandToken.cs b/src/AzureAuth/Commands/Ado/CommandToken.cs index 76005ee9..25a89b7f 100644 --- a/src/AzureAuth/Commands/Ado/CommandToken.cs +++ b/src/AzureAuth/Commands/Ado/CommandToken.cs @@ -5,7 +5,7 @@ namespace Microsoft.Authentication.AzureAuth.Commands.Ado { using System; using System.Collections.Generic; - + using System.Linq; using McMaster.Extensions.CommandLineUtils; using Microsoft.Authentication.AzureAuth.Ado; @@ -52,7 +52,7 @@ public enum OutputMode private string Tenant { get; set; } = AzureAuth.Ado.Constants.Tenant.Microsoft; [Option(CommandAad.ModeOption, CommandAad.AuthModeHelperText, CommandOptionType.MultipleValue)] - private IEnumerable AuthModes { get; set; } = new[] { AuthMode.Default }; + private IEnumerable AuthModes { get; set; } [Option(CommandAad.DomainOption, Description = DomainOptionDescription)] private string Domain { get; set; } = AzureAuth.Ado.Constants.PreferredDomain; @@ -98,6 +98,13 @@ public int OnExecute(ILogger logger, IEnv env, ITelemetryService t return 0; } + // If command line options for mode are not specified, then use the environment variables. + this.AuthModes ??= AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(env, eventData, logger); + if (!this.AuthModes.Any()) + { + return 1; + } + // If no PAT then use AAD AT. TokenResult token = publicClientAuth.Token( AzureAuth.Ado.AuthParameters.AdoParameters(this.Tenant), diff --git a/src/AzureAuth/Commands/CommandAad.cs b/src/AzureAuth/Commands/CommandAad.cs index 6c88e00d..9de0b93a 100644 --- a/src/AzureAuth/Commands/CommandAad.cs +++ b/src/AzureAuth/Commands/CommandAad.cs @@ -84,10 +84,13 @@ public class CommandAad /// public static readonly TimeSpan GlobalTimeout = TimeSpan.FromMinutes(15); + /// + /// The allowed values for the option. + /// #if PlatformWindows - private const string AuthModeAllowedValues = "all, iwa, broker, web, devicecode"; + public const string AuthModeAllowedValues = "all, iwa, broker, web, devicecode"; #else - private const string AuthModeAllowedValues = "all, web, devicecode"; + public const string AuthModeAllowedValues = "all, web, devicecode"; #endif private const string ResourceOption = "--resource"; @@ -279,9 +282,10 @@ public bool EvaluateOptions() } } - if (this.AuthModes is null && !this.TrySetAuthModeFromEnvOrDefault()) + // If command line options for mode are not specified, then use the environment variables. + this.AuthModes ??= AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(env, eventData, logger); + if (!this.AuthModes.Any()) { - this.logger.LogError($"Invalid value specified for environment variable {EnvVars.AuthMode}. Allowed values are: {AuthModeAllowedValues}"); return false; } @@ -418,36 +422,5 @@ private int GetToken(IPublicClientAuth publicClientAuth) return 0; } - - /// - /// Sets the from the environment variable and sets a default if not set. - /// - /// True if authmode is set. - public bool TrySetAuthModeFromEnvOrDefault() - { - var authModesFromEnv = this.env.Get(EnvVars.AuthMode); - if (string.IsNullOrEmpty(authModesFromEnv)) - { - this.AuthModes = new[] { AuthMode.Default }; - return true; - } - - var result = new List(); - foreach(var val in authModesFromEnv.Split(',')) - { - if (Enum.TryParse(val, ignoreCase: true, out var mode)) - { - result.Add(mode); - } - else - { - return false; - } - } - - this.AuthModes = result; - this.eventData.Add($"env_{EnvVars.AuthMode}", authModesFromEnv); - return true; - } } } From 655a9820a004209ba14b7a73a8d8fc9ca8082daa Mon Sep 17 00:00:00 2001 From: "Manuha Vancha (from Dev Box)" Date: Thu, 1 May 2025 16:15:24 -0700 Subject: [PATCH 2/5] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 095988cd..f1de09f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added -- Added support for reading auth mode from the environment variable `AZUREAUTH_MODE` for aad subcommands. +- Added support for reading auth mode from the environment variable `AZUREAUTH_MODE`. ## [0.9.1] - 2024-12-09 ### Changed From 920c15480a1311de94d297c3a2b8be7ba31c7c46 Mon Sep 17 00:00:00 2001 From: "Manuha Vancha (from Dev Box)" Date: Thu, 1 May 2025 17:51:36 -0700 Subject: [PATCH 3/5] Use env extension class instead of creating a helper class --- src/AzureAuth.Test/AuthModeHelperTest.cs | 82 ---------------------- src/AzureAuth.Test/IEnvExtensionsTest.cs | 64 ++++++++++++++++- src/AzureAuth/AuthModeHelper.cs | 54 -------------- src/AzureAuth/Commands/Ado/CommandPat.cs | 3 +- src/AzureAuth/Commands/Ado/CommandToken.cs | 3 +- src/AzureAuth/Commands/CommandAad.cs | 3 +- src/AzureAuth/IEnvExtensions.cs | 37 ++++++++++ 7 files changed, 105 insertions(+), 141 deletions(-) delete mode 100644 src/AzureAuth.Test/AuthModeHelperTest.cs delete mode 100644 src/AzureAuth/AuthModeHelper.cs diff --git a/src/AzureAuth.Test/AuthModeHelperTest.cs b/src/AzureAuth.Test/AuthModeHelperTest.cs deleted file mode 100644 index ad0d6f58..00000000 --- a/src/AzureAuth.Test/AuthModeHelperTest.cs +++ /dev/null @@ -1,82 +0,0 @@ -using FluentAssertions; -using Microsoft.Authentication.AzureAuth; -using Microsoft.Authentication.MSALWrapper; -using Microsoft.Authentication.TestHelper; -using Microsoft.Extensions.Logging; -using Microsoft.Office.Lasso.Interfaces; -using Microsoft.Office.Lasso.Telemetry; -using Moq; -using NLog.Targets; -using NUnit.Framework; - -namespace AzureAuth.Test -{ - public class AuthModeHelperTest - { - private Mock envMock; - private ILogger logger; - private MemoryTarget logTarget; - - [SetUp] - public void SetUp() - { - this.envMock = new Mock(); - (this.logger, this.logTarget) = MemoryLogger.Create(); - } - - [Test] - public void ReadAuthModeFromEnvOrSetDefault_ReturnsDefault_WhenEnvVarIsEmpty() - { - // Arrange - envMock.Setup(e => e.Get(It.IsAny())).Returns(string.Empty); - - // Act - var result = AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData(), logger); - - // Assert - result.Should().BeEquivalentTo(new[] { AuthMode.Default }); - } - - [Test] - public void ReadAuthModeFromEnvOrSetDefault_ReturnsParsedAuthModes_WhenEnvVarIsValid() - { - // Arrange - envMock.Setup(e => e.Get(It.IsAny())).Returns("Web,Broker"); - - // Act - var result = AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData(), logger); - - // Assert - result.Should().BeEquivalentTo(new[] { AuthMode.Web, AuthMode.Broker }); - } - - [Test] - public void ReadAuthModeFromEnvOrSetDefault_LogsErrorAndReturnsEmpty_WhenEnvVarIsInvalid() - { - // Arrange - envMock.Setup(e => e.Get(It.IsAny())).Returns("InvalidMode"); - - // Act - var result = AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData(), logger); - - // Assert - result.Should().BeEmpty(); - this.logTarget.Logs.Should().ContainMatch("Invalid value specified for environment variable*"); - } - - [Test] - public void ReadAuthModeFromEnvOrSetDefault_AddsEventData_WhenEnvVarIsValid() - { - // Arrange - var eventData = new EventData(); - envMock.Setup(e => e.Get(It.IsAny())).Returns("Web"); - - // Act - var result = AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(envMock.Object, eventData, logger); - - // Assert - var env_var = $"env_{EnvVars.AuthMode}"; - eventData.Properties[env_var.ToLower()].Should().Be("Web"); - } - } -} diff --git a/src/AzureAuth.Test/IEnvExtensionsTest.cs b/src/AzureAuth.Test/IEnvExtensionsTest.cs index 3e89ff0b..7084cf5d 100644 --- a/src/AzureAuth.Test/IEnvExtensionsTest.cs +++ b/src/AzureAuth.Test/IEnvExtensionsTest.cs @@ -6,20 +6,26 @@ namespace AzureAuth.Test using FluentAssertions; using Microsoft.Authentication.AzureAuth; + using Microsoft.Authentication.MSALWrapper; + using Microsoft.Authentication.TestHelper; + using Microsoft.Extensions.Logging; using Microsoft.Office.Lasso.Interfaces; - + using Microsoft.Office.Lasso.Telemetry; using Moq; - + using NLog.Targets; using NUnit.Framework; public class IEnvExtensionsTest { private Mock envMock; + private ILogger logger; + private MemoryTarget logTarget; [SetUp] public void SetUp() { this.envMock = new Mock(); + (this.logger, this.logTarget) = MemoryLogger.Create(); } [TestCase("1", true)] @@ -51,5 +57,59 @@ public void InteractiveAuth_IsEnabledIfEnvVarsAreNotSet() this.envMock.Setup(env => env.Get(It.IsAny())).Returns((string)null); IEnvExtensions.InteractiveAuthDisabled(this.envMock.Object).Should().BeFalse(); } + + [Test] + public void ReadAuthModeFromEnvOrSetDefault_ReturnsDefault_WhenEnvVarIsEmpty() + { + // Arrange + envMock.Setup(e => e.Get(It.IsAny())).Returns(string.Empty); + + // Act + var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData()); + + // Assert + result.Should().BeEquivalentTo(new[] { AuthMode.Default }); + } + + [Test] + public void ReadAuthModeFromEnvOrSetDefault_ReturnsParsedAuthModes_WhenEnvVarIsValid() + { + // Arrange + envMock.Setup(e => e.Get(It.IsAny())).Returns("Web,Broker"); + + // Act + var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData()); + + // Assert + result.Should().BeEquivalentTo(new[] { AuthMode.Web, AuthMode.Broker }); + } + + [Test] + public void ReadAuthModeFromEnvOrSetDefault_ReturnsEmpty_WhenEnvVarIsInvalid() + { + // Arrange + envMock.Setup(e => e.Get(It.IsAny())).Returns("InvalidMode"); + + // Act + var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData()); + + // Assert + result.Should().BeEmpty(); + } + + [Test] + public void ReadAuthModeFromEnvOrSetDefault_AddsEventData_WhenEnvVarIsValid() + { + // Arrange + var eventData = new EventData(); + envMock.Setup(e => e.Get(It.IsAny())).Returns("Web"); + + // Act + var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object, eventData); + + // Assert + var env_var = $"env_{EnvVars.AuthMode}"; + eventData.Properties[env_var.ToLower()].Should().Be("Web"); + } } } diff --git a/src/AzureAuth/AuthModeHelper.cs b/src/AzureAuth/AuthModeHelper.cs deleted file mode 100644 index 6af49d1d..00000000 --- a/src/AzureAuth/AuthModeHelper.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Microsoft.Authentication.AzureAuth.Commands; -using Microsoft.Authentication.MSALWrapper; -using Microsoft.Extensions.Logging; -using Microsoft.Office.Lasso.Interfaces; -using Microsoft.Office.Lasso.Telemetry; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Microsoft.Authentication.AzureAuth -{ - /// - /// Helper class for s. - /// - public static class AuthModeHelper - { - /// - /// Get the auth modes from the environment or set the default. - /// - /// The to use. - /// Event data to add the auth mode to. - /// The to use. - /// AuthModes. - public static IEnumerable ReadAuthModeFromEnvOrSetDefault(IEnv env, EventData eventData, ILogger logger) - { - var authModesFromEnv = env.Get(EnvVars.AuthMode); - - // If auth modes are not specified in the environment, then return the default. - if (string.IsNullOrEmpty(authModesFromEnv)) - { - return new[] { AuthMode.Default }; - } - - var result = new List(); - foreach (var val in authModesFromEnv.Split(',')) - { - if (Enum.TryParse(val, ignoreCase: true, out var mode)) - { - result.Add(mode); - } - else - { - logger.LogError($"Invalid value specified for environment variable {EnvVars.AuthMode}. Allowed values are: {CommandAad.AuthModeHelperText}"); - return new List(); - } - } - - eventData.Add($"env_{EnvVars.AuthMode}", authModesFromEnv); - return result; - } - } -} diff --git a/src/AzureAuth/Commands/Ado/CommandPat.cs b/src/AzureAuth/Commands/Ado/CommandPat.cs index b13ef82c..8ca4f788 100644 --- a/src/AzureAuth/Commands/Ado/CommandPat.cs +++ b/src/AzureAuth/Commands/Ado/CommandPat.cs @@ -132,9 +132,10 @@ public int OnExecute(ILogger logger, IPublicClientAuth publicClientA } // If command line options for mode are not specified, then use the environment variables. - this.AuthModes ??= AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(env, eventData, logger); + this.AuthModes ??= env.ReadAuthModeFromEnvOrSetDefault(eventData); if (!this.AuthModes.Any()) { + logger.LogError($"Invalid value specified for environment variable {EnvVars.AuthMode}. Allowed values are: {CommandAad.AuthModeHelperText}"); return 1; } diff --git a/src/AzureAuth/Commands/Ado/CommandToken.cs b/src/AzureAuth/Commands/Ado/CommandToken.cs index 25a89b7f..19bec762 100644 --- a/src/AzureAuth/Commands/Ado/CommandToken.cs +++ b/src/AzureAuth/Commands/Ado/CommandToken.cs @@ -99,9 +99,10 @@ public int OnExecute(ILogger logger, IEnv env, ITelemetryService t } // If command line options for mode are not specified, then use the environment variables. - this.AuthModes ??= AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(env, eventData, logger); + this.AuthModes ??= env.ReadAuthModeFromEnvOrSetDefault(eventData); if (!this.AuthModes.Any()) { + logger.LogError($"Invalid value specified for environment variable {EnvVars.AuthMode}. Allowed values are: {CommandAad.AuthModeHelperText}"); return 1; } diff --git a/src/AzureAuth/Commands/CommandAad.cs b/src/AzureAuth/Commands/CommandAad.cs index 9de0b93a..d519a0bd 100644 --- a/src/AzureAuth/Commands/CommandAad.cs +++ b/src/AzureAuth/Commands/CommandAad.cs @@ -283,9 +283,10 @@ public bool EvaluateOptions() } // If command line options for mode are not specified, then use the environment variables. - this.AuthModes ??= AuthModeHelper.ReadAuthModeFromEnvOrSetDefault(env, eventData, logger); + this.AuthModes ??= env.ReadAuthModeFromEnvOrSetDefault(eventData); if (!this.AuthModes.Any()) { + this.logger.LogError($"Invalid value specified for environment variable {EnvVars.AuthMode}. Allowed values are: {CommandAad.AuthModeHelperText}"); return false; } diff --git a/src/AzureAuth/IEnvExtensions.cs b/src/AzureAuth/IEnvExtensions.cs index 26857ef0..e8cc5dfc 100644 --- a/src/AzureAuth/IEnvExtensions.cs +++ b/src/AzureAuth/IEnvExtensions.cs @@ -3,7 +3,11 @@ namespace Microsoft.Authentication.AzureAuth { + using Microsoft.Authentication.MSALWrapper; using Microsoft.Office.Lasso.Interfaces; + using Microsoft.Office.Lasso.Telemetry; + using System.Collections.Generic; + using System; /// /// Extension methods to Lasso's interface. @@ -22,5 +26,38 @@ public static bool InteractiveAuthDisabled(this IEnv env) return !string.IsNullOrEmpty(env.Get(EnvVars.NoUser)) || string.Equals(CorextPositiveValue, env.Get(EnvVars.CorextNonInteractive)); } + + /// + /// Get the auth modes from the environment or set the default. + /// + /// The to use. + /// Event data to add the auth mode to. + /// AuthModes. + public static IEnumerable ReadAuthModeFromEnvOrSetDefault(this IEnv env, EventData eventData) + { + var authModesFromEnv = env.Get(EnvVars.AuthMode); + + // If auth modes are not specified in the environment, then return the default. + if (string.IsNullOrEmpty(authModesFromEnv)) + { + return new[] { AuthMode.Default }; + } + + var result = new List(); + foreach (var val in authModesFromEnv.Split(',')) + { + if (Enum.TryParse(val, ignoreCase: true, out var mode)) + { + result.Add(mode); + } + else + { + return new List(); + } + } + + eventData.Add($"env_{EnvVars.AuthMode}", authModesFromEnv); + return result; + } } } From 75bc8f8c4c34c2336f03ac8726bb1278cde96690 Mon Sep 17 00:00:00 2001 From: "Manuha Vancha (from Dev Box)" Date: Mon, 5 May 2025 09:53:53 -0700 Subject: [PATCH 4/5] remove eventdata object from read env var method --- src/AzureAuth.Test/IEnvExtensionsTest.cs | 21 +++------------------ src/AzureAuth/Commands/Ado/CommandPat.cs | 2 +- src/AzureAuth/Commands/Ado/CommandToken.cs | 2 +- src/AzureAuth/Commands/CommandAad.cs | 2 +- src/AzureAuth/IEnvExtensions.cs | 4 ++-- src/AzureAuth/Program.cs | 1 + 6 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/AzureAuth.Test/IEnvExtensionsTest.cs b/src/AzureAuth.Test/IEnvExtensionsTest.cs index 7084cf5d..66d3448a 100644 --- a/src/AzureAuth.Test/IEnvExtensionsTest.cs +++ b/src/AzureAuth.Test/IEnvExtensionsTest.cs @@ -65,7 +65,7 @@ public void ReadAuthModeFromEnvOrSetDefault_ReturnsDefault_WhenEnvVarIsEmpty() envMock.Setup(e => e.Get(It.IsAny())).Returns(string.Empty); // Act - var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData()); + var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object); // Assert result.Should().BeEquivalentTo(new[] { AuthMode.Default }); @@ -78,7 +78,7 @@ public void ReadAuthModeFromEnvOrSetDefault_ReturnsParsedAuthModes_WhenEnvVarIsV envMock.Setup(e => e.Get(It.IsAny())).Returns("Web,Broker"); // Act - var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData()); + var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object); // Assert result.Should().BeEquivalentTo(new[] { AuthMode.Web, AuthMode.Broker }); @@ -91,25 +91,10 @@ public void ReadAuthModeFromEnvOrSetDefault_ReturnsEmpty_WhenEnvVarIsInvalid() envMock.Setup(e => e.Get(It.IsAny())).Returns("InvalidMode"); // Act - var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object, new EventData()); + var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object); // Assert result.Should().BeEmpty(); } - - [Test] - public void ReadAuthModeFromEnvOrSetDefault_AddsEventData_WhenEnvVarIsValid() - { - // Arrange - var eventData = new EventData(); - envMock.Setup(e => e.Get(It.IsAny())).Returns("Web"); - - // Act - var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object, eventData); - - // Assert - var env_var = $"env_{EnvVars.AuthMode}"; - eventData.Properties[env_var.ToLower()].Should().Be("Web"); - } } } diff --git a/src/AzureAuth/Commands/Ado/CommandPat.cs b/src/AzureAuth/Commands/Ado/CommandPat.cs index 8ca4f788..4dc4c870 100644 --- a/src/AzureAuth/Commands/Ado/CommandPat.cs +++ b/src/AzureAuth/Commands/Ado/CommandPat.cs @@ -132,7 +132,7 @@ public int OnExecute(ILogger logger, IPublicClientAuth publicClientA } // If command line options for mode are not specified, then use the environment variables. - this.AuthModes ??= env.ReadAuthModeFromEnvOrSetDefault(eventData); + this.AuthModes ??= env.ReadAuthModeFromEnvOrSetDefault(); if (!this.AuthModes.Any()) { logger.LogError($"Invalid value specified for environment variable {EnvVars.AuthMode}. Allowed values are: {CommandAad.AuthModeHelperText}"); diff --git a/src/AzureAuth/Commands/Ado/CommandToken.cs b/src/AzureAuth/Commands/Ado/CommandToken.cs index 19bec762..7e57c6c4 100644 --- a/src/AzureAuth/Commands/Ado/CommandToken.cs +++ b/src/AzureAuth/Commands/Ado/CommandToken.cs @@ -99,7 +99,7 @@ public int OnExecute(ILogger logger, IEnv env, ITelemetryService t } // If command line options for mode are not specified, then use the environment variables. - this.AuthModes ??= env.ReadAuthModeFromEnvOrSetDefault(eventData); + this.AuthModes ??= env.ReadAuthModeFromEnvOrSetDefault(); if (!this.AuthModes.Any()) { logger.LogError($"Invalid value specified for environment variable {EnvVars.AuthMode}. Allowed values are: {CommandAad.AuthModeHelperText}"); diff --git a/src/AzureAuth/Commands/CommandAad.cs b/src/AzureAuth/Commands/CommandAad.cs index d519a0bd..4540cf04 100644 --- a/src/AzureAuth/Commands/CommandAad.cs +++ b/src/AzureAuth/Commands/CommandAad.cs @@ -283,7 +283,7 @@ public bool EvaluateOptions() } // If command line options for mode are not specified, then use the environment variables. - this.AuthModes ??= env.ReadAuthModeFromEnvOrSetDefault(eventData); + this.AuthModes ??= env.ReadAuthModeFromEnvOrSetDefault(); if (!this.AuthModes.Any()) { this.logger.LogError($"Invalid value specified for environment variable {EnvVars.AuthMode}. Allowed values are: {CommandAad.AuthModeHelperText}"); diff --git a/src/AzureAuth/IEnvExtensions.cs b/src/AzureAuth/IEnvExtensions.cs index e8cc5dfc..f67f4143 100644 --- a/src/AzureAuth/IEnvExtensions.cs +++ b/src/AzureAuth/IEnvExtensions.cs @@ -33,7 +33,7 @@ public static bool InteractiveAuthDisabled(this IEnv env) /// The to use. /// Event data to add the auth mode to. /// AuthModes. - public static IEnumerable ReadAuthModeFromEnvOrSetDefault(this IEnv env, EventData eventData) + public static IEnumerable ReadAuthModeFromEnvOrSetDefault(this IEnv env) { var authModesFromEnv = env.Get(EnvVars.AuthMode); @@ -52,11 +52,11 @@ public static IEnumerable ReadAuthModeFromEnvOrSetDefault(this IEnv en } else { + // If the environment variable is not a valid auth mode, then return an empty list. return new List(); } } - eventData.Add($"env_{EnvVars.AuthMode}", authModesFromEnv); return result; } } diff --git a/src/AzureAuth/Program.cs b/src/AzureAuth/Program.cs index 85fd7c69..7a94c4c7 100644 --- a/src/AzureAuth/Program.cs +++ b/src/AzureAuth/Program.cs @@ -68,6 +68,7 @@ private static void Main(string[] args) EnvVars.CloudBuild, EnvVars.NoUser, EnvVars.CorextNonInteractive, + EnvVars.AuthMode, }; TelemetryConfig telemetryConfig = new TelemetryConfig( From 0b276f53e96415bf6fb5d82c8e51aed72020faae Mon Sep 17 00:00:00 2001 From: "Manuha Vancha (from Dev Box)" Date: Mon, 5 May 2025 10:14:50 -0700 Subject: [PATCH 5/5] Fix tests --- src/AzureAuth.Test/IEnvExtensionsTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AzureAuth.Test/IEnvExtensionsTest.cs b/src/AzureAuth.Test/IEnvExtensionsTest.cs index 66d3448a..3acb16ab 100644 --- a/src/AzureAuth.Test/IEnvExtensionsTest.cs +++ b/src/AzureAuth.Test/IEnvExtensionsTest.cs @@ -75,13 +75,13 @@ public void ReadAuthModeFromEnvOrSetDefault_ReturnsDefault_WhenEnvVarIsEmpty() public void ReadAuthModeFromEnvOrSetDefault_ReturnsParsedAuthModes_WhenEnvVarIsValid() { // Arrange - envMock.Setup(e => e.Get(It.IsAny())).Returns("Web,Broker"); + envMock.Setup(e => e.Get(It.IsAny())).Returns("Web,DeviceCode"); // Act var result = IEnvExtensions.ReadAuthModeFromEnvOrSetDefault(envMock.Object); // Assert - result.Should().BeEquivalentTo(new[] { AuthMode.Web, AuthMode.Broker }); + result.Should().BeEquivalentTo(new[] { AuthMode.Web, AuthMode.DeviceCode }); } [Test]