Sever subscription in case of block
[akkoma] / lib / pleroma / user.ex
index f1565ade7b94fe9550620c505fa296c3ec449eee..9a80601c1a5fbdab37257ae3cf7635912662c3ca 100644 (file)
@@ -924,14 +924,23 @@ defmodule Pleroma.User do
   end
 
   def subscribe(subscriber, %{ap_id: ap_id}) do
-    with %User{} = user <- get_or_fetch_by_ap_id(ap_id) do
-      info_cng =
-        user.info
-        |> User.Info.add_to_subscribers(subscriber.ap_id)
+    user_config = Application.get_env(:pleroma, :user)
+    deny_follow_blocked = Keyword.get(user_config, :deny_follow_blocked)
 
-      change(user)
-      |> put_embed(:info, info_cng)
-      |> update_and_set_cache()
+    with %User{} = subscribed <- get_or_fetch_by_ap_id(ap_id) do
+      blocked = blocks?(subscribed, subscriber) and deny_follow_blocked
+
+      if blocked do
+        {:error, "Could not subscribe: #{subscribed.nickname} is blocking you"}
+      else
+        info_cng =
+          subscribed.info
+          |> User.Info.add_to_subscribers(subscriber.ap_id)
+
+        change(subscribed)
+        |> put_embed(:info, info_cng)
+        |> update_and_set_cache()
+      end
     end
   end
 
@@ -957,6 +966,14 @@ defmodule Pleroma.User do
         blocker
       end
 
+    blocker =
+      if subscribed_to?(blocked, blocker) do
+        {:ok, blocker} = unsubscribe(blocked, blocker)
+        blocker
+      else
+        blocker
+      end
+
     if following?(blocked, blocker) do
       unfollow(blocked, blocker)
     end