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

7.7 KiB
Raw Blame History

事件必须由 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.federatefalse,并且该事件的 sender 域与创建事件的 sender 域不匹配,则拒绝。
  4. 如果类型为 m.room.member
    1. 如果没有 state_key 属性,或 content 中没有 membership 属性,则拒绝。
    2. {{% added-in v=8 %}} 如果 content 中有 join_authorised_via_users_server 属性:
      1. 如果事件未被该 key 标识的用户 ID 的 homeserver 有效签名,则拒绝。
    3. 如果 membershipjoin
      1. 如果唯一先前事件为 m.room.createstate_key 为创建者,则允许。
      2. 如果 senderstate_key 不匹配,则拒绝。
      3. 如果 sender 被封禁,则拒绝。
      4. 如果 join_ruleinviteknock,当成员状态为 invitejoin 时允许。
      5. {{% added-in v=8 %}} 如果 join_rulerestricted
        1. 如果成员状态为 joininvite,则允许。
        2. 如果 content 中的 join_authorised_via_users_server key 不是有足够权限邀请其它用户的用户,则拒绝。
        3. 否则,允许。
      6. 如果 join_rulepublic,允许。
      7. 否则,拒绝。
    4. 如果 membershipinvite
      1. 如果 content 包含 third_party_invite 属性:
        1. 如果目标用户被封禁,则拒绝。
        2. 如果 content.third_party_invite 没有 signed 属性,则拒绝。
        3. 如果 signed 没有 mxidtoken 属性,则拒绝。
        4. 如果 mxid 不等于 state_key,则拒绝。
        5. 如果当前房间状态中没有 state_keytoken 匹配的 m.room.third_party_invite 事件,则拒绝。
        6. 如果 senderm.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. 否则,拒绝。
    5. 如果 membershipleave
      1. 如果 senderstate_key 匹配,且该用户当前的成员状态为 invitejoinknock 时允许,否则拒绝。
      2. 如果 sender 当前成员状态不是 join,则拒绝。
      3. 如果目标用户的当前成员状态为 bansender 的权限级别低于封禁级别,则拒绝。
      4. 如果 sender 的权限级别大于或等于踢出级别,且目标用户的权限级别低于 sender,则允许。
      5. 否则,拒绝。
    6. 如果 membershipban
      1. 如果 sender 当前成员状态不是 join,则拒绝。
      2. 如果 sender 的权限级别大于或等于封禁级别,且目标用户的权限级别低于 sender,则允许。
      3. 否则,拒绝。
    7. 如果 membershipknock
      1. 如果 join_rule 不是 knock,则拒绝。
      2. 如果 senderstate_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. 如果 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 %}} 这些规则的一些结果:

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