And fix a bug in the implementation of the updated redaction format (MSC2174) where the top-level redacts field was not properly added for backwards-compatibility.tags/v1.89.0rc1
@@ -0,0 +1 @@ | |||
Support room version 11 from [MSC3820](https://github.com/matrix-org/matrix-spec-proposals/pull/3820). |
@@ -214,7 +214,7 @@ fi | |||
extra_test_args=() | |||
test_tags="synapse_blacklist,msc3787,msc3874,msc3890,msc3391,msc3930,faster_joins" | |||
test_tags="synapse_blacklist,msc3874,msc3890,msc3391,msc3930,faster_joins" | |||
# All environment variables starting with PASS_ will be shared. | |||
# (The prefix is stripped off before reaching the container.) | |||
@@ -78,36 +78,29 @@ class RoomVersion: | |||
# MSC2209: Check 'notifications' key while verifying | |||
# m.room.power_levels auth rules. | |||
limit_notifications_power_levels: bool | |||
# MSC2175: No longer include the creator in m.room.create events. | |||
msc2175_implicit_room_creator: bool | |||
# MSC2174/MSC2176: Apply updated redaction rules algorithm, move redacts to | |||
# content property. | |||
msc2176_redaction_rules: bool | |||
# MSC3083: Support the 'restricted' join_rule. | |||
msc3083_join_rules: bool | |||
# MSC3375: Support for the proper redaction rules for MSC3083. This mustn't | |||
# be enabled if MSC3083 is not. | |||
msc3375_redaction_rules: bool | |||
# MSC2403: Allows join_rules to be set to 'knock', changes auth rules to allow sending | |||
# m.room.membership event with membership 'knock'. | |||
msc2403_knocking: bool | |||
# No longer include the creator in m.room.create events. | |||
implicit_room_creator: bool | |||
# Apply updated redaction rules algorithm from room version 11. | |||
updated_redaction_rules: bool | |||
# Support the 'restricted' join rule. | |||
restricted_join_rule: bool | |||
# Support for the proper redaction rules for the restricted join rule. This requires | |||
# restricted_join_rule to be enabled. | |||
restricted_join_rule_fix: bool | |||
# Support the 'knock' join rule. | |||
knock_join_rule: bool | |||
# MSC3389: Protect relation information from redaction. | |||
msc3389_relation_redactions: bool | |||
# MSC3787: Adds support for a `knock_restricted` join rule, mixing concepts of | |||
# knocks and restricted join rules into the same join condition. | |||
msc3787_knock_restricted_join_rule: bool | |||
# MSC3667: Enforce integer power levels | |||
msc3667_int_only_power_levels: bool | |||
# MSC3821: Do not redact the third_party_invite content field for membership events. | |||
msc3821_redaction_rules: bool | |||
# Support the 'knock_restricted' join rule. | |||
knock_restricted_join_rule: bool | |||
# Enforce integer power levels | |||
enforce_int_power_levels: bool | |||
# MSC3931: Adds a push rule condition for "room version feature flags", making | |||
# some push rules room version dependent. Note that adding a flag to this list | |||
# is not enough to mark it "supported": the push rule evaluator also needs to | |||
# support the flag. Unknown flags are ignored by the evaluator, making conditions | |||
# fail if used. | |||
msc3931_push_features: Tuple[str, ...] # values from PushRuleRoomFlag | |||
# MSC3989: Redact the origin field. | |||
msc3989_redaction_rules: bool | |||
class RoomVersions: | |||
@@ -120,17 +113,15 @@ class RoomVersions: | |||
special_case_aliases_auth=True, | |||
strict_canonicaljson=False, | |||
limit_notifications_power_levels=False, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=False, | |||
msc3375_redaction_rules=False, | |||
msc2403_knocking=False, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=False, | |||
restricted_join_rule_fix=False, | |||
knock_join_rule=False, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
knock_restricted_join_rule=False, | |||
enforce_int_power_levels=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
V2 = RoomVersion( | |||
"2", | |||
@@ -141,17 +132,15 @@ class RoomVersions: | |||
special_case_aliases_auth=True, | |||
strict_canonicaljson=False, | |||
limit_notifications_power_levels=False, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=False, | |||
msc3375_redaction_rules=False, | |||
msc2403_knocking=False, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=False, | |||
restricted_join_rule_fix=False, | |||
knock_join_rule=False, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
knock_restricted_join_rule=False, | |||
enforce_int_power_levels=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
V3 = RoomVersion( | |||
"3", | |||
@@ -162,17 +151,15 @@ class RoomVersions: | |||
special_case_aliases_auth=True, | |||
strict_canonicaljson=False, | |||
limit_notifications_power_levels=False, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=False, | |||
msc3375_redaction_rules=False, | |||
msc2403_knocking=False, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=False, | |||
restricted_join_rule_fix=False, | |||
knock_join_rule=False, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
knock_restricted_join_rule=False, | |||
enforce_int_power_levels=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
V4 = RoomVersion( | |||
"4", | |||
@@ -183,17 +170,15 @@ class RoomVersions: | |||
special_case_aliases_auth=True, | |||
strict_canonicaljson=False, | |||
limit_notifications_power_levels=False, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=False, | |||
msc3375_redaction_rules=False, | |||
msc2403_knocking=False, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=False, | |||
restricted_join_rule_fix=False, | |||
knock_join_rule=False, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
knock_restricted_join_rule=False, | |||
enforce_int_power_levels=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
V5 = RoomVersion( | |||
"5", | |||
@@ -204,17 +189,15 @@ class RoomVersions: | |||
special_case_aliases_auth=True, | |||
strict_canonicaljson=False, | |||
limit_notifications_power_levels=False, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=False, | |||
msc3375_redaction_rules=False, | |||
msc2403_knocking=False, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=False, | |||
restricted_join_rule_fix=False, | |||
knock_join_rule=False, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
knock_restricted_join_rule=False, | |||
enforce_int_power_levels=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
V6 = RoomVersion( | |||
"6", | |||
@@ -225,38 +208,15 @@ class RoomVersions: | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=False, | |||
msc3375_redaction_rules=False, | |||
msc2403_knocking=False, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=False, | |||
restricted_join_rule_fix=False, | |||
knock_join_rule=False, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
knock_restricted_join_rule=False, | |||
enforce_int_power_levels=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
MSC2176 = RoomVersion( | |||
"org.matrix.msc2176", | |||
RoomDisposition.UNSTABLE, | |||
EventFormatVersions.ROOM_V4_PLUS, | |||
StateResolutionVersions.V2, | |||
enforce_key_validity=True, | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=True, | |||
msc3083_join_rules=False, | |||
msc3375_redaction_rules=False, | |||
msc2403_knocking=False, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
V7 = RoomVersion( | |||
"7", | |||
@@ -267,17 +227,15 @@ class RoomVersions: | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=False, | |||
msc3375_redaction_rules=False, | |||
msc2403_knocking=True, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=False, | |||
restricted_join_rule_fix=False, | |||
knock_join_rule=True, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
knock_restricted_join_rule=False, | |||
enforce_int_power_levels=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
V8 = RoomVersion( | |||
"8", | |||
@@ -288,17 +246,15 @@ class RoomVersions: | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=True, | |||
msc3375_redaction_rules=False, | |||
msc2403_knocking=True, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=True, | |||
restricted_join_rule_fix=False, | |||
knock_join_rule=True, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
knock_restricted_join_rule=False, | |||
enforce_int_power_levels=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
V9 = RoomVersion( | |||
"9", | |||
@@ -309,59 +265,15 @@ class RoomVersions: | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=True, | |||
msc3375_redaction_rules=True, | |||
msc2403_knocking=True, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
MSC3787 = RoomVersion( | |||
"org.matrix.msc3787", | |||
RoomDisposition.UNSTABLE, | |||
EventFormatVersions.ROOM_V4_PLUS, | |||
StateResolutionVersions.V2, | |||
enforce_key_validity=True, | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=True, | |||
msc3375_redaction_rules=True, | |||
msc2403_knocking=True, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=True, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
MSC3821 = RoomVersion( | |||
"org.matrix.msc3821.opt1", | |||
RoomDisposition.UNSTABLE, | |||
EventFormatVersions.ROOM_V4_PLUS, | |||
StateResolutionVersions.V2, | |||
enforce_key_validity=True, | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=True, | |||
msc3375_redaction_rules=True, | |||
msc2403_knocking=True, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=True, | |||
restricted_join_rule_fix=True, | |||
knock_join_rule=True, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=False, | |||
msc3667_int_only_power_levels=False, | |||
msc3821_redaction_rules=True, | |||
knock_restricted_join_rule=False, | |||
enforce_int_power_levels=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
V10 = RoomVersion( | |||
"10", | |||
@@ -372,17 +284,15 @@ class RoomVersions: | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=True, | |||
msc3375_redaction_rules=True, | |||
msc2403_knocking=True, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=True, | |||
restricted_join_rule_fix=True, | |||
knock_join_rule=True, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=True, | |||
msc3667_int_only_power_levels=True, | |||
msc3821_redaction_rules=False, | |||
knock_restricted_join_rule=True, | |||
enforce_int_power_levels=True, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=False, | |||
) | |||
MSC1767v10 = RoomVersion( | |||
# MSC1767 (Extensible Events) based on room version "10" | |||
@@ -394,60 +304,34 @@ class RoomVersions: | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=True, | |||
msc3375_redaction_rules=True, | |||
msc2403_knocking=True, | |||
implicit_room_creator=False, | |||
updated_redaction_rules=False, | |||
restricted_join_rule=True, | |||
restricted_join_rule_fix=True, | |||
knock_join_rule=True, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=True, | |||
msc3667_int_only_power_levels=True, | |||
msc3821_redaction_rules=False, | |||
knock_restricted_join_rule=True, | |||
enforce_int_power_levels=True, | |||
msc3931_push_features=(PushRuleRoomFlag.EXTENSIBLE_EVENTS,), | |||
msc3989_redaction_rules=False, | |||
) | |||
MSC3989 = RoomVersion( | |||
"org.matrix.msc3989", | |||
RoomDisposition.UNSTABLE, | |||
EventFormatVersions.ROOM_V4_PLUS, | |||
StateResolutionVersions.V2, | |||
enforce_key_validity=True, | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=False, | |||
msc2176_redaction_rules=False, | |||
msc3083_join_rules=True, | |||
msc3375_redaction_rules=True, | |||
msc2403_knocking=True, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=True, | |||
msc3667_int_only_power_levels=True, | |||
msc3821_redaction_rules=False, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=True, | |||
) | |||
MSC3820opt2 = RoomVersion( | |||
# Based upon v10 | |||
"org.matrix.msc3820.opt2", | |||
RoomDisposition.UNSTABLE, | |||
V11 = RoomVersion( | |||
"11", | |||
RoomDisposition.STABLE, | |||
EventFormatVersions.ROOM_V4_PLUS, | |||
StateResolutionVersions.V2, | |||
enforce_key_validity=True, | |||
special_case_aliases_auth=False, | |||
strict_canonicaljson=True, | |||
limit_notifications_power_levels=True, | |||
msc2175_implicit_room_creator=True, # Used by MSC3820 | |||
msc2176_redaction_rules=True, # Used by MSC3820 | |||
msc3083_join_rules=True, | |||
msc3375_redaction_rules=True, | |||
msc2403_knocking=True, | |||
implicit_room_creator=True, # Used by MSC3820 | |||
updated_redaction_rules=True, # Used by MSC3820 | |||
restricted_join_rule=True, | |||
restricted_join_rule_fix=True, | |||
knock_join_rule=True, | |||
msc3389_relation_redactions=False, | |||
msc3787_knock_restricted_join_rule=True, | |||
msc3667_int_only_power_levels=True, | |||
msc3821_redaction_rules=True, # Used by MSC3820 | |||
knock_restricted_join_rule=True, | |||
enforce_int_power_levels=True, | |||
msc3931_push_features=(), | |||
msc3989_redaction_rules=True, # Used by MSC3820 | |||
) | |||
@@ -460,14 +344,11 @@ KNOWN_ROOM_VERSIONS: Dict[str, RoomVersion] = { | |||
RoomVersions.V4, | |||
RoomVersions.V5, | |||
RoomVersions.V6, | |||
RoomVersions.MSC2176, | |||
RoomVersions.V7, | |||
RoomVersions.V8, | |||
RoomVersions.V9, | |||
RoomVersions.MSC3787, | |||
RoomVersions.V10, | |||
RoomVersions.MSC3989, | |||
RoomVersions.MSC3820opt2, | |||
RoomVersions.V11, | |||
) | |||
} | |||
@@ -496,12 +377,12 @@ MSC3244_CAPABILITIES = { | |||
RoomVersionCapability( | |||
"knock", | |||
RoomVersions.V7, | |||
lambda room_version: room_version.msc2403_knocking, | |||
lambda room_version: room_version.knock_join_rule, | |||
), | |||
RoomVersionCapability( | |||
"restricted", | |||
RoomVersions.V9, | |||
lambda room_version: room_version.msc3083_join_rules, | |||
lambda room_version: room_version.restricted_join_rule, | |||
), | |||
) | |||
} |
@@ -126,7 +126,7 @@ def validate_event_for_room_version(event: "EventBase") -> None: | |||
raise AuthError(403, "Event not signed by sending server") | |||
is_invite_via_allow_rule = ( | |||
event.room_version.msc3083_join_rules | |||
event.room_version.restricted_join_rule | |||
and event.type == EventTypes.Member | |||
and event.membership == Membership.JOIN | |||
and EventContentFields.AUTHORISING_USER in event.content | |||
@@ -352,11 +352,9 @@ LENIENT_EVENT_BYTE_LIMITS_ROOM_VERSIONS = { | |||
RoomVersions.V4, | |||
RoomVersions.V5, | |||
RoomVersions.V6, | |||
RoomVersions.MSC2176, | |||
RoomVersions.V7, | |||
RoomVersions.V8, | |||
RoomVersions.V9, | |||
RoomVersions.MSC3787, | |||
RoomVersions.V10, | |||
RoomVersions.MSC1767v10, | |||
} | |||
@@ -449,7 +447,7 @@ def _check_create(event: "EventBase") -> None: | |||
# 1.4 If content has no creator field, reject if the room version requires it. | |||
if ( | |||
not event.room_version.msc2175_implicit_room_creator | |||
not event.room_version.implicit_room_creator | |||
and EventContentFields.ROOM_CREATOR not in event.content | |||
): | |||
raise AuthError(403, "Create event lacks a 'creator' property") | |||
@@ -486,7 +484,7 @@ def _is_membership_change_allowed( | |||
key = (EventTypes.Create, "") | |||
create = auth_events.get(key) | |||
if create and event.prev_event_ids()[0] == create.event_id: | |||
if room_version.msc2175_implicit_room_creator: | |||
if room_version.implicit_room_creator: | |||
creator = create.sender | |||
else: | |||
creator = create.content[EventContentFields.ROOM_CREATOR] | |||
@@ -509,7 +507,7 @@ def _is_membership_change_allowed( | |||
caller_invited = caller and caller.membership == Membership.INVITE | |||
caller_knocked = ( | |||
caller | |||
and room_version.msc2403_knocking | |||
and room_version.knock_join_rule | |||
and caller.membership == Membership.KNOCK | |||
) | |||
@@ -609,9 +607,9 @@ def _is_membership_change_allowed( | |||
elif join_rule == JoinRules.PUBLIC: | |||
pass | |||
elif ( | |||
room_version.msc3083_join_rules and join_rule == JoinRules.RESTRICTED | |||
room_version.restricted_join_rule and join_rule == JoinRules.RESTRICTED | |||
) or ( | |||
room_version.msc3787_knock_restricted_join_rule | |||
room_version.knock_restricted_join_rule | |||
and join_rule == JoinRules.KNOCK_RESTRICTED | |||
): | |||
# This is the same as public, but the event must contain a reference | |||
@@ -641,9 +639,9 @@ def _is_membership_change_allowed( | |||
elif ( | |||
join_rule == JoinRules.INVITE | |||
or (room_version.msc2403_knocking and join_rule == JoinRules.KNOCK) | |||
or (room_version.knock_join_rule and join_rule == JoinRules.KNOCK) | |||
or ( | |||
room_version.msc3787_knock_restricted_join_rule | |||
room_version.knock_restricted_join_rule | |||
and join_rule == JoinRules.KNOCK_RESTRICTED | |||
) | |||
): | |||
@@ -677,9 +675,9 @@ def _is_membership_change_allowed( | |||
"You don't have permission to ban", | |||
errcode=Codes.INSUFFICIENT_POWER, | |||
) | |||
elif room_version.msc2403_knocking and Membership.KNOCK == membership: | |||
elif room_version.knock_join_rule and Membership.KNOCK == membership: | |||
if join_rule != JoinRules.KNOCK and ( | |||
not room_version.msc3787_knock_restricted_join_rule | |||
not room_version.knock_restricted_join_rule | |||
or join_rule != JoinRules.KNOCK_RESTRICTED | |||
): | |||
raise AuthError(403, "You don't have permission to knock") | |||
@@ -836,7 +834,7 @@ def _check_power_levels( | |||
# Reject events with stringy power levels if required by room version | |||
if ( | |||
event.type == EventTypes.PowerLevels | |||
and room_version_obj.msc3667_int_only_power_levels | |||
and room_version_obj.enforce_int_power_levels | |||
): | |||
for k, v in event.content.items(): | |||
if k in { | |||
@@ -972,7 +970,7 @@ def get_user_power_level(user_id: str, auth_events: StateMap["EventBase"]) -> in | |||
key = (EventTypes.Create, "") | |||
create_event = auth_events.get(key) | |||
if create_event is not None: | |||
if create_event.room_version.msc2175_implicit_room_creator: | |||
if create_event.room_version.implicit_room_creator: | |||
creator = create_event.sender | |||
else: | |||
creator = create_event.content[EventContentFields.ROOM_CREATOR] | |||
@@ -1110,7 +1108,7 @@ def auth_types_for_event( | |||
) | |||
auth_types.add(key) | |||
if room_version.msc3083_join_rules and membership == Membership.JOIN: | |||
if room_version.restricted_join_rule and membership == Membership.JOIN: | |||
if EventContentFields.AUTHORISING_USER in event.content: | |||
key = ( | |||
EventTypes.Member, | |||
@@ -346,7 +346,7 @@ class EventBase(metaclass=abc.ABCMeta): | |||
@property | |||
def redacts(self) -> Optional[str]: | |||
"""MSC2176 moved the redacts field into the content.""" | |||
if self.room_version.msc2176_redaction_rules: | |||
if self.room_version.updated_redaction_rules: | |||
return self.content.get("redacts") | |||
return self.get("redacts") | |||
@@ -175,7 +175,7 @@ class EventBuilder: | |||
# MSC2174 moves the redacts property to the content, it is invalid to | |||
# provide it as a top-level property. | |||
if self._redacts is not None and not self.room_version.msc2176_redaction_rules: | |||
if self._redacts is not None and not self.room_version.updated_redaction_rules: | |||
event_dict["redacts"] = self._redacts | |||
if self._origin_server_ts is not None: | |||
@@ -108,13 +108,9 @@ def prune_event_dict(room_version: RoomVersion, event_dict: JsonDict) -> JsonDic | |||
"origin_server_ts", | |||
] | |||
# Room versions from before MSC2176 had additional allowed keys. | |||
if not room_version.msc2176_redaction_rules: | |||
allowed_keys.extend(["prev_state", "membership"]) | |||
# Room versions before MSC3989 kept the origin field. | |||
if not room_version.msc3989_redaction_rules: | |||
allowed_keys.append("origin") | |||
# Earlier room versions from had additional allowed keys. | |||
if not room_version.updated_redaction_rules: | |||
allowed_keys.extend(["prev_state", "membership", "origin"]) | |||
event_type = event_dict["type"] | |||
@@ -127,9 +123,9 @@ def prune_event_dict(room_version: RoomVersion, event_dict: JsonDict) -> JsonDic | |||
if event_type == EventTypes.Member: | |||
add_fields("membership") | |||
if room_version.msc3375_redaction_rules: | |||
if room_version.restricted_join_rule_fix: | |||
add_fields(EventContentFields.AUTHORISING_USER) | |||
if room_version.msc3821_redaction_rules: | |||
if room_version.updated_redaction_rules: | |||
# Preserve the signed field under third_party_invite. | |||
third_party_invite = event_dict["content"].get("third_party_invite") | |||
if isinstance(third_party_invite, collections.abc.Mapping): | |||
@@ -141,13 +137,13 @@ def prune_event_dict(room_version: RoomVersion, event_dict: JsonDict) -> JsonDic | |||
elif event_type == EventTypes.Create: | |||
# MSC2176 rules state that create events cannot be redacted. | |||
if room_version.msc2176_redaction_rules: | |||
if room_version.updated_redaction_rules: | |||
return event_dict | |||
add_fields("creator") | |||
elif event_type == EventTypes.JoinRules: | |||
add_fields("join_rule") | |||
if room_version.msc3083_join_rules: | |||
if room_version.restricted_join_rule: | |||
add_fields("allow") | |||
elif event_type == EventTypes.PowerLevels: | |||
add_fields( | |||
@@ -161,14 +157,14 @@ def prune_event_dict(room_version: RoomVersion, event_dict: JsonDict) -> JsonDic | |||
"redact", | |||
) | |||
if room_version.msc2176_redaction_rules: | |||
if room_version.updated_redaction_rules: | |||
add_fields("invite") | |||
elif event_type == EventTypes.Aliases and room_version.special_case_aliases_auth: | |||
add_fields("aliases") | |||
elif event_type == EventTypes.RoomHistoryVisibility: | |||
add_fields("history_visibility") | |||
elif event_type == EventTypes.Redaction and room_version.msc2176_redaction_rules: | |||
elif event_type == EventTypes.Redaction and room_version.updated_redaction_rules: | |||
add_fields("redacts") | |||
# Protect the rel_type and event_id fields under the m.relates_to field. | |||
@@ -477,6 +473,15 @@ def serialize_event( | |||
if config.as_client_event: | |||
d = config.event_format(d) | |||
# If the event is a redaction, copy the redacts field from the content to | |||
# top-level for backwards compatibility. | |||
if ( | |||
e.type == EventTypes.Redaction | |||
and e.room_version.updated_redaction_rules | |||
and e.redacts is not None | |||
): | |||
d["redacts"] = e.redacts | |||
only_event_fields = config.only_event_fields | |||
if only_event_fields: | |||
if not isinstance(only_event_fields, list) or not all( | |||
@@ -231,7 +231,7 @@ async def _check_sigs_on_pdu( | |||
# If this is a join event for a restricted room it may have been authorised | |||
# via a different server from the sending server. Check those signatures. | |||
if ( | |||
room_version.msc3083_join_rules | |||
room_version.restricted_join_rule | |||
and pdu.type == EventTypes.Member | |||
and pdu.membership == Membership.JOIN | |||
and EventContentFields.AUTHORISING_USER in pdu.content | |||
@@ -983,7 +983,7 @@ class FederationClient(FederationBase): | |||
if not room_version: | |||
raise UnsupportedRoomVersionError() | |||
if not room_version.msc2403_knocking and membership == Membership.KNOCK: | |||
if not room_version.knock_join_rule and membership == Membership.KNOCK: | |||
raise SynapseError( | |||
400, | |||
"This room version does not support knocking", | |||
@@ -1069,7 +1069,7 @@ class FederationClient(FederationBase): | |||
# * Ensure the signatures are good. | |||
# | |||
# Otherwise, fallback to the provided event. | |||
if room_version.msc3083_join_rules and response.event: | |||
if room_version.restricted_join_rule and response.event: | |||
event = response.event | |||
valid_pdu = await self._check_sigs_and_hash_and_fetch_one( | |||
@@ -1195,7 +1195,7 @@ class FederationClient(FederationBase): | |||
# MSC3083 defines additional error codes for room joins. | |||
failover_errcodes = None | |||
if room_version.msc3083_join_rules: | |||
if room_version.restricted_join_rule: | |||
failover_errcodes = ( | |||
Codes.UNABLE_AUTHORISE_JOIN, | |||
Codes.UNABLE_TO_GRANT_JOIN, | |||
@@ -806,7 +806,7 @@ class FederationServer(FederationBase): | |||
raise IncompatibleRoomVersionError(room_version=room_version.identifier) | |||
# Check that this room supports knocking as defined by its room version | |||
if not room_version.msc2403_knocking: | |||
if not room_version.knock_join_rule: | |||
raise SynapseError( | |||
403, | |||
"This room version does not support knocking", | |||
@@ -909,7 +909,7 @@ class FederationServer(FederationBase): | |||
errcode=Codes.NOT_FOUND, | |||
) | |||
if membership_type == Membership.KNOCK and not room_version.msc2403_knocking: | |||
if membership_type == Membership.KNOCK and not room_version.knock_join_rule: | |||
raise SynapseError( | |||
403, | |||
"This room version does not support knocking", | |||
@@ -933,7 +933,7 @@ class FederationServer(FederationBase): | |||
# the event is valid to be sent into the room. Currently this is only done | |||
# if the user is being joined via restricted join rules. | |||
if ( | |||
room_version.msc3083_join_rules | |||
room_version.restricted_join_rule | |||
and event.membership == Membership.JOIN | |||
and EventContentFields.AUTHORISING_USER in event.content | |||
): | |||
@@ -277,7 +277,7 @@ class EventAuthHandler: | |||
True if the proper room version and join rules are set for restricted access. | |||
""" | |||
# This only applies to room versions which support the new join rule. | |||
if not room_version.msc3083_join_rules: | |||
if not room_version.restricted_join_rule: | |||
return False | |||
# If there's no join rule, then it defaults to invite (so this doesn't apply). | |||
@@ -292,7 +292,7 @@ class EventAuthHandler: | |||
return True | |||
# also check for MSC3787 behaviour | |||
if room_version.msc3787_knock_restricted_join_rule: | |||
if room_version.knock_restricted_join_rule: | |||
return content_join_rule == JoinRules.KNOCK_RESTRICTED | |||
return False | |||
@@ -957,7 +957,7 @@ class FederationHandler: | |||
# Note that this requires the /send_join request to come back to the | |||
# same server. | |||
prev_event_ids = None | |||
if room_version.msc3083_join_rules: | |||
if room_version.restricted_join_rule: | |||
# Note that the room's state can change out from under us and render our | |||
# nice join rules-conformant event non-conformant by the time we build the | |||
# event. When this happens, our validation at the end fails and we respond | |||
@@ -1116,7 +1116,7 @@ class RoomCreationHandler: | |||
preset_config, config = self._room_preset_config(room_config) | |||
# MSC2175 removes the creator field from the create event. | |||
if not room_version.msc2175_implicit_room_creator: | |||
if not room_version.implicit_room_creator: | |||
creation_content["creator"] = creator_id | |||
creation_event, unpersisted_creation_context = await create_event( | |||
EventTypes.Create, creation_content, False | |||
@@ -564,9 +564,9 @@ class RoomSummaryHandler: | |||
join_rule = join_rules_event.content.get("join_rule") | |||
if ( | |||
join_rule == JoinRules.PUBLIC | |||
or (room_version.msc2403_knocking and join_rule == JoinRules.KNOCK) | |||
or (room_version.knock_join_rule and join_rule == JoinRules.KNOCK) | |||
or ( | |||
room_version.msc3787_knock_restricted_join_rule | |||
room_version.knock_restricted_join_rule | |||
and join_rule == JoinRules.KNOCK_RESTRICTED | |||
) | |||
): | |||
@@ -375,7 +375,7 @@ class BulkPushRuleEvaluator: | |||
# _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: | |||
if not event.room_version.enforce_int_power_levels: | |||
keys = list(notification_levels.keys()) | |||
for key in keys: | |||
level = notification_levels.get(key, SENTINEL) | |||
@@ -1117,7 +1117,7 @@ class RoomRedactEventRestServlet(TransactionRestServlet): | |||
# Ensure the redacts property in the content matches the one provided in | |||
# the URL. | |||
room_version = await self._store.get_room_version(room_id) | |||
if room_version.msc2176_redaction_rules: | |||
if room_version.updated_redaction_rules: | |||
if "redacts" in content and content["redacts"] != event_id: | |||
raise SynapseError( | |||
400, | |||
@@ -1151,7 +1151,7 @@ class RoomRedactEventRestServlet(TransactionRestServlet): | |||
"sender": requester.user.to_string(), | |||
} | |||
# Earlier room versions had a top-level redacts property. | |||
if not room_version.msc2176_redaction_rules: | |||
if not room_version.updated_redaction_rules: | |||
event_dict["redacts"] = event_id | |||
( | |||
@@ -2136,7 +2136,7 @@ class RoomStore(RoomBackgroundUpdateStore, RoomWorkerStore): | |||
raise StoreError(400, "No create event in state") | |||
# Before MSC2175, the room creator was a separate field. | |||
if not room_version.msc2175_implicit_room_creator: | |||
if not room_version.implicit_room_creator: | |||
room_creator = create_event.content.get(EventContentFields.ROOM_CREATOR) | |||
if not isinstance(room_creator, str): | |||
@@ -140,18 +140,16 @@ class PruneEventTestCase(stdlib_unittest.TestCase): | |||
}, | |||
) | |||
# As of MSC2176 we now redact the membership and prev_states keys. | |||
# As of room versions we now redact the membership, prev_states, and origin keys. | |||
self.run_test( | |||
{"type": "A", "prev_state": "prev_state", "membership": "join"}, | |||
{"type": "A", "content": {}, "signatures": {}, "unsigned": {}}, | |||
room_version=RoomVersions.MSC2176, | |||
) | |||
# As of MSC3989 we now redact the origin key. | |||
self.run_test( | |||
{"type": "A", "origin": "example.com"}, | |||
{ | |||
"type": "A", | |||
"prev_state": "prev_state", | |||
"membership": "join", | |||
"origin": "example.com", | |||
}, | |||
{"type": "A", "content": {}, "signatures": {}, "unsigned": {}}, | |||
room_version=RoomVersions.MSC3989, | |||
room_version=RoomVersions.V11, | |||
) | |||
def test_unsigned(self) -> None: | |||
@@ -236,7 +234,7 @@ class PruneEventTestCase(stdlib_unittest.TestCase): | |||
"signatures": {}, | |||
"unsigned": {}, | |||
}, | |||
room_version=RoomVersions.MSC2176, | |||
room_version=RoomVersions.V11, | |||
) | |||
def test_power_levels(self) -> None: | |||
@@ -286,7 +284,7 @@ class PruneEventTestCase(stdlib_unittest.TestCase): | |||
"signatures": {}, | |||
"unsigned": {}, | |||
}, | |||
room_version=RoomVersions.MSC2176, | |||
room_version=RoomVersions.V11, | |||
) | |||
def test_alias_event(self) -> None: | |||
@@ -349,7 +347,7 @@ class PruneEventTestCase(stdlib_unittest.TestCase): | |||
"signatures": {}, | |||
"unsigned": {}, | |||
}, | |||
room_version=RoomVersions.MSC2176, | |||
room_version=RoomVersions.V11, | |||
) | |||
def test_join_rules(self) -> None: | |||
@@ -472,7 +470,7 @@ class PruneEventTestCase(stdlib_unittest.TestCase): | |||
"signatures": {}, | |||
"unsigned": {}, | |||
}, | |||
room_version=RoomVersions.MSC3821, | |||
room_version=RoomVersions.V11, | |||
) | |||
# Ensure this doesn't break if an invalid field is sent. | |||
@@ -491,7 +489,7 @@ class PruneEventTestCase(stdlib_unittest.TestCase): | |||
"signatures": {}, | |||
"unsigned": {}, | |||
}, | |||
room_version=RoomVersions.MSC3821, | |||
room_version=RoomVersions.V11, | |||
) | |||
self.run_test( | |||
@@ -509,7 +507,7 @@ class PruneEventTestCase(stdlib_unittest.TestCase): | |||
"signatures": {}, | |||
"unsigned": {}, | |||
}, | |||
room_version=RoomVersions.MSC3821, | |||
room_version=RoomVersions.V11, | |||
) | |||
def test_relations(self) -> None: | |||
@@ -20,6 +20,8 @@ from synapse.api.room_versions import RoomVersions | |||
from synapse.rest import admin | |||
from synapse.rest.client import login, room, sync | |||
from synapse.server import HomeServer | |||
from synapse.storage._base import db_to_json | |||
from synapse.storage.database import LoggingTransaction | |||
from synapse.types import JsonDict | |||
from synapse.util import Clock | |||
@@ -573,7 +575,7 @@ class RedactionsTestCase(HomeserverTestCase): | |||
room_id = self.helper.create_room_as( | |||
self.mod_user_id, | |||
tok=self.mod_access_token, | |||
room_version=RoomVersions.MSC2176.identifier, | |||
room_version=RoomVersions.V11.identifier, | |||
) | |||
# Create an event. | |||
@@ -597,5 +599,20 @@ class RedactionsTestCase(HomeserverTestCase): | |||
redact_event = timeline[-1] | |||
self.assertEqual(redact_event["type"], EventTypes.Redaction) | |||
# The redacts key should be in the content. | |||
self.assertNotIn("redacts", redact_event) | |||
self.assertEquals(redact_event["content"]["redacts"], event_id) | |||
# It should also be copied as the top-level redacts field for backwards | |||
# compatibility. | |||
self.assertEquals(redact_event["redacts"], event_id) | |||
# But it isn't actually part of the event. | |||
def get_event(txn: LoggingTransaction) -> JsonDict: | |||
return db_to_json( | |||
main_datastore._fetch_event_rows(txn, [event_id])[event_id].json | |||
) | |||
main_datastore = self.hs.get_datastores().main | |||
event_json = self.get_success( | |||
main_datastore.db_pool.runInteraction("get_event", get_event) | |||
) | |||
self.assertNotIn("redacts", event_json) |