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); } } }