Skip to content

Commit 17328b8

Browse files
author
Scott Bommarito
authored
Add logging to the automatic RequireOrganizationTenantPolicy path (#6864)
1 parent cbd0d5e commit 17328b8

5 files changed

Lines changed: 219 additions & 116 deletions

File tree

src/NuGetGallery/Services/LoginDiscontinuationConfiguration.cs

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public LoginDiscontinuationConfiguration(
4343
DiscontinuedForDomains = new HashSet<string>(discontinuedForDomains, StringComparer.OrdinalIgnoreCase);
4444
ExceptionsForEmailAddresses = new HashSet<string>(exceptionsForEmailAddresses, StringComparer.OrdinalIgnoreCase);
4545
ForceTransformationToOrganizationForEmailAddresses = new HashSet<string>(forceTransformationToOrganizationForEmailAddresses, StringComparer.OrdinalIgnoreCase);
46-
EnabledOrganizationAadTenants = new HashSet<OrganizationTenantPair>(enabledOrganizationAadTenants, new OrganizationTenantPairComparer());
46+
EnabledOrganizationAadTenants = new HashSet<OrganizationTenantPair>(enabledOrganizationAadTenants);
4747
IsPasswordDiscontinuedForAll = isPasswordDiscontinuedForAll;
4848
}
4949

@@ -87,6 +87,16 @@ public bool ShouldUserTransformIntoOrganization(User user)
8787

8888
public bool IsTenantIdPolicySupportedForOrganization(string emailAddress, string tenantId)
8989
{
90+
if (string.IsNullOrEmpty(emailAddress))
91+
{
92+
throw new ArgumentException(nameof(emailAddress));
93+
}
94+
95+
if (string.IsNullOrEmpty(tenantId))
96+
{
97+
throw new ArgumentException(nameof(tenantId));
98+
}
99+
90100
return EnabledOrganizationAadTenants.Contains(new OrganizationTenantPair(new MailAddress(emailAddress).Host, tenantId));
91101
}
92102

@@ -105,7 +115,7 @@ public interface ILoginDiscontinuationConfiguration
105115
bool IsTenantIdPolicySupportedForOrganization(string emailAddress, string tenantId);
106116
}
107117

108-
public class OrganizationTenantPair
118+
public class OrganizationTenantPair : IEquatable<OrganizationTenantPair>
109119
{
110120
public string EmailDomain { get; }
111121
public string TenantId { get; }
@@ -116,25 +126,28 @@ public OrganizationTenantPair(string emailDomain, string tenantId)
116126
EmailDomain = emailDomain ?? throw new ArgumentNullException(nameof(emailDomain));
117127
TenantId = tenantId ?? throw new ArgumentNullException(nameof(tenantId));
118128
}
119-
}
120129

121-
public class OrganizationTenantPairComparer : IEqualityComparer<OrganizationTenantPair>
122-
{
123-
public bool Equals(OrganizationTenantPair x, OrganizationTenantPair y)
130+
public override bool Equals(object obj)
124131
{
125-
if (x == null || y == null)
126-
{
127-
return x == null && y == null;
128-
}
132+
return Equals(obj as OrganizationTenantPair);
133+
}
129134

130-
return
131-
string.Equals(x.EmailDomain, y.EmailDomain, StringComparison.OrdinalIgnoreCase) &&
132-
string.Equals(x.TenantId, y.TenantId, StringComparison.OrdinalIgnoreCase);
135+
public bool Equals(OrganizationTenantPair other)
136+
{
137+
return other != null &&
138+
string.Equals(EmailDomain, other.EmailDomain, StringComparison.OrdinalIgnoreCase) &&
139+
string.Equals(TenantId, other.TenantId, StringComparison.OrdinalIgnoreCase);
133140
}
134141

135-
public int GetHashCode(OrganizationTenantPair obj)
142+
/// <remarks>
143+
/// Autogenerated by "Quick Actions and Refactoring" -> "Generate Equals and GetHashCode".
144+
/// </remarks>
145+
public override int GetHashCode()
136146
{
137-
return obj.EmailDomain.GetHashCode() ^ obj.TenantId.GetHashCode();
147+
var hashCode = -1334890813;
148+
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(EmailDomain.ToLowerInvariant());
149+
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(TenantId.ToLowerInvariant());
150+
return hashCode;
138151
}
139152
}
140153
}

src/NuGetGallery/Services/UserService.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Linq;
99
using System.Text.RegularExpressions;
1010
using System.Threading.Tasks;
11+
using Microsoft.Extensions.Logging;
1112
using NuGet.Services.Entities;
1213
using NuGetGallery.Auditing;
1314
using NuGetGallery.Configuration;
@@ -39,6 +40,8 @@ public class UserService : IUserService
3940

4041
public ITelemetryService TelemetryService { get; protected set; }
4142

43+
public ILogger<UserService> Logger { get; protected set; }
44+
4245
protected UserService() { }
4346

4447
public UserService(
@@ -52,7 +55,8 @@ public UserService(
5255
ISecurityPolicyService securityPolicyService,
5356
IDateTimeProvider dateTimeProvider,
5457
ICredentialBuilder credentialBuilder,
55-
ITelemetryService telemetryService)
58+
ITelemetryService telemetryService,
59+
ILogger<UserService> logger)
5660
: this()
5761
{
5862
Config = config;
@@ -65,6 +69,7 @@ public UserService(
6569
SecurityPolicyService = securityPolicyService;
6670
DateTimeProvider = dateTimeProvider;
6771
TelemetryService = telemetryService;
72+
Logger = logger;
6873
}
6974

7075
public async Task<MembershipRequest> AddMembershipRequestAsync(Organization organization, string memberName, bool isAdmin)
@@ -591,12 +596,21 @@ public async Task<Organization> AddOrganizationAsync(string username, string ema
591596
private async Task SubscribeOrganizationToTenantPolicyIfTenantIdIsSupported(User organization, User adminUser, bool commitChanges = true)
592597
{
593598
var tenantId = adminUser.Credentials.GetAzureActiveDirectoryCredential()?.TenantId;
594-
if (string.IsNullOrWhiteSpace(tenantId) ||
595-
!ContentObjectService.LoginDiscontinuationConfiguration.IsTenantIdPolicySupportedForOrganization(organization.EmailAddress ?? organization.UnconfirmedEmailAddress, tenantId))
599+
if (string.IsNullOrEmpty(tenantId))
600+
{
601+
Logger.LogInformation("Will not apply tenant policy to organization because admin user does not have an AAD credential.");
602+
return;
603+
}
604+
605+
if (!ContentObjectService.LoginDiscontinuationConfiguration.IsTenantIdPolicySupportedForOrganization(
606+
organization.EmailAddress ?? organization.UnconfirmedEmailAddress,
607+
tenantId))
596608
{
609+
Logger.LogInformation("Will not apply tenant policy to organization because policy is not supported for email-tenant pair.");
597610
return;
598611
}
599612

613+
Logger.LogInformation("Applying tenant policy to organization.");
600614
var tenantPolicy = RequireOrganizationTenantPolicy.Create(tenantId);
601615
await SecurityPolicyService.SubscribeAsync(organization, tenantPolicy, commitChanges);
602616
}

tests/NuGetGallery.Facts/Services/ContentObjectServiceFacts.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,10 @@ public async Task RefreshRefreshesObject()
113113
typosquattingConfiguration = service.TyposquattingConfiguration as TyposquattingConfiguration;
114114

115115
// Assert
116-
Assert.True(loginDiscontinuationConfiguration.DiscontinuedForEmailAddresses.SequenceEqual(emails));
117-
Assert.True(loginDiscontinuationConfiguration.DiscontinuedForDomains.SequenceEqual(domains));
118-
Assert.True(loginDiscontinuationConfiguration.ExceptionsForEmailAddresses.SequenceEqual(exceptions));
119-
Assert.True(loginDiscontinuationConfiguration.EnabledOrganizationAadTenants.SequenceEqual(orgTenantPairs, new OrganizationTenantPairComparer()));
116+
Assert.Equal(emails, loginDiscontinuationConfiguration.DiscontinuedForEmailAddresses);
117+
Assert.Equal(domains, loginDiscontinuationConfiguration.DiscontinuedForDomains);
118+
Assert.Equal(exceptions, loginDiscontinuationConfiguration.ExceptionsForEmailAddresses);
119+
Assert.Equal(orgTenantPairs, loginDiscontinuationConfiguration.EnabledOrganizationAadTenants);
120120

121121
Assert.True(certificatesConfiguration.IsUIEnabledByDefault);
122122
Assert.Equal(alwaysEnabledForDomains, certificatesConfiguration.AlwaysEnabledForDomains);

0 commit comments

Comments
 (0)