docs-matrix-spec/locales/zh-Hans/rooms/v6.md
2025-04-20 16:13:37 +08:00

9.3 KiB
Raw Blame History

title type weight version
房间版本 6 docs 60 6

{{< boxes/warning >}} 本页面的翻译未经核对,可能存在翻译质量不佳、错翻、漏翻等情况。您可以在 Forgejo 存储库 打开 Issue、提交 Pull Request 或邮件联系我们提出改进建议和参与翻译与核对。 {{< /boxes/warning >}}

本房间版本基于 版本 5 进行构建,同时对事件执行的多项授权规则进行了变更。

客户端注意事项

本房间版本未引入任何新的客户端注意事项。实现本地化撤回算法的客户端,应参考下方 撤回 章节了解完整算法。

撤回

{{% added-in v=6 %}} m.room.aliases 的所有重要意义已从撤回算法中移除。其余规则与以往房间版本保持一致。

{{% rver-fragment name="v6-redactions" %}}

服务器实现组件

{{% boxes/warning %}} 本节内容仅供服务器实现者参考。使用客户端-服务器 API 的应用通常不会受此处细节影响。上述客户端注意事项章节才是客户端-服务器 API 用例应当参考的资源。 {{% /boxes/warning %}}

房间版本 6 对 房间版本 5 中描述的算法进行了如下更改。

撤回

见上

事件格式

{{% added-in v=6 %}} 通过强制执行 规范化 JSON,本房间版本降低了 depth 限制。

{{% rver-fragment name="v6-event-format" %}}

授权规则

{{% added-in v=6 %}} 与 m.room.aliases 类型事件相关的规则 4 被移除。m.room.aliases 事件仍需通过与状态事件相关的授权检查。

{{% added-in v=6 %}} 此外,m.room.power_levels 类型事件的授权规则现在在 content 下包含了 notifications 属性。这对规则 10.4 和 10.5(现为 9.4 和 9.5)进行了更新,以同时检查 events 属性。

事件必须由 sender 属性指示的服务器进行签名。

影响授权的状态事件类型包括:

{{% boxes/note %}} 如未被明确指定,权限等级将按默认值推断。例如,提及 sender 权限等级时,也可能指房间中用户的默认权限等级。 {{% /boxes/note %}}

{{% boxes/note %}} m.room.redaction 事件与其他事件一样受授权规则约束。实际上,这意味着除非 m.room.power_levels 事件通过 eventsevents_default 属性对 m.room.redaction 事件设置了权限要求,否则通常会被授权规则允许。需要注意的是,redact level 不会被授权规则采纳考虑。

能否发送撤回事件,并不意味着撤回操作本身应当被执行。接收服务器必须执行额外检查,详细说明见 处理撤回 章节。 {{% /boxes/note %}}

规则如下:

  1. 若事件类型为 m.room.create
    1. 若包含任何 prev_events,则拒绝。
    2. room_id 的域名与 sender 的域名不匹配,则拒绝。
    3. content.room_version 存在且不是已识别的版本,则拒绝。
    4. content 未包含 creator 属性,则拒绝。
    5. 否则,允许。
  2. 针对事件的 auth_events 考虑如下:
    1. 若同一 typestate_key 对有重复条目,则拒绝。
    2. 若条目的 typestate_key 未与服务器规范中授权事件选择算法规定的一致,则拒绝。
    3. 若存在在接收 PDU 时执行检查中被拒绝的条目,则拒绝。
    4. 若条目中无 m.room.create 事件,则拒绝。
  3. 若房间状态下 m.room.create 事件的 content 含有 m.federate 属性且值为 false,且事件的 sender 域名与创建事件的 sender 域名不一致,则拒绝。
  4. 若事件类型为 m.room.member
    1. 若无 state_key 属性,或 content 中无 membership 属性,则拒绝。
    2. membershipjoin
      1. 若仅有的前序事件为 m.room.createstate_key 等于 creator则允许。
      2. sender 不等于 state_key,则拒绝。
      3. sender 已被封禁,则拒绝。
      4. join_ruleinvite,则当 membership 状态为 invitejoin 时允许。
      5. join_rulepublic,允许。
      6. 否则,拒绝。
    3. membershipinvite
      1. content 包含 third_party_invite 属性:
        1. 目标用户被封禁,则拒绝。
        2. content.third_party_invite 不含 signed 属性,则拒绝。
        3. signed 不含 mxidtoken 属性,则拒绝。
        4. mxid 不等于 state_key,则拒绝。
        5. 若当前房间状态中对应 tokenstate_keym.room.third_party_invite 事件,则拒绝。
        6. sender 不等于 m.room.third_party_invite 事件的 sender,则拒绝。
        7. signed 中任意签名与 m.room.third_party_invite 事件中的任一公钥匹配,则允许。公钥可在 m.room.third_party_invitecontent 中如下获取:
          1. public_key 属性中的单个公钥。
          2. public_keys 属性中的公钥列表。
        8. 否则,拒绝。
      2. sender 当前的 membership 状态不是 join,则拒绝。
      3. 目标用户当前的 membership 状态是 joinban,则拒绝。
      4. sender 权限等级大于或等于邀请权限,则允许。
      5. 否则,拒绝。
    4. membershipleave
      1. senderstate_key 相同,仅当该用户当前 membership 状态为 invitejoin 时允许。
      2. sender 当前的 membership 状态不是 join,则拒绝。
      3. 目标用户当前 membership 状态为 ban,且 sender 权限等级低于封禁权限,则拒绝。
      4. sender 权限等级大于或等于踢人权限,且目标用户权限等级低于 sender,允许。
      5. 否则,拒绝。
    5. membershipban
      1. sender 当前的 membership 状态不是 join,则拒绝。
      2. sender 权限等级大于或等于封禁权限,且目标用户权限等级低于 sender,允许。
      3. 否则,拒绝。
    6. 否则,成员状态未知。拒绝。
  5. sender 当前的 membership 状态不是 join,则拒绝。
  6. 若事件类型为 m.room.third_party_invite
    1. 仅当 sender 当前权限等级大于或等于邀请权限时允许。
  7. 若事件类型所需的权限等级高于 sender 当前权限等级,则拒绝。
  8. 若事件的 state_key@ 开头且与 sender 不一致,则拒绝。
  9. 若事件类型为 m.room.power_levels
    1. content 中的 users 属性不是以有效用户 ID 为键且值为整数(或整数字符串)的对象,则拒绝。
    2. 若房间中不存在先前的 m.room.power_levels 事件,则允许。
    3. 对于 users_defaultevents_defaultstate_defaultbanredactkickinvite 属性,检查是否有新增、变更或移除。对每项变更:
      1. 若当前值高于 sender 当前权限等级,则拒绝。
      2. 若新值高于 sender 当前权限等级,则拒绝。
    4. {{% changed-in v=6 %}} 针对 eventsnotifications 属性中被变更或移除的每一项:
      1. 若当前值大于 sender 当前权限等级,则拒绝。
    5. {{% changed-in v=6 %}} 针对 eventsnotifications 属性中新增加或变更的每一项:
      1. 若新值大于 sender 当前权限等级,则拒绝。
    6. 针对 users 属性中被变更或移除的每一项,除 sender 自身以外:
      1. 若当前值大于等于 sender 当前权限等级,则拒绝。
    7. 针对 users 属性中新增加或变更的每一项:
      1. 若新值大于 sender 当前权限等级,则拒绝。
    8. 否则,允许。
  10. 否则,允许。

{{% boxes/note %}} 这些规则带来以下后果:

  • 除非您已是房间成员,否则唯一被允许的操作(除最初的创建/加入外)为:加入公开房间,或接受或拒绝房间邀请。
  • 取消封禁某人时,您必须拥有大于等于踢人权限封禁权限,并且高于目标用户的权限等级。 {{% /boxes/note %}}

规范化 JSON

{{% rver-fragment name="v6-canonical-json" %}}

与 v5 保持一致

以下章节自 v5 起未被修改,仅为保持完整性而收录。

处理撤回

{{% rver-fragment name="v3-handling-redactions" %}}

事件 ID

{{% rver-fragment name="v4-event-ids" %}}

已废弃的事件内容模式

{{% rver-fragment name="v1-deprecated-formatting-off-spec" %}}

{{% rver-fragment name="v1-stringy-power-levels" %}}

状态解析

{{% rver-fragment name="v2-state-res" %}}

签名密钥有效期

{{% rver-fragment name="v5-signing-requirements" %}}