From 2a29b623e999f1199f35f3efca4c999a0d5b370f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Menrath?= Date: Fri, 13 Sep 2024 16:48:16 +0200 Subject: [PATCH] hotfix: announce might also contain an activity --- lib/federation/activity_pub/transmogrifier.ex | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/lib/federation/activity_pub/transmogrifier.ex b/lib/federation/activity_pub/transmogrifier.ex index 99c425365..4e2fc9312 100644 --- a/lib/federation/activity_pub/transmogrifier.ex +++ b/lib/federation/activity_pub/transmogrifier.ex @@ -379,6 +379,40 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do end end + def handle_incoming( + %{ + "type" => "Announce", + "object" => %{ + "type" => "Delete", + "object" => + %{ + "type" => type + } = object + }, + "actor" => _actor, + "id" => _id + } = data + ) + when type in ["Event", "Note"] do + Logger.info("Got an announce with an delete activity.") + + actor_url = Utils.get_actor(data) + object_id = Utils.get_url(object) + + case ActivityPubActor.get_or_fetch_actor_by_url(actor_url) do + {:error, _err} -> + {:error, :unknown_actor} + + {:ok, %Actor{} = actor} -> + # If the actor itself is being deleted, no need to check anything other than the object being remote + if remote_actor_is_being_deleted(data) do + Actions.Delete.delete(actor, actor, false) + else + handle_group_being_gone(actor, actor_url, object_id) + end + end + end + def handle_incoming( %{"type" => "Announce", "object" => object, "actor" => _actor, "id" => _id} = data ) do @@ -1005,6 +1039,30 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do defp fetch_object_optionally_authenticated(url, _), do: ActivityPub.fetch_object_from_url(url, force: true) + # Hotfix for issue #1549: If we receive a share with an Create or Update Activity we add the contained object. + defp eventually_create_share( + %{ + "type" => type, + "object" => + %{ + "type" => object_type + } = contained_object + } = _object, + entity, + actor_id + ) + when type in ["Create", "Update"] and object_type in ["Event", "Note"] do + Logger.info("Maybe adding the contained object of a create/update activity to the share.") + + with object_id <- contained_object |> Utils.get_url(), + %Actor{id: object_owner_actor_id} <- Ownable.actor(entity) do + {:ok, %Mobilizon.Share{} = _share} = + Mobilizon.Share.create(object_id, actor_id, object_owner_actor_id) + end + + :ok + end + defp eventually_create_share(object, entity, actor_id) do with object_id <- object |> Utils.get_url(), %Actor{id: object_owner_actor_id} <- Ownable.actor(entity) do @@ -1161,6 +1219,10 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do Logger.debug("object is really gone") {:ok, object} + {:error, :http_not_found, object} -> + Logger.debug("object can not be found any longer") + {:ok, object} + {:ok, %{url: url} = object} -> if Utils.are_same_origin?(url, Endpoint.url()), do: {:ok, object},