removeing corresponding add activity
[akkoma] / lib / pleroma / web / activity_pub / transmogrifier.ex
index 0a701334f00d08f7f57e2a8ac963e2e526414c2e..c4b11a65540ecf923a81768b3cbbaf4cefb2f17a 100644 (file)
@@ -40,7 +40,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
     |> fix_in_reply_to(options)
     |> fix_emoji()
     |> fix_tag()
-    |> set_sensitive()
     |> fix_content_map()
     |> fix_addressing()
     |> fix_summary()
@@ -557,6 +556,28 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
     end
   end
 
+  def handle_incoming(%{"type" => type} = data, _options) when type in ~w(Add Remove) do
+    with {:ok, %User{} = user} <- ObjectValidator.fetch_actor(data),
+         # maybe locally user doesn't have featured_address
+         {:ok, user} <- maybe_refetch_user(user),
+         %Object{} <- Object.normalize(data["object"], fetch: true) do
+      # Mastodon sends pin/unpin objects without id, to, cc fields
+      data =
+        data
+        |> Map.put_new("id", Utils.generate_activity_id())
+        |> Map.put_new("to", [Pleroma.Constants.as_public()])
+        |> Map.put_new("cc", [user.follower_address])
+
+      case Pipeline.common_pipeline(data,
+             local: false,
+             featured_address: user.featured_address
+           ) do
+        {:ok, activity, _meta} -> {:ok, activity}
+        error -> error
+      end
+    end
+  end
+
   def handle_incoming(
         %{"type" => "Delete"} = data,
         _options
@@ -650,6 +671,12 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
 
   def handle_incoming(_, _), do: :error
 
+  defp maybe_refetch_user(%User{featured_address: address} = user) when is_binary(address) do
+    {:ok, user}
+  end
+
+  defp maybe_refetch_user(%User{ap_id: ap_id}), do: upgrade_user_from_ap_id(ap_id)
+
   @spec get_obj_helper(String.t(), Keyword.t()) :: {:ok, Object.t()} | nil
   def get_obj_helper(id, options \\ []) do
     options = Keyword.put(options, :fetch, true)
@@ -741,7 +768,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
   # Prepares the object of an outgoing create activity.
   def prepare_object(object) do
     object
-    |> set_sensitive
     |> add_hashtags
     |> add_mention_tags
     |> add_emoji_tags
@@ -932,15 +958,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
     Map.put(object, "conversation", object["context"])
   end
 
-  def set_sensitive(%{"sensitive" => _} = object) do
-    object
-  end
-
-  def set_sensitive(object) do
-    tags = object["tag"] || []
-    Map.put(object, "sensitive", "nsfw" in tags)
-  end
-
   def set_type(%{"type" => "Answer"} = object) do
     Map.put(object, "type", "Note")
   end
@@ -1011,6 +1028,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
     with %User{local: false} = user <- User.get_cached_by_ap_id(ap_id),
          {:ok, data} <- ActivityPub.fetch_and_prepare_user_from_ap_id(ap_id),
          {:ok, user} <- update_user(user, data) do
+      {:ok, _pid} = Task.start(fn -> ActivityPub.pinned_fetch_task(user) end)
       TransmogrifierWorker.enqueue("user_upgrade", %{"user_id" => user.id})
       {:ok, user}
     else