From a2ffb5ef4b4edaf8fd6604e74364ed7b8c711242 Mon Sep 17 00:00:00 2001 From: Alexa <53471801+Alexa-RR@users.noreply.github.com> Date: Mon, 13 Jul 2026 01:04:10 +0300 Subject: [PATCH] feat: Update room properties to support cloning for RRO/AG base rooms; adjust moderation logic for cloning permissions --- DorkNet.Server.Tests/RoomSave2023Tests.cs | 7 +++++-- .../Controllers/API/Rooms/V2/RoomsModerationController.cs | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/DorkNet.Server.Tests/RoomSave2023Tests.cs b/DorkNet.Server.Tests/RoomSave2023Tests.cs index 1eba7f0..d67f830 100644 --- a/DorkNet.Server.Tests/RoomSave2023Tests.cs +++ b/DorkNet.Server.Tests/RoomSave2023Tests.cs @@ -158,9 +158,12 @@ public sealed class RoomSave2023Tests : IClassFixture CreatorPlayerId = owner.PlayerId, ImageName = RoomService.DefaultRoomImageName, Accessibility = 1, - IsAGRoom = false, + // An RRO/AG base room (RecCenter-like): CloningAllowed is + // false and it's owned by the system, yet the base-room + // picker must still be able to clone it. + IsAGRoom = true, IsDormRoom = false, - CloningAllowed = true, + CloningAllowed = false, CurrentDataBlobName = $"room_{roomId}_v1.dat", }); db.RoomScenes.Add(new RoomSceneEntity diff --git a/DorkNet.Server/Controllers/API/Rooms/V2/RoomsModerationController.cs b/DorkNet.Server/Controllers/API/Rooms/V2/RoomsModerationController.cs index eceb225..95127b3 100644 --- a/DorkNet.Server/Controllers/API/Rooms/V2/RoomsModerationController.cs +++ b/DorkNet.Server/Controllers/API/Rooms/V2/RoomsModerationController.cs @@ -972,7 +972,11 @@ public class RoomsModerationController(DorkNetDbContext db) : ControllerBase var newName = await ReadCloneNameAsync(); var source = await db.Rooms.FirstOrDefaultAsync(r => r.Id == roomId); if (source is null) return NotFound(); - if (!source.CloningAllowed && source.CreatorPlayerId != Me) + // RRO/AG rooms are first-party templates meant to be cloned — the + // room-creation "base room" picker starts a new build by cloning one + // (RecCenter, MakerRoom, …). Their seed rows have CloningAllowed=false, + // so without the IsAGRoom exception every base-room create 403s. + if (!source.CloningAllowed && !source.IsAGRoom && source.CreatorPlayerId != Me) return Forbid(); if (string.IsNullOrWhiteSpace(newName))