docs-matrix-spec/locales/zh-Hans/client-server-api/modules/history_visibility.md
2025-04-20 16:13:37 +08:00

3.1 KiB

房间历史可见性

该模块增加了对控制房间中过往事件可见性的支持。

world_readable 外,在所有情况下,用户都必须先加入房间才能查看该房间内的事件。一旦用户加入房间,他们将能访问该房间中某个事件子集。该子集如何选择由下文描述的 m.room.history_visibility 事件控制。用户离开房间后,仍可查看离开前被允许查看的事件,但无法查看离开后收到的事件。

m.room.history_visibility 事件有四个选项:

  • world_readable - 只要此项为 m.room.history_visibility 的值,任何参与的服务器都可以与任何人共享所有事件,无论其是否曾加入该房间。
  • shared - 以前的事件始终对新加入的成员可见。即使用户不在房间内时发送的事件,房间内的所有事件也都可访问。
  • invited - 新加入成员仅能访问自被邀请起的事件。当成员的状态变为非 invitejoin 时,事件将不再可访问。
  • joined - 新加入成员仅能访问自加入该房间起的事件。当成员的状态变为非 join 时,事件将不再可访问。

{{% boxes/warning %}} 这些选项应用于事件发送时。判断依据是事件被添加到 DAG 时 m.room.history_visibility 的状态。这意味着,若当时的设置更为严格,客户端不能事后选择向新用户显示或隐藏历史记录。 {{% /boxes/warning %}}

事件

{{% event event="m.room.history_visibility" %}}

客户端行为

若历史可见性设置为 world_readable,客户端可提示用户,非房间成员也可能读取事件内容。

服务器行为

默认情况下,如果未设置 history_visibility,或其值无效,则视为 shared。关于用户能否查看某个事件,需依据该事件发生时房间的状态判定。

  1. 如果 history_visibility 被设置为 world_readable,允许查看。
  2. 如果用户的 membershipjoin,允许查看。
  3. 如果 history_visibilityshared,且用户在事件发送后曾加入过房间,允许查看。
  4. 如果用户的 membershipinvite,且 history_visibility 被设置为 invited,允许查看。
  5. 否则,拒绝访问。

针对 m.room.history_visibility 事件本身,如果事件之前或之后history_visibility 允许用户可见,则应允许该用户查看。例如,即使用户不是房间成员,也应可以看到将 history_visibilityworld_readable 更改为 joined 或从 joined 更改为 world_readablem.room.history_visibility 事件。

同样,对于用户自身的 m.room.member 事件,如果事件前后membership 有任一允许用户查看,则应允许该用户查看该事件。例如,用户始终可以看到将其 membership 设为 join 的事件,或将其从 join 更改为其他值的事件,即使 history_visibilityjoined

安全注意事项

出于兼容性考虑,history_visibility 默认值为 shared。客户端需注意,若未设置该事件,则其房间历史对所有成员均可见。