summary refs log tree commit diff
path: root/synapse/handlers/federation.py
diff options
context:
space:
mode:
Diffstat (limited to 'synapse/handlers/federation.py')
-rw-r--r--synapse/handlers/federation.py26
1 files changed, 20 insertions, 6 deletions
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index 4e5c645525..2b19c2a784 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -1547,7 +1547,7 @@ class FederationHandler(BaseHandler):
 
     async def do_remotely_reject_invite(
         self, target_hosts: Iterable[str], room_id: str, user_id: str, content: JsonDict
-    ) -> EventBase:
+    ) -> Optional[EventBase]:
         origin, event, room_version = await self._make_and_verify_event(
             target_hosts, room_id, user_id, "leave", content=content
         )
@@ -1564,12 +1564,26 @@ class FederationHandler(BaseHandler):
         except ValueError:
             pass
 
-        await self.federation_client.send_leave(target_hosts, event)
-
-        context = await self.state_handler.compute_event_context(event)
-        await self.persist_events_and_notify([(event, context)])
+        try:
+            await self.federation_client.send_leave(target_hosts, event)
+            return event
+        except Exception as e:
+            # if we were unable to reject the exception, just mark
+            # it as rejected on our end and plough ahead.
+            #
+            # The 'except' clause is very broad, but we need to
+            # capture everything from DNS failures upwards
+            #
+            logger.warning("Failed to reject invite: %s", e)
 
-        return event
+            await self.store.locally_reject_invite(user_id, room_id)
+            return None
+        finally:
+            # This block will always run before returning, and will return with
+            # whatever value was returned in the try/except blocks
+            # (it will not, for example, be over-written by None)
+            context = await self.state_handler.compute_event_context(event)
+            await self.persist_events_and_notify([(event, context)])
 
     async def _make_and_verify_event(
         self,