diff options
author | lambda <pleromagit@rogerbraun.net> | 2018-06-19 09:42:45 +0000 |
---|---|---|
committer | lambda <pleromagit@rogerbraun.net> | 2018-06-19 09:42:45 +0000 |
commit | be800d793605db8dcb46cedd233b672b8e79e1a4 (patch) | |
tree | fd66a81a38509813c447be6af2fc5c74a83ee158 /lib | |
parent | db0731b6ac077c341f6e6779af2c2d5a94d3d14a (diff) | |
parent | 590e8d555557c7f375c15bcbb00ea46cf2dcc4b9 (diff) | |
download | pleroma-be800d793605db8dcb46cedd233b672b8e79e1a4.tar.gz |
Merge branch 'bugfix/block-follow-relationships' into 'develop'
fix follow relationship leaks when blocked
See merge request pleroma/pleroma!230
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/user.ex | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index b27397e13..aba8742a0 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -505,15 +505,33 @@ defmodule Pleroma.User do Repo.all(q) end - def block(user, %{ap_id: ap_id}) do - blocks = user.info["blocks"] || [] + def block(blocker, %User{ap_id: ap_id} = blocked) do + # sever any follow relationships to prevent leaks per activitypub (Pleroma issue #213) + blocker = + if following?(blocker, blocked) do + {:ok, blocker, _} = unfollow(blocker, blocked) + blocker + else + blocker + end + + if following?(blocked, blocker) do + unfollow(blocked, blocker) + end + + blocks = blocker.info["blocks"] || [] new_blocks = Enum.uniq([ap_id | blocks]) - new_info = Map.put(user.info, "blocks", new_blocks) + new_info = Map.put(blocker.info, "blocks", new_blocks) - cs = User.info_changeset(user, %{info: new_info}) + cs = User.info_changeset(blocker, %{info: new_info}) update_and_set_cache(cs) end + # helper to handle the block given only an actor's AP id + def block(blocker, %{ap_id: ap_id}) do + block(blocker, User.get_by_ap_id(ap_id)) + end + def unblock(user, %{ap_id: ap_id}) do blocks = user.info["blocks"] || [] new_blocks = List.delete(blocks, ap_id) |