1
0
mirror of https://github.com/bitwarden/server.git synced 2025-05-22 12:04:27 -05:00

Add organization policy requirement query and two-factor policy requirement classes, and update PolicyServiceCollectionExtensions to include new services

This commit is contained in:
Rui Tome 2025-05-22 15:59:57 +01:00
parent 2fef097d2c
commit 8a3757654f
No known key found for this signature in database
GPG Key ID: 526239D96A8EC066
3 changed files with 71 additions and 0 deletions

View File

@ -0,0 +1,26 @@
#nullable enable
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.PolicyRequirements;
using Bit.Core.AdminConsole.Repositories;
namespace Bit.Core.AdminConsole.OrganizationFeatures.Policies.Implementations;
public class OrganizationPolicyRequirementQuery(
IPolicyRepository policyRepository,
IEnumerable<IOrganizationPolicyRequirementFactory<IPolicyRequirement>> factories)
: IOrganizationPolicyRequirementQuery
{
public async Task<T> GetAsync<T>(Guid organizationId) where T : IPolicyRequirement
{
var factory = factories.OfType<IOrganizationPolicyRequirementFactory<T>>().SingleOrDefault();
if (factory is null)
{
throw new NotImplementedException("No Organization Requirement Factory found for " + typeof(T));
}
var policy = await policyRepository.GetByOrganizationIdTypeAsync(organizationId, factory.PolicyType);
var requirement = factory.Create(policy);
return requirement;
}
}

View File

@ -0,0 +1,38 @@
#nullable enable
using Bit.Core.AdminConsole.Entities;
using Bit.Core.AdminConsole.Enums;
namespace Bit.Core.AdminConsole.OrganizationFeatures.Policies.PolicyRequirements;
/// <summary>
/// Policy requirements for the Two-Factor Authentication policy at the organization level.
/// </summary>
public class OrganizationTwoFactorPolicyRequirement : IPolicyRequirement
{
private readonly Policy? _policy;
public OrganizationTwoFactorPolicyRequirement(Policy? policy)
{
_policy = policy;
}
/// <summary>
/// Determines if the organization requires two-factor authentication.
/// </summary>
public bool IsRequired => _policy != null && _policy.Enabled;
}
/// <summary>
/// Organization policy requirement factory for the Require Two-Factor Authentication policy.
/// </summary>
public class OrganizationTwoFactorPolicyRequirementFactory
: IOrganizationPolicyRequirementFactory<OrganizationTwoFactorPolicyRequirement>
{
public PolicyType PolicyType => PolicyType.TwoFactorAuthentication;
public OrganizationTwoFactorPolicyRequirement Create(Policy? policy)
{
return new OrganizationTwoFactorPolicyRequirement(policy);
}
}

View File

@ -14,9 +14,11 @@ public static class PolicyServiceCollectionExtensions
services.AddScoped<IPolicyService, PolicyService>();
services.AddScoped<ISavePolicyCommand, SavePolicyCommand>();
services.AddScoped<IPolicyRequirementQuery, PolicyRequirementQuery>();
services.AddScoped<IOrganizationPolicyRequirementQuery, OrganizationPolicyRequirementQuery>();
services.AddPolicyValidators();
services.AddPolicyRequirements();
services.AddOrganizationPolicyRequirements();
}
private static void AddPolicyValidators(this IServiceCollection services)
@ -38,4 +40,9 @@ public static class PolicyServiceCollectionExtensions
services.AddScoped<IPolicyRequirementFactory<IPolicyRequirement>, RequireSsoPolicyRequirementFactory>();
services.AddScoped<IPolicyRequirementFactory<IPolicyRequirement>, RequireTwoFactorPolicyRequirementFactory>();
}
private static void AddOrganizationPolicyRequirements(this IServiceCollection services)
{
services.AddScoped<IOrganizationPolicyRequirementFactory<IPolicyRequirement>, OrganizationRequireTwoFactorPolicyRequirementFactory>();
}
}