9.3 KiB
title | type | weight | version |
---|---|---|---|
房间版本 6 | docs | 60 | 6 |
{{< boxes/warning >}} 本页面的翻译未经核对,可能存在翻译质量不佳、错翻、漏翻等情况。您可以在 Forgejo 存储库 打开 Issue、提交 Pull Request 或邮件联系我们提出改进建议和参与翻译与核对。 {{< /boxes/warning >}}
本房间版本基于 版本 5 进行构建,同时对事件执行的多项授权规则进行了变更。
客户端注意事项
本房间版本未引入任何新的客户端注意事项。实现本地化撤回算法的客户端,应参考下方 撤回 章节了解完整算法。
撤回
{{% added-in v=6 %}} m.room.aliases
的所有重要意义已从撤回算法中移除。其余规则与以往房间版本保持一致。
{{% rver-fragment name="v6-redactions" %}}
服务器实现组件
{{% boxes/warning %}} 本节内容仅供服务器实现者参考。使用客户端-服务器 API 的应用通常不会受此处细节影响。上述客户端注意事项章节才是客户端-服务器 API 用例应当参考的资源。 {{% /boxes/warning %}}
房间版本 6 对 房间版本 5 中描述的算法进行了如下更改。
撤回
见上。
事件格式
{{% added-in v=6 %}} 通过强制执行 规范化 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
属性指示的服务器进行签名。
影响授权的状态事件类型包括:
{{% boxes/note %}}
如未被明确指定,权限等级将按默认值推断。例如,提及 sender
权限等级时,也可能指房间中用户的默认权限等级。
{{% /boxes/note %}}
{{% boxes/note %}}
m.room.redaction
事件与其他事件一样受授权规则约束。实际上,这意味着除非 m.room.power_levels
事件通过 events
或 events_default
属性对 m.room.redaction
事件设置了权限要求,否则通常会被授权规则允许。需要注意的是,redact level 不会被授权规则采纳考虑。
能否发送撤回事件,并不意味着撤回操作本身应当被执行。接收服务器必须执行额外检查,详细说明见 处理撤回 章节。 {{% /boxes/note %}}
规则如下:
- 若事件类型为
m.room.create
:- 若包含任何
prev_events
,则拒绝。 - 若
room_id
的域名与sender
的域名不匹配,则拒绝。 - 若
content.room_version
存在且不是已识别的版本,则拒绝。 - 若
content
未包含creator
属性,则拒绝。 - 否则,允许。
- 若包含任何
- 针对事件的
auth_events
考虑如下:- 若同一
type
与state_key
对有重复条目,则拒绝。 - 若条目的
type
和state_key
未与服务器规范中授权事件选择算法规定的一致,则拒绝。 - 若存在在接收 PDU 时执行检查中被拒绝的条目,则拒绝。
- 若条目中无
m.room.create
事件,则拒绝。
- 若同一
- 若房间状态下
m.room.create
事件的content
含有m.federate
属性且值为false
,且事件的sender
域名与创建事件的sender
域名不一致,则拒绝。 - 若事件类型为
m.room.member
:- 若无
state_key
属性,或content
中无membership
属性,则拒绝。 - 若
membership
为join
:- 若仅有的前序事件为
m.room.create
且state_key
等于 creator,则允许。 - 若
sender
不等于state_key
,则拒绝。 - 若
sender
已被封禁,则拒绝。 - 若
join_rule
为invite
,则当 membership 状态为invite
或join
时允许。 - 若
join_rule
为public
,允许。 - 否则,拒绝。
- 若仅有的前序事件为
- 若
membership
为invite
:- 若
content
包含third_party_invite
属性:- 若目标用户被封禁,则拒绝。
- 若
content.third_party_invite
不含signed
属性,则拒绝。 - 若
signed
不含mxid
和token
属性,则拒绝。 - 若
mxid
不等于state_key
,则拒绝。 - 若当前房间状态中对应
token
的state_key
无m.room.third_party_invite
事件,则拒绝。 - 若
sender
不等于m.room.third_party_invite
事件的sender
,则拒绝。 - 若
signed
中任意签名与m.room.third_party_invite
事件中的任一公钥匹配,则允许。公钥可在m.room.third_party_invite
的content
中如下获取:public_key
属性中的单个公钥。public_keys
属性中的公钥列表。
- 否则,拒绝。
- 若
sender
当前的 membership 状态不是join
,则拒绝。 - 若目标用户当前的 membership 状态是
join
或ban
,则拒绝。 - 若
sender
权限等级大于或等于邀请权限,则允许。 - 否则,拒绝。
- 若
- 若
membership
为leave
:- 若
sender
与state_key
相同,仅当该用户当前 membership 状态为invite
或join
时允许。 - 若
sender
当前的 membership 状态不是join
,则拒绝。 - 若目标用户当前 membership 状态为
ban
,且sender
权限等级低于封禁权限,则拒绝。 - 若
sender
权限等级大于或等于踢人权限,且目标用户权限等级低于sender
,允许。 - 否则,拒绝。
- 若
- 若
membership
为ban
:- 若
sender
当前的 membership 状态不是join
,则拒绝。 - 若
sender
权限等级大于或等于封禁权限,且目标用户权限等级低于sender
,允许。 - 否则,拒绝。
- 若
- 否则,成员状态未知。拒绝。
- 若无
- 若
sender
当前的 membership 状态不是join
,则拒绝。 - 若事件类型为
m.room.third_party_invite
:- 仅当
sender
当前权限等级大于或等于邀请权限时允许。
- 仅当
- 若事件类型所需的权限等级高于
sender
当前权限等级,则拒绝。 - 若事件的
state_key
以@
开头且与sender
不一致,则拒绝。 - 若事件类型为
m.room.power_levels
:- 若
content
中的users
属性不是以有效用户 ID 为键且值为整数(或整数字符串)的对象,则拒绝。 - 若房间中不存在先前的
m.room.power_levels
事件,则允许。 - 对于
users_default
、events_default
、state_default
、ban
、redact
、kick
、invite
属性,检查是否有新增、变更或移除。对每项变更:- 若当前值高于
sender
当前权限等级,则拒绝。 - 若新值高于
sender
当前权限等级,则拒绝。
- 若当前值高于
- {{% changed-in v=6 %}}
针对
events
或notifications
属性中被变更或移除的每一项:- 若当前值大于
sender
当前权限等级,则拒绝。
- 若当前值大于
- {{% changed-in v=6 %}}
针对
events
或notifications
属性中新增加或变更的每一项:- 若新值大于
sender
当前权限等级,则拒绝。
- 若新值大于
- 针对
users
属性中被变更或移除的每一项,除sender
自身以外:- 若当前值大于等于
sender
当前权限等级,则拒绝。
- 若当前值大于等于
- 针对
users
属性中新增加或变更的每一项:- 若新值大于
sender
当前权限等级,则拒绝。
- 若新值大于
- 否则,允许。
- 若
- 否则,允许。
{{% 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" %}}