File: PreviewFeatureSettings.cs
Web Access
Project: src\nuget-client\src\NuGet.Core\NuGet.Credentials\NuGet.Credentials.csproj (NuGet.Credentials)
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using NuGet.Common;

namespace NuGet.Credentials
{
    /// <summary>
    /// Settings for in-flight features not ready to be turned on permanently
    /// </summary>
    public static class PreviewFeatureSettings
    {
        static PreviewFeatureSettings()
        {
            StaticState.BuildEnded += ResetCache;
        }

#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
        public const string DefaultCredentialsAfterCredentialProvidersEnvironmentVariableName
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
            = "NUGET_CREDENTIAL_PROVIDER_OVERRIDE_DEFAULT";

        internal static IEnvironmentVariableReader environmentVariableReader { get; set; } = EnvironmentVariableWrapper.Instance;

        private static bool? s_defaultCredentialsAfterCredentialProviders;

        /// <summary>
        /// Use DefaultNetworkCredentialsCredentialProvider after plugin credential providers to handle using the user's
        /// ambient Windows credentials, instead of support baked into HttpSourceCredentials
        /// </summary>
        public static bool DefaultCredentialsAfterCredentialProviders
        {
            get
            {
                // Computed on first use rather than in the reset, so a process reused across builds reads the
                // environment of the build that uses it.
                s_defaultCredentialsAfterCredentialProviders ??= GetFlagFromEnvironmentVariable(DefaultCredentialsAfterCredentialProvidersEnvironmentVariableName);
                return s_defaultCredentialsAfterCredentialProviders.Value;
            }
            set => s_defaultCredentialsAfterCredentialProviders = value;
        }

        /// <summary>Discards the cached flag so it is re-read from the environment on next use.</summary>
        internal static void ResetCache() => s_defaultCredentialsAfterCredentialProviders = null;

        private static bool GetFlagFromEnvironmentVariable(string variableName)
        {
            bool flag;
            var flagString = environmentVariableReader.GetEnvironmentVariable(variableName);
            return bool.TryParse(flagString, out flag) && flag;
        }
    }
}