@@ -150,6 +150,92 @@ def test_create_event_with_prev_events(self):
150150 event_auth .check_state_independent_auth_rules (event_store , bad_event )
151151 )
152152
153+ def test_duplicate_auth_events (self ):
154+ """Events with duplicate auth_events should be rejected
155+
156+ https://spec.matrix.org/v1.3/rooms/v9/#authorization-rules
157+ 2. Reject if event has auth_events that:
158+ 1. have duplicate entries for a given type and state_key pair
159+ """
160+ creator = "@creator:example.com"
161+
162+ create_event = _create_event (RoomVersions .V9 , creator )
163+ join_event1 = _join_event (RoomVersions .V9 , creator )
164+ pl_event = _power_levels_event (
165+ RoomVersions .V9 ,
166+ creator ,
167+ {"state_default" : 30 , "users" : {"creator" : 100 }},
168+ )
169+
170+ # create a second join event, so that we can make a duplicate
171+ join_event2 = _join_event (RoomVersions .V9 , creator )
172+
173+ event_store = _StubEventSourceStore ()
174+ event_store .add_events ([create_event , join_event1 , join_event2 , pl_event ])
175+
176+ good_event = _random_state_event (
177+ RoomVersions .V9 , creator , [create_event , join_event2 , pl_event ]
178+ )
179+ bad_event = _random_state_event (
180+ RoomVersions .V9 , creator , [create_event , join_event1 , join_event2 , pl_event ]
181+ )
182+ # a variation: two instances of the *same* event
183+ bad_event2 = _random_state_event (
184+ RoomVersions .V9 , creator , [create_event , join_event2 , join_event2 , pl_event ]
185+ )
186+
187+ get_awaitable_result (
188+ event_auth .check_state_independent_auth_rules (event_store , good_event )
189+ )
190+ with self .assertRaises (AuthError ):
191+ get_awaitable_result (
192+ event_auth .check_state_independent_auth_rules (event_store , bad_event )
193+ )
194+ with self .assertRaises (AuthError ):
195+ get_awaitable_result (
196+ event_auth .check_state_independent_auth_rules (event_store , bad_event2 )
197+ )
198+
199+ def test_unexpected_auth_events (self ):
200+ """Events with excess auth_events should be rejected
201+
202+ https://spec.matrix.org/v1.3/rooms/v9/#authorization-rules
203+ 2. Reject if event has auth_events that:
204+ 2. have entries whose type and state_key don’t match those specified by the
205+ auth events selection algorithm described in the server specification.
206+ """
207+ creator = "@creator:example.com"
208+
209+ create_event = _create_event (RoomVersions .V9 , creator )
210+ join_event = _join_event (RoomVersions .V9 , creator )
211+ pl_event = _power_levels_event (
212+ RoomVersions .V9 ,
213+ creator ,
214+ {"state_default" : 30 , "users" : {"creator" : 100 }},
215+ )
216+ join_rules_event = _join_rules_event (RoomVersions .V9 , creator , "public" )
217+
218+ event_store = _StubEventSourceStore ()
219+ event_store .add_events ([create_event , join_event , pl_event , join_rules_event ])
220+
221+ good_event = _random_state_event (
222+ RoomVersions .V9 , creator , [create_event , join_event , pl_event ]
223+ )
224+ # join rules should *not* be included in the auth events.
225+ bad_event = _random_state_event (
226+ RoomVersions .V9 ,
227+ creator ,
228+ [create_event , join_event , pl_event , join_rules_event ],
229+ )
230+
231+ get_awaitable_result (
232+ event_auth .check_state_independent_auth_rules (event_store , good_event )
233+ )
234+ with self .assertRaises (AuthError ):
235+ get_awaitable_result (
236+ event_auth .check_state_independent_auth_rules (event_store , bad_event )
237+ )
238+
153239 def test_random_users_cannot_send_state_before_first_pl (self ):
154240 """
155241 Check that, before the first PL lands, the creator is the only user
0 commit comments