aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadposter <hannah+pleroma@coffee-and-dreams.uk>2019-04-08 12:46:12 +0100
committerSadposter <hannah+pleroma@coffee-and-dreams.uk>2019-04-08 12:46:12 +0100
commit13ff312c48c338c93ee9aa85ec2e48c2059d5168 (patch)
treea662979656b3c36b8dec5459bc9299fba2c54c16
parent76fdfd1c7f10332783ef167b7b996edd4813b1c3 (diff)
downloadpleroma-13ff312c48c338c93ee9aa85ec2e48c2059d5168.tar.gz
Sever subscription in case of block
-rw-r--r--lib/pleroma/user.ex31
-rw-r--r--test/user_test.exs25
2 files changed, 49 insertions, 7 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index f1565ade7..9a80601c1 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -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
diff --git a/test/user_test.exs b/test/user_test.exs
index 38712cebb..2368f95f5 100644
--- a/test/user_test.exs
+++ b/test/user_test.exs
@@ -146,6 +146,15 @@ defmodule Pleroma.UserTest do
{:error, _} = User.follow(blockee, blocker)
end
+ test "can't subscribe to a user who blocked us" do
+ blocker = insert(:user)
+ blocked = insert(:user)
+
+ {:ok, blocker} = User.block(blocker, blocked)
+
+ {:error, _} = User.subscribe(blocked, blocker)
+ end
+
test "local users do not automatically follow local locked accounts" do
follower = insert(:user, info: %{locked: true})
followed = insert(:user, info: %{locked: true})
@@ -729,6 +738,22 @@ defmodule Pleroma.UserTest do
refute User.following?(blocker, blocked)
refute User.following?(blocked, blocker)
end
+
+ test "blocks tear down blocked->blocker subscription relationships" do
+ blocker = insert(:user)
+ blocked = insert(:user)
+
+ {:ok, blocker} = User.subscribe(blocked, blocker)
+
+ assert User.subscribed_to?(blocked, blocker)
+ refute User.subscribed_to?(blocker, blocked)
+
+ {:ok, blocker} = User.block(blocker, blocked)
+
+ assert User.blocks?(blocker, blocked)
+ refute User.subscribed_to?(blocker, blocked)
+ refute User.subscribed_to?(blocked, blocker)
+ end
end
describe "domain blocking" do