Skip to content

Commit deb2fe7

Browse files
authored
Only allowing lowercase 'tags' element in package metadata. (#9022)
1 parent 00c59a9 commit deb2fe7

2 files changed

Lines changed: 56 additions & 3 deletions

File tree

src/NuGetGallery.Core/Packaging/PackageMetadata.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public class PackageMetadata
4040
"serviceable",
4141
};
4242

43+
private const string TagsElement = "tags";
44+
4345
private readonly Dictionary<string, string> _metadata;
4446
private readonly IReadOnlyCollection<PackageDependencyGroup> _dependencyGroups;
4547
private readonly IReadOnlyCollection<FrameworkSpecificGroup> _frameworkReferenceGroups;
@@ -237,9 +239,18 @@ public static PackageMetadata FromNuspecReader(NuspecReader nuspecReader, bool s
237239
}
238240
}
239241

240-
// Reject invalid metadata element names. Today this only rejects element names that collide with
241-
// properties generated downstream.
242-
var metadataKeys = new HashSet<string>(metadataLookup.Select(g => g.Key));
242+
// Reject invalid metadata element names.
243+
var metadataElements = metadataLookup.Select(g => g.Key).ToList();
244+
var unexpectedTagsCasings = metadataElements.Where(element => element.Equals(TagsElement, StringComparison.OrdinalIgnoreCase) && element != TagsElement).ToList();
245+
if (unexpectedTagsCasings.Any())
246+
{
247+
throw new PackagingException(string.Format(
248+
CoreStrings.Manifest_InvalidMetadataElements,
249+
string.Join("', '", unexpectedTagsCasings.OrderBy(x => x))));
250+
}
251+
252+
// This only rejects element names that collide with properties generated downstream.
253+
var metadataKeys = new HashSet<string>(metadataElements);
243254
metadataKeys.IntersectWith(RestrictedMetadataElements);
244255
if (metadataKeys.Any())
245256
{

tests/NuGetGallery.Core.Facts/Packaging/PackageMetadataFacts.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,48 @@ public void DoesNotThrowWhenInvalidDependencyVersionRangeDetectedAndParsingIsNot
338338
Assert.Equal(VersionRange.All, dependency.VersionRange);
339339
}
340340

341+
[Theory]
342+
[InlineData("tagS")]
343+
[InlineData("taGs")]
344+
[InlineData("taGS")]
345+
[InlineData("tAgs")]
346+
[InlineData("tAgS")]
347+
[InlineData("tAGs")]
348+
[InlineData("tAGS")]
349+
[InlineData("Tags")]
350+
[InlineData("TagS")]
351+
[InlineData("TaGs")]
352+
[InlineData("TaGS")]
353+
[InlineData("TAgs")]
354+
[InlineData("TAgS")]
355+
[InlineData("TAGs")]
356+
[InlineData("TAGS")]
357+
public void ThrowsForUppercaseTags(string tags)
358+
{
359+
var packageStream = CreateTestPackageStreamWithMetadataElementName(tags, "foo bar baz");
360+
var nupkg = new PackageArchiveReader(packageStream, leaveStreamOpen: false);
361+
var nuspec = nupkg.GetNuspecReader();
362+
363+
var ex = Assert.Throws<PackagingException>(() => PackageMetadata.FromNuspecReader(
364+
nuspec,
365+
strict: false));
366+
Assert.Equal($"The package manifest contains invalid metadata elements: '{tags}'", ex.Message);
367+
}
368+
369+
[Fact]
370+
public void DoesntThrowForLowercaseTags()
371+
{
372+
var packageStream = CreateTestPackageStreamWithMetadataElementName("tags", "foo bar baz");
373+
var nupkg = new PackageArchiveReader(packageStream, leaveStreamOpen: false);
374+
var nuspec = nupkg.GetNuspecReader();
375+
376+
var ex = Record.Exception(() => PackageMetadata.FromNuspecReader(
377+
nuspec,
378+
strict: false));
379+
380+
Assert.Null(ex);
381+
}
382+
341383
private static Stream CreateTestPackageStream()
342384
{
343385
return CreateTestPackageStream(@"<?xml version=""1.0""?>

0 commit comments

Comments
 (0)