forked from MirrorHub/synapse
Move tag/push rules room upgrade checking ealier (#6155)
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).
This commit is contained in:
parent
f743108a94
commit
da815c1f69
2 changed files with 45 additions and 18 deletions
1
changelog.d/6155.bugfix
Normal file
1
changelog.d/6155.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix transferring notifications and tags when joining an upgraded room that is new to your server.
|
|
@ -203,23 +203,11 @@ class RoomMemberHandler(object):
|
||||||
prev_member_event = yield self.store.get_event(prev_member_event_id)
|
prev_member_event = yield self.store.get_event(prev_member_event_id)
|
||||||
newly_joined = prev_member_event.membership != Membership.JOIN
|
newly_joined = prev_member_event.membership != Membership.JOIN
|
||||||
if newly_joined:
|
if newly_joined:
|
||||||
|
# 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)
|
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
|
|
||||||
)
|
|
||||||
elif event.membership == Membership.LEAVE:
|
elif event.membership == Membership.LEAVE:
|
||||||
if prev_member_event_id:
|
if prev_member_event_id:
|
||||||
prev_member_event = yield self.store.get_event(prev_member_event_id)
|
prev_member_event = yield self.store.get_event(prev_member_event_id)
|
||||||
|
@ -463,10 +451,16 @@ class RoomMemberHandler(object):
|
||||||
if requester.is_guest:
|
if requester.is_guest:
|
||||||
content["kind"] = "guest"
|
content["kind"] = "guest"
|
||||||
|
|
||||||
ret = yield self._remote_join(
|
remote_join_response = yield self._remote_join(
|
||||||
requester, remote_room_hosts, room_id, target, content
|
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:
|
elif effective_membership_state == Membership.LEAVE:
|
||||||
if not is_host_in_room:
|
if not is_host_in_room:
|
||||||
|
@ -503,6 +497,38 @@ class RoomMemberHandler(object):
|
||||||
)
|
)
|
||||||
return res
|
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
|
@defer.inlineCallbacks
|
||||||
def send_membership_event(self, requester, event, context, ratelimit=True):
|
def send_membership_event(self, requester, event, context, ratelimit=True):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in a new issue