< Summary

Information
Class: LGDXRobotCloud.API.Authorisation.ValidateLgdxUserAccessHandler
Assembly: LGDXRobotCloud.API
File(s): /builds/yukaitung/lgdxrobot2-cloud/LGDXRobotCloud.API/Authorisation/ValidateLgdxUserAccessHandler.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 71
Coverable lines: 71
Total lines: 106
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 46
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)0%620%
IsValidApplication(...)100%210%
HasAccess(...)0%110100%
HasAreaAccess(...)0%2040%
HasControllerAccess(...)0%2040%
HandleRequirementAsync(...)0%702260%

File(s)

/builds/yukaitung/lgdxrobot2-cloud/LGDXRobotCloud.API/Authorisation/ValidateLgdxUserAccessHandler.cs

#LineLine coverage
 1using System.Security.Claims;
 2using Microsoft.AspNetCore.Authorization;
 3
 4namespace LGDXRobotCloud.API.Authorisation;
 5
 06public class ValidateLgdxUserAccessHandler(
 07  IHttpContextAccessor httpContextAccessor
 08) : AuthorizationHandler<ValidateLgdxUserAccessRequirement>
 9{
 010  private readonly HttpContext _httpContext = httpContextAccessor.HttpContext ?? throw new ArgumentException(nameof(http
 11
 12  private static bool IsValidApplication(string str)
 013  {
 014    return string.Equals(str, "LGDXRobotCloud.API", StringComparison.CurrentCultureIgnoreCase);
 015  }
 16
 17  private bool HasAccess(string str)
 018  {
 019    string method = _httpContext.Request.Method;
 020    if (string.Equals(str, "FullAccess", StringComparison.CurrentCultureIgnoreCase))
 021    {
 22      // Has full access
 023      return true;
 24    }
 025    if (string.Equals(str, "Read", StringComparison.CurrentCultureIgnoreCase))
 026    {
 27      // Has read access
 028      return string.Equals(method, "GET", StringComparison.CurrentCultureIgnoreCase);
 29    }
 030    else if (string.Equals(str, "Write", StringComparison.CurrentCultureIgnoreCase))
 031    {
 32      // Has write access
 033      return string.Equals(method, "POST", StringComparison.CurrentCultureIgnoreCase) ||
 034             string.Equals(method, "PUT", StringComparison.CurrentCultureIgnoreCase);
 35    }
 036    else if (string.Equals(str, "Delete", StringComparison.CurrentCultureIgnoreCase))
 037    {
 38      // Has delete access
 039      return string.Equals(method, "DELETE", StringComparison.CurrentCultureIgnoreCase);
 40    }
 041    return false;
 042  }
 43
 44  private bool HasAreaAccess(string str)
 045  {
 046    string? area = _httpContext.Request.RouteValues["area"]?.ToString();
 047    if (string.IsNullOrEmpty(area))
 048    {
 049      return false;
 50    }
 051    return string.Equals(area, str, StringComparison.CurrentCultureIgnoreCase);
 052  }
 53
 54  private bool HasControllerAccess(string str)
 055  {
 056    string? controller = _httpContext.Request.RouteValues["controller"]?.ToString();
 057    if (string.IsNullOrEmpty(controller))
 058    {
 059      return false;
 60    }
 061    return string.Equals(controller, str, StringComparison.CurrentCultureIgnoreCase);
 062  }
 63
 64  protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ValidateLgdxUserAccessRequirement 
 065  {
 066    List<Claim> scopes = context.User.FindAll(c => c.Type == "scope").ToList();
 67    // Extract scope
 68    // format: LGDXRobotCloud.API/Area/Controller/<Access>
 069    foreach (Claim scope in scopes)
 070    {
 071      var scopeSplit = scope.Value.Split("/");
 072      if (scopeSplit.Length == 2)
 073      {
 74        // format: LGDXRobotCloud.API/<Access>
 075        if (IsValidApplication(scopeSplit[0]) && HasAccess(scopeSplit[1]))
 076        {
 077          context.Succeed(requirement);
 078          return Task.CompletedTask;
 79        }
 080      }
 081      else if (scopeSplit.Length == 3)
 082      {
 83        // format: LGDXRobotCloud.API/Area/<Access>
 084        if (IsValidApplication(scopeSplit[0]) && HasAreaAccess(scopeSplit[1]) && HasAccess(scopeSplit[2]))
 085        {
 086          context.Succeed(requirement);
 087          return Task.CompletedTask;
 88        }
 089      }
 090      else if (scopeSplit.Length == 4)
 091      {
 92        // format: LGDXRobotCloud.API/Area/Controller/<Access>
 093        if (IsValidApplication(scopeSplit[0]) &&
 094            HasAreaAccess(scopeSplit[1]) &&
 095            HasControllerAccess(scopeSplit[2]) &&
 096            HasAccess(scopeSplit[3]))
 097        {
 098          context.Succeed(requirement);
 099          return Task.CompletedTask;
 100        }
 0101      }
 0102    }
 0103    context.Fail();
 0104    return Task.CompletedTask;
 0105  }
 106}