From 0f97845b8812ac09edd44d22b38ab4c5a149d750 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Wed, 10 Jul 2024 20:16:36 +0200 Subject: [PATCH] [backend/federation] Fix HttpSignature validation on systems using CRLF line endings --- .../Core/Extensions/StringExtensions.cs | 15 +++++++++++++++ .../Core/Federation/Cryptography/HttpSignature.cs | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Iceshrimp.Backend/Core/Extensions/StringExtensions.cs b/Iceshrimp.Backend/Core/Extensions/StringExtensions.cs index 5a044199..84d98074 100644 --- a/Iceshrimp.Backend/Core/Extensions/StringExtensions.cs +++ b/Iceshrimp.Backend/Core/Extensions/StringExtensions.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Text; using EntityFrameworkCore.Projectables; namespace Iceshrimp.Backend.Core.Extensions; @@ -49,4 +50,18 @@ public static class ProjectableStringExtensions [Projectable] public static bool IsGreaterOrEqualTo(this string a, string b) => a.CompareTo(b) >= 0; +} + +public static class StringBuilderExtensions +{ + private const char NewLineLf = '\n'; + + /// + /// Equivalent to .AppendLine, but always uses \n instead of Environment.NewLine + /// + public static StringBuilder AppendLineLf(this StringBuilder sb, string? value) + { + sb.Append(value); + return sb.Append(NewLineLf); + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Federation/Cryptography/HttpSignature.cs b/Iceshrimp.Backend/Core/Federation/Cryptography/HttpSignature.cs index 707f829f..927e64c7 100644 --- a/Iceshrimp.Backend/Core/Federation/Cryptography/HttpSignature.cs +++ b/Iceshrimp.Backend/Core/Federation/Cryptography/HttpSignature.cs @@ -2,6 +2,7 @@ using System.Net; using System.Net.Http.Headers; using System.Security.Cryptography; using System.Text; +using Iceshrimp.Backend.Core.Extensions; using Iceshrimp.Backend.Core.Middleware; using Microsoft.Extensions.Primitives; @@ -108,7 +109,6 @@ public static class HttpSignature keyId="{keyId}",headers="{string.Join(' ', requiredHeadersEnum)}",algorithm="hs2019",signature="{signatureBase64}" """; - request.Headers.Add("Signature", signatureHeader); return request; } @@ -123,7 +123,7 @@ public static class HttpSignature foreach (var header in headers) { sb.Append($"{header}: "); - sb.AppendLine(header switch + sb.AppendLineLf(header switch { "(request-target)" => $"{requestMethod.ToLowerInvariant()} {requestPath}", "(created)" => signature?.Created ?? throw new Exception("Signature is missing created param"),