Skip to content

Commit 3e442cc

Browse files
Add tests for AllowUntrustedSigning flag
- CertificateChainUtilityTests: verify GetCertificateChain with allowUntrustedRoot=true returns a chain (UntrustedRoot as warning) - NuGetSignCommandTest: verify -AllowUntrustedSigning parses to SignArgs.AllowUntrustedRoot=true, and default is false - XplatSignTests: verify --allow-untrusted-signing parses to SignArgs.AllowUntrustedRoot=true, and default is false Co-authored-by: Copilot <[email protected]>
1 parent 10a7fec commit 3e442cc

3 files changed

Lines changed: 118 additions & 0 deletions

File tree

test/NuGet.Clients.Tests/NuGet.CommandLine.Test/NuGetSignCommandTest.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,5 +505,56 @@ private static SignCommand ArrangeSignCommand(string certificateFingerprint, Str
505505

506506
return signCommand;
507507
}
508+
509+
[Fact]
510+
public void SignCommandArgParsing_AllowUntrustedSigning_SetsAllowUntrustedRoot()
511+
{
512+
// Arrange
513+
var packagePath = @"\\path\package.nupkg";
514+
var certificateFingerprint = Sha256Hash;
515+
var mockConsole = new Mock<IConsole>();
516+
mockConsole.Setup(c => c.Verbosity).Returns(Verbosity.Detailed);
517+
518+
var signCommand = new SignCommand
519+
{
520+
Console = mockConsole.Object,
521+
CertificateFingerprint = certificateFingerprint,
522+
NonInteractive = true,
523+
AllowUntrustedSigning = true,
524+
};
525+
526+
signCommand.Arguments.Add(packagePath);
527+
528+
// Act
529+
var signArgs = signCommand.GetSignArgs();
530+
531+
// Assert
532+
Assert.True(signArgs.AllowUntrustedRoot);
533+
}
534+
535+
[Fact]
536+
public void SignCommandArgParsing_DefaultAllowUntrustedSigning_IsFalse()
537+
{
538+
// Arrange
539+
var packagePath = @"\\path\package.nupkg";
540+
var certificateFingerprint = Sha256Hash;
541+
var mockConsole = new Mock<IConsole>();
542+
mockConsole.Setup(c => c.Verbosity).Returns(Verbosity.Detailed);
543+
544+
var signCommand = new SignCommand
545+
{
546+
Console = mockConsole.Object,
547+
CertificateFingerprint = certificateFingerprint,
548+
NonInteractive = true,
549+
};
550+
551+
signCommand.Arguments.Add(packagePath);
552+
553+
// Act
554+
var signArgs = signCommand.GetSignArgs();
555+
556+
// Assert
557+
Assert.False(signArgs.AllowUntrustedRoot);
558+
}
508559
}
509560
}

test/NuGet.Core.FuncTests/NuGet.XPlat.FuncTest/XplatSignTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,46 @@ public void SignCommandArgParsing_DoesNotLogAWarningForSecureCertificateFingerpr
485485
});
486486
}
487487

488+
[Fact]
489+
public void SignCommandArgParsing_AllowUntrustedSigning_SetsAllowUntrustedRoot()
490+
{
491+
var packagePath = @"\\path\package.nupkg";
492+
var certificateFingerprint = Sha256Hash;
493+
494+
SignCommandArgs(
495+
(mockCommandRunner, testApp, getLogLevel, getParsedArg, _) =>
496+
{
497+
//Arrange
498+
var argList = new List<string>() { "sign", packagePath, "--certificate-fingerprint", certificateFingerprint, "--allow-untrusted-signing" };
499+
500+
//Act
501+
testApp.Execute(argList.ToArray());
502+
503+
//Assert
504+
Assert.True(getParsedArg().AllowUntrustedRoot);
505+
});
506+
}
507+
508+
[Fact]
509+
public void SignCommandArgParsing_DefaultAllowUntrustedSigning_IsFalse()
510+
{
511+
var packagePath = @"\\path\package.nupkg";
512+
var certificateFingerprint = Sha256Hash;
513+
514+
SignCommandArgs(
515+
(mockCommandRunner, testApp, getLogLevel, getParsedArg, _) =>
516+
{
517+
//Arrange
518+
var argList = new List<string>() { "sign", packagePath, "--certificate-fingerprint", certificateFingerprint };
519+
520+
//Act
521+
testApp.Execute(argList.ToArray());
522+
523+
//Assert
524+
Assert.False(getParsedArg().AllowUntrustedRoot);
525+
});
526+
}
527+
488528
private void SignCommandArgs(Action<Mock<ISignCommandRunner>, CommandLineApplication, Func<LogLevel>, Func<SignArgs>, TestCommandOutputLogger> verify)
489529
{
490530
// Arrange

test/NuGet.Core.Tests/NuGet.Packaging.Test/SigningTests/CertificateChainUtilityTests.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,33 @@ public void GetCertificateChain_WithUntrustedSelfIssuedCertificate_ReturnsChain(
144144
}
145145
}
146146

147+
[Fact]
148+
public void GetCertificateChain_WithUntrustedRoot_AllowUntrustedRoot_ReturnsChain()
149+
{
150+
using (X509ChainHolder chainHolder = X509ChainHolder.CreateForCodeSigning())
151+
using (var rootCertificate = SigningTestUtility.GetCertificate("root.crt"))
152+
using (var intermediateCertificate = SigningTestUtility.GetCertificate("intermediate.crt"))
153+
using (var leafCertificate = SigningTestUtility.GetCertificate("leaf.crt"))
154+
{
155+
var chain = chainHolder.Chain2;
156+
var extraStore = new X509Certificate2Collection() { rootCertificate, intermediateCertificate };
157+
var logger = new TestLogger();
158+
159+
using (var certificateChain = CertificateChainUtility.GetCertificateChain(
160+
leafCertificate,
161+
extraStore,
162+
logger,
163+
CertificateType.Signature,
164+
allowUntrustedRoot: true))
165+
{
166+
Assert.True(certificateChain.Count > 0);
167+
}
168+
169+
Assert.Equal(0, logger.Errors);
170+
SigningTestUtility.AssertUntrustedRoot(logger.LogMessages, LogLevel.Warning);
171+
}
172+
}
173+
147174
[Fact]
148175
public void GetCertificateChain_WhenCertChainNull_Throws()
149176
{

0 commit comments

Comments
 (0)