Skip to content

Commit 1e70b4f

Browse files
committed
fix(crypto): Automatically track your own user if the caller doesn't do so
Users of the crypto crate should mark all members that are part of an E2EE room for tracking, this will of course mark your own user for tracking. If the crypto crate user doesn't have any E2EE rooms he may not add any members to be tracked. The user might still want to inspect their own E2EE devices and identities. This patch makes sure that our member is tracked.
1 parent 9835c4a commit 1e70b4f

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

crates/matrix-sdk-crypto/src/identities/manager.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,18 @@ impl IdentityManager {
404404
pub async fn users_for_key_query(&self) -> Vec<KeysQueryRequest> {
405405
let users = self.store.users_for_key_query();
406406

407+
// We always want to track our own user, but in case we aren't in an encrypted
408+
// room yet, we won't be tracking ourselves yet. This ensures we are always
409+
// tracking ourselves.
410+
//
411+
// The check for emptiness is done first for performance.
412+
let users = if users.is_empty() && !self.store.tracked_users().contains(self.user_id()) {
413+
self.update_tracked_users([self.user_id()]).await;
414+
self.store.users_for_key_query()
415+
} else {
416+
users
417+
};
418+
407419
if users.is_empty() {
408420
Vec::new()
409421
} else {
@@ -665,7 +677,7 @@ pub(crate) mod test {
665677
#[async_test]
666678
async fn test_manager_creation() {
667679
let manager = manager();
668-
assert!(manager.users_for_key_query().await.is_empty())
680+
assert!(manager.store.tracked_users().is_empty())
669681
}
670682

671683
#[async_test]
@@ -715,4 +727,19 @@ pub(crate) mod test {
715727

716728
assert!(identity.is_device_signed(&device).is_ok())
717729
}
730+
731+
#[async_test]
732+
async fn no_tracked_users_key_query_request() {
733+
let manager = manager();
734+
735+
assert!(manager.store.tracked_users().is_empty(), "No users are initially tracked");
736+
737+
let requests = manager.users_for_key_query().await;
738+
739+
assert!(!requests.is_empty(), "We query the keys for our own user");
740+
assert!(
741+
manager.store.tracked_users().contains(manager.user_id()),
742+
"Our own user is now tracked"
743+
);
744+
}
718745
}

0 commit comments

Comments
 (0)