summary refs log tree commit diff
path: root/synapse/handlers/room_member.py
diff options
context:
space:
mode:
authorTravis Ralston <travpc@gmail.com>2018-11-28 08:57:56 -0700
committerTravis Ralston <travpc@gmail.com>2018-11-28 08:57:56 -0700
commit11a168442da40d44b003ec96b58a49ffa47cf037 (patch)
tree8de17402b82f96f0f46a002b51d327e2e053e477 /synapse/handlers/room_member.py
parentMerge pull request #4218 from matrix-org/travis/account-merging (diff)
downloadsynapse-11a168442da40d44b003ec96b58a49ffa47cf037.tar.xz
Catch room profile errors and anything else that can go wrong
Fixes an issue where things become unhappy when the room profile for a user is missing.
Diffstat (limited to '')
-rw-r--r--synapse/handlers/room_member.py53
1 files changed, 28 insertions, 25 deletions
diff --git a/synapse/handlers/room_member.py b/synapse/handlers/room_member.py
index 147f8e1789..f463bb3349 100644
--- a/synapse/handlers/room_member.py
+++ b/synapse/handlers/room_member.py
@@ -464,31 +464,34 @@ class RoomMemberHandler(object):
 
     @defer.inlineCallbacks
     def _send_merged_user_invites(self, requester, room_id):
-        profile_alias = "#_profile_" + requester.user.localpart + ":" + self.hs.hostname
-        profile_alias = RoomAlias.from_string(profile_alias)
-        profile_room_id, remote_room_hosts = yield self.lookup_room_alias(profile_alias)
-        if profile_room_id:
-            linked_accounts = yield self.state_handler.get_current_state(
-                room_id=profile_room_id.to_string(),
-                event_type="m.linked_accounts",
-                state_key="",
-            )
-            if not linked_accounts or not linked_accounts.content['all_children']:
-                return
-            for child_id in linked_accounts.content['all_children']:
-                child = UserID.from_string(child_id)
-                if self.hs.is_mine(child) or child_id == requester.user.to_string():
-                    # TODO: Handle auto-invite for local users (not a priority)
-                    continue
-                try:
-                    yield self.update_membership(
-                        requester=requester,
-                        target=child,
-                        room_id=room_id,
-                        action="invite",
-                    )
-                except Exception:
-                    logger.exception("Failed to invite %s to %s" % (child_id, room_id))
+        try:
+            profile_alias = "#_profile_" + requester.user.localpart + ":" + self.hs.hostname
+            profile_alias = RoomAlias.from_string(profile_alias)
+            profile_room_id, remote_room_hosts = yield self.lookup_room_alias(profile_alias)
+            if profile_room_id:
+                linked_accounts = yield self.state_handler.get_current_state(
+                    room_id=profile_room_id.to_string(),
+                    event_type="m.linked_accounts",
+                    state_key="",
+                )
+                if not linked_accounts or not linked_accounts.content['all_children']:
+                    return
+                for child_id in linked_accounts.content['all_children']:
+                    child = UserID.from_string(child_id)
+                    if self.hs.is_mine(child) or child_id == requester.user.to_string():
+                        # TODO: Handle auto-invite for local users (not a priority)
+                        continue
+                    try:
+                        yield self.update_membership(
+                            requester=requester,
+                            target=child,
+                            room_id=room_id,
+                            action="invite",
+                        )
+                    except Exception:
+                        logger.exception("Failed to invite %s to %s" % (child_id, room_id))
+        except Exception:
+            logger.exception("Failed to send invites to children of %s in %s" % (requester.user.to_string(), room_id))
 
     @defer.inlineCallbacks
     def send_membership_event(