11 KiB
title | type | weight | version |
---|---|---|---|
房间版本 10 | docs | 100 | 10 |
{{< boxes/warning >}} 本页面的翻译未经核对,可能存在翻译质量不佳、错翻、漏翻等情况。您可以在 Forgejo 存储库 打开 Issue、提交 Pull Request 或邮件联系我们提出改进建议和参与翻译与核对。 {{< /boxes/warning >}}
该房间版本基于版本 9,强制要求权限等级(power level)值为整数,并引入了新的 knock_restricted
加入规则,使潜在成员更容易加入此类房间。
客户端注意事项
此房间版本增加了新的 knock_restricted
加入规则,允许房间的潜在成员通过敲门(在房间版本 7中引入)或“加入限制”(在房间版本 8中引入并在房间版本 9中细化)两种方式加入房间。
客户端应针对具备该规则的房间做出相应渲染。例如:
该房间为:
[ ] 公开
[x] 私有
加入规则(公开时禁用):
[x] 允许 `#space:example.org` 的成员加入
[x] 允许敲门
本地实现事件修订(redaction)算法的客户端,应参考下文的修订章节以获得完整概览。
服务器实现要素
{{% boxes/warning %}} 本节内容仅适用于服务器实现者。使用客户端-服务器 API 的应用通常不受此处细节影响。有关客户端注意事项的部分才是客户端-服务器 API 用例应参考的资料。 {{% /boxes/warning %}}
房间版本 7 增加了“敲门”,房间版本 8 增加了“加入限制”(并被 房间版本 9 进一步细化)——两者都为潜在成员提供了加入方式,但过去无法将两种机制结合使用。该房间版本引入了一种新的 knock_restricted
加入规则,混合了两种行为,允许用户只要满足 restricted
或 knock
加入规则之一即可加入房间。
此外,该房间版本还要求权限等级事件中的数值必须为整数类型,而不能是其它房间版本为兼容性允许的字符串表示形式。
房间版本 10 基于房间版本 9,具体变化如下所述。
事件格式
该房间版本未对事件格式进行修改。详见下文当前事件格式的详细信息。
已弃用事件内容模式
虽然本房间版本未专门改变事件格式,但某些已弃用行为被严格禁止支持。
m.room.power_levels
事件的值必须为整数
在其它房间版本中,例如 v9,权限等级可以为兼容性目的用字符串表示。
本房间版本移除了此项兼容——权限等级在本版本中不得用字符串表示。结构不正确的权限等级将按照下述授权规则被拒绝。
授权规则
事件必须由 sender
属性所标记的服务器签名。
影响授权的状态事件类型有:
{{% boxes/note %}}
如果没有明确指定权限等级,将采用默认值。例如,对 sender
权限等级的引用也可视为房间用户的默认权限等级。
{{% /boxes/note %}}
{{% boxes/note %}}
m.room.redaction
事件在授权规则上的处理与其他事件一致。实际上,除非 m.room.power_levels
通过 events
或 events_default
属性要求 m.room.redaction
事件具有特定权限等级,否则通常是被授权规则所允许。需要注意的是,“修订等级”不会被授权规则考虑。
可以发送修订事件的权限,并不意味着修订应该被执行。接收服务器必须按照处理修订章节所述进行额外检查。 {{% /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
属性,则拒绝。 - 若
content
有join_authorised_via_users_server
键:- 若事件未由该键指向的用户的 homeserver 有效签名,则拒绝。
- 若
membership
为join
:- 如果唯一的先前事件为
m.room.create
且state_key
为创建者,则允许。 - 若
sender
不等于state_key
,则拒绝。 - 若
sender
被封禁,则拒绝。 - 若
join_rule
为invite
或knock
,且成员状态为invite
或join
,则允许。 - {{% changed-in v=10 %}}
若
join_rule
为restricted
或knock_restricted
:- 若成员状态为
join
或invite
,则允许。 - 若
content
中的join_authorised_via_users_server
不是有足够权限邀请其它用户的用户,则拒绝。 - 否则,允许。
- 若成员状态为
- 若
join_rule
为public
,则允许。 - 否则,拒绝。
- 如果唯一的先前事件为
- 若
membership
为invite
:- 若
content
中有third_party_invite
属性:- 若目标用户已被封禁,则拒绝。
- 若
content.third_party_invite
没有signed
属性,则拒绝。 - 若
signed
没有mxid
和token
属性,则拒绝。 - 若
mxid
不等于state_key
,则拒绝。 - 若当前房间状态下没有
state_key
等于token
的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
当前成员状态不是join
,则拒绝。 - 若目标用户当前状态为
join
或ban
,则拒绝。 - 若
sender
权限等级大于等于邀请等级,允许。 - 否则,拒绝。
- 若
- 若
membership
为leave
:- 若
sender
匹配state_key
,则仅当用户当前状态为invite
、join
或knock
时允许。 - 若
sender
的当前成员状态不是join
,则拒绝。 - 若目标用户当前成员状态为
ban
且sender
权限等级低于封禁等级,则拒绝。 - 若
sender
权限等级大于等于踢人等级且目标用户权限等级小于sender
,则允许。 - 否则,拒绝。
- 若
- 若
membership
为ban
:- 若
sender
当前成员状态不是join
,则拒绝。 - 若
sender
权限等级大于等于封禁等级且目标用户权限等级小于sender
,则允许。 - 否则,拒绝。
- 若
- 若
membership
为knock
:- {{% changed-in v=10 %}}
若
join_rule
非knock
或knock_restricted
,则拒绝。 - 若
sender
不等于state_key
,则拒绝。 - 若
sender
当前成员状态不是ban
、invite
或join
,则允许。 - 否则,拒绝。
- {{% changed-in v=10 %}}
若
- 否则,成员状态未知,拒绝。
- 若没有
- 若
sender
当前成员状态不是join
,则拒绝。 - 若类型为
m.room.third_party_invite
:- 仅当
sender
权限等级大于等于邀请等级时允许。
- 仅当
- 若该事件类型所需权限等级大于
sender
权限等级,则拒绝。 - 若事件的
state_key
以@
开头且与sender
不一致,则拒绝。 - 若类型为
m.room.power_levels
:- {{% added-in v=10 %}}
若
content
中users_default
、events_default
、state_default
、ban
、redact
、kick
或invite
属性存在且类型不是整数,则拒绝。 - {{% added-in v=10 %}}
若
content
中events
或notifications
属性存在,且不是值为整数的对象,则拒绝。 - 若
content
中的users
属性不是 key 为有效用户ID、值为整数的对象,则拒绝。 - 若房间中没有先前的
m.room.power_levels
事件,则允许。 - 对
users_default
、events_default
、state_default
、ban
、redact
、kick
、invite
属性,检查它们是否被添加、更改或移除。对于每一个变化项:- 若当前值大于
sender
的当前权限等级,则拒绝。 - 若新值大于
sender
当前权限等级,则拒绝。
- 若当前值大于
- 对于变更或移除的
events
或notifications
属性的每个条目:- 若当前值大于
sender
当前权限等级,则拒绝。
- 若当前值大于
- 对于新增或变更的
events
或notifications
属性的每个条目:- 若新值大于
sender
当前权限等级,则拒绝。
- 若新值大于
- 对于除
sender
自身外,变更或移除的users
属性每个条目:- 若当前值大于等于
sender
当前权限等级,则拒绝。
- 若当前值大于等于
- 对于新增或变更的
users
属性每个条目:- 若新值大于
sender
当前权限等级,则拒绝。
- 若新值大于
- 否则,允许。
- {{% added-in v=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" %}}