|
@@ -2181,103 +2181,10 @@ class FederationHandler(BaseHandler):
|
|
|
|
|
|
auth_events.update(new_state)
|
|
|
|
|
|
- different_auth = event_auth_events.difference(
|
|
|
- e.event_id for e in auth_events.values()
|
|
|
- )
|
|
|
-
|
|
|
yield self._update_context_for_auth_events(
|
|
|
event, context, auth_events, event_key
|
|
|
)
|
|
|
|
|
|
- if not different_auth:
|
|
|
- # we're done
|
|
|
- return
|
|
|
-
|
|
|
- logger.info(
|
|
|
- "auth_events still refers to events which are not in the calculated auth "
|
|
|
- "chain after state resolution: %s",
|
|
|
- different_auth,
|
|
|
- )
|
|
|
-
|
|
|
- # Only do auth resolution if we have something new to say.
|
|
|
- # We can't prove an auth failure.
|
|
|
- do_resolution = False
|
|
|
-
|
|
|
- for e_id in different_auth:
|
|
|
- if e_id in have_events:
|
|
|
- if have_events[e_id] == RejectedReason.NOT_ANCESTOR:
|
|
|
- do_resolution = True
|
|
|
- break
|
|
|
-
|
|
|
- if not do_resolution:
|
|
|
- logger.info(
|
|
|
- "Skipping auth resolution due to lack of provable rejection reasons"
|
|
|
- )
|
|
|
- return
|
|
|
-
|
|
|
- logger.info("Doing auth resolution")
|
|
|
-
|
|
|
- prev_state_ids = yield context.get_prev_state_ids(self.store)
|
|
|
-
|
|
|
- # 1. Get what we think is the auth chain.
|
|
|
- auth_ids = yield self.auth.compute_auth_events(event, prev_state_ids)
|
|
|
- local_auth_chain = yield self.store.get_auth_chain(auth_ids, include_given=True)
|
|
|
-
|
|
|
- try:
|
|
|
- # 2. Get remote difference.
|
|
|
- try:
|
|
|
- result = yield self.federation_client.query_auth(
|
|
|
- origin, event.room_id, event.event_id, local_auth_chain
|
|
|
- )
|
|
|
- except RequestSendFailed as e:
|
|
|
- # The other side isn't around or doesn't implement the
|
|
|
- # endpoint, so lets just bail out.
|
|
|
- logger.info("Failed to query auth from remote: %s", e)
|
|
|
- return
|
|
|
-
|
|
|
- seen_remotes = yield self.store.have_seen_events(
|
|
|
- [e.event_id for e in result["auth_chain"]]
|
|
|
- )
|
|
|
-
|
|
|
- # 3. Process any remote auth chain events we haven't seen.
|
|
|
- for ev in result["auth_chain"]:
|
|
|
- if ev.event_id in seen_remotes:
|
|
|
- continue
|
|
|
-
|
|
|
- if ev.event_id == event.event_id:
|
|
|
- continue
|
|
|
-
|
|
|
- try:
|
|
|
- auth_ids = ev.auth_event_ids()
|
|
|
- auth = {
|
|
|
- (e.type, e.state_key): e
|
|
|
- for e in result["auth_chain"]
|
|
|
- if e.event_id in auth_ids or event.type == EventTypes.Create
|
|
|
- }
|
|
|
- ev.internal_metadata.outlier = True
|
|
|
-
|
|
|
- logger.debug(
|
|
|
- "do_auth %s different_auth: %s", event.event_id, e.event_id
|
|
|
- )
|
|
|
-
|
|
|
- yield self._handle_new_event(origin, ev, auth_events=auth)
|
|
|
-
|
|
|
- if ev.event_id in event_auth_events:
|
|
|
- auth_events[(ev.type, ev.state_key)] = ev
|
|
|
- except AuthError:
|
|
|
- pass
|
|
|
-
|
|
|
- except Exception:
|
|
|
- # FIXME:
|
|
|
- logger.exception("Failed to query auth chain")
|
|
|
-
|
|
|
- # 4. Look at rejects and their proofs.
|
|
|
- # TODO.
|
|
|
-
|
|
|
- yield self._update_context_for_auth_events(
|
|
|
- event, context, auth_events, event_key
|
|
|
- )
|
|
|
-
|
|
|
@defer.inlineCallbacks
|
|
|
def _update_context_for_auth_events(self, event, context, auth_events, event_key):
|
|
|
"""Update the state_ids in an event context after auth event resolution,
|
|
@@ -2444,15 +2351,6 @@ class FederationHandler(BaseHandler):
|
|
|
|
|
|
reason_map[e.event_id] = reason
|
|
|
|
|
|
- if reason == RejectedReason.AUTH_ERROR:
|
|
|
- pass
|
|
|
- elif reason == RejectedReason.REPLACED:
|
|
|
- # TODO: Get proof
|
|
|
- pass
|
|
|
- elif reason == RejectedReason.NOT_ANCESTOR:
|
|
|
- # TODO: Get proof.
|
|
|
- pass
|
|
|
-
|
|
|
logger.debug("construct_auth_difference returning")
|
|
|
|
|
|
return {
|