Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Remove pushers when deleting 3pid from account #10581

Merged
merged 16 commits into from
Aug 26, 2021
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/10581.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Remove pushers when deleting 3pid from account.
Azrenbeth marked this conversation as resolved.
Show resolved Hide resolved
Azrenbeth marked this conversation as resolved.
Show resolved Hide resolved
5 changes: 4 additions & 1 deletion synapse/handlers/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -1459,6 +1459,10 @@ async def delete_threepid(
)

await self.store.user_delete_threepid(user_id, medium, address)
if medium == "email":
await self.store.delete_pusher_by_app_id_pushkey_user_id(
app_id="m.email", pushkey=address, user_id=user_id
)
return result

async def hash(self, password: str) -> str:
Expand Down Expand Up @@ -1727,7 +1731,6 @@ def add_query_param_to_url(url: str, param_name: str, param: Any):

@attr.s(slots=True)
class MacaroonGenerator:

hs = attr.ib()

def generate_guest_access_token(self, user_id: str) -> str:
Expand Down
56 changes: 56 additions & 0 deletions synapse/storage/databases/main/pusher.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ def __init__(self, database: DatabasePool, db_conn: Connection, hs: "HomeServer"
self._remove_stale_pushers,
)

self.db_pool.updates.register_background_update_handler(
"remove_delete_email_pushers",
Azrenbeth marked this conversation as resolved.
Show resolved Hide resolved
self._remove_deleted_email_pushers,
)

def _decode_pushers_rows(self, rows: Iterable[dict]) -> Iterator[PusherConfig]:
"""JSON-decode the data in the rows returned from the `pushers` table

Expand Down Expand Up @@ -388,6 +393,57 @@ def _delete_pushers(txn) -> int:

return number_deleted

async def _remove_deleted_email_pushers(
self, progress: dict, batch_size: int
) -> int:
"""A background update that deletes all pushers for email addresses no longer
associated with a user.
Azrenbeth marked this conversation as resolved.
Show resolved Hide resolved
"""

last_pusher = progress.get("last_pusher", 0)

def _delete_pushers(txn) -> int:

sql = """
SELECT p.id, p.user_name, p.add_id, p.pushkey
FROM pushers AS p
JOIN user_threepids AS t ON t.user_id=p.user_name
WHERE p.app_id = 'm.email'
AND t.medium = 'email'
AND t.address = p.pushkey
AND p.id > ?
ORDER BY p.id ASC
LIMIT ?
Azrenbeth marked this conversation as resolved.
Show resolved Hide resolved
"""

txn.execute(sql, (last_pusher, batch_size))
ids = [row[0] for row in txn]

for row in txn:
self.db_pool.simple_delete_txn(
txn,
"pushers",
{"user_name": row[1], "app_id": row[2], "pushkey": row[3]},
)

if ids:
self.db_pool.updates._background_update_progress_txn(
txn, "remove_deactivated_pushers", {"last_user": ids[-1]}
)

return len(ids)

number_deleted = await self.db_pool.runInteraction(
"_remove_deleted_email_pushers", _delete_pushers
)

if number_deleted < batch_size:
await self.db_pool.updates._end_background_update(
"remove_deleted_email_pushers"
)

return number_deleted


class PusherStore(PusherWorkerStore):
def get_pushers_stream_token(self) -> int:
Expand Down