hotfix: announce might also contain an activity
This commit is contained in:
@@ -379,6 +379,40 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
|||||||
end
|
end
|
||||||
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(
|
def handle_incoming(
|
||||||
%{"type" => "Announce", "object" => object, "actor" => _actor, "id" => _id} = data
|
%{"type" => "Announce", "object" => object, "actor" => _actor, "id" => _id} = data
|
||||||
) do
|
) do
|
||||||
@@ -1005,6 +1039,30 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
|||||||
defp fetch_object_optionally_authenticated(url, _),
|
defp fetch_object_optionally_authenticated(url, _),
|
||||||
do: ActivityPub.fetch_object_from_url(url, force: true)
|
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
|
defp eventually_create_share(object, entity, actor_id) do
|
||||||
with object_id <- object |> Utils.get_url(),
|
with object_id <- object |> Utils.get_url(),
|
||||||
%Actor{id: object_owner_actor_id} <- Ownable.actor(entity) do
|
%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")
|
Logger.debug("object is really gone")
|
||||||
{:ok, object}
|
{:ok, object}
|
||||||
|
|
||||||
|
{:error, :http_not_found, object} ->
|
||||||
|
Logger.debug("object can not be found any longer")
|
||||||
|
{:ok, object}
|
||||||
|
|
||||||
{:ok, %{url: url} = object} ->
|
{:ok, %{url: url} = object} ->
|
||||||
if Utils.are_same_origin?(url, Endpoint.url()),
|
if Utils.are_same_origin?(url, Endpoint.url()),
|
||||||
do: {:ok, object},
|
do: {:ok, object},
|
||||||
|
|||||||
Reference in New Issue
Block a user