-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Enable NuGet signature verification by default
- Loading branch information
Showing
5 changed files
with
163 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
// Copyright (c) .NET Foundation and contributors. All rights reserved. | ||
// Licensed under the MIT license. See LICENSE file in the project root for full license information. | ||
|
||
#nullable enable | ||
|
||
using System; | ||
using Microsoft.DotNet.Cli; | ||
using Microsoft.DotNet.Cli.Utils; | ||
using Microsoft.DotNet.Tools.MSBuild; | ||
|
||
namespace Microsoft.DotNet.Tools | ||
{ | ||
public static class NuGetSignatureVerificationEnabler | ||
{ | ||
private static readonly EnvironmentProvider _environmentProvider = new(); | ||
|
||
internal static readonly string DotNetNuGetSignatureVerification = "DOTNET_NUGET_SIGNATURE_VERIFICATION"; | ||
|
||
public static void SetEnvironmentVariable(ForwardingApp forwardingApp, IEnvironmentProvider? environmentProvider = null) | ||
{ | ||
string value = GetSignatureVerificationEnablementValue(environmentProvider); | ||
|
||
forwardingApp.WithEnvironmentVariable(DotNetNuGetSignatureVerification, value); | ||
} | ||
|
||
public static void SetEnvironmentVariable(MSBuildForwardingApp forwardingApp, IEnvironmentProvider? environmentProvider = null) | ||
{ | ||
string value = GetSignatureVerificationEnablementValue(environmentProvider); | ||
|
||
forwardingApp.EnvironmentVariable(DotNetNuGetSignatureVerification, value); | ||
} | ||
|
||
private static string GetSignatureVerificationEnablementValue(IEnvironmentProvider? environmentProvider) | ||
{ | ||
string? value = (environmentProvider ?? _environmentProvider).GetEnvironmentVariable(DotNetNuGetSignatureVerification); | ||
|
||
return string.Equals(bool.FalseString, value, StringComparison.OrdinalIgnoreCase) | ||
? bool.FalseString : bool.TrueString; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
114 changes: 114 additions & 0 deletions
114
src/Tests/dotnet.Tests/NuGetSignatureVerificationEnablerTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
// Copyright (c) .NET Foundation and contributors. All rights reserved. | ||
// Licensed under the MIT license. See LICENSE file in the project root for full license information. | ||
|
||
#nullable enable | ||
|
||
using System; | ||
using System.Collections.Generic; | ||
using System.Diagnostics; | ||
using System.IO; | ||
using Xunit; | ||
using Microsoft.DotNet.Cli; | ||
using Microsoft.DotNet.Cli.Utils; | ||
using Microsoft.DotNet.Tools; | ||
using Microsoft.DotNet.Tools.MSBuild; | ||
using Moq; | ||
|
||
namespace Microsoft.DotNet.Tests | ||
{ | ||
public class NuGetSignatureVerificationEnablerTests | ||
{ | ||
private static readonly string FakeFilePath = Path.Combine(Path.GetTempPath(), "file.fake"); | ||
|
||
public static IEnumerable<object[]> GetNonFalseValues() | ||
{ | ||
yield return new object[] { null! }; | ||
yield return new object[] { string.Empty }; | ||
yield return new object[] { "0" }; | ||
yield return new object[] { "1" }; | ||
yield return new object[] { "no" }; | ||
yield return new object[] { "yes" }; | ||
yield return new object[] { "true" }; | ||
yield return new object[] { "TRUE" }; | ||
} | ||
|
||
public static IEnumerable<object[]> GetFalseValues() | ||
{ | ||
yield return new object[] { "false" }; | ||
yield return new object[] { "FALSE" }; | ||
} | ||
|
||
[Theory] | ||
[MemberData(nameof(GetNonFalseValues))] | ||
public void GivenAForwardingAppAndAnEnvironmentVariableValueThatIsNotFalseSetsTrue(string? value) | ||
{ | ||
Mock<IEnvironmentProvider> environmentProvider = CreateEnvironmentProvider(value); | ||
ForwardingApp forwardingApp = new(FakeFilePath, Array.Empty<string>()); | ||
|
||
NuGetSignatureVerificationEnabler.SetEnvironmentVariable(forwardingApp, environmentProvider.Object); | ||
|
||
environmentProvider.VerifyAll(); | ||
|
||
VerifyEnvironmentVariable(forwardingApp.GetProcessStartInfo(), bool.TrueString); | ||
} | ||
|
||
[Theory] | ||
[MemberData(nameof(GetFalseValues))] | ||
public void GivenAForwardingAppAndAnEnvironmentVariableValueThatIsFalseSetsFalse(string value) | ||
{ | ||
Mock<IEnvironmentProvider> environmentProvider = CreateEnvironmentProvider(value); | ||
ForwardingApp forwardingApp = new(FakeFilePath, Array.Empty<string>()); | ||
|
||
NuGetSignatureVerificationEnabler.SetEnvironmentVariable(forwardingApp, environmentProvider.Object); | ||
|
||
environmentProvider.VerifyAll(); | ||
|
||
VerifyEnvironmentVariable(forwardingApp.GetProcessStartInfo(), bool.FalseString); | ||
} | ||
|
||
[Theory] | ||
[MemberData(nameof(GetNonFalseValues))] | ||
public void GivenAnMSBuildForwardingAppAndAnEnvironmentVariableValueThatIsNotFalseSetsTrue(string? value) | ||
{ | ||
Mock<IEnvironmentProvider> environmentProvider = CreateEnvironmentProvider(value); | ||
MSBuildForwardingApp forwardingApp = new(Array.Empty<string>(), FakeFilePath); | ||
|
||
NuGetSignatureVerificationEnabler.SetEnvironmentVariable(forwardingApp, environmentProvider.Object); | ||
|
||
environmentProvider.VerifyAll(); | ||
|
||
VerifyEnvironmentVariable(forwardingApp.GetProcessStartInfo(), bool.TrueString); | ||
} | ||
|
||
[Theory] | ||
[MemberData(nameof(GetFalseValues))] | ||
public void GivenAnMSBuildForwardingAppAndAnEnvironmentVariableValueThatIsFalseSetsFalse(string value) | ||
{ | ||
Mock<IEnvironmentProvider> environmentProvider = CreateEnvironmentProvider(value); | ||
MSBuildForwardingApp forwardingApp = new(Array.Empty<string>(), FakeFilePath); | ||
|
||
NuGetSignatureVerificationEnabler.SetEnvironmentVariable(forwardingApp, environmentProvider.Object); | ||
|
||
environmentProvider.VerifyAll(); | ||
|
||
VerifyEnvironmentVariable(forwardingApp.GetProcessStartInfo(), bool.FalseString); | ||
} | ||
|
||
private static Mock<IEnvironmentProvider> CreateEnvironmentProvider(string? value) | ||
{ | ||
Mock<IEnvironmentProvider> provider = new(MockBehavior.Strict); | ||
|
||
provider | ||
.Setup(p => p.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification)) | ||
.Returns(value!); | ||
|
||
return provider; | ||
} | ||
|
||
private static void VerifyEnvironmentVariable(ProcessStartInfo startInfo, string expectedValue) | ||
{ | ||
Assert.True(startInfo.EnvironmentVariables.ContainsKey(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification)); | ||
Assert.Equal(expectedValue, startInfo.EnvironmentVariables[NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification]); | ||
} | ||
} | ||
} |