Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 43455d5

Browse files
committed
Add an experimental configuration flag.
1 parent faf6afb commit 43455d5

File tree

5 files changed

+38
-3
lines changed

5 files changed

+38
-3
lines changed

synapse/config/experimental.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,6 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None:
8484

8585
# MSC3786 (Add a default push rule to ignore m.room.server_acl events)
8686
self.msc3786_enabled: bool = experimental.get("msc3786_enabled", False)
87+
88+
# MSC3772: A push rule for mutual relations.
89+
self.msc3772_enabled: bool = experimental.get("msc3772_enabled", False)

synapse/push/bulk_push_rule_evaluator.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ def __init__(self, hs: "HomeServer"):
120120
resizable=False,
121121
)
122122

123+
# Whether to support MSC3772 is supported.
124+
self._relations_match_enabled = self.hs.config.experimental.msc3772_enabled
125+
123126
async def _get_rules_for_event(
124127
self, event: EventBase, context: EventContext
125128
) -> Dict[str, List[Dict[str, Any]]]:
@@ -214,7 +217,12 @@ async def action_for_event_by_user(
214217
relations = await self.store.get_mutual_event_relations(event)
215218

216219
evaluator = PushRuleEvaluatorForEvent(
217-
event, len(room_members), sender_power_level, power_levels, relations
220+
event,
221+
len(room_members),
222+
sender_power_level,
223+
power_levels,
224+
relations,
225+
self._relations_match_enabled,
218226
)
219227

220228
# If the event is not a state event check if any users ignore the sender.

synapse/push/push_rule_evaluator.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,14 @@ def __init__(
121121
sender_power_level: int,
122122
power_levels: Dict[str, Union[int, Dict[str, int]]],
123123
relations: Set[Tuple[str, str, str]],
124+
relations_match_enabled: bool,
124125
):
125126
self._event = event
126127
self._room_member_count = room_member_count
127128
self._sender_power_level = sender_power_level
128129
self._power_levels = power_levels
129130
self._relations = relations
131+
self._relations_match_enabled = relations_match_enabled
130132

131133
# Maps strings of e.g. 'content.body' -> event["content"]["body"]
132134
self._value_cache = _flatten_dict(event)
@@ -190,7 +192,10 @@ def matches(
190192
return _sender_notification_permission(
191193
self._event, condition, self._sender_power_level, self._power_levels
192194
)
193-
elif condition["kind"] == "org.matrix.msc3772.relation_match":
195+
elif (
196+
condition["kind"] == "org.matrix.msc3772.relation_match"
197+
and self._relations_match_enabled
198+
):
194199
return self._relation_match(condition, user_id)
195200
else:
196201
return True

synapse/storage/databases/main/push_rule.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ def _is_experimental_rule_enabled(
5454
and not experimental_config.msc3786_enabled
5555
):
5656
return False
57+
if (
58+
rule_id == "global/underride/.org.matrix.msc3772.thread_reply"
59+
and not experimental_config.msc3772_enabled
60+
):
61+
return False
5762
return True
5863

5964

tests/push/test_push_rule_evaluator.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727

2828
class PushRuleEvaluatorTestCase(unittest.TestCase):
2929
def _get_evaluator(
30-
self, content: JsonDict, relations: Optional[Set[Tuple[str, str, str]]] = None
30+
self,
31+
content: JsonDict,
32+
relations: Optional[Set[Tuple[str, str, str]]] = None,
33+
relations_match_enabled: bool = False,
3134
) -> PushRuleEvaluatorForEvent:
3235
event = FrozenEvent(
3336
{
@@ -49,6 +52,7 @@ def _get_evaluator(
4952
sender_power_level,
5053
power_levels,
5154
relations or set(),
55+
relations_match_enabled,
5256
)
5357

5458
def test_display_name(self) -> None:
@@ -285,9 +289,19 @@ def test_tweaks_for_actions(self) -> None:
285289

286290
def test_relation_match(self) -> None:
287291
"""Test the relation_match push rule kind."""
292+
293+
# Check if the experimental feature is disabled.
288294
evaluator = self._get_evaluator(
289295
{}, {("m.annotation", "@user:test", "m.reaction")}
290296
)
297+
condition = {"kind": "relation_match"}
298+
# Oddly, an unknown condition always matches.
299+
self.assertTrue(evaluator.matches(condition, "@user:test", "foo"))
300+
301+
# A push rule evaluator with the experimental rule enabled.
302+
evaluator = self._get_evaluator(
303+
{}, {("m.annotation", "@user:test", "m.reaction")}, True
304+
)
291305

292306
# Check just relation type.
293307
condition = {

0 commit comments

Comments
 (0)