diff --git a/BTCPayServer/Controllers/UILNURLController.cs b/BTCPayServer/Controllers/UILNURLController.cs index 4269fb988..8739ccecc 100644 --- a/BTCPayServer/Controllers/UILNURLController.cs +++ b/BTCPayServer/Controllers/UILNURLController.cs @@ -265,8 +265,11 @@ namespace BTCPayServer break; } + var escapedItemId = Extensions.UnescapeBackSlashUriString(itemCode); var item = items.FirstOrDefault(item1 => - item1.Id.Equals(itemCode, StringComparison.InvariantCultureIgnoreCase)); + item1.Id.Equals(itemCode, StringComparison.InvariantCultureIgnoreCase) || + item1.Id.Equals(escapedItemId, StringComparison.InvariantCultureIgnoreCase)); + if (item is null || item.Inventory <= 0 || (item.PaymentMethods?.Any() is true && diff --git a/BTCPayServer/Extensions.cs b/BTCPayServer/Extensions.cs index d451979b6..8789ca0be 100644 --- a/BTCPayServer/Extensions.cs +++ b/BTCPayServer/Extensions.cs @@ -36,6 +36,20 @@ namespace BTCPayServer { public static class Extensions { + /// + /// Unescape Uri string for %2F + /// See details at: https://github.com/dotnet/aspnetcore/issues/14170#issuecomment-533342396 + /// + /// The Uri string. + /// Unescaped back slash Uri string. + public static string UnescapeBackSlashUriString(string uriString) + { + if (uriString == null) + { + return null; + } + return uriString.Replace("%2f", "%2F").Replace("%2F", "/"); + } public static bool IsValidEmail(this string email) { if (string.IsNullOrEmpty(email))