mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-08 15:50:08 +09:00
Stop sending push notifications to banned users (#338)
Banning a user deletes their sessions and closes their connections but keeps their push subscriptions, and Room::MessagePusher chose recipients by membership alone. A banned user's browser or phone therefore went on receiving the room name, sender and text of new direct messages, mentions, and messages in rooms they had set to everything. Choose subscriptions from active users only. The subscriptions are kept, so unbanning brings notifications back without the user having to subscribe again (the client doesn't resubscribe while the browser still holds a subscription). Co-authored-by: Marcello Costagliola <176920116+namespaceMarcello@users.noreply.github.com>
This commit is contained in:
@@ -63,7 +63,44 @@ class Room::PushTest < ActiveSupport::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
test "does not notify banned users" do
|
||||
users(:kevin).ban
|
||||
|
||||
assert_not_includes pushed_users { post_to_designers_mentioning_kevin }, users(:kevin)
|
||||
end
|
||||
|
||||
test "notifies users again once they're unbanned" do
|
||||
users(:kevin).ban
|
||||
users(:kevin).unban
|
||||
|
||||
assert_includes pushed_users { post_to_designers_mentioning_kevin }, users(:kevin)
|
||||
end
|
||||
|
||||
test "does not notify banned users of direct messages" do
|
||||
users(:kevin).ban
|
||||
|
||||
pushed = pushed_users do
|
||||
rooms(:david_and_kevin).messages.create! body: "Just between us", client_message_id: "earth", creator: users(:david)
|
||||
end
|
||||
assert_not_includes pushed, users(:kevin)
|
||||
end
|
||||
|
||||
test "notifies active users mentioned" do
|
||||
assert_includes pushed_users { post_to_designers_mentioning_kevin }, users(:kevin)
|
||||
end
|
||||
|
||||
private
|
||||
def post_to_designers_mentioning_kevin
|
||||
rooms(:designers).messages.create! body: "Hey #{mention_attachment_for(:kevin)}", client_message_id: "earth", creator: users(:david)
|
||||
end
|
||||
|
||||
def pushed_users(&block)
|
||||
queued = []
|
||||
Rails.configuration.x.web_push_pool.stubs(:queue).with { |_payload, subscriptions| queued.concat subscriptions.to_a }
|
||||
perform_enqueued_jobs(only: Room::PushMessageJob, &block)
|
||||
queued.map(&:user).uniq
|
||||
end
|
||||
|
||||
def wait_for_web_push_delivery_pool_tasks(count)
|
||||
wait_for_pool_tasks(Rails.configuration.x.web_push_pool.delivery_pool, count)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user