fix: de-index pdus when redacted

This commit is contained in:
Matthias Ahouansou 2024-06-05 20:17:32 +01:00 committed by Charles Hall
parent cc5a9d3440
commit f74043df9a
No known key found for this signature in database
GPG key ID: 7B8E0645816E07CF
3 changed files with 50 additions and 2 deletions

View file

@ -33,6 +33,29 @@ impl service::rooms::search::Data for KeyValueDatabase {
self.tokenids.insert_batch(&mut batch) self.tokenids.insert_batch(&mut batch)
} }
#[tracing::instrument(skip(self))]
fn deindex_pdu(
&self,
shortroomid: u64,
pdu_id: &[u8],
message_body: &str,
) -> Result<()> {
let batch = tokenize(message_body).map(|word| {
let mut key = shortroomid.to_be_bytes().to_vec();
key.extend_from_slice(word.as_bytes());
key.push(0xFF);
// TODO: currently we save the room id a second time here
key.extend_from_slice(pdu_id);
key
});
for token in batch {
self.tokenids.remove(&token)?;
}
Ok(())
}
#[tracing::instrument(skip(self))] #[tracing::instrument(skip(self))]
#[allow(clippy::type_complexity)] #[allow(clippy::type_complexity)]
fn search_pdus<'a>( fn search_pdus<'a>(

View file

@ -10,6 +10,13 @@ pub(crate) trait Data: Send + Sync {
message_body: &str, message_body: &str,
) -> Result<()>; ) -> Result<()>;
fn deindex_pdu(
&self,
shortroomid: u64,
pdu_id: &[u8],
message_body: &str,
) -> Result<()>;
#[allow(clippy::type_complexity)] #[allow(clippy::type_complexity)]
fn search_pdus<'a>( fn search_pdus<'a>(
&'a self, &'a self,

View file

@ -414,7 +414,7 @@ impl Service {
&pdu.room_id, &pdu.room_id,
false, false,
)? { )? {
self.redact_pdu(redact_id, pdu)?; self.redact_pdu(redact_id, pdu, shortroomid)?;
} }
} }
} }
@ -435,7 +435,7 @@ impl Service {
&pdu.room_id, &pdu.room_id,
false, false,
)? { )? {
self.redact_pdu(redact_id, pdu)?; self.redact_pdu(redact_id, pdu, shortroomid)?;
} }
} }
} }
@ -1178,15 +1178,33 @@ impl Service {
&self, &self,
event_id: &EventId, event_id: &EventId,
reason: &PduEvent, reason: &PduEvent,
shortroomid: u64,
) -> Result<()> { ) -> Result<()> {
// TODO: Don't reserialize, keep original json // TODO: Don't reserialize, keep original json
if let Some(pdu_id) = self.get_pdu_id(event_id)? { if let Some(pdu_id) = self.get_pdu_id(event_id)? {
#[derive(Deserialize)]
struct ExtractBody {
body: String,
}
let mut pdu = self.get_pdu_from_id(&pdu_id)?.ok_or_else(|| { let mut pdu = self.get_pdu_from_id(&pdu_id)?.ok_or_else(|| {
Error::bad_database("PDU ID points to invalid PDU.") Error::bad_database("PDU ID points to invalid PDU.")
})?; })?;
if let Ok(content) =
serde_json::from_str::<ExtractBody>(pdu.content.get())
{
services().rooms.search.deindex_pdu(
shortroomid,
&pdu_id,
&content.body,
)?;
}
let room_version_id = let room_version_id =
services().rooms.state.get_room_version(&pdu.room_id)?; services().rooms.state.get_room_version(&pdu.room_id)?;
pdu.redact(room_version_id, reason)?; pdu.redact(room_version_id, reason)?;
self.replace_pdu( self.replace_pdu(
&pdu_id, &pdu_id,
&utils::to_canonical_object(&pdu).expect("PDU is an object"), &utils::to_canonical_object(&pdu).expect("PDU is an object"),