using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Linq; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using NuGet.Packaging; using NuGet.Packaging.Core; using nuget_host.Entities; using nuget_host.Helpers; namespace nuget_host.Controllers { public class PackagesController : Controller { private readonly ILogger logger; private readonly IDataProtector protector; private readonly NugetSettings nugetSettings; public PackagesController( ILoggerFactory loggerFactory, IDataProtectionProvider provider, IOptions nugetOptions) { logger = loggerFactory.CreateLogger(); nugetSettings = nugetOptions.Value; protector = provider.CreateProtector(nugetSettings.ProtectionTitle); } [HttpPut("packages/{*spec}")] public IActionResult Put(string spec) { string path = null; if (string.IsNullOrEmpty(spec)) { var clientVersionId = Request.Headers["X-NuGet-Client-Version"]; var apiKey = Request.Headers["X-NuGet-ApiKey"]; ViewData["nuget client"] = "nuget {clientVersionId}"; var clearkey = protector.Unprotect(apiKey); if (clearkey!= Startup.RootApiKeySecret) return Unauthorized(); foreach (var file in Request.Form.Files) { string initpath = "package.nupkg"; using (FileStream fw = new FileStream(initpath, FileMode.Create)) { file.CopyTo(fw); } using (FileStream fw = new FileStream(initpath, FileMode.Open)) { var archive = new System.IO.Compression.ZipArchive(fw); foreach (var entry in archive.Entries) { if (entry.FullName.EndsWith(".nuspec")) { // var entry = archive.GetEntry(filename); var specstr = entry.Open(); NuGet.Packaging.Core.NuspecCoreReader reader = new NuspecCoreReader(specstr); string pkgdesc = reader.GetDescription(); string pkgid = reader.GetId(); var version = reader.GetVersion(); path = Path.Combine(nugetSettings.PackagesRootDir, Path.Combine(pkgid, Path.Combine(version.Version.ToString()), $"{pkgid}-{version}.nupkg")); var source = new FileInfo(initpath); var dest = new FileInfo(path); var destdir = new DirectoryInfo(dest.DirectoryName); if (dest.Exists) return BadRequest(new {error = "existant"}); if (!destdir.Exists) destdir.Create(); source.MoveTo(path); } } } } } else { return BadRequest(); } return Ok(ViewData); } [HttpGet("Packages/{spec}")] public IActionResult Index(string spec) { if (string.IsNullOrEmpty(spec)) { ViewData["warn"] = "no spec"; } else { ViewData["spec"] = spec; // TODO Assert valid sem ver spec var filelst = new DirectoryInfo(nugetSettings.PackagesRootDir); var fi = new FileInfo(spec); var lst = filelst.GetDirectories(spec); ViewData["lst"] = lst.Select(entry => entry.Name); } return Ok(ViewData); } [Authorize] [HttpGet("api/get-key/{*apikey}")] public IActionResult GetApiKey(string apiKey) { return Ok(protector.Protect(apiKey)); } } }