Fetcher: Work when we can't get the OP.
authorlain <lain@soykaf.club>
Wed, 1 Jul 2020 09:48:51 +0000 (11:48 +0200)
committerlain <lain@soykaf.club>
Wed, 1 Jul 2020 09:48:51 +0000 (11:48 +0200)
lib/pleroma/web/activity_pub/transmogrifier.ex
test/fixtures/fetch_mocks/104410921027210069.json [new file with mode: 0644]
test/fixtures/fetch_mocks/9wTkLEnuq47B25EehM.json [new file with mode: 0644]
test/fixtures/fetch_mocks/eal.json [new file with mode: 0644]
test/fixtures/fetch_mocks/tuxcrafting.json [new file with mode: 0644]
test/object/fetcher_test.exs

index 278fbbeab14ddab7b8e65b0cf4957373e2147d8e..bc6fc4bd837c772df7191482a75bf7adc29c4612 100644 (file)
@@ -446,12 +446,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
       when objtype in ["Article", "Event", "Note", "Video", "Page", "Question", "Answer", "Audio"] do
     actor = Containment.get_actor(data)
 
-    data =
-      Map.put(data, "actor", actor)
-      |> fix_addressing
-
     with nil <- Activity.get_create_by_object_ap_id(object["id"]),
-         {:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(data["actor"]) do
+         {:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(actor),
+         data <- Map.put(data, "actor", actor) |> fix_addressing() do
       object = fix_object(object, options)
 
       params = %{
diff --git a/test/fixtures/fetch_mocks/104410921027210069.json b/test/fixtures/fetch_mocks/104410921027210069.json
new file mode 100644 (file)
index 0000000..583f7a4
--- /dev/null
@@ -0,0 +1,72 @@
+{
+   "@context" : [
+      "https://www.w3.org/ns/activitystreams",
+      {
+         "atomUri" : "ostatus:atomUri",
+         "conversation" : "ostatus:conversation",
+         "inReplyToAtomUri" : "ostatus:inReplyToAtomUri",
+         "ostatus" : "http://ostatus.org#",
+         "sensitive" : "as:sensitive",
+         "toot" : "http://joinmastodon.org/ns#",
+         "votersCount" : "toot:votersCount"
+      }
+   ],
+   "atomUri" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069",
+   "attachment" : [],
+   "attributedTo" : "https://busshi.moe/users/tuxcrafting",
+   "cc" : [
+      "https://busshi.moe/users/tuxcrafting/followers",
+      "https://stereophonic.space/users/fixpoint",
+      "https://blob.cat/users/blobyoumu",
+      "https://cawfee.club/users/grips",
+      "https://jaeger.website/users/igel"
+   ],
+   "content" : "<p><span class=\"h-card\"><a href=\"https://stereophonic.space/users/fixpoint\" class=\"u-url mention\">@<span>fixpoint</span></a></span> <span class=\"h-card\"><a href=\"https://blob.cat/users/blobyoumu\" class=\"u-url mention\">@<span>blobyoumu</span></a></span> <span class=\"h-card\"><a href=\"https://cawfee.club/users/grips\" class=\"u-url mention\">@<span>grips</span></a></span> <span class=\"h-card\"><a href=\"https://jaeger.website/users/igel\" class=\"u-url mention\">@<span>igel</span></a></span> there&apos;s a difference between not liking nukes and not liking nuclear power<br />nukes are pretty bad as are all WMDs in general but disliking nuclear power just indicates you are unable of thought</p>",
+   "contentMap" : {
+      "en" : "<p><span class=\"h-card\"><a href=\"https://stereophonic.space/users/fixpoint\" class=\"u-url mention\">@<span>fixpoint</span></a></span> <span class=\"h-card\"><a href=\"https://blob.cat/users/blobyoumu\" class=\"u-url mention\">@<span>blobyoumu</span></a></span> <span class=\"h-card\"><a href=\"https://cawfee.club/users/grips\" class=\"u-url mention\">@<span>grips</span></a></span> <span class=\"h-card\"><a href=\"https://jaeger.website/users/igel\" class=\"u-url mention\">@<span>igel</span></a></span> there&apos;s a difference between not liking nukes and not liking nuclear power<br />nukes are pretty bad as are all WMDs in general but disliking nuclear power just indicates you are unable of thought</p>"
+   },
+   "conversation" : "https://cawfee.club/contexts/ad6c73d8-efc2-4e74-84ea-2dacf1a27a5e",
+   "id" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069",
+   "inReplyTo" : "https://stereophonic.space/objects/02997b83-3ea7-4b63-94af-ef3aa2d4ed17",
+   "inReplyToAtomUri" : "https://stereophonic.space/objects/02997b83-3ea7-4b63-94af-ef3aa2d4ed17",
+   "published" : "2020-06-26T15:10:19Z",
+   "replies" : {
+      "first" : {
+         "items" : [],
+         "next" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069/replies?only_other_accounts=true&page=true",
+         "partOf" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069/replies",
+         "type" : "CollectionPage"
+      },
+      "id" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069/replies",
+      "type" : "Collection"
+   },
+   "sensitive" : false,
+   "summary" : null,
+   "tag" : [
+      {
+         "href" : "https://stereophonic.space/users/fixpoint",
+         "name" : "@fixpoint@stereophonic.space",
+         "type" : "Mention"
+      },
+      {
+         "href" : "https://blob.cat/users/blobyoumu",
+         "name" : "@blobyoumu@blob.cat",
+         "type" : "Mention"
+      },
+      {
+         "href" : "https://cawfee.club/users/grips",
+         "name" : "@grips@cawfee.club",
+         "type" : "Mention"
+      },
+      {
+         "href" : "https://jaeger.website/users/igel",
+         "name" : "@igel@jaeger.website",
+         "type" : "Mention"
+      }
+   ],
+   "to" : [
+      "https://www.w3.org/ns/activitystreams#Public"
+   ],
+   "type" : "Note",
+   "url" : "https://busshi.moe/@tuxcrafting/104410921027210069"
+}
diff --git a/test/fixtures/fetch_mocks/9wTkLEnuq47B25EehM.json b/test/fixtures/fetch_mocks/9wTkLEnuq47B25EehM.json
new file mode 100644 (file)
index 0000000..0226b05
--- /dev/null
@@ -0,0 +1,59 @@
+{
+   "@context" : [
+      "https://www.w3.org/ns/activitystreams",
+      "https://social.sakamoto.gq/schemas/litepub-0.1.jsonld",
+      {
+         "@language" : "und"
+      }
+   ],
+   "actor" : "https://social.sakamoto.gq/users/eal",
+   "attachment" : [],
+   "attributedTo" : "https://social.sakamoto.gq/users/eal",
+   "cc" : [
+      "https://social.sakamoto.gq/users/eal/followers"
+   ],
+   "content" : "<span class=\"h-card\"><a data-user=\"9uw2wH0iTYAMV7XnLU\" class=\"u-url mention\" href=\"https://busshi.moe/@tuxcrafting\" rel=\"ugc\">@<span>tuxcrafting</span></a></span> <span class=\"h-card\"><a data-user=\"9r5l8j8x23NI9KUFu4\" class=\"u-url mention\" href=\"https://stereophonic.space/users/fixpoint\" rel=\"ugc\">@<span>fixpoint</span></a></span> <span class=\"h-card\"><a data-user=\"9orDK545JwjY4Lxjge\" class=\"u-url mention\" href=\"https://blob.cat/users/blobyoumu\" rel=\"ugc\">@<span>blobyoumu</span></a></span> <span class=\"h-card\"><a data-user=\"68184\" class=\"u-url mention\" href=\"https://cawfee.club/users/grips\" rel=\"ugc\">@<span>grips</span></a></span> <span class=\"h-card\"><a data-user=\"9sAmMgHVKjTXKpgx84\" class=\"u-url mention\" href=\"https://jaeger.website/users/igel\" rel=\"ugc\">@<span>igel</span></a></span> What&#39;s bad about nukes?",
+   "context" : "https://cawfee.club/contexts/ad6c73d8-efc2-4e74-84ea-2dacf1a27a5e",
+   "conversation" : "https://cawfee.club/contexts/ad6c73d8-efc2-4e74-84ea-2dacf1a27a5e",
+   "id" : "https://social.sakamoto.gq/objects/f20f2497-66d9-4a52-a2e1-1be2a39c32c1",
+   "inReplyTo" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069",
+   "published" : "2020-06-26T15:20:15.975737Z",
+   "sensitive" : false,
+   "summary" : "",
+   "tag" : [
+      {
+         "href" : "https://blob.cat/users/blobyoumu",
+         "name" : "@blobyoumu@blob.cat",
+         "type" : "Mention"
+      },
+      {
+         "href" : "https://busshi.moe/users/tuxcrafting",
+         "name" : "@tuxcrafting@busshi.moe",
+         "type" : "Mention"
+      },
+      {
+         "href" : "https://cawfee.club/users/grips",
+         "name" : "@grips@cawfee.club",
+         "type" : "Mention"
+      },
+      {
+         "href" : "https://jaeger.website/users/igel",
+         "name" : "@igel@jaeger.website",
+         "type" : "Mention"
+      },
+      {
+         "href" : "https://stereophonic.space/users/fixpoint",
+         "name" : "@fixpoint@stereophonic.space",
+         "type" : "Mention"
+      }
+   ],
+   "to" : [
+      "https://busshi.moe/users/tuxcrafting",
+      "https://www.w3.org/ns/activitystreams#Public",
+      "https://blob.cat/users/blobyoumu",
+      "https://stereophonic.space/users/fixpoint",
+      "https://cawfee.club/users/grips",
+      "https://jaeger.website/users/igel"
+   ],
+   "type" : "Note"
+}
diff --git a/test/fixtures/fetch_mocks/eal.json b/test/fixtures/fetch_mocks/eal.json
new file mode 100644 (file)
index 0000000..a605476
--- /dev/null
@@ -0,0 +1,43 @@
+{
+   "@context" : [
+      "https://www.w3.org/ns/activitystreams",
+      "https://social.sakamoto.gq/schemas/litepub-0.1.jsonld",
+      {
+         "@language" : "und"
+      }
+   ],
+   "attachment" : [],
+   "discoverable" : true,
+   "endpoints" : {
+      "oauthAuthorizationEndpoint" : "https://social.sakamoto.gq/oauth/authorize",
+      "oauthRegistrationEndpoint" : "https://social.sakamoto.gq/api/v1/apps",
+      "oauthTokenEndpoint" : "https://social.sakamoto.gq/oauth/token",
+      "sharedInbox" : "https://social.sakamoto.gq/inbox",
+      "uploadMedia" : "https://social.sakamoto.gq/api/ap/upload_media"
+   },
+   "followers" : "https://social.sakamoto.gq/users/eal/followers",
+   "following" : "https://social.sakamoto.gq/users/eal/following",
+   "icon" : {
+      "type" : "Image",
+      "url" : "https://social.sakamoto.gq/media/f1cb6f79bf6839f3223ca240441f766056b74ddd23c69bcaf8bb1ba1ecff6eec.jpg"
+   },
+   "id" : "https://social.sakamoto.gq/users/eal",
+   "image" : {
+      "type" : "Image",
+      "url" : "https://social.sakamoto.gq/media/e5cccf26421e8366f4e34be3c9d5042b8bc8dcceccc7c8e89785fa312dd9632c.jpg"
+   },
+   "inbox" : "https://social.sakamoto.gq/users/eal/inbox",
+   "manuallyApprovesFollowers" : false,
+   "name" : "ì\97\90ì\95\8c",
+   "outbox" : "https://social.sakamoto.gq/users/eal/outbox",
+   "preferredUsername" : "eal",
+   "publicKey" : {
+      "id" : "https://social.sakamoto.gq/users/eal#main-key",
+      "owner" : "https://social.sakamoto.gq/users/eal",
+      "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz3pF85YOhhv2Zaxv9YQ7\nrCe1aEhetCMVHtrK63tUVGoGdsblyKnVeJNbFcr6k3y35OpHS3HXIi6GzgihYcTu\nONLP4eQMHTnLUNAQZi03mjJA4iIq8v/tm8ZkL2mXsQSAbWj6Iq518mHNN7OvCoNt\n3Xjepl/0kgkc2gsund7m8r+Wu0Fusx6UlUyyAk3PexdDRdSSlVLeskqtP8jtdQDo\nL70pMyL+VD+Qb9RKFdtgJ+M4OqYP+7FVzCqXN0QIPhFf/kvHSLr+c4Y3Wm0nAKHU\n9CwXWXz5Xqscpv41KlgnUCOkTXb5eBSt23lNulae5srVzWBiFb6guiCpNzBGa+Sq\nrwIDAQAB\n-----END PUBLIC KEY-----\n\n"
+   },
+   "summary" : "Pizza napoletana supremacist.<br><br>Any artworks posted here that are good are not mine.",
+   "tag" : [],
+   "type" : "Person",
+   "url" : "https://social.sakamoto.gq/users/eal"
+}
diff --git a/test/fixtures/fetch_mocks/tuxcrafting.json b/test/fixtures/fetch_mocks/tuxcrafting.json
new file mode 100644 (file)
index 0000000..5dce2a1
--- /dev/null
@@ -0,0 +1,59 @@
+{
+   "@context" : [
+      "https://www.w3.org/ns/activitystreams",
+      "https://w3id.org/security/v1",
+      {
+         "IdentityProof" : "toot:IdentityProof",
+         "PropertyValue" : "schema:PropertyValue",
+         "alsoKnownAs" : {
+            "@id" : "as:alsoKnownAs",
+            "@type" : "@id"
+         },
+         "discoverable" : "toot:discoverable",
+         "featured" : {
+            "@id" : "toot:featured",
+            "@type" : "@id"
+         },
+         "focalPoint" : {
+            "@container" : "@list",
+            "@id" : "toot:focalPoint"
+         },
+         "manuallyApprovesFollowers" : "as:manuallyApprovesFollowers",
+         "movedTo" : {
+            "@id" : "as:movedTo",
+            "@type" : "@id"
+         },
+         "schema" : "http://schema.org#",
+         "toot" : "http://joinmastodon.org/ns#",
+         "value" : "schema:value"
+      }
+   ],
+   "attachment" : [],
+   "discoverable" : true,
+   "endpoints" : {
+      "sharedInbox" : "https://busshi.moe/inbox"
+   },
+   "featured" : "https://busshi.moe/users/tuxcrafting/collections/featured",
+   "followers" : "https://busshi.moe/users/tuxcrafting/followers",
+   "following" : "https://busshi.moe/users/tuxcrafting/following",
+   "icon" : {
+      "mediaType" : "image/jpeg",
+      "type" : "Image",
+      "url" : "https://blobcdn.busshi.moe/busshifiles/accounts/avatars/000/046/872/original/054f0806ccb303d0.jpg"
+   },
+   "id" : "https://busshi.moe/users/tuxcrafting",
+   "inbox" : "https://busshi.moe/users/tuxcrafting/inbox",
+   "manuallyApprovesFollowers" : true,
+   "name" : "@tuxcrafting@localhost:8080",
+   "outbox" : "https://busshi.moe/users/tuxcrafting/outbox",
+   "preferredUsername" : "tuxcrafting",
+   "publicKey" : {
+      "id" : "https://busshi.moe/users/tuxcrafting#main-key",
+      "owner" : "https://busshi.moe/users/tuxcrafting",
+      "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwqWWTBf9OizsBiBhGS/M\nQTT6fB1VvQP6vvxouGZ5cGg1a97V67ouhjJ+nGMuWr++DNYjJYkk2TOynfykk0H/\n8rRSujSe3BNRKYGNzdnRJu/4XxgIE847Fqx5SijSP23JGYcn8TjeSUsN2u2YYVXK\n+Eb3Bu7DjGiqwNon6YB0h5qkGjkMSMVIFn0hZx6Z21bkfYWgra96Ok5OWf7Ck3je\nCuErlCMZcbQcHtFpBueJAxYchjNvm6fqwZxLX/NtaHdr7Fm2kin89mqzliapBlFH\nCXk7Jln6xV5I6ryggPAMzm3fuHzeo0RWlu8lrxLfARBVwaQQZS99bwqp6N9O2aUp\nYwIDAQAB\n-----END PUBLIC KEY-----\n"
+   },
+   "summary" : "<p>expert procrastinator</p><p>trans(humanist|gender|istorized)</p><p>web: <a href=\"https://tuxcrafting.port0.org\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">tuxcrafting.port0.org</span><span class=\"invisible\"></span></a><br />pronouns: she/they<br />languages: french (native)/english (fluent)/hebrew (ok-ish)/esperanto (barely)</p>",
+   "tag" : [],
+   "type" : "Person",
+   "url" : "https://busshi.moe/@tuxcrafting"
+}
index c06e91f1274fb912fe8a4406e4e3e6c641468370..d9098ea1b3069793fcdb1847b0496fc34fb1374b 100644 (file)
@@ -26,6 +26,46 @@ defmodule Pleroma.Object.FetcherTest do
     :ok
   end
 
+  describe "error cases" do
+    setup do
+      mock(fn
+        %{method: :get, url: "https://social.sakamoto.gq/notice/9wTkLEnuq47B25EehM"} ->
+          %Tesla.Env{
+            status: 200,
+            body: File.read!("test/fixtures/fetch_mocks/9wTkLEnuq47B25EehM.json")
+          }
+
+        %{method: :get, url: "https://social.sakamoto.gq/users/eal"} ->
+          %Tesla.Env{
+            status: 200,
+            body: File.read!("test/fixtures/fetch_mocks/eal.json")
+          }
+
+        %{method: :get, url: "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069"} ->
+          %Tesla.Env{
+            status: 200,
+            body: File.read!("test/fixtures/fetch_mocks/104410921027210069.json")
+          }
+
+        %{method: :get, url: "https://busshi.moe/users/tuxcrafting"} ->
+          %Tesla.Env{
+            status: 500
+          }
+      end)
+
+      :ok
+    end
+
+    @tag capture_log: true
+    test "it works when fetching the OP actor errors out" do
+      # Here we simulate a case where the author of the OP can't be read
+      assert {:ok, _} =
+               Fetcher.fetch_object_from_id(
+                 "https://social.sakamoto.gq/notice/9wTkLEnuq47B25EehM"
+               )
+    end
+  end
+
   describe "max thread distance restriction" do
     @ap_id "http://mastodon.example.org/@admin/99541947525187367"
     setup do: clear_config([:instance, :federation_incoming_replies_max_depth])