wip
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -304,8 +304,13 @@ class UserRestServletV2(RestServlet):
|
||||
# remove old threepids
|
||||
for medium, address in del_threepids:
|
||||
try:
|
||||
await self.auth_handler.delete_and_unbind_threepid(
|
||||
user_id, medium, address, None
|
||||
await self.hs.get_identity_handler().try_unbind_threepid(
|
||||
user_id,
|
||||
{"medium": medium, "address": address, "id_server": None},
|
||||
)
|
||||
|
||||
await self.auth_handler.delete_local_threepid(
|
||||
user_id, medium, address
|
||||
)
|
||||
except Exception:
|
||||
logger.exception("Failed to remove threepids")
|
||||
|
||||
@@ -770,8 +770,13 @@ class ThreepidDeleteRestServlet(RestServlet):
|
||||
user_id = requester.user.to_string()
|
||||
|
||||
try:
|
||||
ret = await self.auth_handler.delete_and_unbind_threepid(
|
||||
user_id, body.medium, body.address, body.id_server
|
||||
ret = await self.hs.get_identity_handler().try_unbind_threepid(
|
||||
user_id,
|
||||
{
|
||||
"medium": body.medium,
|
||||
"address": body.address,
|
||||
"id_server": body.id_server,
|
||||
},
|
||||
)
|
||||
except Exception:
|
||||
# NB. This endpoint should succeed if there is nothing to
|
||||
@@ -780,6 +785,11 @@ class ThreepidDeleteRestServlet(RestServlet):
|
||||
logger.exception("Failed to remove threepid")
|
||||
raise SynapseError(500, "Failed to remove threepid")
|
||||
|
||||
# Remove the local threepid association
|
||||
await self.auth_handler.delete_local_threepid(
|
||||
user_id, body.medium, body.address
|
||||
)
|
||||
|
||||
if ret:
|
||||
id_server_unbind_result = "success"
|
||||
else:
|
||||
|
||||
@@ -367,7 +367,7 @@ class EmailPusherTests(HomeserverTestCase):
|
||||
|
||||
# disassociate the user's email address
|
||||
self.get_success(
|
||||
self.auth_handler.delete_and_unbind_threepid(
|
||||
self.auth_handler.delete_local_threepid(
|
||||
user_id=self.user_id, medium="email", address="a@example.com"
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user