forked from AkkomaGang/akkoma
[#1364] Disabled notifications on activities from blocked domains.
This commit is contained in:
parent
c682563b92
commit
88b16fdfb7
3 changed files with 29 additions and 7 deletions
|
@ -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]
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue