-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathRequireTwoManApprovalPolicy.cs
More file actions
55 lines (47 loc) · 2.04 KB
/
Copy pathRequireTwoManApprovalPolicy.cs
File metadata and controls
55 lines (47 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using IamRoles.State;
using ModularityKit.Mutator.Abstractions.Engine;
using ModularityKit.Mutator.Abstractions.Intent;
using ModularityKit.Mutator.Abstractions.Policies;
namespace IamRoles.Policies;
/// <summary>
/// Policy that requires second user approval for critical mutations in <see cref="UserPermissionsState"/>.
/// </summary>
public sealed class RequireTwoManApprovalPolicy
: IMutationPolicy<UserPermissionsState>
{
public string Name => "RequireTwoManApproval";
public int Priority => 100;
public string Description => "Requires second user approval for critical mutations.";
/// <summary>
/// Evaluates mutation against the policy.
/// Critical mutations must have a second approver that is different from the actor.
/// </summary>
/// <param name="mutation">The mutation being evaluated.</param>
/// <param name="state">The current user permissions state.</param>
/// <returns>A <see cref="PolicyDecision"/> indicating whether the mutation is allowed or denied.</returns>
public PolicyDecision Evaluate(
IMutation<UserPermissionsState> mutation,
UserPermissionsState state)
{
if (mutation.Intent.RiskLevel != MutationRiskLevel.Critical)
return PolicyDecision.Allow();
var context = mutation.Context;
if (!context.Metadata.TryGetValue("approvedBy", out var approvedObj))
{
return PolicyDecision.Deny(
"Critical mutation requires second approval (approvedBy missing)");
}
var approvers = approvedObj switch
{
string s => s.Split(',').Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)),
IEnumerable<string> arr => arr,
_ => [approvedObj?.ToString() ?? string.Empty]
};
if (approvers.Any(a => string.Equals(a, context.ActorId, StringComparison.OrdinalIgnoreCase)))
{
return PolicyDecision.Deny(
"Second approval must come from a different user");
}
return PolicyDecision.Allow();
}
}