Skip to content

Commit dc2111f

Browse files
committed
sdk: Push deserialization of UTD events down to BackupDownloadTask
This means the higher-level classes can be agnostic about the encryption algorithm; we don't actually care about that until BackupDownloadTask.
1 parent f1802d9 commit dc2111f

File tree

3 files changed

+34
-24
lines changed

3 files changed

+34
-24
lines changed

crates/matrix-sdk/src/encryption/backups/mod.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use ruma::{
3737
error::ErrorKind,
3838
},
3939
events::{
40-
room::encrypted::{EncryptedEventScheme, OriginalSyncRoomEncryptedEvent},
40+
room::encrypted::OriginalSyncRoomEncryptedEvent,
4141
secret::{request::SecretName, send::ToDeviceSecretSendEvent},
4242
},
4343
serde::Raw,
@@ -891,21 +891,19 @@ impl Backups {
891891
room: Room,
892892
client: Client,
893893
) {
894-
if let Ok(event) = event.deserialize() {
895-
if let EncryptedEventScheme::MegolmV1AesSha2(c) = &event.content.scheme {
896-
client
897-
.encryption()
898-
.backups()
899-
.maybe_download_room_key(room.room_id().to_owned(), c.session_id.to_owned());
900-
}
901-
}
894+
client.encryption().backups().maybe_download_room_key(room.room_id().to_owned(), event);
902895
}
903896

904-
pub(crate) fn maybe_download_room_key(&self, room_id: OwnedRoomId, session_id: String) {
897+
/// Send a notification to the task responsible for key backup downloads
898+
/// that it should attempt to download the keys for the given event.
899+
pub(crate) fn maybe_download_room_key(
900+
&self,
901+
room_id: OwnedRoomId,
902+
event: Raw<OriginalSyncRoomEncryptedEvent>,
903+
) {
905904
let tasks = self.client.inner.e2ee.tasks.lock().unwrap();
906-
907905
if let Some(task) = tasks.download_room_keys.as_ref() {
908-
task.trigger_download((room_id, session_id))
906+
task.trigger_download_for_utd_event(room_id, event);
909907
}
910908
}
911909

crates/matrix-sdk/src/encryption/tasks.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ use std::{collections::BTreeMap, time::Duration};
1616

1717
use futures_util::future::join_all;
1818
use matrix_sdk_common::failures_cache::FailuresCache;
19-
use ruma::OwnedRoomId;
19+
use ruma::{
20+
events::room::encrypted::{EncryptedEventScheme, OriginalSyncRoomEncryptedEvent},
21+
serde::Raw,
22+
OwnedRoomId,
23+
};
2024
use tokio::sync::mpsc::{self, UnboundedReceiver};
2125
use tracing::{trace, warn};
2226

@@ -124,8 +128,21 @@ impl BackupDownloadTask {
124128
Self { sender, join_handle }
125129
}
126130

127-
pub(crate) fn trigger_download(&self, room_key_info: RoomKeyInfo) {
128-
let _ = self.sender.send(room_key_info);
131+
/// Trigger a backup download for the keys for the given event.
132+
///
133+
/// Does nothing unless the event is encrypted using `m.megolm.v1.aes-sha2`.
134+
/// Otherwise, tells the listener task to set off a task to do a backup
135+
/// download, unless there is one already running.
136+
pub(crate) fn trigger_download_for_utd_event(
137+
&self,
138+
room_id: OwnedRoomId,
139+
event: Raw<OriginalSyncRoomEncryptedEvent>,
140+
) {
141+
if let Ok(deserialized_event) = event.deserialize() {
142+
if let EncryptedEventScheme::MegolmV1AesSha2(c) = deserialized_event.content.scheme {
143+
let _ = self.sender.send((room_id, c.session_id));
144+
}
145+
}
129146
}
130147

131148
pub(crate) async fn download(

crates/matrix-sdk/src/room/mod.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,22 +1120,17 @@ impl Room {
11201120
&self,
11211121
event: &Raw<OriginalSyncRoomEncryptedEvent>,
11221122
) -> Result<TimelineEvent> {
1123-
use ruma::events::room::encrypted::EncryptedEventScheme;
1124-
11251123
let machine = self.client.olm_machine().await;
11261124
let machine = machine.as_ref().ok_or(Error::NoOlmMachine)?;
11271125

11281126
let mut event =
11291127
match machine.decrypt_room_event(event.cast_ref(), self.inner.room_id()).await {
11301128
Ok(event) => event,
11311129
Err(e) => {
1132-
let event = event.deserialize()?;
1133-
if let EncryptedEventScheme::MegolmV1AesSha2(c) = event.content.scheme {
1134-
self.client
1135-
.encryption()
1136-
.backups()
1137-
.maybe_download_room_key(self.room_id().to_owned(), c.session_id);
1138-
}
1130+
self.client
1131+
.encryption()
1132+
.backups()
1133+
.maybe_download_room_key(self.room_id().to_owned(), event.clone());
11391134

11401135
return Err(e.into());
11411136
}

0 commit comments

Comments
 (0)