From 390950658218cc69718972b809ecdebaef4bbf62 Mon Sep 17 00:00:00 2001 From: Toaster2 Date: Wed, 27 May 2026 17:46:36 +0200 Subject: [PATCH 1/4] Don't mark PSP assets as modded/dangerous --- Refresh.Database/Models/Assets/GameAsset.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Refresh.Database/Models/Assets/GameAsset.cs b/Refresh.Database/Models/Assets/GameAsset.cs index dd5edeea..90d07d43 100644 --- a/Refresh.Database/Models/Assets/GameAsset.cs +++ b/Refresh.Database/Models/Assets/GameAsset.cs @@ -25,6 +25,13 @@ public AssetFlags AssetFlags if (VanillaHashChecker.IsVanillaHash(this.AssetHash)) flags &= ~AssetFlags.Modded; + // If this is a PSP asset, strip both modded and dangerous flags + if (this.IsPSP) + { + flags &= ~AssetFlags.Modded; + flags &= ~AssetFlags.Dangerous; + } + return flags; } } From a7ebabef831b9189258b15e637840999e787fee9 Mon Sep 17 00:00:00 2001 From: Toaster2 Date: Wed, 27 May 2026 18:02:31 +0200 Subject: [PATCH 2/4] Don't flag PSP levels as modded --- Refresh.Core/Extensions/GameDatabaseContextExtensions.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Refresh.Core/Extensions/GameDatabaseContextExtensions.cs b/Refresh.Core/Extensions/GameDatabaseContextExtensions.cs index 761a8b47..f0923d39 100644 --- a/Refresh.Core/Extensions/GameDatabaseContextExtensions.cs +++ b/Refresh.Core/Extensions/GameDatabaseContextExtensions.cs @@ -1,18 +1,23 @@ using Refresh.Database; using Refresh.Database.Models.Assets; +using Refresh.Database.Models.Authentication; using Refresh.Database.Models.Levels; namespace Refresh.Core.Extensions; public static class GameDatabaseContextExtensions { - public static void UpdateLevelModdedStatus(this GameDatabaseContext database, GameLevel level) + public static void UpdateLevelModdedStatus(this GameDatabaseContext database, GameLevel level, bool save = true) { - database.SetLevelModdedStatus(level, database.GetLevelModdedStatus(level)); + database.SetLevelModdedStatus(level, database.GetLevelModdedStatus(level), save); } public static bool GetLevelModdedStatus(this GameDatabaseContext database, GameLevel level) { + // Skip this for PSP assets, as we can't read them nor determine their type (yet) + if (level.GameVersion == TokenGame.LittleBigPlanetPSP) + return false; + bool modded = false; GameAsset? rootAsset = database.GetAssetFromHash(level.RootResource); From 634179e4a212bf22acbdcbc7788ec18b15947f23 Mon Sep 17 00:00:00 2001 From: Toaster2 Date: Wed, 27 May 2026 18:05:19 +0200 Subject: [PATCH 3/4] Migration to unflag modded status on existing PSP levels --- .../GameDatabaseContext.Levels.cs | 8 ++--- .../CorrectLevelModdedStatusMigration.cs | 29 +++++++++++++++++++ .../RefreshWorkerManager.cs | 1 + 3 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 Refresh.Interfaces.Workers/Migrations/CorrectLevelModdedStatusMigration.cs diff --git a/Refresh.Database/GameDatabaseContext.Levels.cs b/Refresh.Database/GameDatabaseContext.Levels.cs index 6bc9e3cc..c553f395 100644 --- a/Refresh.Database/GameDatabaseContext.Levels.cs +++ b/Refresh.Database/GameDatabaseContext.Levels.cs @@ -597,12 +597,10 @@ public void SetLevelCoolRatings(Dictionary coolRatingsToSet) this.SaveChanges(); } - public void SetLevelModdedStatus(GameLevel level, bool modded) + public void SetLevelModdedStatus(GameLevel level, bool modded, bool save = true) { - this.Write(() => - { - level.IsModded = modded; - }); + level.IsModded = modded; + if (save) this.SaveChanges(); } public void SetLevelModdedStatuses(Dictionary levels) diff --git a/Refresh.Interfaces.Workers/Migrations/CorrectLevelModdedStatusMigration.cs b/Refresh.Interfaces.Workers/Migrations/CorrectLevelModdedStatusMigration.cs new file mode 100644 index 00000000..4d3156aa --- /dev/null +++ b/Refresh.Interfaces.Workers/Migrations/CorrectLevelModdedStatusMigration.cs @@ -0,0 +1,29 @@ +using Refresh.Core.Extensions; +using Refresh.Database.Models.Authentication; +using Refresh.Database.Models.Levels; +using Refresh.Workers; + +namespace Refresh.Interfaces.Workers.Migrations; + +public class CorrectLevelModdedStatusMigration : MigrationJob +{ + protected override int BatchCount => 1000; + + protected override IQueryable SortAndFilter(IQueryable query) + { + return query + .Where(l => l.GameVersion == TokenGame.LittleBigPlanetPSP) // for now this should only unflag PSP levels + .OrderBy(l => l.LevelId); + } + + protected override int Migrate(WorkContext context, GameLevel[] batch) + { + foreach (GameLevel level in batch) + { + context.Database.UpdateLevelModdedStatus(level, false); + } + + context.Database.SaveChanges(); + return batch.Length; + } +} \ No newline at end of file diff --git a/Refresh.Interfaces.Workers/RefreshWorkerManager.cs b/Refresh.Interfaces.Workers/RefreshWorkerManager.cs index 428363d9..88dfc5d0 100644 --- a/Refresh.Interfaces.Workers/RefreshWorkerManager.cs +++ b/Refresh.Interfaces.Workers/RefreshWorkerManager.cs @@ -28,6 +28,7 @@ public static WorkerManager Create(Logger logger, IDataStore dataStore, GameData manager.AddJob(); manager.AddJob(); manager.AddJob(); + manager.AddJob(); return manager; } From 75fef66c0c69279452e2bf0d9bc21d559e7b6e05 Mon Sep 17 00:00:00 2001 From: Toaster2 Date: Wed, 27 May 2026 21:45:01 +0200 Subject: [PATCH 4/4] Test unreadable PSP asset uploading/flagging --- .../Tests/Assets/AssetUploadTests.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/RefreshTests.GameServer/Tests/Assets/AssetUploadTests.cs b/RefreshTests.GameServer/Tests/Assets/AssetUploadTests.cs index 2a79fd7f..654e6335 100644 --- a/RefreshTests.GameServer/Tests/Assets/AssetUploadTests.cs +++ b/RefreshTests.GameServer/Tests/Assets/AssetUploadTests.cs @@ -1,6 +1,7 @@ using System.Security.Cryptography; using Refresh.Core.Configuration; using Refresh.Core.Services; +using Refresh.Database.Models.Assets; using Refresh.Database.Models.Authentication; using Refresh.Database.Models.Users; using Refresh.Interfaces.Game.Types.Lists; @@ -258,6 +259,53 @@ public void PspCanUploadNormalAssetWhileBlocked() HttpResponseMessage response = client.PostAsync("/lbp/upload/" + hash, new ByteArrayContent(data.ToArray())).Result; Assert.That(response.StatusCode, Is.EqualTo(OK)); } + + [Test] + public void UnreadablePspAssetsAreNotMarkedAsModdedDangerous() + { + using TestContext context = this.GetServer(); + GameUser user = context.CreateUser(); + + using HttpClient client = context.GetAuthenticatedClient(TokenType.Game, TokenGame.LittleBigPlanetPSP, TokenPlatform.PSP, user); + client.DefaultRequestHeaders.UserAgent.TryParseAdd("LBPPSP CLIENT"); + + ReadOnlySpan data = "MMMMMMMMMMMMMMMMMMMMM"u8; + + string hash = BitConverter.ToString(SHA1.HashData(data)) + .Replace("-", "") + .ToLower(); + + HttpResponseMessage response = client.PostAsync("/lbp/upload/" + hash, new ByteArrayContent(data.ToArray())).Result; + Assert.That(response.StatusCode, Is.EqualTo(OK)); + + GameAsset? assetInfo = context.Database.GetAssetFromHash(hash); + Assert.That(assetInfo, Is.Not.Null); + Assert.That(assetInfo!.AssetType, Is.EqualTo(GameAssetType.Unknown)); + Assert.That(assetInfo!.AssetFormat, Is.EqualTo(GameAssetFormat.Unknown)); + Assert.That(assetInfo!.IsPSP, Is.True); + Assert.That(assetInfo!.AssetFlags, Is.EqualTo(AssetFlags.None)); + } + + [Test] + public void CantUploadUnreadableAssetFromNonPsp() + { + using TestContext context = this.GetServer(); + GameUser user = context.CreateUser(); + + using HttpClient client = context.GetAuthenticatedClient(TokenType.Game, TokenGame.LittleBigPlanet2, TokenPlatform.PS3, user); + + ReadOnlySpan data = "MMMMMMMMMMMMMMMMMMMMM"u8; + + string hash = BitConverter.ToString(SHA1.HashData(data)) + .Replace("-", "") + .ToLower(); + + HttpResponseMessage response = client.PostAsync("/lbp/upload/" + hash, new ByteArrayContent(data.ToArray())).Result; + Assert.That(response.StatusCode, Is.EqualTo(Unauthorized)); + + GameAsset? assetInfo = context.Database.GetAssetFromHash(hash); + Assert.That(assetInfo, Is.Null); + } [Test] public void CantUploadAssetWithInvalidHash()