3.1 KiB
房间历史可见性
该模块增加了对控制房间中过往事件可见性的支持。
除 world_readable
外,在所有情况下,用户都必须先加入房间才能查看该房间内的事件。一旦用户加入房间,他们将能访问该房间中某个事件子集。该子集如何选择由下文描述的 m.room.history_visibility
事件控制。用户离开房间后,仍可查看离开前被允许查看的事件,但无法查看离开后收到的事件。
m.room.history_visibility
事件有四个选项:
world_readable
- 只要此项为m.room.history_visibility
的值,任何参与的服务器都可以与任何人共享所有事件,无论其是否曾加入该房间。shared
- 以前的事件始终对新加入的成员可见。即使用户不在房间内时发送的事件,房间内的所有事件也都可访问。invited
- 新加入成员仅能访问自被邀请起的事件。当成员的状态变为非invite
或join
时,事件将不再可访问。joined
- 新加入成员仅能访问自加入该房间起的事件。当成员的状态变为非join
时,事件将不再可访问。
{{% boxes/warning %}}
这些选项应用于事件发送时。判断依据是事件被添加到 DAG 时 m.room.history_visibility
的状态。这意味着,若当时的设置更为严格,客户端不能事后选择向新用户显示或隐藏历史记录。
{{% /boxes/warning %}}
事件
{{% event event="m.room.history_visibility" %}}
客户端行为
若历史可见性设置为 world_readable
,客户端可提示用户,非房间成员也可能读取事件内容。
服务器行为
默认情况下,如果未设置 history_visibility
,或其值无效,则视为 shared
。关于用户能否查看某个事件,需依据该事件发生时房间的状态判定。
- 如果
history_visibility
被设置为world_readable
,允许查看。 - 如果用户的
membership
为join
,允许查看。 - 如果
history_visibility
为shared
,且用户在事件发送后曾加入过房间,允许查看。 - 如果用户的
membership
为invite
,且history_visibility
被设置为invited
,允许查看。 - 否则,拒绝访问。
针对 m.room.history_visibility
事件本身,如果事件之前或之后的 history_visibility
允许用户可见,则应允许该用户查看。例如,即使用户不是房间成员,也应可以看到将 history_visibility
从 world_readable
更改为 joined
或从 joined
更改为 world_readable
的 m.room.history_visibility
事件。
同样,对于用户自身的 m.room.member
事件,如果事件前后的 membership
有任一允许用户查看,则应允许该用户查看该事件。例如,用户始终可以看到将其 membership
设为 join
的事件,或将其从 join
更改为其他值的事件,即使 history_visibility
为 joined
。
安全注意事项
出于兼容性考虑,history_visibility
默认值为 shared
。客户端需注意,若未设置该事件,则其房间历史对所有成员均可见。