Skip to content

Commit 06600ac

Browse files
committed
ui: Use new room_key stream for retrying decryption in Timeline
1 parent 9f72e2c commit 06600ac

File tree

3 files changed

+52
-112
lines changed

3 files changed

+52
-112
lines changed

crates/matrix-sdk-ui/src/timeline/builder.rs

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,21 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
use std::sync::Arc;
15+
use std::{iter, pin::pin, sync::Arc};
1616

1717
use async_std::sync::Mutex;
18+
use futures_util::StreamExt;
1819
use imbl::Vector;
1920
use matrix_sdk::{
20-
deserialized_responses::SyncTimelineEvent, executor::spawn, room, sync::RoomUpdate,
21+
deserialized_responses::SyncTimelineEvent, executor::spawn, room, sync::RoomUpdate, Client,
22+
};
23+
use ruma::{
24+
events::receipt::{ReceiptThread, ReceiptType},
25+
OwnedRoomId,
2126
};
22-
use ruma::events::receipt::{ReceiptThread, ReceiptType};
2327
use tokio::sync::{broadcast, mpsc};
2428
use tracing::{error, info, warn};
2529

26-
#[cfg(feature = "e2e-encryption")]
27-
use super::to_device::{handle_forwarded_room_key_event, handle_room_key_event};
2830
use super::{inner::TimelineInner, queue::send_queued_messages, Timeline, TimelineDropHandle};
2931

3032
/// Builder that allows creating and configuring various parts of a
@@ -189,24 +191,30 @@ impl TimelineBuilder {
189191
}
190192
});
191193

192-
// Not using room.add_event_handler here because RoomKey events are
193-
// to-device events that are not received in the context of a room.
194-
195-
#[cfg(feature = "e2e-encryption")]
196-
let room_key_handle = client
197-
.add_event_handler(handle_room_key_event(inner.clone(), room.room_id().to_owned()));
198194
#[cfg(feature = "e2e-encryption")]
199-
let forwarded_room_key_handle = client.add_event_handler(handle_forwarded_room_key_event(
200-
inner.clone(),
201-
room.room_id().to_owned(),
202-
));
203-
204-
let handles = vec![
205-
#[cfg(feature = "e2e-encryption")]
206-
room_key_handle,
207-
#[cfg(feature = "e2e-encryption")]
208-
forwarded_room_key_handle,
209-
];
195+
let room_key_update_join_handle = {
196+
let inner = inner.clone();
197+
match client.encryption().room_keys_for_room_received_stream(room.room_id()).await {
198+
Some(stream) => spawn(async move {
199+
let mut stream = pin!(stream);
200+
while let Some(vec) = stream.next().await {
201+
for room_key_info in vec {
202+
retry_decryption(
203+
client.clone(),
204+
inner.clone(),
205+
room_key_info.room_id,
206+
room_key_info.session_id,
207+
)
208+
.await;
209+
}
210+
}
211+
}),
212+
None => {
213+
error!("Can't listen for room key updates, OlmMachine not set up");
214+
spawn(async move {})
215+
}
216+
}
217+
};
210218

211219
let (msg_sender, msg_receiver) = mpsc::channel(1);
212220
if !read_only {
@@ -221,9 +229,9 @@ impl TimelineBuilder {
221229
_end_token: Mutex::new(None),
222230
msg_sender,
223231
drop_handle: Arc::new(TimelineDropHandle {
224-
client,
225-
event_handler_handles: handles,
226232
room_update_join_handle,
233+
#[cfg(feature = "e2e-encryption")]
234+
room_key_update_join_handle,
227235
}),
228236
};
229237

@@ -242,3 +250,18 @@ impl TimelineBuilder {
242250
timeline
243251
}
244252
}
253+
254+
#[tracing::instrument(skip(client, inner))]
255+
async fn retry_decryption(
256+
client: Client,
257+
inner: Arc<TimelineInner>,
258+
room_id: OwnedRoomId,
259+
session_id: String,
260+
) {
261+
let Some(room) = client.get_room(&room_id) else {
262+
error!("Failed to fetch room object");
263+
return;
264+
};
265+
266+
inner.retry_event_decryption(&room, Some(iter::once(session_id.as_str()).collect())).await;
267+
}

crates/matrix-sdk-ui/src/timeline/mod.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,9 @@ use futures_core::Stream;
2424
use imbl::Vector;
2525
use matrix_sdk::{
2626
attachment::AttachmentConfig,
27-
event_handler::EventHandlerHandle,
2827
executor::JoinHandle,
2928
room::{self, Joined, MessagesOptions, Receipts, Room},
30-
Client, Result,
29+
Result,
3130
};
3231
use mime::Mime;
3332
use pin_project_lite::pin_project;
@@ -60,8 +59,6 @@ mod read_receipts;
6059
mod sliding_sync_ext;
6160
#[cfg(test)]
6261
mod tests;
63-
#[cfg(feature = "e2e-encryption")]
64-
mod to_device;
6562
mod traits;
6663
mod virtual_item;
6764

@@ -652,17 +649,16 @@ impl Timeline {
652649

653650
#[derive(Debug)]
654651
struct TimelineDropHandle {
655-
client: Client,
656-
event_handler_handles: Vec<EventHandlerHandle>,
657652
room_update_join_handle: JoinHandle<()>,
653+
#[cfg(feature = "e2e-encryption")]
654+
room_key_update_join_handle: JoinHandle<()>,
658655
}
659656

660657
impl Drop for TimelineDropHandle {
661658
fn drop(&mut self) {
662-
for handle in self.event_handler_handles.drain(..) {
663-
self.client.remove_event_handler(handle);
664-
}
665659
self.room_update_join_handle.abort();
660+
#[cfg(feature = "e2e-encryption")]
661+
self.room_key_update_join_handle.abort();
666662
}
667663
}
668664

crates/matrix-sdk-ui/src/timeline/to_device.rs

Lines changed: 0 additions & 79 deletions
This file was deleted.

0 commit comments

Comments
 (0)