From 0a5e1307838e6dea16c5a38b5f437aff30bd20db Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 16 Jun 2024 22:36:38 +0200 Subject: [PATCH] [backend/federation] Log instance blocked failures in inbox queue as debug --- .../ActivityPub/ActivityHandlerService.cs | 2 +- .../Core/Federation/ActivityPub/ObjectResolver.cs | 2 +- .../Core/Middleware/ErrorHandlerMiddleware.cs | 15 +++++++++++++++ Iceshrimp.Backend/Core/Queues/InboxQueue.cs | 15 +++++++++++++-- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityHandlerService.cs b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityHandlerService.cs index 18a4730c..b60a7bb6 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityHandlerService.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityPub/ActivityHandlerService.cs @@ -34,7 +34,7 @@ public class ActivityHandlerService( if (activity.Actor == null) throw GracefulException.UnprocessableEntity("Cannot perform activity as actor 'null'"); if (await federationCtrl.ShouldBlockAsync(activity.Actor.Id)) - throw GracefulException.UnprocessableEntity("Instance is blocked"); + throw new InstanceBlockedException(activity.Actor.Id); if (activity.Object == null && activity is not ASBite) throw GracefulException.UnprocessableEntity("Activity object is null"); diff --git a/Iceshrimp.Backend/Core/Federation/ActivityPub/ObjectResolver.cs b/Iceshrimp.Backend/Core/Federation/ActivityPub/ObjectResolver.cs index 5d4caec7..9471e143 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityPub/ObjectResolver.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityPub/ObjectResolver.cs @@ -54,7 +54,7 @@ public class ObjectResolver( if (await federationCtrl.ShouldBlockAsync(baseObj.Id)) { - logger.LogDebug("Instance is blocked"); + logger.LogDebug("Instance is blocked ({uri})", baseObj.Id); return null; } diff --git a/Iceshrimp.Backend/Core/Middleware/ErrorHandlerMiddleware.cs b/Iceshrimp.Backend/Core/Middleware/ErrorHandlerMiddleware.cs index a42a3e1e..fa8bf5a5 100644 --- a/Iceshrimp.Backend/Core/Middleware/ErrorHandlerMiddleware.cs +++ b/Iceshrimp.Backend/Core/Middleware/ErrorHandlerMiddleware.cs @@ -207,6 +207,21 @@ public class LocalFetchException(string uri) public string Uri => uri; } +public class InstanceBlockedException(string uri, string? host = null) + : GracefulException(HttpStatusCode.UnprocessableEntity, "Instance is blocked") +{ + public string? Host + { + get + { + if (host != null) return host; + return System.Uri.TryCreate(uri, UriKind.Absolute, out var res) ? res.Host : null; + } + } + + public string Uri => uri; +} + public enum ExceptionVerbosity { [SuppressMessage("ReSharper", "UnusedMember.Global")] diff --git a/Iceshrimp.Backend/Core/Queues/InboxQueue.cs b/Iceshrimp.Backend/Core/Queues/InboxQueue.cs index a2d67f59..3e2decfd 100644 --- a/Iceshrimp.Backend/Core/Queues/InboxQueue.cs +++ b/Iceshrimp.Backend/Core/Queues/InboxQueue.cs @@ -25,7 +25,18 @@ public class InboxQueue(int parallelism) throw new GracefulException("Job data is not an ASActivity", $"Type: {obj.Type}"); var apHandler = scope.GetRequiredService(); - await apHandler.PerformActivityAsync(activity, jobData.InboxUserId, jobData.AuthenticatedUserId); + try + { + await apHandler.PerformActivityAsync(activity, jobData.InboxUserId, jobData.AuthenticatedUserId); + } + catch (InstanceBlockedException e) + { + var logger = scope.GetRequiredService>(); + if (e.Host != null) + logger.LogDebug("Refusing to process activity {id}: Instance {host} is blocked", job.Id, e.Host); + else + logger.LogDebug("Refusing to process activity {id}: Instance is blocked ({uri})", job.Id, e.Uri); + } } } @@ -34,4 +45,4 @@ public class InboxJobData [JR] [J("body")] public required string Body { get; set; } [JR] [J("inboxUserId")] public required string? InboxUserId { get; set; } [JR] [J("authenticatedUserId")] public required string? AuthenticatedUserId { get; set; } -} +} \ No newline at end of file