From e1cc5b00ee21ec9a9d1e387afd1384c722e2b1e5 Mon Sep 17 00:00:00 2001 From: vycdev2 Date: Sun, 9 Aug 2026 22:28:02 +0000 Subject: [PATCH] fix: validate help module selections --- Modules/HelpModule.cs | 28 +++++++++++++++++-- .../HelpCommandRegistrationTests.cs | 21 ++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/Modules/HelpModule.cs b/Modules/HelpModule.cs index d193ac5..3b055e8 100644 --- a/Modules/HelpModule.cs +++ b/Modules/HelpModule.cs @@ -8,6 +8,7 @@ using Morpheus.Extensions; using Morpheus.Handlers; using Morpheus.Utilities; +using System.Globalization; using System.Reflection; namespace Morpheus.Modules; @@ -57,13 +58,36 @@ private async Task HandleHelpSelectorInteraction(SocketInteraction interaction) } } + internal static bool TryParseHelpModuleName(string moduleName, out int page, out string moduleKey) + { + page = 0; + moduleKey = string.Empty; + + int separatorIndex = moduleName.IndexOf('_'); + if (separatorIndex <= 0 || separatorIndex == moduleName.Length - 1) + return false; + + if (!int.TryParse(moduleName[..separatorIndex], NumberStyles.None, CultureInfo.InvariantCulture, out page) || page < 1) + return false; + + moduleKey = moduleName[(separatorIndex + 1)..]; + return moduleKey.IndexOf('_') < 0; + } + private Embed CreateModuleHelpEmbed(string moduleName, string commandPrefix) { if (helpModules.TryGetValue(commandPrefix + moduleName, out Embed? embed)) return embed; - int page = int.Parse(moduleName.Split("_")[0]); - string moduleKey = moduleName.Split("_")[1]; + if (!TryParseHelpModuleName(moduleName, out int page, out string moduleKey)) + { + return new EmbedBuilder() + { + Color = Colors.Blue, + Title = "Unable to load help", + Description = "The selected help page is invalid. Please run the help command again." + }.Build(); + } string name = moduleKey.Replace("Module", ""); EmbedBuilder builder = new() diff --git a/Morpheus.Tests/HelpCommandRegistrationTests.cs b/Morpheus.Tests/HelpCommandRegistrationTests.cs index 2af0560..9f4991f 100644 --- a/Morpheus.Tests/HelpCommandRegistrationTests.cs +++ b/Morpheus.Tests/HelpCommandRegistrationTests.cs @@ -6,6 +6,27 @@ namespace Morpheus.Tests; public class HelpCommandRegistrationTests { + [Theory] + [InlineData("2_StocksModule", 2, "StocksModule")] + [InlineData("10_Misc", 10, "Misc")] + public void TryParseHelpModuleName_ParsesPageAndModule(string input, int expectedPage, string expectedModule) + { + Assert.True(HelpModule.TryParseHelpModuleName(input, out int page, out string module)); + Assert.Equal(expectedPage, page); + Assert.Equal(expectedModule, module); + } + + [Theory] + [InlineData("")] + [InlineData("invalid")] + [InlineData("0_StocksModule")] + [InlineData("-1_StocksModule")] + [InlineData("2_")] + public void TryParseHelpModuleName_RejectsMalformedSelections(string input) + { + Assert.False(HelpModule.TryParseHelpModuleName(input, out _, out _)); + } + [Fact] public void HelpCommand_AcceptsMultiWordCommandNames() {