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

7.1 KiB
Raw Blame History



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

{{% added-in v=3 %}} 在房间版本1和2中事件需要来自 event_id 域的签名才能被视为有效。此房间版本在联邦过程中并未以相同方式包含 event_id,因此不需要该服务器的签名。不过,事件仍然必须由 sender 属性标识的服务器签名。

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

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

截至房间版本3完整的规则列表如下

  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.aliases
    1. 如果没有 state_key,则拒绝。
    2. 如果发送者域与 state_key 不同,则拒绝。
    3. 否则,允许。
  5. 如果类型为 m.room.member
    1. 如果没有 state_key 属性,或 content 中没有 membership 属性,则拒绝。
    2. 如果 membershipjoin
      1. 如果唯一的前置事件是 m.room.create 并且 state_key 是创建者,则允许。
      2. 如果 sender 不等于 state_key,则拒绝。
      3. 如果 sender 被封禁,则拒绝。
      4. 如果 join_ruleinvite,则当成员状态为 invitejoin 时允许。
      5. 如果 join_rulepublic,则允许。
      6. 否则,拒绝。
    3. 如果 membershipinvite
      1. 如果 content 包含 third_party_invite 属性:
        1. 如果目标用户被封禁,则拒绝。
        2. 如果 content.third_party_invite 没有 signed 属性,则拒绝。
        3. 如果 signed 没有 mxidtoken 属性,则拒绝。
        4. 如果 mxidstate_key 不一致,则拒绝。
        5. 如果当前房间状态下没有 state_keytoken 匹配的 m.room.third_party_invite 事件,则拒绝。
        6. 如果 sender 不等于该 m.room.third_party_invitesender,则拒绝。
        7. 如果 signed 中任一签名与 m.room.third_party_invite 事件中的任意公钥匹配,则允许。公钥可在 m.room.third_party_invitecontent 中如下出现:
          1. public_key 属性中的单个公钥。
          2. public_keys 属性中的公钥列表。
        8. 否则,拒绝。
      2. 如果 sender 当前的成员状态不是 join,则拒绝。
      3. 如果目标用户当前成员状态为 joinban,则拒绝。
      4. 如果 sender 的权限等级大于或等于邀请等级,则允许。
      5. 否则,拒绝。
    4. 如果 membershipleave
      1. 如果 sender 等于 state_key,且该用户当前成员状态为 invitejoin,则允许,否则拒绝。
      2. 如果 sender 当前成员状态不是 join,则拒绝。
      3. 如果目标用户当前成员状态为 ban,且 sender 权限等级小于封禁等级,则拒绝。
      4. 如果 sender 权限等级大于或等于踢出等级,且目标用户的权限等级小于 sender,则允许。
      5. 否则,拒绝。
    5. 如果 membershipban
      1. 如果 sender 当前的成员状态不是 join,则拒绝。
      2. 如果 sender 权限等级大于或等于封禁等级,且目标用户的权限等级小于 sender,则允许。
      3. 否则,拒绝。
    6. 其他情况下,成员状态未知,拒绝。
  6. 如果 sender 当前成员状态不是 join,则拒绝。
  7. 如果类型为 m.room.third_party_invite
    1. 仅当 sender 当前权限等级大于或等于邀请等级时允许。
  8. 如果事件类型的所需权限等级大于 sender 的权限等级,则拒绝。
  9. 如果事件有以 @ 开头且与 sender 不一致的 state_key,则拒绝。
  10. 如果类型为 m.room.power_levels
    1. 如果 content 中的 users 属性不是一个以有效用户ID为键、值为整数或整数字符串的对象则拒绝。
    2. 如果房间中没有先前的 m.room.power_levels 事件,则允许。
    3. 检查 users_defaultevents_defaultstate_defaultbanredactkickinvite 属性是否被新增、变更或移除。对于每一个变动:
      1. 如果当前值大于 sender 当前权限等级,则拒绝。
      2. 如果新值大于 sender 当前权限等级,则拒绝。
    4. 针对 events 属性中被更改或移除的每一项:
      1. 如果当前值大于 sender 当前权限等级,则拒绝。
    5. 针对 events 属性中被新增或变更的每一项:
      1. 如果新值大于 sender 当前权限等级,则拒绝。
    6. 针对 users 属性中被更改或移除的每一项(除了 sender 自己的项):
      1. 如果当前值大于等于 sender 当前权限等级,则拒绝。
    7. 针对 users 属性中被新增或变更的每一项:
      1. 如果新值大于 sender 当前权限等级,则拒绝。
    8. 否则,允许。
  11. 其他情况下,允许。

{{% boxes/note %}} 这些规则的一些后果:

  • 除非你是房间成员,除了初始化创建/加入外,唯一被允许的操作是:加入公开房间;接受或拒绝房间邀请。
  • 要解除对某人的封禁,你的权限等级必须大于等于踢出封禁等级,并且高于目标用户的权限等级。 {{% /boxes/note %}}