X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fuser.ex;h=94f16c3c0bb1df206b559d33dfbf7a35ffdfdc1e;hb=4a922305afb9b445d11522be73428f10a7d1fc19;hp=1fcec479f1cae9fb8a623d5b2ae95698371fa37d;hpb=2e294ee44a1baa7c0d3ac6b2905a70ed4e05cffb;p=akkoma diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 1fcec479f..94f16c3c0 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -168,10 +168,10 @@ defmodule Pleroma.User do end end - @user_config Application.get_env(:pleroma, :user) - @deny_follow_blocked Keyword.get(@user_config, :deny_follow_blocked) - def maybe_direct_follow(%User{} = follower, %User{info: info} = followed) do + user_config = Application.get_env(:pleroma, :user) + deny_follow_blocked = Keyword.get(user_config, :deny_follow_blocked) + user_info = user_info(followed) should_direct_follow = @@ -181,7 +181,7 @@ defmodule Pleroma.User do false # if the users are blocking each other, we shouldn't even be here, but check for it anyway - @deny_follow_blocked and + deny_follow_blocked and (User.blocks?(follower, followed) or User.blocks?(followed, follower)) -> false @@ -209,17 +209,17 @@ defmodule Pleroma.User do end end - @user_config Application.get_env(:pleroma, :user) - @deny_follow_blocked Keyword.get(@user_config, :deny_follow_blocked) - def follow(%User{} = follower, %User{info: info} = followed) do + user_config = Application.get_env(:pleroma, :user) + deny_follow_blocked = Keyword.get(user_config, :deny_follow_blocked) + ap_followers = followed.follower_address cond do following?(follower, followed) or info["deactivated"] -> {:error, "Could not follow user: #{followed.nickname} is already on your list."} - @deny_follow_blocked and blocks?(followed, follower) -> + deny_follow_blocked and blocks?(followed, follower) -> {:error, "Could not follow user: #{followed.nickname} blocked you."} true -> @@ -512,15 +512,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)