From 6e4398e7f53c1a2e130818bdd7e159fc4e7c42cb Mon Sep 17 00:00:00 2001 From: dklimpel <5740567+dklimpel@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:04:15 +0100 Subject: [PATCH 1/4] Add the shadow-banning status to the display user admin API --- docs/admin_api/user_admin_api.rst | 9 ++++++--- synapse/storage/databases/main/__init__.py | 2 +- synapse/storage/databases/main/registration.py | 1 + tests/rest/admin/test_user.py | 2 ++ tests/storage/test_registration.py | 1 + 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/admin_api/user_admin_api.rst b/docs/admin_api/user_admin_api.rst index 1eb674939e0e..33dfbcfb49bb 100644 --- a/docs/admin_api/user_admin_api.rst +++ b/docs/admin_api/user_admin_api.rst @@ -29,8 +29,9 @@ It returns a JSON body like the following: } ], "avatar_url": "", - "admin": false, - "deactivated": false, + "admin": 0, + "deactivated": 0, + "shadow_banned": 0, "password_hash": "$2b$12$p9B4GkqYdRTPGD", "creation_ts": 1560432506, "appservice_id": null, @@ -150,6 +151,7 @@ A JSON body is returned with the following shape: "admin": 0, "user_type": null, "deactivated": 0, + "shadow_banned": 0, "displayname": "", "avatar_url": null }, { @@ -158,6 +160,7 @@ A JSON body is returned with the following shape: "admin": 1, "user_type": null, "deactivated": 0, + "shadow_banned": 0, "displayname": "", "avatar_url": "" } @@ -262,7 +265,7 @@ The following actions are performed when deactivating an user: - Reject all pending invites - Remove all account validity information related to the user -The following additional actions are performed during deactivation if``erase`` +The following additional actions are performed during deactivation if ``erase`` is set to ``true``: - Remove the user's display name diff --git a/synapse/storage/databases/main/__init__.py b/synapse/storage/databases/main/__init__.py index 5d0845588cf6..70b49854cf48 100644 --- a/synapse/storage/databases/main/__init__.py +++ b/synapse/storage/databases/main/__init__.py @@ -340,7 +340,7 @@ def get_users_paginate_txn(txn): count = txn.fetchone()[0] sql = ( - "SELECT name, user_type, is_guest, admin, deactivated, displayname, avatar_url " + "SELECT name, user_type, is_guest, admin, deactivated, shadow_banned, displayname, avatar_url " + sql_base + " ORDER BY u.name LIMIT ? OFFSET ?" ) diff --git a/synapse/storage/databases/main/registration.py b/synapse/storage/databases/main/registration.py index 8405dd460fb2..0273a04fc04a 100644 --- a/synapse/storage/databases/main/registration.py +++ b/synapse/storage/databases/main/registration.py @@ -110,6 +110,7 @@ async def get_user_by_id(self, user_id: str) -> Optional[Dict[str, Any]]: "creation_ts", "user_type", "deactivated", + "shadow_banned", ], allow_none=True, desc="get_user_by_id", diff --git a/tests/rest/admin/test_user.py b/tests/rest/admin/test_user.py index ee05ee60bc6c..30a844552fd6 100644 --- a/tests/rest/admin/test_user.py +++ b/tests/rest/admin/test_user.py @@ -742,6 +742,7 @@ def _check_fields(self, content: JsonDict): self.assertIn("admin", u) self.assertIn("user_type", u) self.assertIn("deactivated", u) + self.assertIn("shadow_banned", u) self.assertIn("displayname", u) self.assertIn("avatar_url", u) @@ -1091,6 +1092,7 @@ def test_create_user(self): self.assertEqual(False, channel.json_body["admin"]) self.assertEqual(False, channel.json_body["is_guest"]) self.assertEqual(False, channel.json_body["deactivated"]) + self.assertEqual(False, channel.json_body["shadow_banned"]) self.assertEqual("mxc://fibble/wibble", channel.json_body["avatar_url"]) @override_config( diff --git a/tests/storage/test_registration.py b/tests/storage/test_registration.py index c8c7a90e5dd7..233ea894f3a5 100644 --- a/tests/storage/test_registration.py +++ b/tests/storage/test_registration.py @@ -52,6 +52,7 @@ def test_register(self): "creation_ts": 1000, "user_type": None, "deactivated": 0, + "shadow_banned": 0, }, (yield defer.ensureDeferred(self.store.get_user_by_id(self.user_id))), ) From 6ebc4c8603ff86939e6690d612e2de37786ecb6c Mon Sep 17 00:00:00 2001 From: dklimpel <5740567+dklimpel@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:08:28 +0100 Subject: [PATCH 2/4] changelog --- changelog.d/9400.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/9400.feature diff --git a/changelog.d/9400.feature b/changelog.d/9400.feature new file mode 100644 index 000000000000..3067c3907bde --- /dev/null +++ b/changelog.d/9400.feature @@ -0,0 +1 @@ +Add the shadow-banning status to the display user admin API. \ No newline at end of file From 4bba0f98f804a1d125525a5080914908fdc1e3cb Mon Sep 17 00:00:00 2001 From: dklimpel <5740567+dklimpel@users.noreply.github.com> Date: Wed, 17 Feb 2021 20:42:52 +0100 Subject: [PATCH 3/4] Invalidate cache in set_shadow_banned --- synapse/storage/databases/main/registration.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/synapse/storage/databases/main/registration.py b/synapse/storage/databases/main/registration.py index 0273a04fc04a..c6f53645164f 100644 --- a/synapse/storage/databases/main/registration.py +++ b/synapse/storage/databases/main/registration.py @@ -370,23 +370,27 @@ async def set_shadow_banned(self, user: UserID, shadow_banned: bool) -> None: """ def set_shadow_banned_txn(txn): + user_id = user.to_string() self.db_pool.simple_update_one_txn( txn, table="users", - keyvalues={"name": user.to_string()}, + keyvalues={"name": user_id}, updatevalues={"shadow_banned": shadow_banned}, ) # In order for this to apply immediately, clear the cache for this user. tokens = self.db_pool.simple_select_onecol_txn( txn, table="access_tokens", - keyvalues={"user_id": user.to_string()}, + keyvalues={"user_id": user_id}, retcol="token", ) for token in tokens: self._invalidate_cache_and_stream( txn, self.get_user_by_access_token, (token,) ) + self._invalidate_cache_and_stream( + txn, self.get_user_by_id, (user_id,) + ) await self.db_pool.runInteraction("set_shadow_banned", set_shadow_banned_txn) From 7a5acaa57698223cadbfb21a7c60f5b856edb649 Mon Sep 17 00:00:00 2001 From: dklimpel <5740567+dklimpel@users.noreply.github.com> Date: Wed, 17 Feb 2021 20:46:34 +0100 Subject: [PATCH 4/4] code style --- synapse/storage/databases/main/registration.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/synapse/storage/databases/main/registration.py b/synapse/storage/databases/main/registration.py index c6f53645164f..ccece44bea86 100644 --- a/synapse/storage/databases/main/registration.py +++ b/synapse/storage/databases/main/registration.py @@ -388,9 +388,7 @@ def set_shadow_banned_txn(txn): self._invalidate_cache_and_stream( txn, self.get_user_by_access_token, (token,) ) - self._invalidate_cache_and_stream( - txn, self.get_user_by_id, (user_id,) - ) + self._invalidate_cache_and_stream(txn, self.get_user_by_id, (user_id,)) await self.db_pool.runInteraction("set_shadow_banned", set_shadow_banned_txn)