影响授权的状态事件类型包括: - [`m.room.create`](/client-server-api#mroomcreate) - [`m.room.member`](/client-server-api#mroommember) - [`m.room.join_rules`](/client-server-api#mroomjoin_rules) - [`m.room.power_levels`](/client-server-api#mroompower_levels) - [`m.room.third_party_invite`](/client-server-api#mroomthird_party_invite) {{% boxes/note %}} 如果未明确给出权限等级,则从默认值推断。 例如,提及 `sender` 的权限等级时,也可指代房间用户的默认权限等级。 {{% /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. 若某一 `type` 与 `state_key` 组合存在重复,则拒绝。 2. 若存在其 `type` 与 `state_key` 不符合 [认证事件选择](/server-server-api#auth-events-selection) 算法(详见服务器规范)的项,则拒绝。 3. 若有事件本身因 [接收 PDU 时执行的检查](/server-server-api/#checks-performed-on-receipt-of-a-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. 若 `membership` 为 `join`: 1. 若唯一的前序事件为 `m.room.create` 且 `state_key` 为创建者,则允许。 2. 若 `sender` 与 `state_key` 不符,则拒绝。 3. 若 `sender` 被封禁,则拒绝。 4. 若 `join_rule` 为 `invite`,则当 `membership` 状态是 `invite` 或 `join` 时,允许。 5. 若 `join_rule` 为 `public`,则允许。 6. 否则,拒绝。 3. 若 `membership` 为 `invite`: 1. 若 `content` 含有 `third_party_invite` 属性: 1. 若 *目标用户* 被封禁,则拒绝。 2. 若 `content.third_party_invite` 无 `signed` 属性,则拒绝。 3. 若 `signed` 无 `mxid` 和 `token` 属性,则拒绝。 4. 若 `mxid` 与 `state_key` 不符,则拒绝。 5. 若当前房间状态中无 `state_key` 为 `token` 的 `m.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. 若 *目标用户* 当前成员状态是 `join` 或 `ban`,则拒绝。 4. 若 `sender` 权限等级大于或等于 *邀请等级*,则允许。 5. 否则,拒绝。 4. 若 `membership` 为 `leave`: 1. 若 `sender` 与 `state_key` 匹配,则仅当其当前成员状态为 `invite` 或 `join` 时允许。 2. 若 `sender` 当前成员状态不是 `join`,则拒绝。 3. 若 *目标用户* 当前成员状态为 `ban` 且 `sender` 权限等级低于 *封禁等级*,则拒绝。 4. 若 `sender` 权限等级大于等于 *踢人等级*,且 *目标用户* 权限等级小于 `sender` 权限等级,则允许。 5. 否则,拒绝。 5. 若 `membership` 为 `ban`: 1. 若 `sender` 当前成员状态不是 `join`,则拒绝。 2. 若 `sender` 权限等级大于等于 *封禁等级*,且 *目标用户* 权限等级低于 `sender` 权限等级,则允许。 3. 否则,拒绝。 6. 其他情况下,未知成员状态。拒绝。 6. 若 `sender` 当前成员状态不是 `join`,则拒绝。 7. 若类型为 `m.room.third_party_invite`: 1. 仅当 `sender` 当前权限等级大于等于 *邀请等级* 时允许。 8. 若事件类型的 *所需权限等级* 大于 `sender` 权限等级,则拒绝。 9. 若事件的 `state_key` 以 `@` 开头且与 `sender` 不符,则拒绝。 10. 若类型为 `m.room.power_levels`: 1. 若 `content` 中 `users` 属性不是键为有效用户ID且值为整数(或整数字符串)的对象,则拒绝。 2. 若房间中没有前序的 `m.room.power_levels` 事件,则允许。 3. 针对 `users_default`、`events_default`、`state_default`、`ban`、`redact`、`kick`、`invite` 属性,在添加、更改或移除时,针对每个变动: 1. 若当前值大于 `sender` 当前权限等级,则拒绝。 2. 若新值大于 `sender` 当前权限等级,则拒绝。 4. 针对 `events` 属性中被更改或移除的每一项: 1. 若当前值大于 `sender` 当前权限等级,则拒绝。 5. 针对 `events` 属性中被添加或更改的每一项: 1. 若新值大于 `sender` 当前权限等级,则拒绝。 6. 针对 `users` 属性(除 `sender` 本人)的被更改或移除的每一项: 1. 若当前值大于等于 `sender` 当前权限等级,则拒绝。 7. 针对 `users` 属性被添加或更改的每一项: 1. 若新值大于 `sender` 当前权限等级,则拒绝。 8. 否则,允许。 11. 若类型为 `m.room.redaction`: 1. 若 `sender` 权限等级大于等于 *撤回等级*,则允许。 2. 若被撤回事件的 `event_id` 域名与 `m.room.redaction` 的 `event_id` 域名一致,则允许。 3. 否则,拒绝。 12. 否则,允许。 {{% boxes/note %}} 这些规则的部分后果: - 除非你是房间成员,否则唯一被允许的操作(除首次创建/加入外)为:加入公共房间、接受或拒绝对房间的邀请。 - 取消封禁某人,你必须拥有大于等于踢人和封禁等级的权限,且你的权限等级高于目标用户。 {{% /boxes/note %}}