Skip to content

Commit

Permalink
Showing 12 changed files with 179 additions and 26 deletions.
12 changes: 8 additions & 4 deletions src/NuGetGallery/Controllers/AccountsController.cs
Original file line number Diff line number Diff line change
@@ -335,6 +335,8 @@ protected virtual void UpdateAccountViewModel(TUser account, TAccountViewModel m
model.CanManage = ActionsRequiringPermissions.ManageAccount.CheckPermissions(
GetCurrentUser(), account) == PermissionsCheckResult.Allowed;

model.WasMultiFactorAuthenticated = User.WasMultiFactorAuthenticated();

model.CuratedFeeds = CuratedFeedService
.GetFeedsForManager(account.Key)
.Select(f => f.Name)
@@ -377,7 +379,7 @@ public virtual async Task<JsonResult> AddCertificate(string accountName, HttpPos
}

if (ActionsRequiringPermissions.ManageAccount.CheckPermissions(currentUser, account)
!= PermissionsCheckResult.Allowed)
!= PermissionsCheckResult.Allowed || !User.WasMultiFactorAuthenticated())
{
return Json(HttpStatusCode.Forbidden, new { Strings.Unauthorized });
}
@@ -436,7 +438,7 @@ public virtual async Task<JsonResult> DeleteCertificate(string accountName, stri
}

if (ActionsRequiringPermissions.ManageAccount.CheckPermissions(currentUser, account)
!= PermissionsCheckResult.Allowed)
!= PermissionsCheckResult.Allowed || !User.WasMultiFactorAuthenticated())
{
return Json(HttpStatusCode.Forbidden, new { Strings.Unauthorized });
}
@@ -469,6 +471,7 @@ public virtual JsonResult GetCertificates(string accountName)
return Json(HttpStatusCode.Forbidden);
}

var wasMultiFactorAuthenticated = User.WasMultiFactorAuthenticated();
var canManage = ActionsRequiringPermissions.ManageAccount.CheckPermissions(currentUser, account)
== PermissionsCheckResult.Allowed;
var template = GetDeleteCertificateForAccountTemplate(accountName);
@@ -478,7 +481,7 @@ public virtual JsonResult GetCertificates(string accountName)
{
string deactivateUrl = null;

if (canManage)
if (wasMultiFactorAuthenticated && canManage)
{
deactivateUrl = template.Resolve(certificate.Thumbprint);
}
@@ -517,6 +520,7 @@ public virtual JsonResult GetCertificate(string accountName, string thumbprint)
return Json(HttpStatusCode.Forbidden);
}

var wasMultiFactorAuthenticated = User.WasMultiFactorAuthenticated();
var canManage = ActionsRequiringPermissions.ManageAccount.CheckPermissions(currentUser, account)
== PermissionsCheckResult.Allowed;
var template = GetDeleteCertificateForAccountTemplate(accountName);
@@ -527,7 +531,7 @@ public virtual JsonResult GetCertificate(string accountName, string thumbprint)
{
string deactivateUrl = null;

if (canManage)
if (wasMultiFactorAuthenticated && canManage)
{
deactivateUrl = template.Resolve(certificate.Thumbprint);
}
2 changes: 1 addition & 1 deletion src/NuGetGallery/Controllers/PackagesController.cs
Original file line number Diff line number Diff line change
@@ -1811,7 +1811,7 @@ public virtual async Task<JsonResult> SetRequiredSigner(string id, string userna

if (ActionsRequiringPermissions.ManagePackageRequiredSigner
.CheckPermissionsOnBehalfOfAnyAccount(currentUser, packageRegistration)
!= PermissionsCheckResult.Allowed)
!= PermissionsCheckResult.Allowed || !User.WasMultiFactorAuthenticated())
{
return Json(HttpStatusCode.Forbidden);
}
11 changes: 8 additions & 3 deletions src/NuGetGallery/Controllers/UsersController.cs
Original file line number Diff line number Diff line change
@@ -436,14 +436,18 @@ public virtual ActionResult Packages()
new ListPackageOwnerViewModel(currentUser)
}.Concat(currentUser.Organizations.Select(o => new ListPackageOwnerViewModel(o.Organization)));

var wasMultiFactorAuthenticated = User.WasMultiFactorAuthenticated();

var packages = PackageService.FindPackagesByAnyMatchingOwner(currentUser, includeUnlisted: true);
var listedPackages = packages
.Where(p => p.Listed)
.Select(p => new ListPackageItemRequiredSignerViewModel(p, currentUser, SecurityPolicyService)).OrderBy(p => p.Id)
.Select(p => new ListPackageItemRequiredSignerViewModel(p, currentUser, SecurityPolicyService, wasMultiFactorAuthenticated))
.OrderBy(p => p.Id)
.ToList();
var unlistedPackages = packages
.Where(p => !p.Listed)
.Select(p => new ListPackageItemRequiredSignerViewModel(p, currentUser, SecurityPolicyService)).OrderBy(p => p.Id)
.Select(p => new ListPackageItemRequiredSignerViewModel(p, currentUser, SecurityPolicyService, wasMultiFactorAuthenticated))
.OrderBy(p => p.Id)
.ToList();

// find all received ownership requests
@@ -473,7 +477,8 @@ public virtual ActionResult Packages()
ListedPackages = listedPackages,
UnlistedPackages = unlistedPackages,
OwnerRequests = ownerRequests,
ReservedNamespaces = reservedPrefixes
ReservedNamespaces = reservedPrefixes,
WasMultiFactorAuthenticated = User.WasMultiFactorAuthenticated()
};
return View(model);
}
2 changes: 2 additions & 0 deletions src/NuGetGallery/ViewModels/AccountViewModel.cs
Original file line number Diff line number Diff line change
@@ -22,6 +22,8 @@ public abstract class AccountViewModel

public bool CanManage { get; set; }

public bool WasMultiFactorAuthenticated { get; set; }

public IList<string> CuratedFeeds { get; set; }

public ChangeEmailViewModel ChangeEmail { get; set; }
Original file line number Diff line number Diff line change
@@ -26,7 +26,8 @@ public sealed class ListPackageItemRequiredSignerViewModel : ListPackageItemView
public ListPackageItemRequiredSignerViewModel(
Package package,
User currentUser,
ISecurityPolicyService securityPolicyService)
ISecurityPolicyService securityPolicyService,
bool wasMultiFactorAuthenticated)
: base(package, currentUser)
{
if (package == null)
@@ -134,6 +135,8 @@ public ListPackageItemRequiredSignerViewModel(

RequiredSignerMessage = GetRequiredSignerMessage(ownersWithRequiredSignerControl);
}

CanEditRequiredSigner &= wasMultiFactorAuthenticated;
}
}

2 changes: 2 additions & 0 deletions src/NuGetGallery/ViewModels/ManagePackagesViewModel.cs
Original file line number Diff line number Diff line change
@@ -16,5 +16,7 @@ public class ManagePackagesViewModel
public OwnerRequestsViewModel OwnerRequests { get; set; }

public ReservedNamespaceListViewModel ReservedNamespaces { get; set; }

public bool WasMultiFactorAuthenticated { get; set; }
}
}
12 changes: 11 additions & 1 deletion src/NuGetGallery/Views/Shared/_AccountCertificates.cshtml
Original file line number Diff line number Diff line change
@@ -3,6 +3,11 @@
var parent = (WebViewPage)TempData["Parent"];
}

@helper WarnFor2FARequirement()
{
@ViewHelpers.AlertWarning(@<text>You must enable two-factor authentication before you can register or manage certificates. This can be enabled in your <a href="@Url.AccountSettings()">Account Settings</a>.</text>)
}

@ViewHelpers.Section(
parent,
"certificates",
@@ -18,6 +23,11 @@
</form>

<div class="list-certificates">
@if (!Model.WasMultiFactorAuthenticated)
{
@WarnFor2FARequirement();
}

<div class="row" data-bind="ifnot: $data && $data.hasCertificates && $data.hasCertificates()">
<div class="col-xs-12 clearfix">
All your packages need to be signed by one of the registered certificates. <a href="https://docs.microsoft.com/en-us/nuget/reference/signed-packages-reference">Learn more about package signing.</a>
@@ -51,7 +61,7 @@
</div>
</div>

@if (Model.CanManage)
@if (Model.WasMultiFactorAuthenticated && Model.CanManage)
{
<div class="collapse in" id="upload-certificate-form" aria-expanded="true">
@Html.ValidationSummary(true)
6 changes: 6 additions & 0 deletions src/NuGetGallery/Views/Users/Packages.cshtml
Original file line number Diff line number Diff line change
@@ -90,6 +90,12 @@
</section>

<script type="text/html" id="manage-packages">
@if (!Model.WasMultiFactorAuthenticated)
{
<div data-bind="visible: Packages.length > 0">
@ViewHelpers.AlertWarning(@<text>You must enable two-factor authentication before you can change package signing requirements. This can be enabled in your <a href="@Url.AccountSettings()">Account Settings</a>.</text>)
</div>
}
<div class="col-md-12">
<div class="panel-collapse collapse in" aria-expanded="true">
<!-- ko if: VisiblePackagesCount -->
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
using System.Web.Mvc;
using Moq;
using NuGetGallery.Areas.Admin.ViewModels;
using NuGetGallery.Authentication;
using NuGetGallery.Framework;
using NuGetGallery.Security;
using Xunit;
@@ -1477,6 +1478,7 @@ public void GetCertificate_WhenOrganizationHasNoCertificates_ReturnsOK()
_certificateService.Setup(x => x.GetCertificates(It.Is<User>(u => u == _organization)))
.Returns(Enumerable.Empty<Certificate>());
_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.GetCertificate(_organization.Username, _certificate.Thumbprint);

@@ -1494,6 +1496,7 @@ public void GetCertificate_WhenOrganizationHasCertificate_ReturnsOK()
_certificateService.Setup(x => x.GetCertificates(It.Is<User>(u => u == _organization)))
.Returns(new[] { _certificate });
_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.GetCertificate(_organization.Username, _certificate.Thumbprint);

@@ -1623,6 +1626,7 @@ public void GetCertificates_WhenOrganizationHasNoCertificates_ReturnsOK()
_certificateService.Setup(x => x.GetCertificates(It.Is<User>(u => u == _organization)))
.Returns(Enumerable.Empty<Certificate>());
_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.GetCertificates(_organization.Username);

@@ -1640,6 +1644,7 @@ public void GetCertificates_WhenOrganizationHasCertificate_ReturnsOK()
_certificateService.Setup(x => x.GetCertificates(It.Is<User>(u => u == _organization)))
.Returns(new[] { _certificate });
_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.GetCertificates(_organization.Username);

@@ -1796,6 +1801,7 @@ public void AddCertificate_WhenUploadFileIsValid_ReturnsCreated()
.Returns(Task.CompletedTask);

_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.AddCertificate(_organization.Username, uploadFile);

@@ -1828,6 +1834,8 @@ public void AddCertificate_WhenUserIsSubscribedToAutomaticallyOverwriteRequiredS
.Returns(Task.CompletedTask);

_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.AddCertificate(_organization.Username, uploadFile);

@@ -1948,6 +1956,7 @@ public void DeleteCertificate_WithValidThumbprint_ReturnsOK()
It.Is<User>(user => user == _organization)))
.Returns(Task.CompletedTask);
_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.DeleteCertificate(_organization.Username, _certificate.Thumbprint);

Original file line number Diff line number Diff line change
@@ -3,11 +3,13 @@

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Net;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
@@ -21,14 +23,13 @@
using NuGetGallery.Areas.Admin.Models;
using NuGetGallery.AsyncFileUpload;
using NuGetGallery.Auditing;
using NuGetGallery.Authentication;
using NuGetGallery.Configuration;
using NuGetGallery.Framework;
using NuGetGallery.Helpers;
using NuGetGallery.Packaging;
using NuGetGallery.Security;
using Xunit;
using System.Globalization;
using System.Text;

namespace NuGetGallery
{
@@ -5315,6 +5316,7 @@ public async Task WhenSignerNotFound_ReturnsNotFound()
.Returns<User>(null);

controller.SetCurrentUser(currentUser);
controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var result = await controller.SetRequiredSigner(_packageRegistration.Id, _signer.Username);

@@ -5385,6 +5387,7 @@ public async Task WhenCurrentUserIsAuthenticatedOwner_ReturnsOK()
.Returns(_signer);

controller.SetCurrentUser(_signer);
controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var result = await controller.SetRequiredSigner(_packageRegistration.Id, _signer.Username);

7 changes: 7 additions & 0 deletions tests/NuGetGallery.Facts/Controllers/UsersControllerFacts.cs
Original file line number Diff line number Diff line change
@@ -2891,6 +2891,7 @@ public void GetCertificate_WhenCurrentUserHasNoCertificates_ReturnsOK()
_certificateService.Setup(x => x.GetCertificates(It.Is<User>(u => u == _user)))
.Returns(Enumerable.Empty<Certificate>());
_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.GetCertificate(accountName: null, thumbprint: _certificate.Thumbprint);

@@ -2908,6 +2909,7 @@ public void GetCertificate_WhenCurrentUserHasCertificate_ReturnsOK()
_certificateService.Setup(x => x.GetCertificates(It.Is<User>(u => u == _user)))
.Returns(new[] { _certificate });
_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.GetCertificate(accountName: null, thumbprint: _certificate.Thumbprint);

@@ -2965,6 +2967,7 @@ public void GetCertificates_WhenCurrentUserHasNoCertificates_ReturnsOK()
_certificateService.Setup(x => x.GetCertificates(It.Is<User>(u => u == _user)))
.Returns(Enumerable.Empty<Certificate>());
_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.GetCertificates(accountName: null);

@@ -2982,6 +2985,7 @@ public void GetCertificates_WhenCurrentUserHasCertificate_ReturnsOK()
_certificateService.Setup(x => x.GetCertificates(It.Is<User>(u => u == _user)))
.Returns(new[] { _certificate });
_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.GetCertificates(accountName: null);

@@ -3063,6 +3067,7 @@ public void AddCertificate_WhenUploadFileIsValid_ReturnsCreated()
.Returns(Task.CompletedTask);

_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.AddCertificate(accountName: null, uploadFile: uploadFile);

@@ -3095,6 +3100,7 @@ public void AddCertificate_WhenUserIsSubscribedToAutomaticallyOverwriteRequiredS
.Returns(Task.CompletedTask);

_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.AddCertificate(accountName: null, uploadFile: uploadFile);

@@ -3169,6 +3175,7 @@ public void DeleteCertificate_WithValidThumbprint_ReturnsOK()
It.Is<User>(user => user == _user)))
.Returns(Task.CompletedTask);
_controller.SetCurrentUser(_user);
_controller.OwinContext.AddClaim(NuGetClaims.WasMultiFactorAuthenticated);

var response = _controller.DeleteCertificate(accountName: null, thumbprint: _certificate.Thumbprint);

Original file line number Diff line number Diff line change
@@ -40,7 +40,8 @@ public void Constructor_WhenPackageIsNull_Throws()
() => new ListPackageItemRequiredSignerViewModel(
package: null,
currentUser: _currentUser,
securityPolicyService: _securityPolicyService.Object));
securityPolicyService: _securityPolicyService.Object,
wasMultiFactorAuthenticated: true));

Assert.Equal("package", exception.ParamName);
}
@@ -58,7 +59,8 @@ public void Constructor_WhenCurrentUserIsNull_Throws()
() => new ListPackageItemRequiredSignerViewModel(
package,
currentUser: null,
securityPolicyService: _securityPolicyService.Object));
securityPolicyService: _securityPolicyService.Object,
wasMultiFactorAuthenticated: true));

Assert.Equal("currentUser", exception.ParamName);
}
@@ -73,7 +75,11 @@ public void Constructor_WhenSecurityPolicyServiceIsNull_Throws()
};

var exception = Assert.Throws<ArgumentNullException>(
() => new ListPackageItemRequiredSignerViewModel(package, _currentUser, securityPolicyService: null));
() => new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
securityPolicyService: null,
wasMultiFactorAuthenticated: true));

Assert.Equal("securityPolicyService", exception.ParamName);
}
@@ -98,7 +104,8 @@ public void Constructor_WhenPackageHasOneOwnerAndItIsTheCurrentUser_WhenRequired
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(_currentUser.Username, viewModel.RequiredSigner.Username);
Assert.Equal($"{_currentUser.Username} (0 certificates)", viewModel.RequiredSigner.DisplayText);
@@ -132,7 +139,8 @@ public void Constructor_WhenPackageHasOneOwnerAndItIsTheCurrentUser_WhenRequired
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(_currentUser.Username, viewModel.RequiredSigner.Username);
Assert.Equal($"{_currentUser.Username} (0 certificates)", viewModel.RequiredSigner.DisplayText);
@@ -166,7 +174,8 @@ public void Constructor_WhenPackageHasOneOwnerAndItIsTheCurrentUser_WhenRequired
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(_otherUser.Username, viewModel.RequiredSigner.Username);
Assert.Equal($"{_otherUser.Username} (0 certificates)", viewModel.RequiredSigner.DisplayText);
@@ -200,7 +209,8 @@ public void Constructor_WhenPackageHasTwoOwnersAndTheCurrentUserIsAnOwner_WhenRe
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(string.Empty, viewModel.RequiredSigner.Username);
Assert.Equal("Any", viewModel.RequiredSigner.DisplayText);
@@ -213,6 +223,91 @@ public void Constructor_WhenPackageHasTwoOwnersAndTheCurrentUserIsAnOwner_WhenRe
_securityPolicyService.VerifyAll();
}

[Fact]
public void Constructor_WhenPackageHasTwoOwnersAndTheCurrentUserIsAnOwnerAndNotMultiFactorAuthenticated_WhenRequiredSignerIsNull()
{
var package = new Package()
{
PackageRegistration = new PackageRegistration()
{
Owners = new List<User>() { _currentUser, _otherUser }
},
Version = "1.0.0"
};

_securityPolicyService.Setup(
x => x.IsSubscribed(
It.IsNotNull<User>(),
It.Is<string>(s => s == ControlRequiredSignerPolicy.PolicyName)))
.Returns(false);

var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object,
wasMultiFactorAuthenticated: false);

Assert.Equal(string.Empty, viewModel.RequiredSigner.Username);
Assert.Equal("Any", viewModel.RequiredSigner.DisplayText);
Assert.Null(viewModel.RequiredSignerMessage);
VerifySigners(package.PackageRegistration.Owners, viewModel.AllSigners, expectAnySigner: true);
Assert.True(viewModel.ShowRequiredSigner);
Assert.False(viewModel.ShowTextBox);
Assert.False(viewModel.CanEditRequiredSigner);

_securityPolicyService.VerifyAll();
}

[Fact]
public void Constructor_WhenPackageHasOneOwnerAndTheCurrentUserIsACollaborator_WhenRequiredSignerIsNull()
{
var organization = new Organization()
{
Key = 7,
Username = "c"
};

organization.Members.Add(new Membership()
{
OrganizationKey = organization.Key,
Organization = organization,
MemberKey = _currentUser.Key,
Member = _currentUser,
IsAdmin = false
});

var package = new Package()
{
PackageRegistration = new PackageRegistration()
{
Owners = new List<User>() { organization }
},
Version = "1.0.0"
};

_securityPolicyService.Setup(
x => x.IsSubscribed(
It.IsNotNull<User>(),
It.Is<string>(s => s == ControlRequiredSignerPolicy.PolicyName)))
.Returns(false);

var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal("c", viewModel.RequiredSigner.Username);
Assert.Equal($"{organization.Username} (0 certificates)", viewModel.RequiredSigner.DisplayText);
Assert.Null(viewModel.RequiredSignerMessage);
VerifySigners(package.PackageRegistration.Owners, viewModel.AllSigners, expectAnySigner: false);
Assert.True(viewModel.ShowRequiredSigner);
Assert.False(viewModel.ShowTextBox);
Assert.False(viewModel.CanEditRequiredSigner);

_securityPolicyService.VerifyAll();
}

[Fact]
public void Constructor_WhenPackageHasTwoOwnersAndTheCurrentUserIsAnOwner_WhenRequiredSignerIsCurrentUser()
{
@@ -235,7 +330,8 @@ public void Constructor_WhenPackageHasTwoOwnersAndTheCurrentUserIsAnOwner_WhenRe
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(_currentUser.Username, viewModel.RequiredSigner.Username);
Assert.Equal($"{_currentUser.Username} (0 certificates)", viewModel.RequiredSigner.DisplayText);
@@ -270,7 +366,8 @@ public void Constructor_WhenPackageHasTwoOwnersAndTheCurrentUserIsAnOwner_WhenRe
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(_otherUser.Username, viewModel.RequiredSigner.Username);
Assert.Equal($"{_otherUser.Username} (0 certificates)", viewModel.RequiredSigner.DisplayText);
@@ -332,7 +429,8 @@ public void Constructor_WhenPackageHasMultipleOwners_WhenOwnersHaveVaryingCertif
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(currentUser.Username, viewModel.RequiredSigner.Username);
Assert.Equal($"{currentUser.Username} (1 certificate)", viewModel.RequiredSigner.DisplayText);
@@ -367,7 +465,8 @@ public void Constructor_WhenPackageHasTwoOwnersAndTheCurrentUserIsAnOwner_WhenCu
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(_currentUser.Username, viewModel.RequiredSigner.Username);
Assert.Equal($"{_currentUser.Username} (0 certificates)", viewModel.RequiredSigner.DisplayText);
@@ -407,7 +506,8 @@ public void Constructor_WhenPackageHasTwoOwnersAndTheCurrentUserIsAnOwner_WhenCu
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(_otherUser.Username, viewModel.RequiredSigner.Username);
Assert.Equal($"{_otherUser.Username} (0 certificates)", viewModel.RequiredSigner.DisplayText);
@@ -458,7 +558,8 @@ public void Constructor_WhenPackageHasThreeOwnersAndTheCurrentUserIsAnOwner_When
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(_currentUser.Username, viewModel.RequiredSigner.Username);
Assert.Equal($"{_currentUser.Username} (0 certificates)", viewModel.RequiredSigner.DisplayText);
@@ -520,7 +621,8 @@ public void Constructor_WhenPackageHasFourOwnersAndTheCurrentUserIsAnOwner_WhenT
var viewModel = new ListPackageItemRequiredSignerViewModel(
package,
_currentUser,
_securityPolicyService.Object);
_securityPolicyService.Object,
wasMultiFactorAuthenticated: true);

Assert.Equal(_otherUser.Username, viewModel.RequiredSigner.Username);
Assert.Equal($"{_otherUser.Username} (0 certificates)", viewModel.RequiredSigner.DisplayText);

0 comments on commit ea1724d

Please sign in to comment.