From 2d7da5f4375164aa78e221ab054529a04d09e819 Mon Sep 17 00:00:00 2001
From: sxsdv1 <sxsdv1@gmail.com>
Date: Sat, 5 Jan 2019 10:38:38 +0100
Subject: [PATCH] Don't crash on AP request for tombstone

Because tombstone objects has no addressing the is_public?-predicate
would cause an error that propagated as a 500 error in the api
---
 lib/pleroma/web/activity_pub/activity_pub.ex        |  4 ++++
 test/support/factory.ex                             | 13 +++++++++++++
 .../activity_pub/activity_pub_controller_test.exs   | 12 ++++++++++++
 3 files changed, 29 insertions(+)

diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 4d754de13..4685f6d95 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -801,6 +801,10 @@ def fetch_and_contain_remote_object_from_id(id) do
     end
   end
 
+  def is_public?(%Object{data: %{"type" => "Tombstone"}}) do
+    false
+  end
+
   def is_public?(activity) do
     "https://www.w3.org/ns/activitystreams#Public" in (activity.data["to"] ++
                                                          (activity.data["cc"] || []))
diff --git a/test/support/factory.ex b/test/support/factory.ex
index e5c0c5bcc..57fa4a79d 100644
--- a/test/support/factory.ex
+++ b/test/support/factory.ex
@@ -57,6 +57,19 @@ def direct_note_factory do
     %Pleroma.Object{data: Map.merge(data, %{"to" => [user2.ap_id]})}
   end
 
+  def tombstone_factory do
+    data = %{
+      "type" => "Tombstone",
+      "id" => Pleroma.Web.ActivityPub.Utils.generate_object_id(),
+      "formerType" => "Note",
+      "deleted" => DateTime.utc_now() |> DateTime.to_iso8601()
+    }
+
+    %Pleroma.Object{
+      data: data
+    }
+  end
+
   def direct_note_activity_factory do
     dm = insert(:direct_note)
 
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs
index 620e03674..7d1fe184e 100644
--- a/test/web/activity_pub/activity_pub_controller_test.exs
+++ b/test/web/activity_pub/activity_pub_controller_test.exs
@@ -75,6 +75,18 @@ test "it returns 404 for non-public messages", %{conn: conn} do
 
       assert json_response(conn, 404)
     end
+
+    test "it returns 404 for tombstone objects", %{conn: conn} do
+      tombstone = insert(:tombstone)
+      uuid = String.split(tombstone.data["id"], "/") |> List.last()
+
+      conn =
+        conn
+        |> put_req_header("accept", "application/activity+json")
+        |> get("/objects/#{uuid}")
+
+      assert json_response(conn, 404)
+    end
   end
 
   describe "/inbox" do