mirror of
https://github.com/youwen5/iamb.git
synced 2025-06-20 13:49:52 -07:00
Indicate when an encrypted room event has been redacted (#59)
This commit is contained in:
parent
7c1c62897a
commit
db35581d07
3 changed files with 46 additions and 29 deletions
|
@ -485,16 +485,15 @@ 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;
|
||||||
},
|
},
|
||||||
MessageEvent::Local(_, content) => {
|
MessageEvent::Local(_, content) => {
|
||||||
*content = new_content;
|
*content = new_content;
|
||||||
},
|
},
|
||||||
MessageEvent::Redacted(_) => {
|
MessageEvent::Redacted(_) |
|
||||||
|
MessageEvent::EncryptedOriginal(_) |
|
||||||
|
MessageEvent::EncryptedRedacted(_) => {
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,11 @@ use unicode_width::UnicodeWidthStr;
|
||||||
use matrix_sdk::ruma::{
|
use matrix_sdk::ruma::{
|
||||||
events::{
|
events::{
|
||||||
room::{
|
room::{
|
||||||
encrypted::RoomEncryptedEvent,
|
encrypted::{
|
||||||
|
OriginalRoomEncryptedEvent,
|
||||||
|
RedactedRoomEncryptedEvent,
|
||||||
|
RoomEncryptedEvent,
|
||||||
|
},
|
||||||
message::{
|
message::{
|
||||||
FormattedBody,
|
FormattedBody,
|
||||||
MessageFormat,
|
MessageFormat,
|
||||||
|
@ -27,6 +31,7 @@ use matrix_sdk::ruma::{
|
||||||
},
|
},
|
||||||
AnyMessageLikeEvent,
|
AnyMessageLikeEvent,
|
||||||
Redact,
|
Redact,
|
||||||
|
RedactedUnsigned,
|
||||||
},
|
},
|
||||||
EventId,
|
EventId,
|
||||||
MilliSecondsSinceUnixEpoch,
|
MilliSecondsSinceUnixEpoch,
|
||||||
|
@ -319,7 +324,8 @@ impl PartialOrd for MessageCursor {
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub enum MessageEvent {
|
pub enum MessageEvent {
|
||||||
Encrypted(Box<RoomEncryptedEvent>),
|
EncryptedOriginal(Box<OriginalRoomEncryptedEvent>),
|
||||||
|
EncryptedRedacted(Box<RedactedRoomEncryptedEvent>),
|
||||||
Original(Box<OriginalRoomMessageEvent>),
|
Original(Box<OriginalRoomMessageEvent>),
|
||||||
Redacted(Box<RedactedRoomMessageEvent>),
|
Redacted(Box<RedactedRoomMessageEvent>),
|
||||||
Local(OwnedEventId, Box<RoomMessageEventContent>),
|
Local(OwnedEventId, Box<RoomMessageEventContent>),
|
||||||
|
@ -328,7 +334,8 @@ 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::EncryptedOriginal(ev) => ev.event_id.as_ref(),
|
||||||
|
MessageEvent::EncryptedRedacted(ev) => ev.event_id.as_ref(),
|
||||||
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(),
|
||||||
|
@ -337,29 +344,18 @@ 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::EncryptedOriginal(_) => "[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::EncryptedRedacted(ev) => body_cow_reason(&ev.unsigned),
|
||||||
let reason = ev
|
MessageEvent::Redacted(ev) => body_cow_reason(&ev.unsigned),
|
||||||
.unsigned
|
|
||||||
.redacted_because
|
|
||||||
.as_ref()
|
|
||||||
.and_then(|e| e.as_original())
|
|
||||||
.and_then(|r| r.content.reason.as_ref());
|
|
||||||
|
|
||||||
if let Some(r) = reason {
|
|
||||||
Cow::Owned(format!("[Redacted: {r:?}]"))
|
|
||||||
} else {
|
|
||||||
Cow::Borrowed("[Redacted]")
|
|
||||||
}
|
|
||||||
},
|
|
||||||
MessageEvent::Local(_, content) => body_cow_content(content),
|
MessageEvent::Local(_, content) => body_cow_content(content),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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::EncryptedOriginal(_) => return None,
|
||||||
|
MessageEvent::EncryptedRedacted(_) => 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,
|
||||||
|
@ -378,7 +374,8 @@ 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::EncryptedOriginal(_) => return,
|
||||||
|
MessageEvent::EncryptedRedacted(_) => return,
|
||||||
MessageEvent::Redacted(_) => return,
|
MessageEvent::Redacted(_) => return,
|
||||||
MessageEvent::Local(_, _) => return,
|
MessageEvent::Local(_, _) => return,
|
||||||
MessageEvent::Original(ev) => {
|
MessageEvent::Original(ev) => {
|
||||||
|
@ -417,6 +414,20 @@ fn body_cow_content(content: &RoomMessageEventContent) -> Cow<'_, str> {
|
||||||
Cow::Borrowed(s)
|
Cow::Borrowed(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn body_cow_reason(unsigned: &RedactedUnsigned) -> Cow<'_, str> {
|
||||||
|
let reason = unsigned
|
||||||
|
.redacted_because
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|e| e.as_original())
|
||||||
|
.and_then(|r| r.content.reason.as_ref());
|
||||||
|
|
||||||
|
if let Some(r) = reason {
|
||||||
|
Cow::Owned(format!("[Redacted: {r:?}]"))
|
||||||
|
} else {
|
||||||
|
Cow::Borrowed("[Redacted]")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum MessageColumns {
|
enum MessageColumns {
|
||||||
/// Four columns: sender, message, timestamp, read receipts.
|
/// Four columns: sender, message, timestamp, read receipts.
|
||||||
Four,
|
Four,
|
||||||
|
@ -554,7 +565,8 @@ 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::EncryptedOriginal(_) => return None,
|
||||||
|
MessageEvent::EncryptedRedacted(_) => 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,
|
||||||
|
@ -782,7 +794,10 @@ impl From<RoomEncryptedEvent> for Message {
|
||||||
fn from(event: RoomEncryptedEvent) -> Self {
|
fn from(event: RoomEncryptedEvent) -> Self {
|
||||||
let timestamp = event.origin_server_ts().into();
|
let timestamp = event.origin_server_ts().into();
|
||||||
let user_id = event.sender().to_owned();
|
let user_id = event.sender().to_owned();
|
||||||
let content = MessageEvent::Encrypted(event.into());
|
let content = match event {
|
||||||
|
RoomEncryptedEvent::Original(ev) => MessageEvent::EncryptedOriginal(ev.into()),
|
||||||
|
RoomEncryptedEvent::Redacted(ev) => MessageEvent::EncryptedRedacted(ev.into()),
|
||||||
|
};
|
||||||
|
|
||||||
Message::new(content, user_id, timestamp)
|
Message::new(content, user_id, timestamp)
|
||||||
}
|
}
|
||||||
|
|
|
@ -294,7 +294,8 @@ 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::EncryptedOriginal(ev) => ev.event_id.clone(),
|
||||||
|
MessageEvent::EncryptedRedacted(ev) => ev.event_id.clone(),
|
||||||
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(_) => {
|
||||||
|
@ -314,7 +315,8 @@ 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::EncryptedOriginal(ev) => ev.event_id.clone(),
|
||||||
|
MessageEvent::EncryptedRedacted(ev) => ev.event_id.clone(),
|
||||||
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(_) => {
|
||||||
|
@ -340,7 +342,8 @@ 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::EncryptedOriginal(ev) => ev.event_id.as_ref(),
|
||||||
|
MessageEvent::EncryptedRedacted(ev) => ev.event_id.as_ref(),
|
||||||
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(_) => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue