1414using System . Xml ;
1515using System . Xml . Linq ;
1616using System . Xml . Xsl ;
17- using Newtonsoft . Json ;
1817using Newtonsoft . Json . Linq ;
19- using NuGet . Services . Metadata . Catalog . Helpers ;
18+ using NuGet . Packaging ;
19+ using NuGet . Versioning ;
20+
2021#if NETFRAMEWORK
2122using JsonLD . Core ;
23+ using Newtonsoft . Json ;
2224using NuGet . Services . Metadata . Catalog . JsonLDIntegration ;
25+ using NuGet . Services . Metadata . Catalog . Helpers ;
2326using VDS . RDF ;
2427using VDS . RDF . Parsing ;
2528#endif
@@ -28,16 +31,16 @@ namespace NuGet.Services.Metadata.Catalog
2831{
2932 public static class Utils
3033 {
34+ #if NETFRAMEWORK
3135 private const string XslTransformNuSpec = "xslt.nuspec.xslt" ;
3236 private const string XslTransformNormalizeNuSpecNamespace = "xslt.normalizeNuspecNamespace.xslt" ;
3337
3438 private static readonly Lazy < XslCompiledTransform > XslTransformNuSpecCache = new Lazy < XslCompiledTransform > ( ( ) => SafeLoadXslTransform ( XslTransformNuSpec ) ) ;
3539 private static readonly Lazy < XslCompiledTransform > XslTransformNormalizeNuSpecNamespaceCache = new Lazy < XslCompiledTransform > ( ( ) => SafeLoadXslTransform ( XslTransformNormalizeNuSpecNamespace ) ) ;
40+ #endif
3641
3742 private static readonly char [ ] TagTrimChars = { ',' , ' ' , '\t ' , '|' , ';' } ;
3843
39- private static readonly char [ ] Slashes = { '/' , '\\ ' } ;
40-
4144 public static string [ ] SplitTags ( string original )
4245 {
4346 var fields = original
@@ -49,6 +52,22 @@ public static string[] SplitTags(string original)
4952 return fields ;
5053 }
5154
55+ public static void AssertValidPackageId ( string packageId )
56+ {
57+ if ( packageId is null || ! PackageIdValidator . IsValidPackageId ( packageId ) )
58+ {
59+ throw new InvalidOperationException ( $ "The package ID { ( packageId is null ? "<null>" : $ "'{ packageId } '") } is not valid.") ;
60+ }
61+ }
62+
63+ public static void AssertValidPackageVersion ( string packageVersion )
64+ {
65+ if ( packageVersion is null || ! NuGetVersion . TryParse ( packageVersion , out _ ) )
66+ {
67+ throw new InvalidOperationException ( $ "The package version { ( packageVersion is null ? "<null>" : $ "'{ packageVersion } '") } is not valid.") ;
68+ }
69+ }
70+
5271 public static Stream GetResourceStream ( string resourceName )
5372 {
5473 if ( string . IsNullOrEmpty ( resourceName ) )
@@ -114,20 +133,10 @@ private static XslCompiledTransform SafeLoadXslTransform(string resourceName)
114133 return transform ;
115134 }
116135
117- public static XDocument GetNuspec ( ZipArchive package )
136+ public static XDocument GetNuspecXDocument ( PackageArchiveReader packageArchiveReader )
118137 {
119- if ( package == null ) { return null ; }
120-
121- foreach ( ZipArchiveEntry part in package . Entries )
122- {
123- if ( part . FullName . EndsWith ( ".nuspec" ) && part . FullName . IndexOfAny ( Slashes ) == - 1 )
124- {
125- XDocument nuspec = XDocument . Load ( part . Open ( ) ) ;
126- return nuspec ;
127- }
128- }
129-
130- return null ;
138+ using var nuspecStream = packageArchiveReader . GetNuspec ( ) ;
139+ return XDocument . Load ( nuspecStream ) ;
131140 }
132141
133142 public static Uri Expand ( JToken context , string term )
@@ -203,14 +212,17 @@ public static NupkgMetadata GetNupkgMetadata(Stream stream, string packageHash)
203212 stream . Seek ( 0 , SeekOrigin . Begin ) ;
204213
205214 using ( var package = new ZipArchive ( stream , ZipArchiveMode . Read , leaveOpen : true ) )
215+ using ( var packageArchiveReader = new PackageArchiveReader ( package ) )
206216 {
207- var nuspec = GetNuspec ( package ) ;
208-
209- if ( nuspec == null )
217+ var identity = packageArchiveReader . GetIdentity ( ) ;
218+ AssertValidPackageId ( identity . Id ) ;
219+ if ( identity . Version is null )
210220 {
211- throw new InvalidDataException ( "Unable to find nuspec ") ;
221+ throw new InvalidOperationException ( "The version from the package identity must not be null. ") ;
212222 }
213223
224+ var nuspec = GetNuspecXDocument ( packageArchiveReader ) ;
225+
214226 var entries = GetEntries ( package ) ;
215227
216228 return new NupkgMetadata ( nuspec , entries , packageSize , packageHash ) ;
0 commit comments