mirror of
https://mau.dev/maunium/synapse.git
synced 2024-12-15 01:33:52 +01:00
Ensure pushers are deleted for deactivated accounts (#9285)
This commit is contained in:
parent
1efdcc3e87
commit
1e62d9ee8c
4 changed files with 70 additions and 0 deletions
1
changelog.d/9285.bugfix
Normal file
1
changelog.d/9285.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix a bug where users' pushers were not all deleted when they deactivated their account.
|
|
@ -120,6 +120,11 @@ class DeactivateAccountHandler(BaseHandler):
|
||||||
|
|
||||||
await self.store.user_set_password_hash(user_id, None)
|
await self.store.user_set_password_hash(user_id, None)
|
||||||
|
|
||||||
|
# Most of the pushers will have been deleted when we logged out the
|
||||||
|
# associated devices above, but we still need to delete pushers not
|
||||||
|
# associated with devices, e.g. email pushers.
|
||||||
|
await self.store.delete_all_pushers_for_user(user_id)
|
||||||
|
|
||||||
# Add the user to a table of users pending deactivation (ie.
|
# Add the user to a table of users pending deactivation (ie.
|
||||||
# removal from all the rooms they're a member of)
|
# removal from all the rooms they're a member of)
|
||||||
await self.store.add_user_pending_deactivation(user_id)
|
await self.store.add_user_pending_deactivation(user_id)
|
||||||
|
|
|
@ -373,3 +373,46 @@ class PusherStore(PusherWorkerStore):
|
||||||
await self.db_pool.runInteraction(
|
await self.db_pool.runInteraction(
|
||||||
"delete_pusher", delete_pusher_txn, stream_id
|
"delete_pusher", delete_pusher_txn, stream_id
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async def delete_all_pushers_for_user(self, user_id: str) -> None:
|
||||||
|
"""Delete all pushers associated with an account."""
|
||||||
|
|
||||||
|
# We want to generate a row in `deleted_pushers` for each pusher we're
|
||||||
|
# deleting, so we fetch the list now so we can generate the appropriate
|
||||||
|
# number of stream IDs.
|
||||||
|
#
|
||||||
|
# Note: technically there could be a race here between adding/deleting
|
||||||
|
# pushers, but a) the worst case if we don't stop a pusher until the
|
||||||
|
# next restart and b) this is only called when we're deactivating an
|
||||||
|
# account.
|
||||||
|
pushers = list(await self.get_pushers_by_user_id(user_id))
|
||||||
|
|
||||||
|
def delete_pushers_txn(txn, stream_ids):
|
||||||
|
self._invalidate_cache_and_stream( # type: ignore
|
||||||
|
txn, self.get_if_user_has_pusher, (user_id,)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.db_pool.simple_delete_txn(
|
||||||
|
txn,
|
||||||
|
table="pushers",
|
||||||
|
keyvalues={"user_name": user_id},
|
||||||
|
)
|
||||||
|
|
||||||
|
self.db_pool.simple_insert_many_txn(
|
||||||
|
txn,
|
||||||
|
table="deleted_pushers",
|
||||||
|
values=[
|
||||||
|
{
|
||||||
|
"stream_id": stream_id,
|
||||||
|
"app_id": pusher.app_id,
|
||||||
|
"pushkey": pusher.pushkey,
|
||||||
|
"user_id": user_id,
|
||||||
|
}
|
||||||
|
for stream_id, pusher in zip(stream_ids, pushers)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
async with self._pushers_id_gen.get_next_mult(len(pushers)) as stream_ids:
|
||||||
|
await self.db_pool.runInteraction(
|
||||||
|
"delete_all_pushers_for_user", delete_pushers_txn, stream_ids
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* Copyright 2021 The Matrix.org Foundation C.I.C
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
-- We may not have deleted all pushers for deactivated accounts. Do so now.
|
||||||
|
--
|
||||||
|
-- Note: We don't bother updating the `deleted_pushers` table as it's just use
|
||||||
|
-- to stop pushers on workers, and that will happen when they get next restarted.
|
||||||
|
DELETE FROM pushers WHERE user_name IN (SELECT name FROM users WHERE deactivated = 1);
|
Loading…
Reference in a new issue