Skip to content

Commit 45ddbf1

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

File tree

8 files changed

+52
-10
lines changed

8 files changed

+52
-10
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
@@ -416,6 +416,7 @@ mod observable_items_tests {
416416
original_json: None,
417417
latest_edit_json: None,
418418
origin: RemoteEventOrigin::Sync,
419+
session_id: None,
419420
}),
420421
false,
421422
),

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

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

168168
TimelineEventHandler::new(&mut txn, ctx)
169-
.handle_event(&mut date_divider_adjuster, content)
169+
.handle_event(&mut date_divider_adjuster, content, None)
170170
.await;
171171

172172
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
@@ -206,6 +206,7 @@ impl<'a> TimelineStateTransaction<'a> {
206206
date_divider_adjuster: &mut DateDividerAdjuster,
207207
) -> HandleEventResult {
208208
let TimelineEvent { push_actions, kind } = event;
209+
let session_id = kind.session_id();
209210
let encryption_info = kind.encryption_info().cloned();
210211

211212
let (raw, utd_info) = match kind {
@@ -412,7 +413,9 @@ impl<'a> TimelineStateTransaction<'a> {
412413
};
413414

414415
// Handle the event to create or update a timeline item.
415-
TimelineEventHandler::new(self, ctx).handle_event(date_divider_adjuster, event_kind).await
416+
TimelineEventHandler::new(self, ctx)
417+
.handle_event(date_divider_adjuster, event_kind, session_id)
418+
.await
416419
}
417420

418421
/// 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: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
368368
mut self,
369369
date_divider_adjuster: &mut DateDividerAdjuster,
370370
event_kind: TimelineEventKind,
371+
session_id: Option<String>,
371372
) -> HandleEventResult {
372373
let span = tracing::Span::current();
373374

@@ -406,7 +407,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
406407

407408
AnyMessageLikeEventContent::RoomMessage(c) => {
408409
if should_add {
409-
self.handle_room_message(c, relations);
410+
self.handle_room_message(c, relations, session_id);
410411
}
411412
}
412413

@@ -418,6 +419,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
418419
reactions: Default::default(),
419420
}),
420421
None,
422+
session_id,
421423
);
422424
}
423425
}
@@ -430,7 +432,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
430432
UnstablePollStartEventContent::New(c),
431433
) => {
432434
if should_add {
433-
self.handle_poll_start(c, relations)
435+
self.handle_poll_start(c, relations, session_id)
434436
}
435437
}
436438

@@ -440,13 +442,13 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
440442

441443
AnyMessageLikeEventContent::CallInvite(_) => {
442444
if should_add {
443-
self.add_item(TimelineItemContent::CallInvite, None);
445+
self.add_item(TimelineItemContent::CallInvite, None, session_id);
444446
}
445447
}
446448

447449
AnyMessageLikeEventContent::CallNotify(_) => {
448450
if should_add {
449-
self.add_item(TimelineItemContent::CallNotify, None)
451+
self.add_item(TimelineItemContent::CallNotify, None, session_id)
450452
}
451453
}
452454

@@ -462,7 +464,11 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
462464
TimelineEventKind::UnableToDecrypt { content, utd_cause } => {
463465
// TODO: Handle replacements if the replaced event is also UTD
464466
if should_add {
465-
self.add_item(TimelineItemContent::unable_to_decrypt(content, utd_cause), None);
467+
self.add_item(
468+
TimelineItemContent::unable_to_decrypt(content, utd_cause),
469+
None,
470+
session_id,
471+
);
466472
}
467473

468474
// Let the hook know that we ran into an unable-to-decrypt that is added to the
@@ -477,7 +483,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
477483

478484
TimelineEventKind::RedactedMessage { event_type } => {
479485
if event_type != MessageLikeEventType::Reaction && should_add {
480-
self.add_item(TimelineItemContent::RedactedMessage, None);
486+
self.add_item(TimelineItemContent::RedactedMessage, None, session_id);
481487
}
482488
}
483489

@@ -487,7 +493,11 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
487493

488494
TimelineEventKind::RoomMember { user_id, content, sender } => {
489495
if should_add {
490-
self.add_item(TimelineItemContent::room_member(user_id, content, sender), None);
496+
self.add_item(
497+
TimelineItemContent::room_member(user_id, content, sender),
498+
None,
499+
session_id,
500+
);
491501
}
492502
}
493503

@@ -498,6 +508,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
498508
self.add_item(
499509
TimelineItemContent::OtherState(OtherState { state_key, content }),
500510
None,
511+
session_id,
501512
);
502513
}
503514
}
@@ -507,6 +518,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
507518
self.add_item(
508519
TimelineItemContent::FailedToParseMessageLike { event_type, error },
509520
None,
521+
session_id,
510522
);
511523
}
512524
}
@@ -516,6 +528,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
516528
self.add_item(
517529
TimelineItemContent::FailedToParseState { event_type, state_key, error },
518530
None,
531+
session_id,
519532
);
520533
}
521534
}
@@ -549,6 +562,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
549562
&mut self,
550563
msg: RoomMessageEventContent,
551564
relations: BundledMessageLikeRelations<AnySyncMessageLikeEvent>,
565+
session_id: Option<String>,
552566
) {
553567
// Always remove the pending edit, if there's any. The reason is that if
554568
// there's an edit in the relations mapping, we want to prefer it over any
@@ -581,6 +595,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
581595
self.add_item(
582596
TimelineItemContent::message(msg, edit_content, self.items, Default::default()),
583597
edit_json,
598+
session_id,
584599
);
585600
}
586601

@@ -812,6 +827,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
812827
&mut self,
813828
c: NewUnstablePollStartEventContent,
814829
relations: BundledMessageLikeRelations<AnySyncMessageLikeEvent>,
830+
session_id: Option<String>,
815831
) {
816832
// Always remove the pending edit, if there's any. The reason is that if
817833
// there's an edit in the relations mapping, we want to prefer it over any
@@ -843,7 +859,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
843859

844860
let edit_json = edit_json.flatten();
845861

846-
self.add_item(TimelineItemContent::Poll(poll_state), edit_json);
862+
self.add_item(TimelineItemContent::Poll(poll_state), edit_json, session_id);
847863
}
848864

849865
fn handle_poll_response(&mut self, c: UnstablePollResponseEventContent) {
@@ -968,6 +984,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
968984
&mut self,
969985
mut content: TimelineItemContent,
970986
edit_json: Option<Raw<AnySyncTimelineEvent>>,
987+
session_id: Option<String>,
971988
) {
972989
self.result.item_added = true;
973990

@@ -1016,6 +1033,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
10161033
original_json: Some(raw_event.clone()),
10171034
latest_edit_json: edit_json,
10181035
origin,
1036+
session_id,
10191037
}
10201038
.into()
10211039
}

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

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

185+
// In the timeline, this is used to find events that need re-decrypting but in
186+
// the message preview it is not used.
187+
let session_id = None;
188+
185189
let kind = RemoteEventTimelineItem {
186190
event_id,
187191
transaction_id: None,
@@ -192,6 +196,7 @@ impl EventTimelineItem {
192196
original_json: Some(raw_sync_event),
193197
latest_edit_json,
194198
origin,
199+
session_id,
195200
}
196201
.into();
197202

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)