diff options
author | Patrick Cloke <clokep@users.noreply.github.com> | 2022-05-05 08:15:12 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-05 08:15:12 -0400 |
commit | f90d381c7b93b98a5b6d7353196e2ae0912ea822 (patch) | |
tree | d89abc039e31fad41c6153f57ed4ec2fc69f377c /synapse/handlers | |
parent | Remove unused receipt datastore methods. (#12632) (diff) | |
download | synapse-f90d381c7b93b98a5b6d7353196e2ae0912ea822.tar.xz |
Edits/annotations should not have any bundled aggregations calculated. (#12633)
Fixes a regression from 8b309adb436c162510ed1402f33b8741d71fc058 (#11660) and b65acead428653b988351ae8d7b22127a22039cd (#11752) where events which themselves were an edit or an annotation could have bundled aggregations calculated, which is not allowed.
Diffstat (limited to 'synapse/handlers')
-rw-r--r-- | synapse/handlers/relations.py | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/synapse/handlers/relations.py b/synapse/handlers/relations.py index cec5740fbd..c2754ec918 100644 --- a/synapse/handlers/relations.py +++ b/synapse/handlers/relations.py @@ -364,21 +364,29 @@ class RelationsHandler: The results may include additional events which are related to the requested events. """ - # De-duplicate events by ID to handle the same event requested multiple times. - # - # State events do not get bundled aggregations. - events_by_id = { - event.event_id: event for event in events if not event.is_state() - } - + # De-duplicated events by ID to handle the same event requested multiple times. + events_by_id = {} # A map of event ID to the relation in that event, if there is one. relations_by_id: Dict[str, str] = {} - for event_id, event in events_by_id.items(): + for event in events: + # State events do not get bundled aggregations. + if event.is_state(): + continue + relates_to = event.content.get("m.relates_to") + relation_type = None if isinstance(relates_to, collections.abc.Mapping): relation_type = relates_to.get("rel_type") - if isinstance(relation_type, str): - relations_by_id[event_id] = relation_type + # An event which is a replacement (ie edit) or annotation (ie, + # reaction) may not have any other event related to it. + if relation_type in (RelationTypes.ANNOTATION, RelationTypes.REPLACE): + continue + + # The event should get bundled aggregations. + events_by_id[event.event_id] = event + # Track the event's relation information for later. + if isinstance(relation_type, str): + relations_by_id[event.event_id] = relation_type # event ID -> bundled aggregation in non-serialized form. results: Dict[str, BundledAggregations] = {} @@ -413,16 +421,6 @@ class RelationsHandler: # Fetch other relations per event. for event in events_by_id.values(): - # An event which is a replacement (ie edit) or annotation (ie, reaction) - # may not have any other event related to it. - # - # XXX This is buggy, see https://github.com/matrix-org/synapse/issues/12566 - if relations_by_id.get(event.event_id) in ( - RelationTypes.ANNOTATION, - RelationTypes.REPLACE, - ): - continue - # Fetch any annotations (ie, reactions) to bundle with this event. annotations = await self.get_annotations_for_event( event.event_id, event.room_id, ignored_users=ignored_users |