Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

pass room version into FederationClient.send_join #6854

Merged
merged 3 commits into from
Feb 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/6854.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Refactoring work in preparation for changing the event redaction algorithm.
60 changes: 32 additions & 28 deletions synapse/federation/federation_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,7 @@ async def send_request(destination: str) -> Tuple[str, EventBase, RoomVersion]:
)

async def send_join(
self, destinations: Iterable[str], pdu: EventBase, event_format_version: int
self, destinations: Iterable[str], pdu: EventBase, room_version: RoomVersion
) -> Dict[str, Any]:
"""Sends a join event to one of a list of homeservers.

Expand All @@ -525,7 +525,8 @@ async def send_join(
destinations: Candidate homeservers which are probably
participating in the room.
pdu: event to be sent
event_format_version: The event format version
room_version: the version of the room (according to the server that
did the make_join)

Returns:
a dict with members ``origin`` (a string
Expand All @@ -538,58 +539,51 @@ async def send_join(
RuntimeError: if no servers were reachable.
"""

def check_authchain_validity(signed_auth_chain):
for e in signed_auth_chain:
if e.type == EventTypes.Create:
create_event = e
break
else:
raise InvalidResponseError("no %s in auth chain" % (EventTypes.Create,))

# the room version should be sane.
room_version = create_event.content.get("room_version", "1")
if room_version not in KNOWN_ROOM_VERSIONS:
# This shouldn't be possible, because the remote server should have
# rejected the join attempt during make_join.
raise InvalidResponseError(
"room appears to have unsupported version %s" % (room_version,)
)

async def send_request(destination) -> Dict[str, Any]:
content = await self._do_send_join(destination, pdu)

logger.debug("Got content: %s", content)

state = [
event_from_pdu_json(p, event_format_version, outlier=True)
event_from_pdu_json(p, room_version.event_format, outlier=True)
for p in content.get("state", [])
]

auth_chain = [
event_from_pdu_json(p, event_format_version, outlier=True)
event_from_pdu_json(p, room_version.event_format, outlier=True)
for p in content.get("auth_chain", [])
]

pdus = {p.event_id: p for p in itertools.chain(state, auth_chain)}

room_version = None
create_event = None
for e in state:
if (e.type, e.state_key) == (EventTypes.Create, ""):
room_version = e.content.get(
"room_version", RoomVersions.V1.identifier
)
create_event = e
break

if room_version is None:
if create_event is None:
# If the state doesn't have a create event then the room is
# invalid, and it would fail auth checks anyway.
raise SynapseError(400, "No create event in state")

# the room version should be sane.
create_room_version = create_event.content.get(
"room_version", RoomVersions.V1.identifier
)
if create_room_version != room_version.identifier:
# either the server that fulfilled the make_join, or the server that is
# handling the send_join, is lying.
raise InvalidResponseError(
"Unexpected room version %s in create event"
% (create_room_version,)
)

valid_pdus = await self._check_sigs_and_hash_and_fetch(
destination,
list(pdus.values()),
outlier=True,
room_version=room_version,
room_version=room_version.identifier,
)

valid_pdus_map = {p.event_id: p for p in valid_pdus}
Expand All @@ -613,7 +607,17 @@ async def send_request(destination) -> Dict[str, Any]:
for s in signed_state:
s.internal_metadata = copy.deepcopy(s.internal_metadata)

check_authchain_validity(signed_auth)
# double-check that the same create event has ended up in the auth chain
auth_chain_create_events = [
e.event_id
for e in signed_auth
if (e.type, e.state_key) == (EventTypes.Create, "")
]
if auth_chain_create_events != [create_event.event_id]:
raise InvalidResponseError(
"Unexpected create event(s) in auth chain"
% (auth_chain_create_events,)
)

return {
"state": signed_state,
Expand Down
3 changes: 1 addition & 2 deletions synapse/handlers/federation.py
Original file line number Diff line number Diff line change
Expand Up @@ -1259,9 +1259,8 @@ async def do_invite_join(
except ValueError:
pass

event_format_version = room_version_obj.event_format
ret = await self.federation_client.send_join(
target_hosts, event, event_format_version
target_hosts, event, room_version_obj
)

origin = ret["origin"]
Expand Down