From 9e529f8b99757177d6699b624b5f4a5a945f9849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Z=C3=B6ller?= Date: Mon, 27 Apr 2026 22:27:16 +0200 Subject: [PATCH] Quote Post Fixe --- .../fitpub/service/FederationService.java | 14 +++++++------- .../javahippie/fitpub/service/InboxProcessor.java | 12 +++++++++--- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/javahippie/fitpub/service/FederationService.java b/src/main/java/net/javahippie/fitpub/service/FederationService.java index 7479fae..0bd681b 100644 --- a/src/main/java/net/javahippie/fitpub/service/FederationService.java +++ b/src/main/java/net/javahippie/fitpub/service/FederationService.java @@ -256,12 +256,12 @@ public class FederationService { * Send an Accept for a quote interaction (FEP-5e53). * This tells the quoting server that the quote has been approved. * - * @param createActivityId the ID of the incoming Create activity that contains the quote - * @param remoteActorUri the actor URI of the user who quoted the post - * @param localUser the local user who owns the quoted post + * @param noteUri the URI of the remote Note that quotes our post + * @param remoteActorUri the actor URI of the user who quoted the post + * @param localUser the local user who owns the quoted post */ @Async("taskExecutor") - public void sendAcceptQuote(String createActivityId, String remoteActorUri, User localUser) { + public void sendAcceptQuote(String noteUri, String remoteActorUri, User localUser) { try { RemoteActor remoteActor = fetchRemoteActor(remoteActorUri); @@ -273,13 +273,13 @@ public class FederationService { acceptActivity.put("type", "Accept"); acceptActivity.put("id", acceptId); acceptActivity.put("actor", actorUri); - acceptActivity.put("object", createActivityId); + acceptActivity.put("object", noteUri); sendActivity(remoteActor.getInboxUrl(), acceptActivity, localUser); - log.info("Sent Accept (quote approval) to: {} for Create {}", remoteActor.getActorUri(), createActivityId); + log.info("Sent Accept (quote approval) to: {} for Note {}", remoteActor.getActorUri(), noteUri); } catch (Exception e) { - log.error("Failed to send Accept for quote: {}", createActivityId, e); + log.error("Failed to send Accept for quote: {}", noteUri, e); } } diff --git a/src/main/java/net/javahippie/fitpub/service/InboxProcessor.java b/src/main/java/net/javahippie/fitpub/service/InboxProcessor.java index a5afcfb..8dff712 100644 --- a/src/main/java/net/javahippie/fitpub/service/InboxProcessor.java +++ b/src/main/java/net/javahippie/fitpub/service/InboxProcessor.java @@ -287,10 +287,16 @@ public class InboxProcessor { User localUser = userRepository.findByUsername(username) .orElseThrow(() -> new IllegalArgumentException("User not found: " + username)); - String createActivityId = (String) createActivity.get("id"); - log.info("Approving quote from {} for activity {} (Create id: {})", actor, activityId, createActivityId); + // Mastodon tracks pending quote approvals by the Note URI (the inner + // object's "id"), not by the wrapping Create activity's "id". The Accept + // we send back must therefore reference the Note URI so Mastodon can match + // it to the pending approval. + @SuppressWarnings("unchecked") + Map noteObject = (Map) createActivity.get("object"); + String noteUri = (String) noteObject.get("id"); + log.info("Approving quote from {} for activity {} (Note URI: {})", actor, activityId, noteUri); - federationService.sendAcceptQuote(createActivityId, actor, localUser); + federationService.sendAcceptQuote(noteUri, actor, localUser); } catch (Exception e) { log.error("Error handling quote approval for {}", quoteUri, e);