< Summary

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

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)50%22100%
IsValidApplication(...)100%11100%
HasAccess(...)100%1010100%
HasAreaAccess(...)75%44100%
HasControllerAccess(...)75%44100%
HandleRequirementAsync(...)100%2626100%

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
 1446public class ValidateLgdxUserAccessHandler(
 1447  IHttpContextAccessor httpContextAccessor
 1448) : AuthorizationHandler<ValidateLgdxUserAccessRequirement>
 9{
 14410  private readonly HttpContext _httpContext = httpContextAccessor.HttpContext ?? throw new ArgumentException(nameof(http
 11
 12  private static bool IsValidApplication(string str)
 14413  {
 14414    return string.Equals(str, "LGDXRobotCloud.API", StringComparison.CurrentCultureIgnoreCase);
 14415  }
 16
 17  private bool HasAccess(string str)
 6018  {
 6019    string method = _httpContext.Request.Method;
 6020    if (string.Equals(str, "FullAccess", StringComparison.CurrentCultureIgnoreCase))
 1221    {
 22      // Has full access
 1223      return true;
 24    }
 4825    if (string.Equals(str, "Read", StringComparison.CurrentCultureIgnoreCase))
 1226    {
 27      // Has read access
 1228      return string.Equals(method, "GET", StringComparison.CurrentCultureIgnoreCase);
 29    }
 3630    else if (string.Equals(str, "Write", StringComparison.CurrentCultureIgnoreCase))
 1231    {
 32      // Has write access
 1233      return string.Equals(method, "POST", StringComparison.CurrentCultureIgnoreCase) ||
 1234             string.Equals(method, "PUT", StringComparison.CurrentCultureIgnoreCase);
 35    }
 2436    else if (string.Equals(str, "Delete", StringComparison.CurrentCultureIgnoreCase))
 1237    {
 38      // Has delete access
 1239      return string.Equals(method, "DELETE", StringComparison.CurrentCultureIgnoreCase);
 40    }
 1241    return false;
 6042  }
 43
 44  private bool HasAreaAccess(string str)
 12145  {
 12146    string? area = _httpContext.Request.RouteValues["area"]?.ToString();
 12147    if (string.IsNullOrWhiteSpace(area))
 2048    {
 2049      return false;
 50    }
 10151    return string.Equals(area, str, StringComparison.CurrentCultureIgnoreCase);
 12152  }
 53
 54  private bool HasControllerAccess(string str)
 6055  {
 6056    string? controller = _httpContext.Request.RouteValues["controller"]?.ToString();
 6057    if (string.IsNullOrWhiteSpace(controller))
 2058    {
 2059      return false;
 60    }
 4061    return string.Equals(controller, str, StringComparison.CurrentCultureIgnoreCase);
 6062  }
 63
 64  protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ValidateLgdxUserAccessRequirement 
 14465  {
 28866    List<Claim> scopes = context.User.FindAll(c => c.Type == "scope").ToList();
 67    // Extract scope
 68    // format: LGDXRobotCloud.API/Area/Controller/<Access>
 69669    foreach (Claim scope in scopes)
 14470    {
 14471      var scopeSplit = scope.Value.Split("/");
 14472      if (scopeSplit.Length == 2)
 2173      {
 74        // format: LGDXRobotCloud.API/<Access>
 2175        if (IsValidApplication(scopeSplit[0]) && HasAccess(scopeSplit[1]))
 876        {
 877          context.Succeed(requirement);
 878          return Task.CompletedTask;
 79        }
 1380      }
 12381      else if (scopeSplit.Length == 3)
 6182      {
 83        // format: LGDXRobotCloud.API/Area/<Access>
 6184        if (IsValidApplication(scopeSplit[0]) && HasAreaAccess(scopeSplit[1]) && HasAccess(scopeSplit[2]))
 885        {
 886          context.Succeed(requirement);
 887          return Task.CompletedTask;
 88        }
 5389      }
 6290      else if (scopeSplit.Length == 4)
 6291      {
 92        // format: LGDXRobotCloud.API/Area/Controller/<Access>
 6293        if (IsValidApplication(scopeSplit[0]) &&
 6294            HasAreaAccess(scopeSplit[1]) &&
 6295            HasControllerAccess(scopeSplit[2]) &&
 6296            HasAccess(scopeSplit[3]))
 897        {
 898          context.Succeed(requirement);
 899          return Task.CompletedTask;
 100        }
 54101      }
 120102    }
 120103    context.Fail();
 120104    return Task.CompletedTask;
 144105  }
 106}