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
 | 
			
		||||
 | 
			
		||||
  # 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
 | 
			
		||||
    from(d in Delivery, where: d.object_id == ^object_id)
 | 
			
		||||
    |> 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?(_), 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
 | 
			
		||||
    from(u in User,
 | 
			
		||||
      inner_join: delivery in assoc(u, :deliveries),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,9 +5,11 @@
 | 
			
		|||
defmodule Pleroma.Web.ActivityPub.Publisher do
 | 
			
		||||
  alias Pleroma.Activity
 | 
			
		||||
  alias Pleroma.Config
 | 
			
		||||
  alias Pleroma.Delivery
 | 
			
		||||
  alias Pleroma.HTTP
 | 
			
		||||
  alias Pleroma.Instances
 | 
			
		||||
  alias Pleroma.User
 | 
			
		||||
  alias Pleroma.Object
 | 
			
		||||
  alias Pleroma.Web.ActivityPub.Relay
 | 
			
		||||
  alias Pleroma.Web.ActivityPub.Transmogrifier
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -107,7 +109,18 @@ defp recipients(actor, activity) do
 | 
			
		|||
        {:ok, []}
 | 
			
		||||
      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
 | 
			
		||||
 | 
			
		||||
  defp get_cc_ap_ids(ap_id, recipients) do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,15 +3,17 @@
 | 
			
		|||
# SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
defmodule Pleroma.Web.ActivityPub.PublisherTest do
 | 
			
		||||
  use Pleroma.DataCase
 | 
			
		||||
  use Pleroma.Web.ConnCase
 | 
			
		||||
 | 
			
		||||
  import Pleroma.Factory
 | 
			
		||||
  import Tesla.Mock
 | 
			
		||||
  import Mock
 | 
			
		||||
 | 
			
		||||
  alias Pleroma.Activity
 | 
			
		||||
  alias Pleroma.Object
 | 
			
		||||
  alias Pleroma.Instances
 | 
			
		||||
  alias Pleroma.Web.ActivityPub.Publisher
 | 
			
		||||
  alias Pleroma.Web.CommonAPI
 | 
			
		||||
 | 
			
		||||
  @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
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue