< Summary

Information
Class: Elsa.Authorization.PermissionEvaluator
Assembly: Elsa.Api.Common
File(s): /home/runner/work/elsa-core/elsa-core/src/common/Elsa.Api.Common/Authorization/PermissionEvaluator.cs
Line coverage
90%
Covered lines: 9
Uncovered lines: 1
Coverable lines: 10
Total lines: 49
Line coverage: 90%
Branch coverage
100%
Covered branches: 8
Total branches: 8
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Shared()100%210%
HasPermission(...)100%22100%
HasPermission(...)100%11100%
HasAllPermissions(...)100%11100%
GetGrants(...)100%22100%
EnumerateGrants()100%44100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/common/Elsa.Api.Common/Authorization/PermissionEvaluator.cs

#LineLine coverage
 1using System.Security.Claims;
 2
 3namespace Elsa.Authorization;
 4
 5/// <inheritdoc />
 6public sealed class PermissionEvaluator : IPermissionEvaluator
 7{
 8    /// <summary>
 9    /// A shared instance for call sites that cannot reach dependency injection, such as SignalR hub
 10    /// helpers. The evaluator holds no state, so sharing one is safe.
 11    /// </summary>
 012    public static IPermissionEvaluator Shared { get; } = new PermissionEvaluator();
 13
 14    /// <inheritdoc />
 15    public bool HasPermission(ClaimsPrincipal? principal, Permission required)
 16    {
 8517        return principal is not null && EnumerateGrants(principal).Any(granted => PermissionMatcher.Satisfies(granted, r
 18    }
 19
 20    /// <inheritdoc />
 1121    public bool HasPermission(ClaimsPrincipal? principal, string resource, string verb) => HasPermission(principal, new(
 22
 23    /// <inheritdoc />
 24    public bool HasAllPermissions(ClaimsPrincipal? principal, IEnumerable<Permission> required)
 25    {
 326        var grants = GetGrants(principal);
 827        return required.All(x => PermissionMatcher.Satisfies(grants, x));
 28    }
 29
 30    /// <inheritdoc />
 31    public IReadOnlyCollection<Permission> GetGrants(ClaimsPrincipal? principal)
 32    {
 633        return principal is null ? [] : EnumerateGrants(principal).Distinct().ToArray();
 34    }
 35
 36    /// <remarks>
 37    /// Reads Elsa's own permission claim type. Elsa is the only authority that expands roles into
 38    /// permission claims (ADR 0009), and this model no longer uses the FastEndpoints permission mechanism,
 39    /// so its separately configurable claim type is not consulted.
 40    /// </remarks>
 41    private static IEnumerable<Permission> EnumerateGrants(ClaimsPrincipal principal)
 42    {
 16443        foreach (var claim in principal.FindAll(PermissionNames.ClaimType))
 44        {
 5545            if (Permission.TryParse(claim.Value, out var permission))
 5246                yield return permission;
 47        }
 948    }
 49}