diff --git a/src/core/matrix/event/redact.rs b/src/core/matrix/event/redact.rs index 31414d5bf..ea96fe785 100644 --- a/src/core/matrix/event/redact.rs +++ b/src/core/matrix/event/redact.rs @@ -56,7 +56,12 @@ pub(super) fn is_redacted(event: &E) -> bool { return false; }; - unsigned.redacted_because.is_some() + unsigned.redacted_by.is_some() +} + +#[derive(Deserialize)] +struct RedactionField { + redacts: OwnedEventId, } #[must_use] @@ -69,16 +74,104 @@ pub(super) fn redacts_id( } if room_version_rules.redaction.content_field_redacts { - event.redacts().map(ToOwned::to_owned) - } else { event - .get_content::() - .ok()? - .redacts + .get_content::() + .map(|r| r.redacts) + .ok() + } else { + event.redacts().map(ToOwned::to_owned) } } #[derive(Deserialize)] struct ExtractRedactedBecause { - redacted_because: Option, + #[serde(rename = "org.continuwuity.redacted_by")] + redacted_by: Option, +} + +#[cfg(test)] +mod tests { + use ruma::{UInt, events::TimelineEventType, room_version_rules::RoomVersionRules}; + use serde_json::json; + + use crate::{Event, Pdu, pdu::EventHash}; + + #[test] + fn v11_redacts_from_content() { + let p = Pdu { + event_id: ruma::owned_event_id!("$v11"), + room_id: Some(ruma::owned_room_id!("!v11:example.com")), + sender: ruma::owned_user_id!("@user:example.com"), + origin: None, + origin_server_ts: UInt::default(), + kind: TimelineEventType::RoomRedaction, + content: serde_json::value::to_raw_value(&json!({"redacts": "$content_redacts"})) + .unwrap(), + sticky: None, + state_key: None, + prev_events: vec![], + depth: UInt::default(), + auth_events: vec![], + redacts: Some(ruma::owned_event_id!("$apex_redacts")), + unsigned: None, + hashes: EventHash { sha256: String::new() }, + signatures: None, + }; + assert_eq!( + p.redacts_id(&RoomVersionRules::V11), + Some(ruma::owned_event_id!("$content_redacts")) + ); + } + + #[test] + fn v10_redacts_from_apex() { + let p = Pdu { + event_id: ruma::owned_event_id!("$v11"), + room_id: Some(ruma::owned_room_id!("!v11:example.com")), + sender: ruma::owned_user_id!("@user:example.com"), + origin: None, + origin_server_ts: UInt::default(), + kind: TimelineEventType::RoomRedaction, + content: serde_json::value::to_raw_value(&json!({"redacts": "$content_redacts"})) + .unwrap(), + sticky: None, + state_key: None, + prev_events: vec![], + depth: UInt::default(), + auth_events: vec![], + redacts: Some(ruma::owned_event_id!("$apex_redacts")), + unsigned: None, + hashes: EventHash { sha256: String::new() }, + signatures: None, + }; + assert_eq!( + p.redacts_id(&RoomVersionRules::V10), + Some(ruma::owned_event_id!("$apex_redacts")) + ); + } + + #[test] + fn redacts_ignores_non_redaction_event() { + let p = Pdu { + event_id: ruma::owned_event_id!("$v11"), + room_id: Some(ruma::owned_room_id!("!v11:example.com")), + sender: ruma::owned_user_id!("@user:example.com"), + origin: None, + origin_server_ts: UInt::default(), + kind: TimelineEventType::RoomMessage, + content: serde_json::value::to_raw_value(&json!({"redacts": "$content_redacts"})) + .unwrap(), + sticky: None, + state_key: None, + prev_events: vec![], + depth: UInt::default(), + auth_events: vec![], + redacts: Some(ruma::owned_event_id!("$apex_redacts")), + unsigned: None, + hashes: EventHash { sha256: String::new() }, + signatures: None, + }; + assert_eq!(p.redacts_id(&RoomVersionRules::V11), None); + assert_eq!(p.redacts_id(&RoomVersionRules::V10), None); + } }