activitypub: more robustly handle object-to-actor associations
authorWilliam Pitcock <nenolod@dereferenced.org>
Thu, 12 Jul 2018 16:37:42 +0000 (16:37 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Thu, 12 Jul 2018 16:39:03 +0000 (16:39 +0000)
lib/pleroma/web/activity_pub/transmogrifier.ex

index 59c4b90e7d89096aef27d3daaf4c5a0dd953df75..3dd3df5534e4b883e9c1e9caa64ebcfa28a920c3 100644 (file)
@@ -18,7 +18,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
   """
   def fix_object(object) do
     object
-    |> Map.put("actor", object["attributedTo"])
+    |> fix_actor
     |> fix_attachments
     |> fix_context
     |> fix_in_reply_to
@@ -27,6 +27,19 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
     |> fix_content_map
   end
 
+  def fix_actor(%{"attributedTo" => actor} = object) do
+    # attributedTo can be a list in the case of peertube or plume
+    actor =
+      if is_list(actor) do
+        Enum.at(actor, 0)
+      else
+        actor
+      end
+
+    object
+    |> Map.put("actor", actor)
+  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(in_reply_to_id) do
@@ -126,7 +139,10 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
       when objtype in ["Article", "Note"] do
     with nil <- Activity.get_create_activity_by_object_ap_id(object["id"]),
          %User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do
-      object = fix_object(data["object"])
+      # prefer the activity's actor instead of attributedTo
+      object =
+        fix_object(data["object"])
+        |> Map.put("actor", data["actor"])
 
       params = %{
         to: data["to"],