improve getting host name
[akkoma] / lib / pleroma / user.ex
index c840c8529c4bca37283a7b86b28cd4c79c812023..df22d29a83f6ea66f45491cb419a2cf94e275b6b 100644 (file)
@@ -512,15 +512,33 @@ defmodule Pleroma.User do
     Repo.all(q)
   end
 
-  def block(user, %{ap_id: ap_id}) do
-    blocks = user.info["blocks"] || []
+  def block(blocker, %User{ap_id: ap_id} = blocked) do
+    # sever any follow relationships to prevent leaks per activitypub (Pleroma issue #213)
+    blocker =
+      if following?(blocker, blocked) do
+        {:ok, blocker, _} = unfollow(blocker, blocked)
+        blocker
+      else
+        blocker
+      end
+
+    if following?(blocked, blocker) do
+      unfollow(blocked, blocker)
+    end
+
+    blocks = blocker.info["blocks"] || []
     new_blocks = Enum.uniq([ap_id | blocks])
-    new_info = Map.put(user.info, "blocks", new_blocks)
+    new_info = Map.put(blocker.info, "blocks", new_blocks)
 
-    cs = User.info_changeset(user, %{info: new_info})
+    cs = User.info_changeset(blocker, %{info: new_info})
     update_and_set_cache(cs)
   end
 
+  # helper to handle the block given only an actor's AP id
+  def block(blocker, %{ap_id: ap_id}) do
+    block(blocker, User.get_by_ap_id(ap_id))
+  end
+
   def unblock(user, %{ap_id: ap_id}) do
     blocks = user.info["blocks"] || []
     new_blocks = List.delete(blocks, ap_id)
@@ -589,7 +607,7 @@ defmodule Pleroma.User do
     |> Enum.each(fn activity ->
       case activity.data["type"] do
         "Create" ->
-          ActivityPub.delete(Object.get_by_ap_id(activity.data["object"]["id"]))
+          ActivityPub.delete(Object.normalize(activity.data["object"]))
 
         # TODO: Do something with likes, follows, repeats.
         _ ->