From ab237667a3a658215144f103d4deec6e4b50da5e Mon Sep 17 00:00:00 2001 From: CyberL1 Date: Sat, 25 May 2024 18:33:52 +0200 Subject: [PATCH] feat(realms): check for active subscription --- .../Attributes/CheckActiveSubscription.cs | 13 +++++++ .../ActiveSubscriptionMiddleware.cs | 35 +++++++++++++++++++ .../Modes/Realms/InvitesController.cs | 2 ++ .../Modes/Realms/OpsController.cs | 2 ++ .../Modes/Realms/WorldsController.cs | 6 ++++ Minecraft-Realms-Emulator/Program.cs | 1 + 6 files changed, 59 insertions(+) create mode 100644 Minecraft-Realms-Emulator/Attributes/CheckActiveSubscription.cs create mode 100644 Minecraft-Realms-Emulator/Middlewares/ActiveSubscriptionMiddleware.cs diff --git a/Minecraft-Realms-Emulator/Attributes/CheckActiveSubscription.cs b/Minecraft-Realms-Emulator/Attributes/CheckActiveSubscription.cs new file mode 100644 index 0000000..2d11ab6 --- /dev/null +++ b/Minecraft-Realms-Emulator/Attributes/CheckActiveSubscription.cs @@ -0,0 +1,13 @@ +using Minecraft_Realms_Emulator.Entities; + +namespace Minecraft_Realms_Emulator.Attributes +{ + [AttributeUsage(AttributeTargets.Method)] + public class CheckActiveSubscription : Attribute + { + public bool IsSubscriptionActive(DateTime subscriptionStartDate) + { + return ((DateTimeOffset)subscriptionStartDate.AddDays(30) - DateTime.Today).Days > 0; + } + } +} diff --git a/Minecraft-Realms-Emulator/Middlewares/ActiveSubscriptionMiddleware.cs b/Minecraft-Realms-Emulator/Middlewares/ActiveSubscriptionMiddleware.cs new file mode 100644 index 0000000..71dd41e --- /dev/null +++ b/Minecraft-Realms-Emulator/Middlewares/ActiveSubscriptionMiddleware.cs @@ -0,0 +1,35 @@ +using Minecraft_Realms_Emulator.Attributes; +using Minecraft_Realms_Emulator.Data; +using Minecraft_Realms_Emulator.Entities; + +namespace Minecraft_Realms_Emulator.Middlewares +{ + public class ActiveSubscriptionMiddleware(RequestDelegate next) + { + private readonly RequestDelegate _next = next; + + public async Task Invoke(HttpContext httpContext, DataContext db) + { + var endpoint = httpContext.GetEndpoint(); + var attribute = endpoint?.Metadata.GetMetadata(); + + if (attribute == null) + { + await _next(httpContext); + return; + } + + Subscription subscription = db.Subscriptions.First(s => s.World.Id == int.Parse(httpContext.Request.RouteValues["wId"].ToString())); + Console.WriteLine(attribute.IsSubscriptionActive(subscription.StartDate)); + + if (!attribute.IsSubscriptionActive(subscription.StartDate)) + { + httpContext.Response.StatusCode = 403; + await httpContext.Response.WriteAsync("You don't have an active subscription for this world"); + return; + } + + await _next(httpContext); + } + } +} diff --git a/Minecraft-Realms-Emulator/Modes/Realms/InvitesController.cs b/Minecraft-Realms-Emulator/Modes/Realms/InvitesController.cs index ef2b21d..a48c24e 100644 --- a/Minecraft-Realms-Emulator/Modes/Realms/InvitesController.cs +++ b/Minecraft-Realms-Emulator/Modes/Realms/InvitesController.cs @@ -95,6 +95,7 @@ namespace Minecraft_Realms_Emulator.Modes.Realms [HttpPost("{wId}")] [CheckRealmOwner] + [CheckActiveSubscription] public async Task> InvitePlayer(int wId, PlayerRequest body) { string cookie = Request.Headers.Cookie; @@ -139,6 +140,7 @@ namespace Minecraft_Realms_Emulator.Modes.Realms [HttpDelete("{wId}/invite/{uuid}")] [CheckRealmOwner] + [CheckActiveSubscription] public async Task> DeleteInvite(int wId, string uuid) { var world = await _context.Worlds.FirstOrDefaultAsync(w => w.Id == wId); diff --git a/Minecraft-Realms-Emulator/Modes/Realms/OpsController.cs b/Minecraft-Realms-Emulator/Modes/Realms/OpsController.cs index 38c5628..5fc25e5 100644 --- a/Minecraft-Realms-Emulator/Modes/Realms/OpsController.cs +++ b/Minecraft-Realms-Emulator/Modes/Realms/OpsController.cs @@ -19,6 +19,7 @@ namespace Minecraft_Realms_Emulator.Modes.Realms [HttpPost("{wId}/{uuid}")] [CheckRealmOwner] + [CheckActiveSubscription] public ActionResult OpPlayer(int wId, string uuid) { var ops = _context.Players.Where(p => p.World.Id == wId && p.Operator == true).ToList(); @@ -48,6 +49,7 @@ namespace Minecraft_Realms_Emulator.Modes.Realms [HttpDelete("{wId}/{uuid}")] [CheckRealmOwner] + [CheckActiveSubscription] public ActionResult DeopPlayer(int wId, string uuid) { var ops = _context.Players.Where(p => p.World.Id == wId && p.Operator == true).ToList(); diff --git a/Minecraft-Realms-Emulator/Modes/Realms/WorldsController.cs b/Minecraft-Realms-Emulator/Modes/Realms/WorldsController.cs index e6b9579..d984f5e 100644 --- a/Minecraft-Realms-Emulator/Modes/Realms/WorldsController.cs +++ b/Minecraft-Realms-Emulator/Modes/Realms/WorldsController.cs @@ -298,6 +298,7 @@ namespace Minecraft_Realms_Emulator.Modes.Realms [HttpPost("{wId}/reset")] [CheckRealmOwner] + [CheckActiveSubscription] public ActionResult Reset(int wId) { Console.WriteLine($"Resetting world {wId}"); @@ -306,6 +307,7 @@ namespace Minecraft_Realms_Emulator.Modes.Realms [HttpPut("{wId}/open")] [CheckRealmOwner] + [CheckActiveSubscription] public async Task> Open(int wId) { var worlds = await _context.Worlds.ToListAsync(); @@ -333,6 +335,7 @@ namespace Minecraft_Realms_Emulator.Modes.Realms [HttpPut("{wId}/close")] [CheckRealmOwner] + [CheckActiveSubscription] public async Task> Close(int wId) { var worlds = await _context.Worlds.ToListAsync(); @@ -360,6 +363,7 @@ namespace Minecraft_Realms_Emulator.Modes.Realms [HttpPost("{wId}")] [CheckRealmOwner] + [CheckActiveSubscription] public async Task> UpdateWorld(int wId, WorldCreateRequest body) { var worlds = await _context.Worlds.ToListAsync(); @@ -378,6 +382,7 @@ namespace Minecraft_Realms_Emulator.Modes.Realms [HttpPost("{wId}/slot/{sId}")] [CheckRealmOwner] + [CheckActiveSubscription] public async Task> UpdateSlotAsync(int wId, int sId, SlotOptionsRequest body) { var slots = await _context.Slots.Where(s => s.World.Id == wId).ToListAsync(); @@ -401,6 +406,7 @@ namespace Minecraft_Realms_Emulator.Modes.Realms [HttpPut("{wId}/slot/{sId}")] [CheckRealmOwner] + [CheckActiveSubscription] public ActionResult SwitchSlot(int wId, int sId) { var world = _context.Worlds.Find(wId); diff --git a/Minecraft-Realms-Emulator/Program.cs b/Minecraft-Realms-Emulator/Program.cs index f3dccdf..3ad98dd 100644 --- a/Minecraft-Realms-Emulator/Program.cs +++ b/Minecraft-Realms-Emulator/Program.cs @@ -95,6 +95,7 @@ app.UseRewriter(rewriteOptions); app.UseMiddleware(); app.UseMiddleware(); +app.UseMiddleware(); Console.WriteLine($"Running in {mode.Value} mode"); app.Run();