public PackageViewModel(Package package) { _package = package; Version = String.IsNullOrEmpty(package.NormalizedVersion) ? SemanticVersionExtensions.Normalize(package.Version) : package.NormalizedVersion; Description = package.Description; ReleaseNotes = package.ReleaseNotes; IconUrl = package.IconUrl; ProjectUrl = package.ProjectUrl; LicenseUrl = package.LicenseUrl; HideLicenseReport = package.HideLicenseReport; LatestVersion = package.IsLatest; LatestStableVersion = package.IsLatestStable; LastUpdated = package.Published; Listed = package.Listed; DownloadCount = package.DownloadCount; Prerelease = package.IsPrerelease; LicenseReportUrl = package.LicenseReportUrl; var licenseNames = package.LicenseNames; if (!String.IsNullOrEmpty(licenseNames)) { LicenseNames = licenseNames.Split(',').Select(l => l.Trim()); } }
public ManagePackageOwnersViewModel(Package package, IPrincipal currentUser) : base(package) { CurrentOwnerUsername = currentUser.Identity.Name; OtherOwners = Owners.Where(o => o.Username != CurrentOwnerUsername); OtherOwners = new[] { new User { Username = "******" } }; }
public void UpdatePackage(Package package) { var packageRegistrationKey = package.PackageRegistrationKey; var updateTerm = new Term("PackageRegistrationKey", packageRegistrationKey.ToString(CultureInfo.InvariantCulture)); if (!package.IsLatest || package.IsLatestStable) { // Someone passed us in a version which was e.g. just unlisted? Or just not the latest version which is what we want to index. Doesn't really matter. We'll find one to index. package = _packageRepository.GetAll() .Where(p => (p.IsLatest || p.IsLatestStable) && p.PackageRegistrationKey == packageRegistrationKey) .Include(p => p.PackageRegistration) .Include(p => p.PackageRegistration.Owners) .Include(p => p.SupportedFrameworks) .FirstOrDefault(); } // Just update the provided package using (Trace.Activity(String.Format(CultureInfo.CurrentCulture, "Updating Lucene Index for: {0} {1} [PackageKey:{2}]", package.PackageRegistration.Id, package.Version, package.Key))) { EnsureIndexWriter(creatingIndex: false); if (package != null) { var indexEntity = new PackageIndexEntity(package); Trace.Information(String.Format(CultureInfo.CurrentCulture, "Updating Document: {0}", updateTerm.ToString())); _indexWriter.UpdateDocument(updateTerm, indexEntity.ToDocument()); } else { Trace.Information(String.Format(CultureInfo.CurrentCulture, "Deleting Document: {0}", updateTerm.ToString())); _indexWriter.DeleteDocuments(updateTerm); } _indexWriter.Commit(); } }
public EditPackageVersionRequest(Package package, PackageEdit pendingMetadata) { var metadata = pendingMetadata ?? new PackageEdit { Authors = package.FlattenedAuthors, Copyright = package.Copyright, Description = package.Description, IconUrl = package.IconUrl, LicenseUrl = package.LicenseUrl, ProjectUrl = package.ProjectUrl, ReleaseNotes = package.ReleaseNotes, RequiresLicenseAcceptance = package.RequiresLicenseAcceptance, Summary = package.Summary, Tags = package.Tags, Title = package.Title, }; Authors = metadata.Authors; Copyright = metadata.Copyright; Description = metadata.Description; IconUrl = metadata.IconUrl; LicenseUrl = metadata.LicenseUrl; ProjectUrl = metadata.ProjectUrl; ReleaseNotes = metadata.ReleaseNotes; RequiresLicenseAcceptance = metadata.RequiresLicenseAcceptance; Summary = metadata.Summary; Tags = metadata.Tags; VersionTitle = metadata.Title; }
public PackageViewModel(Package package) { this.package = package; Version = package.Version; Description = package.Description; ReleaseNotes = package.ReleaseNotes; IconUrl = package.IconUrl; ProjectUrl = package.ProjectUrl; ProjectSourceUrl = package.ProjectSourceUrl; PackageSourceUrl = package.PackageSourceUrl; DocsUrl = package.DocsUrl; MailingListUrl = package.MailingListUrl; BugTrackerUrl = package.BugTrackerUrl; LicenseUrl = package.LicenseUrl; LatestVersion = package.IsLatest; LatestStableVersion = package.IsLatestStable; LastUpdated = package.Status == PackageStatusType.Submitted ? package.LastUpdated : package.Published; PublishedDate = package.Published; Listed = package.Listed; DownloadCount = package.DownloadCount; Prerelease = package.IsPrerelease; Status = package.Status; SubmittedStatus = package.SubmittedStatus; ApprovedDate = package.ApprovedDate; ReviewerUserName = package.ReviewedBy != null ? package.ReviewedBy.Username : string.Empty; ReviewerEmailAddress = package.ReviewedBy != null ? package.ReviewedBy.EmailAddress : string.Empty; ReviewedDate = package.ReviewedDate; ReviewComments = package.ReviewComments; }
public async Task CreateNuGetExeDownloadExtractsFileIfItDoesNotExist() { // Arrange var fileStorage = new Mock<IFileStorageService>(MockBehavior.Strict); fileStorage.Setup(s => s.FileExistsAsync("downloads", "nuget.exe")).Returns(Task.FromResult(false)); fileStorage.Setup(s => s.SaveFileAsync("downloads", "nuget.exe", It.IsAny<Stream>())) .Returns(Task.FromResult(0)) .Verifiable(); fileStorage.Setup(s => s.CreateDownloadFileActionResultAsync("downloads", "nuget.exe")) .Returns(Task.FromResult(Mock.Of<ActionResult>())) .Verifiable(); var package = new Package { Version = "2.0.0" }; var packageService = new Mock<IPackageService>(MockBehavior.Strict); packageService.Setup(s => s.FindPackageByIdAndVersion("NuGet.CommandLine", null, false)) .Returns(package) .Verifiable(); var packageFileService = new Mock<IPackageFileService>(MockBehavior.Strict); packageFileService.Setup(s => s.DownloadPackageFileAsync(package)) .Returns(Task.FromResult(CreateCommandLinePackage())) .Verifiable(); // Act var downloaderService = GetDownloaderService(packageService, packageFileService, fileStorage); await downloaderService.CreateNuGetExeDownloadActionResultAsync(); // Assert packageFileService.Verify(); packageService.Verify(); }
public DisplayPackageViewModel(Package package, IOrderedEnumerable<Package> packageHistory, bool isVersionHistory) : base(package) { Copyright = package.Copyright; if (!isVersionHistory) { Dependencies = new DependencySetsViewModel(package.Dependencies); PackageVersions = packageHistory.Select(p => new DisplayPackageViewModel(p, packageHistory, isVersionHistory: true)); } DownloadCount = package.DownloadCount; LastEdited = package.LastEdited; if (!isVersionHistory && packageHistory.Any()) { // calculate the number of days since the package registration was created // round to the nearest integer, with a min value of 1 // divide the total download count by this number TotalDaysSinceCreated = Convert.ToInt32(Math.Max(1, Math.Round((DateTime.UtcNow - packageHistory.Last().Created).TotalDays))); DownloadsPerDay = TotalDownloadCount / TotalDaysSinceCreated; // for the package } else { TotalDaysSinceCreated = 0; DownloadsPerDay = 0; } }
public void ContactSiteAdmins(MailAddress fromAddress, Package package, string message,string packageUrl, bool copySender) { string subject = "[{0}] Contact Site Admins for Package '{1}' Version '{2}'"; string body = @"_User {0} ({1}) is reporting on '{2}' version '{3}'. {0} left the following information in the report:_ {4} _Message sent from {5}_ Current Maintainer(s): {7} Package Url: {6} "; body = String.Format(CultureInfo.CurrentCulture, body, fromAddress.DisplayName, fromAddress.Address, package.PackageRegistration.Id, package.Version, message, settings.GalleryOwnerName, packageUrl, string.Join(", ",package.PackageRegistration.Owners.Select(x => x.Username))); using (var mailMessage = new MailMessage()) { mailMessage.Subject = String.Format(CultureInfo.CurrentCulture, subject, settings.GalleryOwnerName, package.PackageRegistration.Id, package.Version); mailMessage.Body = body; mailMessage.From = fromAddress; mailMessage.To.Add(settings.GalleryOwnerEmail); SendMessage(mailMessage,copySender); } }
public async Task CreatePackageWillSavePackageFileToFileStorage() { // Arrange var user = new User() { EmailAddress = "*****@*****.**" }; var packageRegistration = new PackageRegistration(); packageRegistration.Id = "theId"; packageRegistration.Owners.Add(user); var package = new Package(); package.PackageRegistration = packageRegistration; package.Version = "1.0.42"; packageRegistration.Packages.Add(package); var controller = new TestableApiController(); controller.SetCurrentUser(user); controller.MockPackageFileService.Setup(p => p.SavePackageFileAsync(It.IsAny<Package>(), It.IsAny<Stream>())) .Returns(Task.CompletedTask).Verifiable(); controller.MockPackageService.Setup(p => p.FindPackageRegistrationById(It.IsAny<string>())) .Returns(packageRegistration); controller.MockPackageService.Setup(p => p.CreatePackageAsync(It.IsAny<PackageArchiveReader>(), It.IsAny<PackageStreamMetadata>(), It.IsAny<User>(), false)) .Returns(Task.FromResult(package)); var nuGetPackage = TestPackage.CreateTestPackageStream("theId", "1.0.42"); controller.SetupPackageFromInputStream(nuGetPackage); // Act await controller.CreatePackagePut(); // Assert controller.MockPackageFileService.Verify(); }
public MailMessage ReportAbuse(MailAddress fromAddress, Package package, string message) { string subject = "[{0}] Abuse Report for Package '{1}' Version '{2}'"; string body = @"_User {0} ({1}) reports the package '{2}' version '{3}' as abusive. {0} left the following information in the report:_ {4} _Message sent from {5}_ "; body = String.Format(body, fromAddress.DisplayName, fromAddress.Address, package.PackageRegistration.Id, package.Version, message, settings.GalleryOwnerName); using ( var mailMessage = new MailMessage { Subject = String.Format(subject, settings.GalleryOwnerName, package.PackageRegistration.Id, package.Version), Body = body, From = fromAddress, }) { mailMessage.To.Add(settings.GalleryOwnerEmail); SendMessage(mailMessage); return mailMessage; } }
public void IdConflictsWithExistingPackageTitleTests(string existingPackageId, string existingPackageTitle, string newPackageId, bool shouldBeConflict) { // Arrange var existingPackageRegistration = new PackageRegistration { Id = existingPackageId, Owners = new HashSet<User>() }; var existingPackage = new Package { PackageRegistration = existingPackageRegistration, Version = "1.0.0", Title = existingPackageTitle }; var packageRegistrationRepository = new Mock<IEntityRepository<PackageRegistration>>(); packageRegistrationRepository.Setup(r => r.GetAll()).Returns(new[] { existingPackageRegistration }.AsQueryable()); var packageRepository = new Mock<IEntityRepository<Package>>(); packageRepository.Setup(r => r.GetAll()).Returns(new[] { existingPackage }.AsQueryable()); var target = new PackageNamingConflictValidator(packageRegistrationRepository.Object, packageRepository.Object); // Act var result = target.IdConflictsWithExistingPackageTitle(newPackageId); // Assert Assert.True(result == shouldBeConflict); }
public override void Curate( Package galleryPackage, IPackage nugetPackage) { var curatedFeed = GetService<ICuratedFeedByNameQuery>().Execute("webmatrix"); if (curatedFeed == null) return; if (!galleryPackage.IsLatestStable) return; var shouldBeIncluded = galleryPackage.Tags != null && galleryPackage.Tags.ToLowerInvariant().Contains("aspnetwebpages"); if (!shouldBeIncluded) { shouldBeIncluded = true; foreach (var file in nugetPackage.GetFiles()) { var fi = new FileInfo(file.Path); if (fi.Extension == ".ps1" || fi.Extension == ".t4") { shouldBeIncluded = false; break; } } } if (shouldBeIncluded) GetService<ICreateCuratedPackageCommand>().Execute( curatedFeed.Key, galleryPackage.PackageRegistration.Key, automaticallyCurated: true); }
public void WillCopySenderIfAsked() { var from = new MailAddress("*****@*****.**", "too"); var package = new Package { PackageRegistration = new PackageRegistration { Id = "smangit" }, Version = "1.42.0.1", }; var messageService = new TestableMessageService(); var reportPackageRequest = new ReportPackageRequest { AlreadyContactedOwners = true, FromAddress = from, Message = "Abuse!", Package = package, Reason = "Reason!", RequestingUser = new User { Username = "******", EmailAddress = "*****@*****.**" }, Url = TestUtility.MockUrlHelper(), CopySender = true, }; messageService.ReportAbuse(reportPackageRequest); var message = messageService.MockMailSender.Sent.Single(); Assert.Equal(TestGalleryOwner, message.To.Single()); Assert.Equal(TestGalleryOwner, message.From); Assert.Equal(reportPackageRequest.FromAddress, message.ReplyToList.Single()); Assert.Equal(reportPackageRequest.FromAddress, message.CC.Single()); Assert.DoesNotContain("Owners", message.Body); }
public async Task ExecuteAsync(Package galleryPackage, PackageArchiveReader nugetPackage, bool commitChanges) { foreach (var curator in _curators) { await curator.CurateAsync(galleryPackage, nugetPackage, commitChanges: commitChanges); } }
public void ReportAbuse(MailAddress fromAddress, Package package, string message) { const string subject = "[{0}] Abuse Report for Package '{1}' Version '{2}'"; string body = @"_User {0} ({1}) reports the package '{2}' version '{3}' as abusive. {0} left the following information in the report:_ {4} _Message sent from {5}_ "; body = String.Format( CultureInfo.CurrentCulture, body, fromAddress.DisplayName, fromAddress.Address, package.PackageRegistration.Id, package.Version, message, _settings.GalleryOwnerName); using (var mailMessage = new MailMessage()) { mailMessage.Subject = String.Format( CultureInfo.CurrentCulture, subject, _settings.GalleryOwnerName, package.PackageRegistration.Id, package.Version); mailMessage.Body = body; mailMessage.From = fromAddress; mailMessage.To.Add(_settings.GalleryOwnerEmail); SendMessage(mailMessage); } }
internal static bool ShouldCuratePackage( CuratedFeed curatedFeed, Package galleryPackage, INupkg nugetPackage) { if (!galleryPackage.IsLatestStable) { return false; } bool shouldBeIncluded = galleryPackage.Tags != null && galleryPackage.Tags.ToLowerInvariant().Contains("aspnetwebpages"); if (!shouldBeIncluded) { shouldBeIncluded = true; foreach (var filePath in nugetPackage.GetFiles()) { var fi = new FileInfo(filePath); if (fi.Extension == ".ps1" || fi.Extension == ".t4") { return false; } } } if (!shouldBeIncluded) { return false; } return DependenciesAreCurated(galleryPackage, curatedFeed); }
public void Execute(Package galleryPackage, IPackage nugetPackage, bool commitChanges) { foreach (var curator in GetServices<IAutomaticPackageCurator>()) { curator.Curate(galleryPackage, nugetPackage, commitChanges: commitChanges); } }
public override async Task CurateAsync(Package galleryPackage, PackageArchiveReader nugetPackage, bool commitChanges) { // Make sure the target feed exists CuratedFeed feed = CuratedFeedService.GetFeedByName(CuratedFeedName, includePackages: true); if (feed != null && galleryPackage.Tags != null) { // Break the tags up so we can be sure we don't catch any partial matches (i.e. "foobar" when we're looking for "foo") string[] tags = galleryPackage.Tags.Split(); // Check if this package should be curated if (tags.Any(tag => RequiredTags.Contains(tag, StringComparer.OrdinalIgnoreCase))) { // It should! // But now we need to ensure that the package's dependencies are also curated if (DependenciesAreCurated(galleryPackage, feed)) { await CuratedFeedService.CreatedCuratedPackageAsync( feed, galleryPackage.PackageRegistration, automaticallyCurated: true, commitChanges: commitChanges); } } } }
internal static bool ShouldCuratePackage( CuratedFeed curatedFeed, Package galleryPackage, INupkg nugetPackage) { return // Must have min client version of null or <= 2.2 (nugetPackage.Metadata.MinClientVersion == null || nugetPackage.Metadata.MinClientVersion <= new Version(2, 2)) && // Must be latest stable galleryPackage.IsLatestStable && // Must support net40 SupportsNet40(galleryPackage) && // Dependencies on the gallery must be curated DependenciesAreCurated(galleryPackage, curatedFeed) && ( // Must have AspNetWebPages tag ContainsAspNetWebPagesTag(galleryPackage) || // OR: Must not contain powershell or T4 DoesNotContainUnsupportedFiles(nugetPackage) ); }
/// <summary> /// Returns the newest, uncompleted metadata for a package (i.e. a pending edit) /// </summary> public virtual PackageEdit GetPendingMetadata(Package p) { return EntitiesContext.Set<PackageEdit>() .Where(m => m.PackageKey == p.Key) .OrderByDescending(m => m.Timestamp) .FirstOrDefault(); }
public void Execute(Package galleryPackage, PackageReader nugetPackage, bool commitChanges) { foreach (var curator in _curators) { curator.Curate(galleryPackage, nugetPackage, commitChanges: commitChanges); } }
public virtual void StartEditPackageRequest(Package p, EditPackageVersionRequest request, User editingUser) { PackageEdit edit = new PackageEdit { // Description User = editingUser, Authors = request.Authors, Copyright = request.Copyright, Description = request.Description, IconUrl = request.IconUrl, LicenseUrl = p.LicenseUrl, // Our current policy is not to allow editing the license URL, so just clone it from its previous value. ProjectUrl = request.ProjectUrl, ReleaseNotes = request.ReleaseNotes, RequiresLicenseAcceptance = request.RequiresLicenseAcceptance, Summary = request.Summary, Tags = request.Tags, Title = request.VersionTitle, // Other Package = p, Timestamp = DateTime.UtcNow, TriedCount = 0, }; EntitiesContext.Set<PackageEdit>().Add(edit); // Note: EditPackageRequests are completed asynchronously by the worker role. }
public ListPackageItemViewModel(Package package) : base(package) { Tags = package.Tags != null ? package.Tags.Trim().Split(' ') : null; Authors = package.Authors; Owners = package.PackageRegistration.Owners; }
public PackageIndexEntity(Package package, int curatedFeedKey, bool isLatest, bool isLatestStable) { this.Package = package; this.curatedFeedKey = curatedFeedKey; this.isLatest = isLatest; this.isLatestStable = isLatestStable; }
internal static bool ShouldCuratePackage( CuratedFeed curatedFeed, Package galleryPackage, PackageArchiveReader packageArchiveReader) { var nuspec = packageArchiveReader.GetNuspecReader(); return // Must have min client version of null or <= 2.2 (nuspec.GetMinClientVersion() == null || nuspec.GetMinClientVersion() <= new NuGetVersion(2, 2, 0)) && // Must be latest stable galleryPackage.IsLatestStable && // Must support net40 SupportsNet40(galleryPackage) && ( // Must have AspNetWebPages tag ContainsAspNetWebPagesTag(galleryPackage) || // OR: Must not contain powershell or T4 DoesNotContainUnsupportedFiles(packageArchiveReader) ) && // Dependencies on the gallery must be curated DependenciesAreCurated(galleryPackage, curatedFeed); }
public Stream DownloadPackageFile(Package package) { var fileName = BuildFileName(package); return fileStorageSvc.GetFile( Constants.PackagesFolderName, fileName); }
public ActionResult CreateDownloadPackageActionResult(Package package) { var fileName = BuildFileName(package); return fileStorageSvc.CreateDownloadFileActionResult( Constants.PackagesFolderName, fileName); }
private void ClearSupportedFrameworks(Package package) { foreach (var supportedFramework in package.SupportedFrameworks.ToList()) { _entitiesContext.Set<PackageFramework>().Remove(supportedFramework); } package.SupportedFrameworks.Clear(); }
public ListPackageItemViewModel(Package package) : base(package) { Tags = package.Tags != null ? package.Tags.Trim().Split(' ') : null; Authors = package.FlattenedAuthors; MinClientVersion = package.MinClientVersion; Owners = package.PackageRegistration.Owners; }
public DeletePackageViewModel(Package package, ReportPackageReason[] reportOtherPackageReasons) : base(package) { DeletePackagesRequest = new DeletePackagesRequest { Packages = new List<string> { string.Format(CultureInfo.InvariantCulture, "{0}|{1}", package.PackageRegistration.Id, package.Version) }, ReasonChoices = reportOtherPackageReasons }; }
private static bool ContainsAspNetWebPagesTag(Package galleryPackage) { return(galleryPackage.Tags != null && galleryPackage.Tags.ToLowerInvariant().Contains("aspnetwebpages")); }