Skip to content
Merged
1 change: 1 addition & 0 deletions changelog.d/18898.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Support [MSC4169](https://github.com/matrix-org/matrix-spec-proposals/pull/4169) for backwards-compatible redaction sending using the `/send` endpoint. Contributed by @SpiritCroc @ Beeper.
3 changes: 3 additions & 0 deletions synapse/config/experimental.py
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,9 @@ def read_config(
# MSC4133: Custom profile fields
self.msc4133_enabled: bool = experimental.get("msc4133_enabled", False)

# MSC4169: Backwards-compatible redaction sending using `/send`
self.msc4169_enabled: bool = experimental.get("msc4169_enabled", False)

# MSC4210: Remove legacy mentions
self.msc4210_enabled: bool = experimental.get("msc4210_enabled", False)

Expand Down
27 changes: 25 additions & 2 deletions synapse/handlers/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -1013,14 +1013,37 @@ async def create_and_send_nonmember_event(
await self.clock.sleep(random.randint(1, 10))
raise ShadowBanError()

if ratelimit:
room_version = None

if (
event_dict["type"] == EventTypes.Redaction
and "redacts" in event_dict["content"]
and self.hs.config.experimental.msc4169_enabled
):
room_id = event_dict["room_id"]
try:
room_version = await self.store.get_room_version(room_id)
except NotFoundError:
# The room doesn't exist.
raise AuthError(403, f"User {requester.user} not in room {room_id}")

if not room_version.updated_redaction_rules:
# Legacy room versions need the "redacts" field outside of the event's
# content. However clients may still send it within the content, so move
# the field if necessary for compatibility.
redacts = event_dict.get("redacts") or event_dict["content"].pop(
"redacts", None
)
if redacts is not None and "redacts" not in event_dict:
event_dict["redacts"] = redacts

if ratelimit:
if room_version is None:
room_id = event_dict["room_id"]
try:
room_version = await self.store.get_room_version(room_id)
except NotFoundError:
raise AuthError(403, f"User {requester.user} not in room {room_id}")

if room_version.updated_redaction_rules:
redacts = event_dict["content"].get("redacts")
else:
Expand Down
2 changes: 2 additions & 0 deletions synapse/rest/client/versions.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,8 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
"org.matrix.msc4155": self.config.experimental.msc4155_enabled,
# MSC4306: Support for thread subscriptions
"org.matrix.msc4306": self.config.experimental.msc4306_enabled,
# MSC4169: Backwards-compatible redaction sending using `/send`
"com.beeper.msc4169": self.config.experimental.msc4169_enabled,
},
},
)
Expand Down
Loading