diff --git a/Refresh.Core/Configuration/GameServerConfig.cs b/Refresh.Core/Configuration/GameServerConfig.cs
index a3a7f5ae7..fab3d295b 100644
--- a/Refresh.Core/Configuration/GameServerConfig.cs
+++ b/Refresh.Core/Configuration/GameServerConfig.cs
@@ -1,8 +1,6 @@
using System.Diagnostics.CodeAnalysis;
using Bunkum.Core.Configuration;
using Microsoft.CSharp.RuntimeBinder;
-using Refresh.Database.Models.Assets;
-using Refresh.Database.Models.Users;
namespace Refresh.Core.Configuration;
@@ -10,52 +8,109 @@ namespace Refresh.Core.Configuration;
[SuppressMessage("ReSharper", "RedundantDefaultMemberInitializer")]
public class GameServerConfig : Config
{
- public override int CurrentConfigVersion => 26;
+ public override int CurrentConfigVersion => 27;
public override int Version { get; set; } = 0;
protected override void Migrate(int oldVer, dynamic oldConfig)
{
- if (oldVer < 18)
+ // In version 27, various (mostly already role-specific) perms, like blocked assets and read-only mode, were moved to dedicated child objects,
+ // to more cleanly split the perms between certain roles, and to make their enforcement easier.
+ if (oldVer < 27)
{
- // Asset safety level was added in config version 2, so dont try to migrate if we are coming from an older version than that
- if (oldVer >= 2)
+ this.NormalUserPermissions = new();
+ this.TrustedUserPermissions = new();
+
+ // filesize quota limit was added during version 11, but the version wasn't bumped, so catch error to be safe
+ if (oldVer >= 11)
{
- int oldSafetyLevel = (int)oldConfig.MaximumAssetSafetyLevel;
- this.BlockedAssetFlags = new ConfigAssetFlags
+ try
+ {
+ this.NormalUserPermissions.UserFilesizeQuota = (int)oldConfig.UserFilesizeQuota;
+ this.TrustedUserPermissions.UserFilesizeQuota = (int)oldConfig.UserFilesizeQuota;
+ }
+ catch (RuntimeBinderException)
{
- Dangerous = oldSafetyLevel < 3,
- Modded = oldSafetyLevel < 2,
- Media = oldSafetyLevel < 1,
- };
+ // do nothing
+ }
}
- // Asset safety level for trusted users was added in config version 12, so dont try to migrate if we are coming from a version older than that
- if (oldVer >= 12)
+ if (oldVer >= 18)
{
- // There was no version bump for trusted users being added, so we just have to catch this error :/
- try
+ this.NormalUserPermissions.BlockedAssetFlags.Dangerous = (bool)oldConfig.BlockedAssetFlags.Dangerous;
+ this.NormalUserPermissions.BlockedAssetFlags.Media = (bool)oldConfig.BlockedAssetFlags.Media;
+ this.NormalUserPermissions.BlockedAssetFlags.Modded = (bool)oldConfig.BlockedAssetFlags.Modded;
+
+ this.TrustedUserPermissions.BlockedAssetFlags.Dangerous = (bool)oldConfig.BlockedAssetFlagsForTrustedUsers.Dangerous;
+ this.TrustedUserPermissions.BlockedAssetFlags.Media = (bool)oldConfig.BlockedAssetFlagsForTrustedUsers.Media;
+ this.TrustedUserPermissions.BlockedAssetFlags.Modded = (bool)oldConfig.BlockedAssetFlagsForTrustedUsers.Modded;
+ }
+ else
+ {
+ // Asset safety level was added in config version 2, so dont try to migrate if we are coming from an older version than that
+ if (oldVer >= 2)
{
- int oldTrustedSafetyLevel = (int)oldConfig.MaximumAssetSafetyLevelForTrustedUsers;
- this.BlockedAssetFlagsForTrustedUsers = new ConfigAssetFlags
+ int oldSafetyLevel = (int)oldConfig.MaximumAssetSafetyLevel;
+ this.NormalUserPermissions.BlockedAssetFlags = new ConfigAssetFlags
{
- Dangerous = oldTrustedSafetyLevel < 3,
- Modded = oldTrustedSafetyLevel < 2,
- Media = oldTrustedSafetyLevel < 1,
+ Dangerous = oldSafetyLevel < 3,
+ Modded = oldSafetyLevel < 2,
+ Media = oldSafetyLevel < 1,
};
}
- catch (RuntimeBinderException)
+
+ // Asset safety level for trusted users was added in config version 12, so dont try to migrate if we are coming from a version older than that
+ if (oldVer >= 12)
{
- this.BlockedAssetFlagsForTrustedUsers = this.BlockedAssetFlags;
+ // There was no version bump for trusted users being added, so we just have to catch this error :/
+ try
+ {
+ int oldTrustedSafetyLevel = (int)oldConfig.MaximumAssetSafetyLevelForTrustedUsers;
+ this.TrustedUserPermissions.BlockedAssetFlags = new ConfigAssetFlags
+ {
+ Dangerous = oldTrustedSafetyLevel < 3,
+ Modded = oldTrustedSafetyLevel < 2,
+ Media = oldTrustedSafetyLevel < 1,
+ };
+ }
+ catch (RuntimeBinderException)
+ {
+ this.TrustedUserPermissions.BlockedAssetFlags = this.NormalUserPermissions.BlockedAssetFlags;
+ }
}
}
+
+ // Timed level upload limits were added in version 19.
+ if (oldVer >= 19)
+ {
+ this.NormalUserPermissions.TimedLevelUploadLimits.Enabled = (bool)oldConfig.TimedLevelUploadLimits.Enabled;
+ this.NormalUserPermissions.TimedLevelUploadLimits.TimeSpanHours = (int)oldConfig.TimedLevelUploadLimits.TimeSpanHours;
+ this.NormalUserPermissions.TimedLevelUploadLimits.LevelQuota = (int)oldConfig.TimedLevelUploadLimits.LevelQuota;
+
+ this.TrustedUserPermissions.TimedLevelUploadLimits.Enabled = (bool)oldConfig.TimedLevelUploadLimits.Enabled;
+ this.TrustedUserPermissions.TimedLevelUploadLimits.TimeSpanHours = (int)oldConfig.TimedLevelUploadLimits.TimeSpanHours;
+ this.TrustedUserPermissions.TimedLevelUploadLimits.LevelQuota = (int)oldConfig.TimedLevelUploadLimits.LevelQuota;
+ }
+
+ // Read-only mode was added for both normal and trusted users in version 20.
+ if (oldVer >= 20)
+ {
+ this.NormalUserPermissions.ReadOnlyMode = (bool)oldConfig.ReadOnlyMode;
+ this.TrustedUserPermissions.ReadOnlyMode = (bool)oldConfig.ReadonlyModeForTrustedUsers;
+ }
}
}
public string LicenseText { get; set; } = "Welcome to Refresh!";
- public ConfigAssetFlags BlockedAssetFlags { get; set; } = new(AssetFlags.Dangerous | AssetFlags.Modded);
- ///
- public ConfigAssetFlags BlockedAssetFlagsForTrustedUsers { get; set; } = new(AssetFlags.Dangerous | AssetFlags.Modded);
+ ///
+ /// Role-specific permissions for normal users and below
+ ///
+ public RolePermissions NormalUserPermissions = new();
+ ///
+ /// Role-specific permissions for trusted users and above
+ ///
+ public RolePermissions TrustedUserPermissions = new();
+
public bool AllowUsersToUseIpAuthentication { get; set; } = false;
public bool PermitPsnLogin { get; set; } = true;
public bool PermitRpcnLogin { get; set; } = true;
@@ -97,20 +152,6 @@ protected override void Migrate(int oldVer, dynamic oldConfig)
///
public string GameConfigStorageUrl { get; set; } = "https://refresh.example.com/lbp";
public bool AllowInvalidTextureGuids { get; set; } = false;
- public bool ReadOnlyMode { get; set; } = false;
- ///
- public bool ReadonlyModeForTrustedUsers { get; set; } = false;
- ///
- /// The amount of data the user is allowed to upload before all resource uploads get blocked, defaults to 100mb.
- ///
- public int UserFilesizeQuota { get; set; } = 100 * 1_048_576;
-
- public TimedLevelUploadLimitProperties TimedLevelUploadLimits { get; set; } = new()
- {
- Enabled = false,
- TimeSpanHours = 24,
- LevelQuota = 10,
- };
///
/// Whether to print the room state whenever a `FindBestRoom` match returns no results
diff --git a/Refresh.Core/Configuration/RolePermissions.cs b/Refresh.Core/Configuration/RolePermissions.cs
new file mode 100644
index 000000000..e1cc44e59
--- /dev/null
+++ b/Refresh.Core/Configuration/RolePermissions.cs
@@ -0,0 +1,22 @@
+using Refresh.Database.Models.Assets;
+
+namespace Refresh.Core.Configuration;
+
+public class RolePermissions
+{
+ public RolePermissions() {}
+
+ public bool ReadOnlyMode { get; set; } = false;
+ public ConfigAssetFlags BlockedAssetFlags { get; set; } = new(AssetFlags.Dangerous | AssetFlags.Modded);
+ public TimedLevelUploadLimitProperties TimedLevelUploadLimits = new()
+ {
+ Enabled = false,
+ TimeSpanHours = 24,
+ LevelQuota = 10,
+ };
+
+ ///
+ /// The amount of data the user is allowed to upload before all resource uploads get blocked, defaults to 100mb.
+ ///
+ public int UserFilesizeQuota { get; set; } = 100 * 1_048_576;
+}
\ No newline at end of file
diff --git a/Refresh.Core/Extensions/GameUserExtensions.cs b/Refresh.Core/Extensions/GameUserExtensions.cs
index 8350dfe7e..e3f9c3683 100644
--- a/Refresh.Core/Extensions/GameUserExtensions.cs
+++ b/Refresh.Core/Extensions/GameUserExtensions.cs
@@ -7,12 +7,8 @@ public static class GameUserExtensions
{
public static bool IsWriteBlocked(this GameUser user, GameServerConfig config)
{
- if (config.ReadOnlyMode && user.Role != GameUserRole.Admin)
- {
- return user.Role < GameUserRole.Trusted || config.ReadonlyModeForTrustedUsers;
- }
-
- return false;
+ if (user.Role == GameUserRole.Admin) return false;
+ return GetRolePermissionsForUser(user, config).ReadOnlyMode;
}
public static bool MayModifyUser(this GameUser user, GameUser targetUser)
@@ -27,4 +23,12 @@ public static bool MayModifyUser(this GameUser user, GameUser targetUser)
return true;
}
+
+ public static RolePermissions GetRolePermissionsForUser(this GameUser user, GameServerConfig config)
+ {
+ if (user.Role >= GameUserRole.Trusted)
+ return config.TrustedUserPermissions;
+
+ return config.NormalUserPermissions;
+ }
}
\ No newline at end of file
diff --git a/Refresh.Interfaces.APIv3/Endpoints/InstanceApiEndpoints.cs b/Refresh.Interfaces.APIv3/Endpoints/InstanceApiEndpoints.cs
index abe7f55f0..1639719e4 100644
--- a/Refresh.Interfaces.APIv3/Endpoints/InstanceApiEndpoints.cs
+++ b/Refresh.Interfaces.APIv3/Endpoints/InstanceApiEndpoints.cs
@@ -62,8 +62,8 @@ public ApiResponse GetInstanceInformation(RequestContext co
SoftwareSourceUrl = "https://github.com/LittleBigRefresh/Refresh",
SoftwareLicenseName = "AGPL-3.0",
SoftwareLicenseUrl = "https://www.gnu.org/licenses/agpl-3.0.txt",
- BlockedAssetFlags = gameConfig.BlockedAssetFlags,
- BlockedAssetFlagsForTrustedUsers = gameConfig.BlockedAssetFlagsForTrustedUsers,
+ BlockedAssetFlags = gameConfig.NormalUserPermissions.BlockedAssetFlags,
+ BlockedAssetFlagsForTrustedUsers = gameConfig.TrustedUserPermissions.BlockedAssetFlags,
Announcements = ApiGameAnnouncementResponse.FromOldList(database.GetAnnouncements(), dataContext),
MaintenanceModeEnabled = gameConfig.MaintenanceMode,
RichPresenceConfiguration = ApiRichPresenceConfigurationResponse.FromOld(RichPresenceConfiguration.Create(
diff --git a/Refresh.Interfaces.APIv3/Endpoints/ResourceApiEndpoints.cs b/Refresh.Interfaces.APIv3/Endpoints/ResourceApiEndpoints.cs
index 8c4d9da68..9ab5fd328 100644
--- a/Refresh.Interfaces.APIv3/Endpoints/ResourceApiEndpoints.cs
+++ b/Refresh.Interfaces.APIv3/Endpoints/ResourceApiEndpoints.cs
@@ -193,9 +193,10 @@ IntegrationConfig integration
return new ApiValidationError($"The asset must be under 2MB. Your file was {body.Length:N0} bytes.");
}
- if (body.Length + user.FilesizeQuotaUsage > config.UserFilesizeQuota)
+ RolePermissions rolePerms = user.GetRolePermissionsForUser(config);
+ if (body.Length + user.FilesizeQuotaUsage > rolePerms.UserFilesizeQuota)
{
- context.Logger.LogWarning(BunkumCategory.UserContent, "User {0} has hit the filesize quota ({1} bytes), rejecting.", user.Username, config.UserFilesizeQuota);
+ context.Logger.LogWarning(BunkumCategory.UserContent, "User {0} has hit the filesize quota ({1} bytes), rejecting.", user.Username, rolePerms.UserFilesizeQuota);
return new ApiValidationError($"You have exceeded your filesize quota.");
}
diff --git a/Refresh.Interfaces.Game/Endpoints/Levels/PublishEndpoints.cs b/Refresh.Interfaces.Game/Endpoints/Levels/PublishEndpoints.cs
index 7118e24b0..2d12ffa50 100644
--- a/Refresh.Interfaces.Game/Endpoints/Levels/PublishEndpoints.cs
+++ b/Refresh.Interfaces.Game/Endpoints/Levels/PublishEndpoints.cs
@@ -119,7 +119,8 @@ public Response StartPublish(RequestContext context,
GameLevelRequest body,
DataContext dataContext,
GameServerConfig config,
- IDateTimeProvider dateTimeProvider)
+ IDateTimeProvider dateTimeProvider,
+ GameUser user)
{
if (dataContext.User!.IsWriteBlocked(config))
{
@@ -127,7 +128,7 @@ public Response StartPublish(RequestContext context,
return Unauthorized;
}
- if (IsTimedLevelLimitReached(dataContext, dataContext.User!, body.Title, config.TimedLevelUploadLimits, dateTimeProvider.Now))
+ if (IsTimedLevelLimitReached(dataContext, dataContext.User!, body.Title, user.GetRolePermissionsForUser(config).TimedLevelUploadLimits, dateTimeProvider.Now))
return Unauthorized;
//If verifying the request fails, return BadRequest
@@ -182,7 +183,8 @@ public Response PublishLevel(RequestContext context,
if (user.IsWriteBlocked(config))
return Unauthorized;
- if (IsTimedLevelLimitReached(dataContext, user, body.Title, config.TimedLevelUploadLimits, dateTimeProvider.Now))
+ TimedLevelUploadLimitProperties timedLevelLimit = user.GetRolePermissionsForUser(config).TimedLevelUploadLimits;
+ if (IsTimedLevelLimitReached(dataContext, user, body.Title, timedLevelLimit, dateTimeProvider.Now))
return Unauthorized;
//If verifying the request fails, return BadRequest
@@ -256,9 +258,9 @@ public Response PublishLevel(RequestContext context,
// Only increment if the level can be uploaded (right after the previous checks + adding the level),
// don't want to increment for failed uploads
- if (config.TimedLevelUploadLimits.Enabled)
+ if (timedLevelLimit.Enabled)
{
- dataContext.Database.IncrementTimedLevelLimit(user, config.TimedLevelUploadLimits.TimeSpanHours);
+ dataContext.Database.IncrementTimedLevelLimit(user, timedLevelLimit.TimeSpanHours);
}
// Update the modded status of the level
diff --git a/Refresh.Interfaces.Game/Endpoints/ResourceEndpoints.cs b/Refresh.Interfaces.Game/Endpoints/ResourceEndpoints.cs
index 7786ca037..1f64f050f 100644
--- a/Refresh.Interfaces.Game/Endpoints/ResourceEndpoints.cs
+++ b/Refresh.Interfaces.Game/Endpoints/ResourceEndpoints.cs
@@ -48,9 +48,11 @@ public Response UploadAsset(RequestContext context, string hash, string type, by
if (dataStore.ExistsInStore(assetPath))
return Conflict;
- if (body.Length + user.FilesizeQuotaUsage > config.UserFilesizeQuota)
+ RolePermissions rolePerms = user.GetRolePermissionsForUser(config);
+
+ if (body.Length + user.FilesizeQuotaUsage > rolePerms.UserFilesizeQuota)
{
- context.Logger.LogWarning(BunkumCategory.UserContent, "User {0} has hit the filesize quota ({1} bytes), rejecting.", user.Username, config.UserFilesizeQuota);
+ context.Logger.LogWarning(BunkumCategory.UserContent, "User {0} has hit the filesize quota ({1} bytes), rejecting.", user.Username, rolePerms.UserFilesizeQuota);
return RequestEntityTooLarge;
}
@@ -66,9 +68,7 @@ public Response UploadAsset(RequestContext context, string hash, string type, by
gameAsset.UploadDate = DateTimeOffset.FromUnixTimeSeconds(Math.Clamp(gameAsset.UploadDate.ToUnixTimeSeconds(), timeProvider.EarliestDate, timeProvider.TimestampSeconds));
- AssetFlags blockedAssetFlags = config.BlockedAssetFlags.ToAssetFlags();
- if (user.Role >= GameUserRole.Trusted)
- blockedAssetFlags = config.BlockedAssetFlagsForTrustedUsers.ToAssetFlags();
+ AssetFlags blockedAssetFlags = rolePerms.BlockedAssetFlags.ToAssetFlags();
// Don't block any assets uploaded from PSP, else block any unwanted assets,
// For example, if the "blocked asset flags" has the "Media" bit set, and so does the asset,
diff --git a/RefreshTests.GameServer/GameServer/TestGameServerConfig.cs b/RefreshTests.GameServer/GameServer/TestGameServerConfig.cs
new file mode 100644
index 000000000..539b61f82
--- /dev/null
+++ b/RefreshTests.GameServer/GameServer/TestGameServerConfig.cs
@@ -0,0 +1,28 @@
+using Refresh.Core.Configuration;
+using Refresh.Database.Models.Assets;
+
+namespace RefreshTests.GameServer.GameServer;
+
+public class TestGameServerConfig : GameServerConfig
+{
+ public void TestMigration()
+ {
+ this.Migrate(this.Version, this);
+ }
+
+ // Various attributes to migrate from
+ public ConfigAssetFlags BlockedAssetFlags { get; set; } = new(AssetFlags.Dangerous | AssetFlags.Modded);
+ public ConfigAssetFlags BlockedAssetFlagsForTrustedUsers { get; set; } = new(AssetFlags.Dangerous | AssetFlags.Modded);
+ public bool ReadOnlyMode { get; set; } = false;
+ public bool ReadonlyModeForTrustedUsers { get; set; } = false;
+ public TimedLevelUploadLimitProperties TimedLevelUploadLimits { get; set; } = new()
+ {
+ Enabled = false,
+ TimeSpanHours = 24,
+ LevelQuota = 10,
+ };
+
+ public int MaximumAssetSafetyLevel { get; set; } = 0;
+ public int MaximumAssetSafetyLevelForTrustedUsers { get; set; } = 0;
+ public int UserFilesizeQuota { get; set; } = 141;
+}
\ No newline at end of file
diff --git a/RefreshTests.GameServer/Tests/Assets/AssetUploadTests.cs b/RefreshTests.GameServer/Tests/Assets/AssetUploadTests.cs
index b6c7c661e..2a79fd7fd 100644
--- a/RefreshTests.GameServer/Tests/Assets/AssetUploadTests.cs
+++ b/RefreshTests.GameServer/Tests/Assets/AssetUploadTests.cs
@@ -39,7 +39,8 @@ public void CannotUploadAssetPastFillingFilesizeQuota(bool psp)
{
using TestContext context = this.GetServer();
- context.Server.Value.GameServerConfig.UserFilesizeQuota = 8;
+ context.Server.Value.GameServerConfig.NormalUserPermissions.UserFilesizeQuota = 8;
+ context.Server.Value.GameServerConfig.TrustedUserPermissions.UserFilesizeQuota = 8;
context.Server.Value.Server.AddService();
GameUser user = context.CreateUser();
@@ -71,7 +72,7 @@ public void CannotUploadAssetWhenBlocked(bool psp)
{
using TestContext context = this.GetServer();
- context.Server.Value.GameServerConfig.ReadOnlyMode = true;
+ context.Server.Value.GameServerConfig.NormalUserPermissions.ReadOnlyMode = true;
context.Server.Value.Server.AddService();
GameUser user = context.CreateUser();
@@ -95,8 +96,8 @@ public void TrustedCanUploadAssetWhenBlocked(bool psp)
{
using TestContext context = this.GetServer();
context.Server.Value.Server.AddService();
- context.Server.Value.GameServerConfig.ReadOnlyMode = true;
- context.Server.Value.GameServerConfig.ReadonlyModeForTrustedUsers = false;
+ context.Server.Value.GameServerConfig.NormalUserPermissions.ReadOnlyMode = true;
+ context.Server.Value.GameServerConfig.TrustedUserPermissions.ReadOnlyMode = false;
GameUser user = context.CreateUser();
context.Database.SetUserRole(user, GameUserRole.Trusted);
@@ -121,8 +122,8 @@ public void AdminCanUploadAssetWhenBlocked(bool psp)
{
using TestContext context = this.GetServer();
context.Server.Value.Server.AddService();
- context.Server.Value.GameServerConfig.ReadOnlyMode = true;
- context.Server.Value.GameServerConfig.ReadonlyModeForTrustedUsers = true;
+ context.Server.Value.GameServerConfig.NormalUserPermissions.ReadOnlyMode = true;
+ context.Server.Value.GameServerConfig.TrustedUserPermissions.ReadOnlyMode = true;
GameUser user = context.CreateUser();
context.Database.SetUserRole(user, GameUserRole.Admin);
@@ -146,13 +147,13 @@ public void TrustedCanUploadAssetWithSafetyLevel()
{
using TestContext context = this.GetServer();
context.Server.Value.Server.AddService();
- context.Server.Value.GameServerConfig.BlockedAssetFlags = new ConfigAssetFlags
+ context.Server.Value.GameServerConfig.NormalUserPermissions.BlockedAssetFlags = new ConfigAssetFlags
{
Modded = true,
Media = true,
Dangerous = true,
};
- context.Server.Value.GameServerConfig.BlockedAssetFlagsForTrustedUsers = new ConfigAssetFlags
+ context.Server.Value.GameServerConfig.TrustedUserPermissions.BlockedAssetFlags = new ConfigAssetFlags
{
Dangerous = true,
Modded = true,
@@ -178,13 +179,13 @@ public void NormalUserCantUploadAssetWithSafetyLevel()
{
using TestContext context = this.GetServer();
context.Server.Value.Server.AddService();
- context.Server.Value.GameServerConfig.BlockedAssetFlags = new ConfigAssetFlags
+ context.Server.Value.GameServerConfig.NormalUserPermissions.BlockedAssetFlags = new ConfigAssetFlags
{
Dangerous = true,
Modded = true,
Media = true,
};
- context.Server.Value.GameServerConfig.BlockedAssetFlagsForTrustedUsers = new ConfigAssetFlags
+ context.Server.Value.GameServerConfig.TrustedUserPermissions.BlockedAssetFlags = new ConfigAssetFlags
{
Dangerous = true,
Modded = true,
@@ -209,7 +210,7 @@ public void PspCantUploadMediaAssetWhileBlocked()
{
using TestContext context = this.GetServer();
context.Server.Value.Server.AddService();
- context.Server.Value.GameServerConfig.BlockedAssetFlags = new ConfigAssetFlags
+ context.Server.Value.GameServerConfig.NormalUserPermissions.BlockedAssetFlags = new ConfigAssetFlags
{
Dangerous = true,
Modded = true,
@@ -236,7 +237,7 @@ public void PspCanUploadNormalAssetWhileBlocked()
{
using TestContext context = this.GetServer();
context.Server.Value.Server.AddService();
- context.Server.Value.GameServerConfig.BlockedAssetFlags = new ConfigAssetFlags
+ context.Server.Value.GameServerConfig.NormalUserPermissions.BlockedAssetFlags = new ConfigAssetFlags
{
Dangerous = true,
Modded = true,
diff --git a/RefreshTests.GameServer/Tests/Configs/GameServerConfigTests.cs b/RefreshTests.GameServer/Tests/Configs/GameServerConfigTests.cs
new file mode 100644
index 000000000..a99569f92
--- /dev/null
+++ b/RefreshTests.GameServer/Tests/Configs/GameServerConfigTests.cs
@@ -0,0 +1,62 @@
+using Refresh.Database.Models.Assets;
+
+namespace RefreshTests.GameServer.Tests.Configs;
+
+public class GameServerConfigTests : GameServerTest
+{
+ [Test]
+ public void MigratesRolePermsFromVersion26()
+ {
+ TestGameServerConfig config = new()
+ {
+ Version = 26,
+ ReadOnlyMode = true,
+ ReadonlyModeForTrustedUsers = false,
+ TimedLevelUploadLimits = new()
+ {
+ Enabled = true,
+ TimeSpanHours = 67,
+ LevelQuota = 2,
+ },
+ BlockedAssetFlags = new(AssetFlags.Dangerous | AssetFlags.Media),
+ BlockedAssetFlagsForTrustedUsers = new(AssetFlags.Modded),
+ UserFilesizeQuota = 141,
+ };
+
+ config.TestMigration();
+
+ Assert.That(config.NormalUserPermissions.ReadOnlyMode, Is.True);
+ Assert.That(config.TrustedUserPermissions.ReadOnlyMode, Is.False);
+
+ Assert.That(config.NormalUserPermissions.TimedLevelUploadLimits.Enabled, Is.True);
+ Assert.That(config.TrustedUserPermissions.TimedLevelUploadLimits.Enabled, Is.True);
+
+ Assert.That(config.NormalUserPermissions.TimedLevelUploadLimits.TimeSpanHours, Is.EqualTo(67));
+ Assert.That(config.TrustedUserPermissions.TimedLevelUploadLimits.TimeSpanHours, Is.EqualTo(67));
+
+ Assert.That(config.NormalUserPermissions.TimedLevelUploadLimits.LevelQuota, Is.EqualTo(2));
+ Assert.That(config.TrustedUserPermissions.TimedLevelUploadLimits.LevelQuota, Is.EqualTo(2));
+
+ Assert.That(config.NormalUserPermissions.BlockedAssetFlags.ToAssetFlags(), Is.EqualTo(AssetFlags.Dangerous | AssetFlags.Media));
+ Assert.That(config.TrustedUserPermissions.BlockedAssetFlags.ToAssetFlags(), Is.EqualTo(AssetFlags.Modded));
+
+ Assert.That(config.NormalUserPermissions.UserFilesizeQuota, Is.EqualTo(141));
+ Assert.That(config.TrustedUserPermissions.UserFilesizeQuota, Is.EqualTo(141));
+ }
+
+ [Test]
+ public void MigratesRolePermsFromVersion17()
+ {
+ TestGameServerConfig config = new()
+ {
+ Version = 17,
+ MaximumAssetSafetyLevel = 1,
+ MaximumAssetSafetyLevelForTrustedUsers = 2,
+ };
+
+ config.TestMigration();
+
+ Assert.That(config.NormalUserPermissions.BlockedAssetFlags.ToAssetFlags(), Is.EqualTo(AssetFlags.Dangerous | AssetFlags.Modded));
+ Assert.That(config.TrustedUserPermissions.BlockedAssetFlags.ToAssetFlags(), Is.EqualTo(AssetFlags.Dangerous));
+ }
+}
\ No newline at end of file
diff --git a/RefreshTests.GameServer/Tests/Levels/PublishEndpointsTests.cs b/RefreshTests.GameServer/Tests/Levels/PublishEndpointsTests.cs
index f0b2bd8b9..85ea1741a 100644
--- a/RefreshTests.GameServer/Tests/Levels/PublishEndpointsTests.cs
+++ b/RefreshTests.GameServer/Tests/Levels/PublishEndpointsTests.cs
@@ -503,12 +503,13 @@ public void CantPublishAfterExceedingTimedLevelLimit(int levelQuota, int uploadA
// Prepare config
GameServerConfig config = context.Server.Value.GameServerConfig;
- config.TimedLevelUploadLimits = new()
+ TimedLevelUploadLimitProperties timedLevelLimit = new()
{
Enabled = true,
LevelQuota = levelQuota,
TimeSpanHours = 1,
};
+ config.NormalUserPermissions.TimedLevelUploadLimits = timedLevelLimit;
using HttpClient client = context.GetAuthenticatedClient(TokenType.Game, user);
@@ -517,7 +518,7 @@ public void CantPublishAfterExceedingTimedLevelLimit(int levelQuota, int uploadA
Assert.That(assetUploadMessage.StatusCode, Is.EqualTo(OK));
// Fill up quota
- SpamSuccessfulUploads(config.TimedLevelUploadLimits.LevelQuota, client);
+ SpamSuccessfulUploads(timedLevelLimit.LevelQuota, client);
// Try to upload more levels after exceeding quota
for (int i = 0; i < uploadAttemptsAfterExceeding; i++)
@@ -532,7 +533,7 @@ public void CantPublishAfterExceedingTimedLevelLimit(int levelQuota, int uploadA
// Check amount of levels
DatabaseList levelsByUser = context.Database.GetLevelsByUser(user, 1000, 0, new(TokenGame.LittleBigPlanet3), user);
- Assert.That(levelsByUser.TotalItems, Is.EqualTo(config.TimedLevelUploadLimits.LevelQuota));
+ Assert.That(levelsByUser.TotalItems, Is.EqualTo(timedLevelLimit.LevelQuota));
// Ensure there were error notifications sent for each blocked request to both /startPublish and /publish
DatabaseList newNotifications = context.Database.GetNotificationsByUser(user, 1000, 0);
@@ -549,7 +550,7 @@ public void ResetTimedLevelLimitAfterExpiry(int levelQuota, int uploadAttemptsAf
// Prepare config
GameServerConfig config = context.Server.Value.GameServerConfig;
- config.TimedLevelUploadLimits = new()
+ TimedLevelUploadLimitProperties timedLevelLimit = new()
{
Enabled = true,
LevelQuota = levelQuota,
@@ -557,6 +558,7 @@ public void ResetTimedLevelLimitAfterExpiry(int levelQuota, int uploadAttemptsAf
// causing both /startPublish and /publish to always reset the limit after setting it in a previous /publish request, and allowing publish requests
TimeSpanHours = 0,
};
+ config.NormalUserPermissions.TimedLevelUploadLimits = timedLevelLimit;
using HttpClient client = context.GetAuthenticatedClient(TokenType.Game, user);
@@ -565,14 +567,14 @@ public void ResetTimedLevelLimitAfterExpiry(int levelQuota, int uploadAttemptsAf
Assert.That(message.StatusCode, Is.EqualTo(OK));
// Fill up quota
- SpamSuccessfulUploads(config.TimedLevelUploadLimits.LevelQuota, client);
+ SpamSuccessfulUploads(timedLevelLimit.LevelQuota, client);
// Try to upload more levels after exceeding quota
SpamSuccessfulUploads(uploadAttemptsAfterExceeding, client);
// Check amount of levels
DatabaseList levelsByUser = context.Database.GetLevelsByUser(user, 1000, 0, new(TokenGame.LittleBigPlanet3), user);
- Assert.That(levelsByUser.TotalItems, Is.EqualTo(config.TimedLevelUploadLimits.LevelQuota + uploadAttemptsAfterExceeding));
+ Assert.That(levelsByUser.TotalItems, Is.EqualTo(timedLevelLimit.LevelQuota + uploadAttemptsAfterExceeding));
// Ensure there were no notifications sent
DatabaseList newNotifications = context.Database.GetNotificationsByUser(user, 1000, 0);
diff --git a/RefreshTests.GameServer/Tests/Planets/ModdedPlanetsTests.cs b/RefreshTests.GameServer/Tests/Planets/ModdedPlanetsTests.cs
index 351fa696c..cd8e95e62 100644
--- a/RefreshTests.GameServer/Tests/Planets/ModdedPlanetsTests.cs
+++ b/RefreshTests.GameServer/Tests/Planets/ModdedPlanetsTests.cs
@@ -54,7 +54,7 @@ private void UploadHeavilyModdedPlanet(TestContext context, HttpClient client, s
{
// Prepare config so normal users may upload modded assets
GameServerConfig config = context.Server.Value.GameServerConfig;
- config.BlockedAssetFlags = new(AssetFlags.Dangerous);
+ config.NormalUserPermissions.BlockedAssetFlags = new(AssetFlags.Dangerous);
// Upload planet dependency and make the planet level depend on the voice recording
HttpResponseMessage message = client.PostAsync($"/lbp/upload/{TEST_MESH_HASH}", new ReadOnlyMemoryContent("MSHb"u8.ToArray())).Result;
@@ -171,7 +171,7 @@ public void ModdedLbp2PlanetDoesntHideUnmoddedVitaPlanet()
// Prepare config so normal users may upload modded assets
GameServerConfig config = context.Server.Value.GameServerConfig;
- config.BlockedAssetFlags = new(AssetFlags.Dangerous);
+ config.NormalUserPermissions.BlockedAssetFlags = new(AssetFlags.Dangerous);
GameUser publisher = context.CreateUser();
using HttpClient client2LBP2 = context.GetAuthenticatedClient(TokenType.Game, TokenGame.LittleBigPlanet2, TokenPlatform.PS3, out string _, publisher);
diff --git a/RefreshTests.GameServer/Tests/Playlists/PlaylistUploadTests.cs b/RefreshTests.GameServer/Tests/Playlists/PlaylistUploadTests.cs
index 56987fa75..70d459b70 100644
--- a/RefreshTests.GameServer/Tests/Playlists/PlaylistUploadTests.cs
+++ b/RefreshTests.GameServer/Tests/Playlists/PlaylistUploadTests.cs
@@ -122,8 +122,8 @@ public void CannotCreateSubPlaylistWhileReadOnlyMode()
{
using TestContext context = this.GetServer();
GameServerConfig config = context.Server.Value.GameServerConfig;
- config.ReadOnlyMode = true;
- config.ReadonlyModeForTrustedUsers = true;
+ config.NormalUserPermissions.ReadOnlyMode = true;
+ config.TrustedUserPermissions.ReadOnlyMode = true;
GameUser user = context.CreateUser();
GamePlaylist root = context.Database.CreatePlaylist(user, new SerializedLbp1Playlist()
@@ -155,8 +155,8 @@ public void CanCreateRootPlaylistWhileReadOnlyMode()
{
using TestContext context = this.GetServer();
GameServerConfig config = context.Server.Value.GameServerConfig;
- config.ReadOnlyMode = true;
- config.ReadonlyModeForTrustedUsers = true;
+ config.NormalUserPermissions.ReadOnlyMode = true;
+ config.TrustedUserPermissions.ReadOnlyMode = true;
GameUser user = context.CreateUser();
HttpClient client = context.GetAuthenticatedClient(TokenType.Game, TokenGame.LittleBigPlanet1, TokenPlatform.PS3, user);