Skip to content

Commit 0bdb5b7

Browse files
committed
refactor: Adapt to use of RedactionRules for redaction
Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
1 parent 1f0d7a7 commit 0bdb5b7

File tree

27 files changed

+229
-192
lines changed

27 files changed

+229
-192
lines changed

crates/matrix-sdk-base/src/response_processors/timeline.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ pub async fn build<'notification, 'e2ee>(
7676
AnySyncTimelineEvent::MessageLike(AnySyncMessageLikeEvent::RoomRedaction(
7777
redaction_event,
7878
)) => {
79-
let room_version = room_info.room_version_or_default();
79+
let redaction_rules = room_info.room_version_rules_or_default().redaction;
8080

81-
if let Some(redacts) = redaction_event.redacts(&room_version) {
81+
if let Some(redacts) = redaction_event.redacts(&redaction_rules) {
8282
room_info
8383
.handle_redaction(redaction_event, timeline_event.raw().cast_ref());
8484

crates/matrix-sdk-base/src/room/create.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use ruma::{
2020
EmptyStateKey, RedactContent, RedactedStateEventContent, StateEventType,
2121
},
2222
room::RoomType,
23+
room_version_rules::RedactionRules,
2324
OwnedUserId, RoomVersionId,
2425
};
2526
use serde::{Deserialize, Serialize};
@@ -109,10 +110,10 @@ impl RedactedStateEventContent for RedactedRoomCreateWithCreatorEventContent {
109110
impl RedactContent for RoomCreateWithCreatorEventContent {
110111
type Redacted = RedactedRoomCreateWithCreatorEventContent;
111112

112-
fn redact(self, version: &RoomVersionId) -> Self::Redacted {
113+
fn redact(self, rules: &RedactionRules) -> Self::Redacted {
113114
let (content, sender) = self.into_event_content();
114115
// Use Ruma's redaction algorithm.
115-
let content = content.redact(version);
116+
let content = content.redact(rules);
116117
Self::from_event_content(content, sender)
117118
}
118119
}

crates/matrix-sdk-base/src/room/room_info.rs

Lines changed: 45 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ use std::{
1919

2020
use bitflags::bitflags;
2121
use eyeball::Subscriber;
22-
use matrix_sdk_common::{deserialized_responses::TimelineEventKind, ROOM_VERSION_FALLBACK};
22+
use matrix_sdk_common::{
23+
deserialized_responses::TimelineEventKind, ROOM_VERSION_FALLBACK, ROOM_VERSION_RULES_FALLBACK,
24+
};
2325
use ruma::{
2426
api::client::sync::sync_events::v3::RoomSummary as RumaSummary,
2527
assign,
@@ -45,6 +47,7 @@ use ruma::{
4547
RedactedStateEventContent, StateEventType, StaticStateEventContent, SyncStateEvent,
4648
},
4749
room::RoomType,
50+
room_version_rules::{RedactionRules, RoomVersionRules},
4851
serde::Raw,
4952
EventId, MilliSecondsSinceUnixEpoch, MxcUri, OwnedEventId, OwnedMxcUri, OwnedRoomAliasId,
5053
OwnedRoomId, OwnedUserId, RoomAliasId, RoomId, RoomVersionId, UserId,
@@ -322,27 +325,31 @@ impl BaseRoomInfo {
322325
}
323326

324327
pub(super) fn handle_redaction(&mut self, redacts: &EventId) {
325-
let room_version = self.room_version().unwrap_or(&ROOM_VERSION_FALLBACK).to_owned();
328+
let redaction_rules = self
329+
.room_version()
330+
.and_then(|room_version| room_version.rules())
331+
.unwrap_or(ROOM_VERSION_RULES_FALLBACK)
332+
.redaction;
326333

327334
// FIXME: Use let chains once available to get rid of unwrap()s
328335
if self.avatar.has_event_id(redacts) {
329-
self.avatar.as_mut().unwrap().redact(&room_version);
336+
self.avatar.as_mut().unwrap().redact(&redaction_rules);
330337
} else if self.canonical_alias.has_event_id(redacts) {
331-
self.canonical_alias.as_mut().unwrap().redact(&room_version);
338+
self.canonical_alias.as_mut().unwrap().redact(&redaction_rules);
332339
} else if self.create.has_event_id(redacts) {
333-
self.create.as_mut().unwrap().redact(&room_version);
340+
self.create.as_mut().unwrap().redact(&redaction_rules);
334341
} else if self.guest_access.has_event_id(redacts) {
335-
self.guest_access.as_mut().unwrap().redact(&room_version);
342+
self.guest_access.as_mut().unwrap().redact(&redaction_rules);
336343
} else if self.history_visibility.has_event_id(redacts) {
337-
self.history_visibility.as_mut().unwrap().redact(&room_version);
344+
self.history_visibility.as_mut().unwrap().redact(&redaction_rules);
338345
} else if self.join_rules.has_event_id(redacts) {
339-
self.join_rules.as_mut().unwrap().redact(&room_version);
346+
self.join_rules.as_mut().unwrap().redact(&redaction_rules);
340347
} else if self.name.has_event_id(redacts) {
341-
self.name.as_mut().unwrap().redact(&room_version);
348+
self.name.as_mut().unwrap().redact(&redaction_rules);
342349
} else if self.tombstone.has_event_id(redacts) {
343-
self.tombstone.as_mut().unwrap().redact(&room_version);
350+
self.tombstone.as_mut().unwrap().redact(&redaction_rules);
344351
} else if self.topic.has_event_id(redacts) {
345-
self.topic.as_mut().unwrap().redact(&room_version);
352+
self.topic.as_mut().unwrap().redact(&redaction_rules);
346353
} else {
347354
self.rtc_member_events
348355
.retain(|_, member_event| member_event.event_id() != Some(redacts));
@@ -451,11 +458,11 @@ pub struct RoomInfo {
451458
/// room state.
452459
pub(crate) base_info: Box<BaseRoomInfo>,
453460

454-
/// Did we already warn about an unknown room version in
455-
/// [`RoomInfo::room_version_or_default`]? This is done to avoid
456-
/// spamming about unknown room versions in the log for the same room.
461+
/// Whether we already warned about unknown room version rules in
462+
/// [`RoomInfo::room_version_rules_or_default`]. This is done to avoid
463+
/// spamming about unknown room versions rules in the log for the same room.
457464
#[serde(skip)]
458-
pub(crate) warned_about_unknown_room_version: Arc<AtomicBool>,
465+
pub(crate) warned_about_unknown_room_version_rules: Arc<AtomicBool>,
459466

460467
/// Cached display name, useful for sync access.
461468
///
@@ -502,7 +509,7 @@ impl RoomInfo {
502509
latest_event: None,
503510
read_receipts: Default::default(),
504511
base_info: Box::new(BaseRoomInfo::new()),
505-
warned_about_unknown_room_version: Arc::new(false.into()),
512+
warned_about_unknown_room_version_rules: Arc::new(false.into()),
506513
cached_display_name: None,
507514
cached_user_defined_notification_mode: None,
508515
recency_stamp: None,
@@ -670,9 +677,9 @@ impl RoomInfo {
670677
event: &SyncRoomRedactionEvent,
671678
_raw: &Raw<SyncRoomRedactionEvent>,
672679
) {
673-
let room_version = self.room_version_or_default();
680+
let redaction_rules = self.room_version_rules_or_default().redaction;
674681

675-
let Some(redacts) = event.redacts(&room_version) else {
682+
let Some(redacts) = event.redacts(&redaction_rules) else {
676683
info!("Can't apply redaction, redacts field is missing");
677684
return;
678685
};
@@ -681,7 +688,7 @@ impl RoomInfo {
681688
if let Some(latest_event) = &mut self.latest_event {
682689
tracing::trace!("Checking if redaction applies to latest event");
683690
if latest_event.event_id().as_deref() == Some(redacts) {
684-
match apply_redaction(latest_event.event().raw(), _raw, &room_version) {
691+
match apply_redaction(latest_event.event().raw(), _raw, &redaction_rules) {
685692
Some(redacted) => {
686693
// Even if the original event was encrypted, redaction removes all its
687694
// fields so it cannot possibly be successfully decrypted after redaction.
@@ -842,24 +849,26 @@ impl RoomInfo {
842849
self.base_info.room_version()
843850
}
844851

845-
/// Get the room version of this room, or a sensible default.
852+
/// Get the room version rules of this room, or a sensible default.
846853
///
847-
/// Will warn (at most once) if the room creation event is missing from this
848-
/// [`RoomInfo`].
849-
pub fn room_version_or_default(&self) -> RoomVersionId {
854+
/// Will warn (at most once) if the room create event is missing from this
855+
/// [`RoomInfo`] or if the room version is unsupported.
856+
pub fn room_version_rules_or_default(&self) -> RoomVersionRules {
850857
use std::sync::atomic::Ordering;
851858

852-
self.base_info.room_version().cloned().unwrap_or_else(|| {
853-
if self
854-
.warned_about_unknown_room_version
855-
.compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed)
856-
.is_ok()
857-
{
858-
warn!("Unknown room version, falling back to {ROOM_VERSION_FALLBACK}");
859-
}
859+
self.base_info.room_version().and_then(|room_version| room_version.rules()).unwrap_or_else(
860+
|| {
861+
if self
862+
.warned_about_unknown_room_version_rules
863+
.compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed)
864+
.is_ok()
865+
{
866+
warn!("Unable to get the room version rules, defaulting to rules for room version {ROOM_VERSION_FALLBACK}");
867+
}
860868

861-
ROOM_VERSION_FALLBACK
862-
})
869+
ROOM_VERSION_RULES_FALLBACK
870+
},
871+
)
863872
}
864873

865874
/// Get the room type of this room.
@@ -1109,7 +1118,7 @@ pub(crate) enum SyncInfo {
11091118
pub fn apply_redaction(
11101119
event: &Raw<AnySyncTimelineEvent>,
11111120
raw_redaction: &Raw<SyncRoomRedactionEvent>,
1112-
room_version: &RoomVersionId,
1121+
rules: &RedactionRules,
11131122
) -> Option<Raw<AnySyncTimelineEvent>> {
11141123
use ruma::canonical_json::{redact_in_place, RedactedBecause};
11151124

@@ -1129,7 +1138,7 @@ pub fn apply_redaction(
11291138
}
11301139
};
11311140

1132-
let redact_result = redact_in_place(&mut event_json, room_version, Some(redacted_because));
1141+
let redact_result = redact_in_place(&mut event_json, rules, Some(redacted_because));
11331142

11341143
if let Err(e) = redact_result {
11351144
warn!("Failed to redact event: {e}");
@@ -1259,7 +1268,7 @@ mod tests {
12591268
assign!(BaseRoomInfo::new(), { pinned_events: Some(RoomPinnedEventsEventContent::new(vec![owned_event_id!("$a")])) }),
12601269
),
12611270
read_receipts: Default::default(),
1262-
warned_about_unknown_room_version: Arc::new(false.into()),
1271+
warned_about_unknown_room_version_rules: Arc::new(false.into()),
12631272
cached_display_name: None,
12641273
cached_user_defined_notification_mode: None,
12651274
recency_stamp: Some(42),

crates/matrix-sdk-base/src/store/memory_store.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use std::{
1919

2020
use async_trait::async_trait;
2121
use growable_bloom_filter::GrowableBloom;
22-
use matrix_sdk_common::ROOM_VERSION_FALLBACK;
22+
use matrix_sdk_common::{ROOM_VERSION_FALLBACK, ROOM_VERSION_RULES_FALLBACK};
2323
use ruma::{
2424
canonical_json::{redact, RedactedBecause},
2525
events::{
@@ -439,19 +439,19 @@ impl StateStore for MemoryStore {
439439
}
440440
}
441441

442-
let make_room_version = |room_info: &HashMap<OwnedRoomId, RoomInfo>, room_id| {
443-
room_info.get(room_id).map(|info| info.room_version_or_default()).unwrap_or_else(|| {
442+
let make_redaction_rules = |room_info: &HashMap<OwnedRoomId, RoomInfo>, room_id| {
443+
room_info.get(room_id).map(|info| info.room_version_rules_or_default()).unwrap_or_else(|| {
444444
warn!(
445445
?room_id,
446-
"Unable to find the room version, assuming {ROOM_VERSION_FALLBACK}"
446+
"Unable to get the room version rules, defaulting to rules for room version {ROOM_VERSION_FALLBACK}"
447447
);
448-
ROOM_VERSION_FALLBACK
449-
})
448+
ROOM_VERSION_RULES_FALLBACK
449+
}).redaction
450450
};
451451

452452
let inner = &mut *inner;
453453
for (room_id, redactions) in &changes.redactions {
454-
let mut room_version = None;
454+
let mut redaction_rules = None;
455455

456456
if let Some(room) = inner.room_state.get_mut(room_id) {
457457
for ref_room_mu in room.values_mut() {
@@ -460,8 +460,8 @@ impl StateStore for MemoryStore {
460460
if let Some(redaction) = redactions.get(&event_id) {
461461
let redacted = redact(
462462
raw_evt.deserialize_as::<CanonicalJsonObject>()?,
463-
room_version.get_or_insert_with(|| {
464-
make_room_version(&inner.room_info, room_id)
463+
redaction_rules.get_or_insert_with(|| {
464+
make_redaction_rules(&inner.room_info, room_id)
465465
}),
466466
Some(RedactedBecause::from_raw_event(redaction)?),
467467
)

crates/matrix-sdk-base/src/store/migration_helpers.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ use ruma::{
3737
},
3838
EmptyStateKey, RedactContent, StateEventContent, StateEventType,
3939
},
40+
room_version_rules::RedactionRules,
4041
OwnedRoomId, OwnedUserId, RoomId,
4142
};
4243
use serde::{Deserialize, Serialize};
@@ -117,7 +118,7 @@ impl RoomInfoV1 {
117118
latest_event: latest_event.map(|ev| Box::new(LatestEvent::new(ev))),
118119
read_receipts: Default::default(),
119120
base_info: base_info.migrate(create),
120-
warned_about_unknown_room_version: Arc::new(false.into()),
121+
warned_about_unknown_room_version_rules: Arc::new(false.into()),
121122
cached_display_name: None,
122123
cached_user_defined_notification_mode: None,
123124
recency_stamp: None,
@@ -233,7 +234,7 @@ impl StateEventContent for RoomNameEventContentV1 {
233234
impl RedactContent for RoomNameEventContentV1 {
234235
type Redacted = RedactedRoomNameEventContent;
235236

236-
fn redact(self, _version: &ruma::RoomVersionId) -> Self::Redacted {
237+
fn redact(self, _rules: &RedactionRules) -> Self::Redacted {
237238
RedactedRoomNameEventContent::new()
238239
}
239240
}

crates/matrix-sdk-base/src/utils.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ use ruma::{
2424
RedactContent, RedactedStateEventContent, StateEventContent, StaticStateEventContent,
2525
SyncStateEvent,
2626
},
27-
EventId, OwnedEventId, RoomVersionId,
27+
room_version_rules::RedactionRules,
28+
EventId, OwnedEventId,
2829
};
2930
use serde::{de::DeserializeOwned, Deserialize, Serialize};
3031

@@ -118,13 +119,13 @@ where
118119
/// Redacts this event.
119120
///
120121
/// Does nothing if it is already redacted.
121-
pub fn redact(&mut self, room_version: &RoomVersionId)
122+
pub fn redact(&mut self, rules: &RedactionRules)
122123
where
123124
C: Clone,
124125
{
125126
if let MinimalStateEvent::Original(ev) = self {
126127
*self = MinimalStateEvent::Redacted(RedactedMinimalStateEvent {
127-
content: ev.content.clone().redact(room_version),
128+
content: ev.content.clone().redact(rules),
128129
event_id: ev.event_id.clone(),
129130
});
130131
}

crates/matrix-sdk-common/src/lib.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub mod ttl_cache;
4242
#[cfg(all(target_family = "wasm", not(tarpaulin_include)))]
4343
pub mod js_tracing;
4444

45-
use ruma::RoomVersionId;
45+
use ruma::{room_version_rules::RoomVersionRules, RoomVersionId};
4646
pub use store_locks::LEASE_DURATION_MS;
4747

4848
/// Alias for `Send` on non-wasm, empty trait (implemented by everything) on
@@ -108,3 +108,9 @@ uniffi::setup_scaffolding!();
108108

109109
/// The room version to use as a fallback when the version of a room is unknown.
110110
pub const ROOM_VERSION_FALLBACK: RoomVersionId = RoomVersionId::V11;
111+
112+
/// The room version rules to use as a fallback when the version of a room is
113+
/// unknown or unsupported.
114+
///
115+
/// These are the rules of the [`ROOM_VERSION_FALLBACK`].
116+
pub const ROOM_VERSION_RULES_FALLBACK: RoomVersionRules = RoomVersionRules::V11;

crates/matrix-sdk-indexeddb/src/state_store/mod.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use matrix_sdk_base::{
3030
SerializableEventContent, ServerInfo, StateChanges, StateStore, StoreError,
3131
},
3232
MinimalRoomMemberEvent, RoomInfo, RoomMemberships, StateStoreDataKey, StateStoreDataValue,
33-
ROOM_VERSION_FALLBACK,
33+
ROOM_VERSION_FALLBACK, ROOM_VERSION_RULES_FALLBACK,
3434
};
3535
use matrix_sdk_store_encryption::{Error as EncryptionError, StoreCipher};
3636
use ruma::{
@@ -917,32 +917,32 @@ impl_state_store!({
917917
let range = self.encode_to_range(keys::ROOM_STATE, room_id)?;
918918
let Some(cursor) = state.open_cursor_with_range(&range)?.await? else { continue };
919919

920-
let mut room_version = None;
920+
let mut redaction_rules = None;
921921

922922
while let Some(key) = cursor.key() {
923923
let raw_evt =
924924
self.deserialize_value::<Raw<AnySyncStateEvent>>(&cursor.value())?;
925925
if let Ok(Some(event_id)) = raw_evt.get_field::<OwnedEventId>("event_id") {
926926
if let Some(redaction) = redactions.get(&event_id) {
927-
let version = {
928-
if room_version.is_none() {
929-
room_version.replace(room_info
927+
let redaction_rules = {
928+
if redaction_rules.is_none() {
929+
redaction_rules.replace(room_info
930930
.get(&self.encode_key(keys::ROOM_INFOS, room_id))?
931931
.await?
932932
.and_then(|f| self.deserialize_value::<RoomInfo>(&f).ok())
933-
.map(|info| info.room_version_or_default())
933+
.map(|info| info.room_version_rules_or_default())
934934
.unwrap_or_else(|| {
935-
warn!(?room_id, "Unable to find the room version, assuming {ROOM_VERSION_FALLBACK}");
936-
ROOM_VERSION_FALLBACK
937-
})
935+
warn!(?room_id, "Unable to get the room version rules, defaulting to rules for room version {ROOM_VERSION_FALLBACK}");
936+
ROOM_VERSION_RULES_FALLBACK
937+
}).redaction
938938
);
939939
}
940-
room_version.as_ref().unwrap()
940+
redaction_rules.as_ref().unwrap()
941941
};
942942

943943
let redacted = redact(
944944
raw_evt.deserialize_as::<CanonicalJsonObject>()?,
945-
version,
945+
redaction_rules,
946946
Some(RedactedBecause::from_raw_event(redaction)?),
947947
)
948948
.map_err(StoreError::Redaction)?;

0 commit comments

Comments
 (0)