diff options
author | Patrick Cloke <clokep@users.noreply.github.com> | 2020-05-14 12:38:17 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-14 12:38:17 -0400 |
commit | fef3ff5cc42e91cc31d61094c4db2638532a53a4 (patch) | |
tree | af189cbb4e783ae9811b95ec4ad4a06f704d89c6 /synapse/event_auth.py | |
parent | Workaround for failure to wrap reason in Failure (#7473) (diff) | |
download | synapse-fef3ff5cc42e91cc31d61094c4db2638532a53a4.tar.xz |
Enforce MSC2209: auth rules for notifications in power level event (#7502)
In a new room version, the "notifications" key of power level events are subject to restricted auth rules.
Diffstat (limited to 'synapse/event_auth.py')
-rw-r--r-- | synapse/event_auth.py | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/synapse/event_auth.py b/synapse/event_auth.py index 46beb5334f..5a5b568a95 100644 --- a/synapse/event_auth.py +++ b/synapse/event_auth.py @@ -181,7 +181,7 @@ def check( _can_send_event(event, auth_events) if event.type == EventTypes.PowerLevels: - _check_power_levels(event, auth_events) + _check_power_levels(room_version_obj, event, auth_events) if event.type == EventTypes.Redaction: check_redaction(room_version_obj, event, auth_events) @@ -442,7 +442,7 @@ def check_redaction(room_version_obj: RoomVersion, event, auth_events): raise AuthError(403, "You don't have permission to redact events") -def _check_power_levels(event, auth_events): +def _check_power_levels(room_version_obj, event, auth_events): user_list = event.content.get("users", {}) # Validate users for k, v in user_list.items(): @@ -484,6 +484,14 @@ def _check_power_levels(event, auth_events): for ev_id in set(list(old_list) + list(new_list)): levels_to_check.append((ev_id, "events")) + # MSC2209 specifies these checks should also be done for the "notifications" + # key. + if room_version_obj.limit_notifications_power_levels: + old_list = current_state.content.get("notifications", {}) + new_list = event.content.get("notifications", {}) + for ev_id in set(list(old_list) + list(new_list)): + levels_to_check.append((ev_id, "notifications")) + old_state = current_state.content new_state = event.content |