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

178 lines
9.3 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.

---
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" %}}