using System.Security.Claims;
namespace Nuuru.Server.Auth
{
///
/// Utility class for calculating effective permissions based on roles, user permissions, and denials.
///
public static class PermissionCalculator
{
///
/// Computes effective permissions using the formula: (rolePermissions ∪ userPermissions) \ userDenials
///
/// Permissions granted by roles
/// Permissions granted directly to the user
/// Permissions explicitly denied to the user
/// The effective set of permissions after applying denials
public static IEnumerable ComputeEffectivePermissions(
IEnumerable rolePermissions,
IEnumerable userAllowPermissions,
IEnumerable userDenyPermissions)
{
var roleAllows = new HashSet(rolePermissions, StringComparer.OrdinalIgnoreCase);
var userAllows = new HashSet(userAllowPermissions, StringComparer.OrdinalIgnoreCase);
var userDenies = new HashSet(userDenyPermissions, StringComparer.OrdinalIgnoreCase);
// Effective = (roleAllows ∪ userAllows) \ userDenies
var effective = roleAllows.Union(userAllows).Except(userDenies);
return effective.ToList();
}
///
/// Computes effective permissions from claims.
///
/// Claims from user's roles
/// Claims directly assigned to the user
/// The effective set of permissions after applying denials
public static IEnumerable ComputeEffectivePermissionsFromClaims(
IEnumerable roleClaims,
IEnumerable userClaims)
{
var rolePermissions = roleClaims
.Where(c => c.Type == Permissions.ClaimType)
.Select(c => c.Value);
var userAllowPermissions = userClaims
.Where(c => c.Type == Permissions.ClaimType)
.Select(c => c.Value);
var userDenyPermissions = userClaims
.Where(c => c.Type == Permissions.DenyClaimType)
.Select(c => c.Value);
return ComputeEffectivePermissions(rolePermissions, userAllowPermissions, userDenyPermissions);
}
}
}