From 6e37f382b2190e9d6cefcc215594f657d7256e30 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Tue, 14 Jul 2026 12:50:08 +0100 Subject: [PATCH] Adopt MSC4505 identifiers for the live location share push rules The MSC has been published as MSC4505 (Push Rules for Live Location Sharing): rename the experimental flag to msc4505_enabled and the rule ids to the unstable identifiers it defines (.org.matrix.msc4505.rule.beacon_info(_one_to_one)), and add the .org.matrix.msc4505.rule.beacon override it also defines, explicitly suppressing beacon update events in unencrypted rooms. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01Uk8aPxHn3BHCe52L226jdG --- rust/src/push/base_rules.rs | 20 ++++++++++++++++++-- rust/src/push/mod.rs | 10 +++++----- synapse/config/experimental.py | 11 +++++------ synapse/storage/databases/main/push_rule.py | 2 +- synapse/synapse_rust/push.pyi | 2 +- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/rust/src/push/base_rules.rs b/rust/src/push/base_rules.rs index 7472d65bda..c71e57b0be 100644 --- a/rust/src/push/base_rules.rs +++ b/rust/src/push/base_rules.rs @@ -273,6 +273,22 @@ pub const BASE_APPEND_OVERRIDE_RULES: &[PushRule] = &[ default: true, default_enabled: true, }, + // MSC4505: explicitly suppress live location share beacon updates in unencrypted + // rooms (in encrypted rooms they arrive as m.room.encrypted and can only be + // suppressed client-side after decryption). + PushRule { + rule_id: Cow::Borrowed("global/override/.org.matrix.msc4505.rule.beacon"), + priority_class: 5, + conditions: Cow::Borrowed(&[Condition::Known(KnownCondition::EventMatch( + EventMatchCondition { + key: Cow::Borrowed("type"), + pattern: Cow::Borrowed("org.matrix.msc3672.beacon"), + }, + ))]), + actions: Cow::Borrowed(&[]), + default: true, + default_enabled: true, + }, ]; pub const BASE_APPEND_CONTENT_RULES: &[PushRule] = &[PushRule { @@ -722,7 +738,7 @@ pub const BASE_APPEND_UNDERRIDE_RULES: &[PushRule] = &[ default_enabled: true, }, PushRule { - rule_id: Cow::Borrowed("global/underride/.io.element.rule.beacon_info_one_to_one"), + rule_id: Cow::Borrowed("global/underride/.org.matrix.msc4505.rule.beacon_info_one_to_one"), priority_class: 1, conditions: Cow::Borrowed(&[ Condition::Known(KnownCondition::RoomMemberCount { @@ -742,7 +758,7 @@ pub const BASE_APPEND_UNDERRIDE_RULES: &[PushRule] = &[ default_enabled: true, }, PushRule { - rule_id: Cow::Borrowed("global/underride/.io.element.rule.beacon_info"), + rule_id: Cow::Borrowed("global/underride/.org.matrix.msc4505.rule.beacon_info"), priority_class: 1, conditions: Cow::Borrowed(&[ Condition::Known(KnownCondition::EventMatch(EventMatchCondition { diff --git a/rust/src/push/mod.rs b/rust/src/push/mod.rs index 31f35907dd..2854dd6e88 100644 --- a/rust/src/push/mod.rs +++ b/rust/src/push/mod.rs @@ -559,7 +559,7 @@ pub struct FilteredPushRules { msc4028_push_encrypted_events: bool, msc4210_enabled: bool, msc4306_enabled: bool, - mscxxxx_beacon_push_rules_enabled: bool, + msc4505_enabled: bool, } #[pymethods] @@ -575,7 +575,7 @@ impl FilteredPushRules { msc4028_push_encrypted_events: bool, msc4210_enabled: bool, msc4306_enabled: bool, - mscxxxx_beacon_push_rules_enabled: bool, + msc4505_enabled: bool, ) -> Self { Self { push_rules, @@ -586,7 +586,7 @@ impl FilteredPushRules { msc4028_push_encrypted_events, msc4210_enabled, msc4306_enabled, - mscxxxx_beacon_push_rules_enabled, + msc4505_enabled, } } @@ -623,8 +623,8 @@ impl FilteredPushRules { return false; } - if !self.mscxxxx_beacon_push_rules_enabled - && rule.rule_id.contains("/.io.element.rule.beacon_info") + if !self.msc4505_enabled + && rule.rule_id.contains("/.org.matrix.msc4505.rule.beacon") { return false; } diff --git a/synapse/config/experimental.py b/synapse/config/experimental.py index c58324589b..c1c8310067 100644 --- a/synapse/config/experimental.py +++ b/synapse/config/experimental.py @@ -156,12 +156,11 @@ class ExperimentalConfig(Config): "msc3381_polls_enabled", False ) - # MSCXXXX (unnumbered draft): default push rules for live location share - # beacon_info start events (the MSC3672 state event). Unstable rule ids: - # .io.element.rule.beacon_info(_one_to_one). - self.mscxxxx_beacon_push_rules_enabled: bool = experimental.get( - "mscxxxx_beacon_push_rules_enabled", False - ) + # MSC4505: default push rules for live location sharing — notify on + # beacon_info start events (the MSC3672 state event), suppress beacon + # updates. Unstable rule ids: .org.matrix.msc4505.rule.beacon_info + # (_one_to_one) / .org.matrix.msc4505.rule.beacon. + self.msc4505_enabled: bool = experimental.get("msc4505_enabled", False) # MSC3912: Relation-based redactions. self.msc3912_enabled: bool = experimental.get("msc3912_enabled", False) diff --git a/synapse/storage/databases/main/push_rule.py b/synapse/storage/databases/main/push_rule.py index 5e5eb6ddec..6aa1baa5a6 100644 --- a/synapse/storage/databases/main/push_rule.py +++ b/synapse/storage/databases/main/push_rule.py @@ -107,7 +107,7 @@ def _load_rules( msc4028_push_encrypted_events=experimental_config.msc4028_push_encrypted_events, msc4210_enabled=experimental_config.msc4210_enabled, msc4306_enabled=experimental_config.msc4306_enabled, - mscxxxx_beacon_push_rules_enabled=experimental_config.mscxxxx_beacon_push_rules_enabled, + msc4505_enabled=experimental_config.msc4505_enabled, ) return filtered_rules diff --git a/synapse/synapse_rust/push.pyi b/synapse/synapse_rust/push.pyi index bac316c38b..8799d08a15 100644 --- a/synapse/synapse_rust/push.pyi +++ b/synapse/synapse_rust/push.pyi @@ -50,7 +50,7 @@ class FilteredPushRules: msc4028_push_encrypted_events: bool, msc4210_enabled: bool, msc4306_enabled: bool, - mscxxxx_beacon_push_rules_enabled: bool, + msc4505_enabled: bool, ): ... def rules(self) -> Collection[tuple[PushRule, bool]]: ...