diff --git a/synapse/events/utils.py b/synapse/events/utils.py
index 13fa93afb8..ae57a4df5e 100644
--- a/synapse/events/utils.py
+++ b/synapse/events/utils.py
@@ -403,6 +403,14 @@ class EventClientSerializer:
clients.
"""
+ def __init__(self, inhibit_replacement_via_edits: bool = False):
+ """
+ Args:
+ inhibit_replacement_via_edits: If this is set to True, then events are
+ never replaced by their edits.
+ """
+ self._inhibit_replacement_via_edits = inhibit_replacement_via_edits
+
def serialize_event(
self,
event: Union[JsonDict, EventBase],
@@ -422,6 +430,8 @@ class EventClientSerializer:
into the event.
apply_edits: Whether the content of the event should be modified to reflect
any replacement in `bundle_aggregations[<event_id>].replace`.
+ See also the `inhibit_replacement_via_edits` constructor arg: if that is
+ set to True, then this argument is ignored.
Returns:
The serialized event
"""
@@ -495,7 +505,8 @@ class EventClientSerializer:
again for additional events in a recursive manner.
serialized_event: The serialized event which may be modified.
apply_edits: Whether the content of the event should be modified to reflect
- any replacement in `aggregations.replace`.
+ any replacement in `aggregations.replace` (subject to the
+ `inhibit_replacement_via_edits` constructor arg).
"""
# We have already checked that aggregations exist for this event.
@@ -518,15 +529,21 @@ class EventClientSerializer:
if event_aggregations.replace:
# If there is an edit, optionally apply it to the event.
edit = event_aggregations.replace
- if apply_edits:
+ if apply_edits and not self._inhibit_replacement_via_edits:
self._apply_edit(event, serialized_event, edit)
# Include information about it in the relations dict.
- serialized_aggregations[RelationTypes.REPLACE] = {
- "event_id": edit.event_id,
- "origin_server_ts": edit.origin_server_ts,
- "sender": edit.sender,
- }
+ #
+ # Matrix spec v1.5 (https://spec.matrix.org/v1.5/client-server-api/#server-side-aggregation-of-mreplace-relationships)
+ # said that we should only include the `event_id`, `origin_server_ts` and
+ # `sender` of the edit; however MSC3925 proposes extending it to the whole
+ # of the edit, which is what we do here.
+ serialized_aggregations[RelationTypes.REPLACE] = self.serialize_event(
+ edit,
+ time_now,
+ config=config,
+ apply_edits=False,
+ )
# Include any threaded replies to this event.
if event_aggregations.thread:
|