Skip to content
This repository was archived by the owner on Jul 30, 2024. It is now read-only.

Commit fa031ef

Browse files
committed
Make SignatureProcessor strip repository signatures (#390)
Progress on NuGet/Engineering#1207
1 parent 2289f91 commit fa031ef

17 files changed

Lines changed: 929 additions & 657 deletions

src/Validation.Common.Job/JsonConfigurationJob.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public abstract class JsonConfigurationJob : JobBase
3131
private const string GalleryDbConfigurationSectionName = "GalleryDb";
3232
private const string ValidationDbConfigurationSectionName = "ValidationDb";
3333
private const string ServiceBusConfigurationSectionName = "ServiceBus";
34+
private const string ValidationStorageConfigurationSectionName = "ValidationStorage";
3435
private const string PackageDownloadTimeoutName = "PackageDownloadTimeout";
3536

3637
/// <summary>
@@ -108,7 +109,7 @@ private void ConfigureDefaultJobServices(IServiceCollection services, IConfigura
108109
services.Configure<GalleryDbConfiguration>(configurationRoot.GetSection(GalleryDbConfigurationSectionName));
109110
services.Configure<ValidationDbConfiguration>(configurationRoot.GetSection(ValidationDbConfigurationSectionName));
110111
services.Configure<ServiceBusConfiguration>(configurationRoot.GetSection(ServiceBusConfigurationSectionName));
111-
services.Configure<ValidationStorageConfiguration>(configurationRoot.GetSection(ServiceBusConfigurationSectionName));
112+
services.Configure<ValidationStorageConfiguration>(configurationRoot.GetSection(ValidationStorageConfigurationSectionName));
112113

113114
services.AddSingleton(new TelemetryClient());
114115
services.AddTransient<ITelemetryClient, TelemetryClientWrapper>();

src/Validation.PackageSigning.ProcessSignature/ISignaturePartsExtractor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ public interface ISignaturePartsExtractor
1818
/// </summary>
1919
/// <exception cref="ArgumentException">Thrown if the provided package is not signed.</exception>
2020
/// <param name="packageKey">The key of the package in the gallery database.</param>
21-
/// <param name="signedPackageReader">The reader of the signed package.</param>
21+
/// <param name="signature">The primary signature of the signed package.</param>
2222
/// <param name="token">The cancellation token.</param>
23-
Task ExtractAsync(int packageKey, ISignedPackageReader signedPackageReader, CancellationToken token);
23+
Task ExtractAsync(int packageKey, PrimarySignature signature, CancellationToken token);
2424
}
2525
}

src/Validation.PackageSigning.ProcessSignature/ISignatureValidator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

4+
using System.IO;
45
using System.Threading;
56
using System.Threading.Tasks;
67
using NuGet.Jobs.Validation.PackageSigning.Messages;
7-
using NuGet.Packaging.Signing;
88

99
namespace NuGet.Jobs.Validation.PackageSigning.ProcessSignature
1010
{
1111
public interface ISignatureValidator
1212
{
1313
Task<SignatureValidatorResult> ValidateAsync(
1414
int packageKey,
15-
ISignedPackage signedPackage,
15+
Stream packageStream,
1616
SignatureValidationMessage message,
1717
CancellationToken cancellationToken);
1818
}

src/Validation.PackageSigning.ProcessSignature/Job.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
using NuGet.Jobs.Validation.PackageSigning.Configuration;
1212
using NuGet.Jobs.Validation.PackageSigning.Messages;
1313
using NuGet.Jobs.Validation.PackageSigning.Storage;
14+
using NuGet.Jobs.Validation.Storage;
1415
using NuGet.Services.ServiceBus;
1516
using NuGet.Services.Storage;
16-
using NuGet.Services.Validation.PackageSigning;
1717
using NuGet.Services.Validation.PackageSigning.ProcessSignature;
1818
using NuGetGallery;
1919

@@ -42,6 +42,11 @@ protected override void ConfigureJobServices(IServiceCollection services, IConfi
4242
return new CertificateStore(storage, LoggerFactory.CreateLogger<CertificateStore>());
4343
});
4444

45+
services.AddTransient<IProcessorPackageFileService, ProcessorPackageFileService>(p => new ProcessorPackageFileService(
46+
p.GetRequiredService<ICoreFileStorageService>(),
47+
typeof(PackageSigningValidator),
48+
p.GetRequiredService<ILogger<ProcessorPackageFileService>>()));
49+
4550
services.AddTransient<IBrokeredMessageSerializer<SignatureValidationMessage>, SignatureValidationMessageSerializer>();
4651
services.AddTransient<IMessageHandler<SignatureValidationMessage>, SignatureValidationMessageHandler>();
4752
services.AddTransient<IPackageSigningStateService, PackageSigningStateService>();
@@ -52,6 +57,7 @@ protected override void ConfigureJobServices(IServiceCollection services, IConfi
5257
PackageSignatureVerifierFactory.CreateMinimal(),
5358
PackageSignatureVerifierFactory.CreateFull(),
5459
p.GetRequiredService<ISignaturePartsExtractor>(),
60+
p.GetRequiredService<IProcessorPackageFileService>(),
5561
p.GetRequiredService<IEntityRepository<Certificate>>(),
5662
p.GetRequiredService<ILogger<SignatureValidator>>()));
5763
}

src/Validation.PackageSigning.ProcessSignature/SignaturePartsExtractor.cs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,8 @@ public SignaturePartsExtractor(
3030
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
3131
}
3232

33-
public async Task ExtractAsync(int packageKey, ISignedPackageReader signedPackageReader, CancellationToken token)
33+
public async Task ExtractAsync(int packageKey, PrimarySignature signature, CancellationToken token)
3434
{
35-
if (!await signedPackageReader.IsSignedAsync(token))
36-
{
37-
throw new ArgumentException("The provided package reader must refer to a signed package.", nameof(signedPackageReader));
38-
}
39-
40-
// Read the package signature.
41-
var signature = await signedPackageReader.GetPrimarySignatureAsync(token);
42-
4335
// Extract the certificates found in the package signatures.
4436
var extractedCertificates = ExtractCertificates(signature);
4537

src/Validation.PackageSigning.ProcessSignature/SignatureValidationMessageHandler.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public async Task<bool> HandleAsync(SignatureValidationMessage message)
6464

6565
private async Task<bool> HandleAsync(SignatureValidationMessage message, CancellationToken cancellationToken)
6666
{
67-
using (_logger.BeginScope("Handling signature validation message for package {PackageId} {PackageVersion}, validation set {ValidationSetId}",
67+
using (_logger.BeginScope("Handling signature validation message for package {PackageId} {PackageVersion}, validation {ValidationId}",
6868
message.PackageId,
6969
message.PackageVersion,
7070
message.ValidationId))
@@ -111,12 +111,10 @@ private async Task<bool> HandleAsync(SignatureValidationMessage message, Cancell
111111

112112
// Validate package
113113
using (var packageStream = await _packageDownloader.DownloadAsync(message.NupkgUri, cancellationToken))
114-
using (var packageWriteStream = new MemoryStream()) // Unused, but to be careful we don't pass the original stream.
115-
using (var package = new SignedPackageArchive(packageStream, packageWriteStream))
116114
{
117115
var result = await _signatureValidator.ValidateAsync(
118116
validation.PackageKey,
119-
package,
117+
packageStream,
120118
message,
121119
cancellationToken);
122120

@@ -136,6 +134,13 @@ private async Task<bool> HandleAsync(SignatureValidationMessage message, Cancell
136134
});
137135
}
138136
}
137+
138+
// Save the .nupkg URL if the resulting state is successful.
139+
if (validation.State == ValidationStatus.Succeeded
140+
&& result.NupkgUri != null)
141+
{
142+
validation.NupkgUrl = result.NupkgUri.AbsoluteUri;
143+
}
139144
}
140145

141146
// The signature validator should do all of the work to bring this validation to its completion.

0 commit comments

Comments
 (0)