|
17 | 17 | # [This file includes modifications made by New Vector Limited] |
18 | 18 | # |
19 | 19 | # |
20 | | -from typing import Optional |
| 20 | +from typing import Collection, List, Optional |
21 | 21 | from unittest.mock import AsyncMock, Mock, patch |
22 | 22 |
|
23 | 23 | from twisted.test.proto_helpers import MemoryReactor |
24 | 24 |
|
25 | 25 | from synapse.api.constants import EventTypes, JoinRules |
26 | 26 | from synapse.api.errors import Codes, ResourceLimitError |
27 | 27 | from synapse.api.filtering import Filtering |
28 | | -from synapse.api.room_versions import RoomVersions |
| 28 | +from synapse.api.room_versions import RoomVersion, RoomVersions |
| 29 | +from synapse.events import EventBase |
| 30 | +from synapse.events.snapshot import EventContext |
| 31 | +from synapse.federation.federation_base import event_from_pdu_json |
29 | 32 | from synapse.handlers.sync import SyncConfig, SyncResult |
30 | 33 | from synapse.rest import admin |
31 | 34 | from synapse.rest.client import knock, login, room |
@@ -285,6 +288,114 @@ def test_ban_wins_race_with_join(self) -> None: |
285 | 288 | ) |
286 | 289 | self.assertEqual(eve_initial_sync_after_join.joined, []) |
287 | 290 |
|
| 291 | + def test_call_invite_in_public_room_not_returned(self) -> None: |
| 292 | + user = self.register_user("alice", "password") |
| 293 | + tok = self.login(user, "password") |
| 294 | + room_id = self.helper.create_room_as(user, is_public=True, tok=tok) |
| 295 | + self.handler = self.hs.get_federation_handler() |
| 296 | + federation_event_handler = self.hs.get_federation_event_handler() |
| 297 | + |
| 298 | + async def _check_event_auth( |
| 299 | + origin: Optional[str], event: EventBase, context: EventContext |
| 300 | + ) -> None: |
| 301 | + pass |
| 302 | + |
| 303 | + federation_event_handler._check_event_auth = _check_event_auth # type: ignore[method-assign] |
| 304 | + self.client = self.hs.get_federation_client() |
| 305 | + |
| 306 | + async def _check_sigs_and_hash_for_pulled_events_and_fetch( |
| 307 | + dest: str, pdus: Collection[EventBase], room_version: RoomVersion |
| 308 | + ) -> List[EventBase]: |
| 309 | + return list(pdus) |
| 310 | + |
| 311 | + self.client._check_sigs_and_hash_for_pulled_events_and_fetch = _check_sigs_and_hash_for_pulled_events_and_fetch # type: ignore[assignment] |
| 312 | + |
| 313 | + prev_events = self.get_success(self.store.get_prev_events_for_room(room_id)) |
| 314 | + |
| 315 | + # create a call invite event |
| 316 | + call_event = event_from_pdu_json( |
| 317 | + { |
| 318 | + "type": EventTypes.CallInvite, |
| 319 | + "content": {}, |
| 320 | + "room_id": room_id, |
| 321 | + "sender": user, |
| 322 | + "depth": 32, |
| 323 | + "prev_events": prev_events, |
| 324 | + "auth_events": prev_events, |
| 325 | + "origin_server_ts": self.clock.time_msec(), |
| 326 | + }, |
| 327 | + RoomVersions.V10, |
| 328 | + ) |
| 329 | + |
| 330 | + self.assertEqual( |
| 331 | + self.get_success( |
| 332 | + federation_event_handler.on_receive_pdu("test.serv", call_event) |
| 333 | + ), |
| 334 | + None, |
| 335 | + ) |
| 336 | + |
| 337 | + # check that it is in DB |
| 338 | + recent_event = self.get_success(self.store.get_prev_events_for_room(room_id)) |
| 339 | + self.assertIn(call_event.event_id, recent_event) |
| 340 | + |
| 341 | + # but that it does not come down /sync in public room |
| 342 | + sync_result: SyncResult = self.get_success( |
| 343 | + self.sync_handler.wait_for_sync_for_user( |
| 344 | + create_requester(user), generate_sync_config(user) |
| 345 | + ) |
| 346 | + ) |
| 347 | + event_ids = [] |
| 348 | + for event in sync_result.joined[0].timeline.events: |
| 349 | + event_ids.append(event.event_id) |
| 350 | + self.assertNotIn(call_event.event_id, event_ids) |
| 351 | + |
| 352 | + # it will come down in a private room, though |
| 353 | + user2 = self.register_user("bob", "password") |
| 354 | + tok2 = self.login(user2, "password") |
| 355 | + private_room_id = self.helper.create_room_as( |
| 356 | + user2, is_public=False, tok=tok2, extra_content={"preset": "private_chat"} |
| 357 | + ) |
| 358 | + |
| 359 | + priv_prev_events = self.get_success( |
| 360 | + self.store.get_prev_events_for_room(private_room_id) |
| 361 | + ) |
| 362 | + private_call_event = event_from_pdu_json( |
| 363 | + { |
| 364 | + "type": EventTypes.CallInvite, |
| 365 | + "content": {}, |
| 366 | + "room_id": private_room_id, |
| 367 | + "sender": user, |
| 368 | + "depth": 32, |
| 369 | + "prev_events": priv_prev_events, |
| 370 | + "auth_events": priv_prev_events, |
| 371 | + "origin_server_ts": self.clock.time_msec(), |
| 372 | + }, |
| 373 | + RoomVersions.V10, |
| 374 | + ) |
| 375 | + |
| 376 | + self.assertEqual( |
| 377 | + self.get_success( |
| 378 | + federation_event_handler.on_receive_pdu("test.serv", private_call_event) |
| 379 | + ), |
| 380 | + None, |
| 381 | + ) |
| 382 | + |
| 383 | + recent_events = self.get_success( |
| 384 | + self.store.get_prev_events_for_room(private_room_id) |
| 385 | + ) |
| 386 | + self.assertIn(private_call_event.event_id, recent_events) |
| 387 | + |
| 388 | + private_sync_result: SyncResult = self.get_success( |
| 389 | + self.sync_handler.wait_for_sync_for_user( |
| 390 | + create_requester(user2), generate_sync_config(user2) |
| 391 | + ) |
| 392 | + ) |
| 393 | + priv_event_ids = [] |
| 394 | + for event in private_sync_result.joined[0].timeline.events: |
| 395 | + priv_event_ids.append(event.event_id) |
| 396 | + |
| 397 | + self.assertIn(private_call_event.event_id, priv_event_ids) |
| 398 | + |
288 | 399 |
|
289 | 400 | _request_key = 0 |
290 | 401 |
|
|
0 commit comments