From b76de1ecd3def57fb716ca25d44bee398ee4d8e1 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 25 Feb 2018 10:56:01 +0100 Subject: [PATCH] Some fixes to AP fetching. --- .../web/activity_pub/transmogrifier.ex | 30 ++++++++++--------- test/web/activity_pub/transmogrifier_test.exs | 22 +++++++++++++- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 698cfa0a9..464842f69 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -20,8 +20,24 @@ def fix_object(object) do |> Map.put("actor", object["attributedTo"]) |> fix_attachments |> fix_context + |> fix_in_reply_to end + def fix_in_reply_to(%{"inReplyTo" => in_reply_to_id} = object) when not is_nil(in_reply_to_id) do + case ActivityPub.fetch_object_from_id(object["inReplyToAtomUri"] || in_reply_to_id) do + {:ok, replied_object} -> + activity = Activity.get_create_activity_by_object_ap_id(replied_object.data["id"]) + object + |> Map.put("inReplyTo", replied_object.data["id"]) + |> Map.put("inReplyToAtomUri", object["inReplyToAtomUri"] || in_reply_to_id) + |> Map.put("inReplyToStatusId", activity.id) + e -> + Logger.error("Couldn't fetch #{object["inReplyTo"]} #{inspect(e)}") + object + end + end + def fix_in_reply_to(object), do: object + def fix_context(object) do object |> Map.put("context", object["conversation"]) @@ -46,19 +62,6 @@ def handle_incoming(%{"type" => "Create", "object" => %{"type" => "Note"} = obje %User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do object = fix_object(data["object"]) - replied_to_id = if object["inReplyTo"] do - case ActivityPub.fetch_object_from_id(object["inReplyTo"]) do - {:ok, object} -> object.data["id"] - e -> - Logger.error("Couldn't fetch #{object["inReplyTo"]} #{inspect(e)}") - nil - end - else - nil - end - - object = Map.put(object, "inReplyTo", replied_to_id || object["inReplyTo"]) - params = %{ to: data["to"], object: object, @@ -139,7 +142,6 @@ def prepare_object(object) do def prepare_outgoing(%{"type" => "Create", "object" => %{"type" => "Note"} = object} = data) do object = object |> prepare_object - data = data |> Map.put("object", object) |> Map.put("@context", "https://www.w3.org/ns/activitystreams") diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 2e500d11d..43cc94e5f 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -36,7 +36,27 @@ test "it fetches replied-to activities if we don't have them" do {:ok, returned_activity} = Transmogrifier.handle_incoming(data) - assert Activity.get_create_activity_by_object_ap_id("tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment") + assert activity = Activity.get_create_activity_by_object_ap_id("tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment") + assert returned_activity.data["object"]["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873" + assert returned_activity.data["object"]["inReplyToStatusId"] == activity.id + end + + test "it works if the activity id isn't an url but an atom-uri is given" do + data = File.read!("test/fixtures/mastodon-post-activity.json") + |> Poison.decode! + + object = data["object"] + |> Map.put("inReplyToAtomUri", "https://shitposter.club/notice/2827873") + |> Map.put("inReplyTo", "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment") + + data = data + |> Map.put("object", object) + + {:ok, returned_activity} = Transmogrifier.handle_incoming(data) + + assert activity = Activity.get_create_activity_by_object_ap_id("tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment") + assert returned_activity.data["object"]["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873" + assert returned_activity.data["object"]["inReplyToStatusId"] == activity.id end test "it works for incoming notices" do