178 lines
9.3 KiB
Markdown
178 lines
9.3 KiB
Markdown
---
|
||
title: 房间版本 6
|
||
type: docs
|
||
weight: 60
|
||
version: 6
|
||
---
|
||
|
||
{{< 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 >}}
|
||
|
||
|
||
本房间版本基于 [版本 5](/rooms/v5) 进行构建,同时对事件执行的多项授权规则进行了变更。
|
||
|
||
## 客户端注意事项
|
||
|
||
本房间版本未引入任何新的客户端注意事项。实现本地化撤回算法的客户端,应参考下方 [撤回](#撤回) 章节了解完整算法。
|
||
|
||
### 撤回
|
||
|
||
{{% added-in v=6 %}} `m.room.aliases` 的所有重要意义已从撤回算法中移除。其余规则与以往房间版本保持一致。
|
||
|
||
{{% rver-fragment name="v6-redactions" %}}
|
||
|
||
## 服务器实现组件
|
||
|
||
{{% boxes/warning %}}
|
||
本节内容仅供服务器实现者参考。使用客户端-服务器 API 的应用通常不会受此处细节影响。上述客户端注意事项章节才是客户端-服务器 API 用例应当参考的资源。
|
||
{{% /boxes/warning %}}
|
||
|
||
房间版本 6 对 [房间版本 5](/rooms/v5) 中描述的算法进行了如下更改。
|
||
|
||
### 撤回
|
||
|
||
[见上](#撤回)。
|
||
|
||
### 事件格式
|
||
|
||
{{% added-in v=6 %}} 通过强制执行 [规范化 JSON](#canonical-json),本房间版本降低了 `depth` 限制。
|
||
|
||
{{% rver-fragment name="v6-event-format" %}}
|
||
|
||
### 授权规则
|
||
|
||
{{% added-in v=6 %}} 与 `m.room.aliases` 类型事件相关的规则 4 被移除。`m.room.aliases` 事件仍需通过与状态事件相关的授权检查。
|
||
|
||
{{% added-in v=6 %}} 此外,`m.room.power_levels` 类型事件的授权规则现在在 `content` 下包含了 `notifications` 属性。这对规则 10.4 和 10.5(现为 9.4 和 9.5)进行了更新,以同时检查 `events` 属性。
|
||
|
||
事件必须由 `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. 若 `membership` 为 `join`:
|
||
1. 若仅有的前序事件为 `m.room.create` 且 `state_key` 等于 creator,则允许。
|
||
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. 若当前房间状态中对应 `token` 的 `state_key` 无 `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` 当前的 membership 状态不是 `join`,则拒绝。
|
||
3. 若*目标用户*当前的 membership 状态是 `join` 或 `ban`,则拒绝。
|
||
4. 若 `sender` 权限等级大于或等于*邀请权限*,则允许。
|
||
5. 否则,拒绝。
|
||
4. 若 `membership` 为 `leave`:
|
||
1. 若 `sender` 与 `state_key` 相同,仅当该用户当前 membership 状态为 `invite` 或 `join` 时允许。
|
||
2. 若 `sender` 当前的 membership 状态不是 `join`,则拒绝。
|
||
3. 若*目标用户*当前 membership 状态为 `ban`,且 `sender` 权限等级低于*封禁权限*,则拒绝。
|
||
4. 若 `sender` 权限等级大于或等于*踢人权限*,且*目标用户*权限等级低于 `sender`,允许。
|
||
5. 否则,拒绝。
|
||
5. 若 `membership` 为 `ban`:
|
||
1. 若 `sender` 当前的 membership 状态不是 `join`,则拒绝。
|
||
2. 若 `sender` 权限等级大于或等于*封禁权限*,且*目标用户*权限等级低于 `sender`,允许。
|
||
3. 否则,拒绝。
|
||
6. 否则,成员状态未知。拒绝。
|
||
5. 若 `sender` 当前的 membership 状态不是 `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. {{% changed-in v=6 %}}
|
||
针对 `events` 或 `notifications` 属性中被变更或移除的每一项:
|
||
1. 若当前值大于 `sender` 当前权限等级,则拒绝。
|
||
5. {{% changed-in v=6 %}}
|
||
针对 `events` 或 `notifications` 属性中新增加或变更的每一项:
|
||
1. 若新值大于 `sender` 当前权限等级,则拒绝。
|
||
6. 针对 `users` 属性中被变更或移除的每一项,除 `sender` 自身以外:
|
||
1. 若当前值大于等于 `sender` 当前权限等级,则拒绝。
|
||
7. 针对 `users` 属性中新增加或变更的每一项:
|
||
1. 若新值大于 `sender` 当前权限等级,则拒绝。
|
||
8. 否则,允许。
|
||
10. 否则,允许。
|
||
|
||
{{% boxes/note %}}
|
||
这些规则带来以下后果:
|
||
|
||
- 除非您已是房间成员,否则唯一被允许的操作(除最初的创建/加入外)为:加入公开房间,或接受或拒绝房间邀请。
|
||
- 取消封禁某人时,您必须拥有大于等于踢人权限*且*封禁权限,*并且*高于目标用户的权限等级。
|
||
{{% /boxes/note %}}
|
||
|
||
### 规范化 JSON
|
||
|
||
{{% rver-fragment name="v6-canonical-json" %}}
|
||
|
||
## 与 v5 保持一致
|
||
|
||
以下章节自 v5 起未被修改,仅为保持完整性而收录。
|
||
|
||
### 处理撤回
|
||
|
||
{{% rver-fragment name="v3-handling-redactions" %}}
|
||
|
||
### 事件 ID
|
||
|
||
{{% rver-fragment name="v4-event-ids" %}}
|
||
|
||
#### 已废弃的事件内容模式
|
||
|
||
{{% rver-fragment name="v1-deprecated-formatting-off-spec" %}}
|
||
|
||
{{% rver-fragment name="v1-stringy-power-levels" %}}
|
||
|
||
### 状态解析
|
||
|
||
{{% rver-fragment name="v2-state-res" %}}
|
||
|
||
### 签名密钥有效期
|
||
|
||
{{% rver-fragment name="v5-signing-requirements" %}}
|