103 lines
7.1 KiB
Markdown
103 lines
7.1 KiB
Markdown
---
|
||
---
|
||
|
||
{{< 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 %}}
|