From b04530ebd39f20ebd596963187a3e500077199b3 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Tue, 18 Jul 2023 11:33:46 -0400 Subject: [PATCH] Fix accepting an invite. --- synapse/events/builder.py | 13 ++++++++++++- synapse/federation/federation_server.py | 8 ++++++-- synapse/federation/transport/server/federation.py | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/synapse/events/builder.py b/synapse/events/builder.py index 084b5291eb..d93ed095cc 100644 --- a/synapse/events/builder.py +++ b/synapse/events/builder.py @@ -89,6 +89,8 @@ class EventBuilder: # TODO(LM) If Synapse is acting as a hub-server this should be itself. hub_server: Optional[str] = None + _lpdu_hashes: Optional[str] = None + _lpdu_signatures: Optional[str] = None internal_metadata: _EventInternalMetadata = attr.Factory( lambda: _EventInternalMetadata({}) @@ -187,7 +189,7 @@ class EventBuilder: if self._origin_server_ts is not None: event_dict["origin_server_ts"] = self._origin_server_ts - return create_local_event_from_event_dict( + event = create_local_event_from_event_dict( clock=self._clock, hostname=self._hostname, signing_key=self._signing_key, @@ -196,6 +198,13 @@ class EventBuilder: internal_metadata_dict=self.internal_metadata.get_dict(), ) + if self.room_version.linearized_matrix and self._lpdu_hashes: + event.hashes["lpdu"] = self._lpdu_hashes + if self.room_version.linearized_matrix and self._lpdu_signatures: + event.signatures.update(self._lpdu_signatures) + + return event + class EventBuilderFactory: def __init__(self, hs: "HomeServer"): @@ -237,6 +246,8 @@ class EventBuilderFactory: redacts=key_values.get("redacts", None), origin_server_ts=key_values.get("origin_server_ts", None), hub_server=key_values.get("hub_server", None), + lpdu_hashes=key_values.get("lpdu_hashes", None), + lpdu_signatures=key_values.get("lpdu_signatures", None), ) diff --git a/synapse/federation/federation_server.py b/synapse/federation/federation_server.py index 2557ba0f80..69beeb95db 100644 --- a/synapse/federation/federation_server.py +++ b/synapse/federation/federation_server.py @@ -1060,6 +1060,7 @@ class FederationServer(FederationBase): "origin_server_ts", "content", "hashes", + "signatures", ), ) @@ -1069,12 +1070,15 @@ class FederationServer(FederationBase): raise SynapseError(400, f"LPDU contained {field}", Codes.BAD_JSON) # Hashes must contain (only) "lpdu". - if not isinstance(lpdu_json["hashes"], collections.abc.Mapping): + hashes = lpdu_json.pop("hashes") + if not isinstance(hashes, collections.abc.Mapping): raise SynapseError(400, "Invalid hashes", Codes.BAD_JSON) - if lpdu_json["hashes"].keys() != {"lpdu"}: + if hashes.keys() != {"lpdu"}: raise SynapseError( 400, "hashes must contain exactly one key: 'lpdu'", Codes.BAD_JSON ) + lpdu_json["lpdu_hashes"] = hashes["lpdu"] + lpdu_json["lpdu_signatures"] = lpdu_json.pop("signatures") # Validate that the JSON conforms to the specification. if room_version.strict_canonicaljson: diff --git a/synapse/federation/transport/server/federation.py b/synapse/federation/transport/server/federation.py index 5b98e6656e..34f55b817a 100644 --- a/synapse/federation/transport/server/federation.py +++ b/synapse/federation/transport/server/federation.py @@ -625,7 +625,7 @@ class FederationUnstableSendJoinServlet(BaseFederationServerServlet): return 200, { "event": result["event"], "state": result["state"], - "auth_chain": result["auth_chain}"], + "auth_chain": result["auth_chain"], }