Skip to content

Commit c15419a

Browse files
authored
Don't flag PSP assets/levels as modded (#1083)
Fixes an issue where PSP assets would be flagged as modded/dangerous because they don't have any magic/can't be read by the server yet, and also fixes PSP levels always being flagged as modded because of that. Also unflags already existing PSP levels. Needs unit tests for level flagging.
2 parents 602ad61 + 2aed7e2 commit c15419a

8 files changed

Lines changed: 143 additions & 7 deletions

File tree

Refresh.Core/Extensions/GameDatabaseContextExtensions.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
using Refresh.Database;
22
using Refresh.Database.Models.Assets;
3+
using Refresh.Database.Models.Authentication;
34
using Refresh.Database.Models.Levels;
45

56
namespace Refresh.Core.Extensions;
67

78
public static class GameDatabaseContextExtensions
89
{
9-
public static void UpdateLevelModdedStatus(this GameDatabaseContext database, GameLevel level)
10+
public static void UpdateLevelModdedStatus(this GameDatabaseContext database, GameLevel level, bool save = true)
1011
{
11-
database.SetLevelModdedStatus(level, database.GetLevelModdedStatus(level));
12+
database.SetLevelModdedStatus(level, database.GetLevelModdedStatus(level), save);
1213
}
1314

1415
public static bool GetLevelModdedStatus(this GameDatabaseContext database, GameLevel level)
1516
{
17+
// Skip this for PSP assets, as we can't read them nor determine their type (yet)
18+
if (level.GameVersion == TokenGame.LittleBigPlanetPSP)
19+
return false;
20+
1621
bool modded = false;
1722

1823
GameAsset? rootAsset = database.GetAssetFromHash(level.RootResource);

Refresh.Database/GameDatabaseContext.Levels.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -597,12 +597,10 @@ public void SetLevelCoolRatings(Dictionary<GameLevel, float> coolRatingsToSet)
597597
this.SaveChanges();
598598
}
599599

600-
public void SetLevelModdedStatus(GameLevel level, bool modded)
600+
public void SetLevelModdedStatus(GameLevel level, bool modded, bool save = true)
601601
{
602-
this.Write(() =>
603-
{
604-
level.IsModded = modded;
605-
});
602+
level.IsModded = modded;
603+
if (save) this.SaveChanges();
606604
}
607605

608606
public void SetLevelModdedStatuses(Dictionary<GameLevel, bool> levels)

Refresh.Database/Models/Assets/GameAsset.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ public AssetFlags AssetFlags
2525
if (VanillaHashChecker.IsVanillaHash(this.AssetHash))
2626
flags &= ~AssetFlags.Modded;
2727

28+
// If this is a PSP asset, strip both modded and dangerous flags
29+
if (this.IsPSP)
30+
{
31+
flags &= ~AssetFlags.Modded;
32+
flags &= ~AssetFlags.Dangerous;
33+
}
34+
2835
return flags;
2936
}
3037
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using Refresh.Core.Extensions;
2+
using Refresh.Database.Models.Authentication;
3+
using Refresh.Database.Models.Levels;
4+
using Refresh.Workers;
5+
6+
namespace Refresh.Interfaces.Workers.Migrations;
7+
8+
public class CorrectLevelModdedStatusMigration : MigrationJob<GameLevel>
9+
{
10+
protected override int BatchCount => 1000;
11+
12+
protected override IQueryable<GameLevel> SortAndFilter(IQueryable<GameLevel> query)
13+
{
14+
return query
15+
.Where(l => l.GameVersion == TokenGame.LittleBigPlanetPSP) // for now this should only unflag PSP levels
16+
.OrderBy(l => l.LevelId);
17+
}
18+
19+
protected override int Migrate(WorkContext context, GameLevel[] batch)
20+
{
21+
foreach (GameLevel level in batch)
22+
{
23+
context.Database.UpdateLevelModdedStatus(level, false);
24+
}
25+
26+
context.Database.SaveChanges();
27+
return batch.Length;
28+
}
29+
}

Refresh.Interfaces.Workers/RefreshWorkerManager.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public static WorkerManager Create(Logger logger, IDataStore dataStore, GameData
2828
manager.AddJob<CorrectWebsitePinProgressPlatformMigration>();
2929
manager.AddJob<CalculateScoreRanksMigration>();
3030
manager.AddJob<MoveSubjectsOutOfGamePhotosMigration>();
31+
manager.AddJob<CorrectLevelModdedStatusMigration>();
3132

3233
return manager;
3334
}

RefreshTests.GameServer/TestContext.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,17 @@ public GameLevel CreateLevel(GameUser author, string title, string description,
163163
return level;
164164
}
165165

166+
public GameLevel CreateLevelWithRootResource(GameUser author, string rootResource, TokenGame gameVersion = TokenGame.LittleBigPlanet1)
167+
{
168+
GameLevelRequest levelRequest = new()
169+
{
170+
RootResource = rootResource,
171+
};
172+
173+
GameLevel level = this.Database.AddLevel(levelRequest, gameVersion, author);
174+
return level;
175+
}
176+
166177
public GamePhoto CreatePhotoWithSubject(GameUser author, string imageHash, GameLevel? level = null, List<SerializedPhotoSubject>? subjects = null)
167178
{
168179
// TODO: Return newly created GamePhoto

RefreshTests.GameServer/Tests/Assets/AssetUploadTests.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Security.Cryptography;
22
using Refresh.Core.Configuration;
33
using Refresh.Core.Services;
4+
using Refresh.Database.Models.Assets;
45
using Refresh.Database.Models.Authentication;
56
using Refresh.Database.Models.Users;
67
using Refresh.Interfaces.Game.Types.Lists;
@@ -258,6 +259,53 @@ public void PspCanUploadNormalAssetWhileBlocked()
258259
HttpResponseMessage response = client.PostAsync("/lbp/upload/" + hash, new ByteArrayContent(data.ToArray())).Result;
259260
Assert.That(response.StatusCode, Is.EqualTo(OK));
260261
}
262+
263+
[Test]
264+
public void UnreadablePspAssetsAreNotMarkedAsModdedDangerous()
265+
{
266+
using TestContext context = this.GetServer();
267+
GameUser user = context.CreateUser();
268+
269+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Game, TokenGame.LittleBigPlanetPSP, TokenPlatform.PSP, user);
270+
client.DefaultRequestHeaders.UserAgent.TryParseAdd("LBPPSP CLIENT");
271+
272+
ReadOnlySpan<byte> data = "MMMMMMMMMMMMMMMMMMMMM"u8;
273+
274+
string hash = BitConverter.ToString(SHA1.HashData(data))
275+
.Replace("-", "")
276+
.ToLower();
277+
278+
HttpResponseMessage response = client.PostAsync("/lbp/upload/" + hash, new ByteArrayContent(data.ToArray())).Result;
279+
Assert.That(response.StatusCode, Is.EqualTo(OK));
280+
281+
GameAsset? assetInfo = context.Database.GetAssetFromHash(hash);
282+
Assert.That(assetInfo, Is.Not.Null);
283+
Assert.That(assetInfo!.AssetType, Is.EqualTo(GameAssetType.Unknown));
284+
Assert.That(assetInfo!.AssetFormat, Is.EqualTo(GameAssetFormat.Unknown));
285+
Assert.That(assetInfo!.IsPSP, Is.True);
286+
Assert.That(assetInfo!.AssetFlags, Is.EqualTo(AssetFlags.None));
287+
}
288+
289+
[Test]
290+
public void CantUploadUnreadableAssetFromNonPsp()
291+
{
292+
using TestContext context = this.GetServer();
293+
GameUser user = context.CreateUser();
294+
295+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Game, TokenGame.LittleBigPlanet2, TokenPlatform.PS3, user);
296+
297+
ReadOnlySpan<byte> data = "MMMMMMMMMMMMMMMMMMMMM"u8;
298+
299+
string hash = BitConverter.ToString(SHA1.HashData(data))
300+
.Replace("-", "")
301+
.ToLower();
302+
303+
HttpResponseMessage response = client.PostAsync("/lbp/upload/" + hash, new ByteArrayContent(data.ToArray())).Result;
304+
Assert.That(response.StatusCode, Is.EqualTo(Unauthorized));
305+
306+
GameAsset? assetInfo = context.Database.GetAssetFromHash(hash);
307+
Assert.That(assetInfo, Is.Null);
308+
}
261309

262310
[Test]
263311
public void CantUploadAssetWithInvalidHash()

RefreshTests.GameServer/Tests/Levels/UploadTests.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
using Refresh.Database.Models.Levels;
33
using Refresh.Interfaces.Game.Endpoints.DataTypes.Request;
44
using Refresh.Database.Models.Authentication;
5+
using System.Security.Cryptography;
6+
using Refresh.Core.Extensions;
7+
using Refresh.Database.Models.Assets;
58

69
namespace RefreshTests.GameServer.Tests.Levels;
710

@@ -152,4 +155,38 @@ public void LevelUpdateDoesNotChangeUpdateDateWhenRootUnchanged()
152155
Assert.That(level.UpdateDate.ToUnixTimeMilliseconds(), Is.EqualTo(1));
153156
});
154157
}
158+
159+
[Test]
160+
public void PspLevelWithUnknownRootTypeDoesNotGetMarkedAsModded()
161+
{
162+
using TestContext context = this.GetServer();
163+
GameUser user = context.CreateUser();
164+
165+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Game, TokenGame.LittleBigPlanetPSP, TokenPlatform.PSP, user);
166+
client.DefaultRequestHeaders.UserAgent.TryParseAdd("LBPPSP CLIENT");
167+
168+
// upload asset from PSP
169+
ReadOnlySpan<byte> data = "MMMMMMMMMMMMMMMMMMMMM"u8;
170+
string hash = BitConverter.ToString(SHA1.HashData(data)).Replace("-", "").ToLower();
171+
172+
HttpResponseMessage response = client.PostAsync("/lbp/upload/" + hash, new ByteArrayContent(data.ToArray())).Result;
173+
Assert.That(response.StatusCode, Is.EqualTo(OK));
174+
175+
GameAsset? rootAsset = context.Database.GetAssetFromHash(hash);
176+
Assert.That(rootAsset, Is.Not.Null);
177+
Assert.That(rootAsset!.IsPSP, Is.True);
178+
Assert.That(rootAsset!.AssetType, Is.EqualTo(GameAssetType.Unknown));
179+
Assert.That(rootAsset!.AssetFormat, Is.EqualTo(GameAssetFormat.Unknown));
180+
181+
GameLevel level = context.CreateLevelWithRootResource(user, hash, TokenGame.LittleBigPlanetPSP);
182+
context.Database.UpdateLevelModdedStatus(level);
183+
184+
context.Database.Refresh();
185+
186+
GameLevel? updatedLevel = context.Database.GetLevelById(level.LevelId);
187+
Assert.That(updatedLevel, Is.Not.Null);
188+
Assert.That(updatedLevel!.LevelId, Is.EqualTo(level.LevelId));
189+
Assert.That(updatedLevel!.RootResource, Is.EqualTo(hash));
190+
Assert.That(updatedLevel!.IsModded, Is.False);
191+
}
155192
}

0 commit comments

Comments
 (0)