|
|
|
@ -170,13 +170,13 @@ class FederationClient(FederationBase): |
|
|
|
|
|
|
|
|
|
@defer.inlineCallbacks |
|
|
|
|
@log_function |
|
|
|
|
def backfill(self, dest, context, limit, extremities): |
|
|
|
|
def backfill(self, dest, room_id, limit, extremities): |
|
|
|
|
"""Requests some more historic PDUs for the given context from the |
|
|
|
|
given destination server. |
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
dest (str): The remote home server to ask. |
|
|
|
|
context (str): The context to backfill. |
|
|
|
|
room_id (str): The room_id to backfill. |
|
|
|
|
limit (int): The maximum number of PDUs to return. |
|
|
|
|
extremities (list): List of PDU id and origins of the first pdus |
|
|
|
|
we have seen from the context |
|
|
|
@ -191,12 +191,15 @@ class FederationClient(FederationBase): |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
transaction_data = yield self.transport_layer.backfill( |
|
|
|
|
dest, context, extremities, limit) |
|
|
|
|
dest, room_id, extremities, limit) |
|
|
|
|
|
|
|
|
|
logger.debug("backfill transaction_data=%s", repr(transaction_data)) |
|
|
|
|
|
|
|
|
|
room_version = yield self.store.get_room_version(room_id) |
|
|
|
|
format_ver = room_version_to_event_format(room_version) |
|
|
|
|
|
|
|
|
|
pdus = [ |
|
|
|
|
event_from_pdu_json(p, outlier=False) |
|
|
|
|
event_from_pdu_json(p, format_ver, outlier=False) |
|
|
|
|
for p in transaction_data["pdus"] |
|
|
|
|
] |
|
|
|
|
|
|
|
|
@ -240,6 +243,8 @@ class FederationClient(FederationBase): |
|
|
|
|
|
|
|
|
|
pdu_attempts = self.pdu_destination_tried.setdefault(event_id, {}) |
|
|
|
|
|
|
|
|
|
format_ver = room_version_to_event_format(room_version) |
|
|
|
|
|
|
|
|
|
signed_pdu = None |
|
|
|
|
for destination in destinations: |
|
|
|
|
now = self._clock.time_msec() |
|
|
|
@ -255,7 +260,7 @@ class FederationClient(FederationBase): |
|
|
|
|
logger.debug("transaction_data %r", transaction_data) |
|
|
|
|
|
|
|
|
|
pdu_list = [ |
|
|
|
|
event_from_pdu_json(p, outlier=outlier) |
|
|
|
|
event_from_pdu_json(p, format_ver, outlier=outlier) |
|
|
|
|
for p in transaction_data["pdus"] |
|
|
|
|
] |
|
|
|
|
|
|
|
|
@ -349,12 +354,16 @@ class FederationClient(FederationBase): |
|
|
|
|
destination, room_id, event_id=event_id, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
room_version = yield self.store.get_room_version(room_id) |
|
|
|
|
format_ver = room_version_to_event_format(room_version) |
|
|
|
|
|
|
|
|
|
pdus = [ |
|
|
|
|
event_from_pdu_json(p, outlier=True) for p in result["pdus"] |
|
|
|
|
event_from_pdu_json(p, format_ver, outlier=True) |
|
|
|
|
for p in result["pdus"] |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
auth_chain = [ |
|
|
|
|
event_from_pdu_json(p, outlier=True) |
|
|
|
|
event_from_pdu_json(p, format_ver, outlier=True) |
|
|
|
|
for p in result.get("auth_chain", []) |
|
|
|
|
] |
|
|
|
|
|
|
|
|
@ -362,8 +371,6 @@ class FederationClient(FederationBase): |
|
|
|
|
ev.event_id for ev in itertools.chain(pdus, auth_chain) |
|
|
|
|
]) |
|
|
|
|
|
|
|
|
|
room_version = yield self.store.get_room_version(room_id) |
|
|
|
|
|
|
|
|
|
signed_pdus = yield self._check_sigs_and_hash_and_fetch( |
|
|
|
|
destination, |
|
|
|
|
[p for p in pdus if p.event_id not in seen_events], |
|
|
|
@ -462,13 +469,14 @@ class FederationClient(FederationBase): |
|
|
|
|
destination, room_id, event_id, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
room_version = yield self.store.get_room_version(room_id) |
|
|
|
|
format_ver = room_version_to_event_format(room_version) |
|
|
|
|
|
|
|
|
|
auth_chain = [ |
|
|
|
|
event_from_pdu_json(p, outlier=True) |
|
|
|
|
event_from_pdu_json(p, format_ver, outlier=True) |
|
|
|
|
for p in res["auth_chain"] |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
room_version = yield self.store.get_room_version(room_id) |
|
|
|
|
|
|
|
|
|
signed_auth = yield self._check_sigs_and_hash_and_fetch( |
|
|
|
|
destination, auth_chain, |
|
|
|
|
outlier=True, room_version=room_version, |
|
|
|
@ -605,7 +613,7 @@ class FederationClient(FederationBase): |
|
|
|
|
pdu_dict.pop("origin_server_ts", None) |
|
|
|
|
pdu_dict.pop("unsigned", None) |
|
|
|
|
|
|
|
|
|
builder = self.event_builder_factory.new(pdu_dict) |
|
|
|
|
builder = self.event_builder_factory.new(room_version, pdu_dict) |
|
|
|
|
add_hashes_and_signatures( |
|
|
|
|
builder, |
|
|
|
|
self.hs.hostname, |
|
|
|
@ -621,7 +629,7 @@ class FederationClient(FederationBase): |
|
|
|
|
"make_" + membership, destinations, send_request, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
def send_join(self, destinations, pdu): |
|
|
|
|
def send_join(self, destinations, pdu, event_format_version): |
|
|
|
|
"""Sends a join event to one of a list of homeservers. |
|
|
|
|
|
|
|
|
|
Doing so will cause the remote server to add the event to the graph, |
|
|
|
@ -631,6 +639,7 @@ class FederationClient(FederationBase): |
|
|
|
|
destinations (str): Candidate homeservers which are probably |
|
|
|
|
participating in the room. |
|
|
|
|
pdu (BaseEvent): event to be sent |
|
|
|
|
event_format_version (int): The event format version |
|
|
|
|
|
|
|
|
|
Return: |
|
|
|
|
Deferred: resolves to a dict with members ``origin`` (a string |
|
|
|
@ -676,12 +685,12 @@ class FederationClient(FederationBase): |
|
|
|
|
logger.debug("Got content: %s", content) |
|
|
|
|
|
|
|
|
|
state = [ |
|
|
|
|
event_from_pdu_json(p, outlier=True) |
|
|
|
|
event_from_pdu_json(p, event_format_version, outlier=True) |
|
|
|
|
for p in content.get("state", []) |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
auth_chain = [ |
|
|
|
|
event_from_pdu_json(p, outlier=True) |
|
|
|
|
event_from_pdu_json(p, event_format_version, outlier=True) |
|
|
|
|
for p in content.get("auth_chain", []) |
|
|
|
|
] |
|
|
|
|
|
|
|
|
@ -759,7 +768,10 @@ class FederationClient(FederationBase): |
|
|
|
|
|
|
|
|
|
logger.debug("Got response to send_invite: %s", pdu_dict) |
|
|
|
|
|
|
|
|
|
pdu = event_from_pdu_json(pdu_dict) |
|
|
|
|
room_version = yield self.store.get_room_version(room_id) |
|
|
|
|
format_ver = room_version_to_event_format(room_version) |
|
|
|
|
|
|
|
|
|
pdu = event_from_pdu_json(pdu_dict, format_ver) |
|
|
|
|
|
|
|
|
|
# Check signatures are correct. |
|
|
|
|
pdu = yield self._check_sigs_and_hash(pdu) |
|
|
|
@ -837,13 +849,14 @@ class FederationClient(FederationBase): |
|
|
|
|
content=send_content, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
room_version = yield self.store.get_room_version(room_id) |
|
|
|
|
format_ver = room_version_to_event_format(room_version) |
|
|
|
|
|
|
|
|
|
auth_chain = [ |
|
|
|
|
event_from_pdu_json(e) |
|
|
|
|
event_from_pdu_json(e, format_ver) |
|
|
|
|
for e in content["auth_chain"] |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
room_version = yield self.store.get_room_version(room_id) |
|
|
|
|
|
|
|
|
|
signed_auth = yield self._check_sigs_and_hash_and_fetch( |
|
|
|
|
destination, auth_chain, outlier=True, room_version=room_version, |
|
|
|
|
) |
|
|
|
@ -887,13 +900,14 @@ class FederationClient(FederationBase): |
|
|
|
|
timeout=timeout, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
room_version = yield self.store.get_room_version(room_id) |
|
|
|
|
format_ver = room_version_to_event_format(room_version) |
|
|
|
|
|
|
|
|
|
events = [ |
|
|
|
|
event_from_pdu_json(e) |
|
|
|
|
event_from_pdu_json(e, format_ver) |
|
|
|
|
for e in content.get("events", []) |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
room_version = yield self.store.get_room_version(room_id) |
|
|
|
|
|
|
|
|
|
signed_events = yield self._check_sigs_and_hash_and_fetch( |
|
|
|
|
destination, events, outlier=False, room_version=room_version, |
|
|
|
|
) |
|
|
|
|