From 830e3a1df3a73bc194e9d05be9865131cf3120e4 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Mon, 28 Oct 2024 12:04:59 +0000 Subject: [PATCH 1/3] Stablize MSC2409 --- synapse/appservice/__init__.py | 2 ++ synapse/appservice/api.py | 11 ++++++++++- synapse/config/appservice.py | 10 +++++++++- synapse/config/experimental.py | 4 +++- synapse/handlers/appservice.py | 7 +++---- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/synapse/appservice/__init__.py b/synapse/appservice/__init__.py index a96cdbf1e7e..51e046d59da 100644 --- a/synapse/appservice/__init__.py +++ b/synapse/appservice/__init__.py @@ -86,6 +86,7 @@ def __init__( rate_limited: bool = True, ip_range_whitelist: Optional[IPSet] = None, supports_ephemeral: bool = False, + supports_ephemeral_legacy: bool = False, msc3202_transaction_extensions: bool = False, ): self.token = token @@ -99,6 +100,7 @@ def __init__( self.id = id self.ip_range_whitelist = ip_range_whitelist self.supports_ephemeral = supports_ephemeral + self.supports_ephemeral_legacy = supports_ephemeral_legacy self.msc3202_transaction_extensions = msc3202_transaction_extensions if "|" in self.id: diff --git a/synapse/appservice/api.py b/synapse/appservice/api.py index 19322471dc5..1b3ff6a083e 100644 --- a/synapse/appservice/api.py +++ b/synapse/appservice/api.py @@ -353,7 +353,16 @@ async def push_bulk( if service.supports_ephemeral: body.update( { - # TODO: Update to stable prefixes once MSC2409 completes FCP merge. + "ephemeral": ephemeral, + # NOTE: This is actually https://github.com/matrix-org/matrix-spec-proposals/blob/tulir/appservice-to-device/proposals/4203-appservice-to-device.md + # but for legacy reasons uses an older MSC number. + "de.sorunome.msc2409.to_device": to_device_messages, + } + ) + elif service.supports_ephemeral_legacy: + # Support to be removed in a future spec version. + body.update( + { "de.sorunome.msc2409.ephemeral": ephemeral, "de.sorunome.msc2409.to_device": to_device_messages, } diff --git a/synapse/config/appservice.py b/synapse/config/appservice.py index 6ff00e1ff8b..9a744ef363e 100644 --- a/synapse/config/appservice.py +++ b/synapse/config/appservice.py @@ -170,7 +170,14 @@ def _load_appservice( if as_info.get("ip_range_whitelist"): ip_range_whitelist = IPSet(as_info.get("ip_range_whitelist")) - supports_ephemeral = as_info.get("de.sorunome.msc2409.push_ephemeral", False) + supports_ephemeral = as_info.get("receive_ephemeral", False) + + # For ASes that haven't transitioned to the stable fields yet + supports_ephemeral_legacy = False + if not supports_ephemeral: + supports_ephemeral_legacy = as_info.get( + "de.sorunome.msc2409.push_ephemeral", False + ) # Opt-in flag for the MSC3202-specific transactional behaviour. # When enabled, appservice transactions contain the following information: @@ -194,5 +201,6 @@ def _load_appservice( rate_limited=rate_limited, ip_range_whitelist=ip_range_whitelist, supports_ephemeral=supports_ephemeral, + supports_ephemeral_legacy=supports_ephemeral_legacy, msc3202_transaction_extensions=msc3202_transaction_extensions, ) diff --git a/synapse/config/experimental.py b/synapse/config/experimental.py index fd14db0d024..2c1daea213d 100644 --- a/synapse/config/experimental.py +++ b/synapse/config/experimental.py @@ -294,7 +294,9 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None: # MSC3266 (room summary api) self.msc3266_enabled: bool = experimental.get("msc3266_enabled", False) - # MSC2409 (this setting only relates to optionally sending to-device messages). + # MSC4203 (Sending to-device events to appservices). + # NOTE: This used to be used to be part of MSC2409 but was split out, hence the config + # key not matching the MSC. # Presence, typing and read receipt EDUs are already sent to application services that # have opted in to receive them. If enabled, this adds to-device messages to that list. self.msc2409_to_device_messages_enabled: bool = experimental.get( diff --git a/synapse/handlers/appservice.py b/synapse/handlers/appservice.py index 4b33e1330d0..143d19e6c5c 100644 --- a/synapse/handlers/appservice.py +++ b/synapse/handlers/appservice.py @@ -242,9 +242,8 @@ def notify_interested_services_ephemeral( will cause this function to return early. Ephemeral events will only be pushed to appservices that have opted into - receiving them by setting `push_ephemeral` to true in their registration - file. Note that while MSC2409 is experimental, this option is called - `de.sorunome.msc2409.push_ephemeral`. + receiving them by setting `recieve_ephemeral` to true in their registration + file. Appservices will only receive ephemeral events that fall within their registered user and room namespaces. @@ -588,7 +587,7 @@ async def _get_to_device_messages( new_token, ) - # According to MSC2409, we'll need to add 'to_user_id' and 'to_device_id' fields + # According to MSC4203, we'll need to add 'to_user_id' and 'to_device_id' fields # to the event JSON so that the application service will know which user/device # combination this messages was intended for. # From 01d73ac0090f1e7c42d920d0f4ad705565ac82bf Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Mon, 28 Oct 2024 12:06:28 +0000 Subject: [PATCH 2/3] Add changelog. --- changelog.d/17881.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/17881.feature diff --git a/changelog.d/17881.feature b/changelog.d/17881.feature new file mode 100644 index 00000000000..d80d194e091 --- /dev/null +++ b/changelog.d/17881.feature @@ -0,0 +1 @@ +Stabilize MSC2409 (Send typing, presence and receipts to appservices). From 10894221ff3dc4af701d12f69ff6d18de526c394 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Mon, 28 Oct 2024 12:13:10 +0000 Subject: [PATCH 3/3] Rename MSC2409 to-dev -> MSC4203 internally --- synapse/config/experimental.py | 2 +- synapse/handlers/appservice.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/synapse/config/experimental.py b/synapse/config/experimental.py index 2c1daea213d..39041a2790d 100644 --- a/synapse/config/experimental.py +++ b/synapse/config/experimental.py @@ -299,7 +299,7 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None: # key not matching the MSC. # Presence, typing and read receipt EDUs are already sent to application services that # have opted in to receive them. If enabled, this adds to-device messages to that list. - self.msc2409_to_device_messages_enabled: bool = experimental.get( + self.msc4203_to_device_messages_enabled: bool = experimental.get( "msc2409_to_device_messages_enabled", False ) diff --git a/synapse/handlers/appservice.py b/synapse/handlers/appservice.py index 143d19e6c5c..d7a7265bfa6 100644 --- a/synapse/handlers/appservice.py +++ b/synapse/handlers/appservice.py @@ -81,8 +81,8 @@ def __init__(self, hs: "HomeServer"): self.clock = hs.get_clock() self.notify_appservices = hs.config.worker.should_notify_appservices self.event_sources = hs.get_event_sources() - self._msc2409_to_device_messages_enabled = ( - hs.config.experimental.msc2409_to_device_messages_enabled + self._msc4203_to_device_messages_enabled = ( + hs.config.experimental.msc4203_to_device_messages_enabled ) self._msc3202_transaction_extensions_enabled = ( hs.config.experimental.msc3202_transaction_extensions @@ -269,7 +269,7 @@ def notify_interested_services_ephemeral( # Ignore to-device messages if the feature flag is not enabled if ( stream_key == StreamKeyType.TO_DEVICE - and not self._msc2409_to_device_messages_enabled + and not self._msc4203_to_device_messages_enabled ): return