mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-12 18:52:11 -04:00
Support for MSC3758: exact_event_match push condition (#14964)
This specifies to search for an exact value match, instead of string globbing. It only works across non-compound JSON values (null, boolean, integer, and strings).
This commit is contained in:
parent
cf5233b783
commit
14be78d492
9 changed files with 356 additions and 41 deletions
|
@ -43,6 +43,7 @@ from synapse.events.snapshot import EventContext
|
|||
from synapse.state import POWER_KEY
|
||||
from synapse.storage.databases.main.roommember import EventIdMembership
|
||||
from synapse.synapse_rust.push import FilteredPushRules, PushRuleEvaluator
|
||||
from synapse.types import SimpleJsonValue
|
||||
from synapse.types.state import StateFilter
|
||||
from synapse.util.caches import register_cache
|
||||
from synapse.util.metrics import measure_func
|
||||
|
@ -256,13 +257,15 @@ class BulkPushRuleEvaluator:
|
|||
|
||||
return pl_event.content if pl_event else {}, sender_level
|
||||
|
||||
async def _related_events(self, event: EventBase) -> Dict[str, Dict[str, str]]:
|
||||
async def _related_events(
|
||||
self, event: EventBase
|
||||
) -> Dict[str, Dict[str, SimpleJsonValue]]:
|
||||
"""Fetches the related events for 'event'. Sets the im.vector.is_falling_back key if the event is from a fallback relation
|
||||
|
||||
Returns:
|
||||
Mapping of relation type to flattened events.
|
||||
"""
|
||||
related_events: Dict[str, Dict[str, str]] = {}
|
||||
related_events: Dict[str, Dict[str, SimpleJsonValue]] = {}
|
||||
if self._related_event_match_enabled:
|
||||
related_event_id = event.content.get("m.relates_to", {}).get("event_id")
|
||||
relation_type = event.content.get("m.relates_to", {}).get("rel_type")
|
||||
|
@ -425,6 +428,7 @@ class BulkPushRuleEvaluator:
|
|||
self._related_event_match_enabled,
|
||||
event.room_version.msc3931_push_features,
|
||||
self.hs.config.experimental.msc1767_enabled, # MSC3931 flag
|
||||
self.hs.config.experimental.msc3758_exact_event_match,
|
||||
)
|
||||
|
||||
users = rules_by_user.keys()
|
||||
|
@ -501,15 +505,15 @@ StateGroup = Union[object, int]
|
|||
def _flatten_dict(
|
||||
d: Union[EventBase, Mapping[str, Any]],
|
||||
prefix: Optional[List[str]] = None,
|
||||
result: Optional[Dict[str, str]] = None,
|
||||
result: Optional[Dict[str, SimpleJsonValue]] = None,
|
||||
*,
|
||||
msc3783_escape_event_match_key: bool = False,
|
||||
) -> Dict[str, str]:
|
||||
) -> Dict[str, SimpleJsonValue]:
|
||||
"""
|
||||
Given a JSON dictionary (or event) which might contain sub dictionaries,
|
||||
flatten it into a single layer dictionary by combining the keys & sub-keys.
|
||||
|
||||
Any (non-dictionary), non-string value is dropped.
|
||||
String, integer, boolean, and null values are kept. All others are dropped.
|
||||
|
||||
Transforms:
|
||||
|
||||
|
@ -538,8 +542,8 @@ def _flatten_dict(
|
|||
# nested fields.
|
||||
key = key.replace("\\", "\\\\").replace(".", "\\.")
|
||||
|
||||
if isinstance(value, str):
|
||||
result[".".join(prefix + [key])] = value.lower()
|
||||
if isinstance(value, (bool, str)) or type(value) is int or value is None:
|
||||
result[".".join(prefix + [key])] = value
|
||||
elif isinstance(value, Mapping):
|
||||
# do not set `room_version` due to recursion considerations below
|
||||
_flatten_dict(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue