diff --git a/Net.Vatprc.Uniapi/Controllers/SectorController.cs b/Net.Vatprc.Uniapi/Controllers/SectorController.cs index bda4fc9..19cb59e 100644 --- a/Net.Vatprc.Uniapi/Controllers/SectorController.cs +++ b/Net.Vatprc.Uniapi/Controllers/SectorController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc; using Net.Vatprc.Uniapi.Utils; using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Authorization; namespace Net.Vatprc.Uniapi.Controllers; @@ -11,7 +12,8 @@ namespace Net.Vatprc.Uniapi.Controllers; [ApiController, Route("api/sectors")] public class SectorController( VATPRCContext DbContext, - VatsimService VatsimService) : ControllerBase + ILogger Logger, + VatprcAtcService VatprcAtcService) : ControllerBase { public record SectorPermissionResponse { @@ -28,32 +30,26 @@ public SectorPermissionResponse(bool hasPermission) [ "Online Permission", "ATC Student", - "S3 Controller", - "S2 Controller", - "S1 Controller", - "C1 Controller", - "C3 Controller", ]; + protected IEnumerable FlattenRoles(IEnumerable Roles) + { + return Roles.SelectMany(r => FlattenRoles(r.AllSuperroles)).Concat(Roles); + } + [HttpGet("current/permission")] + [AllowAnonymous] public async Task GetPermission() { var user = await DbContext.User.FindAsync(this.GetUserId()) ?? throw new ApiError.UserNotFound(this.GetUserId()); - // FIXME: This is a temporary solution to allow the user to access the sector - if (user.Cid == "1638882") - { - return new SectorPermissionResponse(true); - } + var roles = await VatprcAtcService.GetUserRole(user.Cid); + var flattenRoles = FlattenRoles(roles); + Logger.LogInformation("User {Cid} has roles {Roles}", user.Cid, + string.Join(", ", flattenRoles.Select(r => r.Name))); + var hasPermission = flattenRoles.Any(r => AllowedRoles.Contains(r.Name)); - var controllers = await VatsimService.GetAtcList(); - var atc = controllers.FirstOrDefault(c => c.Id.ToString() == user.Cid); - if (atc == null) - { - return new SectorPermissionResponse(false); - } - var hasPermission = atc.Roles.Any(r => AllowedRoles.Contains(r.Name)); return new SectorPermissionResponse(hasPermission); } } diff --git a/Net.Vatprc.Uniapi/Program.cs b/Net.Vatprc.Uniapi/Program.cs index 42ccbf8..fb6c40a 100644 --- a/Net.Vatprc.Uniapi/Program.cs +++ b/Net.Vatprc.Uniapi/Program.cs @@ -226,6 +226,7 @@ error message example. RudiMetarService.ConfigureOn(builder); VatsimService.ConfigureOn(builder); +VatprcAtcService.ConfigureOn(builder); var app = builder.Build(); diff --git a/Net.Vatprc.Uniapi/Services/VatprcAtcService.cs b/Net.Vatprc.Uniapi/Services/VatprcAtcService.cs new file mode 100644 index 0000000..1875376 --- /dev/null +++ b/Net.Vatprc.Uniapi/Services/VatprcAtcService.cs @@ -0,0 +1,96 @@ +using System.Diagnostics; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Security.Cryptography; +using System.Text.Json.Serialization; +using Flurl; +using Flurl.Http; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.Tokens; + +namespace Net.Vatprc.Uniapi.Services; + +public class VatprcAtcService(IOptions Options, + IOptions TokenOptions) +{ + public static WebApplicationBuilder ConfigureOn(WebApplicationBuilder builder) + { + builder.Services.Configure