mirror of
https://github.com/element-hq/synapse.git
synced 2025-03-15 12:17:48 +00:00
Handle null invite and knock room state
This commit is contained in:
parent
4daa533e82
commit
d82e1ed357
5 changed files with 33 additions and 9 deletions
|
@ -509,6 +509,9 @@ class FederationV2InviteServlet(BaseFederationServerServlet):
|
||||||
event = content["event"]
|
event = content["event"]
|
||||||
invite_room_state = content.get("invite_room_state", [])
|
invite_room_state = content.get("invite_room_state", [])
|
||||||
|
|
||||||
|
if not isinstance(invite_room_state, list):
|
||||||
|
invite_room_state = []
|
||||||
|
|
||||||
# Synapse expects invite_room_state to be in unsigned, as it is in v1
|
# Synapse expects invite_room_state to be in unsigned, as it is in v1
|
||||||
# API
|
# API
|
||||||
|
|
||||||
|
|
|
@ -880,6 +880,9 @@ class FederationHandler:
|
||||||
if stripped_room_state is None:
|
if stripped_room_state is None:
|
||||||
raise KeyError("Missing 'knock_room_state' field in send_knock response")
|
raise KeyError("Missing 'knock_room_state' field in send_knock response")
|
||||||
|
|
||||||
|
if not isinstance(stripped_room_state, list):
|
||||||
|
raise TypeError("'knock_room_state' has wrong type")
|
||||||
|
|
||||||
event.unsigned["knock_room_state"] = stripped_room_state
|
event.unsigned["knock_room_state"] = stripped_room_state
|
||||||
|
|
||||||
context = EventContext.for_outlier(self._storage_controllers)
|
context = EventContext.for_outlier(self._storage_controllers)
|
||||||
|
|
|
@ -815,13 +815,19 @@ class SlidingSyncHandler:
|
||||||
|
|
||||||
stripped_state = []
|
stripped_state = []
|
||||||
if invite_or_knock_event.membership == Membership.INVITE:
|
if invite_or_knock_event.membership == Membership.INVITE:
|
||||||
stripped_state.extend(
|
invite_state = invite_or_knock_event.unsigned.get(
|
||||||
invite_or_knock_event.unsigned.get("invite_room_state", [])
|
"invite_room_state", []
|
||||||
)
|
)
|
||||||
|
if not isinstance(invite_state, list):
|
||||||
|
invite_state = []
|
||||||
|
|
||||||
|
stripped_state.extend(invite_state)
|
||||||
elif invite_or_knock_event.membership == Membership.KNOCK:
|
elif invite_or_knock_event.membership == Membership.KNOCK:
|
||||||
stripped_state.extend(
|
knock_state = invite_or_knock_event.unsigned.get("knock_room_state", [])
|
||||||
invite_or_knock_event.unsigned.get("knock_room_state", [])
|
if not isinstance(knock_state, list):
|
||||||
)
|
knock_state = []
|
||||||
|
|
||||||
|
stripped_state.extend(knock_state)
|
||||||
|
|
||||||
stripped_state.append(strip_event(invite_or_knock_event))
|
stripped_state.append(strip_event(invite_or_knock_event))
|
||||||
|
|
||||||
|
|
|
@ -74,9 +74,13 @@ async def get_context_for_event(
|
||||||
|
|
||||||
room_state = []
|
room_state = []
|
||||||
if ev.content.get("membership") == Membership.INVITE:
|
if ev.content.get("membership") == Membership.INVITE:
|
||||||
room_state = ev.unsigned.get("invite_room_state", [])
|
invite_room_state = ev.unsigned.get("invite_room_state", [])
|
||||||
|
if isinstance(invite_room_state, list):
|
||||||
|
room_state = invite_room_state
|
||||||
elif ev.content.get("membership") == Membership.KNOCK:
|
elif ev.content.get("membership") == Membership.KNOCK:
|
||||||
room_state = ev.unsigned.get("knock_room_state", [])
|
knock_room_state = ev.unsigned.get("knock_room_state", [])
|
||||||
|
if isinstance(knock_room_state, list):
|
||||||
|
room_state = knock_room_state
|
||||||
|
|
||||||
# Ideally we'd reuse the logic in `calculate_room_name`, but that gets
|
# Ideally we'd reuse the logic in `calculate_room_name`, but that gets
|
||||||
# complicated to handle partial events vs pulling events from the DB.
|
# complicated to handle partial events vs pulling events from the DB.
|
||||||
|
|
|
@ -436,7 +436,12 @@ class SyncRestServlet(RestServlet):
|
||||||
)
|
)
|
||||||
unsigned = dict(invite.get("unsigned", {}))
|
unsigned = dict(invite.get("unsigned", {}))
|
||||||
invite["unsigned"] = unsigned
|
invite["unsigned"] = unsigned
|
||||||
invited_state = list(unsigned.pop("invite_room_state", []))
|
|
||||||
|
invited_state = unsigned.pop("invite_room_state", [])
|
||||||
|
if not isinstance(invited_state, list):
|
||||||
|
invited_state = []
|
||||||
|
|
||||||
|
invited_state = list(invited_state)
|
||||||
invited_state.append(invite)
|
invited_state.append(invite)
|
||||||
invited[room.room_id] = {"invite_state": {"events": invited_state}}
|
invited[room.room_id] = {"invite_state": {"events": invited_state}}
|
||||||
|
|
||||||
|
@ -476,7 +481,10 @@ class SyncRestServlet(RestServlet):
|
||||||
# Extract the stripped room state from the unsigned dict
|
# Extract the stripped room state from the unsigned dict
|
||||||
# This is for clients to get a little bit of information about
|
# This is for clients to get a little bit of information about
|
||||||
# the room they've knocked on, without revealing any sensitive information
|
# the room they've knocked on, without revealing any sensitive information
|
||||||
knocked_state = list(unsigned.pop("knock_room_state", []))
|
knocked_state = unsigned.pop("knock_room_state", [])
|
||||||
|
if not isinstance(knocked_state, list):
|
||||||
|
knocked_state = []
|
||||||
|
knocked_state = list(knocked_state)
|
||||||
|
|
||||||
# Append the actual knock membership event itself as well. This provides
|
# Append the actual knock membership event itself as well. This provides
|
||||||
# the client with:
|
# the client with:
|
||||||
|
|
Loading…
Add table
Reference in a new issue