Skip to content

Commit d82e1ed

Browse files
erikjohnstonsandhose
authored andcommitted
Handle null invite and knock room state
1 parent 4daa533 commit d82e1ed

File tree

5 files changed

+33
-9
lines changed

5 files changed

+33
-9
lines changed

synapse/federation/transport/server/federation.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,9 @@ async def on_PUT(
509509
event = content["event"]
510510
invite_room_state = content.get("invite_room_state", [])
511511

512+
if not isinstance(invite_room_state, list):
513+
invite_room_state = []
514+
512515
# Synapse expects invite_room_state to be in unsigned, as it is in v1
513516
# API
514517

synapse/handlers/federation.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,9 @@ async def do_knock(
880880
if stripped_room_state is None:
881881
raise KeyError("Missing 'knock_room_state' field in send_knock response")
882882

883+
if not isinstance(stripped_room_state, list):
884+
raise TypeError("'knock_room_state' has wrong type")
885+
883886
event.unsigned["knock_room_state"] = stripped_room_state
884887

885888
context = EventContext.for_outlier(self._storage_controllers)

synapse/handlers/sliding_sync/__init__.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -815,13 +815,19 @@ async def get_room_sync_data(
815815

816816
stripped_state = []
817817
if invite_or_knock_event.membership == Membership.INVITE:
818-
stripped_state.extend(
819-
invite_or_knock_event.unsigned.get("invite_room_state", [])
818+
invite_state = invite_or_knock_event.unsigned.get(
819+
"invite_room_state", []
820820
)
821+
if not isinstance(invite_state, list):
822+
invite_state = []
823+
824+
stripped_state.extend(invite_state)
821825
elif invite_or_knock_event.membership == Membership.KNOCK:
822-
stripped_state.extend(
823-
invite_or_knock_event.unsigned.get("knock_room_state", [])
824-
)
826+
knock_state = invite_or_knock_event.unsigned.get("knock_room_state", [])
827+
if not isinstance(knock_state, list):
828+
knock_state = []
829+
830+
stripped_state.extend(knock_state)
825831

826832
stripped_state.append(strip_event(invite_or_knock_event))
827833

synapse/push/push_tools.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,13 @@ async def get_context_for_event(
7474

7575
room_state = []
7676
if ev.content.get("membership") == Membership.INVITE:
77-
room_state = ev.unsigned.get("invite_room_state", [])
77+
invite_room_state = ev.unsigned.get("invite_room_state", [])
78+
if isinstance(invite_room_state, list):
79+
room_state = invite_room_state
7880
elif ev.content.get("membership") == Membership.KNOCK:
79-
room_state = ev.unsigned.get("knock_room_state", [])
81+
knock_room_state = ev.unsigned.get("knock_room_state", [])
82+
if isinstance(knock_room_state, list):
83+
room_state = knock_room_state
8084

8185
# Ideally we'd reuse the logic in `calculate_room_name`, but that gets
8286
# complicated to handle partial events vs pulling events from the DB.

synapse/rest/client/sync.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,12 @@ async def encode_invited(
436436
)
437437
unsigned = dict(invite.get("unsigned", {}))
438438
invite["unsigned"] = unsigned
439-
invited_state = list(unsigned.pop("invite_room_state", []))
439+
440+
invited_state = unsigned.pop("invite_room_state", [])
441+
if not isinstance(invited_state, list):
442+
invited_state = []
443+
444+
invited_state = list(invited_state)
440445
invited_state.append(invite)
441446
invited[room.room_id] = {"invite_state": {"events": invited_state}}
442447

@@ -476,7 +481,10 @@ async def encode_knocked(
476481
# Extract the stripped room state from the unsigned dict
477482
# This is for clients to get a little bit of information about
478483
# the room they've knocked on, without revealing any sensitive information
479-
knocked_state = list(unsigned.pop("knock_room_state", []))
484+
knocked_state = unsigned.pop("knock_room_state", [])
485+
if not isinstance(knocked_state, list):
486+
knocked_state = []
487+
knocked_state = list(knocked_state)
480488

481489
# Append the actual knock membership event itself as well. This provides
482490
# the client with:

0 commit comments

Comments
 (0)