From 9e745882208619192e2fc79dd67650458a7e3ac4 Mon Sep 17 00:00:00 2001 From: Johannes Marbach Date: Fri, 28 Feb 2025 12:19:05 +0100 Subject: [PATCH 1/3] Add capability for MSC4267 Signed-off-by: Johannes Marbach --- synapse/config/experimental.py | 3 ++ synapse/config/room.py | 2 +- synapse/rest/client/capabilities.py | 5 ++++ tests/rest/client/test_capabilities.py | 40 ++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/synapse/config/experimental.py b/synapse/config/experimental.py index 0a963b121a4..8a8d1b8dfa5 100644 --- a/synapse/config/experimental.py +++ b/synapse/config/experimental.py @@ -560,3 +560,6 @@ def read_config( # MSC4076: Add `disable_badge_count`` to pusher configuration self.msc4076_enabled: bool = experimental.get("msc4076_enabled", False) + + # MSC4267: Automatically forgetting rooms on leave + self.msc4267_enabled: bool = experimental.get("msc4267_enabled", False) diff --git a/synapse/config/room.py b/synapse/config/room.py index ec8cf5be367..e28f81ee38b 100644 --- a/synapse/config/room.py +++ b/synapse/config/room.py @@ -85,4 +85,4 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None: # When enabled, users will forget rooms when they leave them, either via a # leave, kick or ban. - self.forget_on_leave = config.get("forget_rooms_on_leave", False) + self.forget_on_leave: bool = config.get("forget_rooms_on_leave", False) diff --git a/synapse/rest/client/capabilities.py b/synapse/rest/client/capabilities.py index ebd5a33ea5f..0b1ca9ea9a9 100644 --- a/synapse/rest/client/capabilities.py +++ b/synapse/rest/client/capabilities.py @@ -109,6 +109,11 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]: "disallowed" ] = disallowed + if self.config.experimental.msc4267_enabled: + response["capabilities"]["org.matrix.msc4267.leave_without_forget"] = { + "enabled": not self.config.room.forget_on_leave, + } + return HTTPStatus.OK, response diff --git a/tests/rest/client/test_capabilities.py b/tests/rest/client/test_capabilities.py index 8af00221c23..0e8ad2a2d53 100644 --- a/tests/rest/client/test_capabilities.py +++ b/tests/rest/client/test_capabilities.py @@ -264,3 +264,43 @@ def test_get_get_token_login_fields_when_enabled(self) -> None: self.assertEqual(channel.code, HTTPStatus.OK) self.assertTrue(capabilities["m.get_login_token"]["enabled"]) + + @override_config( + { + "experimental_features": {"msc4267_enabled": True}, + "forget_rooms_on_leave": True, + } + ) + def test_get_leave_without_forget_with_auto_forget(self) -> None: + # Server auto-forgets on /leave, expect disabled client capability + access_token = self.get_success( + self.auth_handler.create_access_token_for_user_id( + self.user, device_id=None, valid_until_ms=None + ) + ) + channel = self.make_request("GET", self.url, access_token=access_token) + capabilities = channel.json_body["capabilities"] + self.assertEqual(channel.code, HTTPStatus.OK) + self.assertFalse( + capabilities["org.matrix.msc4267.leave_without_forget"]["enabled"] + ) + + @override_config( + { + "experimental_features": {"msc4267_enabled": True}, + "forget_rooms_on_leave": False, + } + ) + def test_get_leave_without_forget_without_auto_forget(self) -> None: + # Server doesn't auto-forget on /leave, expect disabled client capability + access_token = self.get_success( + self.auth_handler.create_access_token_for_user_id( + self.user, device_id=None, valid_until_ms=None + ) + ) + channel = self.make_request("GET", self.url, access_token=access_token) + capabilities = channel.json_body["capabilities"] + self.assertEqual(channel.code, HTTPStatus.OK) + self.assertTrue( + capabilities["org.matrix.msc4267.leave_without_forget"]["enabled"] + ) From 894cbad48847b0d6189e4de34dadfc7001b76f0d Mon Sep 17 00:00:00 2001 From: Johannes Marbach Date: Fri, 28 Feb 2025 12:21:52 +0100 Subject: [PATCH 2/3] Add changelog --- changelog.d/18196.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/18196.feature diff --git a/changelog.d/18196.feature b/changelog.d/18196.feature new file mode 100644 index 00000000000..8f666ab83d2 --- /dev/null +++ b/changelog.d/18196.feature @@ -0,0 +1 @@ +Add `leave_without_forget` capability as per [MSC4267](https://github.com/matrix-org/matrix-spec-proposals/pull/4267). From fe47578dd713d32dab6f6f0230abf112252195e6 Mon Sep 17 00:00:00 2001 From: Johannes Marbach Date: Fri, 28 Feb 2025 13:30:13 +0100 Subject: [PATCH 3/3] Rename capability --- changelog.d/18196.feature | 2 +- synapse/rest/client/capabilities.py | 4 ++-- tests/rest/client/test_capabilities.py | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/changelog.d/18196.feature b/changelog.d/18196.feature index 8f666ab83d2..6f4a67b5190 100644 --- a/changelog.d/18196.feature +++ b/changelog.d/18196.feature @@ -1 +1 @@ -Add `leave_without_forget` capability as per [MSC4267](https://github.com/matrix-org/matrix-spec-proposals/pull/4267). +Add `forget_forced_upon_leave` capability as per [MSC4267](https://github.com/matrix-org/matrix-spec-proposals/pull/4267). diff --git a/synapse/rest/client/capabilities.py b/synapse/rest/client/capabilities.py index 0b1ca9ea9a9..8f3193fb470 100644 --- a/synapse/rest/client/capabilities.py +++ b/synapse/rest/client/capabilities.py @@ -110,8 +110,8 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]: ] = disallowed if self.config.experimental.msc4267_enabled: - response["capabilities"]["org.matrix.msc4267.leave_without_forget"] = { - "enabled": not self.config.room.forget_on_leave, + response["capabilities"]["org.matrix.msc4267.forget_forced_upon_leave"] = { + "enabled": self.config.room.forget_on_leave, } return HTTPStatus.OK, response diff --git a/tests/rest/client/test_capabilities.py b/tests/rest/client/test_capabilities.py index 0e8ad2a2d53..13831462e89 100644 --- a/tests/rest/client/test_capabilities.py +++ b/tests/rest/client/test_capabilities.py @@ -271,8 +271,8 @@ def test_get_get_token_login_fields_when_enabled(self) -> None: "forget_rooms_on_leave": True, } ) - def test_get_leave_without_forget_with_auto_forget(self) -> None: - # Server auto-forgets on /leave, expect disabled client capability + def test_get_forget_forced_upon_leave_with_auto_forget(self) -> None: + # Server auto-forgets on /leave, expect enabled client capability access_token = self.get_success( self.auth_handler.create_access_token_for_user_id( self.user, device_id=None, valid_until_ms=None @@ -281,8 +281,8 @@ def test_get_leave_without_forget_with_auto_forget(self) -> None: channel = self.make_request("GET", self.url, access_token=access_token) capabilities = channel.json_body["capabilities"] self.assertEqual(channel.code, HTTPStatus.OK) - self.assertFalse( - capabilities["org.matrix.msc4267.leave_without_forget"]["enabled"] + self.assertTrue( + capabilities["org.matrix.msc4267.forget_forced_upon_leave"]["enabled"] ) @override_config( @@ -291,7 +291,7 @@ def test_get_leave_without_forget_with_auto_forget(self) -> None: "forget_rooms_on_leave": False, } ) - def test_get_leave_without_forget_without_auto_forget(self) -> None: + def test_get_forget_forced_upon_leave_without_auto_forget(self) -> None: # Server doesn't auto-forget on /leave, expect disabled client capability access_token = self.get_success( self.auth_handler.create_access_token_for_user_id( @@ -301,6 +301,6 @@ def test_get_leave_without_forget_without_auto_forget(self) -> None: channel = self.make_request("GET", self.url, access_token=access_token) capabilities = channel.json_body["capabilities"] self.assertEqual(channel.code, HTTPStatus.OK) - self.assertTrue( - capabilities["org.matrix.msc4267.leave_without_forget"]["enabled"] + self.assertFalse( + capabilities["org.matrix.msc4267.forget_forced_upon_leave"]["enabled"] )