Skip to content

Commit d204286

Browse files
fix: Allow account deactivation even with disabled profile changes (#84)
2 parents 9838413 + ed17248 commit d204286

3 files changed

Lines changed: 101 additions & 9 deletions

File tree

synapse/handlers/profile.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,9 @@ async def set_displayname(
192192
if not by_admin and target_user != requester.user:
193193
raise AuthError(400, "Cannot set another user's displayname")
194194

195-
if not by_admin and not self.hs.config.registration.enable_set_displayname:
195+
if (
196+
not by_admin and not self.hs.config.registration.enable_set_displayname
197+
) and not (deactivation and new_displayname == ""):
196198
profile = await self.store.get_profileinfo(target_user)
197199
if profile.display_name:
198200
raise SynapseError(
@@ -296,7 +298,9 @@ async def set_avatar_url(
296298
if not by_admin and target_user != requester.user:
297299
raise AuthError(400, "Cannot set another user's avatar_url")
298300

299-
if not by_admin and not self.hs.config.registration.enable_set_avatar_url:
301+
if (
302+
not by_admin and not self.hs.config.registration.enable_set_avatar_url
303+
) and not (deactivation and new_avatar_url == ""):
300304
profile = await self.store.get_profileinfo(target_user)
301305
if profile.avatar_url:
302306
raise SynapseError(

tests/handlers/test_profile.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
from synapse.util import Clock
3434

3535
from tests import unittest
36+
from tests.unittest import override_config
3637

3738

3839
class ProfileTestCase(unittest.HomeserverTestCase):
@@ -113,9 +114,8 @@ def test_set_my_name(self) -> None:
113114
self.get_success(self.store.get_profile_displayname(self.frank))
114115
)
115116

116-
def test_set_my_name_if_disabled(self) -> None:
117-
self.hs.config.registration.enable_set_displayname = False
118-
117+
@override_config({"enable_set_displayname": False})
118+
def test_set_displayname_if_disabled(self) -> None:
119119
# Setting displayname for the first time is allowed
120120
self.get_success(self.store.set_profile_displayname(self.frank, "Frank"))
121121

@@ -234,9 +234,8 @@ def test_set_my_avatar(self) -> None:
234234
(self.get_success(self.store.get_profile_avatar_url(self.frank))),
235235
)
236236

237-
def test_set_my_avatar_if_disabled(self) -> None:
238-
self.hs.config.registration.enable_set_avatar_url = False
239-
237+
@override_config({"enable_set_avatar_url": False})
238+
def test_set_avatar_url_if_disabled(self) -> None:
240239
# Setting displayname for the first time is allowed
241240
self.get_success(
242241
self.store.set_profile_avatar_url(self.frank, "http://my.server/me.png")

tests/rest/client/test_account.py

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
from synapse.rest.synapse.client.password_reset import PasswordResetSubmitTokenResource
4040
from synapse.server import HomeServer
4141
from synapse.storage._base import db_to_json
42-
from synapse.types import JsonDict, UserID
42+
from synapse.types import JsonDict, UserID, create_requester
4343
from synapse.util import Clock
4444

4545
from tests import unittest
@@ -500,6 +500,81 @@ def test_deactivate_account(self) -> None:
500500
channel = self.make_request("GET", "account/whoami", access_token=tok)
501501
self.assertEqual(channel.code, 401)
502502

503+
def test_deactivate_erase_account(self) -> None:
504+
mxid = self.register_user("kermit", "test")
505+
user_id = UserID.from_string(mxid)
506+
tok = self.login("kermit", "test")
507+
profile_handler = self.hs.get_profile_handler()
508+
self.get_success(
509+
profile_handler.set_displayname(
510+
user_id, create_requester(user_id), "Kermit the Frog"
511+
)
512+
)
513+
self.get_success(
514+
profile_handler.set_avatar_url(
515+
user_id, create_requester(user_id), "http://test/Kermit.jpg"
516+
)
517+
)
518+
self.erase(mxid, tok)
519+
520+
store = self.hs.get_datastores().main
521+
522+
# Check that the user has been marked as deactivated.
523+
self.assertTrue(self.get_success(store.get_user_deactivated_status(mxid)))
524+
525+
# On deactivation with 'erase', a displayname and avatar_url are set to an empty
526+
# string through the handler, but are turned into `None` for the database
527+
display_name = self.get_success(profile_handler.get_displayname(user_id))
528+
assert display_name is None, f"{display_name}"
529+
530+
avatar_url = self.get_success(profile_handler.get_avatar_url(user_id))
531+
assert avatar_url is None, f"{avatar_url}"
532+
533+
# Check that this access token has been invalidated.
534+
channel = self.make_request("GET", "account/whoami", access_token=tok)
535+
self.assertEqual(channel.code, 401)
536+
537+
@override_config({"enable_set_displayname": False, "enable_set_avatar_url": False})
538+
def test_deactivate_erase_account_with_disabled_profile_changes(self) -> None:
539+
mxid = self.register_user("kermit", "test")
540+
user_id = UserID.from_string(mxid)
541+
tok = self.login("kermit", "test")
542+
profile_handler = self.hs.get_profile_handler()
543+
# Can not use the profile handler to set a display name when it is disabled. Use
544+
# the database directly
545+
store = self.hs.get_datastores().main
546+
self.get_success(store.set_profile_displayname(user_id, "Kermit the Frog"))
547+
548+
self.assertEqual(
549+
(self.get_success(store.get_profile_displayname(user_id))),
550+
"Kermit the Frog",
551+
)
552+
self.get_success(
553+
store.set_profile_avatar_url(user_id, "http://test/Kermit.jpg")
554+
)
555+
self.assertEqual(
556+
(self.get_success(store.get_profile_avatar_url(user_id))),
557+
"http://test/Kermit.jpg",
558+
)
559+
560+
# self.get_success(profile_handler.set_displayname(user_id, create_requester(user_id), ))
561+
self.erase(mxid, tok)
562+
563+
# Check that the user has been marked as deactivated.
564+
self.assertTrue(self.get_success(store.get_user_deactivated_status(mxid)))
565+
566+
# On deactivation with 'erase', a displayname and avatar_url are set to an empty
567+
# string through the handler, but are turned into `None` for the database
568+
display_name = self.get_success(profile_handler.get_displayname(user_id))
569+
assert display_name is None, f"{display_name}"
570+
571+
avatar_url = self.get_success(profile_handler.get_avatar_url(user_id))
572+
assert avatar_url is None, f"{avatar_url}"
573+
574+
# Check that this access token has been invalidated.
575+
channel = self.make_request("GET", "account/whoami", access_token=tok)
576+
self.assertEqual(channel.code, 401)
577+
503578
def test_pending_invites(self) -> None:
504579
"""Tests that deactivating a user rejects every pending invite for them."""
505580
store = self.hs.get_datastores().main
@@ -712,6 +787,20 @@ def deactivate(self, user_id: str, tok: str) -> None:
712787
)
713788
self.assertEqual(channel.code, 200, channel.json_body)
714789

790+
def erase(self, user_id: str, tok: str) -> None:
791+
request_data = {
792+
"auth": {
793+
"type": "m.login.password",
794+
"user": user_id,
795+
"password": "test",
796+
},
797+
"erase": True,
798+
}
799+
channel = self.make_request(
800+
"POST", "account/deactivate", request_data, access_token=tok
801+
)
802+
self.assertEqual(channel.code, 200, channel.json_body)
803+
715804

716805
class WhoamiTestCase(unittest.HomeserverTestCase):
717806
servlets = [

0 commit comments

Comments
 (0)