diff options
Diffstat (limited to 'synapse/handlers/federation.py')
-rw-r--r-- | synapse/handlers/federation.py | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py index a3bb864bb2..9848534120 100644 --- a/synapse/handlers/federation.py +++ b/synapse/handlers/federation.py @@ -48,13 +48,14 @@ from synapse.crypto.event_signing import ( compute_event_signature, ) from synapse.events.validator import EventValidator +from synapse.metrics.background_process_metrics import run_as_background_process from synapse.replication.http.federation import ( ReplicationCleanRoomRestServlet, ReplicationFederationSendEventsRestServlet, ) from synapse.replication.http.membership import ReplicationUserJoinedLeftRoomRestServlet from synapse.state import StateResolutionStore, resolve_events_with_store -from synapse.types import UserID, get_domain_from_id +from synapse.types import UserID, get_domain_from_id, create_requester from synapse.util import logcontext, unwrapFirstError from synapse.util.async_helpers import Linearizer from synapse.util.distributor import user_joined_room @@ -105,6 +106,7 @@ class FederationHandler(BaseHandler): self.hs = hs + self.clock = hs.get_clock() self.store = hs.get_datastore() # type: synapse.storage.DataStore self.federation_client = hs.get_federation_client() self.state_handler = hs.get_state_handler() @@ -1300,9 +1302,39 @@ class FederationHandler(BaseHandler): context = yield self.state_handler.compute_event_context(event) yield self.persist_events_and_notify([(event, context)]) + sender = UserID.from_string(event.sender) + target = UserID.from_string(event.state_key) + if (sender.localpart == target.localpart): + run_as_background_process( + "_auto_accept_invite", + self._auto_accept_invite, + sender, target, event.room_id, + ) + defer.returnValue(event) @defer.inlineCallbacks + def _auto_accept_invite(self, sender, target, room_id): + joined = False + for attempt in range(0, 10): + try: + yield self.hs.get_room_member_handler().update_membership( + requester=create_requester(target.to_string()), + target=target, + room_id=room_id, + action="join", + ) + joined = True + break + except Exception: + # We're going to retry, but we should log the error + logger.exception("Error auto-accepting invite on attempt %d" % attempt) + yield self.clock.sleep(1) + if not joined: + logger.error("Giving up on trying to auto-accept invite: too many attempts") + + + @defer.inlineCallbacks def do_remotely_reject_invite(self, target_hosts, room_id, user_id): origin, event = yield self._make_and_verify_event( target_hosts, |