Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Move tag/push rules room upgrade checking ealier (#6155)
Browse files Browse the repository at this point in the history
It turns out that _local_membership_update doesn't run when you join a new, remote room. It only runs if you're joining a room that your server already knows about. This would explain #4703 and #5295 and why the transfer would work in testing and some rooms, but not others. This would especially hit single-user homeservers.

The check has been moved to right after the room has been joined, and works much more reliably. (Though it may still be a bit awkward of a place).
  • Loading branch information
anoadragon453 authored and richvdh committed Oct 10, 2019
1 parent f743108 commit da815c1
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 18 deletions.
1 change: 1 addition & 0 deletions changelog.d/6155.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix transferring notifications and tags when joining an upgraded room that is new to your server.
62 changes: 44 additions & 18 deletions synapse/handlers/room_member.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,23 +203,11 @@ def _local_membership_update(
prev_member_event = yield self.store.get_event(prev_member_event_id)
newly_joined = prev_member_event.membership != Membership.JOIN
if newly_joined:
yield self._user_joined_room(target, room_id)

# Copy over direct message status and room tags if this is a join
# on an upgraded room

# Check if this is an upgraded room
predecessor = yield self.store.get_room_predecessor(room_id)

if predecessor:
# It is an upgraded room. Copy over old tags
self.copy_room_tags_and_direct_to_room(
predecessor["room_id"], room_id, user_id
)
# Copy over push rules
yield self.store.copy_push_rules_from_room_to_room_for_user(
predecessor["room_id"], room_id, user_id
# Copy over user state if we're joining an upgraded room
yield self.copy_user_state_if_room_upgrade(
room_id, requester.user.to_string()
)
yield self._user_joined_room(target, room_id)
elif event.membership == Membership.LEAVE:
if prev_member_event_id:
prev_member_event = yield self.store.get_event(prev_member_event_id)
Expand Down Expand Up @@ -463,10 +451,16 @@ def _update_membership(
if requester.is_guest:
content["kind"] = "guest"

ret = yield self._remote_join(
remote_join_response = yield self._remote_join(
requester, remote_room_hosts, room_id, target, content
)
return ret

# Copy over user state if this is a join on an remote upgraded room
yield self.copy_user_state_if_room_upgrade(
room_id, requester.user.to_string()
)

return remote_join_response

elif effective_membership_state == Membership.LEAVE:
if not is_host_in_room:
Expand Down Expand Up @@ -503,6 +497,38 @@ def _update_membership(
)
return res

@defer.inlineCallbacks
def copy_user_state_if_room_upgrade(self, new_room_id, user_id):
"""Copy user-specific information when they join a new room if that new room is the
result of a room upgrade
Args:
new_room_id (str): The ID of the room the user is joining
user_id (str): The ID of the user
Returns:
Deferred
"""
# Check if the new room is an upgraded room
predecessor = yield self.store.get_room_predecessor(new_room_id)
if not predecessor:
return

logger.debug(
"Found predecessor for %s: %s. Copying over room tags and push " "rules",
new_room_id,
predecessor,
)

# It is an upgraded room. Copy over old tags
yield self.copy_room_tags_and_direct_to_room(
predecessor["room_id"], new_room_id, user_id
)
# Copy over push rules
yield self.store.copy_push_rules_from_room_to_room_for_user(
predecessor["room_id"], new_room_id, user_id
)

@defer.inlineCallbacks
def send_membership_event(self, requester, event, context, ratelimit=True):
"""
Expand Down

0 comments on commit da815c1

Please sign in to comment.