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

103 lines
7.1 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.

---
---
{{< boxes/warning >}}
本页面的翻译未经核对,可能存在翻译质量不佳、错翻、漏翻等情况。您可以在 <a href="https://codeberg.org/wholetrans/docs-matrix-spec">Forgejo 存储库</a> 打开 Issue、提交 Pull Request 或<a href="mailto:errata@wholetrans.org">邮件联系</a>我们提出改进建议和参与翻译与核对。
{{< /boxes/warning >}}
{{% added-in v=3 %}} 在房间版本1和2中事件需要来自 `event_id` 域的签名才能被视为有效。此房间版本在联邦过程中并未以相同方式包含 `event_id`,因此不需要该服务器的签名。不过,事件仍然必须由 `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 %}}
截至房间版本3完整的规则列表如下
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`,则当成员状态为 `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. 如果事件有以 `@` 开头且与 `sender` 不一致的 `state_key`,则拒绝。
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. 其他情况下,允许。
{{% boxes/note %}}
这些规则的一些后果:
- 除非你是房间成员,除了初始化创建/加入外,唯一被允许的操作是:加入公开房间;接受或拒绝房间邀请。
- 要解除对某人的封禁,你的权限等级必须大于等于踢出*和*封禁等级,并且高于目标用户的权限等级。
{{% /boxes/note %}}