public VerifyPackageRequest(PackageMetadata packageMetadata, IEnumerable <User> possibleOwners) { Id = packageMetadata.Id; Version = packageMetadata.Version.ToFullStringSafe(); OriginalVersion = packageMetadata.Version.OriginalVersion; HasSemVer2Version = packageMetadata.Version.IsSemVer2; HasSemVer2Dependency = packageMetadata.GetDependencyGroups().Any(d => d.Packages.Any( p => (p.VersionRange.HasUpperBound && p.VersionRange.MaxVersion.IsSemVer2) || (p.VersionRange.HasLowerBound && p.VersionRange.MinVersion.IsSemVer2))); // Verifiable fields Language = packageMetadata.Language; MinClientVersionDisplay = packageMetadata.MinClientVersion.ToFullStringSafe(); FrameworkReferenceGroups = packageMetadata.GetFrameworkReferenceGroups(); Dependencies = new DependencySetsViewModel(packageMetadata.GetDependencyGroups().AsPackageDependencyEnumerable()); DevelopmentDependency = packageMetadata.GetValueFromMetadata("developmentDependency"); Authors = packageMetadata.Authors.Flatten(); Copyright = packageMetadata.Copyright; Description = packageMetadata.Description; IconUrl = packageMetadata.IconUrl.ToEncodedUrlStringOrNull(); LicenseUrl = packageMetadata.LicenseUrl.ToEncodedUrlStringOrNull(); ProjectUrl = packageMetadata.ProjectUrl.ToEncodedUrlStringOrNull(); ReleaseNotes = packageMetadata.ReleaseNotes; RequiresLicenseAcceptance = packageMetadata.RequireLicenseAcceptance; Summary = packageMetadata.Summary; Tags = PackageHelper.ParseTags(packageMetadata.Tags); Title = packageMetadata.Title; // Editable server-state Listed = true; Edit = new EditPackageVersionReadMeRequest(); PossibleOwners = possibleOwners.Select(u => u.Username).ToList(); }
public VerifyPackageRequest(PackageMetadata packageMetadata) { var dependencyGroups = packageMetadata.GetDependencyGroups(); Id = packageMetadata.Id; Version = packageMetadata.Version.ToFullStringSafe(); OriginalVersion = packageMetadata.Version.OriginalVersion; HasSemVer2Version = packageMetadata.Version.IsSemVer2; HasSemVer2Dependency = dependencyGroups.Any(d => d.Packages.Any( p => (p.VersionRange.HasUpperBound && p.VersionRange.MaxVersion.IsSemVer2) || (p.VersionRange.HasLowerBound && p.VersionRange.MinVersion.IsSemVer2))); LicenseUrl = packageMetadata.LicenseUrl.ToEncodedUrlStringOrNull(); Listed = true; Language = packageMetadata.Language; MinClientVersionDisplay = packageMetadata.MinClientVersion.ToFullStringSafe(); FrameworkReferenceGroups = packageMetadata.GetFrameworkReferenceGroups(); Dependencies = new DependencySetsViewModel(packageMetadata.GetDependencyGroups().AsPackageDependencyEnumerable()); DevelopmentDependency = packageMetadata.GetValueFromMetadata("developmentDependency"); Edit = new EditPackageVersionRequest(packageMetadata); }
public VerifyPackageRequest(PackageMetadata packageMetadata, IEnumerable <User> possibleOwners, PackageRegistration existingPackageRegistration) { Id = packageMetadata.Id; Version = packageMetadata.Version.ToFullStringSafe(); OriginalVersion = packageMetadata.Version.OriginalVersion; HasSemVer2Version = packageMetadata.Version.IsSemVer2; HasSemVer2Dependency = packageMetadata.GetDependencyGroups().Any(d => d.Packages.Any( p => (p.VersionRange.HasUpperBound && p.VersionRange.MaxVersion.IsSemVer2) || (p.VersionRange.HasLowerBound && p.VersionRange.MinVersion.IsSemVer2))); // Verifiable fields Language = packageMetadata.Language; MinClientVersionDisplay = packageMetadata.MinClientVersion.ToFullStringSafe(); FrameworkReferenceGroups = packageMetadata.GetFrameworkReferenceGroups(); Dependencies = new DependencySetsViewModel(packageMetadata.GetDependencyGroups().AsPackageDependencyEnumerable()); DevelopmentDependency = packageMetadata.DevelopmentDependency; Authors = packageMetadata.Authors.Flatten(); Copyright = packageMetadata.Copyright; Description = packageMetadata.Description; IconUrl = packageMetadata.IconUrl.ToEncodedUrlStringOrNull(); LicenseUrl = packageMetadata.LicenseUrl.ToEncodedUrlStringOrNull(); LicenseExpression = packageMetadata.LicenseMetadata?.Type == LicenseType.Expression ? packageMetadata.LicenseMetadata?.License : null; ProjectUrl = packageMetadata.ProjectUrl.ToEncodedUrlStringOrNull(); RepositoryUrl = packageMetadata.RepositoryUrl.ToEncodedUrlStringOrNull(); RepositoryType = packageMetadata.RepositoryType; ReleaseNotes = packageMetadata.ReleaseNotes; RequiresLicenseAcceptance = packageMetadata.RequireLicenseAcceptance; Summary = packageMetadata.Summary; Tags = PackageHelper.ParseTags(packageMetadata.Tags); Title = packageMetadata.Title; IsNewId = existingPackageRegistration == null; if (!IsNewId) { ExistingOwners = string.Join(", ", ParseUserList(existingPackageRegistration.Owners)); } // Editable server-state Listed = true; Edit = new EditPackageVersionReadMeRequest(); PossibleOwners = ParseUserList(possibleOwners); }
private static void ValidateNuGetPackageMetadata(PackageMetadata packageMetadata) { // TODO: Change this to use DataAnnotations if (packageMetadata.Id.Length > CoreConstants.MaxPackageIdLength) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Id", CoreConstants.MaxPackageIdLength); } if (packageMetadata.Authors != null && packageMetadata.Authors.Flatten().Length > 4000) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Authors", "4000"); } if (packageMetadata.Copyright != null && packageMetadata.Copyright.Length > 4000) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Copyright", "4000"); } if (packageMetadata.Description == null) { throw new EntityException(Strings.NuGetPackagePropertyMissing, "Description"); } else if (packageMetadata.Description != null && packageMetadata.Description.Length > 4000) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Description", "4000"); } if (packageMetadata.IconUrl != null && packageMetadata.IconUrl.AbsoluteUri.Length > 4000) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "IconUrl", "4000"); } if (packageMetadata.LicenseUrl != null && packageMetadata.LicenseUrl.AbsoluteUri.Length > 4000) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "LicenseUrl", "4000"); } if (packageMetadata.ProjectUrl != null && packageMetadata.ProjectUrl.AbsoluteUri.Length > 4000) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "ProjectUrl", "4000"); } if (packageMetadata.Summary != null && packageMetadata.Summary.Length > 4000) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Summary", "4000"); } if (packageMetadata.Tags != null && packageMetadata.Tags.Length > 4000) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Tags", "4000"); } if (packageMetadata.Title != null && packageMetadata.Title.Length > 256) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Title", "256"); } if (packageMetadata.Version != null && packageMetadata.Version.ToFullString().Length > 64) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Version", "64"); } if (packageMetadata.Language != null && packageMetadata.Language.Length > 20) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Language", "20"); } // Validate dependencies if (packageMetadata.GetDependencyGroups() != null) { var packageDependencies = packageMetadata.GetDependencyGroups().ToList(); foreach (var dependency in packageDependencies.SelectMany(s => s.Packages)) { // NuGet.Core compatibility - dependency package id can not be > 128 characters if (dependency.Id != null && dependency.Id.Length > CoreConstants.MaxPackageIdLength) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Dependency.Id", CoreConstants.MaxPackageIdLength); } // NuGet.Core compatibility - dependency versionspec can not be > 256 characters if (dependency.VersionRange != null && dependency.VersionRange.ToString().Length > 256) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Dependency.VersionSpec", "256"); } } // NuGet.Core compatibility - flattened dependencies should be < Int16.MaxValue if (packageDependencies.Flatten().Length > Int16.MaxValue) { throw new EntityException(Strings.NuGetPackagePropertyTooLong, "Dependencies", Int16.MaxValue); } } }
public virtual Package EnrichPackageFromNuGetPackage( Package package, PackageArchiveReader packageArchive, PackageMetadata packageMetadata, PackageStreamMetadata packageStreamMetadata, User user) { // Version must always be the exact string from the nuspec, which OriginalVersion will return to us. // However, we do also store a normalized copy for looking up later. package.Version = packageMetadata.Version.OriginalVersion; package.NormalizedVersion = packageMetadata.Version.ToNormalizedString(); package.Description = packageMetadata.Description; package.ReleaseNotes = packageMetadata.ReleaseNotes; package.HashAlgorithm = packageStreamMetadata.HashAlgorithm; package.Hash = packageStreamMetadata.Hash; package.PackageFileSize = packageStreamMetadata.Size; package.Language = packageMetadata.Language; package.Copyright = packageMetadata.Copyright; package.FlattenedAuthors = packageMetadata.Authors.Flatten(); package.IsPrerelease = packageMetadata.Version.IsPrerelease; package.Listed = true; package.RequiresLicenseAcceptance = packageMetadata.RequireLicenseAcceptance; package.Summary = packageMetadata.Summary; package.Tags = PackageHelper.ParseTags(packageMetadata.Tags); package.Title = packageMetadata.Title; package.User = user; package.IconUrl = packageMetadata.IconUrl.ToEncodedUrlStringOrNull(); package.LicenseUrl = packageMetadata.LicenseUrl.ToEncodedUrlStringOrNull(); package.ProjectUrl = packageMetadata.ProjectUrl.ToEncodedUrlStringOrNull(); package.MinClientVersion = packageMetadata.MinClientVersion.ToStringOrNull(); #pragma warning disable 618 // TODO: remove Package.Authors completely once production services definitely no longer need it foreach (var author in packageMetadata.Authors) { package.Authors.Add(new PackageAuthor { Name = author }); } #pragma warning restore 618 var supportedFrameworks = GetSupportedFrameworks(packageArchive) .ToArray(); if (!supportedFrameworks.Any(fx => fx != null && fx.IsAny)) { var supportedFrameworkNames = supportedFrameworks .Select(fn => fn.ToShortNameOrNull()) .Where(fn => fn != null) .ToArray(); ValidateSupportedFrameworks(supportedFrameworkNames); foreach (var supportedFramework in supportedFrameworkNames) { package.SupportedFrameworks.Add(new PackageFramework { TargetFramework = supportedFramework }); } } package.Dependencies = packageMetadata .GetDependencyGroups() .AsPackageDependencyEnumerable() .ToList(); package.PackageTypes = packageMetadata .GetPackageTypes() .AsPackageTypeEnumerable() .ToList(); package.FlattenedDependencies = package.Dependencies.Flatten(); package.FlattenedPackageTypes = package.PackageTypes.Flatten(); // Identify the SemVerLevelKey using the original package version string and package dependencies package.SemVerLevelKey = SemVerLevelKey.ForPackage(packageMetadata.Version, package.Dependencies); return(package); }
public static void ValidateNuGetPackageMetadata(PackageMetadata packageMetadata) { // TODO: Change this to use DataAnnotations if (packageMetadata.Id.Length > NuGet.Services.Entities.Constants.MaxPackageIdLength) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "ID", NuGet.Services.Entities.Constants.MaxPackageIdLength); } if (packageMetadata.Authors != null && packageMetadata.Authors.Flatten().Length > 4000) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Authors", "4000"); } if (packageMetadata.Copyright != null && packageMetadata.Copyright.Length > 4000) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Copyright", "4000"); } if (packageMetadata.Description == null) { throw new EntityException(ServicesStrings.NuGetPackagePropertyMissing, "Description"); } else if (packageMetadata.Description != null && packageMetadata.Description.Length > 4000) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Description", "4000"); } if (packageMetadata.IconUrl != null && packageMetadata.IconUrl.AbsoluteUri.Length > 4000) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "IconUrl", "4000"); } if (packageMetadata.LicenseUrl != null && packageMetadata.LicenseUrl.AbsoluteUri.Length > 4000) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "LicenseUrl", "4000"); } if (packageMetadata.ProjectUrl != null && packageMetadata.ProjectUrl.AbsoluteUri.Length > 4000) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "ProjectUrl", "4000"); } if (packageMetadata.Summary != null && packageMetadata.Summary.Length > 4000) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Summary", "4000"); } if (packageMetadata.ReleaseNotes != null && packageMetadata.ReleaseNotes.Length > 35000) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "ReleaseNotes", "35000"); } if (packageMetadata.Tags != null && packageMetadata.Tags.Length > 4000) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Tags", "4000"); } if (packageMetadata.Title != null && packageMetadata.Title.Length > 256) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Title", "256"); } if (packageMetadata.Version != null && packageMetadata.Version.ToFullString().Length > 64) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Version", "64"); } if (packageMetadata.Language != null && packageMetadata.Language.Length > 20) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Language", "20"); } if (packageMetadata.Id.Length + (packageMetadata.Version?.ToFullString().Length ?? 0) > 160) { throw new EntityException(ServicesStrings.NuGetPackageIdVersionCombinedTooLong, "160"); } // Validate dependencies if (packageMetadata.GetDependencyGroups() != null) { var packageDependencies = packageMetadata.GetDependencyGroups().ToList(); foreach (var dependency in packageDependencies.SelectMany(s => s.Packages)) { // NuGet.Core compatibility - dependency package id can not be > 128 characters if (dependency.Id != null && dependency.Id.Length > NuGet.Services.Entities.Constants.MaxPackageIdLength) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Dependency.Id", NuGet.Services.Entities.Constants.MaxPackageIdLength); } // NuGet.Core compatibility - dependency versionspec can not be > 256 characters if (dependency.VersionRange != null && dependency.VersionRange.ToString().Length > 256) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Dependency.VersionSpec", "256"); } } // NuGet.Core compatibility - flattened dependencies should be <= Int16.MaxValue if (packageDependencies.Flatten().Length > Int16.MaxValue) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "Dependencies", Int16.MaxValue); } // Verify there are no duplicate dependency groups if (packageDependencies.Select(pd => pd.TargetFramework).Distinct().Count() != packageDependencies.Count) { throw new EntityException(ServicesStrings.NuGetPackageDuplicateDependencyGroup); } } // Validate repository metadata if (packageMetadata.RepositoryType != null && packageMetadata.RepositoryType.Length > 100) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "RepositoryType", "100"); } if (packageMetadata.RepositoryUrl != null && packageMetadata.RepositoryUrl.AbsoluteUri.Length > 4000) { throw new EntityException(ServicesStrings.NuGetPackagePropertyTooLong, "RepositoryUrl", "4000"); } }
private Package CreatePackageFromNuGetPackage(PackageRegistration packageRegistration, PackageArchiveReader nugetPackage, PackageMetadata packageMetadata, PackageStreamMetadata packageStreamMetadata, User user) { var package = packageRegistration.Packages.SingleOrDefault(pv => pv.Version == packageMetadata.Version.ToString()); if (package != null) { throw new EntityException( "A package with identifier '{0}' and version '{1}' already exists.", packageRegistration.Id, package.Version); } package = new Package { // Version must always be the exact string from the nuspec, which ToString will return to us. // However, we do also store a normalized copy for looking up later. Version = packageMetadata.Version.ToString(), NormalizedVersion = packageMetadata.Version.ToNormalizedString(), Description = packageMetadata.Description, ReleaseNotes = packageMetadata.ReleaseNotes, HashAlgorithm = packageStreamMetadata.HashAlgorithm, Hash = packageStreamMetadata.Hash, PackageFileSize = packageStreamMetadata.Size, Language = packageMetadata.Language, Copyright = packageMetadata.Copyright, FlattenedAuthors = packageMetadata.Authors.Flatten(), IsPrerelease = packageMetadata.Version.IsPrerelease, Listed = true, PackageRegistration = packageRegistration, RequiresLicenseAcceptance = packageMetadata.RequireLicenseAcceptance, Summary = packageMetadata.Summary, Tags = PackageHelper.ParseTags(packageMetadata.Tags), Title = packageMetadata.Title, User = user, }; package.IconUrl = packageMetadata.IconUrl.ToEncodedUrlStringOrNull(); package.LicenseUrl = packageMetadata.LicenseUrl.ToEncodedUrlStringOrNull(); package.ProjectUrl = packageMetadata.ProjectUrl.ToEncodedUrlStringOrNull(); package.MinClientVersion = packageMetadata.MinClientVersion.ToStringOrNull(); #pragma warning disable 618 // TODO: remove Package.Authors completely once prodution services definitely no longer need it foreach (var author in packageMetadata.Authors) { package.Authors.Add(new PackageAuthor { Name = author }); } #pragma warning restore 618 var supportedFrameworks = GetSupportedFrameworks(nugetPackage).Select(fn => fn.ToShortNameOrNull()).ToArray(); if (!supportedFrameworks.AnySafe(sf => sf == null)) { ValidateSupportedFrameworks(supportedFrameworks); foreach (var supportedFramework in supportedFrameworks) { package.SupportedFrameworks.Add(new PackageFramework { TargetFramework = supportedFramework }); } } package.Dependencies = packageMetadata .GetDependencyGroups() .AsPackageDependencyEnumerable() .ToList(); package.FlattenedDependencies = package.Dependencies.Flatten(); return(package); }