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

Fix yields and copy instead of move push rules on room upgrade #6144

Merged
merged 3 commits into from
Oct 2, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/6144.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Prevent user push rules being deleted from a room when it is upgraded.
4 changes: 2 additions & 2 deletions synapse/handlers/room_member.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,8 @@ def _local_membership_update(
self.copy_room_tags_and_direct_to_room(
predecessor["room_id"], room_id, user_id
)
# Move over old push rules
self.store.move_push_rules_from_room_to_room_for_user(
# 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:
Expand Down
16 changes: 6 additions & 10 deletions synapse/storage/push_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,8 @@ def bulk_get_push_rules(self, user_ids):
return results

@defer.inlineCallbacks
def move_push_rule_from_room_to_room(self, new_room_id, user_id, rule):
"""Move a single push rule from one room to another for a specific user.
def copy_push_rule_from_room_to_room(self, new_room_id, user_id, rule):
"""Copy a single push rule from one room to another for a specific user.

Args:
new_room_id (str): ID of the new room.
Expand All @@ -209,14 +209,11 @@ def move_push_rule_from_room_to_room(self, new_room_id, user_id, rule):
actions=rule["actions"],
)

# Delete push rule for the old room
yield self.delete_push_rule(user_id, rule["rule_id"])

@defer.inlineCallbacks
def move_push_rules_from_room_to_room_for_user(
def copy_push_rules_from_room_to_room_for_user(
self, old_room_id, new_room_id, user_id
):
"""Move all of the push rules from one room to another for a specific
"""Copy all of the push rules from one room to another for a specific
user.

Args:
Expand All @@ -227,15 +224,14 @@ def move_push_rules_from_room_to_room_for_user(
# Retrieve push rules for this user
user_push_rules = yield self.get_push_rules_for_user(user_id)

# Get rules relating to the old room, move them to the new room, then
# delete them from the old room
# Get rules relating to the old room and copy them to the new room
for rule in user_push_rules:
conditions = rule.get("conditions", [])
if any(
(c.get("key") == "room_id" and c.get("pattern") == old_room_id)
for c in conditions
):
self.move_push_rule_from_room_to_room(new_room_id, user_id, rule)
yield self.copy_push_rule_from_room_to_room(new_room_id, user_id, rule)

@defer.inlineCallbacks
def bulk_get_push_rules_for_room(self, event, context):
Expand Down