diff --git a/Minecraft-Realms-Emulator/Attributes/RequireMinecraftCookieAttribute.cs b/Minecraft-Realms-Emulator/Attributes/RequireMinecraftCookieAttribute.cs new file mode 100644 index 0000000..6bf810f --- /dev/null +++ b/Minecraft-Realms-Emulator/Attributes/RequireMinecraftCookieAttribute.cs @@ -0,0 +1,15 @@ +namespace Minecraft_Realms_Emulator.Attributes +{ + [AttributeUsage(AttributeTargets.Class)] + public class RequireMinecraftCookieAttribute : Attribute + { + public RequireMinecraftCookieAttribute() + { + } + + public bool HasMinecraftCookie(string cookie) + { + return cookie.Contains("sid") && cookie.Contains("user") && cookie.Contains("version"); + } + } +} diff --git a/Minecraft-Realms-Emulator/Controllers/InvitesController.cs b/Minecraft-Realms-Emulator/Controllers/InvitesController.cs index c51f24a..76ca189 100644 --- a/Minecraft-Realms-Emulator/Controllers/InvitesController.cs +++ b/Minecraft-Realms-Emulator/Controllers/InvitesController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Minecraft_Realms_Emulator.Attributes; using Minecraft_Realms_Emulator.Data; using Minecraft_Realms_Emulator.Entities; using Minecraft_Realms_Emulator.Requests; @@ -9,6 +10,7 @@ namespace Minecraft_Realms_Emulator.Controllers { [Route("[controller]")] [ApiController] + [RequireMinecraftCookie] public class InvitesController : ControllerBase { private readonly DataContext _context; diff --git a/Minecraft-Realms-Emulator/Controllers/McoController.cs b/Minecraft-Realms-Emulator/Controllers/McoController.cs index d4c7ebf..d7583cf 100644 --- a/Minecraft-Realms-Emulator/Controllers/McoController.cs +++ b/Minecraft-Realms-Emulator/Controllers/McoController.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using Minecraft_Realms_Emulator.Attributes; using Minecraft_Realms_Emulator.Data; using Minecraft_Realms_Emulator.Responses; @@ -6,6 +7,7 @@ namespace Minecraft_Realms_Emulator.Controllers { [Route("[controller]")] [ApiController] + [RequireMinecraftCookie] public class McoController : ControllerBase { private readonly DataContext _context; diff --git a/Minecraft-Realms-Emulator/Controllers/OpsController.cs b/Minecraft-Realms-Emulator/Controllers/OpsController.cs index 93f5b4d..72f1338 100644 --- a/Minecraft-Realms-Emulator/Controllers/OpsController.cs +++ b/Minecraft-Realms-Emulator/Controllers/OpsController.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using Minecraft_Realms_Emulator.Attributes; using Minecraft_Realms_Emulator.Data; using Minecraft_Realms_Emulator.Responses; @@ -6,6 +7,7 @@ namespace Minecraft_Realms_Emulator.Controllers { [Route("[controller]")] [ApiController] + [RequireMinecraftCookie] public class OpsController : ControllerBase { private readonly DataContext _context; diff --git a/Minecraft-Realms-Emulator/Controllers/SubscriptionsController.cs b/Minecraft-Realms-Emulator/Controllers/SubscriptionsController.cs index 74892a8..e29d145 100644 --- a/Minecraft-Realms-Emulator/Controllers/SubscriptionsController.cs +++ b/Minecraft-Realms-Emulator/Controllers/SubscriptionsController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Minecraft_Realms_Emulator.Attributes; using Minecraft_Realms_Emulator.Data; using Minecraft_Realms_Emulator.Responses; @@ -7,6 +8,7 @@ namespace Minecraft_Realms_Emulator.Controllers { [Route("[controller]")] [ApiController] + [RequireMinecraftCookie] public class SubscriptionsController : ControllerBase { private readonly DataContext _context; diff --git a/Minecraft-Realms-Emulator/Controllers/TrialController.cs b/Minecraft-Realms-Emulator/Controllers/TrialController.cs index fdca4a2..b75fb56 100644 --- a/Minecraft-Realms-Emulator/Controllers/TrialController.cs +++ b/Minecraft-Realms-Emulator/Controllers/TrialController.cs @@ -1,10 +1,12 @@ using Microsoft.AspNetCore.Mvc; +using Minecraft_Realms_Emulator.Attributes; using Minecraft_Realms_Emulator.Data; namespace Minecraft_Realms_Emulator.Controllers { [Route("[controller]")] [ApiController] + [RequireMinecraftCookie] public class TrialController : ControllerBase { private readonly DataContext _context; diff --git a/Minecraft-Realms-Emulator/Controllers/WorldsController.cs b/Minecraft-Realms-Emulator/Controllers/WorldsController.cs index 2754678..80de8bd 100644 --- a/Minecraft-Realms-Emulator/Controllers/WorldsController.cs +++ b/Minecraft-Realms-Emulator/Controllers/WorldsController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Minecraft_Realms_Emulator.Attributes; using Minecraft_Realms_Emulator.Data; using Minecraft_Realms_Emulator.Entities; @@ -7,6 +8,7 @@ namespace Minecraft_Realms_Emulator.Controllers { [Route("[controller]")] [ApiController] + [RequireMinecraftCookie] public class WorldsController : ControllerBase { private readonly DataContext _context; diff --git a/Minecraft-Realms-Emulator/Middlewares/MinecraftCookieMiddleware.cs b/Minecraft-Realms-Emulator/Middlewares/MinecraftCookieMiddleware.cs new file mode 100644 index 0000000..1f34861 --- /dev/null +++ b/Minecraft-Realms-Emulator/Middlewares/MinecraftCookieMiddleware.cs @@ -0,0 +1,34 @@ +using Minecraft_Realms_Emulator.Attributes; +using System.Text; + +namespace Minecraft_Realms_Emulator.Middlewares +{ + public class MinecraftCookieMiddleware(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 (httpContext.Request.Headers.Cookie.ToString() == "") + { + httpContext.Response.StatusCode = 401; + await httpContext.Response.Body.WriteAsync(Encoding.UTF8.GetBytes("Authorization required")); + return; + } + + string cookie = httpContext.Request.Headers.Cookie.ToString(); + if (!attribute.HasMinecraftCookie(cookie)) throw new UnauthorizedAccessException("Malformed cookie header"); + + await _next(httpContext); + } + } +} diff --git a/Minecraft-Realms-Emulator/Program.cs b/Minecraft-Realms-Emulator/Program.cs index cb19d23..6ff4cc5 100644 --- a/Minecraft-Realms-Emulator/Program.cs +++ b/Minecraft-Realms-Emulator/Program.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Minecraft_Realms_Emulator.Data; using Minecraft_Realms_Emulator.Helpers; +using Minecraft_Realms_Emulator.Middlewares; using Npgsql; var builder = WebApplication.CreateBuilder(args); @@ -40,7 +41,7 @@ if (app.Environment.IsDevelopment()) app.UseSwaggerUI(); } -app.UseAuthorization(); +app.UseMiddleware(); app.MapControllers();