matrix_sdk_base/response_processors/e2ee/
tracked_users.rs1use std::collections::BTreeSet;
16
17use matrix_sdk_common::timer;
18use matrix_sdk_crypto::OlmMachine;
19use ruma::{OwnedUserId, RoomId};
20
21use crate::{EncryptionState, Result, RoomMemberships, store::BaseStateStore};
22
23pub async fn update(
25 olm_machine: Option<&OlmMachine>,
26 room_encryption_state: EncryptionState,
27 user_ids_to_track: &BTreeSet<OwnedUserId>,
28) -> Result<()> {
29 if room_encryption_state.is_encrypted()
30 && let Some(olm) = olm_machine
31 && !user_ids_to_track.is_empty()
32 {
33 olm.update_tracked_users(user_ids_to_track.iter().map(AsRef::as_ref)).await?
34 }
35
36 Ok(())
37}
38
39pub async fn update_or_set_if_room_is_newly_encrypted(
42 olm_machine: Option<&OlmMachine>,
43 user_ids_to_track: &BTreeSet<OwnedUserId>,
44 new_room_encryption_state: EncryptionState,
45 previous_room_encryption_state: EncryptionState,
46 room_id: &RoomId,
47 state_store: &BaseStateStore,
48) -> Result<()> {
49 let _timer = timer!(tracing::Level::TRACE, "update_or_set_if_room_is_newly_encrypted");
50
51 if new_room_encryption_state.is_encrypted()
52 && let Some(olm) = olm_machine
53 {
54 if !previous_room_encryption_state.is_encrypted() {
55 let user_ids = state_store.get_user_ids(room_id, RoomMemberships::ACTIVE).await?;
59 olm.update_tracked_users(user_ids.iter().map(AsRef::as_ref)).await?
60 }
61
62 if !user_ids_to_track.is_empty() {
63 olm.update_tracked_users(user_ids_to_track.iter().map(AsRef::as_ref)).await?;
64 }
65 }
66
67 Ok(())
68}