diff options
| -rw-r--r-- | lib/pleroma/web/activity_pub/transmogrifier.ex | 17 | ||||
| -rw-r--r-- | test/fixtures/tesla_mock/aimu@misskey.io.json | 64 | ||||
| -rw-r--r-- | test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json | 44 | ||||
| -rw-r--r-- | test/pleroma/web/activity_pub/transmogrifier_test.exs | 22 | ||||
| -rw-r--r-- | test/support/http_request_mock.ex | 18 | 
5 files changed, 165 insertions, 0 deletions
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 0e6c429f9..c466271ca 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -166,6 +166,22 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do    def fix_in_reply_to(object, _options), do: object +  def fix_quote(object, options \\ []) + +  def fix_quote(%{"quoteUrl" => quote_url} = object, options) +      when not is_nil(quote_url) do +    with {:ok, quoted_object} <- get_obj_helper(quote_url, options), +         %Activity{} <- Activity.get_create_by_object_ap_id(quoted_object.data["id"]) do +      Map.put(object, "quoteUrl", quoted_object.data["id"]) +    else +      e -> +        Logger.warn("Couldn't fetch #{inspect(quote_url)}, error: #{inspect(e)}") +        object +    end +  end + +  def fix_quote(object, _options), do: object +    defp prepare_in_reply_to(in_reply_to) do      cond do        is_bitstring(in_reply_to) -> @@ -454,6 +470,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do        |> strip_internal_fields()        |> fix_type(fetch_options)        |> fix_in_reply_to(fetch_options) +      |> fix_quote(fetch_options)      data = Map.put(data, "object", object)      options = Keyword.put(options, :local, false) diff --git a/test/fixtures/tesla_mock/aimu@misskey.io.json b/test/fixtures/tesla_mock/aimu@misskey.io.json new file mode 100644 index 000000000..9ff4cb6d0 --- /dev/null +++ b/test/fixtures/tesla_mock/aimu@misskey.io.json @@ -0,0 +1,64 @@ +{ +  "@context": [ +    "https://www.w3.org/ns/activitystreams", +    "https://w3id.org/security/v1", +    { +      "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", +      "sensitive": "as:sensitive", +      "Hashtag": "as:Hashtag", +      "quoteUrl": "as:quoteUrl", +      "toot": "http://joinmastodon.org/ns#", +      "Emoji": "toot:Emoji", +      "featured": "toot:featured", +      "discoverable": "toot:discoverable", +      "schema": "http://schema.org#", +      "PropertyValue": "schema:PropertyValue", +      "value": "schema:value", +      "misskey": "https://misskey.io/ns#", +      "_misskey_content": "misskey:_misskey_content", +      "_misskey_quote": "misskey:_misskey_quote", +      "_misskey_reaction": "misskey:_misskey_reaction", +      "_misskey_votes": "misskey:_misskey_votes", +      "_misskey_talk": "misskey:_misskey_talk", +      "isCat": "misskey:isCat", +      "vcard": "http://www.w3.org/2006/vcard/ns#" +    } +  ], +  "type": "Person", +  "id": "https://misskey.io/users/83ssedkv53", +  "inbox": "https://misskey.io/users/83ssedkv53/inbox", +  "outbox": "https://misskey.io/users/83ssedkv53/outbox", +  "followers": "https://misskey.io/users/83ssedkv53/followers", +  "following": "https://misskey.io/users/83ssedkv53/following", +  "sharedInbox": "https://misskey.io/inbox", +  "endpoints": { +    "sharedInbox": "https://misskey.io/inbox" +  }, +  "url": "https://misskey.io/@aimu", +  "preferredUsername": "aimu", +  "name": "あいむ", +  "summary": "<p><span>わずかな作曲要素 巣穴で独り言<br>Twitter </span><a href=\"https://twitter.com/aimu_53\">https://twitter.com/aimu_53</a><span><br>Soundcloud </span><a href=\"https://soundcloud.com/aimu-53\">https://soundcloud.com/aimu-53</a></p>", +  "icon": { +    "type": "Image", +    "url": "https://s3.arkjp.net/misskey/webpublic-3f7e93c0-34f5-443c-acc0-f415cb2342b4.jpg", +    "sensitive": false, +    "name": null +  }, +  "image": { +    "type": "Image", +    "url": "https://s3.arkjp.net/misskey/webpublic-2db63d1d-490b-488b-ab62-c93c285f26b6.png", +    "sensitive": false, +    "name": null +  }, +  "tag": [], +  "manuallyApprovesFollowers": false, +  "discoverable": true, +  "publicKey": { +    "id": "https://misskey.io/users/83ssedkv53#main-key", +    "type": "Key", +    "owner": "https://misskey.io/users/83ssedkv53", +    "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1ylhePJ6qGHmwHSBP17b\nIosxGaiFKvgDBgZdm8vzvKeRSqJV9uLHfZL3pO/Zt02EwaZd2GohZAtBZEF8DbMA\n3s93WAesvyGF9mjGrYYKlhp/glwyrrrbf+RdD0DLtyDwRRlrxp3pS2lLmv5Tp1Zl\npH+UKpOnNrpQqjHI5P+lEc9bnflzbRrX+UiyLNsVAP80v4wt7SZfT/telrU6mDru\n998UdfhUo7bDKeDsHG1PfLpyhhtfdoZub4kBpkyacHiwAd+CdCjR54Eu7FDwVK3p\nY3JcrT2q5stgMqN1m4QgSL4XAADIotWwDYttTJejM1n9dr+6VWv5bs0F2Q/6gxOp\nu5DQZLk4Q+64U4LWNox6jCMOq3fYe0g7QalJIHnanYQQo+XjoH6S1Aw64gQ3Ip2Y\nZBmZREAOR7GMFVDPFnVnsbCHnIAv16TdgtLgQBAihkWEUuPqITLi8PMu6kMr3uyq\nYkObEfH0TNTcqaiVpoXv791GZLEUV5ROl0FSUANLNkHZZv29xZ5JDOBOR1rNBLyH\ngVtW8rpszYqOXwzX23hh4WsVXfB7YgNvIijwjiaWbzsecleaENGEnLNMiVKVumTj\nmtyTeFJpH0+OaSrUYpemRRJizmqIjklKsNwUEwUb2WcUUg92o56T2obrBkooabZe\nwgSXSKTOcjsR/ju7+AuIyvkCAwEAAQ==\n-----END PUBLIC KEY-----\n" +  }, +  "isCat": true, +  "vcard:bday": "5353-05-03" +} diff --git a/test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json b/test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json new file mode 100644 index 000000000..323ca10ed --- /dev/null +++ b/test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json @@ -0,0 +1,44 @@ +{ +  "@context": [ +    "https://www.w3.org/ns/activitystreams", +    "https://w3id.org/security/v1", +    { +      "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", +      "sensitive": "as:sensitive", +      "Hashtag": "as:Hashtag", +      "quoteUrl": "as:quoteUrl", +      "toot": "http://joinmastodon.org/ns#", +      "Emoji": "toot:Emoji", +      "featured": "toot:featured", +      "discoverable": "toot:discoverable", +      "schema": "http://schema.org#", +      "PropertyValue": "schema:PropertyValue", +      "value": "schema:value", +      "misskey": "https://misskey.io/ns#", +      "_misskey_content": "misskey:_misskey_content", +      "_misskey_quote": "misskey:_misskey_quote", +      "_misskey_reaction": "misskey:_misskey_reaction", +      "_misskey_votes": "misskey:_misskey_votes", +      "_misskey_talk": "misskey:_misskey_talk", +      "isCat": "misskey:isCat", +      "vcard": "http://www.w3.org/2006/vcard/ns#" +    } +  ], +  "id": "https://misskey.io/notes/8vs6wxufd0", +  "type": "Note", +  "attributedTo": "https://misskey.io/users/83ssedkv53", +  "summary": null, +  "content": "<p><span>Fantiaこれできないように過去のやつは従量課金だった気がする</span></p>", +  "_misskey_content": "Fantiaこれできないように過去のやつは従量課金だった気がする", +  "published": "2022-01-21T16:37:12.663Z", +  "to": [ +    "https://www.w3.org/ns/activitystreams#Public" +  ], +  "cc": [ +    "https://misskey.io/users/83ssedkv53/followers" +  ], +  "inReplyTo": null, +  "attachment": [], +  "sensitive": false, +  "tag": [] +} diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs index 3e0c8dc65..2c8e5ba21 100644 --- a/test/pleroma/web/activity_pub/transmogrifier_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs @@ -136,6 +136,28 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do        tag = object.data["tag"] |> List.first()        assert tag["type"] == "Mention"      end + +    test "it accepts quote posts" do +      insert(:user, ap_id: "https://misskey.io/users/7rkrarq81i") + +      object = File.read!("test/fixtures/quote_post/misskey_quote_post.json") |> Jason.decode!() + +      message = %{ +        "@context" => "https://www.w3.org/ns/activitystreams", +        "type" => "Create", +        "actor" => "https://misskey.io/users/7rkrarq81i", +        "object" => object +      } + +      assert {:ok, activity} = Transmogrifier.handle_incoming(message) + +      # Object was created in the database +      object = Object.normalize(activity) +      assert object.data["quoteUrl"] == "https://misskey.io/notes/8vs6wxufd0" + +      # It fetched the quoted post +      assert Object.normalize("https://misskey.io/notes/8vs6wxufd0") +    end    end    describe "prepare outgoing" do diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index b0cf613ac..78a367024 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -1380,6 +1380,15 @@ defmodule HttpRequestMock do       }}    end +  def get("https://misskey.io/users/83ssedkv53", _, _, _) do +    {:ok, +     %Tesla.Env{ +       status: 200, +       body: File.read!("test/fixtures/tesla_mock/aimu@misskey.io.json"), +       headers: activitypub_object_headers() +     }} +  end +    def get("https://gleasonator.com/users/macgirvin", _, _, _) do      {:ok,       %Tesla.Env{ @@ -1446,6 +1455,15 @@ defmodule HttpRequestMock do       }}    end +  def get("https://misskey.io/notes/8vs6wxufd0", _, _, _) do +    {:ok, +     %Tesla.Env{ +       status: 200, +       body: File.read!("test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json"), +       headers: activitypub_object_headers() +     }} +  end +    def get(url, query, body, headers) do      {:error,       "Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{inspect(headers)}"}  | 
