mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-02 23:44:57 -04:00
Merge pull request #176 from matrix-org/erikj/backfill_auth
Improve backfill.
This commit is contained in:
commit
8047fd2434
2 changed files with 50 additions and 8 deletions
|
@ -18,8 +18,6 @@ from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.events.utils import prune_event
|
from synapse.events.utils import prune_event
|
||||||
|
|
||||||
from syutil.jsonutil import encode_canonical_json
|
|
||||||
|
|
||||||
from synapse.crypto.event_signing import check_event_content_hash
|
from synapse.crypto.event_signing import check_event_content_hash
|
||||||
|
|
||||||
from synapse.api.errors import SynapseError
|
from synapse.api.errors import SynapseError
|
||||||
|
@ -120,16 +118,15 @@ class FederationBase(object):
|
||||||
)
|
)
|
||||||
except SynapseError:
|
except SynapseError:
|
||||||
logger.warn(
|
logger.warn(
|
||||||
"Signature check failed for %s redacted to %s",
|
"Signature check failed for %s",
|
||||||
encode_canonical_json(pdu.get_pdu_json()),
|
pdu.event_id,
|
||||||
encode_canonical_json(redacted_pdu_json),
|
|
||||||
)
|
)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
if not check_event_content_hash(pdu):
|
if not check_event_content_hash(pdu):
|
||||||
logger.warn(
|
logger.warn(
|
||||||
"Event content has been tampered, redacting %s, %s",
|
"Event content has been tampered, redacting.",
|
||||||
pdu.event_id, encode_canonical_json(pdu.get_dict())
|
pdu.event_id,
|
||||||
)
|
)
|
||||||
defer.returnValue(redacted_event)
|
defer.returnValue(redacted_event)
|
||||||
|
|
||||||
|
|
|
@ -247,9 +247,15 @@ class FederationHandler(BaseHandler):
|
||||||
if set(e_id for e_id, _ in ev.prev_events) - event_ids
|
if set(e_id for e_id, _ in ev.prev_events) - event_ids
|
||||||
]
|
]
|
||||||
|
|
||||||
|
logger.info(
|
||||||
|
"backfill: Got %d events with %d edges",
|
||||||
|
len(events), len(edges),
|
||||||
|
)
|
||||||
|
|
||||||
# For each edge get the current state.
|
# For each edge get the current state.
|
||||||
|
|
||||||
auth_events = {}
|
auth_events = {}
|
||||||
|
state_events = {}
|
||||||
events_to_state = {}
|
events_to_state = {}
|
||||||
for e_id in edges:
|
for e_id in edges:
|
||||||
state, auth = yield self.replication_layer.get_state_for_room(
|
state, auth = yield self.replication_layer.get_state_for_room(
|
||||||
|
@ -258,12 +264,46 @@ class FederationHandler(BaseHandler):
|
||||||
event_id=e_id
|
event_id=e_id
|
||||||
)
|
)
|
||||||
auth_events.update({a.event_id: a for a in auth})
|
auth_events.update({a.event_id: a for a in auth})
|
||||||
|
auth_events.update({s.event_id: s for s in state})
|
||||||
|
state_events.update({s.event_id: s for s in state})
|
||||||
events_to_state[e_id] = state
|
events_to_state[e_id] = state
|
||||||
|
|
||||||
|
seen_events = yield self.store.have_events(
|
||||||
|
set(auth_events.keys()) | set(state_events.keys())
|
||||||
|
)
|
||||||
|
|
||||||
|
all_events = events + state_events.values() + auth_events.values()
|
||||||
|
required_auth = set(
|
||||||
|
a_id for event in all_events for a_id, _ in event.auth_events
|
||||||
|
)
|
||||||
|
|
||||||
|
missing_auth = required_auth - set(auth_events)
|
||||||
|
results = yield defer.gatherResults(
|
||||||
|
[
|
||||||
|
self.replication_layer.get_pdu(
|
||||||
|
[dest],
|
||||||
|
event_id,
|
||||||
|
outlier=True,
|
||||||
|
timeout=10000,
|
||||||
|
)
|
||||||
|
for event_id in missing_auth
|
||||||
|
],
|
||||||
|
consumeErrors=True
|
||||||
|
).addErrback(unwrapFirstError)
|
||||||
|
auth_events.update({a.event_id: a for a in results})
|
||||||
|
|
||||||
yield defer.gatherResults(
|
yield defer.gatherResults(
|
||||||
[
|
[
|
||||||
self._handle_new_event(dest, a)
|
self._handle_new_event(
|
||||||
|
dest, a,
|
||||||
|
auth_events={
|
||||||
|
(auth_events[a_id].type, auth_events[a_id].state_key):
|
||||||
|
auth_events[a_id]
|
||||||
|
for a_id, _ in a.auth_events
|
||||||
|
},
|
||||||
|
)
|
||||||
for a in auth_events.values()
|
for a in auth_events.values()
|
||||||
|
if a.event_id not in seen_events
|
||||||
],
|
],
|
||||||
consumeErrors=True,
|
consumeErrors=True,
|
||||||
).addErrback(unwrapFirstError)
|
).addErrback(unwrapFirstError)
|
||||||
|
@ -274,6 +314,11 @@ class FederationHandler(BaseHandler):
|
||||||
dest, event_map[e_id],
|
dest, event_map[e_id],
|
||||||
state=events_to_state[e_id],
|
state=events_to_state[e_id],
|
||||||
backfilled=True,
|
backfilled=True,
|
||||||
|
auth_events={
|
||||||
|
(auth_events[a_id].type, auth_events[a_id].state_key):
|
||||||
|
auth_events[a_id]
|
||||||
|
for a_id, _ in event_map[e_id].auth_events
|
||||||
|
},
|
||||||
)
|
)
|
||||||
for e_id in events_to_state
|
for e_id in events_to_state
|
||||||
],
|
],
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue