diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/CommentController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/CommentController.cs index 76f2b715..dc334fd4 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/CommentController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/CommentController.cs @@ -1,9 +1,9 @@ -#nullable enable using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Logging; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Filter; @@ -11,17 +11,12 @@ using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Users; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class CommentController : ControllerBase +public class CommentController : GameController { private readonly DatabaseContext database; public CommentController(DatabaseContext database) diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/DeveloperController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/DeveloperController.cs index 503356d6..6b735a93 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/DeveloperController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/DeveloperController.cs @@ -1,14 +1,10 @@ -using LBPUnion.ProjectLighthouse.Types.Serialization; -using Microsoft.AspNetCore.Authorization; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; +using LBPUnion.ProjectLighthouse.Types.Serialization; using Microsoft.AspNetCore.Mvc; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class DeveloperController : Controller +public class DeveloperController : GameController { [HttpGet("developer_videos")] public IActionResult DeveloperVideos() => this.Ok(new GameDeveloperVideos()); diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/FriendsController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/FriendsController.cs index 83e198d8..13956e94 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/FriendsController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/FriendsController.cs @@ -1,23 +1,18 @@ -#nullable enable using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Users; using LBPUnion.ProjectLighthouse.StorableLists.Stores; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Users; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class FriendsController : ControllerBase +public class FriendsController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Login/ClientConfigurationController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Login/ClientConfigurationController.cs index f4ed348c..d69fc45a 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Login/ClientConfigurationController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Login/ClientConfigurationController.cs @@ -1,22 +1,18 @@ -#nullable enable using System.Diagnostics.CodeAnalysis; using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Users; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Users; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Login; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] [Produces("text/plain")] -public class ClientConfigurationController : ControllerBase +public class ClientConfigurationController : GameController { private readonly DatabaseContext database; @@ -26,6 +22,7 @@ public class ClientConfigurationController : ControllerBase } [HttpGet("network_settings.nws")] + [UseDigest(EnforceDigest = false)] [SuppressMessage("ReSharper", "StringLiteralTypo")] public IActionResult NetworkSettings() { @@ -41,15 +38,18 @@ public class ClientConfigurationController : ControllerBase [HttpGet("t_conf")] [Produces("text/xml")] + [UseDigest(EnforceDigest = false)] public IActionResult Conf() => this.Ok(new TelemetryConfigResponse()); // The challenge config here is currently based on the official server's config. // We should probably make this configurable in the future. [HttpGet("ChallengeConfig.xml")] [Produces("text/xml")] + [UseDigest(EnforceDigest = false)] public IActionResult Challenges() => this.Ok(GameChallengeResponse.ServerChallenges()); [HttpGet("farc_hashes")] + [UseDigest(EnforceDigest = false)] public IActionResult FarcHashes() => this.Ok(); [HttpGet("privacySettings")] diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Login/LoginController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Login/LoginController.cs index 8e3886a5..c775a169 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Login/LoginController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Login/LoginController.cs @@ -1,4 +1,3 @@ -#nullable enable using System.Net; using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Login/LogoutController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Login/LogoutController.cs index 89140f71..71625ae8 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Login/LogoutController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Login/LogoutController.cs @@ -1,20 +1,15 @@ using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Helpers; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Token; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Login; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/goodbye")] -[Produces("text/xml")] -public class LogoutController : ControllerBase +public class LogoutController : GameController { - private readonly DatabaseContext database; public LogoutController(DatabaseContext database) @@ -22,8 +17,8 @@ public class LogoutController : ControllerBase this.database = database; } - [HttpPost] - public async Task OnPost() + [HttpPost("goodbye")] + public async Task OnLogout() { GameTokenEntity token = this.GetToken(); @@ -37,6 +32,4 @@ public class LogoutController : ControllerBase return this.Ok(); } - - } \ No newline at end of file diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Matching/EnterLevelController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Matching/EnterLevelController.cs index e8b2aa37..3ca628d3 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Matching/EnterLevelController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Matching/EnterLevelController.cs @@ -1,22 +1,17 @@ -#nullable enable using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Helpers; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Interaction; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Users; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Matching; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class EnterLevelController : ControllerBase +public class EnterLevelController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Matching/MatchController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Matching/MatchController.cs index 4059d37a..7b6b8e0b 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Matching/MatchController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Matching/MatchController.cs @@ -1,26 +1,21 @@ -#nullable enable using System.Text.Json; using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Logging; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Matchmaking; using LBPUnion.ProjectLighthouse.Types.Matchmaking.MatchCommands; using LBPUnion.ProjectLighthouse.Types.Matchmaking.Rooms; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Matching; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class MatchController : ControllerBase +public class MatchController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/MessageController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/MessageController.cs index df11efdd..d8526345 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/MessageController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/MessageController.cs @@ -5,23 +5,20 @@ using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Serialization; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Notifications; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Mail; using LBPUnion.ProjectLighthouse.Types.Serialization; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] [Produces("text/plain")] -public class MessageController : ControllerBase +public class MessageController : GameController { private readonly DatabaseContext database; @@ -45,9 +42,11 @@ along with this program. If not, see ."; } [HttpGet("eula")] + [UseDigest(EnforceDigest = false)] public IActionResult Eula() => this.Ok($"{license}\n{ServerConfiguration.Instance.EulaText}"); [HttpGet("announce")] + [UseDigest(EnforceDigest = false)] public async Task Announce() { GameTokenEntity token = this.GetToken(); diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/ReportController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/ReportController.cs index bf5007c3..0668e5b0 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/ReportController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/ReportController.cs @@ -1,24 +1,19 @@ -#nullable enable -using System.Text.Json; +using System.Text.Json; using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Helpers; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Moderation; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Moderation.Reports; using LBPUnion.ProjectLighthouse.Types.Serialization; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class ReportController : ControllerBase +public class ReportController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Resources/PhotosController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Resources/PhotosController.cs index e7962643..a1ce7f92 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Resources/PhotosController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Resources/PhotosController.cs @@ -1,4 +1,3 @@ -#nullable enable using Discord; using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Database; @@ -6,6 +5,7 @@ using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Logging; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Token; @@ -13,17 +13,12 @@ using LBPUnion.ProjectLighthouse.Types.Filter; using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Serialization; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Resources; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class PhotosController : ControllerBase +public class PhotosController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Resources/ResourcesController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Resources/ResourcesController.cs index 3c1c2f82..e024ffeb 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Resources/ResourcesController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Resources/ResourcesController.cs @@ -1,22 +1,17 @@ -#nullable enable using System.Text; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Logging; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Misc; using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Resources; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using IOFile = System.IO.File; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Resources; -[ApiController] -[Authorize] -[Produces("text/xml")] -[Route("LITTLEBIGPLANETPS3_XML")] -public class ResourcesController : ControllerBase +public class ResourcesController : GameController { [HttpPost("showModerated")] @@ -51,6 +46,7 @@ public class ResourcesController : ControllerBase [HttpPost("upload/{hash}/unattributed")] [HttpPost("upload/{hash}")] + [UseDigest(DigestHeaderName = "X-Digest-B", ExcludeBodyFromDigest = true)] public async Task UploadResource(string hash) { string assetsDirectory = FileHelper.ResourcePath; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/CategoryController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/CategoryController.cs index 60ac1c58..61a17691 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/CategoryController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/CategoryController.cs @@ -4,6 +4,7 @@ using LBPUnion.ProjectLighthouse.Filter; using LBPUnion.ProjectLighthouse.Filter.Sorts; using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Categories; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; @@ -13,17 +14,12 @@ using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Misc; using LBPUnion.ProjectLighthouse.Types.Serialization; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class CategoryController : ControllerBase +public class CategoryController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/LevelTagsController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/LevelTagsController.cs index 2b069099..ee39499f 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/LevelTagsController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/LevelTagsController.cs @@ -1,22 +1,18 @@ using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Helpers; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Interaction; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Users; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML")] -[Produces("text/plain")] -public class LevelTagsController : ControllerBase +public class LevelTagsController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ListController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ListController.cs index 67fff180..2a24d798 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ListController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ListController.cs @@ -1,9 +1,9 @@ -#nullable enable using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Filter; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Token; @@ -11,17 +11,12 @@ using LBPUnion.ProjectLighthouse.Types.Filter; using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Users; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class ListController : ControllerBase +public class ListController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/PlaylistController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/PlaylistController.cs index 4763708a..6e6af98b 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/PlaylistController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/PlaylistController.cs @@ -1,21 +1,16 @@ -#nullable enable using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Serialization; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class PlaylistController : ControllerBase +public class PlaylistController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/PublishController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/PublishController.cs index e09a06e6..27f06ae0 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/PublishController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/PublishController.cs @@ -6,6 +6,7 @@ using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Servers.GameServer.Helpers; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Token; @@ -23,7 +24,7 @@ namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; [Authorize] [Route("LITTLEBIGPLANETPS3_XML/")] [Produces("text/xml")] -public class PublishController : ControllerBase +public class PublishController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ReviewController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ReviewController.cs index aa4e1c5b..857e2acd 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ReviewController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ReviewController.cs @@ -1,23 +1,18 @@ -#nullable enable using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Helpers; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Interaction; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Filter; using LBPUnion.ProjectLighthouse.Types.Serialization; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class ReviewController : ControllerBase +public class ReviewController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ScoreController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ScoreController.cs index 79ae3163..0efb8193 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ScoreController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ScoreController.cs @@ -1,8 +1,8 @@ -#nullable enable using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Logging; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.StorableLists.Stores; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Token; @@ -10,17 +10,12 @@ using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Users; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class ScoreController : ControllerBase +public class ScoreController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SearchController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SearchController.cs index a4f129b5..f34112cb 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SearchController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SearchController.cs @@ -1,25 +1,20 @@ -#nullable enable using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Filter; using LBPUnion.ProjectLighthouse.Filter.Filters; using LBPUnion.ProjectLighthouse.Filter.Sorts; using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Filter; using LBPUnion.ProjectLighthouse.Types.Serialization; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/slots")] -[Produces("text/xml")] -public class SearchController : ControllerBase +public class SearchController : GameController { private readonly DatabaseContext database; public SearchController(DatabaseContext database) diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SlotsController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SlotsController.cs index 13f9afa8..b47cc717 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SlotsController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/SlotsController.cs @@ -1,4 +1,3 @@ -#nullable enable using System.Linq.Expressions; using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Extensions; @@ -8,6 +7,7 @@ using LBPUnion.ProjectLighthouse.Filter.Sorts; using LBPUnion.ProjectLighthouse.Filter.Sorts.Metadata; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Filter; @@ -15,17 +15,12 @@ using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Misc; using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Users; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Slots; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class SlotsController : ControllerBase +public class SlotsController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/StatisticsController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/StatisticsController.cs index 3eb828e4..e5773b89 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/StatisticsController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/StatisticsController.cs @@ -1,20 +1,17 @@ using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Helpers; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Filter; using LBPUnion.ProjectLighthouse.Filter.Filters; using LBPUnion.ProjectLighthouse.Servers.GameServer.Extensions; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Types.Serialization; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] [Produces("text/plain")] -public class StatisticsController : ControllerBase +public class StatisticsController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/StoreController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/StoreController.cs index 0b6a8407..358d84d6 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/StoreController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/StoreController.cs @@ -1,13 +1,9 @@ -using Microsoft.AspNetCore.Authorization; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using Microsoft.AspNetCore.Mvc; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class StoreController : Controller +public class StoreController : GameController { [HttpGet("promotions")] public IActionResult Promotions() => this.Ok(); diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/UserController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/UserController.cs index fb5b6128..0861a38d 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/UserController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/UserController.cs @@ -4,6 +4,7 @@ using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Servers.GameServer.Helpers; +using LBPUnion.ProjectLighthouse.Servers.GameServer.Types; using LBPUnion.ProjectLighthouse.Servers.GameServer.Types.Users; using LBPUnion.ProjectLighthouse.Types.Entities.Level; using LBPUnion.ProjectLighthouse.Types.Entities.Profile; @@ -12,17 +13,12 @@ using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Logging; using LBPUnion.ProjectLighthouse.Types.Serialization; using LBPUnion.ProjectLighthouse.Types.Users; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers; -[ApiController] -[Authorize] -[Route("LITTLEBIGPLANETPS3_XML/")] -[Produces("text/xml")] -public class UserController : ControllerBase +public class UserController : GameController { private readonly DatabaseContext database; diff --git a/ProjectLighthouse.Servers.GameServer/Middlewares/DigestMiddleware.cs b/ProjectLighthouse.Servers.GameServer/Middlewares/DigestMiddleware.cs index b4385e72..84ac9af9 100644 --- a/ProjectLighthouse.Servers.GameServer/Middlewares/DigestMiddleware.cs +++ b/ProjectLighthouse.Servers.GameServer/Middlewares/DigestMiddleware.cs @@ -1,4 +1,3 @@ -using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Extensions; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Middlewares; @@ -10,13 +9,6 @@ namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Middlewares; public class DigestMiddleware : Middleware { - private readonly bool computeDigests; - - public DigestMiddleware(RequestDelegate next, bool computeDigests) : base(next) - { - this.computeDigests = computeDigests; - } - private readonly List digestKeys; public DigestMiddleware(RequestDelegate next, List digestKeys) : base(next) @@ -54,61 +46,59 @@ public class DigestMiddleware : Middleware public override async Task InvokeAsync(HttpContext context) { - UseDigestAttribute? digestAttribute = context.GetEndpoint()?.Metadata.OfType().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(); if (digestAttribute == null) { await this.next(context); return; } - if (!context.Request.Cookies.TryGetValue("MM_AUTH", out string? authCookie)) - { - context.Response.StatusCode = 403; - return; - } + if (!context.Request.Cookies.TryGetValue("MM_AUTH", out string? authCookie)) authCookie = string.Empty; string digestPath = context.Request.Path; byte[] bodyBytes = await context.Request.BodyReader.ReadAllAsync(); - if (!context.Request.Headers.TryGetValue(digestAttribute.DigestHeaderName, out StringValues digestHeaders) || - digestHeaders.Count != 1 && digestAttribute.EnforceDigest) + if ((!context.Request.Headers.TryGetValue(digestAttribute.DigestHeaderName, out StringValues digestHeaders) || + digestHeaders.Count != 1) && digestAttribute.EnforceDigest) { context.Response.StatusCode = 403; return; } - string? clientDigest = digestHeaders[0]; + string? clientDigest = digestHeaders.FirstOrDefault() ?? null; string? matchingDigestKey = null; string? calculatedRequestDigest = null; - foreach (string digestKey in this.digestKeys) + if (clientDigest != null) { - string calculatedDigest = CryptoHelper.ComputeDigest(digestPath, - authCookie, - bodyBytes, - digestKey, - digestAttribute.ExcludeBodyFromDigest); - if (calculatedDigest != clientDigest) continue; + foreach (string digestKey in this.digestKeys) + { + string calculatedDigest = CalculateDigest(digestKey, bodyBytes); + if (calculatedDigest != clientDigest) continue; - matchingDigestKey = digestKey; - calculatedRequestDigest = calculatedDigest; + matchingDigestKey = digestKey; + calculatedRequestDigest = calculatedDigest; + } } matchingDigestKey ??= this.digestKeys.First(); - switch (matchingDigestKey) + switch (calculatedRequestDigest) { case null when digestAttribute.EnforceDigest: context.Response.StatusCode = 403; return; case null: - calculatedRequestDigest = CryptoHelper.ComputeDigest(digestPath, - authCookie, - bodyBytes, - matchingDigestKey, - digestAttribute.ExcludeBodyFromDigest); + calculatedRequestDigest = CalculateDigest(matchingDigestKey, bodyBytes); break; } @@ -124,17 +114,21 @@ public class DigestMiddleware : Middleware await HandleResponseCompression(context, responseBuffer); - string responseDigest = CryptoHelper.ComputeDigest(digestPath, - authCookie, - responseBuffer.ToArray(), - matchingDigestKey, - digestAttribute.ExcludeBodyFromDigest); + string responseDigest = CalculateDigest(matchingDigestKey, responseBuffer.ToArray()); context.Response.Headers.Append("X-Digest-A", responseDigest); responseBuffer.Position = 0; await responseBuffer.CopyToAsync(originalBody); context.Response.Body = originalBody; + return; + + string CalculateDigest(string digestKey, byte[] data) => + CryptoHelper.ComputeDigest(digestPath, + authCookie, + data, + digestKey, + digestAttribute.ExcludeBodyFromDigest); } } \ No newline at end of file diff --git a/ProjectLighthouse.Servers.GameServer/Startup/GameServerStartup.cs b/ProjectLighthouse.Servers.GameServer/Startup/GameServerStartup.cs index 0d372e8f..64499ac7 100644 --- a/ProjectLighthouse.Servers.GameServer/Startup/GameServerStartup.cs +++ b/ProjectLighthouse.Servers.GameServer/Startup/GameServerStartup.cs @@ -84,8 +84,6 @@ public class GameServerStartup // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public virtual void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - bool computeDigests = true; - if (string.IsNullOrEmpty(ServerConfiguration.Instance.DigestKey.PrimaryDigestKey)) { Logger.Warn @@ -94,7 +92,6 @@ public class GameServerStartup "To increase security, it is recommended that you find and set this variable.", LogArea.Startup ); - computeDigests = false; } #if DEBUG @@ -105,11 +102,17 @@ public class GameServerStartup app.UseMiddleware(); app.UseMiddleware(); - app.UseMiddleware(computeDigests); app.UseMiddleware(); app.UseRouting(); + List digestKeys = + [ + ServerConfiguration.Instance.DigestKey.PrimaryDigestKey, + ServerConfiguration.Instance.DigestKey.AlternateDigestKey, + ]; + app.UseMiddleware(digestKeys); + app.UseAuthorization(); app.UseEndpoints(endpoints => endpoints.MapControllers()); diff --git a/ProjectLighthouse.Servers.GameServer/Types/GameController.cs b/ProjectLighthouse.Servers.GameServer/Types/GameController.cs new file mode 100644 index 00000000..9e0aab2b --- /dev/null +++ b/ProjectLighthouse.Servers.GameServer/Types/GameController.cs @@ -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; \ No newline at end of file diff --git a/ProjectLighthouse.Servers.GameServer/Types/UseDigestAttribute.cs b/ProjectLighthouse.Servers.GameServer/Types/UseDigestAttribute.cs index 55e03c1f..28f6e5af 100644 --- a/ProjectLighthouse.Servers.GameServer/Types/UseDigestAttribute.cs +++ b/ProjectLighthouse.Servers.GameServer/Types/UseDigestAttribute.cs @@ -7,5 +7,5 @@ public class UseDigestAttribute : Attribute public string DigestHeaderName { get; set; } = "X-Digest-A"; - public bool ExcludeBodyFromDigest { get; set; } = false; + public bool ExcludeBodyFromDigest { get; set; } } \ No newline at end of file diff --git a/ProjectLighthouse.Tests.GameApiTests/Unit/Middlewares/DigestMiddlewareTests.cs b/ProjectLighthouse.Tests.GameApiTests/Unit/Middlewares/DigestMiddlewareTests.cs index 95a1205c..e099790a 100644 --- a/ProjectLighthouse.Tests.GameApiTests/Unit/Middlewares/DigestMiddlewareTests.cs +++ b/ProjectLighthouse.Tests.GameApiTests/Unit/Middlewares/DigestMiddlewareTests.cs @@ -14,9 +14,8 @@ namespace ProjectLighthouse.Tests.GameApiTests.Unit.Middlewares; [Trait("Category", "Unit")] public class DigestMiddlewareTests { - //TODO: fix remaining unit tests private static DefaultHttpContext GetHttpContext - (Stream body, string path, string cookie, Dictionary? extraHeaders = null) + (Stream body, string path, string cookie, Dictionary? extraHeaders = null, UseDigestAttribute? digestAttribute = null) { DefaultHttpContext context = new() @@ -28,14 +27,20 @@ public class DigestMiddlewareTests Headers = { KeyValuePair.Create("Cookie", cookie), - } + }, }, }; - if (extraHeaders == null) return context; - - foreach ((string key, StringValues value) in extraHeaders) + if (extraHeaders != null) { - 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; @@ -45,7 +50,6 @@ public class DigestMiddlewareTests public async Task DigestMiddleware_ShouldNotComputeDigests_WithoutDigestAttribute() { DefaultHttpContext context = GetHttpContext(new MemoryStream(), "/LITTLEBIGPLANETPS3_XML/notification", "MM_AUTH=unittest"); - context.SetEndpoint(new Endpoint(null, new EndpointMetadataCollection(), null)); DigestMiddleware middleware = new(httpContext => { httpContext.Response.StatusCode = 200; @@ -65,8 +69,11 @@ public class DigestMiddlewareTests [Fact] public async Task DigestMiddleware_ShouldReject_WhenDigestHeaderIsMissing() { - DefaultHttpContext context = GetHttpContext(new MemoryStream(), "/LITTLEBIGPLANETPS3_XML/notification", "MM_AUTH=unittest"); - context.SetEndpoint(new Endpoint(null, new EndpointMetadataCollection(new UseDigestAttribute()), null)); + DefaultHttpContext context = GetHttpContext(new MemoryStream(), + "/LITTLEBIGPLANETPS3_XML/notification", + "MM_AUTH=unittest", + null, + new UseDigestAttribute()); DigestMiddleware middleware = new(httpContext => { httpContext.Response.StatusCode = 200; @@ -79,8 +86,7 @@ public class DigestMiddlewareTests const int expectedCode = 403; - Assert.True(expectedCode == context.Response.StatusCode, - "The digest middleware accepted the request when it shouldn't have (are you running this test in Debug mode?)"); + Assert.Equal(expectedCode, context.Response.StatusCode); Assert.False(context.Response.Headers.TryGetValue("X-Digest-A", out _)); Assert.False(context.Response.Headers.TryGetValue("X-Digest-B", out _)); } @@ -96,8 +102,8 @@ public class DigestMiddlewareTests { "X-Digest-A", "invalid_digest" }, - }); - context.SetEndpoint(new Endpoint(null, new EndpointMetadataCollection(new UseDigestAttribute()), null)); + }, + new UseDigestAttribute()); DigestMiddleware middleware = new(httpContext => { httpContext.Response.StatusCode = 200; @@ -126,7 +132,8 @@ public class DigestMiddlewareTests { "X-Digest-A", "df619790a2579a077eae4a6b6864966ff4768723" }, - }); + }, + new UseDigestAttribute()); DigestMiddleware middleware = new(httpContext => { @@ -134,7 +141,7 @@ public class DigestMiddlewareTests httpContext.Response.WriteAsync(""); return Task.CompletedTask; }, - ["test, bruh",]); + ["test", "bruh",]); await middleware.InvokeAsync(context); @@ -150,20 +157,16 @@ public class DigestMiddlewareTests } [Fact] - public async Task DigestMiddleware_ShouldNotReject_WhenRequestingAnnounce() + public async Task DigestMiddleware_ShouldNotReject_WhenNotEnforcingDigest() { - DefaultHttpContext context = new() - { - Request = + DefaultHttpContext context = GetHttpContext(new MemoryStream(), + "/LITTLEBIGPLANETPS3_XML/announce", + "MM_AUTH=unittest", + new Dictionary(), + new UseDigestAttribute { - Body = new MemoryStream(), - Path = "/LITTLEBIGPLANETPS3_XML/announce", - Headers = - { - KeyValuePair.Create("Cookie", "MM_AUTH=unittest"), - }, - }, - }; + EnforceDigest = false, + }); DigestMiddleware middleware = new(httpContext => { @@ -189,18 +192,16 @@ public class DigestMiddlewareTests [Fact] public async Task DigestMiddleware_ShouldCalculate_WhenAuthCookieEmpty() { - DefaultHttpContext context = new() - { - Request = + DefaultHttpContext context = GetHttpContext(new MemoryStream(), + "/LITTLEBIGPLANETPS3_XML/notification", + "", + new Dictionary { - Body = new MemoryStream(), - Path = "/LITTLEBIGPLANETPS3_XML/notification", - Headers = { - KeyValuePair.Create("X-Digest-A", "0a06d25662c2d3bab2a767c0c504898df2385e62"), + "X-Digest-A", "0a06d25662c2d3bab2a767c0c504898df2385e62" }, }, - }; + new UseDigestAttribute()); DigestMiddleware middleware = new(httpContext => { @@ -226,19 +227,16 @@ public class DigestMiddlewareTests [Fact] public async Task DigestMiddleware_ShouldComputeDigestsWithNoBody_WhenDigestsEnabled() { - DefaultHttpContext context = new() - { - Request = + DefaultHttpContext context = GetHttpContext(new MemoryStream(), + "/LITTLEBIGPLANETPS3_XML/notification", + "MM_AUTH=unittest", + new Dictionary { - Body = new MemoryStream(), - Path = "/LITTLEBIGPLANETPS3_XML/notification", - Headers = { - KeyValuePair.Create("Cookie", "MM_AUTH=unittest"), - KeyValuePair.Create("X-Digest-A", "df619790a2579a077eae4a6b6864966ff4768723"), + "X-Digest-A", "df619790a2579a077eae4a6b6864966ff4768723" }, }, - }; + new UseDigestAttribute()); DigestMiddleware middleware = new(httpContext => { @@ -264,19 +262,16 @@ public class DigestMiddlewareTests [Fact] public async Task DigestMiddleware_ShouldComputeDigestsWithBody_WhenDigestsEnabled_AndNoResponseBody() { - DefaultHttpContext context = new() - { - Request = + DefaultHttpContext context = GetHttpContext(new MemoryStream("digest test"u8.ToArray()), + "/LITTLEBIGPLANETPS3_XML/filter", + "MM_AUTH=unittest", + new Dictionary { - Body = new MemoryStream("digest test"u8.ToArray()), - Path = "/LITTLEBIGPLANETPS3_XML/filter", - Headers = { - KeyValuePair.Create("Cookie", "MM_AUTH=unittest"), - KeyValuePair.Create("X-Digest-A", "3105059f9283773f7982a4d79455bcc97c330f10"), + "X-Digest-A", "3105059f9283773f7982a4d79455bcc97c330f10" }, }, - }; + new UseDigestAttribute()); DigestMiddleware middleware = new(httpContext => { @@ -302,19 +297,17 @@ public class DigestMiddlewareTests [Fact] public async Task DigestMiddleware_ShouldComputeDigestsWithBody_WhenDigestsEnabled_AndResponseBody() { - DefaultHttpContext context = new() - { - Request = + DefaultHttpContext context = GetHttpContext(new MemoryStream("digest test"u8.ToArray()), + "/LITTLEBIGPLANETPS3_XML/filter", + "MM_AUTH=unittest", + new Dictionary { - Body = new MemoryStream("digest test"u8.ToArray()), - Path = "/LITTLEBIGPLANETPS3_XML/filter", - Headers = { - KeyValuePair.Create("Cookie", "MM_AUTH=unittest"), - KeyValuePair.Create("X-Digest-A", "3105059f9283773f7982a4d79455bcc97c330f10"), + "X-Digest-A", "3105059f9283773f7982a4d79455bcc97c330f10" }, }, - }; + new UseDigestAttribute()); + DigestMiddleware middleware = new(httpContext => { httpContext.Response.StatusCode = 200; @@ -337,21 +330,24 @@ public class DigestMiddlewareTests } [Fact] - public async Task DigestMiddleware_ShouldComputeDigestsWithBody_WhenUploading() + public async Task DigestMiddleware_ShouldExcludeBody_WithAttributeSetting() { - DefaultHttpContext context = new() - { - Request = + DefaultHttpContext context = GetHttpContext(new MemoryStream("digest test"u8.ToArray()), + "/LITTLEBIGPLANETPS3_XML/upload/unittesthash", + "MM_AUTH=unittest", + new Dictionary { - Body = new MemoryStream("digest test"u8.ToArray()), - Path = "/LITTLEBIGPLANETPS3_XML/upload/unittesthash", - Headers = { - KeyValuePair.Create("Cookie", "MM_AUTH=unittest"), - KeyValuePair.Create("X-Digest-B", "2e54cd2bc69ff8c1ff85dd3b4f62e0a0e27d9e23"), + "X-Digest-B", "2e54cd2bc69ff8c1ff85dd3b4f62e0a0e27d9e23" }, }, - }; + new UseDigestAttribute + { + DigestHeaderName = "X-Digest-B", + ExcludeBodyFromDigest = true, + }); + + DigestMiddleware middleware = new(httpContext => { 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 => { httpContext.Response.StatusCode = 200;