Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions Refresh.Core/Extensions/GameDatabaseContextExtensions.cs
Original file line number Diff line number Diff line change
@@ -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);
Expand Down
8 changes: 3 additions & 5 deletions Refresh.Database/GameDatabaseContext.Levels.cs
Original file line number Diff line number Diff line change
Expand Up @@ -597,12 +597,10 @@ public void SetLevelCoolRatings(Dictionary<GameLevel, float> 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<GameLevel, bool> levels)
Expand Down
7 changes: 7 additions & 0 deletions Refresh.Database/Models/Assets/GameAsset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<GameLevel>
{
protected override int BatchCount => 1000;

protected override IQueryable<GameLevel> SortAndFilter(IQueryable<GameLevel> 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;
}
}
1 change: 1 addition & 0 deletions Refresh.Interfaces.Workers/RefreshWorkerManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public static WorkerManager Create(Logger logger, IDataStore dataStore, GameData
manager.AddJob<CorrectWebsitePinProgressPlatformMigration>();
manager.AddJob<CalculateScoreRanksMigration>();
manager.AddJob<MoveSubjectsOutOfGamePhotosMigration>();
manager.AddJob<CorrectLevelModdedStatusMigration>();

return manager;
}
Expand Down
48 changes: 48 additions & 0 deletions RefreshTests.GameServer/Tests/Assets/AssetUploadTests.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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<byte> 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<byte> 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()
Expand Down
Loading