-
Notifications
You must be signed in to change notification settings - Fork 522
Implement MSC4380: Invite blocking #19203
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| Add experimentatal implememntation of MSC4380 (invite blocking). | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -458,7 +458,9 @@ def test_deduplicate_joins(self) -> None: | |
| self.assertEqual(initial_count, new_count) | ||
|
|
||
|
|
||
| class TestInviteFiltering(FederatingHomeserverTestCase): | ||
| class TestMSC4155InviteFiltering(FederatingHomeserverTestCase): | ||
| """Tests for MSC4155-style invite filtering.""" | ||
|
|
||
| servlets = [ | ||
| synapse.rest.admin.register_servlets, | ||
| synapse.rest.client.login.register_servlets, | ||
|
|
@@ -618,3 +620,145 @@ def test_msc4155_block_invite_remote_server(self) -> None: | |
| ).value | ||
| self.assertEqual(f.code, 403) | ||
| self.assertEqual(f.errcode, "ORG.MATRIX.MSC4155.M_INVITE_BLOCKED") | ||
|
|
||
|
|
||
| class TestMSC4380InviteFiltering(FederatingHomeserverTestCase): | ||
|
richvdh marked this conversation as resolved.
Outdated
|
||
| """Tests for MSC4380-style invite filtering.""" | ||
|
|
||
| servlets = [ | ||
| synapse.rest.admin.register_servlets, | ||
| synapse.rest.client.login.register_servlets, | ||
| synapse.rest.client.room.register_servlets, | ||
| ] | ||
|
|
||
| def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None: | ||
| self.handler = hs.get_room_member_handler() | ||
| self.fed_handler = hs.get_federation_handler() | ||
| self.store = hs.get_datastores().main | ||
|
|
||
| # Create two users. | ||
| self.alice = self.register_user("alice", "pass") | ||
| self.alice_token = self.login("alice", "pass") | ||
| self.bob = self.register_user("bob", "pass") | ||
| self.bob_token = self.login("bob", "pass") | ||
|
|
||
| @override_config({"experimental_features": {"msc4380_enabled": True}}) | ||
| def test_misc4380_block_invite_local(self) -> None: | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Feels like we should just verify this behavior with some Complement tests instead
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't disagree that Complement tests would be nice to have (in addition), but having these tests mean we get a tighter development cycle and it's easier to test different combinations (eg what happens when msc4380 is disabled).
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🤷 We ran into this with the Sliding Sync tests. We naturally fell into writing Synapse tests but they would have much more benefit as Complement tests so other homeserver implementations can verify behavior.
Out-of-repo Complement tests can also be written for this kind of thing. For example, while we don't have this setup for the Synapse project, we do for the Secure Border Gateway, TI-Messenger Proxy, and Synapse Pro for small hosts. Something for the future here ⏩ |
||
| """Test that MSC4380 will block a user from being invited to a room""" | ||
| room_id = self.helper.create_room_as(self.alice, tok=self.alice_token) | ||
|
|
||
| self.get_success( | ||
| self.store.add_account_data_for_user( | ||
| self.bob, | ||
| AccountDataTypes.MSC4380_INVITE_PERMISSION_CONFIG, | ||
| { | ||
| "block_all": True, | ||
| }, | ||
| ) | ||
| ) | ||
|
|
||
| f = self.get_failure( | ||
| self.handler.update_membership( | ||
| requester=create_requester(self.alice), | ||
| target=UserID.from_string(self.bob), | ||
| room_id=room_id, | ||
| action=Membership.INVITE, | ||
| ), | ||
| SynapseError, | ||
| ).value | ||
| self.assertEqual(f.code, 403) | ||
| self.assertEqual(f.errcode, "ORG.MATRIX.MSC4155.M_INVITE_BLOCKED") | ||
|
|
||
| @override_config({"experimental_features": {"msc4380_enabled": True}}) | ||
| def test_misc4380_non_bool_setting(self) -> None: | ||
| """Test that `block_all` being set to something non-booly is the same as False.""" | ||
| room_id = self.helper.create_room_as(self.alice, tok=self.alice_token) | ||
|
|
||
| self.get_success( | ||
| self.store.add_account_data_for_user( | ||
| self.bob, | ||
| AccountDataTypes.MSC4380_INVITE_PERMISSION_CONFIG, | ||
| { | ||
| "block_all": "True", | ||
| }, | ||
| ) | ||
| ) | ||
|
|
||
| self.get_success( | ||
| self.handler.update_membership( | ||
| requester=create_requester(self.alice), | ||
| target=UserID.from_string(self.bob), | ||
| room_id=room_id, | ||
| action=Membership.INVITE, | ||
| ) | ||
| ) | ||
|
|
||
| @override_config({"experimental_features": {"msc4380_enabled": False}}) | ||
| def test_msc4380_disabled_allow_invite_local(self) -> None: | ||
| """Test that MSC4380 will block a user from being invited to a room""" | ||
| room_id = self.helper.create_room_as(self.alice, tok=self.alice_token) | ||
|
|
||
| self.get_success( | ||
| self.store.add_account_data_for_user( | ||
| self.bob, | ||
| AccountDataTypes.MSC4380_INVITE_PERMISSION_CONFIG, | ||
| { | ||
| "block_all": True, | ||
| }, | ||
| ) | ||
| ) | ||
|
|
||
| self.get_success( | ||
| self.handler.update_membership( | ||
| requester=create_requester(self.alice), | ||
| target=UserID.from_string(self.bob), | ||
| room_id=room_id, | ||
| action=Membership.INVITE, | ||
| ), | ||
| ) | ||
|
|
||
| @override_config({"experimental_features": {"msc4380_enabled": True}}) | ||
| def test_msc4380_block_invite_remote(self) -> None: | ||
| """Test that MSC4380 will block a user from being invited to a room by a remote user.""" | ||
| # A remote user who sends the invite | ||
| remote_server = "otherserver" | ||
| remote_user = "@otheruser:" + remote_server | ||
|
|
||
| self.get_success( | ||
| self.store.add_account_data_for_user( | ||
| self.bob, | ||
| AccountDataTypes.MSC4380_INVITE_PERMISSION_CONFIG, | ||
| {"block_all": True}, | ||
| ) | ||
| ) | ||
|
|
||
| room_id = self.helper.create_room_as( | ||
| room_creator=self.alice, tok=self.alice_token | ||
| ) | ||
| room_version = self.get_success(self.store.get_room_version(room_id)) | ||
|
|
||
| invite_event = event_from_pdu_json( | ||
| { | ||
| "type": EventTypes.Member, | ||
| "content": {"membership": "invite"}, | ||
| "room_id": room_id, | ||
| "sender": remote_user, | ||
| "state_key": self.bob, | ||
| "depth": 32, | ||
| "prev_events": [], | ||
| "auth_events": [], | ||
| "origin_server_ts": self.clock.time_msec(), | ||
| }, | ||
| room_version, | ||
| ) | ||
|
|
||
| f = self.get_failure( | ||
| self.fed_handler.on_invite_request( | ||
| remote_server, | ||
| invite_event, | ||
| invite_event.room_version, | ||
| ), | ||
| SynapseError, | ||
| ).value | ||
| self.assertEqual(f.code, 403) | ||
| self.assertEqual(f.errcode, "ORG.MATRIX.MSC4155.M_INVITE_BLOCKED") | ||
Uh oh!
There was an error while loading. Please reload this page.