logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma
commit: 5d6d86bf00fa533d505ffe5fc3df6c3eadae5739
parent: caae83e6d54caaac1790a727b902e70adffd296f
Author: lambda <pleromagit@rogerbraun.net>
Date:   Fri, 25 May 2018 07:15:01 +0000

Merge branch 'feature/blocks-deny-refollow' into 'develop'

activitypub conformance: deny refollow for blocks

See merge request pleroma/pleroma!170

Diffstat:

Mlib/pleroma/user.ex35++++++++++++++++++++---------------
Mtest/user_test.exs9+++++++++
2 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex @@ -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 diff --git a/test/user_test.exs b/test/user_test.exs @@ -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)