From c34f69f8a3996d6b90d30ee3e1d1493492aa3354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 10 Feb 2021 15:42:55 +0100 Subject: [PATCH] crypto: Don't receive the whole sync response, only what we need. This makes it clearer what the crypto layer is doing, this also makes it clearer for people that will use the crypto layer over FFI that they don't need to go through a serialize/deserialize cycle for the whole sync response. --- matrix_sdk_base/src/client.rs | 7 ++++++- matrix_sdk_crypto/src/machine.rs | 31 +++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/matrix_sdk_base/src/client.rs b/matrix_sdk_base/src/client.rs index 81b339c8..7e7d5f15 100644 --- a/matrix_sdk_base/src/client.rs +++ b/matrix_sdk_base/src/client.rs @@ -728,7 +728,12 @@ impl BaseClient { // decryptes to-device events, but leaves room events alone. // This makes sure that we have the deryption keys for the room // events at hand. - o.receive_sync_response(&response).await? + o.receive_sync_changes( + &response.to_device, + &response.device_lists, + &response.device_one_time_keys_count, + ) + .await? } else { response .to_device diff --git a/matrix_sdk_crypto/src/machine.rs b/matrix_sdk_crypto/src/machine.rs index b8405aa4..f54ce932 100644 --- a/matrix_sdk_crypto/src/machine.rs +++ b/matrix_sdk_crypto/src/machine.rs @@ -27,7 +27,7 @@ use matrix_sdk_common::{ upload_keys, upload_signatures::Request as UploadSignaturesRequest, }, - sync::sync_events::Response as SyncResponse, + sync::sync_events::{DeviceLists, ToDevice as RumaToDevice}, }, assign, deserialized_responses::ToDevice, @@ -763,19 +763,31 @@ impl OlmMachine { self.account.update_uploaded_key_count(key_count).await; } - /// Handle a sync response and update the internal state of the Olm machine. + /// Handle a to-device and one-time key counts from a sync response. /// - /// This will decrypt to-device events but will not touch events in the room - /// timeline. + /// This will decrypt and handle to-device events returning the decrypted + /// versions of them. /// /// To decrypt an event from the room timeline call [`decrypt_room_event`]. /// /// # Arguments /// - /// * `response` - The sync latest sync response. + /// * `to_device_events` - The to-device events of the current sync + /// response. + /// + /// * `changed_devices` - The list of devices that changed in this sync + /// resopnse. + /// + /// * `one_time_keys_count` - The current one-time keys counts that the sync + /// response returned. /// /// [`decrypt_room_event`]: #method.decrypt_room_event - pub async fn receive_sync_response(&self, response: &SyncResponse) -> OlmResult { + pub async fn receive_sync_changes( + &self, + to_device_events: &RumaToDevice, + changed_devices: &DeviceLists, + one_time_keys_counts: &BTreeMap, + ) -> OlmResult { // Remove verification objects that have expired or are done. self.verification_machine.garbage_collect(); @@ -786,10 +798,9 @@ impl OlmMachine { ..Default::default() }; - self.update_one_time_key_count(&response.device_one_time_keys_count) - .await; + self.update_one_time_key_count(one_time_keys_counts).await; - for user_id in &response.device_lists.changed { + for user_id in &changed_devices.changed { if let Err(e) = self.identity_manager.mark_user_as_changed(&user_id).await { error!("Error marking a tracked user as changed {:?}", e); } @@ -797,7 +808,7 @@ impl OlmMachine { let mut events = Vec::new(); - for event_result in &response.to_device.events { + for event_result in &to_device_events.events { let mut event = if let Ok(e) = event_result.deserialize() { e } else {