♻️ Adjust in key lookup in verification
This commit is contained in:
@@ -40,7 +40,7 @@ public class ActivityPubKeyService(ILogger<ActivityPubKeyService> logger)
|
|||||||
var signature = Convert.FromBase64String(signatureBase64);
|
var signature = Convert.FromBase64String(signatureBase64);
|
||||||
|
|
||||||
logger.LogDebug("Attempting signature verification. Key starts with: {KeyStart}",
|
logger.LogDebug("Attempting signature verification. Key starts with: {KeyStart}",
|
||||||
publicKeyPem.Substring(0, Math.Min(50, publicKeyPem.Length)));
|
publicKeyPem[..Math.Min(50, publicKeyPem.Length)]);
|
||||||
|
|
||||||
var result = rsa.VerifyData(
|
var result = rsa.VerifyData(
|
||||||
Encoding.UTF8.GetBytes(data),
|
Encoding.UTF8.GetBytes(data),
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using DysonNetwork.Shared.Cache;
|
|
||||||
using DysonNetwork.Shared.Models;
|
using DysonNetwork.Shared.Models;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using NodaTime;
|
using NodaTime;
|
||||||
@@ -10,13 +9,11 @@ public class ActivityPubSignatureService(
|
|||||||
AppDatabase db,
|
AppDatabase db,
|
||||||
ActivityPubKeyService keyService,
|
ActivityPubKeyService keyService,
|
||||||
ActivityPubDiscoveryService discoveryService,
|
ActivityPubDiscoveryService discoveryService,
|
||||||
ICacheService cache,
|
|
||||||
ILogger<ActivityPubSignatureService> logger,
|
ILogger<ActivityPubSignatureService> logger,
|
||||||
IConfiguration configuration
|
IConfiguration configuration
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
private const string RequestTarget = "(request-target)";
|
private const string RequestTarget = "(request-target)";
|
||||||
private const string PublicKeyCachePrefix = "ap:publickey:";
|
|
||||||
private string Domain => configuration["ActivityPub:Domain"] ?? "localhost";
|
private string Domain => configuration["ActivityPub:Domain"] ?? "localhost";
|
||||||
|
|
||||||
public bool VerifyIncomingRequest(HttpContext context, out string? actorUri)
|
public bool VerifyIncomingRequest(HttpContext context, out string? actorUri)
|
||||||
@@ -62,7 +59,7 @@ public class ActivityPubSignatureService(
|
|||||||
var signature = signatureParts.GetValueOrDefault("signature");
|
var signature = signatureParts.GetValueOrDefault("signature");
|
||||||
|
|
||||||
logger.LogInformation("Built signing string for verification. SigningString: {SigningString}, Signature: {Signature}",
|
logger.LogInformation("Built signing string for verification. SigningString: {SigningString}, Signature: {Signature}",
|
||||||
signingString, signature?.Substring(0, Math.Min(50, signature?.Length ?? 0)) + "...");
|
signingString, signature?[..Math.Min(50, signature?.Length ?? 0)] + "...");
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(signingString) || string.IsNullOrEmpty(signature))
|
if (string.IsNullOrEmpty(signingString) || string.IsNullOrEmpty(signature))
|
||||||
{
|
{
|
||||||
@@ -120,16 +117,13 @@ public class ActivityPubSignatureService(
|
|||||||
|
|
||||||
private async Task<string?> GetOrFetchPublicKeyAsync(string keyId)
|
private async Task<string?> GetOrFetchPublicKeyAsync(string keyId)
|
||||||
{
|
{
|
||||||
|
var pkActor = db.FediverseActors
|
||||||
|
.Where(a => a.PublicKeyId == keyId)
|
||||||
|
.Select(a => a.PublicKey)
|
||||||
|
.FirstOrDefault();
|
||||||
|
if (pkActor is not null) return pkActor;
|
||||||
|
|
||||||
var actorUri = keyId.Split('#')[0];
|
var actorUri = keyId.Split('#')[0];
|
||||||
var cacheKey = $"{PublicKeyCachePrefix}{actorUri}";
|
|
||||||
|
|
||||||
var cachedKey = await cache.GetAsync<string>(cacheKey);
|
|
||||||
if (!string.IsNullOrEmpty(cachedKey))
|
|
||||||
{
|
|
||||||
logger.LogInformation("Using cached public key for actor: {ActorUri}", actorUri);
|
|
||||||
return cachedKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
var actor = db.FediverseActors.FirstOrDefault(a => a.Uri == actorUri);
|
var actor = db.FediverseActors.FirstOrDefault(a => a.Uri == actorUri);
|
||||||
|
|
||||||
if (actor == null)
|
if (actor == null)
|
||||||
@@ -162,17 +156,11 @@ public class ActivityPubSignatureService(
|
|||||||
{
|
{
|
||||||
await discoveryService.FetchActorDataAsync(actor);
|
await discoveryService.FetchActorDataAsync(actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(actor.PublicKey))
|
if (!string.IsNullOrEmpty(actor.PublicKey)) return actor.PublicKey;
|
||||||
{
|
logger.LogWarning("Still no public key after fetch for actor: {ActorUri}", actorUri);
|
||||||
logger.LogWarning("Still no public key after fetch for actor: {ActorUri}", actorUri);
|
return null;
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
await cache.SetAsync(cacheKey, actor.PublicKey, TimeSpan.FromHours(24));
|
|
||||||
logger.LogInformation("Cached public key for actor: {ActorUri}", actorUri);
|
|
||||||
|
|
||||||
return actor.PublicKey;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<SnPublisher?> GetPublisherByActorUri(string actorUri)
|
private async Task<SnPublisher?> GetPublisherByActorUri(string actorUri)
|
||||||
@@ -260,9 +248,6 @@ public class ActivityPubSignatureService(
|
|||||||
|
|
||||||
foreach (var header in headers)
|
foreach (var header in headers)
|
||||||
{
|
{
|
||||||
if (header == "content-type")
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!first)
|
if (!first)
|
||||||
sb.Append('\n');
|
sb.Append('\n');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user