diff --git a/synapse/handlers/auth.py b/synapse/handlers/auth.py
index 8da017c3ba..ddbfbb2c18 100644
--- a/synapse/handlers/auth.py
+++ b/synapse/handlers/auth.py
@@ -1595,9 +1595,9 @@ class AuthHandler:
# has successfully been created.
await self._third_party_rules.on_threepid_bind(user_id, medium, address)
- async def delete_and_unbind_threepid(
- self, user_id: str, medium: str, address: str, id_server: Optional[str] = None
- ) -> bool:
+ async def delete_local_threepid(
+ self, user_id: str, medium: str, address: str
+ ) -> None:
"""Attempts to unbind the 3pid on the identity servers and deletes it
from the local database.
@@ -1605,25 +1605,11 @@ class AuthHandler:
user_id: ID of user to remove the 3pid from.
medium: The medium of the 3pid being removed: "email" or "msisdn".
address: The 3pid address to remove.
- id_server: Use the given identity server when unbinding
- any threepids. If None then will attempt to unbind using the
- identity server specified when binding (if known).
-
- Returns:
- Returns True if successfully unbound the 3pid on
- the identity server, False if identity server doesn't support the
- unbind API.
"""
-
# 'Canonicalise' email addresses as per above
if medium == "email":
address = canonicalise_email(address)
- identity_handler = self.hs.get_identity_handler()
- result = await identity_handler.try_unbind_threepid(
- user_id, {"medium": medium, "address": address, "id_server": id_server}
- )
-
# Inform Synapse modules that a 3PID association is about to be deleted.
await self._third_party_rules.on_remove_user_third_party_identifier(
user_id, medium, address
@@ -1643,7 +1629,6 @@ class AuthHandler:
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:
"""Computes a secure hash of password.
diff --git a/synapse/handlers/deactivate_account.py b/synapse/handlers/deactivate_account.py
index a10b89ec30..bb8eb1a8dc 100644
--- a/synapse/handlers/deactivate_account.py
+++ b/synapse/handlers/deactivate_account.py
@@ -100,13 +100,17 @@ class DeactivateAccountHandler:
# unbinding
identity_server_supports_unbinding = True
- # Remove any threepids associated with this account locally and attempt to
- # unbind them from identity server(s).
- threepids = await self.store.user_get_threepids(user_id)
- for threepid in threepids:
+ # Delete any known bindings of this user's 3PIDs on identity servers.
+ bound_threepids = await self.store.user_get_bound_threepids(user_id)
+ for threepid in bound_threepids:
try:
- result = await self._auth_handler.delete_and_unbind_threepid(
- user_id, threepid["medium"], threepid["address"], id_server
+ result = await self.hs.get_identity_handler().try_unbind_threepid(
+ user_id,
+ {
+ "medium": threepid["medium"],
+ "address": threepid["address"],
+ "id_server": id_server,
+ },
)
except Exception:
# Do we want this to be a fatal error or should we carry on?
@@ -115,6 +119,13 @@ class DeactivateAccountHandler:
identity_server_supports_unbinding &= result
+ # Delete all threepids associated with this account.
+ local_threepids = await self.store.user_get_threepids(user_id)
+ for threepid in local_threepids:
+ await self._auth_handler.delete_local_threepid(
+ user_id, threepid["medium"], threepid["address"]
+ )
+
# delete any devices belonging to the user, which will also
# delete corresponding access tokens.
await self._device_handler.delete_all_devices_for_user(user_id)
|