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

111 lines
No EOL
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

事件必须由 `sender` 属性指示的服务器进行签名。
影响授权的状态事件类型包括:
- [`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 %}}
{{% boxes/note %}}
`m.room.redaction` 事件与其他事件一样需遵守授权规则。实际上,这意味着除非 `m.room.power_levels` 事件通过 `events``events_default` 属性为 `m.room.redaction` 事件设置了权限级别要求否则通常会被授权规则允许。特别地_redact level_ **不会**被授权规则考虑在内。
能够发送撤回事件并不意味着应执行撤回。接收服务器必须执行额外的检查,详见[处理撤回](#handling-redactions)章节。
{{% /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.member`
1. 如果没有 `state_key` 属性,或 `content` 中没有 `membership` 属性,则拒绝。
2. {{% added-in v=8 %}}
如果 `content` 中有 `join_authorised_via_users_server` 属性:
1. 如果事件未被该 key 标识的用户 ID 的 homeserver 有效签名,则拒绝。
3. 如果 `membership``join`
1. 如果唯一先前事件为 `m.room.create``state_key` 为创建者,则允许。
2. 如果 `sender``state_key` 不匹配,则拒绝。
3. 如果 `sender` 被封禁,则拒绝。
4. 如果 `join_rule``invite``knock`,当成员状态为 `invite``join` 时允许。
5. {{% added-in v=8 %}}
如果 `join_rule``restricted`
1. 如果成员状态为 `join``invite`,则允许。
2. 如果 `content` 中的 `join_authorised_via_users_server` key 不是有足够权限邀请其它用户的用户,则拒绝。
3. 否则,允许。
6. 如果 `join_rule``public`,允许。
7. 否则,拒绝。
4. 如果 `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. 否则,拒绝。
5. 如果 `membership``leave`
1. 如果 `sender``state_key` 匹配,且该用户当前的成员状态为 `invite``join``knock` 时允许,否则拒绝。
2. 如果 `sender` 当前成员状态不是 `join`,则拒绝。
3. 如果*目标用户*的当前成员状态为 `ban``sender` 的权限级别低于*封禁级别*,则拒绝。
4. 如果 `sender` 的权限级别大于或等于*踢出级别*,且*目标用户*的权限级别低于 `sender`,则允许。
5. 否则,拒绝。
6. 如果 `membership``ban`
1. 如果 `sender` 当前成员状态不是 `join`,则拒绝。
2. 如果 `sender` 的权限级别大于或等于*封禁级别*,且*目标用户*的权限级别低于 `sender`,则允许。
3. 否则,拒绝。
7. 如果 `membership``knock`
1. 如果 `join_rule` 不是 `knock`,则拒绝。
2. 如果 `sender``state_key` 不匹配,则拒绝。
3. 如果 `sender` 当前的成员状态不是 `ban``invite``join`,则允许。
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` 属性不是一个有效的对象(主键为合法用户 ID值为整数或可转为整数的字符串则拒绝。
2. 如果房间中没有之前的 `m.room.power_levels` 事件,允许。
3. 对于 `users_default``events_default``state_default``ban``redact``kick``invite` 属性,检查它们是否有新增、更改或移除。对每个更改项:
1. 如果当前值高于 `sender` 当前权限级别,则拒绝。
2. 如果新值高于 `sender` 当前权限级别,则拒绝。
4. 针对 `events``notifications` 属性中被更改或移除的每个条目:
1. 如果当前值大于 `sender` 当前权限级别,则拒绝。
5. 对于向 `events``notifications` 属性新增或更改的每个条目:
1. 如果新值大于 `sender` 当前权限级别,则拒绝。
6. 除了 `sender` 自身的条目外,对 `users` 属性被更改或移除的每个条目:
1. 如果当前值大于等于 `sender` 当前权限级别,则拒绝。
7. 对于向 `users` 属性新增或更改的每个条目:
1. 如果新值大于 `sender` 当前权限级别,则拒绝。
8. 否则,允许。
10. 否则,允许。
{{% boxes/note %}}
这些规则的一些结果:
- 除非你是房间成员,否则唯一被允许的操作(除初始创建/加入外)为:加入公开房间、接受或拒绝房间邀请。
- 要解除某人的封禁,你必须拥有大于等于踢出*和*封禁级别的权限级别,*且*比目标用户的权限级别高。
{{% /boxes/note %}}