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

207 lines
11 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: 房间版本 10
type: docs
weight: 100
version: 10
---
{{< 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 >}}
该房间版本基于[版本 9](/rooms/v9)强制要求权限等级power level值为整数并引入了新的 `knock_restricted` 加入规则,使潜在成员更容易加入此类房间。
## 客户端注意事项
此房间版本增加了新的 `knock_restricted` 加入规则,允许房间的潜在成员通过敲门(在[房间版本 7](/rooms/v7)中引入)或“加入限制”(在[房间版本 8](/rooms/v8)中引入并在[房间版本 9](/rooms/v9)中细化)两种方式加入房间。
客户端应针对具备该规则的房间做出相应渲染。例如:
```
该房间为:
[ ] 公开
[x] 私有
加入规则(公开时禁用):
[x] 允许 `#space:example.org` 的成员加入
[x] 允许敲门
```
本地实现事件修订redaction算法的客户端应参考下文的[修订](#redactions)章节以获得完整概览。
## 服务器实现要素
{{% boxes/warning %}}
本节内容仅适用于服务器实现者。使用客户端-服务器 API 的应用通常不受此处细节影响。有关客户端注意事项的部分才是客户端-服务器 API 用例应参考的资料。
{{% /boxes/warning %}}
[房间版本 7](/rooms/v7) 增加了“敲门”,[房间版本 8](/rooms/v8) 增加了“加入限制”(并被 [房间版本 9](/rooms/v9) 进一步细化)——两者都为潜在成员提供了加入方式,但过去无法将两种机制结合使用。该房间版本引入了一种新的 `knock_restricted` 加入规则,混合了两种行为,允许用户只要满足 `restricted``knock` 加入规则之一即可加入房间。
此外,该房间版本还要求权限等级事件中的数值必须为整数类型,而不能是其它房间版本为兼容性允许的字符串表示形式。
房间版本 10 基于房间版本 9具体变化如下所述。
### 事件格式
该房间版本未对事件格式进行修改。详见[下文](#event-format-1)当前事件格式的详细信息。
#### 已弃用事件内容模式
虽然本房间版本未专门改变事件格式,但某些已弃用行为被严格禁止支持。
##### `m.room.power_levels` 事件的值必须为整数
在其它房间版本中,例如 [v9](/rooms/v9/#mroompower_levels-events-accept-values-as-strings),权限等级可以为兼容性目的用字符串表示。
本房间版本移除了此项兼容——权限等级在本版本中**不得**用字符串表示。结构不正确的权限等级将按照下述授权规则被拒绝。
### 授权规则
事件必须由 `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` 事件具有特定权限等级,否则通常是被授权规则所允许。需要注意的是,“修订等级”**不会**被授权规则考虑。
可以发送修订事件的权限,并不意味着修订应该被执行。接收服务器必须按照[处理修订](#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.`content``join_authorised_via_users_server` 键:
1. 若事件未由该键指向的用户的 homeserver 有效签名,则拒绝。
3.`membership``join`
1. 如果唯一的先前事件为 `m.room.create``state_key` 为创建者,则允许。
2.`sender` 不等于 `state_key`,则拒绝。
3.`sender` 被封禁,则拒绝。
4.`join_rule``invite``knock`,且成员状态为 `invite``join`,则允许。
5. {{% changed-in v=10 %}}
`join_rule``restricted``knock_restricted`
1. 若成员状态为 `join``invite`,则允许。
2.`content` 中的 `join_authorised_via_users_server` 不是有足够权限邀请其它用户的用户,则拒绝。
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. {{% changed-in v=10 %}}
`join_rule``knock``knock_restricted`,则拒绝。
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. {{% added-in v=10 %}}
`content``users_default``events_default``state_default``ban``redact``kick``invite` 属性存在且类型不是整数,则拒绝。
2. {{% added-in v=10 %}}
`content``events``notifications` 属性存在,且不是值为整数的对象,则拒绝。
3.`content` 中的 `users` 属性不是 key 为有效用户ID、值为整数的对象则拒绝。
4. 若房间中没有先前的 `m.room.power_levels` 事件,则允许。
5.`users_default``events_default``state_default``ban``redact``kick``invite` 属性,检查它们是否被添加、更改或移除。对于每一个变化项:
1. 若当前值大于 `sender` 的当前权限等级,则拒绝。
2. 若新值大于 `sender` 当前权限等级,则拒绝。
6. 对于变更或移除的 `events``notifications` 属性的每个条目:
1. 若当前值大于 `sender` 当前权限等级,则拒绝。
7. 对于新增或变更的 `events``notifications` 属性的每个条目:
1. 若新值大于 `sender` 当前权限等级,则拒绝。
8. 对于除 `sender` 自身外,变更或移除的 `users` 属性每个条目:
1. 若当前值大于等于 `sender` 当前权限等级,则拒绝。
9. 对于新增或变更的 `users` 属性每个条目:
1. 若新值大于 `sender` 当前权限等级,则拒绝。
10. 否则,允许。
10. 否则,允许。
{{% boxes/note %}}
这些规则的一些后果:
- 除非你是该房间的成员,否则仅允许的操作(除初始创建/加入外)为:加入公开房间;接受或拒绝房间邀请。
- 若想为某人解除封禁,你必须拥有大于等于踢人和封禁等级的权限,并且高于目标用户的权限等级。
{{% /boxes/note %}}
## 与 v9 保持一致内容
以下章节自 v9 起未改动,为资料完整起见在此列出。
### 修订Redactions
{{% rver-fragment name="v9-redactions" %}}
### 处理修订
{{% rver-fragment name="v3-handling-redactions" %}}
### 事件ID
{{% rver-fragment name="v4-event-ids" %}}
### 事件格式
{{% rver-fragment name="v6-event-format" %}}
### 状态解析
{{% rver-fragment name="v2-state-res" %}}
### 规范 JSON
{{% rver-fragment name="v6-canonical-json" %}}
### 签名密钥有效期
{{% rver-fragment name="v5-signing-requirements" %}}