[#1364] Disabled notifications on activities from blocked domains.

This commit is contained in:
Ivan Tashkinov 2020-04-11 16:01:09 +03:00
parent c682563b92
commit 88b16fdfb7
3 changed files with 29 additions and 7 deletions

View file

@ -20,6 +20,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Fixed ### Fixed
- Support pagination in conversations API - Support pagination in conversations API
- Filtering of push notifications on activities from blocked domains
## [unreleased-patch] ## [unreleased-patch]

View file

@ -321,10 +321,11 @@ def create_notification(%Activity{} = activity, %User{} = user, do_send \\ true)
@doc """ @doc """
Returns a tuple with 2 elements: Returns a tuple with 2 elements:
{enabled notification receivers, currently disabled receivers (blocking / [thread] muting)} {notification-enabled receivers, currently disabled receivers (blocking / [thread] muting)}
NOTE: might be called for FAKE Activities, see ActivityPub.Utils.get_notified_from_object/1 NOTE: might be called for FAKE Activities, see ActivityPub.Utils.get_notified_from_object/1
""" """
@spec get_notified_from_activity(Activity.t(), boolean()) :: {list(User.t()), list(User.t())}
def get_notified_from_activity(activity, local_only \\ true) def get_notified_from_activity(activity, local_only \\ true)
def get_notified_from_activity(%Activity{data: %{"type" => type}} = activity, local_only) def get_notified_from_activity(%Activity{data: %{"type" => type}} = activity, local_only)
@ -337,17 +338,22 @@ def get_notified_from_activity(%Activity{data: %{"type" => type}} = activity, lo
|> Utils.maybe_notify_followers(activity) |> Utils.maybe_notify_followers(activity)
|> Enum.uniq() |> Enum.uniq()
# Since even subscribers and followers can mute / thread-mute, filtering all above AP IDs
notification_enabled_ap_ids =
potential_receiver_ap_ids
|> exclude_relationship_restricted_ap_ids(activity)
|> exclude_thread_muter_ap_ids(activity)
potential_receivers = potential_receivers =
potential_receiver_ap_ids potential_receiver_ap_ids
|> Enum.uniq() |> Enum.uniq()
|> User.get_users_from_set(local_only) |> User.get_users_from_set(local_only)
activity_actor_domain = activity.actor && URI.parse(activity.actor).host
notification_enabled_ap_ids =
for u <- potential_receivers, activity_actor_domain not in u.domain_blocks, do: u.ap_id
# Since even subscribers and followers can mute / thread-mute, filtering all above AP IDs
notification_enabled_ap_ids =
notification_enabled_ap_ids
|> exclude_relationship_restricted_ap_ids(activity)
|> exclude_thread_muter_ap_ids(activity)
notification_enabled_users = notification_enabled_users =
Enum.filter(potential_receivers, fn u -> u.ap_id in notification_enabled_ap_ids end) Enum.filter(potential_receivers, fn u -> u.ap_id in notification_enabled_ap_ids end)

View file

@ -609,6 +609,21 @@ test "it returns thread-muting recipient in disabled recipients list" do
assert [other_user] == disabled_receivers assert [other_user] == disabled_receivers
refute other_user in enabled_receivers refute other_user in enabled_receivers
end end
test "it returns domain-blocking recipient in disabled recipients list" do
blocked_domain = "blocked.domain"
user = insert(:user, %{ap_id: "https://#{blocked_domain}/@actor"})
other_user = insert(:user)
{:ok, other_user} = User.block_domain(other_user, blocked_domain)
{:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}!"})
{enabled_receivers, disabled_receivers} = Notification.get_notified_from_activity(activity)
assert [] == enabled_receivers
assert [other_user] == disabled_receivers
end
end end
describe "notification lifecycle" do describe "notification lifecycle" do