Пример #1
0
        public static bool IsMatchRegistrationsBaseUrl(
            this INugetServerProvider provider,
            HttpContext context)
        {
            if (!provider.IsMatchVerbs(context,
                                       HttpMethods.IsHead,
                                       HttpMethods.IsGet))
            {
                return(false);
            }
            return(provider.IsMatchResources(
                       context,
                       NugetServerResourceType.RegistrationsBaseUrl,
                       NugetServerResourceType.RegistrationsBaseUrl_3_0_0_beta,
                       NugetServerResourceType.RegistrationsBaseUrl_3_0_0_rc

                       /*
                        * Gzip does NOT work.
                        */
                       //,
                       //NugetServerResourceType.RegistrationsBaseUrl_3_4_0,
                       //NugetServerResourceType.RegistrationsBaseUrl_3_6_0
                       ) &&
                   provider.IsMatchExtensionName(context, ".json"));
        }
Пример #2
0
 GetRequstingPackageBaseAddressModel(
     this INugetServerProvider provider,
     HttpContext context)
 => new PackageBaseAddressInputModel(
     context.GetBaseUrl(), context.Request.Path,
     provider.GetResourceUrlPath(
         NugetServerResourceType.PackageBaseAddress));
Пример #3
0
        ParseResource(this INugetServerProvider provider,
                      HttpContext context)
        {
            var resources = provider
                            ?.NugetServerOptions
                            ?.Resources
                            ?.Select(r => r.Key);

            if (resources == null)
            {
                yield break;
            }

            var baseUrl = context.GetBaseUrl();

            foreach (var resource in resources)
            {
                var model = new ServerIndexResourceModel
                {
                    Type = resource.GetText(),
                    Id   = baseUrl + provider
                           .GetResourceUrlPath(resource)
                };;
                yield return(model);
            }
        }
Пример #4
0
        public static async Task RespondPackagePublishAsync(
            this INugetServerProvider provider,
            HttpContext context)
        {
            var req = provider.GetRequestingModel(context);

            if (!req.IsValid())
            {
                provider.RespondNotFound(context);
                return;
            }
            if (!provider.IsValidApiKey(req))
            {
                provider.RespondNotFound(context);
                return;
            }
            if (req.IsPush())
            {
                await provider
                .RespondPutPackageAsync(context, req);

                return;
            }
            if (req.IsDelete())
            {
                await provider
                .RespondDeletePackageAsync(context, req);

                return;
            }
            provider.RespondNotFound(context);
        }
Пример #5
0
        RedirectToCurrentApiVersion(
            this INugetServerProvider provider,
            HttpContext context,
            bool permanent = true)
        {
            var currentVersion = provider.GetApiMajorVersionUrl();
            var paths          = context.Request.Path
                                 .ToString()
                                 .Split(new[] { '/' },
                                        StringSplitOptions.RemoveEmptyEntries);
            string newPath = currentVersion;

            if (paths.Length > 0)
            {
                var otherPaths = paths.Skip(1);
                if (otherPaths.Any())
                {
                    newPath = newPath + "/" + string.Join("/", otherPaths);
                }
            }
            if (context.Request.QueryString.HasValue)
            {
                newPath += context.Request.QueryString.Value;
            }
            context.Response.Redirect(newPath, permanent);
        }
Пример #6
0
        public static async Task RespondPackageBaseAddressAsync(
            this INugetServerProvider provider,
            HttpContext context)
        {
            var req = provider
                      .GetRequstingPackageBaseAddressModel(
                context);

            if (!req.IsValid())
            {
                provider.RespondNotFound(context);
                return;
            }
            if (req.IsRequestingVersions())
            {
                await provider.RespondVersionsAsync(context, req);

                return;
            }
            if (req.IsRequestingNuspec())
            {
                await provider.RespondNuspecAsync(context, req);

                return;
            }
            if (req.IsRequestingNupkg())
            {
                await provider.RespondNupkgAsync(context, req);

                return;
            }

            provider.RespondNotFound(context);
        }
Пример #7
0
 GetRequestingModel(
     this INugetServerProvider provider,
     HttpContext context)
 => new PackageInputModel(
     context.Request.Method,
     context.Request.GetTypedHeaders(),
     context.Request.Path);
Пример #8
0
 public static Task RespondPackagePublishV2CompatibleAsync(
     this INugetServerProvider provider,
     HttpContext context)
 {
     provider.RedirectToCurrentApiVersion(context);
     return(Task.CompletedTask);
 }
Пример #9
0
        RespondDeletePackageAsync(
            this INugetServerProvider provider,
            HttpContext context,
            PackageInputModel request)
        {
            var packages =
                provider
                .NuspecProvider
                .GetAll()
                .Where(n => n.Metadata != null)
                .Where(n => string.Equals(
                           n.Metadata.Id, request.Id,
                           StringComparison
                           .InvariantCultureIgnoreCase))
                .Where(n =>
                       (NuGetVersionString)n.Metadata.Version
                       == request.Version)
                .ToList();

            if (packages.Count < 1)
            {
                provider.RespondNotFound(context);
                return;
            }

            foreach (var package in packages)
            {
                await provider.NupkgProvider
                .DeleteAsync(package,
                             context.RequestAborted);
            }
        }
Пример #10
0
        CreateJsonSerializerForServiceIndex(
            this INugetServerProvider provider)
        {
            var serializer = provider.CreateJsonSerializer();

            serializer.ContractResolver
                = new ServerIndexContractResolver();
            return(serializer);
        }
Пример #11
0
        private static RegistrationInputModel GetRequestingMetadata(
            this INugetServerProvider provider,
            HttpContext context)
        {
            var model = new RegistrationInputModel(
                context.GetBaseUrl(),
                context.Request.Path);

            return(model);
        }
Пример #12
0
        public static async Task RespondRegistrationsBaseUrlAsync(
            this INugetServerProvider provider,
            HttpContext context)
        {
            var excludeSemVer2Package = true;
            var useGzip = false;

            /*
             * Gzip does NOT work.
             */
            //if (provider.IsMatchResource(context,
            //    NugetServerResourceType.RegistrationsBaseUrl_3_6_0))
            //{
            //    useGzip = true;
            //    excludeSemVer2Package = false;
            //}
            //if (provider.IsMatchResource(context,
            //    NugetServerResourceType.RegistrationsBaseUrl_3_4_0))
            //{
            //    useGzip = true;
            //}
            var req = provider.GetRequestingMetadata(context);

            if (!req.IsValid())
            {
                provider.RespondNotFound(context);
                return;
            }
            var nuspecs = provider.NuspecProvider.GetAll()
                          .Where(nuspec => nuspec.Metadata != null)
                          .Where(n => n.Metadata.Id.ToLowerInvariant()
                                 == req.Id)
                          .Where(n => excludeSemVer2Package == false ||
                                 !((NuGetVersionString)n.Metadata.Version).IsSemVer2);

            if (!nuspecs.Any())
            {
                provider.RespondNotFound(context);
                return;
            }
            if (req.IsRequestingIndex())
            {
                await provider.RespondRegistrationIndexAsync(
                    context, req, nuspecs,
                    useGzip : useGzip);

                return;
            }
            if (req.IsRequestingPage())
            {
                //Do some stuff...
                return;
            }
            provider.RespondNotFound(context);
        }
Пример #13
0
        private static PathString GetServiceIndexUrlPath(
            this INugetServerProvider provider)
        {
            var majorVersion = provider
                               .GetApiMajorVersionUrl();

            var path = provider
                       ?.NugetServerOptions
                       ?.ServiceIndex
                       ?? throw new InvalidOperationException(
                                 "Nuget server index not specified.");

            return(majorVersion + path);
        }
Пример #14
0
        private static async Task RespondNuspecAsync(
            this INugetServerProvider provider,
            HttpContext context,
            PackageBaseAddressInputModel request)
        {
            var nuspec = provider.NuspecProvider
                         .GetAll()
                         .Where(n => n.Metadata != null)
                         .Where(n => n.Metadata.Id.ToLowerInvariant() == request.Id)
                         .FirstOrDefault(n => n.Metadata.Version == request.Version);
            var nuspecRaw = await Zip.ReadNuspecRawAsync(nuspec);

            await provider.WriteRawResponseAsync(
                context, "application/xml; charset=utf8", nuspecRaw);
        }
Пример #15
0
        public static bool IsMatchServerIndex(
            this INugetServerProvider provider,
            HttpContext context)
        {
            if (!provider.IsMatchVerbs(context,
                                       HttpMethods.IsHead,
                                       HttpMethods.IsGet))
            {
                return(false);
            }

            return(provider.IsMatchPath(context,
                                        provider.GetServiceIndexUrlPath()) &&
                   provider
                   .IsMatchExtensionName(context, ".json"));
        }
Пример #16
0
        public static bool IsMatchPackagePublishV2Compatible(
            this INugetServerProvider provider,
            HttpContext context)
        {
            if (!provider.IsMatchVerbs(context,
                                       HttpMethods.IsPut,
                                       HttpMethods.IsDelete))
            {
                return(false);
            }

            return(provider.IsMatchResourceIgnoreApiVersion(
                       context,
                       NugetServerResourceType.PackagePublish
                       ));
        }
Пример #17
0
 private static async Task RespondVersionsAsync(
     this INugetServerProvider provider,
     HttpContext context,
     PackageBaseAddressInputModel request)
 {
     var model = new PackageBaseAddressVersionsOutputModel
     {
         Versions = provider.NuspecProvider
                    .GetAll()
                    .Where(n => n.Metadata != null)
                    .Where(n => n.Metadata.Id.ToLowerInvariant() == request.Id)
                    .Select(n => n.Metadata.Version)
                    .OrderBy(x => (NuGetVersionString)x)
                    .ToList()
     };
     await provider.WriteJsonResponseAsync(context, model);
 }
Пример #18
0
        public static bool IsMatchPackageBaseAddress(
            this INugetServerProvider provider,
            HttpContext context
            )
        {
            if (!provider.IsMatchVerbs(context,
                                       HttpMethods.IsHead,
                                       HttpMethods.IsGet))
            {
                return(false);
            }

            return(provider.IsMatchResource(
                       context,
                       NugetServerResourceType.PackageBaseAddress
                       ));
        }
Пример #19
0
        public static JsonSerializer CreateJsonSerializer(
            this INugetServerProvider provider)
        {
            return(new JsonSerializer
            {
                NullValueHandling
                    = NullValueHandling.Ignore,
                Formatting =
#if DEBUG
                    Formatting.Indented,
#else
                    provider
                    .MvcJsonOptions
                    .SerializerSettings.Formatting,
#endif
                ContractResolver
                    = new CamelCasePropertyNamesContractResolver()
            });
Пример #20
0
 public static async Task RespondServerIndexAsync(
     this INugetServerProvider provider,
     HttpContext context)
 {
     var serverIndex = new ServerIndexModel(
         provider.ParseResource(context))
     {
         Version = provider
                   .NugetServerOptions
                   .ApiVersion
                   .ToFullString(),
         Context = ServerIndexContext.Default
     };
     await provider
     .WriteJsonResponseAsync(
         context, serverIndex, provider
         .CreateJsonSerializerForServiceIndex());
 }
Пример #21
0
        public static bool IsMatchSearchQueryService(
            this INugetServerProvider provider,
            HttpContext context)
        {
            if (!provider.IsMatchVerbs(context,
                                       HttpMethods.IsHead,
                                       HttpMethods.IsGet))
            {
                return(false);
            }

            return(provider.IsMatchResources(
                       context,
                       NugetServerResourceType
                       .SearchQueryService,
                       NugetServerResourceType
                       .SearchQueryService_3_0_0_beta,
                       NugetServerResourceType
                       .SearchQueryService_3_0_0_rc
                       ));
        }
Пример #22
0
        private static async Task RespondNupkgAsync(
            this INugetServerProvider provider,
            HttpContext context,
            PackageBaseAddressInputModel request)
        {
            var nupkg = provider.NuspecProvider
                        .GetAll()
                        .Where(n => n.Metadata != null)
                        .Where(n => n.Metadata.Id.ToLowerInvariant() == request.Id)
                        .Where(n => n.Metadata.Version == request.Version)
                        .FirstOrDefault()
            ;

            if (nupkg == null)
            {
                provider.RespondNotFound(context);
                return;
            }

            var fileInfo = new PhysicalFileInfo(
                new FileInfo(nupkg.FilePath));
            await context.Response.SendFileAsync(
                fileInfo, context.RequestAborted);
        }
Пример #23
0
        RespondPutPackageAsync(
            this INugetServerProvider provider,
            HttpContext context,
            PackageInputModel request)
        {
            if (!context.Request.HasFormContentType)
            {
                provider.RespondWithStatusCode(
                    context, HttpStatusCode.BadRequest);
                return;
            }


            try
            {
                var form = await context.Request.ReadFormAsync(context.RequestAborted);

                var formFile = form?.Files?.FirstOrDefault();
                if (formFile == null)
                {
                    provider.RespondWithStatusCode(
                        context, HttpStatusCode.BadRequest);
                    return;
                }

                using (var formFileStream = formFile.OpenReadStream())
                    using (var inputStream = new MemoryStream())
                    {
                        await formFileStream
                        .CopyToAsync(inputStream);

                        inputStream.Seek(0, SeekOrigin.Begin);

                        var nuspec = await
                                     Zip.ReadNuspecFromPackageAsync(
                            inputStream);

                        if (nuspec?.Metadata == null)
                        {
                            provider.RespondWithStatusCode(
                                context, HttpStatusCode.BadRequest);
                            return;
                        }
                        var packages =
                            provider
                            .NuspecProvider
                            .GetAll()
                            .Where(n => n.Metadata != null)
                            .Where(n => string.Equals(
                                       n.Metadata.Id, nuspec.Metadata.Id,
                                       StringComparison
                                       .InvariantCultureIgnoreCase))
                            .Where(n =>
                                   (NuGetVersionString)n.Metadata.Version
                                   == nuspec.Metadata.Version)
                            .ToList();
                        if (packages.Count != 0)
                        {
                            provider.RespondWithStatusCode(
                                context, HttpStatusCode.Conflict);
                            return;
                        }

                        inputStream.Seek(0, SeekOrigin.Begin);
                        var isAdded = await provider.NupkgProvider.AddAsync(
                            nuspec.Metadata,
                            inputStream, context.RequestAborted);

                        if (isAdded)
                        {
                            provider.RespondWithStatusCode(
                                context, HttpStatusCode.Created);
                            return;
                        }
                    }
            }
            catch
            {
            }

            provider.RespondWithStatusCode(
                context,
                HttpStatusCode.InternalServerError);
        }
Пример #24
0
 public NugetServerPackageBaseAddressMiddleware(
     INugetServerProvider nugetServerProvider)
 {
     this._nugetServerProvider = nugetServerProvider;
 }
Пример #25
0
 public NugetServerIndexMiddleware(
     INugetServerProvider nugetServerProvider)
 {
     this._nugetServerProvider = nugetServerProvider;
 }
Пример #26
0
 public NugetServerSearchQueryServiceMiddleware(
     INugetServerProvider nugetServerProvider)
 {
     this._nugetServerProvider = nugetServerProvider;
 }
Пример #27
0
 public RegistrationsBaseUrlMiddleware(
     INugetServerProvider nugetServerProvider)
 {
     this._nugetServerProvider = nugetServerProvider;
 }
Пример #28
0
 public NugetServerPackagePublishMiddleware(
     INugetServerProvider nugetServerProvider)
 {
     this._nugetServerProvider = nugetServerProvider;
 }
Пример #29
0
        private static async Task RespondRegistrationIndexAsync(
            this INugetServerProvider provider,
            HttpContext context,
            RegistrationInputModel registrationInput,
            IEnumerable <Nuspec> nuspecs,
            bool useGzip = false)
        {
            var nuspecList = nuspecs
                             .Select(x => new { Nuspec = x, Version = (NuGetVersionString)x.Metadata.Version })
                             .OrderBy(x => x.Version)
                             .Select(x => x.Nuspec)
                             .ToList();

            var lowest             = nuspecList.First().Metadata;
            var uppest             = nuspecList.Last().Metadata;
            var parent             = registrationInput.BaseUrl + registrationInput.Path;
            var lowestVersion      = SemanticVersion.Parse(lowest.Version).ToFullString();
            var uppestVersion      = SemanticVersion.Parse(uppest.Version).ToFullString();
            var packageContentBase = registrationInput.BaseUrl +
                                     provider.GetResourceUrlPath(NugetServerResourceType.PackageBaseAddress);
            var model = new RegistrationIndexOutputModel
            {
                Count = nuspecList.Count
            };

            foreach (var nuspec in nuspecList)
            {
                var publishTime = new DateTimeOffset(new FileInfo(nuspec.FilePath).LastWriteTimeUtc);
                var metadata    = nuspec.Metadata;
                var modelItem   = new RegistrationPageOutputModel()
                {
                    Id    = $"{registrationInput.BaseUrl}{registrationInput.Path}#page/{metadata.Version}/{metadata.Version}",
                    Count = nuspecList.Count,
                    Lower = lowestVersion,
                    Upper = uppestVersion,
                };
                // If present Items, MUST also present Parent,Id need NOT be used.
                modelItem.Parent = parent;
                modelItem.Items  = new List <RegistrationLeafOutputModel>()
                {
                    new RegistrationLeafOutputModel
                    {
                        Id = registrationInput.BaseUrl +
                             registrationInput.PathBase +
                             $"/{metadata.Version}.json",
                        PackageContent = packageContentBase +
                                         $"/{metadata.Id.ToLowerInvariant()}" +
                                         $"/{metadata.Version.ToLowerInvariant()}" +
                                         $"/{metadata.Id.ToLowerInvariant()}" +
                                         $".{metadata.Version.ToLowerInvariant()}.nupkg",
                        Registration = registrationInput.BaseUrl +
                                       registrationInput.Path,
                        CatalogEntry = new RegistrationCatalogEntryOutputModel
                        {
                            Id_alias = registrationInput.BaseUrl +
                                       registrationInput.PathBase +
                                       $"/{metadata.Version}.json",
                            Id          = metadata.Id,
                            Authors     = metadata.Authors,
                            Description = metadata.Description,
                            ProjectUrl  = metadata.ProjectUrl,
                            IconUrl     = metadata.IconUrl,
                            Summary     = metadata.ReleaseNotes ?? metadata.Description,
                            Tags        = metadata.Tags?.Split(
                                new[] { ',' },
                                StringSplitOptions.RemoveEmptyEntries)
                                          ?.ToList() ?? new List <string>(0),
                            Title      = metadata.Id,
                            Version    = metadata.Version,
                            LicenseUrl = metadata.LicenseUrl,
                            Listed     = !provider.PackageStatusProvider.IsDeleted(metadata.Id, metadata.Version),
                            RequireLicenseAcceptance = metadata.RequireLicenseAcceptance,
                            PackageContent           = packageContentBase +
                                                       $"/{metadata.Id.ToLowerInvariant()}" +
                                                       $"/{metadata.Version.ToLowerInvariant()}" +
                                                       $"/{metadata.Id.ToLowerInvariant()}" +
                                                       $".{metadata.Version.ToLowerInvariant()}.nupkg",
                            Published        = publishTime,
                            DependencyGroups = metadata.Dependencies
                                               .Select(deps =>
                                                       new RegistrationDependencyGroupOutputModel
                            {
                                //Id_alias = ""
                                TargetFramework = deps.TargetFramework,
                                Dependencies    = deps.Dependency.Select(dep =>
                                                                         new RegistrationDependencyOutputModel
                                {
                                    Id = dep.Id,
                                    //Id_Alias = "",
                                    Range        = dep.Version,
                                    Registration = registrationInput.BaseUrl +
                                                   registrationInput.Path
                                }).ToList()
                            }).ToList()
                        }
                    }
                };
                model.Items.Add(modelItem);
            }
            await provider.WriteJsonResponseAsync(context, model, useGzip : useGzip);
        }
Пример #30
0
        RespondSearchQueryServiceAsync(
            this INugetServerProvider provider,
            HttpContext context)
        {
            var registrationsBaseUrl = context.GetBaseUrl() +
                                       provider.GetResourceUrlPath(
                NugetServerResourceType.RegistrationsBaseUrl);

            var searchInputModel = context.FromQueryString
                                   <SearchInputModel>();
            var searchOutputModel = new SearchOutputModel();

            var metadata_versions =
                provider.NuspecProvider
                .GetAll()
                .Where(nuspec => nuspec.Metadata != null)
                .Select(nuspec => new
            {
                nuspec.Metadata,
                Version = (NuGetVersionString)
                          nuspec.Metadata.Version
            })
                .Where(mv =>
                       searchInputModel.SemVerLevel?.Major != 1
                    ? true
                    : !mv.Version.IsSemVer2)
                .Where(mv =>
                       searchInputModel.PreRelease
                    ? true
                    : !mv.Version.IsPrerelease)
                .OrderBy(mv => mv.Metadata.Id)
                .GroupBy(mv => mv.Metadata.Id)
                .Where(mv => string.IsNullOrWhiteSpace(
                           searchInputModel.Q) ||
                       mv.Key.ToLowerInvariant()
                       .Contains(searchInputModel.Q
                                 .ToLowerInvariant()))
                .ToList();
            var takes = metadata_versions
                        .Skip(searchInputModel.Skip)
                        .Take(searchInputModel.Take)
                        .ToList();

            searchOutputModel.TotalHits =
                metadata_versions.Count;

            foreach (var path_metadata in takes)
            {
                var packageId = path_metadata.Key;
                var packageIdLowerInvariant =
                    packageId.ToLowerInvariant();

                var metadatas = path_metadata
                                .Select(x => x.Metadata)
                                .OrderBy(x => x.Version)
                                .ToList();

                var latest = metadatas.Last();
                searchOutputModel.Data.Add(new SearchResultModel
                {
                    Id      = latest.Id,
                    Authors = latest.Authors?.Split(
                        new[] { ',' },
                        StringSplitOptions.RemoveEmptyEntries)
                              ?.ToList() ?? new List <string>(0),
                    Description = latest.Description,
                    Owners      = latest.Owners?.Split(
                        new[] { ',' },
                        StringSplitOptions.RemoveEmptyEntries)
                                  ?.ToList() ?? new List <string>(0),
                    ProjectUrl   = latest.ProjectUrl,
                    IconUrl      = latest.IconUrl,
                    Registration = $"{registrationsBaseUrl}/{packageIdLowerInvariant}/index.json",
                    Id_alias     = $"{registrationsBaseUrl}/{packageIdLowerInvariant}/index.json",
                    Summary      = latest.ReleaseNotes
                                   ?? latest.Description,
                    Tags = latest.Tags?.Split(
                        new[] { ',' },
                        StringSplitOptions.RemoveEmptyEntries)
                           ?.ToList() ?? new List <string>(0),
                    Title      = latest.Id,
                    Version    = (NuGetVersionString)latest.Version,
                    LicenseUrl = latest.LicenseUrl,
                    Versions   = metadatas.Select(m => new
                                                  SearchResultPackageVersionModel
                    {
                        Id      = $"{registrationsBaseUrl}/{packageIdLowerInvariant}/{m.Version}.json",
                        Version = (NuGetVersionString)m.Version
                    }).ToList(),
                });
            }
            await provider
            .WriteJsonResponseAsync(
                context, searchOutputModel);
        }