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

Commit b5bc84d

Browse files
authored
Merge pull request #475 from NuGet/dev
[ReleasePrep][2018.07.06] RI of dev into master
2 parents cd94ff8 + b0a380b commit b5bc84d

11 files changed

Lines changed: 532 additions & 51 deletions

File tree

src/NuGet.Services.Validation.Orchestrator/Job.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public class Job : JobBase
6666
private const string PackageSignatureBindingKey = PackageSigningSectionName;
6767
private const string PackageCertificatesBindingKey = PackageCertificatesSectionName;
6868
private const string ScanAndSignBindingKey = ScanAndSignSectionName;
69+
private const string ScanBindingKey = "Scan";
6970
private const string ValidationStorageBindingKey = "ValidationStorage";
7071
private const string OrchestratorBindingKey = "Orchestrator";
7172

@@ -362,6 +363,7 @@ private static IServiceProvider CreateProvider(IServiceCollection services)
362363
ConfigurePackageSigningValidators(containerBuilder);
363364
ConfigurePackageCertificatesValidator(containerBuilder);
364365
ConfigureScanAndSignProcessor(containerBuilder);
366+
ConfigureScanValidator(containerBuilder);
365367

366368
return new AutofacServiceProvider(containerBuilder.Build());
367369
}
@@ -468,6 +470,21 @@ private static void ConfigureScanAndSignProcessor(ContainerBuilder builder)
468470
.AsSelf();
469471
}
470472

473+
private static void ConfigureScanValidator(ContainerBuilder builder)
474+
{
475+
builder
476+
.RegisterType<ValidatorStateService>()
477+
.WithParameter(
478+
(pi, ctx) => pi.ParameterType == typeof(string),
479+
(pi, ctx) => ValidatorName.ScanOnly)
480+
.Keyed<IValidatorStateService>(ScanBindingKey);
481+
482+
builder
483+
.RegisterType<ScanValidator>()
484+
.WithKeyedParameter(typeof(IValidatorStateService), ScanBindingKey)
485+
.AsSelf();
486+
}
487+
471488
private T GetRequiredService<T>()
472489
{
473490
return _serviceProvider.GetRequiredService<T>();

src/NuGet.Services.Validation.Orchestrator/NuGet.Services.Validation.Orchestrator.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<Compile Include="DiskMailSender.cs" />
5252
<Compile Include="Configuration\EmailConfiguration.cs" />
5353
<Compile Include="Error.cs" />
54+
<Compile Include="PackageSigning\Scan\ScanValidator.cs" />
5455
<Compile Include="Services\IEntityService.cs" />
5556
<Compile Include="IMessageService.cs" />
5657
<Compile Include="IPackageStatusProcessor.cs" />
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Threading.Tasks;
6+
using Microsoft.Extensions.Logging;
7+
using Microsoft.Extensions.Options;
8+
using NuGet.Jobs.Validation;
9+
using NuGet.Jobs.Validation.PackageSigning.Storage;
10+
using NuGet.Jobs.Validation.Storage;
11+
using NuGet.Jobs.Validation.ScanAndSign;
12+
using NuGet.Services.Validation.Vcs;
13+
using NuGetGallery;
14+
15+
namespace NuGet.Services.Validation.Orchestrator.PackageSigning.ScanAndSign
16+
{
17+
[ValidatorName(ValidatorName.ScanOnly)]
18+
public class ScanValidator : BaseValidator, IValidator
19+
{
20+
private readonly IValidationEntitiesContext _validationContext;
21+
private readonly IValidatorStateService _validatorStateService;
22+
private readonly ICorePackageService _packageService;
23+
private readonly ICriteriaEvaluator<Package> _criteriaEvaluator;
24+
private readonly IScanAndSignEnqueuer _scanAndSignEnqueuer;
25+
private readonly ScanAndSignConfiguration _configuration;
26+
private readonly ILogger<ScanAndSignProcessor> _logger;
27+
28+
public ScanValidator(
29+
IValidationEntitiesContext validationContext,
30+
IValidatorStateService validatorStateService,
31+
ICorePackageService packageService,
32+
ICriteriaEvaluator<Package> criteriaEvaluator,
33+
IScanAndSignEnqueuer scanAndSignEnqueuer,
34+
IOptionsSnapshot<ScanAndSignConfiguration> configurationAccessor,
35+
ILogger<ScanAndSignProcessor> logger)
36+
{
37+
_validationContext = validationContext ?? throw new ArgumentNullException(nameof(validationContext));
38+
_validatorStateService = validatorStateService ?? throw new ArgumentNullException(nameof(validatorStateService));
39+
_packageService = packageService ?? throw new ArgumentNullException(nameof(packageService));
40+
_criteriaEvaluator = criteriaEvaluator ?? throw new ArgumentNullException(nameof(criteriaEvaluator));
41+
_scanAndSignEnqueuer = scanAndSignEnqueuer ?? throw new ArgumentNullException(nameof(scanAndSignEnqueuer));
42+
43+
if (configurationAccessor == null)
44+
{
45+
throw new ArgumentNullException(nameof(configurationAccessor));
46+
}
47+
if (configurationAccessor.Value == null)
48+
{
49+
throw new ArgumentException($"{nameof(configurationAccessor.Value)} property is null", nameof(configurationAccessor));
50+
}
51+
_configuration = configurationAccessor.Value;
52+
53+
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
54+
55+
configurationAccessor = configurationAccessor ?? throw new ArgumentNullException(nameof(configurationAccessor));
56+
57+
if (configurationAccessor.Value == null)
58+
{
59+
throw new ArgumentException($"{nameof(configurationAccessor.Value)} property is null", nameof(configurationAccessor));
60+
}
61+
62+
_configuration = configurationAccessor.Value;
63+
}
64+
65+
public async Task<IValidationResult> GetResultAsync(IValidationRequest request)
66+
{
67+
if (request == null)
68+
{
69+
throw new ArgumentNullException(nameof(request));
70+
}
71+
72+
var validatorStatus = await _validatorStateService.GetStatusAsync(request);
73+
74+
return validatorStatus.ToValidationResult();
75+
}
76+
77+
public async Task<IValidationResult> StartAsync(IValidationRequest request)
78+
{
79+
if (request == null)
80+
{
81+
throw new ArgumentNullException(nameof(request));
82+
}
83+
84+
var validatorStatus = await _validatorStateService.GetStatusAsync(request);
85+
86+
if (validatorStatus.State != ValidationStatus.NotStarted)
87+
{
88+
_logger.LogWarning(
89+
"Scan only validation with validation Id {ValidationId} ({PackageId} {PackageVersion}) has already started.",
90+
request.ValidationId,
91+
request.PackageId,
92+
request.PackageVersion);
93+
94+
return validatorStatus.ToValidationResult();
95+
}
96+
97+
if (ShouldSkipScan(request))
98+
{
99+
return ValidationResult.Succeeded;
100+
}
101+
102+
await _scanAndSignEnqueuer.EnqueueScanAsync(request.ValidationId, request.NupkgUrl);
103+
104+
var result = await _validatorStateService.TryAddValidatorStatusAsync(request, validatorStatus, ValidationStatus.Incomplete);
105+
106+
return result.ToValidationResult();
107+
}
108+
109+
private bool ShouldSkipScan(IValidationRequest request)
110+
{
111+
var package = _packageService.FindPackageByIdAndVersionStrict(
112+
request.PackageId,
113+
request.PackageVersion);
114+
115+
if (!_criteriaEvaluator.IsMatch(_configuration.PackageCriteria, package))
116+
{
117+
_logger.LogInformation(
118+
"The scan for {ValidationId} ({PackageId} {PackageVersion}) was skipped due to package criteria configuration.",
119+
request.ValidationId,
120+
request.PackageId,
121+
request.PackageVersion);
122+
123+
return true;
124+
}
125+
126+
return false;
127+
}
128+
}
129+
}

src/NuGet.Services.Validation.Orchestrator/PackageSigning/ScanAndSign/ScanAndSignProcessor.cs

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,17 @@ public async Task CleanUpAsync(IValidationRequest request)
7979
return;
8080
}
8181

82+
if (!_configuration.RepositorySigningEnabled)
83+
{
84+
_logger.LogWarning(
85+
"Skipping cleanup of .nupkg for validation ID {ValidationId} ({PackageId} {PackageVersion})",
86+
request.ValidationId,
87+
request.PackageId,
88+
request.PackageVersion);
89+
90+
return;
91+
}
92+
8293
_logger.LogInformation(
8394
"Cleaning up the .nupkg URL for validation ID {ValidationId} ({PackageId} {PackageVersion}).",
8495
request.ValidationId,
@@ -96,9 +107,9 @@ public async Task<IValidationResult> GetResultAsync(IValidationRequest request)
96107
throw new ArgumentNullException(nameof(request));
97108
}
98109

99-
var validatorStatus = await _validatorStateService.GetStatusAsync(request);
110+
var result = await GetProcessorStatusAsync(request);
100111

101-
return validatorStatus.ToValidationResult();
112+
return result.ToValidationResult();
102113
}
103114

104115
public async Task<IValidationResult> StartAsync(IValidationRequest request)
@@ -108,17 +119,17 @@ public async Task<IValidationResult> StartAsync(IValidationRequest request)
108119
throw new ArgumentNullException(nameof(request));
109120
}
110121

111-
var validatorStatus = await _validatorStateService.GetStatusAsync(request);
122+
var processorStatus = await GetProcessorStatusAsync(request);
112123

113-
if (validatorStatus.State != ValidationStatus.NotStarted)
124+
if (processorStatus.State != ValidationStatus.NotStarted)
114125
{
115126
_logger.LogWarning(
116127
"Scan and Sign validation with validation Id {ValidationId} ({PackageId} {PackageVersion}) has already started.",
117128
request.ValidationId,
118129
request.PackageId,
119130
request.PackageVersion);
120131

121-
return validatorStatus.ToValidationResult();
132+
return processorStatus.ToValidationResult();
122133
}
123134

124135
if (await ShouldRepositorySignAsync(request))
@@ -144,11 +155,29 @@ public async Task<IValidationResult> StartAsync(IValidationRequest request)
144155
await _scanAndSignEnqueuer.EnqueueScanAsync(request.ValidationId, request.NupkgUrl);
145156
}
146157

147-
var result = await _validatorStateService.TryAddValidatorStatusAsync(request, validatorStatus, ValidationStatus.Incomplete);
158+
var result = await _validatorStateService.TryAddValidatorStatusAsync(request, processorStatus, ValidationStatus.Incomplete);
148159

149160
return result.ToValidationResult();
150161
}
151162

163+
private async Task<ValidatorStatus> GetProcessorStatusAsync(IValidationRequest request)
164+
{
165+
var validatorStatus = await _validatorStateService.GetStatusAsync(request);
166+
167+
if (!_configuration.RepositorySigningEnabled && validatorStatus.NupkgUrl != null)
168+
{
169+
_logger.LogWarning(
170+
"Suppressing .nupkg url as repository signing is disabled for {ValidationId} ({PackageId} {PackageVersion})",
171+
request.ValidationId,
172+
request.PackageId,
173+
request.PackageVersion);
174+
175+
validatorStatus.NupkgUrl = null;
176+
}
177+
178+
return validatorStatus;
179+
}
180+
152181
private bool ShouldSkipScan(IValidationRequest request)
153182
{
154183
var package = _packageService.FindPackageByIdAndVersionStrict(
@@ -171,13 +200,6 @@ private bool ShouldSkipScan(IValidationRequest request)
171200

172201
private async Task<bool> ShouldRepositorySignAsync(IValidationRequest request)
173202
{
174-
if (!_configuration.RepositorySigningEnabled)
175-
{
176-
_logger.LogInformation("Repository signing is disabed. Scanning instead of signing package");
177-
178-
return false;
179-
}
180-
181203
var hasRepositorySignature = await _validationContext
182204
.PackageSignatures
183205
.Where(s => s.PackageKey == request.PackageKey)

src/Validation.Common.Job/Validation/ValidatorName.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public static class ValidatorName
88
public const string Vcs = "VcsValidator";
99
public const string PackageCertificate = "PackageCertificatesValidator";
1010
public const string ScanAndSign = "ScanAndSign";
11+
public const string ScanOnly = "ScanOnly";
1112
public const string PackageSignatureProcessor = "PackageSigningValidator";
1213
public const string PackageSignatureValidator = "PackageSigningValidator2";
1314
}

src/Validation.PackageSigning.ProcessSignature/Settings/dev.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
},
2020
"ProcessSignature": {
2121
"AllowedRepositorySigningCertificates": [
22-
"0e5f38f57dc1bcc806d8494f4f90fbcedd988b46760709cbeec6f4219aa6157d"
22+
"cf6ce6768ef858a3a667be1af8aa524d386c7f59a34542713f5dfb0d79acf3dd"
2323
],
2424
"V3ServiceIndexUrl": "https://apidev.nugettest.org/v3/index.json"
2525
},

src/Validation.PackageSigning.ProcessSignature/Settings/int.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
"ConnectionString": "DefaultEndpointsProtocol=https;AccountName=nugetint0;AccountKey=$$Int-NuGetInt0Storage-Key$$"
1919
},
2020
"ProcessSignature": {
21-
"AllowedRepositorySigningCertificates": [],
21+
"AllowedRepositorySigningCertificates": [
22+
"cf6ce6768ef858a3a667be1af8aa524d386c7f59a34542713f5dfb0d79acf3dd"
23+
],
2224
"V3ServiceIndexUrl": "https://apiint.nugettest.org/v3/index.json"
2325
},
2426

tests/Validation.PackageSigning.ProcessSignature.Tests/SignatureValidatorIntegrationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ public async Task AcceptsValidSignedPackage()
210210
Assert.Empty(result.Issues);
211211
}
212212

213-
[Fact]
213+
[Fact(Skip = "Flaky")]
214214
public async Task RejectsUntrustedSigningCertificate()
215215
{
216216
// Arrange

0 commit comments

Comments
 (0)