@@ -458,7 +458,9 @@ def test_deduplicate_joins(self) -> None:
458458 self .assertEqual (initial_count , new_count )
459459
460460
461- class TestInviteFiltering (FederatingHomeserverTestCase ):
461+ class TestMSC4155InviteFiltering (FederatingHomeserverTestCase ):
462+ """Tests for MSC4155-style invite filtering."""
463+
462464 servlets = [
463465 synapse .rest .admin .register_servlets ,
464466 synapse .rest .client .login .register_servlets ,
@@ -618,3 +620,145 @@ def test_msc4155_block_invite_remote_server(self) -> None:
618620 ).value
619621 self .assertEqual (f .code , 403 )
620622 self .assertEqual (f .errcode , "ORG.MATRIX.MSC4155.M_INVITE_BLOCKED" )
623+
624+
625+ class TestMSC4380InviteFiltering (FederatingHomeserverTestCase ):
626+ """Tests for MSC4380-style invite filtering."""
627+
628+ servlets = [
629+ synapse .rest .admin .register_servlets ,
630+ synapse .rest .client .login .register_servlets ,
631+ synapse .rest .client .room .register_servlets ,
632+ ]
633+
634+ def prepare (self , reactor : MemoryReactor , clock : Clock , hs : HomeServer ) -> None :
635+ self .handler = hs .get_room_member_handler ()
636+ self .fed_handler = hs .get_federation_handler ()
637+ self .store = hs .get_datastores ().main
638+
639+ # Create two users.
640+ self .alice = self .register_user ("alice" , "pass" )
641+ self .alice_token = self .login ("alice" , "pass" )
642+ self .bob = self .register_user ("bob" , "pass" )
643+ self .bob_token = self .login ("bob" , "pass" )
644+
645+ @override_config ({"experimental_features" : {"msc4380_enabled" : True }})
646+ def test_misc4380_block_invite_local (self ) -> None :
647+ """Test that MSC4380 will block a user from being invited to a room"""
648+ room_id = self .helper .create_room_as (self .alice , tok = self .alice_token )
649+
650+ self .get_success (
651+ self .store .add_account_data_for_user (
652+ self .bob ,
653+ AccountDataTypes .MSC4380_INVITE_PERMISSION_CONFIG ,
654+ {
655+ "block_all" : True ,
656+ },
657+ )
658+ )
659+
660+ f = self .get_failure (
661+ self .handler .update_membership (
662+ requester = create_requester (self .alice ),
663+ target = UserID .from_string (self .bob ),
664+ room_id = room_id ,
665+ action = Membership .INVITE ,
666+ ),
667+ SynapseError ,
668+ ).value
669+ self .assertEqual (f .code , 403 )
670+ self .assertEqual (f .errcode , "ORG.MATRIX.MSC4155.M_INVITE_BLOCKED" )
671+
672+ @override_config ({"experimental_features" : {"msc4380_enabled" : True }})
673+ def test_misc4380_non_bool_setting (self ) -> None :
674+ """Test that `block_all` being set to something non-booly is the same as False."""
675+ room_id = self .helper .create_room_as (self .alice , tok = self .alice_token )
676+
677+ self .get_success (
678+ self .store .add_account_data_for_user (
679+ self .bob ,
680+ AccountDataTypes .MSC4380_INVITE_PERMISSION_CONFIG ,
681+ {
682+ "block_all" : "True" ,
683+ },
684+ )
685+ )
686+
687+ self .get_success (
688+ self .handler .update_membership (
689+ requester = create_requester (self .alice ),
690+ target = UserID .from_string (self .bob ),
691+ room_id = room_id ,
692+ action = Membership .INVITE ,
693+ )
694+ )
695+
696+ @override_config ({"experimental_features" : {"msc4380_enabled" : False }})
697+ def test_msc4380_disabled_allow_invite_local (self ) -> None :
698+ """Test that MSC4380 will block a user from being invited to a room"""
699+ room_id = self .helper .create_room_as (self .alice , tok = self .alice_token )
700+
701+ self .get_success (
702+ self .store .add_account_data_for_user (
703+ self .bob ,
704+ AccountDataTypes .MSC4380_INVITE_PERMISSION_CONFIG ,
705+ {
706+ "block_all" : True ,
707+ },
708+ )
709+ )
710+
711+ self .get_success (
712+ self .handler .update_membership (
713+ requester = create_requester (self .alice ),
714+ target = UserID .from_string (self .bob ),
715+ room_id = room_id ,
716+ action = Membership .INVITE ,
717+ ),
718+ )
719+
720+ @override_config ({"experimental_features" : {"msc4380_enabled" : True }})
721+ def test_msc4380_block_invite_remote (self ) -> None :
722+ """Test that MSC4380 will block a user from being invited to a room by a remote user."""
723+ # A remote user who sends the invite
724+ remote_server = "otherserver"
725+ remote_user = "@otheruser:" + remote_server
726+
727+ self .get_success (
728+ self .store .add_account_data_for_user (
729+ self .bob ,
730+ AccountDataTypes .MSC4380_INVITE_PERMISSION_CONFIG ,
731+ {"block_all" : True },
732+ )
733+ )
734+
735+ room_id = self .helper .create_room_as (
736+ room_creator = self .alice , tok = self .alice_token
737+ )
738+ room_version = self .get_success (self .store .get_room_version (room_id ))
739+
740+ invite_event = event_from_pdu_json (
741+ {
742+ "type" : EventTypes .Member ,
743+ "content" : {"membership" : "invite" },
744+ "room_id" : room_id ,
745+ "sender" : remote_user ,
746+ "state_key" : self .bob ,
747+ "depth" : 32 ,
748+ "prev_events" : [],
749+ "auth_events" : [],
750+ "origin_server_ts" : self .clock .time_msec (),
751+ },
752+ room_version ,
753+ )
754+
755+ f = self .get_failure (
756+ self .fed_handler .on_invite_request (
757+ remote_server ,
758+ invite_event ,
759+ invite_event .room_version ,
760+ ),
761+ SynapseError ,
762+ ).value
763+ self .assertEqual (f .code , 403 )
764+ self .assertEqual (f .errcode , "ORG.MATRIX.MSC4155.M_INVITE_BLOCKED" )
0 commit comments