mirror of
https://github.com/element-hq/synapse
synced 2024-10-05 13:02:41 +00:00
Support MSC3779
This commit is contained in:
parent
27756c9fdf
commit
e038f4779f
2 changed files with 43 additions and 3 deletions
|
@ -320,6 +320,26 @@ class RoomVersions:
|
|||
enforce_int_power_levels=True,
|
||||
msc3931_push_features=(PushRuleRoomFlag.EXTENSIBLE_EVENTS,),
|
||||
)
|
||||
MSC3779v10 = RoomVersion(
|
||||
# MSC3779 ("Owned" state events) based on room version "10"
|
||||
"org.matrix.msc3779.10",
|
||||
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,
|
||||
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,
|
||||
knock_restricted_join_rule=True,
|
||||
enforce_int_power_levels=True,
|
||||
msc3931_push_features=(),
|
||||
)
|
||||
V11 = RoomVersion(
|
||||
"11",
|
||||
RoomDisposition.STABLE,
|
||||
|
@ -355,6 +375,7 @@ KNOWN_ROOM_VERSIONS: Dict[str, RoomVersion] = {
|
|||
RoomVersions.V9,
|
||||
RoomVersions.V10,
|
||||
RoomVersions.V11,
|
||||
RoomVersions.MSC3779v10,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -388,6 +388,7 @@ LENIENT_EVENT_BYTE_LIMITS_ROOM_VERSIONS = {
|
|||
RoomVersions.V9,
|
||||
RoomVersions.V10,
|
||||
RoomVersions.MSC1767v10,
|
||||
RoomVersions.MSC3779v10,
|
||||
}
|
||||
|
||||
|
||||
|
@ -753,7 +754,10 @@ def _check_joined_room(
|
|||
|
||||
|
||||
def get_send_level(
|
||||
etype: str, state_key: Optional[str], power_levels_event: Optional["EventBase"]
|
||||
etype: str,
|
||||
state_key: Optional[str],
|
||||
power_levels_event: Optional["EventBase"],
|
||||
msc_3779_sender: Optional[str] = None,
|
||||
) -> int:
|
||||
"""Get the power level required to send an event of a given type
|
||||
|
||||
|
@ -767,6 +771,8 @@ def get_send_level(
|
|||
a state event.
|
||||
power_levels_event: power levels event
|
||||
in force at this point in the room
|
||||
msc_3779_sender: MXID of the user who sent the event.
|
||||
Only for rooms with MSC3779 ("owned" state events) applied.
|
||||
Returns:
|
||||
power level required to send this event.
|
||||
"""
|
||||
|
@ -781,7 +787,15 @@ def get_send_level(
|
|||
|
||||
# otherwise, fall back to the state_default/events_default.
|
||||
if send_level is None:
|
||||
if state_key is not None:
|
||||
is_owned_state_event = (
|
||||
msc_3779_sender is not None
|
||||
and state_key is not None
|
||||
and (
|
||||
state_key == msc_3779_sender
|
||||
or state_key.startswith(msc_3779_sender + "_")
|
||||
)
|
||||
)
|
||||
if state_key is not None and not is_owned_state_event:
|
||||
send_level = power_levels_content.get("state_default", 50)
|
||||
else:
|
||||
send_level = power_levels_content.get("events_default", 0)
|
||||
|
@ -792,7 +806,12 @@ def get_send_level(
|
|||
def _can_send_event(event: "EventBase", auth_events: StateMap["EventBase"]) -> bool:
|
||||
power_levels_event = get_power_level_event(auth_events)
|
||||
|
||||
send_level = get_send_level(event.type, event.get("state_key"), power_levels_event)
|
||||
send_level = get_send_level(
|
||||
event.type,
|
||||
event.get("state_key"),
|
||||
power_levels_event,
|
||||
event.user_id if event.room_version is RoomVersions.MSC3779v10 else None,
|
||||
)
|
||||
user_level = get_user_power_level(event.user_id, auth_events)
|
||||
|
||||
if user_level < send_level:
|
||||
|
|
Loading…
Reference in a new issue