mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-29 08:54:09 +09:00
Remove push subscriptions on a password change, and post them again
A push subscription belongs to the user, not a session, so a device
signed out by a password change kept getting notifications. Changing
the password now removes every subscription along with the sessions,
in the same transaction.
A browser still signed in keeps its own subscription in its service
worker, so the notifications controller posts it once per session: the
bell names the session by a digest of its id, never its token, and the
browser remembers the last one it posted for. That post never
unsubscribes the browser when the server refuses it.
A request that authenticated just before the change could put a
subscription back after it. The create action now checks the session
still exists and saves in one immediate transaction, after validating
the endpoint outside it.
From #371.
(cherry picked from commit 6cab924097)
This commit is contained in:
1 parent
417f087964
commit
93718f7408
9 files changed
+201
-16
No files matched your search
@@ -80,10 +80,28 @@ class UserTest < ActiveSupport::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
test "changing the password removes every push subscription of the user" do
|
||||
assert users(:david).push_subscriptions.any?
|
||||
|
||||
users(:david).update!(password: "a new secret123456")
|
||||
|
||||
assert_empty users(:david).push_subscriptions.reload
|
||||
assert users(:jason).push_subscriptions.any?
|
||||
end
|
||||
|
||||
test "a password change that rolls back keeps push subscriptions" do
|
||||
assert_no_changes -> { users(:david).push_subscriptions.count } do
|
||||
User.transaction do
|
||||
users(:david).update!(password: "a new secret123456")
|
||||
raise ActiveRecord::Rollback
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
test "changing other details keeps every session" do
|
||||
ActionCable.server.expects(:remote_connections).never
|
||||
|
||||
assert_no_changes -> { users(:david).sessions.count } do
|
||||
assert_no_changes -> { [ users(:david).sessions.count, users(:david).push_subscriptions.count ] } do
|
||||
users(:david).update!(name: "Dave", email_address: "dave@37signals.com")
|
||||
end
|
||||
end
|
||||
|
||||
Reference in new issue
Block a user