From ff880f60017f63136bf55b24f6686f46e60d14d6 Mon Sep 17 00:00:00 2001 From: 13xforever Date: Sat, 8 Feb 2025 01:08:11 +0500 Subject: [PATCH] properly escape ird download links without corrupting relative paths --- Clients/IrdLibraryClient/IrdClient.cs | 13 ++++++---- .../IrdSearchResultFormatter.cs | 2 +- Tests/UriFormattingTests.cs | 24 +++++++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 Tests/UriFormattingTests.cs diff --git a/Clients/IrdLibraryClient/IrdClient.cs b/Clients/IrdLibraryClient/IrdClient.cs index c25a2fc1..fab64400 100644 --- a/Clients/IrdLibraryClient/IrdClient.cs +++ b/Clients/IrdLibraryClient/IrdClient.cs @@ -124,11 +124,16 @@ namespace IrdLibraryClient return result; } } - - public static Uri GetDownloadLink(string relativeLink) + + private static string EscapeSegments(string relativePath) { - var encodedLink = Uri.EscapeDataString(relativeLink); - return new(BaseDownloadUri, encodedLink); + var segments = relativePath.Split('/'); + for (var i = 0; i < segments.Length; i++) + segments[i] = Uri.EscapeDataString(segments[i]); + return string.Join("/", segments); } + + public static Uri GetDownloadLink(string relativeLink) => new(BaseDownloadUri, EscapeSegments(relativeLink)); + public static string GetEscapedDownloadLink(string relativeLink) => GetDownloadLink(relativeLink).AbsoluteUri; } } diff --git a/CompatBot/Utils/ResultFormatters/IrdSearchResultFormatter.cs b/CompatBot/Utils/ResultFormatters/IrdSearchResultFormatter.cs index 5dbd32be..96a37cf4 100644 --- a/CompatBot/Utils/ResultFormatters/IrdSearchResultFormatter.cs +++ b/CompatBot/Utils/ResultFormatters/IrdSearchResultFormatter.cs @@ -32,7 +32,7 @@ namespace CompatBot.Utils.ResultFormatters { result.AddField( $"{item.Title.Sanitize().Trim(EmbedPager.MaxFieldTitleLength - 18)} [v{item.GameVer} FW {item.FwVer}]", - $"[⏬ {Path.GetFileName(item.Link)}]({IrdClient.GetDownloadLink(item.Link)})" + $"[⏬ {Path.GetFileName(item.Link).Replace("]", @"\]")}]({IrdClient.GetEscapedDownloadLink(item.Link)})" ); } catch (Exception e) diff --git a/Tests/UriFormattingTests.cs b/Tests/UriFormattingTests.cs new file mode 100644 index 00000000..06a51abb --- /dev/null +++ b/Tests/UriFormattingTests.cs @@ -0,0 +1,24 @@ +using IrdLibraryClient; +using NUnit.Framework; + +namespace Tests; + +[TestFixture] +public class UriFormattingTests +{ + [TestCase("file with spaces.ird")] + [TestCase("file (with parenthesis).ird")] + [TestCase("file/with/segments.ird")] + public void IrdLinkFormatTest(string filename) + { + var uri = IrdClient.GetEscapedDownloadLink(filename); + Assert.Multiple(() => + { + Assert.That(uri, Does.Not.Contains(" ")); + Assert.That(uri, Does.Not.Contains("(")); + Assert.That(uri, Does.Not.Contains(")")); + Assert.That(uri, Does.Not.Contains("%2F")); + Assert.That(uri, Does.EndWith(".ird")); + }); + } +} \ No newline at end of file