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

Don't ignore set_tweak actions with no explicit value. #7766

Merged
merged 4 commits into from
Jul 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/7766.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix to not ignore `set_tweak` actions in Push Rules that have no `value`, as permitted by the specification.
31 changes: 27 additions & 4 deletions synapse/push/push_rule_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

import logging
import re
from typing import Pattern
from typing import Any, Dict, List, Pattern, Union

from synapse.events import EventBase
from synapse.types import UserID
Expand Down Expand Up @@ -72,13 +72,36 @@ def _test_ineq_condition(condition, number):
return False


def tweaks_for_actions(actions):
def tweaks_for_actions(actions: List[Union[str, Dict]]) -> Dict[str, Any]:
"""
Converts a list of actions into a `tweaks` dict (which can then be passed to
the push gateway).

This function ignores all actions other than `set_tweak` actions, and treats
absent `value`s as `True`, which agrees with the only spec-defined treatment
of absent `value`s (namely, for `highlight` tweaks).

Args:
actions: list of actions
e.g. [
{"set_tweak": "a", "value": "AAA"},
{"set_tweak": "b", "value": "BBB"},
{"set_tweak": "highlight"},
"notify"
]

Returns:
dictionary of tweaks for those actions
e.g. {"a": "AAA", "b": "BBB", "highlight": True}
"""
tweaks = {}
for a in actions:
if not isinstance(a, dict):
continue
if "set_tweak" in a and "value" in a:
tweaks[a["set_tweak"]] = a["value"]
if "set_tweak" in a:
# value is allowed to be absent in which case the value assumed
# should be True.
tweaks[a["set_tweak"]] = a.get("value", True)
return tweaks


Expand Down
17 changes: 17 additions & 0 deletions tests/push/test_push_rule_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

from synapse.api.room_versions import RoomVersions
from synapse.events import FrozenEvent
from synapse.push import push_rule_evaluator
from synapse.push.push_rule_evaluator import PushRuleEvaluatorForEvent

from tests import unittest
Expand Down Expand Up @@ -84,3 +85,19 @@ def test_invalid_body(self):
for body in (1, True, {"foo": "bar"}):
evaluator = self._get_evaluator({"body": body})
self.assertFalse(evaluator.matches(condition, "@user:test", "foo"))

def test_tweaks_for_actions(self):
"""
This tests the behaviour of tweaks_for_actions.
"""

actions = [
{"set_tweak": "sound", "value": "default"},
{"set_tweak": "highlight"},
"notify",
]

self.assertEqual(
push_rule_evaluator.tweaks_for_actions(actions),
{"sound": "default", "highlight": True},
)