Show events that couldn't be decrypted (#57)

This commit is contained in:
Ulyssa 2023-03-13 15:18:53 -07:00
parent 61897ea6f2
commit 7c1c62897a
No known key found for this signature in database
GPG key ID: 1B3965A3D18B9B64
4 changed files with 36 additions and 0 deletions

View file

@ -14,6 +14,7 @@ use matrix_sdk::{
ruma::{ ruma::{
events::{ events::{
reaction::ReactionEvent, reaction::ReactionEvent,
room::encrypted::RoomEncryptedEvent,
room::message::{ room::message::{
OriginalRoomMessageEvent, OriginalRoomMessageEvent,
Relation, Relation,
@ -484,6 +485,9 @@ impl RoomInfo {
}; };
match &mut msg.event { match &mut msg.event {
MessageEvent::Encrypted(_) => {
return;
},
MessageEvent::Original(orig) => { MessageEvent::Original(orig) => {
orig.content = *new_content; orig.content = *new_content;
}, },
@ -498,6 +502,15 @@ impl RoomInfo {
msg.html = msg.event.html(); msg.html = msg.event.html();
} }
/// Inserts events that couldn't be decrypted into the scrollback.
pub fn insert_encrypted(&mut self, msg: RoomEncryptedEvent) {
let event_id = msg.event_id().to_owned();
let key = (msg.origin_server_ts().into(), event_id.clone());
self.keys.insert(event_id, EventLocation::Message(key.clone()));
self.messages.insert(key, msg.into());
}
pub fn insert_message(&mut self, msg: RoomMessageEvent) { pub fn insert_message(&mut self, msg: RoomMessageEvent) {
let event_id = msg.event_id().to_owned(); let event_id = msg.event_id().to_owned();
let key = (msg.origin_server_ts().into(), event_id.clone()); let key = (msg.origin_server_ts().into(), event_id.clone());

View file

@ -12,6 +12,7 @@ use unicode_width::UnicodeWidthStr;
use matrix_sdk::ruma::{ use matrix_sdk::ruma::{
events::{ events::{
room::{ room::{
encrypted::RoomEncryptedEvent,
message::{ message::{
FormattedBody, FormattedBody,
MessageFormat, MessageFormat,
@ -318,6 +319,7 @@ impl PartialOrd for MessageCursor {
#[derive(Clone)] #[derive(Clone)]
pub enum MessageEvent { pub enum MessageEvent {
Encrypted(Box<RoomEncryptedEvent>),
Original(Box<OriginalRoomMessageEvent>), Original(Box<OriginalRoomMessageEvent>),
Redacted(Box<RedactedRoomMessageEvent>), Redacted(Box<RedactedRoomMessageEvent>),
Local(OwnedEventId, Box<RoomMessageEventContent>), Local(OwnedEventId, Box<RoomMessageEventContent>),
@ -326,6 +328,7 @@ pub enum MessageEvent {
impl MessageEvent { impl MessageEvent {
pub fn event_id(&self) -> &EventId { pub fn event_id(&self) -> &EventId {
match self { match self {
MessageEvent::Encrypted(msg) => msg.event_id(),
MessageEvent::Original(ev) => ev.event_id.as_ref(), MessageEvent::Original(ev) => ev.event_id.as_ref(),
MessageEvent::Redacted(ev) => ev.event_id.as_ref(), MessageEvent::Redacted(ev) => ev.event_id.as_ref(),
MessageEvent::Local(event_id, _) => event_id.as_ref(), MessageEvent::Local(event_id, _) => event_id.as_ref(),
@ -334,6 +337,7 @@ impl MessageEvent {
pub fn body(&self) -> Cow<'_, str> { pub fn body(&self) -> Cow<'_, str> {
match self { match self {
MessageEvent::Encrypted(_) => "[Unable to decrypt message]".into(),
MessageEvent::Original(ev) => body_cow_content(&ev.content), MessageEvent::Original(ev) => body_cow_content(&ev.content),
MessageEvent::Redacted(ev) => { MessageEvent::Redacted(ev) => {
let reason = ev let reason = ev
@ -355,6 +359,7 @@ impl MessageEvent {
pub fn html(&self) -> Option<StyleTree> { pub fn html(&self) -> Option<StyleTree> {
let content = match self { let content = match self {
MessageEvent::Encrypted(_) => return None,
MessageEvent::Original(ev) => &ev.content, MessageEvent::Original(ev) => &ev.content,
MessageEvent::Redacted(_) => return None, MessageEvent::Redacted(_) => return None,
MessageEvent::Local(_, content) => content, MessageEvent::Local(_, content) => content,
@ -373,6 +378,7 @@ impl MessageEvent {
pub fn redact(&mut self, redaction: SyncRoomRedactionEvent, version: &RoomVersionId) { pub fn redact(&mut self, redaction: SyncRoomRedactionEvent, version: &RoomVersionId) {
match self { match self {
MessageEvent::Encrypted(_) => return,
MessageEvent::Redacted(_) => return, MessageEvent::Redacted(_) => return,
MessageEvent::Local(_, _) => return, MessageEvent::Local(_, _) => return,
MessageEvent::Original(ev) => { MessageEvent::Original(ev) => {
@ -548,6 +554,7 @@ impl Message {
pub fn reply_to(&self) -> Option<OwnedEventId> { pub fn reply_to(&self) -> Option<OwnedEventId> {
let content = match &self.event { let content = match &self.event {
MessageEvent::Encrypted(_) => return None,
MessageEvent::Local(_, content) => content, MessageEvent::Local(_, content) => content,
MessageEvent::Original(ev) => &ev.content, MessageEvent::Original(ev) => &ev.content,
MessageEvent::Redacted(_) => return None, MessageEvent::Redacted(_) => return None,
@ -771,6 +778,16 @@ impl Message {
} }
} }
impl From<RoomEncryptedEvent> for Message {
fn from(event: RoomEncryptedEvent) -> Self {
let timestamp = event.origin_server_ts().into();
let user_id = event.sender().to_owned();
let content = MessageEvent::Encrypted(event.into());
Message::new(content, user_id, timestamp)
}
}
impl From<OriginalRoomMessageEvent> for Message { impl From<OriginalRoomMessageEvent> for Message {
fn from(event: OriginalRoomMessageEvent) -> Self { fn from(event: OriginalRoomMessageEvent) -> Self {
let timestamp = event.origin_server_ts.into(); let timestamp = event.origin_server_ts.into();

View file

@ -294,6 +294,7 @@ impl ChatState {
MessageAction::React(emoji) => { MessageAction::React(emoji) => {
let room = self.get_joined(&store.application.worker)?; let room = self.get_joined(&store.application.worker)?;
let event_id = match &msg.event { let event_id = match &msg.event {
MessageEvent::Encrypted(msg) => msg.event_id().to_owned(),
MessageEvent::Original(ev) => ev.event_id.clone(), MessageEvent::Original(ev) => ev.event_id.clone(),
MessageEvent::Local(event_id, _) => event_id.clone(), MessageEvent::Local(event_id, _) => event_id.clone(),
MessageEvent::Redacted(_) => { MessageEvent::Redacted(_) => {
@ -313,6 +314,7 @@ impl ChatState {
MessageAction::Redact(reason) => { MessageAction::Redact(reason) => {
let room = self.get_joined(&store.application.worker)?; let room = self.get_joined(&store.application.worker)?;
let event_id = match &msg.event { let event_id = match &msg.event {
MessageEvent::Encrypted(msg) => msg.event_id().to_owned(),
MessageEvent::Original(ev) => ev.event_id.clone(), MessageEvent::Original(ev) => ev.event_id.clone(),
MessageEvent::Local(event_id, _) => event_id.clone(), MessageEvent::Local(event_id, _) => event_id.clone(),
MessageEvent::Redacted(_) => { MessageEvent::Redacted(_) => {
@ -338,6 +340,7 @@ impl ChatState {
MessageAction::Unreact(emoji) => { MessageAction::Unreact(emoji) => {
let room = self.get_joined(&store.application.worker)?; let room = self.get_joined(&store.application.worker)?;
let event_id: &EventId = match &msg.event { let event_id: &EventId = match &msg.event {
MessageEvent::Encrypted(msg) => msg.event_id(),
MessageEvent::Original(ev) => ev.event_id.as_ref(), MessageEvent::Original(ev) => ev.event_id.as_ref(),
MessageEvent::Local(event_id, _) => event_id.as_ref(), MessageEvent::Local(event_id, _) => event_id.as_ref(),
MessageEvent::Redacted(_) => { MessageEvent::Redacted(_) => {

View file

@ -234,6 +234,9 @@ async fn load_insert(room_id: OwnedRoomId, res: MessageFetchResult, store: Async
let _ = presences.get_or_default(sender); let _ = presences.get_or_default(sender);
match msg { match msg {
AnyMessageLikeEvent::RoomEncrypted(msg) => {
info.insert_encrypted(msg);
},
AnyMessageLikeEvent::RoomMessage(msg) => { AnyMessageLikeEvent::RoomMessage(msg) => {
info.insert(msg); info.insert(msg);
}, },