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

9 KiB
Raw Blame History

title type weight version
房间版本 7 docs 70 7

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

本房间版本在 版本 6 的基础上,新增了敲门作为一种可选的加入规则和成员状态。

客户端注意事项

这是首个完全支持敲门knocking的房间版本。因此用户无法在非 v7 版本为基础的房间发起敲门请求。

虽然本房间版本相关的部分没有变动,实现本地化撤回算法的客户端应参考下方的撤回章节了解完整细节。

服务器实现要点

{{% boxes/warning %}} 本节内容仅面向服务器实现者。使用客户端-服务器 API 的应用一般无需关心此处的细节。关于客户端应注意事项,请参考前文相关章节。 {{% /boxes/warning %}}

房间版本 7 新增了支持敲门的事件认证规则。房间版本 6 及其所基于的版本中包含了其他认证规则变更的细节。

认证规则

{{% added-in v=7 %}} 对于对 m.room.member 事件执行的检查,新增了针对 membership=knock 的处理分支。

事件必须由其 sender 属性所指服务器签名。

影响认证过程的状态事件类型有:

{{% boxes/note %}} 未显式提供时,权限等级将推断为默认值。例如,对 sender 权限等级的描述,也可指代该房间内用户的默认权限等级。 {{% /boxes/note %}}

{{% boxes/note %}} m.room.redaction 事件与其他事件一样,受认证规则约束。实际上,除非 m.room.power_levels 事件以 eventsevents_default 属性对 m.room.redaction 事件设定了权限要求,否则一般都允许撤回事件参与验证。需要特别注意,撤回等级 不会被认证规则使用。

有权发送撤回事件并不意味着撤回操作会被执行。接收端服务器还必须执行额外检查,详见撤回处理章节。 {{% /boxes/note %}}

认证规则如下:

  1. 若事件类型为 m.room.create
    1. 若存在任何 prev_events,拒绝。
    2. room_id 的域名与 sender 域名不一致,拒绝。
    3. content.room_version 存在且不为已知版本,拒绝。
    4. contentcreator 属性,拒绝。
    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 属性,或 contentmembership 属性,拒绝。
    2. membershipjoin
      1. 如仅有的上一个事件为 m.room.createstate_key 为创建者,允许。
      2. senderstate_key 不同,拒绝。
      3. sender 已被禁言banned拒绝。
      4. {{% changed-in v=7 %}} 若 join_ruleinviteknock,则当成员状态为 invitejoin 时允许。
      5. join_rulepublic,允许。
      6. 其他情况,拒绝。
    3. membershipinvite
      1. 如果 contentthird_party_invite 属性:
        1. 目标用户被 ban拒绝。
        2. content.third_party_invitesigned 属性,拒绝。
        3. signedmxidtoken 属性,拒绝。
        4. mxidstate_key 不一致,拒绝。
        5. 若当前房间状态中无 state_keytokenm.room.third_party_invite 事件,拒绝。
        6. sender 不一致于 m.room.third_party_invite 事件的 sender,拒绝。
        7. signed 中任意签名与 m.room.third_party_invite 事件中的任一公钥匹配,允许。公钥位于 m.room.third_party_invite 事件的 content 中:
          1. public_key 属性中的单个公钥;
          2. public_keys 属性中的公钥列表。
        8. 其他情况,拒绝。
      2. sender 当前成员状态不是 join,拒绝。
      3. 目标用户当前成员状态为 joinban,拒绝。
      4. sender 权限等级大于等于 invite level,允许。
      5. 其他情况,拒绝。
    4. membershipleave
      1. {{% changed-in v=7 %}} 若 sender 等于 state_key,仅当该用户当前成员状态为 invitejoinknock 时允许。
      2. sender 当前成员状态不是 join,拒绝。
      3. 目标用户当前成员状态为 ban,且 sender 权限小于 ban level,拒绝。
      4. sender 权限等级大于等于 kick level,并且 目标用户 权限低于 sender,允许。
      5. 其他情况,拒绝。
    5. membershipban
      1. sender 当前成员状态不是 join,拒绝。
      2. sender 权限等级大于等于 ban level,且目标用户权限等级低于 sender,允许。
      3. 其他情况,拒绝。
    6. {{% added-in v=7 %}} 若 membershipknock
      1. join_rule 不为 knock,拒绝。
      2. senderstate_key 不同,拒绝。
      3. sender 当前成员状态不是 baninvitejoin,允许。
      4. 其他情况,拒绝。
    7. 其他未知成员状态,拒绝。
  5. sender 当前成员状态不是 join,拒绝。
  6. 若事件类型为 m.room.third_party_invite
    1. 仅当 sender 当前权限等级大于等于 invite level 时允许。
  7. 若事件类型所需权限等级大于 sender 的当前权限等级,拒绝。
  8. 若事件有以 @ 开头的 state_key 且不等于 sender,拒绝。
  9. 若事件类型为 m.room.power_levels
    1. contentusers 属性不是仅包含有效用户 ID 的对象,值为整数(或可解释为整数的字符串),拒绝。
    2. 若房间内无之前的 m.room.power_levels 事件,允许。
    3. users_defaultevents_defaultstate_defaultbanredactkickinvite 这些属性,如有新增、变更或移除,逐项检查:
      1. 若当前值高于 sender 的当前权限等级,拒绝。
      2. 若新值高于 sender 当前权限等级,拒绝。
    4. eventsnotifications 属性中被变更或移除的条目逐项检查:
      1. 若当前值高于 sender 当前权限等级,拒绝。
    5. eventsnotifications 属性中被新增或变更的条目逐项检查:
      1. 若新值高于 sender 当前权限等级,拒绝。
    6. 对除 sender 自己以外的、users 属性中被变更或移除的条目逐项检查:
      1. 若当前值大于等于 sender 当前权限等级,拒绝。
    7. users 属性中被新增或变更的条目逐项检查:
      1. 若新值高于 sender 当前权限等级,拒绝。
    8. 其他情况,允许。
  10. 其他情况,允许。

{{% boxes/note %}} 这些规则的部分后果如下:

  • 除非你是房间成员,否则仅允许的操作(除首次创建/加入外)有:加公共房、接受或拒绝邀请。
  • 若要解除对某人的封禁unban你必须拥有大于等于踢人kick禁言ban等级的权限高于目标用户的权限等级。 {{% /boxes/note %}}

与 v6 保持一致的内容

下列章节自 v6 起未做更改,为保障文档完整性此处附上。

撤回

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

撤回处理

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

事件 ID

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

事件格式

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

已弃用事件内容模式

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

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

状态解析

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

规范化 JSON

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

签名密钥有效期

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