From 9f9c4e769b328e6fb1b71e88b6b2cd4b82851b7a Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sat, 30 May 2026 02:39:14 +0200 Subject: [PATCH] fix: persist inbound Block to blocklist, clear on Undo(Block) Closes #1 --- src/activities/block.rs | 11 ++++++++--- src/activities/undo.rs | 13 ++++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/activities/block.rs b/src/activities/block.rs index e5e990e..db19a02 100644 --- a/src/activities/block.rs +++ b/src/activities/block.rs @@ -46,17 +46,22 @@ impl Activity for BlockActivity { if check_guards(&self.id, self.actor.inner(), data).await? { return Ok(()); } + let actor_url = self.actor.inner().as_str(); if let Some(local_user_id) = crate::urls::extract_user_id_from_url(&self.object) { let _ = data .follow_repo - .remove_following(local_user_id, self.actor.inner().as_str()) + .remove_following(local_user_id, actor_url) .await; let _ = data .follow_repo - .remove_follower(local_user_id, self.actor.inner().as_str()) + .remove_follower(local_user_id, actor_url) + .await; + let _ = data + .blocklist_repo + .add_blocked_actor(local_user_id, actor_url) .await; } - tracing::info!(actor = %self.actor.inner(), "received block — removed following and follower"); + tracing::info!(actor = %actor_url, "received block — removed relationships, recorded in blocklist"); Ok(()) } } diff --git a/src/activities/undo.rs b/src/activities/undo.rs index f382af6..ba73717 100644 --- a/src/activities/undo.rs +++ b/src/activities/undo.rs @@ -128,11 +128,18 @@ impl Activity for UndoActivity { tracing::info!(actor = %self.actor.inner(), "received Undo(Announce)"); } "Block" => { - // Remote actor unblocked a local user. No automatic relationship - // restoration — the blocked user would need to re-follow manually. + if let Some(obj_url) = self.object.get("object").and_then(|o| o.as_str()) + && let Ok(url) = Url::parse(obj_url) + && let Some(user_id) = crate::urls::extract_user_id_from_url(&url) + { + let _ = data + .blocklist_repo + .remove_blocked_actor(user_id, self.actor.inner().as_str()) + .await; + } tracing::info!( actor = %self.actor.inner(), - "received Undo(Block) — no automatic action taken" + "received Undo(Block) — removed from blocklist" ); } other => {