Skip to content

Commit 4bdcedb

Browse files
authored
Merge pull request #3221 from matrix-org/andybalaam/store-trackedusers-in-memorystore
crypto: Store TrackedUsers in MemoryStore
2 parents 3ccd2e9 + 099c855 commit 4bdcedb

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

crates/matrix-sdk-crypto/src/store/memorystore.rs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ pub struct MemoryStore {
5555
sessions: SessionStore,
5656
inbound_group_sessions: GroupSessionStore,
5757
outbound_group_sessions: StdRwLock<BTreeMap<OwnedRoomId, OutboundGroupSession>>,
58+
tracked_users: StdRwLock<Vec<TrackedUser>>,
5859
olm_hashes: StdRwLock<HashMap<String, HashSet<String>>>,
5960
devices: DeviceStore,
6061
identities: StdRwLock<HashMap<OwnedUserId, ReadOnlyUserIdentities>>,
@@ -76,6 +77,7 @@ impl Default for MemoryStore {
7677
sessions: SessionStore::new(),
7778
inbound_group_sessions: GroupSessionStore::new(),
7879
outbound_group_sessions: Default::default(),
80+
tracked_users: Default::default(),
7981
olm_hashes: Default::default(),
8082
devices: DeviceStore::new(),
8183
identities: Default::default(),
@@ -315,10 +317,13 @@ impl CryptoStore for MemoryStore {
315317
}
316318

317319
async fn load_tracked_users(&self) -> Result<Vec<TrackedUser>> {
318-
Ok(Vec::new())
320+
Ok(self.tracked_users.read().unwrap().clone())
319321
}
320322

321-
async fn save_tracked_users(&self, _: &[(&UserId, bool)]) -> Result<()> {
323+
async fn save_tracked_users(&self, tracked_users: &[(&UserId, bool)]) -> Result<()> {
324+
self.tracked_users.write().unwrap().extend(tracked_users.iter().map(|(user_id, dirty)| {
325+
TrackedUser { user_id: user_id.to_owned().into(), dirty: *dirty }
326+
}));
322327
Ok(())
323328
}
324329

@@ -472,7 +477,7 @@ impl CryptoStore for MemoryStore {
472477
#[cfg(test)]
473478
mod tests {
474479
use matrix_sdk_test::async_test;
475-
use ruma::room_id;
480+
use ruma::{room_id, user_id};
476481
use vodozemac::{Curve25519PublicKey, Ed25519PublicKey};
477482

478483
use crate::{
@@ -526,7 +531,7 @@ mod tests {
526531

527532
#[async_test]
528533
async fn test_outbound_group_session_store() {
529-
// Given an outbound sessions
534+
// Given an outbound session
530535
let (account, _) = get_account_and_session_test_helper();
531536
let room_id = room_id!("!test:localhost");
532537
let (outbound, _) = account.create_group_session_pair_with_defaults(room_id).await;
@@ -543,6 +548,26 @@ mod tests {
543548
);
544549
}
545550

551+
#[async_test]
552+
async fn test_tracked_users_store() {
553+
// Given some tracked users
554+
let tracked_users =
555+
&[(user_id!("@dirty_user:s"), true), (user_id!("@clean_user:t"), false)];
556+
557+
// When we save them to the store
558+
let store = MemoryStore::new();
559+
store.save_tracked_users(tracked_users).await.unwrap();
560+
561+
// Then we can get them out again
562+
let loaded_tracked_users =
563+
store.load_tracked_users().await.expect("failed to load tracked users");
564+
assert_eq!(loaded_tracked_users[0].user_id, user_id!("@dirty_user:s"));
565+
assert!(loaded_tracked_users[0].dirty);
566+
assert_eq!(loaded_tracked_users[1].user_id, user_id!("@clean_user:t"));
567+
assert!(!loaded_tracked_users[1].dirty);
568+
assert_eq!(loaded_tracked_users.len(), 2);
569+
}
570+
546571
#[async_test]
547572
async fn test_device_store() {
548573
let device = get_device();

crates/matrix-sdk-crypto/src/store/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ pub struct Changes {
526526
}
527527

528528
/// A user for which we are tracking the list of devices.
529-
#[derive(Debug, Serialize, Deserialize)]
529+
#[derive(Clone, Debug, Serialize, Deserialize)]
530530
pub struct TrackedUser {
531531
/// The user ID of the user.
532532
pub user_id: OwnedUserId,

0 commit comments

Comments
 (0)