7.1 KiB
7.1 KiB
{{< boxes/warning >}} 本页面的翻译未经核对,可能存在翻译质量不佳、错翻、漏翻等情况。您可以在 Forgejo 存储库 打开 Issue、提交 Pull Request 或邮件联系我们提出改进建议和参与翻译与核对。 {{< /boxes/warning >}}
{{% added-in v=3 %}} 在房间版本1和2中,事件需要来自 event_id
域的签名才能被视为有效。此房间版本在联邦过程中并未以相同方式包含 event_id
,因此不需要该服务器的签名。不过,事件仍然必须由 sender
属性标识的服务器签名。
影响授权的状态事件类型有:
{{% boxes/note %}}
当未显式提供权限等级时,将根据默认值推断。例如,对 sender
权限等级的引用,也可以指代房间内用户的默认权限等级。
{{% /boxes/note %}}
截至房间版本3,完整的规则列表如下:
- 如果类型为
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.aliases
:- 如果没有
state_key
,则拒绝。 - 如果发送者域与
state_key
不同,则拒绝。 - 否则,允许。
- 如果没有
- 如果类型为
m.room.member
:- 如果没有
state_key
属性,或content
中没有membership
属性,则拒绝。 - 如果
membership
是join
:- 如果唯一的前置事件是
m.room.create
并且state_key
是创建者,则允许。 - 如果
sender
不等于state_key
,则拒绝。 - 如果
sender
被封禁,则拒绝。 - 如果
join_rule
为invite
,则当成员状态为invite
或join
时允许。 - 如果
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
,则允许,否则拒绝。 - 如果
sender
当前成员状态不是join
,则拒绝。 - 如果目标用户当前成员状态为
ban
,且sender
权限等级小于封禁等级,则拒绝。 - 如果
sender
权限等级大于或等于踢出等级,且目标用户的权限等级小于sender
,则允许。 - 否则,拒绝。
- 如果
- 如果
membership
是ban
:- 如果
sender
当前的成员状态不是join
,则拒绝。 - 如果
sender
权限等级大于或等于封禁等级,且目标用户的权限等级小于sender
,则允许。 - 否则,拒绝。
- 如果
- 其他情况下,成员状态未知,拒绝。
- 如果没有
- 如果
sender
当前成员状态不是join
,则拒绝。 - 如果类型为
m.room.third_party_invite
:- 仅当
sender
当前权限等级大于或等于邀请等级时允许。
- 仅当
- 如果事件类型的所需权限等级大于
sender
的权限等级,则拒绝。 - 如果事件有以
@
开头且与sender
不一致的state_key
,则拒绝。 - 如果类型为
m.room.power_levels
:- 如果
content
中的users
属性不是一个以有效用户ID为键、值为整数(或整数字符串)的对象,则拒绝。 - 如果房间中没有先前的
m.room.power_levels
事件,则允许。 - 检查
users_default
、events_default
、state_default
、ban
、redact
、kick
、invite
属性是否被新增、变更或移除。对于每一个变动:- 如果当前值大于
sender
当前权限等级,则拒绝。 - 如果新值大于
sender
当前权限等级,则拒绝。
- 如果当前值大于
- 针对
events
属性中被更改或移除的每一项:- 如果当前值大于
sender
当前权限等级,则拒绝。
- 如果当前值大于
- 针对
events
属性中被新增或变更的每一项:- 如果新值大于
sender
当前权限等级,则拒绝。
- 如果新值大于
- 针对
users
属性中被更改或移除的每一项(除了sender
自己的项):- 如果当前值大于等于
sender
当前权限等级,则拒绝。
- 如果当前值大于等于
- 针对
users
属性中被新增或变更的每一项:- 如果新值大于
sender
当前权限等级,则拒绝。
- 如果新值大于
- 否则,允许。
- 如果
- 其他情况下,允许。
{{% boxes/note %}} 这些规则的一些后果:
- 除非你是房间成员,除了初始化创建/加入外,唯一被允许的操作是:加入公开房间;接受或拒绝房间邀请。
- 要解除对某人的封禁,你的权限等级必须大于等于踢出和封禁等级,并且高于目标用户的权限等级。 {{% /boxes/note %}}