diff --git a/crates/matrix-sdk-crypto/src/store/memorystore.rs b/crates/matrix-sdk-crypto/src/store/memorystore.rs index 9f04a698d..7f113d0f9 100644 --- a/crates/matrix-sdk-crypto/src/store/memorystore.rs +++ b/crates/matrix-sdk-crypto/src/store/memorystore.rs @@ -782,6 +782,10 @@ impl CryptoStore for MemoryStore { Ok(self.rooms_pending_key_bundle.read().get(room_id).cloned()) } + async fn get_all_rooms_pending_key_bundles(&self) -> Result> { + Ok(self.rooms_pending_key_bundle.read().values().cloned().collect()) + } + async fn has_downloaded_all_room_keys(&self, room_id: &RoomId) -> Result { let guard = self.room_key_backups_fully_downloaded.read(); Ok(guard.contains(room_id)) @@ -1629,6 +1633,12 @@ mod integration_tests { self.0.get_pending_key_bundle_details_for_room(room_id).await } + async fn get_all_rooms_pending_key_bundles( + &self, + ) -> Result, Self::Error> { + self.0.get_all_rooms_pending_key_bundles().await + } + async fn get_custom_value(&self, key: &str) -> Result>, Self::Error> { self.0.get_custom_value(key).await } diff --git a/crates/matrix-sdk-crypto/src/store/traits.rs b/crates/matrix-sdk-crypto/src/store/traits.rs index b4987ef34..82dc05a7b 100644 --- a/crates/matrix-sdk-crypto/src/store/traits.rs +++ b/crates/matrix-sdk-crypto/src/store/traits.rs @@ -363,6 +363,12 @@ pub trait CryptoStore: AsyncTraitDeps { room_id: &RoomId, ) -> Result, Self::Error>; + /// Retrieve a list of details for all rooms where we are currently awaiting + /// key bundles to be received. + async fn get_all_rooms_pending_key_bundles( + &self, + ) -> Result, Self::Error>; + /// Get whether we have previously downloaded all room keys for a particular /// room from the key backup in advance of building a room key bundle. async fn has_downloaded_all_room_keys(&self, room_id: &RoomId) -> Result; @@ -649,6 +655,12 @@ impl CryptoStore for EraseCryptoStoreError { self.0.get_pending_key_bundle_details_for_room(room_id).await.map_err(Into::into) } + async fn get_all_rooms_pending_key_bundles( + &self, + ) -> Result, Self::Error> { + self.0.get_all_rooms_pending_key_bundles().await.map_err(Into::into) + } + async fn get_custom_value(&self, key: &str) -> Result>, Self::Error> { self.0.get_custom_value(key).await.map_err(Into::into) } diff --git a/crates/matrix-sdk-indexeddb/src/crypto_store/mod.rs b/crates/matrix-sdk-indexeddb/src/crypto_store/mod.rs index 00df131aa..4070558fc 100644 --- a/crates/matrix-sdk-indexeddb/src/crypto_store/mod.rs +++ b/crates/matrix-sdk-indexeddb/src/crypto_store/mod.rs @@ -1608,6 +1608,24 @@ impl_crypto_store! { Ok(result) } + async fn get_all_rooms_pending_key_bundles(&self) -> Result> { + let result = self + .inner + .transaction(keys::ROOMS_PENDING_KEY_BUNDLE) + .with_mode(TransactionMode::Readonly) + .build()? + .object_store(keys::ROOMS_PENDING_KEY_BUNDLE)? + .get_all() + .await? + .map(|result| { + result + .map_err(Into::into) + .and_then(|v| self.serializer.deserialize_value(v).map_err(Into::into)) + }) + .collect::>>()?; + Ok(result) + } + async fn get_custom_value(&self, key: &str) -> Result>> { self.inner .transaction(keys::CORE) diff --git a/crates/matrix-sdk-sqlite/src/crypto_store.rs b/crates/matrix-sdk-sqlite/src/crypto_store.rs index d43fab1c6..f4943c638 100644 --- a/crates/matrix-sdk-sqlite/src/crypto_store.rs +++ b/crates/matrix-sdk-sqlite/src/crypto_store.rs @@ -903,6 +903,12 @@ trait SqliteObjectCryptoStoreExt: SqliteAsyncConnExt { .optional()?) } + async fn get_all_rooms_pending_key_bundle(&self) -> Result>> { + Ok(self + .query_many("SELECT data FROM rooms_pending_key_bundle", (), |row| row.get(0)) + .await?) + } + async fn has_downloaded_all_room_keys(&self, room_id: Key) -> Result { Ok(self .query_row( @@ -1581,6 +1587,15 @@ impl CryptoStore for SqliteCryptoStore { Ok(Some(details)) } + async fn get_all_rooms_pending_key_bundles(&self) -> Result> { + let details = self.read().await?.get_all_rooms_pending_key_bundle().await?; + let room_ids = details + .into_iter() + .map(|value| self.deserialize_value(&value)) + .collect::>()?; + Ok(room_ids) + } + async fn get_custom_value(&self, key: &str) -> Result>> { let Some(serialized) = self.read().await?.get_kv(key).await? else { return Ok(None);