MastoAPI: add domain blocking.
[akkoma] / lib / pleroma / user.ex
index e4fb57308749173b211519280f7ed2bb52087b10..aecf96c36d263f71f0b4c4bede43bc1373da2cdb 100644 (file)
@@ -174,7 +174,7 @@ defmodule Pleroma.User do
     should_direct_follow =
       cond do
         # if the account is locked, don't pre-create the relationship
-        user_info.locked == true ->
+        user_info["locked"] == true ->
           false
 
         # if the users are blocking each other, we shouldn't even be here, but check for it anyway
@@ -200,25 +200,30 @@ defmodule Pleroma.User do
   def follow(%User{} = follower, %User{info: info} = followed) do
     ap_followers = followed.follower_address
 
-    if following?(follower, followed) or info["deactivated"] do
-      {:error, "Could not follow user: #{followed.nickname} is already on your list."}
-    else
-      if !followed.local && follower.local && !ap_enabled?(followed) do
-        Websub.subscribe(follower, followed)
-      end
+    cond do
+      following?(follower, followed) or info["deactivated"] ->
+        {:error, "Could not follow user: #{followed.nickname} is already on your list."}
 
-      following =
-        [ap_followers | follower.following]
-        |> Enum.uniq()
+      blocks?(followed, follower) ->
+        {:error, "Could not follow user: #{followed.nickname} blocked you."}
 
-      follower =
-        follower
-        |> follow_changeset(%{following: following})
-        |> update_and_set_cache
+      true ->
+        if !followed.local && follower.local && !ap_enabled?(followed) do
+          Websub.subscribe(follower, followed)
+        end
 
-      {:ok, _} = update_follower_count(followed)
+        following =
+          [ap_followers | follower.following]
+          |> Enum.uniq()
 
-      follower
+        follower =
+          follower
+          |> follow_changeset(%{following: following})
+          |> update_and_set_cache
+
+        {:ok, _} = update_follower_count(followed)
+
+        follower
     end
   end
 
@@ -474,7 +479,31 @@ defmodule Pleroma.User do
 
   def blocks?(user, %{ap_id: ap_id}) do
     blocks = user.info["blocks"] || []
-    Enum.member?(blocks, ap_id)
+    domain_blocks = user.info["domain_blocks"] || []
+    %{host: host} = URI.parse(ap_id)
+
+    Enum.member?(blocks, ap_id) ||
+      Enum.any?(domain_blocks, fn domain ->
+        host == domain
+      end)
+  end
+
+  def block_domain(user, domain) do
+    domain_blocks = user.info["domain_blocks"] || []
+    new_blocks = Enum.uniq([domain | domain_blocks])
+    new_info = Map.put(user.info, "domain_blocks", new_blocks)
+
+    cs = User.info_changeset(user, %{info: new_info})
+    update_and_set_cache(cs)
+  end
+
+  def unblock_domain(user, domain) do
+    blocks = user.info["domain_blocks"] || []
+    new_blocks = List.delete(blocks, domain)
+    new_info = Map.put(user.info, "domain_blocks", new_blocks)
+
+    cs = User.info_changeset(user, %{info: new_info})
+    update_and_set_cache(cs)
   end
 
   def local_user_query() do