Skip to content

Commit 8c77e01

Browse files
committed
refactor(crypto): Store the session ID of a UTD in RemoteEventTimelineItem
1 parent dddbcfb commit 8c77e01

File tree

8 files changed

+60
-12
lines changed

8 files changed

+60
-12
lines changed

crates/matrix-sdk-common/src/deserialized_responses.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,15 @@ impl TimelineEventKind {
540540
TimelineEventKind::PlainText { event } => event,
541541
}
542542
}
543+
544+
/// The Megolm session ID that was used to send this event, if it is a UTD.
545+
pub fn session_id(&self) -> Option<String> {
546+
match self {
547+
TimelineEventKind::Decrypted(_decrypted_room_event) => None,
548+
TimelineEventKind::UnableToDecrypt { utd_info, .. } => utd_info.session_id.clone(),
549+
TimelineEventKind::PlainText { .. } => None,
550+
}
551+
}
543552
}
544553

545554
#[cfg(not(tarpaulin_include))]

crates/matrix-sdk-ui/src/timeline/controller/observable_items.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@ mod observable_items_tests {
415415
original_json: None,
416416
latest_edit_json: None,
417417
origin: RemoteEventOrigin::Sync,
418+
session_id: None,
418419
}),
419420
Default::default(),
420421
false,

crates/matrix-sdk-ui/src/timeline/controller/state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ impl TimelineState {
170170
let mut date_divider_adjuster = DateDividerAdjuster::new(date_divider_mode);
171171

172172
TimelineEventHandler::new(&mut txn, ctx)
173-
.handle_event(&mut date_divider_adjuster, content)
173+
.handle_event(&mut date_divider_adjuster, content, None)
174174
.await;
175175

176176
txn.adjust_date_dividers(date_divider_adjuster);

crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ impl<'a> TimelineStateTransaction<'a> {
204204
date_divider_adjuster: &mut DateDividerAdjuster,
205205
) -> HandleEventResult {
206206
let TimelineEvent { push_actions, kind } = event;
207+
let session_id = kind.session_id();
207208
let encryption_info = kind.encryption_info().cloned();
208209

209210
let (raw, utd_info) = match kind {
@@ -410,7 +411,9 @@ impl<'a> TimelineStateTransaction<'a> {
410411
};
411412

412413
// Handle the event to create or update a timeline item.
413-
TimelineEventHandler::new(self, ctx).handle_event(date_divider_adjuster, event_kind).await
414+
TimelineEventHandler::new(self, ctx)
415+
.handle_event(date_divider_adjuster, event_kind, session_id)
416+
.await
414417
}
415418

416419
/// Remove one timeline item by its `event_index`.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,7 @@ mod tests {
660660
original_json: None,
661661
latest_edit_json: None,
662662
origin: crate::timeline::event_item::RemoteEventOrigin::Sync,
663+
session_id: None,
663664
});
664665
EventTimelineItem::new(
665666
owned_user_id!("@alice:example.org"),

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

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
360360
mut self,
361361
date_divider_adjuster: &mut DateDividerAdjuster,
362362
event_kind: TimelineEventKind,
363+
session_id: Option<String>,
363364
) -> HandleEventResult {
364365
let span = tracing::Span::current();
365366

@@ -398,13 +399,17 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
398399

399400
AnyMessageLikeEventContent::RoomMessage(c) => {
400401
if should_add {
401-
self.handle_room_message(c, relations);
402+
self.handle_room_message(c, relations, session_id);
402403
}
403404
}
404405

405406
AnyMessageLikeEventContent::Sticker(content) => {
406407
if should_add {
407-
self.add_item(TimelineItemContent::Sticker(Sticker { content }), None);
408+
self.add_item(
409+
TimelineItemContent::Sticker(Sticker { content }),
410+
None,
411+
session_id,
412+
);
408413
}
409414
}
410415

@@ -416,7 +421,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
416421
UnstablePollStartEventContent::New(c),
417422
) => {
418423
if should_add {
419-
self.handle_poll_start(c, relations)
424+
self.handle_poll_start(c, relations, session_id)
420425
}
421426
}
422427

@@ -426,13 +431,13 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
426431

427432
AnyMessageLikeEventContent::CallInvite(_) => {
428433
if should_add {
429-
self.add_item(TimelineItemContent::CallInvite, None);
434+
self.add_item(TimelineItemContent::CallInvite, None, session_id);
430435
}
431436
}
432437

433438
AnyMessageLikeEventContent::CallNotify(_) => {
434439
if should_add {
435-
self.add_item(TimelineItemContent::CallNotify, None)
440+
self.add_item(TimelineItemContent::CallNotify, None, session_id)
436441
}
437442
}
438443

@@ -448,7 +453,11 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
448453
TimelineEventKind::UnableToDecrypt { content, utd_cause } => {
449454
// TODO: Handle replacements if the replaced event is also UTD
450455
if should_add {
451-
self.add_item(TimelineItemContent::unable_to_decrypt(content, utd_cause), None);
456+
self.add_item(
457+
TimelineItemContent::unable_to_decrypt(content, utd_cause),
458+
None,
459+
session_id,
460+
);
452461
}
453462

454463
// Let the hook know that we ran into an unable-to-decrypt that is added to the
@@ -463,7 +472,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
463472

464473
TimelineEventKind::RedactedMessage { event_type } => {
465474
if event_type != MessageLikeEventType::Reaction && should_add {
466-
self.add_item(TimelineItemContent::RedactedMessage, None);
475+
self.add_item(TimelineItemContent::RedactedMessage, None, session_id);
467476
}
468477
}
469478

@@ -473,7 +482,11 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
473482

474483
TimelineEventKind::RoomMember { user_id, content, sender } => {
475484
if should_add {
476-
self.add_item(TimelineItemContent::room_member(user_id, content, sender), None);
485+
self.add_item(
486+
TimelineItemContent::room_member(user_id, content, sender),
487+
None,
488+
session_id,
489+
);
477490
}
478491
}
479492

@@ -484,6 +497,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
484497
self.add_item(
485498
TimelineItemContent::OtherState(OtherState { state_key, content }),
486499
None,
500+
session_id,
487501
);
488502
}
489503
}
@@ -493,6 +507,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
493507
self.add_item(
494508
TimelineItemContent::FailedToParseMessageLike { event_type, error },
495509
None,
510+
session_id,
496511
);
497512
}
498513
}
@@ -502,6 +517,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
502517
self.add_item(
503518
TimelineItemContent::FailedToParseState { event_type, state_key, error },
504519
None,
520+
session_id,
505521
);
506522
}
507523
}
@@ -535,6 +551,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
535551
&mut self,
536552
msg: RoomMessageEventContent,
537553
relations: BundledMessageLikeRelations<AnySyncMessageLikeEvent>,
554+
session_id: Option<String>,
538555
) {
539556
// Always remove the pending edit, if there's any. The reason is that if
540557
// there's an edit in the relations mapping, we want to prefer it over any
@@ -564,7 +581,11 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
564581

565582
let edit_json = edit_json.flatten();
566583

567-
self.add_item(TimelineItemContent::message(msg, edit_content, self.items), edit_json);
584+
self.add_item(
585+
TimelineItemContent::message(msg, edit_content, self.items),
586+
edit_json,
587+
session_id,
588+
);
568589
}
569590

570591
#[instrument(skip_all, fields(replacement_event_id = ?replacement.event_id))]
@@ -839,6 +860,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
839860
&mut self,
840861
c: NewUnstablePollStartEventContent,
841862
relations: BundledMessageLikeRelations<AnySyncMessageLikeEvent>,
863+
session_id: Option<String>,
842864
) {
843865
// Always remove the pending edit, if there's any. The reason is that if
844866
// there's an edit in the relations mapping, we want to prefer it over any
@@ -876,7 +898,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
876898

877899
let edit_json = edit_json.flatten();
878900

879-
self.add_item(TimelineItemContent::Poll(poll_state), edit_json);
901+
self.add_item(TimelineItemContent::Poll(poll_state), edit_json, session_id);
880902
}
881903

882904
fn handle_poll_response(&mut self, c: UnstablePollResponseEventContent) {
@@ -1028,6 +1050,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
10281050
&mut self,
10291051
content: TimelineItemContent,
10301052
edit_json: Option<Raw<AnySyncTimelineEvent>>,
1053+
session_id: Option<String>,
10311054
) {
10321055
self.result.item_added = true;
10331056

@@ -1070,6 +1093,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
10701093
original_json: Some(raw_event.clone()),
10711094
latest_edit_json: edit_json,
10721095
origin,
1096+
session_id,
10731097
}
10741098
.into()
10751099
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ impl EventTimelineItem {
192192
// Probably the origin of the event doesn't matter for the preview.
193193
let origin = RemoteEventOrigin::Sync;
194194

195+
// In the timeline, this is used to find events that need re-decrypting but in
196+
// the message preview it is not used.
197+
let session_id = None;
198+
195199
let kind = RemoteEventTimelineItem {
196200
event_id,
197201
transaction_id: None,
@@ -202,6 +206,7 @@ impl EventTimelineItem {
202206
original_json: Some(raw_sync_event),
203207
latest_edit_json,
204208
origin,
209+
session_id,
205210
}
206211
.into();
207212

crates/matrix-sdk-ui/src/timeline/event_item/remote.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ pub(in crate::timeline) struct RemoteEventTimelineItem {
6565

6666
/// Where we got this event from: A sync response or pagination.
6767
pub origin: RemoteEventOrigin,
68+
69+
/// The megolm session ID used to send this event, if it is UTD.
70+
pub session_id: Option<String>,
6871
}
6972

7073
impl RemoteEventTimelineItem {
@@ -101,6 +104,7 @@ impl fmt::Debug for RemoteEventTimelineItem {
101104
latest_edit_json: _,
102105
is_highlighted,
103106
origin,
107+
session_id,
104108
} = self;
105109

106110
f.debug_struct("RemoteEventTimelineItem")
@@ -111,6 +115,7 @@ impl fmt::Debug for RemoteEventTimelineItem {
111115
.field("is_highlighted", is_highlighted)
112116
.field("encryption_info", encryption_info)
113117
.field("origin", origin)
118+
.field("session_id", session_id)
114119
.finish_non_exhaustive()
115120
}
116121
}

0 commit comments

Comments
 (0)