🐛 Better override host

This commit is contained in:
2025-12-30 00:08:04 +08:00
parent db94b21aef
commit 70260967be
3 changed files with 100 additions and 103 deletions

View File

@@ -16,7 +16,16 @@ public class ActivityPubDeliveryService(
) )
{ {
private string Domain => configuration["ActivityPub:Domain"] ?? "localhost"; private string Domain => configuration["ActivityPub:Domain"] ?? "localhost";
private HttpClient HttpClient => httpClientFactory.CreateClient();
private HttpClient HttpClient
{
get
{
var client = httpClientFactory.CreateClient();
client.DefaultRequestHeaders.Clear();
return client;
}
}
public async Task<bool> SendAcceptActivityAsync( public async Task<bool> SendAcceptActivityAsync(
Guid publisherId, Guid publisherId,
@@ -135,13 +144,11 @@ public class ActivityPubDeliveryService(
foreach (var follower in followers) foreach (var follower in followers)
{ {
if (follower.InboxUri != null) if (follower.InboxUri == null) continue;
{
var success = await SendActivityToInboxAsync(activity, follower.InboxUri, actorUrl); var success = await SendActivityToInboxAsync(activity, follower.InboxUri, actorUrl);
if (success) if (success)
successCount++; successCount++;
} }
}
logger.LogInformation("Sent Create activity to {Count}/{Total} followers", logger.LogInformation("Sent Create activity to {Count}/{Total} followers",
successCount, followers.Count); successCount, followers.Count);
@@ -237,14 +244,13 @@ public class ActivityPubDeliveryService(
request.Headers.Date = DateTimeOffset.UtcNow; request.Headers.Date = DateTimeOffset.UtcNow;
var bodyBytes = Encoding.UTF8.GetBytes(json); var bodyBytes = Encoding.UTF8.GetBytes(json);
using var sha256 = SHA256.Create(); var hash = SHA256.HashData(bodyBytes);
var hash = sha256.ComputeHash(bodyBytes);
var digest = $"SHA-256={Convert.ToBase64String(hash)}"; var digest = $"SHA-256={Convert.ToBase64String(hash)}";
request.Headers.Add("Digest", digest); request.Headers.Add("Digest", digest);
request.Headers.Add("Host", new Uri(inboxUrl).Host); request.Headers.Host = new Uri(inboxUrl).Host;
logger.LogInformation("Preparing request to {Inbox}", inboxUrl); logger.LogInformation("Preparing request to {Inbox}", inboxUrl);
logger.LogInformation("Request body (truncated): {Body}", json.Substring(0, Math.Min(200, json.Length)) + "..."); logger.LogInformation("Request body (truncated): {Body}", json[..Math.Min(200, json.Length)] + "...");
logger.LogInformation("Request headers before signing: Date={Date}, Digest={Digest}, Host={Host}", logger.LogInformation("Request headers before signing: Date={Date}, Digest={Digest}, Host={Host}",
request.Headers.Date, digest, request.Headers.Host); request.Headers.Date, digest, request.Headers.Host);
@@ -263,9 +269,7 @@ public class ActivityPubDeliveryService(
{ {
var value = header.Value.Any() ? header.Value.First() : string.Empty; var value = header.Value.Any() ? header.Value.First() : string.Empty;
if (header.Key == "signature") if (header.Key == "signature")
{ value = value[..Math.Min(100, value.Length)] + "...";
value = value.Substring(0, Math.Min(100, value.Length)) + "...";
}
logger.LogInformation(" {Key}: {Value}", header.Key, value); logger.LogInformation(" {Key}: {Value}", header.Key, value);
} }

View File

@@ -1,8 +1,5 @@
using System.Security.Cryptography;
using System.Text; using System.Text;
using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Models;
using DysonNetwork.Sphere.ActivityPub;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using NodaTime; using NodaTime;
@@ -105,7 +102,7 @@ public class ActivityPubSignatureService(
logger.LogInformation("Signing outgoing request. ActorUri: {ActorUri}, PublisherId: {PublisherId}", logger.LogInformation("Signing outgoing request. ActorUri: {ActorUri}, PublisherId: {PublisherId}",
actorUri, publisher.Id); actorUri, publisher.Id);
var headersToSign = new[] { "(request-target)", "host", "date", "digest" }; var headersToSign = new[] { RequestTarget, "host", "date", "digest" };
var signingString = BuildSigningStringForRequest(request, headersToSign); var signingString = BuildSigningStringForRequest(request, headersToSign);
logger.LogInformation("Signing string for outgoing request: {SigningString}", signingString); logger.LogInformation("Signing string for outgoing request: {SigningString}", signingString);
@@ -215,7 +212,7 @@ public class ActivityPubSignatureService(
sb.Append(header.ToLower()); sb.Append(header.ToLower());
sb.Append(": "); sb.Append(": ");
if (header == "(request-target)") if (header == RequestTarget)
{ {
var method = context.Request.Method.ToLower(); var method = context.Request.Method.ToLower();
var path = context.Request.Path.Value ?? ""; var path = context.Request.Path.Value ?? "";
@@ -244,56 +241,51 @@ public class ActivityPubSignatureService(
foreach (var header in headers) foreach (var header in headers)
{ {
if (sb.Length > 0) if (sb.Length > 0)
sb.Append("\n"); sb.Append('\n');
sb.Append(header.ToLower()); sb.Append(header.ToLower());
sb.Append(": "); sb.Append(": ");
if (header == "(request-target)") switch (header)
{
case RequestTarget:
{ {
var method = request.Method.Method.ToLower(); var method = request.Method.Method.ToLower();
var path = request.RequestUri?.PathAndQuery ?? "/"; var path = request.RequestUri?.PathAndQuery ?? "/";
sb.Append($"{method} {path}"); sb.Append($"{method} {path}");
logger.LogInformation(" (request-target): {Value}", $"{method} {path}"); logger.LogInformation(" {Key}: {Value}", RequestTarget, $"{method} {path}");
break;
} }
else if (header == "host") case "host" when request.Headers.Contains("Host"):
{
if (request.Headers.Contains("Host"))
{ {
var value = request.Headers.GetValues("Host").First(); var value = request.Headers.GetValues("Host").First();
sb.Append(value); sb.Append(value);
logger.LogInformation(" host: {Value}", value); logger.LogInformation(" host: {Value}", value);
break;
} }
else case "host":
{
logger.LogWarning("Host header not found in request"); logger.LogWarning("Host header not found in request");
} break;
} case "date" when request.Headers.Contains("Date"):
else if (header == "date")
{
if (request.Headers.Contains("Date"))
{ {
var value = request.Headers.GetValues("Date").First(); var value = request.Headers.GetValues("Date").First();
sb.Append(value); sb.Append(value);
logger.LogInformation(" date: {Value}", value); logger.LogInformation(" date: {Value}", value);
break;
} }
else case "date":
{
logger.LogWarning("Date header not found in request"); logger.LogWarning("Date header not found in request");
} break;
} case "digest" when request.Headers.Contains("Digest"):
else if (header == "digest")
{
if (request.Headers.Contains("Digest"))
{ {
var value = request.Headers.GetValues("Digest").First(); var value = request.Headers.GetValues("Digest").First();
sb.Append(value); sb.Append(value);
logger.LogInformation(" digest: {Value}", value); logger.LogInformation(" digest: {Value}", value);
break;
} }
else case "digest":
{
logger.LogWarning("Digest header not found in request"); logger.LogWarning("Digest header not found in request");
} break;
} }
} }

View File

@@ -68,6 +68,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AForwardedHeaders_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcfe5737f9bb84738979cbfedd11822a8ea00_003F50_003F9a335f87_003FForwardedHeaders_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AForwardedHeaders_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcfe5737f9bb84738979cbfedd11822a8ea00_003F50_003F9a335f87_003FForwardedHeaders_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AForwardedTransformExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fbf3f51607a3e4e76b5b91640cd7409195c430_003F03_003F36e779df_003FForwardedTransformExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AForwardedTransformExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fbf3f51607a3e4e76b5b91640cd7409195c430_003F03_003F36e779df_003FForwardedTransformExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGrpcChannel_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F33b697967214455ca048862a59bf98a457c60_003Fc0_003Fd99cb5be_003FGrpcChannel_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGrpcChannel_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F33b697967214455ca048862a59bf98a457c60_003Fc0_003Fd99cb5be_003FGrpcChannel_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpClient_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fe2a45b06be5b46e99e816c528ca681d21dff08_003Fcc_003F25010ffa_003FHttpClient_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpContext_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc181aff8c6ec418494a7efcfec578fc154e00_003Fd0_003Fcc905531_003FHttpContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpContext_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc181aff8c6ec418494a7efcfec578fc154e00_003Fd0_003Fcc905531_003FHttpContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpRequestHeaders_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb904f9896c4049fabd596decf1be9c381dc400_003F32_003F906beb77_003FHttpRequestHeaders_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpRequestHeaders_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb904f9896c4049fabd596decf1be9c381dc400_003F32_003F906beb77_003FHttpRequestHeaders_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpStatusCode_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb3f2e07d4b3f4b42a41fbcf3137e534f3be00_003Fe2_003F215f9441_003FHttpStatusCode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpStatusCode_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb3f2e07d4b3f4b42a41fbcf3137e534f3be00_003Fe2_003F215f9441_003FHttpStatusCode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>