Fix digest tests and update controllers with new digest attribute

This commit is contained in:
Slendy 2024-02-29 18:27:26 -06:00
commit d458eb90ad
No known key found for this signature in database
GPG key ID: 7288D68361B91428
29 changed files with 178 additions and 267 deletions

View file

@ -1,9 +1,9 @@
#nullable enable
using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Filter; using LBPUnion.ProjectLighthouse.Types.Filter;
@ -11,17 +11,12 @@ using LBPUnion.ProjectLighthouse.Types.Levels;
using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Logging;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using LBPUnion.ProjectLighthouse.Types.Users; using LBPUnion.ProjectLighthouse.Types.Users;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers;
[ApiController] public class CommentController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class CommentController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;
public CommentController(DatabaseContext database) public CommentController(DatabaseContext database)

View file

@ -1,14 +1,10 @@
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using Microsoft.AspNetCore.Authorization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers;
[ApiController] public class DeveloperController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class DeveloperController : Controller
{ {
[HttpGet("developer_videos")] [HttpGet("developer_videos")]
public IActionResult DeveloperVideos() => this.Ok(new GameDeveloperVideos()); public IActionResult DeveloperVideos() => this.Ok(new GameDeveloperVideos());

View file

@ -1,23 +1,18 @@
#nullable enable
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Users; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Users;
using LBPUnion.ProjectLighthouse.StorableLists.Stores; using LBPUnion.ProjectLighthouse.StorableLists.Stores;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using LBPUnion.ProjectLighthouse.Types.Users; using LBPUnion.ProjectLighthouse.Types.Users;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers;
[ApiController] public class FriendsController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class FriendsController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,22 +1,18 @@
#nullable enable
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Users; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Users;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using LBPUnion.ProjectLighthouse.Types.Users; using LBPUnion.ProjectLighthouse.Types.Users;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Login; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Login;
[ApiController]
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/plain")] [Produces("text/plain")]
public class ClientConfigurationController : ControllerBase public class ClientConfigurationController : GameController
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;
@ -26,6 +22,7 @@ public class ClientConfigurationController : ControllerBase
} }
[HttpGet("network_settings.nws")] [HttpGet("network_settings.nws")]
[UseDigest(EnforceDigest = false)]
[SuppressMessage("ReSharper", "StringLiteralTypo")] [SuppressMessage("ReSharper", "StringLiteralTypo")]
public IActionResult NetworkSettings() public IActionResult NetworkSettings()
{ {
@ -41,15 +38,18 @@ public class ClientConfigurationController : ControllerBase
[HttpGet("t_conf")] [HttpGet("t_conf")]
[Produces("text/xml")] [Produces("text/xml")]
[UseDigest(EnforceDigest = false)]
public IActionResult Conf() => this.Ok(new TelemetryConfigResponse()); public IActionResult Conf() => this.Ok(new TelemetryConfigResponse());
// The challenge config here is currently based on the official server's config. // The challenge config here is currently based on the official server's config.
// We should probably make this configurable in the future. // We should probably make this configurable in the future.
[HttpGet("ChallengeConfig.xml")] [HttpGet("ChallengeConfig.xml")]
[Produces("text/xml")] [Produces("text/xml")]
[UseDigest(EnforceDigest = false)]
public IActionResult Challenges() => this.Ok(GameChallengeResponse.ServerChallenges()); public IActionResult Challenges() => this.Ok(GameChallengeResponse.ServerChallenges());
[HttpGet("farc_hashes")] [HttpGet("farc_hashes")]
[UseDigest(EnforceDigest = false)]
public IActionResult FarcHashes() => this.Ok(); public IActionResult FarcHashes() => this.Ok();
[HttpGet("privacySettings")] [HttpGet("privacySettings")]

View file

@ -1,4 +1,3 @@
#nullable enable
using System.Net; using System.Net;
using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;

View file

@ -1,20 +1,15 @@
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Login; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Login;
[ApiController] public class LogoutController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/goodbye")]
[Produces("text/xml")]
public class LogoutController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;
public LogoutController(DatabaseContext database) public LogoutController(DatabaseContext database)
@ -22,8 +17,8 @@ public class LogoutController : ControllerBase
this.database = database; this.database = database;
} }
[HttpPost] [HttpPost("goodbye")]
public async Task<IActionResult> OnPost() public async Task<IActionResult> OnLogout()
{ {
GameTokenEntity token = this.GetToken(); GameTokenEntity token = this.GetToken();
@ -37,6 +32,4 @@ public class LogoutController : ControllerBase
return this.Ok(); return this.Ok();
} }
} }

View file

@ -1,22 +1,17 @@
#nullable enable
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Interaction; using LBPUnion.ProjectLighthouse.Types.Entities.Interaction;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Users; using LBPUnion.ProjectLighthouse.Types.Users;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Matching; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Matching;
[ApiController] public class EnterLevelController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class EnterLevelController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,26 +1,21 @@
#nullable enable
using System.Text.Json; using System.Text.Json;
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Logging;
using LBPUnion.ProjectLighthouse.Types.Matchmaking; using LBPUnion.ProjectLighthouse.Types.Matchmaking;
using LBPUnion.ProjectLighthouse.Types.Matchmaking.MatchCommands; using LBPUnion.ProjectLighthouse.Types.Matchmaking.MatchCommands;
using LBPUnion.ProjectLighthouse.Types.Matchmaking.Rooms; using LBPUnion.ProjectLighthouse.Types.Matchmaking.Rooms;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Matching; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Matching;
[ApiController] public class MatchController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class MatchController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -5,23 +5,20 @@ using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.Serialization; using LBPUnion.ProjectLighthouse.Serialization;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Notifications; using LBPUnion.ProjectLighthouse.Types.Entities.Notifications;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Logging;
using LBPUnion.ProjectLighthouse.Types.Mail; using LBPUnion.ProjectLighthouse.Types.Mail;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers;
[ApiController]
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/plain")] [Produces("text/plain")]
public class MessageController : ControllerBase public class MessageController : GameController
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;
@ -45,9 +42,11 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.";
} }
[HttpGet("eula")] [HttpGet("eula")]
[UseDigest(EnforceDigest = false)]
public IActionResult Eula() => this.Ok($"{license}\n{ServerConfiguration.Instance.EulaText}"); public IActionResult Eula() => this.Ok($"{license}\n{ServerConfiguration.Instance.EulaText}");
[HttpGet("announce")] [HttpGet("announce")]
[UseDigest(EnforceDigest = false)]
public async Task<IActionResult> Announce() public async Task<IActionResult> Announce()
{ {
GameTokenEntity token = this.GetToken(); GameTokenEntity token = this.GetToken();

View file

@ -1,24 +1,19 @@
#nullable enable using System.Text.Json;
using System.Text.Json;
using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Files;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Moderation; using LBPUnion.ProjectLighthouse.Types.Entities.Moderation;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Moderation.Reports; using LBPUnion.ProjectLighthouse.Types.Moderation.Reports;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers;
[ApiController] public class ReportController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class ReportController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,4 +1,3 @@
#nullable enable
using Discord; using Discord;
using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
@ -6,6 +5,7 @@ using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Files;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
@ -13,17 +13,12 @@ using LBPUnion.ProjectLighthouse.Types.Filter;
using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Levels;
using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Logging;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Resources; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Resources;
[ApiController] public class PhotosController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class PhotosController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,22 +1,17 @@
#nullable enable
using System.Text; using System.Text;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Files;
using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Misc; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Misc;
using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Logging;
using LBPUnion.ProjectLighthouse.Types.Resources; using LBPUnion.ProjectLighthouse.Types.Resources;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using IOFile = System.IO.File; using IOFile = System.IO.File;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Resources; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Resources;
[ApiController] public class ResourcesController : GameController
[Authorize]
[Produces("text/xml")]
[Route("LITTLEBIGPLANETPS3_XML")]
public class ResourcesController : ControllerBase
{ {
[HttpPost("showModerated")] [HttpPost("showModerated")]
@ -51,6 +46,7 @@ public class ResourcesController : ControllerBase
[HttpPost("upload/{hash}/unattributed")] [HttpPost("upload/{hash}/unattributed")]
[HttpPost("upload/{hash}")] [HttpPost("upload/{hash}")]
[UseDigest(DigestHeaderName = "X-Digest-B", ExcludeBodyFromDigest = true)]
public async Task<IActionResult> UploadResource(string hash) public async Task<IActionResult> UploadResource(string hash)
{ {
string assetsDirectory = FileHelper.ResourcePath; string assetsDirectory = FileHelper.ResourcePath;

View file

@ -4,6 +4,7 @@ using LBPUnion.ProjectLighthouse.Filter;
using LBPUnion.ProjectLighthouse.Filter.Sorts; using LBPUnion.ProjectLighthouse.Filter.Sorts;
using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions; using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Categories; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Categories;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
@ -13,17 +14,12 @@ using LBPUnion.ProjectLighthouse.Types.Levels;
using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Logging;
using LBPUnion.ProjectLighthouse.Types.Misc; using LBPUnion.ProjectLighthouse.Types.Misc;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots;
[ApiController] public class CategoryController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class CategoryController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,22 +1,18 @@
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Interaction; using LBPUnion.ProjectLighthouse.Types.Entities.Interaction;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Levels;
using LBPUnion.ProjectLighthouse.Types.Users; using LBPUnion.ProjectLighthouse.Types.Users;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots;
[ApiController] public class LevelTagsController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML")]
[Produces("text/plain")]
public class LevelTagsController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,9 +1,9 @@
#nullable enable
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Filter; using LBPUnion.ProjectLighthouse.Filter;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions; using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
@ -11,17 +11,12 @@ using LBPUnion.ProjectLighthouse.Types.Filter;
using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Levels;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using LBPUnion.ProjectLighthouse.Types.Users; using LBPUnion.ProjectLighthouse.Types.Users;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots;
[ApiController] public class ListController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class ListController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,21 +1,16 @@
#nullable enable
using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots;
[ApiController] public class PlaylistController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class PlaylistController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -6,6 +6,7 @@ using LBPUnion.ProjectLighthouse.Files;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Helpers; using LBPUnion.ProjectLighthouse.Servers.GameServer.Helpers;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
@ -23,7 +24,7 @@ namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots;
[Authorize] [Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")] [Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")] [Produces("text/xml")]
public class PublishController : ControllerBase public class PublishController : GameController
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,23 +1,18 @@
#nullable enable
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Interaction; using LBPUnion.ProjectLighthouse.Types.Entities.Interaction;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Filter; using LBPUnion.ProjectLighthouse.Types.Filter;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots;
[ApiController] public class ReviewController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class ReviewController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,8 +1,8 @@
#nullable enable
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.StorableLists.Stores; using LBPUnion.ProjectLighthouse.StorableLists.Stores;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
@ -10,17 +10,12 @@ using LBPUnion.ProjectLighthouse.Types.Levels;
using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Logging;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using LBPUnion.ProjectLighthouse.Types.Users; using LBPUnion.ProjectLighthouse.Types.Users;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots;
[ApiController] public class ScoreController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class ScoreController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,25 +1,20 @@
#nullable enable
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Filter; using LBPUnion.ProjectLighthouse.Filter;
using LBPUnion.ProjectLighthouse.Filter.Filters; using LBPUnion.ProjectLighthouse.Filter.Filters;
using LBPUnion.ProjectLighthouse.Filter.Sorts; using LBPUnion.ProjectLighthouse.Filter.Sorts;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions; using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Filter; using LBPUnion.ProjectLighthouse.Types.Filter;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots;
[ApiController] public class SearchController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/slots")]
[Produces("text/xml")]
public class SearchController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;
public SearchController(DatabaseContext database) public SearchController(DatabaseContext database)

View file

@ -1,4 +1,3 @@
#nullable enable
using System.Linq.Expressions; using System.Linq.Expressions;
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
@ -8,6 +7,7 @@ using LBPUnion.ProjectLighthouse.Filter.Sorts;
using LBPUnion.ProjectLighthouse.Filter.Sorts.Metadata; using LBPUnion.ProjectLighthouse.Filter.Sorts.Metadata;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions; using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Entities.Token;
using LBPUnion.ProjectLighthouse.Types.Filter; using LBPUnion.ProjectLighthouse.Types.Filter;
@ -15,17 +15,12 @@ using LBPUnion.ProjectLighthouse.Types.Levels;
using LBPUnion.ProjectLighthouse.Types.Misc; using LBPUnion.ProjectLighthouse.Types.Misc;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using LBPUnion.ProjectLighthouse.Types.Users; using LBPUnion.ProjectLighthouse.Types.Users;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots;
[ApiController] public class SlotsController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class SlotsController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,20 +1,17 @@
using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Filter; using LBPUnion.ProjectLighthouse.Filter;
using LBPUnion.ProjectLighthouse.Filter.Filters; using LBPUnion.ProjectLighthouse.Filter.Filters;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions; using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers;
[ApiController]
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/plain")] [Produces("text/plain")]
public class StatisticsController : ControllerBase public class StatisticsController : GameController
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,13 +1,9 @@
using Microsoft.AspNetCore.Authorization; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers;
[ApiController] public class StoreController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class StoreController : Controller
{ {
[HttpGet("promotions")] [HttpGet("promotions")]
public IActionResult Promotions() => this.Ok(); public IActionResult Promotions() => this.Ok();

View file

@ -4,6 +4,7 @@ using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Files;
using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Helpers; using LBPUnion.ProjectLighthouse.Servers.GameServer.Helpers;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Users; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Users;
using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Level;
using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Profile;
@ -12,17 +13,12 @@ using LBPUnion.ProjectLighthouse.Types.Levels;
using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Logging;
using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Serialization;
using LBPUnion.ProjectLighthouse.Types.Users; using LBPUnion.ProjectLighthouse.Types.Users;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers;
[ApiController] public class UserController : GameController
[Authorize]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class UserController : ControllerBase
{ {
private readonly DatabaseContext database; private readonly DatabaseContext database;

View file

@ -1,4 +1,3 @@
using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Extensions;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Middlewares; using LBPUnion.ProjectLighthouse.Middlewares;
@ -10,13 +9,6 @@ namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Middlewares;
public class DigestMiddleware : Middleware public class DigestMiddleware : Middleware
{ {
private readonly bool computeDigests;
public DigestMiddleware(RequestDelegate next, bool computeDigests) : base(next)
{
this.computeDigests = computeDigests;
}
private readonly List<string> digestKeys; private readonly List<string> digestKeys;
public DigestMiddleware(RequestDelegate next, List<string> digestKeys) : base(next) public DigestMiddleware(RequestDelegate next, List<string> digestKeys) : base(next)
@ -54,61 +46,59 @@ public class DigestMiddleware : Middleware
public override async Task InvokeAsync(HttpContext context) public override async Task InvokeAsync(HttpContext context)
{ {
UseDigestAttribute? digestAttribute = context.GetEndpoint()?.Metadata.OfType<UseDigestAttribute>().FirstOrDefault(); // If no digest keys are supplied, then we can't do anything
if (this.digestKeys.Count == 0)
{
await this.next(context);
return;
}
UseDigestAttribute? digestAttribute = context.GetEndpoint()?.Metadata.GetMetadata<UseDigestAttribute>();
if (digestAttribute == null) if (digestAttribute == null)
{ {
await this.next(context); await this.next(context);
return; return;
} }
if (!context.Request.Cookies.TryGetValue("MM_AUTH", out string? authCookie)) if (!context.Request.Cookies.TryGetValue("MM_AUTH", out string? authCookie)) authCookie = string.Empty;
{
context.Response.StatusCode = 403;
return;
}
string digestPath = context.Request.Path; string digestPath = context.Request.Path;
byte[] bodyBytes = await context.Request.BodyReader.ReadAllAsync(); byte[] bodyBytes = await context.Request.BodyReader.ReadAllAsync();
if (!context.Request.Headers.TryGetValue(digestAttribute.DigestHeaderName, out StringValues digestHeaders) || if ((!context.Request.Headers.TryGetValue(digestAttribute.DigestHeaderName, out StringValues digestHeaders) ||
digestHeaders.Count != 1 && digestAttribute.EnforceDigest) digestHeaders.Count != 1) && digestAttribute.EnforceDigest)
{ {
context.Response.StatusCode = 403; context.Response.StatusCode = 403;
return; return;
} }
string? clientDigest = digestHeaders[0]; string? clientDigest = digestHeaders.FirstOrDefault() ?? null;
string? matchingDigestKey = null; string? matchingDigestKey = null;
string? calculatedRequestDigest = null; string? calculatedRequestDigest = null;
foreach (string digestKey in this.digestKeys) if (clientDigest != null)
{ {
string calculatedDigest = CryptoHelper.ComputeDigest(digestPath, foreach (string digestKey in this.digestKeys)
authCookie, {
bodyBytes, string calculatedDigest = CalculateDigest(digestKey, bodyBytes);
digestKey, if (calculatedDigest != clientDigest) continue;
digestAttribute.ExcludeBodyFromDigest);
if (calculatedDigest != clientDigest) continue;
matchingDigestKey = digestKey; matchingDigestKey = digestKey;
calculatedRequestDigest = calculatedDigest; calculatedRequestDigest = calculatedDigest;
}
} }
matchingDigestKey ??= this.digestKeys.First(); matchingDigestKey ??= this.digestKeys.First();
switch (matchingDigestKey) switch (calculatedRequestDigest)
{ {
case null when digestAttribute.EnforceDigest: case null when digestAttribute.EnforceDigest:
context.Response.StatusCode = 403; context.Response.StatusCode = 403;
return; return;
case null: case null:
calculatedRequestDigest = CryptoHelper.ComputeDigest(digestPath, calculatedRequestDigest = CalculateDigest(matchingDigestKey, bodyBytes);
authCookie,
bodyBytes,
matchingDigestKey,
digestAttribute.ExcludeBodyFromDigest);
break; break;
} }
@ -124,17 +114,21 @@ public class DigestMiddleware : Middleware
await HandleResponseCompression(context, responseBuffer); await HandleResponseCompression(context, responseBuffer);
string responseDigest = CryptoHelper.ComputeDigest(digestPath, string responseDigest = CalculateDigest(matchingDigestKey, responseBuffer.ToArray());
authCookie,
responseBuffer.ToArray(),
matchingDigestKey,
digestAttribute.ExcludeBodyFromDigest);
context.Response.Headers.Append("X-Digest-A", responseDigest); context.Response.Headers.Append("X-Digest-A", responseDigest);
responseBuffer.Position = 0; responseBuffer.Position = 0;
await responseBuffer.CopyToAsync(originalBody); await responseBuffer.CopyToAsync(originalBody);
context.Response.Body = originalBody; context.Response.Body = originalBody;
return;
string CalculateDigest(string digestKey, byte[] data) =>
CryptoHelper.ComputeDigest(digestPath,
authCookie,
data,
digestKey,
digestAttribute.ExcludeBodyFromDigest);
} }
} }

View file

@ -84,8 +84,6 @@ public class GameServerStartup
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public virtual void Configure(IApplicationBuilder app, IWebHostEnvironment env) public virtual void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ {
bool computeDigests = true;
if (string.IsNullOrEmpty(ServerConfiguration.Instance.DigestKey.PrimaryDigestKey)) if (string.IsNullOrEmpty(ServerConfiguration.Instance.DigestKey.PrimaryDigestKey))
{ {
Logger.Warn Logger.Warn
@ -94,7 +92,6 @@ public class GameServerStartup
"To increase security, it is recommended that you find and set this variable.", "To increase security, it is recommended that you find and set this variable.",
LogArea.Startup LogArea.Startup
); );
computeDigests = false;
} }
#if DEBUG #if DEBUG
@ -105,11 +102,17 @@ public class GameServerStartup
app.UseMiddleware<RequestLogMiddleware>(); app.UseMiddleware<RequestLogMiddleware>();
app.UseMiddleware<RateLimitMiddleware>(); app.UseMiddleware<RateLimitMiddleware>();
app.UseMiddleware<DigestMiddleware>(computeDigests);
app.UseMiddleware<SetLastContactMiddleware>(); app.UseMiddleware<SetLastContactMiddleware>();
app.UseRouting(); app.UseRouting();
List<string> digestKeys =
[
ServerConfiguration.Instance.DigestKey.PrimaryDigestKey,
ServerConfiguration.Instance.DigestKey.AlternateDigestKey,
];
app.UseMiddleware<DigestMiddleware>(digestKeys);
app.UseAuthorization(); app.UseAuthorization();
app.UseEndpoints(endpoints => endpoints.MapControllers()); app.UseEndpoints(endpoints => endpoints.MapControllers());

View file

@ -0,0 +1,11 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Types;
[ApiController]
[Authorize]
[UseDigest]
[Route("LITTLEBIGPLANETPS3_XML/")]
[Produces("text/xml")]
public class GameController : ControllerBase;

View file

@ -7,5 +7,5 @@ public class UseDigestAttribute : Attribute
public string DigestHeaderName { get; set; } = "X-Digest-A"; public string DigestHeaderName { get; set; } = "X-Digest-A";
public bool ExcludeBodyFromDigest { get; set; } = false; public bool ExcludeBodyFromDigest { get; set; }
} }

View file

@ -14,9 +14,8 @@ namespace ProjectLighthouse.Tests.GameApiTests.Unit.Middlewares;
[Trait("Category", "Unit")] [Trait("Category", "Unit")]
public class DigestMiddlewareTests public class DigestMiddlewareTests
{ {
//TODO: fix remaining unit tests
private static DefaultHttpContext GetHttpContext private static DefaultHttpContext GetHttpContext
(Stream body, string path, string cookie, Dictionary<string, StringValues>? extraHeaders = null) (Stream body, string path, string cookie, Dictionary<string, StringValues>? extraHeaders = null, UseDigestAttribute? digestAttribute = null)
{ {
DefaultHttpContext context = new() DefaultHttpContext context = new()
@ -28,14 +27,20 @@ public class DigestMiddlewareTests
Headers = Headers =
{ {
KeyValuePair.Create<string, StringValues>("Cookie", cookie), KeyValuePair.Create<string, StringValues>("Cookie", cookie),
} },
}, },
}; };
if (extraHeaders == null) return context; if (extraHeaders != null)
foreach ((string key, StringValues value) in extraHeaders)
{ {
context.Request.Headers.Append(key, value); foreach ((string key, StringValues value) in extraHeaders)
{
context.Request.Headers.Append(key, value);
}
}
if (digestAttribute != null)
{
context.SetEndpoint(new Endpoint(null, new EndpointMetadataCollection(digestAttribute), null));
} }
return context; return context;
@ -45,7 +50,6 @@ public class DigestMiddlewareTests
public async Task DigestMiddleware_ShouldNotComputeDigests_WithoutDigestAttribute() public async Task DigestMiddleware_ShouldNotComputeDigests_WithoutDigestAttribute()
{ {
DefaultHttpContext context = GetHttpContext(new MemoryStream(), "/LITTLEBIGPLANETPS3_XML/notification", "MM_AUTH=unittest"); DefaultHttpContext context = GetHttpContext(new MemoryStream(), "/LITTLEBIGPLANETPS3_XML/notification", "MM_AUTH=unittest");
context.SetEndpoint(new Endpoint(null, new EndpointMetadataCollection(), null));
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
httpContext.Response.StatusCode = 200; httpContext.Response.StatusCode = 200;
@ -65,8 +69,11 @@ public class DigestMiddlewareTests
[Fact] [Fact]
public async Task DigestMiddleware_ShouldReject_WhenDigestHeaderIsMissing() public async Task DigestMiddleware_ShouldReject_WhenDigestHeaderIsMissing()
{ {
DefaultHttpContext context = GetHttpContext(new MemoryStream(), "/LITTLEBIGPLANETPS3_XML/notification", "MM_AUTH=unittest"); DefaultHttpContext context = GetHttpContext(new MemoryStream(),
context.SetEndpoint(new Endpoint(null, new EndpointMetadataCollection(new UseDigestAttribute()), null)); "/LITTLEBIGPLANETPS3_XML/notification",
"MM_AUTH=unittest",
null,
new UseDigestAttribute());
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
httpContext.Response.StatusCode = 200; httpContext.Response.StatusCode = 200;
@ -79,8 +86,7 @@ public class DigestMiddlewareTests
const int expectedCode = 403; const int expectedCode = 403;
Assert.True(expectedCode == context.Response.StatusCode, Assert.Equal(expectedCode, context.Response.StatusCode);
"The digest middleware accepted the request when it shouldn't have (are you running this test in Debug mode?)");
Assert.False(context.Response.Headers.TryGetValue("X-Digest-A", out _)); Assert.False(context.Response.Headers.TryGetValue("X-Digest-A", out _));
Assert.False(context.Response.Headers.TryGetValue("X-Digest-B", out _)); Assert.False(context.Response.Headers.TryGetValue("X-Digest-B", out _));
} }
@ -96,8 +102,8 @@ public class DigestMiddlewareTests
{ {
"X-Digest-A", "invalid_digest" "X-Digest-A", "invalid_digest"
}, },
}); },
context.SetEndpoint(new Endpoint(null, new EndpointMetadataCollection(new UseDigestAttribute()), null)); new UseDigestAttribute());
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
httpContext.Response.StatusCode = 200; httpContext.Response.StatusCode = 200;
@ -126,7 +132,8 @@ public class DigestMiddlewareTests
{ {
"X-Digest-A", "df619790a2579a077eae4a6b6864966ff4768723" "X-Digest-A", "df619790a2579a077eae4a6b6864966ff4768723"
}, },
}); },
new UseDigestAttribute());
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
@ -134,7 +141,7 @@ public class DigestMiddlewareTests
httpContext.Response.WriteAsync(""); httpContext.Response.WriteAsync("");
return Task.CompletedTask; return Task.CompletedTask;
}, },
["test, bruh",]); ["test", "bruh",]);
await middleware.InvokeAsync(context); await middleware.InvokeAsync(context);
@ -150,20 +157,16 @@ public class DigestMiddlewareTests
} }
[Fact] [Fact]
public async Task DigestMiddleware_ShouldNotReject_WhenRequestingAnnounce() public async Task DigestMiddleware_ShouldNotReject_WhenNotEnforcingDigest()
{ {
DefaultHttpContext context = new() DefaultHttpContext context = GetHttpContext(new MemoryStream(),
{ "/LITTLEBIGPLANETPS3_XML/announce",
Request = "MM_AUTH=unittest",
new Dictionary<string, StringValues>(),
new UseDigestAttribute
{ {
Body = new MemoryStream(), EnforceDigest = false,
Path = "/LITTLEBIGPLANETPS3_XML/announce", });
Headers =
{
KeyValuePair.Create<string, StringValues>("Cookie", "MM_AUTH=unittest"),
},
},
};
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
@ -189,18 +192,16 @@ public class DigestMiddlewareTests
[Fact] [Fact]
public async Task DigestMiddleware_ShouldCalculate_WhenAuthCookieEmpty() public async Task DigestMiddleware_ShouldCalculate_WhenAuthCookieEmpty()
{ {
DefaultHttpContext context = new() DefaultHttpContext context = GetHttpContext(new MemoryStream(),
{ "/LITTLEBIGPLANETPS3_XML/notification",
Request = "",
new Dictionary<string, StringValues>
{ {
Body = new MemoryStream(),
Path = "/LITTLEBIGPLANETPS3_XML/notification",
Headers =
{ {
KeyValuePair.Create<string, StringValues>("X-Digest-A", "0a06d25662c2d3bab2a767c0c504898df2385e62"), "X-Digest-A", "0a06d25662c2d3bab2a767c0c504898df2385e62"
}, },
}, },
}; new UseDigestAttribute());
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
@ -226,19 +227,16 @@ public class DigestMiddlewareTests
[Fact] [Fact]
public async Task DigestMiddleware_ShouldComputeDigestsWithNoBody_WhenDigestsEnabled() public async Task DigestMiddleware_ShouldComputeDigestsWithNoBody_WhenDigestsEnabled()
{ {
DefaultHttpContext context = new() DefaultHttpContext context = GetHttpContext(new MemoryStream(),
{ "/LITTLEBIGPLANETPS3_XML/notification",
Request = "MM_AUTH=unittest",
new Dictionary<string, StringValues>
{ {
Body = new MemoryStream(),
Path = "/LITTLEBIGPLANETPS3_XML/notification",
Headers =
{ {
KeyValuePair.Create<string, StringValues>("Cookie", "MM_AUTH=unittest"), "X-Digest-A", "df619790a2579a077eae4a6b6864966ff4768723"
KeyValuePair.Create<string, StringValues>("X-Digest-A", "df619790a2579a077eae4a6b6864966ff4768723"),
}, },
}, },
}; new UseDigestAttribute());
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
@ -264,19 +262,16 @@ public class DigestMiddlewareTests
[Fact] [Fact]
public async Task DigestMiddleware_ShouldComputeDigestsWithBody_WhenDigestsEnabled_AndNoResponseBody() public async Task DigestMiddleware_ShouldComputeDigestsWithBody_WhenDigestsEnabled_AndNoResponseBody()
{ {
DefaultHttpContext context = new() DefaultHttpContext context = GetHttpContext(new MemoryStream("digest test"u8.ToArray()),
{ "/LITTLEBIGPLANETPS3_XML/filter",
Request = "MM_AUTH=unittest",
new Dictionary<string, StringValues>
{ {
Body = new MemoryStream("digest test"u8.ToArray()),
Path = "/LITTLEBIGPLANETPS3_XML/filter",
Headers =
{ {
KeyValuePair.Create<string, StringValues>("Cookie", "MM_AUTH=unittest"), "X-Digest-A", "3105059f9283773f7982a4d79455bcc97c330f10"
KeyValuePair.Create<string, StringValues>("X-Digest-A", "3105059f9283773f7982a4d79455bcc97c330f10"),
}, },
}, },
}; new UseDigestAttribute());
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
@ -302,19 +297,17 @@ public class DigestMiddlewareTests
[Fact] [Fact]
public async Task DigestMiddleware_ShouldComputeDigestsWithBody_WhenDigestsEnabled_AndResponseBody() public async Task DigestMiddleware_ShouldComputeDigestsWithBody_WhenDigestsEnabled_AndResponseBody()
{ {
DefaultHttpContext context = new() DefaultHttpContext context = GetHttpContext(new MemoryStream("digest test"u8.ToArray()),
{ "/LITTLEBIGPLANETPS3_XML/filter",
Request = "MM_AUTH=unittest",
new Dictionary<string, StringValues>
{ {
Body = new MemoryStream("digest test"u8.ToArray()),
Path = "/LITTLEBIGPLANETPS3_XML/filter",
Headers =
{ {
KeyValuePair.Create<string, StringValues>("Cookie", "MM_AUTH=unittest"), "X-Digest-A", "3105059f9283773f7982a4d79455bcc97c330f10"
KeyValuePair.Create<string, StringValues>("X-Digest-A", "3105059f9283773f7982a4d79455bcc97c330f10"),
}, },
}, },
}; new UseDigestAttribute());
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
httpContext.Response.StatusCode = 200; httpContext.Response.StatusCode = 200;
@ -337,21 +330,24 @@ public class DigestMiddlewareTests
} }
[Fact] [Fact]
public async Task DigestMiddleware_ShouldComputeDigestsWithBody_WhenUploading() public async Task DigestMiddleware_ShouldExcludeBody_WithAttributeSetting()
{ {
DefaultHttpContext context = new() DefaultHttpContext context = GetHttpContext(new MemoryStream("digest test"u8.ToArray()),
{ "/LITTLEBIGPLANETPS3_XML/upload/unittesthash",
Request = "MM_AUTH=unittest",
new Dictionary<string, StringValues>
{ {
Body = new MemoryStream("digest test"u8.ToArray()),
Path = "/LITTLEBIGPLANETPS3_XML/upload/unittesthash",
Headers =
{ {
KeyValuePair.Create<string, StringValues>("Cookie", "MM_AUTH=unittest"), "X-Digest-B", "2e54cd2bc69ff8c1ff85dd3b4f62e0a0e27d9e23"
KeyValuePair.Create<string, StringValues>("X-Digest-B", "2e54cd2bc69ff8c1ff85dd3b4f62e0a0e27d9e23"),
}, },
}, },
}; new UseDigestAttribute
{
DigestHeaderName = "X-Digest-B",
ExcludeBodyFromDigest = true,
});
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
httpContext.Response.StatusCode = 200; httpContext.Response.StatusCode = 200;
@ -394,6 +390,8 @@ public class DigestMiddlewareTests
}, },
}, },
}; };
context.SetEndpoint(new Endpoint(null, new EndpointMetadataCollection(new UseDigestAttribute()), null));
DigestMiddleware middleware = new(httpContext => DigestMiddleware middleware = new(httpContext =>
{ {
httpContext.Response.StatusCode = 200; httpContext.Response.StatusCode = 200;