Compare commits

...

1 commit

Author SHA1 Message Date
Andrew Morgan bfc287b5c6 Attempt at fixing locally rejected invites 2020-05-04 17:14:16 +01:00
3 changed files with 29 additions and 42 deletions

View file

@ -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)
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)
context = await self.state_handler.compute_event_context(event)
await self.persist_events_and_notify([(event, context)])
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,

View file

@ -976,25 +976,12 @@ class RoomMemberMasterHandler(RoomMemberHandler):
):
"""Implements RoomMemberHandler._remote_reject_invite
"""
fed_handler = self.federation_handler
try:
ret = yield defer.ensureDeferred(
fed_handler.do_remotely_reject_invite(
remote_room_hosts, room_id, target.to_string(), content=content,
)
ret = yield defer.ensureDeferred(
self.federation_handler.do_remotely_reject_invite(
remote_room_hosts, room_id, target.to_string(), content=content,
)
return ret
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)
yield self.store.locally_reject_invite(target.to_string(), room_id)
return {}
)
return ret if ret else {}
def _user_joined_room(self, target, room_id):
"""Implements RoomMemberHandler._user_joined_room

View file

@ -135,24 +135,10 @@ class ReplicationRemoteRejectInviteRestServlet(ReplicationEndpoint):
logger.info("remote_reject_invite: %s out of room: %s", user_id, room_id)
try:
event = await self.federation_handler.do_remotely_reject_invite(
remote_room_hosts, room_id, user_id, event_content,
)
ret = event.get_pdu_json()
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)
await self.store.locally_reject_invite(user_id, room_id)
ret = {}
return 200, ret
event = await self.federation_handler.do_remotely_reject_invite(
remote_room_hosts, room_id, user_id, event_content,
)
return 200, event.get_pdu_json() if event else 200, {}
class ReplicationUserJoinedLeftRoomRestServlet(ReplicationEndpoint):