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

11 KiB
Raw Blame History

title type weight version
房间版本 11 docs 100 11

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

本房间版本基于版本 10 并进一步明确了撤回redaction规则。

客户端注意事项

撤回

{{% added-in v=11 %}} 顶层的 originmembershipprev_state 属性不再受到撤回保护。m.room.create 事件现在会保留整个 content 属性。m.room.redaction 事件保留 content 下的 redacts 属性。m.room.power_levels 事件保留 content 下的 invite 属性。

完整的撤回算法如下。

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

事件格式

客户端不应再依赖 m.room.create 事件的 content 中的 creator 属性。在所有房间版本中,客户端可以通过 sender 属性来确定房间的创建者。

m.room.redaction 事件的格式已被修改。客户端应当在 content 下查找 redacts 键,而不是顶层属性。

m.room.member 事件的 third_party_invite 键不再被撤回,但撤回后仅包含 signed 键。

服务端实现组件

{{% boxes/warning %}} 本部分内容仅供服务端实现者参考。使用 Client-Server API 的应用通常不受此处细节影响。上面“客户端注意事项”部分才是 Client-Server API 使用场景应关注的内容。 {{% /boxes/warning %}}

本房间版本更新了撤回算法,并修改了服务端应如何创建 m.room.createm.room.redaction 事件。

房间版本 11 以版本 10 为基础,并有以下要点。

撤回

见上文

事件格式

核心事件格式与房间版本 10 相同。不过,该房间版本改变了某些事件类型的部分属性。

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

移除 m.room.create 事件的 creator 属性

m.room.create 事件的 content 不再包含 creator 属性,此前它总是与事件的 sender 属性等同。

m.room.redaction 事件的 redacts 属性移入 content

m.room.redaction 事件的 redacts 属性已从事件的顶层属性移到事件的 content 属性下。

为向后兼容旧版客户端,服务端在通过 Client-Server API 提供此类事件时,应在顶层添加 redacts 属性。

为更好兼容新版客户端,服务端在向旧版房间版本提供此类事件时,应在 content 下添加 redacts 属性。

授权规则

事件必须由 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. {{% changed-in v=11 %}} 如果类型为 m.room.create
    1. 如果有任何 prev_events,则拒绝。
    2. 如果 room_id 的域名与 sender 的域名不一致,则拒绝。
    3. 如果 content.room_version 存在且不是已知版本,则拒绝。
    4. 其他情况,允许。
  2. 针对事件的 auth_events
    1. 如果某一对 typestate_key 存在重复项,则拒绝。
    2. 如果有 typestate_key 未按授权事件选择算法选取,拒绝。
    3. 如果有条目在PDU接收时的检查中被拒绝,则拒绝。
    4. 如果没有 m.room.create 事件,被拒绝。
  3. 如果房间状态下 m.room.create 事件的 contentm.federate 属性为 false,且当前事件的 sender 域与创建事件的 sender 域不一致,则拒绝。
  4. 如果类型为 m.room.member
    1. 如果没有 state_key 属性,或 content 中没有 membership 属性,拒绝。
    2. 如果 content 包含 join_authorised_via_users_server
      1. 如果事件未被该属性指定用户的 homeserver 合法签名,则拒绝。
    3. 如果 membershipjoin
      1. {{% changed-in v=11 %}} 若唯一的前序事件是 m.room.createstate_keym.room.create 的 sender则允许。
      2. 如果 sender 不等于 state_key,拒绝。
      3. 如果 sender 被禁言,拒绝。
      4. join_ruleinviteknock,且会员状态为 invitejoin,则允许。
      5. join_rulerestrictedknock_restricted
        1. 若会员状态为 joininvite,允许。
        2. 如果 content 中的 join_authorised_via_users_server 不是有权邀请用户的用户,拒绝。
        3. 其他情况,允许。
      6. join_rulepublic,允许。
      7. 其他情况,拒绝。
    4. 如果 membershipinvite
      1. 如果 contentthird_party_invite 属性:
        1. 如目标用户已被禁言,拒绝。
        2. 如果 content.third_party_invite 缺少 signed 属性,拒绝。
        3. 如果 signed 不包含 mxidtoken 属性,拒绝。
        4. 如果 mxid 不等于 state_key,拒绝。
        5. 若当前房间状态没有 state_key 匹配 tokenm.room.third_party_invite 事件,拒绝。
        6. 如果 sender 不等于 m.room.third_party_invite 的 sender拒绝。
        7. signed 中任何签名匹配 m.room.third_party_invite 事件中的公钥,则允许。公钥位于 content 的如下属性中:
          1. public_key 属性内的单个公钥;
          2. public_keys 属性内的公钥列表。
        8. 否则,拒绝。
      2. 如果 sender 当前会员状态不是 join,拒绝。
      3. 如果目标用户当前会员状态为 joinban,拒绝。
      4. 如果 sender 的权限级别大于等于邀请级别,允许。
      5. 否则,拒绝。
    5. 如果 membershipleave
      1. sender 等于 state_key,仅当此用户当前会员状态为 invitejoinknock 时允许。
      2. 如果 sender 的当前会员状态不是 join,拒绝。
      3. 若目标用户当前会员状态为 ban,且 sender 权限小于禁言级别,拒绝。
      4. sender 权限大于等于踢出级别,且目标用户权限低于 sender 权限,允许。
      5. 否则,拒绝。
    6. 如果 membershipban
      1. sender 当前会员状态不是 join,拒绝。
      2. sender 权限大于等于禁言级别,且目标用户权限低于 sender 权限,允许。
      3. 否则,拒绝。
    7. 如果 membershipknock
      1. join_rule 不是 knockknock_restricted,拒绝。
      2. sender 不等于 state_key,拒绝。
      3. sender 当前会员状态不是 baninvitejoin,允许。
      4. 否则,拒绝。
    8. 其他未知会员状态,拒绝。
  5. 如果 sender 当前会员状态不是 join,拒绝。
  6. 若类型为 m.room.third_party_invite
    1. 仅当 sender 当前权限大于等于邀请级别时允许。
  7. 如事件类型所需权限级别大于 sender 权限级别,拒绝。
  8. 如果事件有 state_key@ 开头,且不等于 sender,拒绝。
  9. 若类型为 m.room.power_levels
    1. 如果 content 内的 users_defaultevents_defaultstate_defaultbanredactkickinvite 属性存在且不是整数,拒绝。
    2. 如果 content 内的 eventsnotifications 属性存在,且不是值为整数的对象,拒绝。
    3. 如果 content 内的 users 属性不是键为合法用户ID、值为整数的对象拒绝。
    4. 如果房间中不存在先前的 m.room.power_levels 事件,允许。
    5. 对于 users_defaultevents_defaultstate_defaultbanredactkickinvite,如有添加、变更或删除,每项需检查:
      1. 当前值大于 sender 当前权限,拒绝。
      2. 新值大于 sender 当前权限,拒绝。
    6. 对于 eventsnotifications 属性中被更改或移除的每一项:
      1. 当前值大于 sender 当前权限,拒绝。
    7. 对于 eventsnotifications 中被添加或更改的每一项:
      1. 新值大于 sender 当前权限,拒绝。
    8. 对于除自身外的 users 属性中被更改或移除的每一项:
      1. 当前值大于等于 sender 当前权限,拒绝。
    9. 对于 users 属性中被添加或更改的每一项:
      1. 新值大于 sender 当前权限,拒绝。
    10. 其他情况,允许。
  10. 其他情况,允许。

{{% boxes/note %}} 这些规则的部分结果:

  • 除非你是房间成员,唯一允许的操作(除初始创建/加入外)只有加入公开房间,以及接受或拒绝房间邀请。
  • 取消禁言某人,你必须同时具有不小于踢出和禁言级别的权限,且权限要高于目标用户。 {{% /boxes/note %}}

与 v10 一致

以下章节自 v10 起未修改,为完整性而保留。

撤回处理

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

事件 ID

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

状态解析

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

规范化 JSON

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

签名密钥有效期

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