diff --git a/synapse/config/appservice.py b/synapse/config/appservice.py
index 7fad2e0422..439bfe1526 100644
--- a/synapse/config/appservice.py
+++ b/synapse/config/appservice.py
@@ -166,6 +166,16 @@ def _load_appservice(
supports_ephemeral = 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:
+ # - device One-Time Key counts
+ # - device unused fallback key usage states
+ msc3202_transaction_extensions = as_info.get("org.matrix.msc3202", False)
+ if not isinstance(msc3202_transaction_extensions, bool):
+ raise ValueError(
+ "The `org.matrix.msc3202` option should be true or false if specified."
+ )
+
return ApplicationService(
token=as_info["as_token"],
hostname=hostname,
@@ -174,8 +184,9 @@ def _load_appservice(
hs_token=as_info["hs_token"],
sender=user_id,
id=as_info["id"],
- supports_ephemeral=supports_ephemeral,
protocols=protocols,
rate_limited=rate_limited,
ip_range_whitelist=ip_range_whitelist,
+ supports_ephemeral=supports_ephemeral,
+ msc3202_transaction_extensions=msc3202_transaction_extensions,
)
diff --git a/synapse/config/experimental.py b/synapse/config/experimental.py
index 772eb35013..41338b39df 100644
--- a/synapse/config/experimental.py
+++ b/synapse/config/experimental.py
@@ -47,11 +47,6 @@ class ExperimentalConfig(Config):
# MSC3030 (Jump to date API endpoint)
self.msc3030_enabled: bool = experimental.get("msc3030_enabled", False)
- # The portion of MSC3202 which is related to device masquerading.
- self.msc3202_device_masquerading_enabled: bool = experimental.get(
- "msc3202_device_masquerading", False
- )
-
# MSC2409 (this setting only relates to optionally sending to-device messages).
# 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.
@@ -59,6 +54,17 @@ class ExperimentalConfig(Config):
"msc2409_to_device_messages_enabled", False
)
+ # The portion of MSC3202 which is related to device masquerading.
+ self.msc3202_device_masquerading_enabled: bool = experimental.get(
+ "msc3202_device_masquerading", False
+ )
+
+ # Portion of MSC3202 related to transaction extensions:
+ # sending one-time key counts and fallback key usage to application services.
+ self.msc3202_transaction_extensions: bool = experimental.get(
+ "msc3202_transaction_extensions", False
+ )
+
# MSC3706 (server-side support for partial state in /send_join responses)
self.msc3706_enabled: bool = experimental.get("msc3706_enabled", False)
|