fix: Don't invert redaction target helper

This commit is contained in:
timedout
2026-10-03 19:41:40 +01:00
parent d7b0889a6a
commit 491fd41601
+100 -7
View File
@@ -56,7 +56,12 @@ pub(super) fn is_redacted<E: Event>(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<E: Event>(
}
if room_version_rules.redaction.content_field_redacts {
event.redacts().map(ToOwned::to_owned)
} else {
event
.get_content::<RoomRedactionEventContent>()
.ok()?
.redacts
.get_content::<RedactionField>()
.map(|r| r.redacts)
.ok()
} else {
event.redacts().map(ToOwned::to_owned)
}
}
#[derive(Deserialize)]
struct ExtractRedactedBecause {
redacted_because: Option<serde::de::IgnoredAny>,
#[serde(rename = "org.continuwuity.redacted_by")]
redacted_by: Option<serde::de::IgnoredAny>,
}
#[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);
}
}