Skip to content

Commit ce589c5

Browse files
authored
Merge pull request #9026 from NuGet/main
[ReleasePrep] FI main to dev Pulling hotfix into the dev branch.
2 parents c8747f8 + deb2fe7 commit ce589c5

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
@@ -372,6 +372,48 @@ public void DoesNotThrowWhenInvalidDependencyVersionRangeDetectedAndParsingIsNot
372372
Assert.Equal(VersionRange.All, dependency.VersionRange);
373373
}
374374

375+
[Theory]
376+
[InlineData("tagS")]
377+
[InlineData("taGs")]
378+
[InlineData("taGS")]
379+
[InlineData("tAgs")]
380+
[InlineData("tAgS")]
381+
[InlineData("tAGs")]
382+
[InlineData("tAGS")]
383+
[InlineData("Tags")]
384+
[InlineData("TagS")]
385+
[InlineData("TaGs")]
386+
[InlineData("TaGS")]
387+
[InlineData("TAgs")]
388+
[InlineData("TAgS")]
389+
[InlineData("TAGs")]
390+
[InlineData("TAGS")]
391+
public void ThrowsForUppercaseTags(string tags)
392+
{
393+
var packageStream = CreateTestPackageStreamWithMetadataElementName(tags, "foo bar baz");
394+
var nupkg = new PackageArchiveReader(packageStream, leaveStreamOpen: false);
395+
var nuspec = nupkg.GetNuspecReader();
396+
397+
var ex = Assert.Throws<PackagingException>(() => PackageMetadata.FromNuspecReader(
398+
nuspec,
399+
strict: false));
400+
Assert.Equal($"The package manifest contains invalid metadata elements: '{tags}'", ex.Message);
401+
}
402+
403+
[Fact]
404+
public void DoesntThrowForLowercaseTags()
405+
{
406+
var packageStream = CreateTestPackageStreamWithMetadataElementName("tags", "foo bar baz");
407+
var nupkg = new PackageArchiveReader(packageStream, leaveStreamOpen: false);
408+
var nuspec = nupkg.GetNuspecReader();
409+
410+
var ex = Record.Exception(() => PackageMetadata.FromNuspecReader(
411+
nuspec,
412+
strict: false));
413+
414+
Assert.Null(ex);
415+
}
416+
375417
private static Stream CreateTestPackageStream()
376418
{
377419
return CreateTestPackageStream(@"<?xml version=""1.0""?>

0 commit comments

Comments
 (0)