🐛 Fix keypair inconsistence
This commit is contained in:
@@ -45,6 +45,8 @@ public class ActivityPubController(
|
|||||||
var followingUrl = $"{actorUrl}/following";
|
var followingUrl = $"{actorUrl}/following";
|
||||||
var assetsBaseUrl = configuration["AssetsServerBaseUrl"] ?? $"https://{Domain}/files";
|
var assetsBaseUrl = configuration["AssetsServerBaseUrl"] ?? $"https://{Domain}/files";
|
||||||
|
|
||||||
|
var publicKeyPem = await GetPublicKeyAsync(publisher);
|
||||||
|
|
||||||
var actor = new ActivityPubActor
|
var actor = new ActivityPubActor
|
||||||
{
|
{
|
||||||
Context = ["https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1"],
|
Context = ["https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1"],
|
||||||
@@ -79,7 +81,7 @@ public class ActivityPubController(
|
|||||||
{
|
{
|
||||||
Id = $"{actorUrl}#main-key",
|
Id = $"{actorUrl}#main-key",
|
||||||
Owner = actorUrl,
|
Owner = actorUrl,
|
||||||
PublicKeyPem = GetPublicKey(publisher)
|
PublicKeyPem = publicKeyPem
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -298,16 +300,30 @@ public class ActivityPubController(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetPublicKey(SnPublisher publisher)
|
private async Task<string> GetPublicKeyAsync(SnPublisher publisher)
|
||||||
{
|
{
|
||||||
var publicKeyPem = GetPublisherKey(publisher, "public_key");
|
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();
|
var (newPrivate, newPublic) = keyService.GenerateKeyPair();
|
||||||
SavePublisherKey(publisher, "private_key", newPrivate);
|
SavePublisherKey(publisher, "private_key", newPrivate);
|
||||||
SavePublisherKey(publisher, "public_key", newPublic);
|
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;
|
return newPublic;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string? GetPublisherKey(SnPublisher publisher, string keyName)
|
private static string? GetPublisherKey(SnPublisher publisher, string keyName)
|
||||||
|
|||||||
@@ -249,12 +249,11 @@ public class ActivityPubDeliveryService(
|
|||||||
request.Headers.Date, digest, request.Headers.Host);
|
request.Headers.Date, digest, request.Headers.Host);
|
||||||
|
|
||||||
var signatureHeaders = await signatureService.SignOutgoingRequest(request, actorUri);
|
var signatureHeaders = await signatureService.SignOutgoingRequest(request, actorUri);
|
||||||
var signature = signatureHeaders;
|
|
||||||
|
var signatureString = $"keyId=\"{signatureHeaders["keyId"]}\"," +
|
||||||
var signatureString = $"keyId=\"{signature["keyId"]}\"," +
|
$"algorithm=\"{signatureHeaders["algorithm"]}\"," +
|
||||||
$"algorithm=\"{signature["algorithm"]}\"," +
|
$"headers=\"{signatureHeaders["headers"]}\"," +
|
||||||
$"headers=\"{signature["headers"]}\"," +
|
$"signature=\"{signatureHeaders["signature"]}\"";
|
||||||
$"signature=\"{signature["signature"]}\"";
|
|
||||||
|
|
||||||
request.Headers.Add("Signature", signatureString);
|
request.Headers.Add("Signature", signatureString);
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ public class ActivityPubSignatureService(
|
|||||||
if (publisher == null)
|
if (publisher == null)
|
||||||
throw new InvalidOperationException("Publisher not found");
|
throw new InvalidOperationException("Publisher not found");
|
||||||
|
|
||||||
var keyPair = GetOrGenerateKeyPair(publisher);
|
var keyPair = await GetOrGenerateKeyPairAsync(publisher);
|
||||||
var keyId = $"{actorUri}#main-key";
|
var keyId = $"{actorUri}#main-key";
|
||||||
|
|
||||||
logger.LogInformation("Signing outgoing request. ActorUri: {ActorUri}, PublisherId: {PublisherId}",
|
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);
|
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 privateKeyPem = GetPublisherKey(publisher, "private_key");
|
||||||
var publicKeyPem = GetPublisherKey(publisher, "public_key");
|
var publicKeyPem = GetPublisherKey(publisher, "public_key");
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(privateKeyPem) || string.IsNullOrEmpty(publicKeyPem))
|
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();
|
var (newPrivate, newPublic) = keyService.GenerateKeyPair();
|
||||||
SavePublisherKey(publisher, "private_key", newPrivate);
|
SavePublisherKey(publisher, "private_key", newPrivate);
|
||||||
SavePublisherKey(publisher, "public_key", newPublic);
|
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);
|
return (newPrivate, newPublic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.LogInformation("Using existing key pair for publisher: {PublisherId}", publisher.Id);
|
||||||
return (privateKeyPem, publicKeyPem);
|
return (privateKeyPem, publicKeyPem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user