Use delivery info when federating deletes
This commit is contained in:
parent
b0e6058021
commit
ce23529d91
4 changed files with 89 additions and 2 deletions
|
@ -46,6 +46,10 @@ def get_or_create(object_id, user_id) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# A hack because user delete activities have a fake id for whatever reason
|
||||||
|
# TODO: Get rid of this
|
||||||
|
def delete_all_by_object_id("pleroma:fake_object_id"), do: {0, []}
|
||||||
|
|
||||||
def delete_all_by_object_id(object_id) do
|
def delete_all_by_object_id(object_id) do
|
||||||
from(d in Delivery, where: d.object_id == ^object_id)
|
from(d in Delivery, where: d.object_id == ^object_id)
|
||||||
|> Repo.delete_all()
|
|> Repo.delete_all()
|
||||||
|
|
|
@ -1627,6 +1627,10 @@ def is_internal_user?(%User{nickname: nil}), do: true
|
||||||
def is_internal_user?(%User{local: true, nickname: "internal." <> _}), do: true
|
def is_internal_user?(%User{local: true, nickname: "internal." <> _}), do: true
|
||||||
def is_internal_user?(_), do: false
|
def is_internal_user?(_), do: false
|
||||||
|
|
||||||
|
# A hack because user delete activities have a fake id for whatever reason
|
||||||
|
# TODO: Get rid of this
|
||||||
|
def get_delivered_users_by_object_id("pleroma:fake_object_id"), do: []
|
||||||
|
|
||||||
def get_delivered_users_by_object_id(object_id) do
|
def get_delivered_users_by_object_id(object_id) do
|
||||||
from(u in User,
|
from(u in User,
|
||||||
inner_join: delivery in assoc(u, :deliveries),
|
inner_join: delivery in assoc(u, :deliveries),
|
||||||
|
|
|
@ -5,9 +5,11 @@
|
||||||
defmodule Pleroma.Web.ActivityPub.Publisher do
|
defmodule Pleroma.Web.ActivityPub.Publisher do
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.Config
|
alias Pleroma.Config
|
||||||
|
alias Pleroma.Delivery
|
||||||
alias Pleroma.HTTP
|
alias Pleroma.HTTP
|
||||||
alias Pleroma.Instances
|
alias Pleroma.Instances
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Object
|
||||||
alias Pleroma.Web.ActivityPub.Relay
|
alias Pleroma.Web.ActivityPub.Relay
|
||||||
alias Pleroma.Web.ActivityPub.Transmogrifier
|
alias Pleroma.Web.ActivityPub.Transmogrifier
|
||||||
|
|
||||||
|
@ -107,7 +109,18 @@ defp recipients(actor, activity) do
|
||||||
{:ok, []}
|
{:ok, []}
|
||||||
end
|
end
|
||||||
|
|
||||||
Pleroma.Web.Salmon.remote_users(actor, activity) ++ followers
|
fetchers =
|
||||||
|
with %Activity{data: %{"type" => "Delete"}} <- activity,
|
||||||
|
%Object{id: object_id} <- Object.normalize(activity),
|
||||||
|
fetchers <- User.get_delivered_users_by_object_id(object_id),
|
||||||
|
_ <- Delivery.delete_all_by_object_id(object_id) do
|
||||||
|
fetchers
|
||||||
|
else
|
||||||
|
_ ->
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
|
Pleroma.Web.Salmon.remote_users(actor, activity) ++ followers ++ fetchers
|
||||||
end
|
end
|
||||||
|
|
||||||
defp get_cc_ap_ids(ap_id, recipients) do
|
defp get_cc_ap_ids(ap_id, recipients) do
|
||||||
|
|
|
@ -3,15 +3,17 @@
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
defmodule Pleroma.Web.ActivityPub.PublisherTest do
|
defmodule Pleroma.Web.ActivityPub.PublisherTest do
|
||||||
use Pleroma.DataCase
|
use Pleroma.Web.ConnCase
|
||||||
|
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
import Tesla.Mock
|
import Tesla.Mock
|
||||||
import Mock
|
import Mock
|
||||||
|
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
|
alias Pleroma.Object
|
||||||
alias Pleroma.Instances
|
alias Pleroma.Instances
|
||||||
alias Pleroma.Web.ActivityPub.Publisher
|
alias Pleroma.Web.ActivityPub.Publisher
|
||||||
|
alias Pleroma.Web.CommonAPI
|
||||||
|
|
||||||
@as_public "https://www.w3.org/ns/activitystreams#Public"
|
@as_public "https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
|
||||||
|
@ -262,5 +264,69 @@ test "it returns inbox for messages involving single recipients in total" do
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test_with_mock "publishes a delete activity to peers who signed fetch requests to the create acitvity/object.",
|
||||||
|
Pleroma.Web.Federator.Publisher,
|
||||||
|
[:passthrough],
|
||||||
|
[] do
|
||||||
|
fetcher =
|
||||||
|
insert(:user,
|
||||||
|
local: false,
|
||||||
|
info: %{
|
||||||
|
ap_enabled: true,
|
||||||
|
source_data: %{"inbox" => "https://domain.com/users/nick1/inbox"}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
another_fetcher =
|
||||||
|
insert(:user,
|
||||||
|
local: false,
|
||||||
|
info: %{
|
||||||
|
ap_enabled: true,
|
||||||
|
source_data: %{"inbox" => "https://domain2.com/users/nick1/inbox"}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
actor = insert(:user)
|
||||||
|
|
||||||
|
note_activity = insert(:note_activity, user: actor)
|
||||||
|
object = Object.normalize(note_activity)
|
||||||
|
|
||||||
|
activity_path = String.trim_leading(note_activity.data["id"], Pleroma.Web.Endpoint.url())
|
||||||
|
object_path = String.trim_leading(object.data["id"], Pleroma.Web.Endpoint.url())
|
||||||
|
|
||||||
|
build_conn()
|
||||||
|
|> put_req_header("accept", "application/activity+json")
|
||||||
|
|> assign(:user, fetcher)
|
||||||
|
|> get(object_path)
|
||||||
|
|> json_response(200)
|
||||||
|
|
||||||
|
build_conn()
|
||||||
|
|> put_req_header("accept", "application/activity+json")
|
||||||
|
|> assign(:user, another_fetcher)
|
||||||
|
|> get(activity_path)
|
||||||
|
|> json_response(200)
|
||||||
|
|
||||||
|
{:ok, delete} = CommonAPI.delete(note_activity.id, actor)
|
||||||
|
|
||||||
|
res = Publisher.publish(actor, delete)
|
||||||
|
assert res == :ok
|
||||||
|
|
||||||
|
assert called(
|
||||||
|
Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
|
||||||
|
inbox: "https://domain.com/users/nick1/inbox",
|
||||||
|
actor: actor,
|
||||||
|
id: delete.data["id"]
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
assert called(
|
||||||
|
Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
|
||||||
|
inbox: "https://domain2.com/users/nick1/inbox",
|
||||||
|
actor: actor,
|
||||||
|
id: delete.data["id"]
|
||||||
|
})
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue