user: do not allow refollowing somebody who has blocked a user
authorWilliam Pitcock <nenolod@dereferenced.org>
Fri, 25 May 2018 03:16:02 +0000 (03:16 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Fri, 25 May 2018 03:18:35 +0000 (03:18 +0000)
lib/pleroma/user.ex
test/user_test.exs

index 690cc7cf36db0c7c234c350a6353f3c96b27b3de..508f1458490cfca5f6ccf3700e6f171d41a156a7 100644 (file)
@@ -170,25 +170,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
+
+        following =
+          [ap_followers | follower.following]
+          |> Enum.uniq()
 
-      {:ok, _} = update_follower_count(followed)
+        follower =
+          follower
+          |> follow_changeset(%{following: following})
+          |> update_and_set_cache
 
-      follower
+        {:ok, _} = update_follower_count(followed)
+
+        follower
     end
   end
 
index 9506b58fabd203d49ddcce7e015c529307e0100c..8c8cfd673fe31237e3fddda45e21344e95c606d9 100644 (file)
@@ -46,6 +46,15 @@ defmodule Pleroma.UserTest do
     {:error, _} = User.follow(user, followed)
   end
 
+  test "can't follow a user who blocked us" do
+    blocker = insert(:user)
+    blockee = insert(:user)
+
+    {:ok, blocker} = User.block(blocker, blockee)
+
+    {:error, _} = User.follow(blockee, blocker)
+  end
+
   # This is a somewhat useless test.
   # test "following a remote user will ensure a websub subscription is present" do
   #   user = insert(:user)