diff --git a/Minecraft-Realms-Emulator/Attributes/RequireAdminKeyAttribute.cs b/Minecraft-Realms-Emulator/Attributes/RequireAdminKeyAttribute.cs new file mode 100644 index 0000000..1b26b3a --- /dev/null +++ b/Minecraft-Realms-Emulator/Attributes/RequireAdminKeyAttribute.cs @@ -0,0 +1,11 @@ +namespace Minecraft_Realms_Emulator.Attributes +{ + [AttributeUsage(AttributeTargets.Class)] + public class RequireAdminKeyAttribute : Attribute + { + public bool HasAdminKey(string authorization) + { + return authorization != null && authorization == Environment.GetEnvironmentVariable("ADMIN_KEY"); + } + } +} diff --git a/Minecraft-Realms-Emulator/Controllers/ConfigurationController.cs b/Minecraft-Realms-Emulator/Controllers/Admin/ConfigurationController.cs similarity index 80% rename from Minecraft-Realms-Emulator/Controllers/ConfigurationController.cs rename to Minecraft-Realms-Emulator/Controllers/Admin/ConfigurationController.cs index d693725..1dd5af7 100644 --- a/Minecraft-Realms-Emulator/Controllers/ConfigurationController.cs +++ b/Minecraft-Realms-Emulator/Controllers/Admin/ConfigurationController.cs @@ -1,12 +1,14 @@ using Microsoft.AspNetCore.Mvc; +using Minecraft_Realms_Emulator.Attributes; using Minecraft_Realms_Emulator.Data; using Minecraft_Realms_Emulator.Entities; using Minecraft_Realms_Emulator.Helpers; -namespace Minecraft_Realms_Emulator.Controllers +namespace Minecraft_Realms_Emulator.Controllers.Admin { - [Route("[controller]")] + [Route("api/admin/[controller]")] [ApiController] + [RequireAdminKey] public class ConfigurationController : ControllerBase { private readonly DataContext _context; diff --git a/Minecraft-Realms-Emulator/Middlewares/AdminKeyMiddleware.cs b/Minecraft-Realms-Emulator/Middlewares/AdminKeyMiddleware.cs new file mode 100644 index 0000000..a89434b --- /dev/null +++ b/Minecraft-Realms-Emulator/Middlewares/AdminKeyMiddleware.cs @@ -0,0 +1,30 @@ +using Minecraft_Realms_Emulator.Attributes; + +namespace Minecraft_Realms_Emulator.Middlewares +{ + public class AdminKeyMiddleware(RequestDelegate next) + { + private readonly RequestDelegate _next = next; + + public async Task Invoke(HttpContext httpContext) + { + var endpoint = httpContext.GetEndpoint(); + var attribute = endpoint?.Metadata.GetMetadata(); + + if (attribute == null) + { + await _next(httpContext); + return; + } + + if (!attribute.HasAdminKey(httpContext.Request.Headers.Authorization)) + { + httpContext.Response.StatusCode = 403; + await httpContext.Response.WriteAsync("You don't have access to this resource"); + return; + } + + await _next(httpContext); + } + } +} diff --git a/Minecraft-Realms-Emulator/Program.cs b/Minecraft-Realms-Emulator/Program.cs index 51c27ae..6110a83 100644 --- a/Minecraft-Realms-Emulator/Program.cs +++ b/Minecraft-Realms-Emulator/Program.cs @@ -90,12 +90,13 @@ if (mode.Value == nameof(WorkModeEnum.REALMS)) } } -var rewriteOptions = new RewriteOptions().AddRewrite(@"^(?!configuration)(.*)$", $"modes/{mode.Value}/$1", true); +var rewriteOptions = new RewriteOptions().AddRewrite(@"^(?!api)(.*)$", $"modes/{mode.Value}/$1", true); app.UseRewriter(rewriteOptions); app.UseMiddleware(); app.UseMiddleware(); app.UseMiddleware(); +app.UseMiddleware(); Console.WriteLine($"Running in {mode.Value} mode"); app.Run();