From 7f5b447b3ca55cfb5a6b6c0c0443b5ddba06fc59 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Mon, 29 Dec 2025 22:44:41 +0800 Subject: [PATCH] :bug: Fix keypair inconsistence --- .../ActivityPub/ActivityPubController.cs | 24 +++++++++++++++---- .../ActivityPub/ActivityPubDeliveryService.cs | 11 ++++----- .../ActivityPubSignatureService.cs | 15 ++++++++++-- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/DysonNetwork.Sphere/ActivityPub/ActivityPubController.cs b/DysonNetwork.Sphere/ActivityPub/ActivityPubController.cs index 99bf4e3..5cca287 100644 --- a/DysonNetwork.Sphere/ActivityPub/ActivityPubController.cs +++ b/DysonNetwork.Sphere/ActivityPub/ActivityPubController.cs @@ -45,6 +45,8 @@ public class ActivityPubController( var followingUrl = $"{actorUrl}/following"; var assetsBaseUrl = configuration["AssetsServerBaseUrl"] ?? $"https://{Domain}/files"; + var publicKeyPem = await GetPublicKeyAsync(publisher); + var actor = new ActivityPubActor { Context = ["https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1"], @@ -79,7 +81,7 @@ public class ActivityPubController( { Id = $"{actorUrl}#main-key", Owner = actorUrl, - PublicKeyPem = GetPublicKey(publisher) + PublicKeyPem = publicKeyPem } }; @@ -298,16 +300,30 @@ public class ActivityPubController( } } - private string GetPublicKey(SnPublisher publisher) + private async Task GetPublicKeyAsync(SnPublisher publisher) { var publicKeyPem = GetPublisherKey(publisher, "public_key"); - if (!string.IsNullOrEmpty(publicKeyPem)) return publicKeyPem; + if (!string.IsNullOrEmpty(publicKeyPem)) + { + logger.LogInformation("Using existing public key for publisher: {PublisherId}", publisher.Id); + return publicKeyPem; + } + + logger.LogInformation("Generating new key pair for publisher: {PublisherId} ({Name})", + publisher.Id, publisher.Name); + var (newPrivate, newPublic) = keyService.GenerateKeyPair(); SavePublisherKey(publisher, "private_key", newPrivate); SavePublisherKey(publisher, "public_key", newPublic); + + publisher.UpdatedAt = SystemClock.Instance.GetCurrentInstant(); + db.Update(publisher); + await db.SaveChangesAsync(); + + logger.LogInformation("Saved new key pair to database for publisher: {PublisherId}", publisher.Id); + return newPublic; - } private static string? GetPublisherKey(SnPublisher publisher, string keyName) diff --git a/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs b/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs index 8d4d345..ed7650a 100644 --- a/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs +++ b/DysonNetwork.Sphere/ActivityPub/ActivityPubDeliveryService.cs @@ -249,12 +249,11 @@ public class ActivityPubDeliveryService( request.Headers.Date, digest, request.Headers.Host); var signatureHeaders = await signatureService.SignOutgoingRequest(request, actorUri); - var signature = signatureHeaders; - - var signatureString = $"keyId=\"{signature["keyId"]}\"," + - $"algorithm=\"{signature["algorithm"]}\"," + - $"headers=\"{signature["headers"]}\"," + - $"signature=\"{signature["signature"]}\""; + + var signatureString = $"keyId=\"{signatureHeaders["keyId"]}\"," + + $"algorithm=\"{signatureHeaders["algorithm"]}\"," + + $"headers=\"{signatureHeaders["headers"]}\"," + + $"signature=\"{signatureHeaders["signature"]}\""; request.Headers.Add("Signature", signatureString); diff --git a/DysonNetwork.Sphere/ActivityPub/ActivityPubSignatureService.cs b/DysonNetwork.Sphere/ActivityPub/ActivityPubSignatureService.cs index 50720ea..ad37afc 100644 --- a/DysonNetwork.Sphere/ActivityPub/ActivityPubSignatureService.cs +++ b/DysonNetwork.Sphere/ActivityPub/ActivityPubSignatureService.cs @@ -98,7 +98,7 @@ public class ActivityPubSignatureService( if (publisher == null) throw new InvalidOperationException("Publisher not found"); - var keyPair = GetOrGenerateKeyPair(publisher); + var keyPair = await GetOrGenerateKeyPairAsync(publisher); var keyId = $"{actorUri}#main-key"; logger.LogInformation("Signing outgoing request. ActorUri: {ActorUri}, PublisherId: {PublisherId}", @@ -134,19 +134,30 @@ public class ActivityPubSignatureService( return await db.Publishers.FirstOrDefaultAsync(p => p.Name == username); } - private (string? privateKeyPem, string? publicKeyPem) GetOrGenerateKeyPair(SnPublisher publisher) + private async Task<(string privateKeyPem, string publicKeyPem)> GetOrGenerateKeyPairAsync(SnPublisher publisher) { var privateKeyPem = GetPublisherKey(publisher, "private_key"); var publicKeyPem = GetPublisherKey(publisher, "public_key"); if (string.IsNullOrEmpty(privateKeyPem) || string.IsNullOrEmpty(publicKeyPem)) { + logger.LogInformation("Generating new key pair for publisher: {PublisherId} ({Name})", + publisher.Id, publisher.Name); + var (newPrivate, newPublic) = keyService.GenerateKeyPair(); SavePublisherKey(publisher, "private_key", newPrivate); SavePublisherKey(publisher, "public_key", newPublic); + + publisher.UpdatedAt = SystemClock.Instance.GetCurrentInstant(); + db.Update(publisher); + await db.SaveChangesAsync(); + + logger.LogInformation("Saved new key pair to database for publisher: {PublisherId}", publisher.Id); + return (newPrivate, newPublic); } + logger.LogInformation("Using existing key pair for publisher: {PublisherId}", publisher.Id); return (privateKeyPem, publicKeyPem); }