user: do not allow refollowing somebody who has blocked a user
This commit is contained in:
parent
8d2ee70da1
commit
1d88abf2d4
|
@ -170,25 +170,30 @@ def register_changeset(struct, params \\ %{}) 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."}
|
||||
|
||||
true ->
|
||||
if !followed.local && follower.local && !ap_enabled?(followed) do
|
||||
Websub.subscribe(follower, followed)
|
||||
end
|
||||
|
||||
following =
|
||||
[ap_followers | follower.following]
|
||||
|> Enum.uniq()
|
||||
|
||||
follower =
|
||||
follower
|
||||
|> follow_changeset(%{following: following})
|
||||
|> update_and_set_cache
|
||||
|
||||
{:ok, _} = update_follower_count(followed)
|
||||
|
||||
follower =
|
||||
follower
|
||||
|> follow_changeset(%{following: following})
|
||||
|> update_and_set_cache
|
||||
|
||||
{:ok, _} = update_follower_count(followed)
|
||||
|
||||
follower
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -46,6 +46,15 @@ test "can't follow a deactivated users" 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)
|
||||
|
|
Loading…
Reference in New Issue