< Summary

Information
Class: Elsa.Requirements.LocalHostPermissionRequirementHandler
Assembly: Elsa.Api.Common
File(s): /home/runner/work/elsa-core/elsa-core/src/common/Elsa.Api.Common/Requirements/LocalHostPermissionRequirement.cs
Line coverage
13%
Covered lines: 4
Uncovered lines: 25
Coverable lines: 29
Total lines: 77
Line coverage: 13.7%
Branch coverage
0%
Covered branches: 0
Total branches: 12
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%210%
.ctor(...)100%210%
.ctor(...)100%11100%
HandleRequirementAsync(...)0%110100%
HasBootstrapPermissions(...)0%620%

File(s)

/home/runner/work/elsa-core/elsa-core/src/common/Elsa.Api.Common/Requirements/LocalHostPermissionRequirement.cs

#LineLine coverage
 1using System.Security.Claims;
 2using Elsa.Extensions;
 3using Elsa.Options;
 4using JetBrains.Annotations;
 5using Microsoft.AspNetCore.Authentication.JwtBearer;
 6using Microsoft.AspNetCore.Authorization;
 7using Microsoft.AspNetCore.Http;
 8using Microsoft.Extensions.Options;
 9
 10namespace Elsa.Requirements;
 11
 12/// <summary>
 13/// Adds security-root bootstrap permissions to the current user when explicit localhost permission grants are enabled a
 14/// </summary>
 15public class LocalHostPermissionRequirement : IAuthorizationRequirement
 16{
 17}
 18
 19/// <inheritdoc />
 20[PublicAPI]
 21public class LocalHostPermissionRequirementHandler : AuthorizationHandler<LocalHostPermissionRequirement>
 22{
 023    private static readonly string[] BootstrapPermissions =
 024    [
 025        "create:application",
 026        "create:user",
 027        "create:role"
 028    ];
 29
 30    private readonly IHttpContextAccessor _httpContextAccessor;
 31    private readonly IOptions<LocalHostPermissionRequirementOptions> _options;
 32
 33    /// <inheritdoc />
 034    public LocalHostPermissionRequirementHandler(IHttpContextAccessor httpContextAccessor) : this(
 035        httpContextAccessor,
 036        Microsoft.Extensions.Options.Options.Create(new LocalHostPermissionRequirementOptions()))
 37    {
 038    }
 39
 40    /// <inheritdoc />
 29341    public LocalHostPermissionRequirementHandler(IHttpContextAccessor httpContextAccessor, IOptions<LocalHostPermissionR
 42    {
 29343        _httpContextAccessor = httpContextAccessor;
 29344        _options = options;
 29345    }
 46
 47    /// <inheritdoc />
 48    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, LocalHostPermissionRequirement r
 49    {
 050        if (!_options.Value.EnableLocalHostPermissionGrant)
 051            return Task.CompletedTask;
 52
 053        if (_httpContextAccessor.HttpContext?.Request.IsLocal() != true)
 054            return Task.CompletedTask;
 55
 056        if (context.User.Identities.Any(x => x.IsAuthenticated))
 57        {
 058            if (HasBootstrapPermissions(context.User))
 059                context.Succeed(requirement);
 60
 061            return Task.CompletedTask;
 62        }
 63
 064        var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
 065        identity.AddClaims(BootstrapPermissions.Select(permission => new Claim(PermissionNames.ClaimType, permission)));
 066        context.User.AddIdentity(identity);
 67
 068        context.Succeed(requirement);
 069        return Task.CompletedTask;
 70    }
 71
 72    private static bool HasBootstrapPermissions(ClaimsPrincipal user)
 73    {
 074        var permissions = user.FindAll(PermissionNames.ClaimType).Select(x => x.Value).ToHashSet(StringComparer.Ordinal)
 075        return permissions.Contains(PermissionNames.All) || BootstrapPermissions.All(permissions.Contains);
 76    }
 77}