mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-07-23 20:20:38 -04:00
Handle malformed values of notification.room
in power level events (#14942)
* Better test for bad values in power levels events The previous test only checked that Synapse didn't raise an exception, but didn't check that we had correctly interpreted the value of the dodgy power level. It also conflated two things: bad room notification levels, and bad user levels. There _is_ logic for converting the latter to integers, but we should test it separately. * Check we ignore types that don't convert to int * Handle `None` values in `notifications.room` * Changelog * Also test that bad values are rejected by event auth * Docstring * linter scripttttttttt
This commit is contained in:
parent
43c7d814e6
commit
510d4b06e7
4 changed files with 127 additions and 16 deletions
|
@ -69,6 +69,9 @@ STATE_EVENT_TYPES_TO_MARK_UNREAD = {
|
|||
}
|
||||
|
||||
|
||||
SENTINEL = object()
|
||||
|
||||
|
||||
def _should_count_as_unread(event: EventBase, context: EventContext) -> bool:
|
||||
# Exclude rejected and soft-failed events.
|
||||
if context.rejected or event.internal_metadata.is_soft_failed():
|
||||
|
@ -343,11 +346,21 @@ class BulkPushRuleEvaluator:
|
|||
related_events = await self._related_events(event)
|
||||
|
||||
# It's possible that old room versions have non-integer power levels (floats or
|
||||
# strings). Workaround this by explicitly converting to int.
|
||||
# strings; even the occasional `null`). For old rooms, we interpret these as if
|
||||
# they were integers. Do this here for the `@room` power level threshold.
|
||||
# Note that this is done automatically for the sender's power level by
|
||||
# _get_power_levels_and_sender_level in its call to get_user_power_level
|
||||
# (even for room V10.)
|
||||
notification_levels = power_levels.get("notifications", {})
|
||||
if not event.room_version.msc3667_int_only_power_levels:
|
||||
for user_id, level in notification_levels.items():
|
||||
notification_levels[user_id] = int(level)
|
||||
keys = list(notification_levels.keys())
|
||||
for key in keys:
|
||||
level = notification_levels.get(key, SENTINEL)
|
||||
if level is not SENTINEL and type(level) is not int:
|
||||
try:
|
||||
notification_levels[key] = int(level)
|
||||
except (TypeError, ValueError):
|
||||
del notification_levels[key]
|
||||
|
||||
# Pull out any user and room mentions.
|
||||
mentions = event.content.get(EventContentFields.MSC3952_MENTIONS)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue