aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Tashkinov <ivantashkinov@gmail.com>2020-04-11 16:01:09 +0300
committerIvan Tashkinov <ivantashkinov@gmail.com>2020-04-11 16:01:09 +0300
commit88b16fdfb7b40877aecae5d45f6f3a1c54362f13 (patch)
treebb938e9f97e051a8652cc58716202322d993fb20
parentc682563b92ce0b1a44523b67f5739707dd203de0 (diff)
downloadpleroma-88b16fdfb7b40877aecae5d45f6f3a1c54362f13.tar.gz
[#1364] Disabled notifications on activities from blocked domains.
-rw-r--r--CHANGELOG.md1
-rw-r--r--lib/pleroma/notification.ex20
-rw-r--r--test/notification_test.exs15
3 files changed, 29 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 36897503a..22d0645fa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Fixed
- Support pagination in conversations API
+- Filtering of push notifications on activities from blocked domains
## [unreleased-patch]
diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex
index 04ee510b9..02363ddb0 100644
--- a/lib/pleroma/notification.ex
+++ b/lib/pleroma/notification.ex
@@ -321,10 +321,11 @@ defmodule Pleroma.Notification do
@doc """
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
"""
+ @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{data: %{"type" => type}} = activity, local_only)
@@ -337,17 +338,22 @@ defmodule Pleroma.Notification do
|> Utils.maybe_notify_followers(activity)
|> 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_receiver_ap_ids
|> Enum.uniq()
|> 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 =
Enum.filter(potential_receivers, fn u -> u.ap_id in notification_enabled_ap_ids end)
diff --git a/test/notification_test.exs b/test/notification_test.exs
index 837a9dacd..caa941934 100644
--- a/test/notification_test.exs
+++ b/test/notification_test.exs
@@ -609,6 +609,21 @@ defmodule Pleroma.NotificationTest do
assert [other_user] == disabled_receivers
refute other_user in enabled_receivers
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
describe "notification lifecycle" do