|
|
|
@ -588,6 +588,200 @@ class UsersListTestCase(unittest.HomeserverTestCase): |
|
|
|
|
_search_test(None, "bar", "user_id") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DeactivateAccountTestCase(unittest.HomeserverTestCase): |
|
|
|
|
|
|
|
|
|
servlets = [ |
|
|
|
|
synapse.rest.admin.register_servlets, |
|
|
|
|
login.register_servlets, |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
def prepare(self, reactor, clock, hs): |
|
|
|
|
self.store = hs.get_datastore() |
|
|
|
|
|
|
|
|
|
self.admin_user = self.register_user("admin", "pass", admin=True) |
|
|
|
|
self.admin_user_tok = self.login("admin", "pass") |
|
|
|
|
|
|
|
|
|
self.other_user = self.register_user("user", "pass", displayname="User1") |
|
|
|
|
self.other_user_token = self.login("user", "pass") |
|
|
|
|
self.url_other_user = "/_synapse/admin/v2/users/%s" % urllib.parse.quote( |
|
|
|
|
self.other_user |
|
|
|
|
) |
|
|
|
|
self.url = "/_synapse/admin/v1/deactivate/%s" % urllib.parse.quote( |
|
|
|
|
self.other_user |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
# set attributes for user |
|
|
|
|
self.get_success( |
|
|
|
|
self.store.set_profile_avatar_url("user", "mxc://servername/mediaid") |
|
|
|
|
) |
|
|
|
|
self.get_success( |
|
|
|
|
self.store.user_add_threepid("@user:test", "email", "foo@bar.com", 0, 0) |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
def test_no_auth(self): |
|
|
|
|
""" |
|
|
|
|
Try to deactivate users without authentication. |
|
|
|
|
""" |
|
|
|
|
channel = self.make_request("POST", self.url, b"{}") |
|
|
|
|
|
|
|
|
|
self.assertEqual(401, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual(Codes.MISSING_TOKEN, channel.json_body["errcode"]) |
|
|
|
|
|
|
|
|
|
def test_requester_is_not_admin(self): |
|
|
|
|
""" |
|
|
|
|
If the user is not a server admin, an error is returned. |
|
|
|
|
""" |
|
|
|
|
url = "/_synapse/admin/v1/deactivate/@bob:test" |
|
|
|
|
|
|
|
|
|
channel = self.make_request("POST", url, access_token=self.other_user_token) |
|
|
|
|
|
|
|
|
|
self.assertEqual(403, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual("You are not a server admin", channel.json_body["error"]) |
|
|
|
|
|
|
|
|
|
channel = self.make_request( |
|
|
|
|
"POST", url, access_token=self.other_user_token, content=b"{}", |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
self.assertEqual(403, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual("You are not a server admin", channel.json_body["error"]) |
|
|
|
|
|
|
|
|
|
def test_user_does_not_exist(self): |
|
|
|
|
""" |
|
|
|
|
Tests that deactivation for a user that does not exist returns a 404 |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
channel = self.make_request( |
|
|
|
|
"POST", |
|
|
|
|
"/_synapse/admin/v1/deactivate/@unknown_person:test", |
|
|
|
|
access_token=self.admin_user_tok, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
self.assertEqual(404, channel.code, msg=channel.json_body) |
|
|
|
|
self.assertEqual(Codes.NOT_FOUND, channel.json_body["errcode"]) |
|
|
|
|
|
|
|
|
|
def test_erase_is_not_bool(self): |
|
|
|
|
""" |
|
|
|
|
If parameter `erase` is not boolean, return an error |
|
|
|
|
""" |
|
|
|
|
body = json.dumps({"erase": "False"}) |
|
|
|
|
|
|
|
|
|
channel = self.make_request( |
|
|
|
|
"POST", |
|
|
|
|
self.url, |
|
|
|
|
content=body.encode(encoding="utf_8"), |
|
|
|
|
access_token=self.admin_user_tok, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
self.assertEqual(400, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual(Codes.BAD_JSON, channel.json_body["errcode"]) |
|
|
|
|
|
|
|
|
|
def test_user_is_not_local(self): |
|
|
|
|
""" |
|
|
|
|
Tests that deactivation for a user that is not a local returns a 400 |
|
|
|
|
""" |
|
|
|
|
url = "/_synapse/admin/v1/deactivate/@unknown_person:unknown_domain" |
|
|
|
|
|
|
|
|
|
channel = self.make_request("POST", url, access_token=self.admin_user_tok) |
|
|
|
|
|
|
|
|
|
self.assertEqual(400, channel.code, msg=channel.json_body) |
|
|
|
|
self.assertEqual("Can only deactivate local users", channel.json_body["error"]) |
|
|
|
|
|
|
|
|
|
def test_deactivate_user_erase_true(self): |
|
|
|
|
""" |
|
|
|
|
Test deactivating an user and set `erase` to `true` |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
# Get user |
|
|
|
|
channel = self.make_request( |
|
|
|
|
"GET", self.url_other_user, access_token=self.admin_user_tok, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
self.assertEqual(200, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual("@user:test", channel.json_body["name"]) |
|
|
|
|
self.assertEqual(False, channel.json_body["deactivated"]) |
|
|
|
|
self.assertEqual("foo@bar.com", channel.json_body["threepids"][0]["address"]) |
|
|
|
|
self.assertEqual("mxc://servername/mediaid", channel.json_body["avatar_url"]) |
|
|
|
|
self.assertEqual("User1", channel.json_body["displayname"]) |
|
|
|
|
|
|
|
|
|
# Deactivate user |
|
|
|
|
body = json.dumps({"erase": True}) |
|
|
|
|
|
|
|
|
|
channel = self.make_request( |
|
|
|
|
"POST", |
|
|
|
|
self.url, |
|
|
|
|
access_token=self.admin_user_tok, |
|
|
|
|
content=body.encode(encoding="utf_8"), |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
self.assertEqual(200, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
|
|
|
|
|
# Get user |
|
|
|
|
channel = self.make_request( |
|
|
|
|
"GET", self.url_other_user, access_token=self.admin_user_tok, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
self.assertEqual(200, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual("@user:test", channel.json_body["name"]) |
|
|
|
|
self.assertEqual(True, channel.json_body["deactivated"]) |
|
|
|
|
self.assertEqual(0, len(channel.json_body["threepids"])) |
|
|
|
|
self.assertIsNone(channel.json_body["avatar_url"]) |
|
|
|
|
self.assertIsNone(channel.json_body["displayname"]) |
|
|
|
|
|
|
|
|
|
self._is_erased("@user:test", True) |
|
|
|
|
|
|
|
|
|
def test_deactivate_user_erase_false(self): |
|
|
|
|
""" |
|
|
|
|
Test deactivating an user and set `erase` to `false` |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
# Get user |
|
|
|
|
channel = self.make_request( |
|
|
|
|
"GET", self.url_other_user, access_token=self.admin_user_tok, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
self.assertEqual(200, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual("@user:test", channel.json_body["name"]) |
|
|
|
|
self.assertEqual(False, channel.json_body["deactivated"]) |
|
|
|
|
self.assertEqual("foo@bar.com", channel.json_body["threepids"][0]["address"]) |
|
|
|
|
self.assertEqual("mxc://servername/mediaid", channel.json_body["avatar_url"]) |
|
|
|
|
self.assertEqual("User1", channel.json_body["displayname"]) |
|
|
|
|
|
|
|
|
|
# Deactivate user |
|
|
|
|
body = json.dumps({"erase": False}) |
|
|
|
|
|
|
|
|
|
channel = self.make_request( |
|
|
|
|
"POST", |
|
|
|
|
self.url, |
|
|
|
|
access_token=self.admin_user_tok, |
|
|
|
|
content=body.encode(encoding="utf_8"), |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
self.assertEqual(200, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
|
|
|
|
|
# Get user |
|
|
|
|
channel = self.make_request( |
|
|
|
|
"GET", self.url_other_user, access_token=self.admin_user_tok, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
self.assertEqual(200, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual("@user:test", channel.json_body["name"]) |
|
|
|
|
self.assertEqual(True, channel.json_body["deactivated"]) |
|
|
|
|
self.assertEqual(0, len(channel.json_body["threepids"])) |
|
|
|
|
self.assertEqual("mxc://servername/mediaid", channel.json_body["avatar_url"]) |
|
|
|
|
self.assertEqual("User1", channel.json_body["displayname"]) |
|
|
|
|
|
|
|
|
|
self._is_erased("@user:test", False) |
|
|
|
|
|
|
|
|
|
def _is_erased(self, user_id: str, expect: bool) -> None: |
|
|
|
|
"""Assert that the user is erased or not |
|
|
|
|
""" |
|
|
|
|
d = self.store.is_user_erased(user_id) |
|
|
|
|
if expect: |
|
|
|
|
self.assertTrue(self.get_success(d)) |
|
|
|
|
else: |
|
|
|
|
self.assertFalse(self.get_success(d)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UserRestTestCase(unittest.HomeserverTestCase): |
|
|
|
|
|
|
|
|
|
servlets = [ |
|
|
|
@ -987,6 +1181,26 @@ class UserRestTestCase(unittest.HomeserverTestCase): |
|
|
|
|
Test deactivating another user. |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
# set attributes for user |
|
|
|
|
self.get_success( |
|
|
|
|
self.store.set_profile_avatar_url("user", "mxc://servername/mediaid") |
|
|
|
|
) |
|
|
|
|
self.get_success( |
|
|
|
|
self.store.user_add_threepid("@user:test", "email", "foo@bar.com", 0, 0) |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
# Get user |
|
|
|
|
channel = self.make_request( |
|
|
|
|
"GET", self.url_other_user, access_token=self.admin_user_tok, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
self.assertEqual(200, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual("@user:test", channel.json_body["name"]) |
|
|
|
|
self.assertEqual(False, channel.json_body["deactivated"]) |
|
|
|
|
self.assertEqual("foo@bar.com", channel.json_body["threepids"][0]["address"]) |
|
|
|
|
self.assertEqual("mxc://servername/mediaid", channel.json_body["avatar_url"]) |
|
|
|
|
self.assertEqual("User", channel.json_body["displayname"]) |
|
|
|
|
|
|
|
|
|
# Deactivate user |
|
|
|
|
body = json.dumps({"deactivated": True}) |
|
|
|
|
|
|
|
|
@ -1000,6 +1214,9 @@ class UserRestTestCase(unittest.HomeserverTestCase): |
|
|
|
|
self.assertEqual(200, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual("@user:test", channel.json_body["name"]) |
|
|
|
|
self.assertEqual(True, channel.json_body["deactivated"]) |
|
|
|
|
self.assertEqual(0, len(channel.json_body["threepids"])) |
|
|
|
|
self.assertEqual("mxc://servername/mediaid", channel.json_body["avatar_url"]) |
|
|
|
|
self.assertEqual("User", channel.json_body["displayname"]) |
|
|
|
|
# the user is deactivated, the threepid will be deleted |
|
|
|
|
|
|
|
|
|
# Get user |
|
|
|
@ -1010,6 +1227,9 @@ class UserRestTestCase(unittest.HomeserverTestCase): |
|
|
|
|
self.assertEqual(200, int(channel.result["code"]), msg=channel.result["body"]) |
|
|
|
|
self.assertEqual("@user:test", channel.json_body["name"]) |
|
|
|
|
self.assertEqual(True, channel.json_body["deactivated"]) |
|
|
|
|
self.assertEqual(0, len(channel.json_body["threepids"])) |
|
|
|
|
self.assertEqual("mxc://servername/mediaid", channel.json_body["avatar_url"]) |
|
|
|
|
self.assertEqual("User", channel.json_body["displayname"]) |
|
|
|
|
|
|
|
|
|
@override_config({"user_directory": {"enabled": True, "search_all_users": True}}) |
|
|
|
|
def test_change_name_deactivate_user_user_directory(self): |
|
|
|
|