Skip to content

Commit 7fa9bd9

Browse files
Snupkgs without symbols will be rejected. (#6968)
Validate that the snupkg contains symbols. Reject if they do not.
1 parent 28aa425 commit 7fa9bd9

4 files changed

Lines changed: 46 additions & 6 deletions

File tree

src/NuGetGallery/Services/SymbolPackageService.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ private static void ValidateSymbolPackage(PackageArchiveReader symbolPackage, Pa
153153
{
154154
throw new InvalidDataException(string.Format(Strings.SymbolsPackage_InvalidFiles, PDBExtension));
155155
}
156+
157+
if (!CheckForPDBFiles(symbolPackage))
158+
{
159+
throw new InvalidDataException(string.Format(Strings.SymbolsPackage_NoSymbols));
160+
}
156161
}
157162

158163
private static bool CheckForAllowedFiles(PackageArchiveReader symbolPackage)
@@ -171,6 +176,17 @@ private static bool CheckForAllowedFiles(PackageArchiveReader symbolPackage)
171176
return true;
172177
}
173178

179+
/// <summary>
180+
/// If there are not any pdb files in the snupkg the publish action will be rejected.
181+
/// </summary>
182+
/// <param name="symbolPackage"></param>
183+
/// <returns></returns>
184+
private static bool CheckForPDBFiles(PackageArchiveReader symbolPackage)
185+
{
186+
return symbolPackage.GetFiles()
187+
.Any(filePath => !string.IsNullOrEmpty(Path.GetFileName(filePath)) && Path.GetExtension(filePath) == PDBExtension);
188+
}
189+
174190
private static bool IsPortable(string pdbFile)
175191
{
176192
byte[] currentPDBStamp = new byte[4];

src/NuGetGallery/Strings.Designer.cs

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/NuGetGallery/Strings.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,4 +1138,7 @@ The {1} Team</value>
11381138
<value>https://cwe.mitre.org/data/definitions/{0}.html</value>
11391139
<comment>{0} is the CWE's ID number (e.g. CWE-999 has an ID number of 999)</comment>
11401140
</data>
1141+
<data name="SymbolsPackage_NoSymbols" xml:space="preserve">
1142+
<value>The package does not contain any symbol (.pdb) files.</value>
1143+
</data>
11411144
</root>

tests/NuGetGallery.Facts/Services/SymbolPackageServiceFacts.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.IO;
77
using System.IO.Compression;
8+
using System.Linq;
89
using System.Threading.Tasks;
910
using Moq;
1011
using NuGet.Services.Entities;
@@ -47,13 +48,12 @@ private static List<ClientPackageType> CreateSymbolPackageTypesObject()
4748
};
4849
}
4950

50-
private static Action<ZipArchive> CreatePopulatePackageAction(string extension)
51+
private static Action<ZipArchive> CreatePopulatePackageAction(params string[] extensions)
5152
{
5253
return archive =>
5354
{
54-
var entryList = new List<ZipArchiveEntry>() {
55-
archive.CreateEntry("file1" + extension)
56-
};
55+
int fileIndex = 0;
56+
var entryList = extensions.Select(extension => archive.CreateEntry($"file{fileIndex++}{extension}"));
5757

5858
foreach (var entry in entryList)
5959
{
@@ -162,13 +162,25 @@ public async Task WillThrowForInvalidFilesInSnupkg(string extension)
162162
public async Task WillNotThrowForValidSnupkgFile(string extension)
163163
{
164164
var service = CreateService();
165-
var action = CreatePopulatePackageAction(extension);
165+
var action = CreatePopulatePackageAction(new string[] { extension, ".pdb" });
166166

167167
var validSymbolPackageStream = TestPackage.CreateTestSymbolPackageStream("theId", "1.0.42", populatePackage: action);
168168
var packageArchiveReader = PackageServiceUtility.CreateArchiveReader(validSymbolPackageStream);
169169

170170
await service.EnsureValidAsync(packageArchiveReader);
171171
}
172+
173+
[Fact]
174+
public async Task WillThrowForSnupkgFileWithoutSymbols()
175+
{
176+
var service = CreateService();
177+
var action = CreatePopulatePackageAction(".p7s");
178+
179+
var validSymbolPackageStream = TestPackage.CreateTestSymbolPackageStream("theId", "1.0.42", populatePackage: action);
180+
var packageArchiveReader = PackageServiceUtility.CreateArchiveReader(validSymbolPackageStream);
181+
182+
await Assert.ThrowsAsync<InvalidDataException>(async () => await service.EnsureValidAsync(packageArchiveReader));
183+
}
172184
}
173185

174186
public class TheCreateSymbolPackageMethod

0 commit comments

Comments
 (0)