From 5a47c754273e3d7c7c7a984d9966a88f9f8196ac Mon Sep 17 00:00:00 2001 From: timokoesters Date: Mon, 1 Jun 2020 20:58:49 +0200 Subject: [PATCH] fix: make redactions permanent --- src/client_server.rs | 4 ++-- src/database/rooms.rs | 25 ++++++++++++++++++++----- src/pdu.rs | 6 ++++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/client_server.rs b/src/client_server.rs index 3635bf3f..e56a7c54 100644 --- a/src/client_server.rs +++ b/src/client_server.rs @@ -2260,12 +2260,12 @@ pub fn get_message_events_route( .map(|pdu| pdu.to_room_event()) .collect::>(); - MatrixResult(Ok(dbg!(get_message_events::Response { + MatrixResult(Ok(get_message_events::Response { start: Some(body.from.clone()), end: prev_batch, chunk: room_events, state: Vec::new(), - }))) + })) } else { MatrixResult(Err(Error { kind: ErrorKind::Unknown, diff --git a/src/database/rooms.rs b/src/database/rooms.rs index 1c25c259..5b9f1e2c 100644 --- a/src/database/rooms.rs +++ b/src/database/rooms.rs @@ -8,6 +8,7 @@ use ruma_events::{ room::{ join_rules, member, power_levels::{self, PowerLevelsEventContent}, + redaction, }, EventJson, EventType, }; @@ -207,7 +208,6 @@ impl Rooms { globals: &super::globals::Globals, ) -> Result { // TODO: Make sure this isn't called twice in parallel - let prev_events = self.get_pdu_leaves(&room_id)?; // Is the event authorized? @@ -404,7 +404,6 @@ impl Rooms { authorized } EventType::RoomCreate => prev_events.is_empty(), - // Not allow any of the following events if the sender is not joined. _ if sender_membership != member::MembershipState::Join => false, @@ -450,15 +449,15 @@ impl Rooms { origin_server_ts: utils::millis_since_unix_epoch() .try_into() .expect("this only fails many years in the future"), - kind: event_type, - content, + kind: event_type.clone(), + content: content.clone(), state_key, prev_events, depth: depth .try_into() .expect("depth can overflow and should be deprecated..."), auth_events: Vec::new(), - redacts, + redacts: redacts.clone(), unsigned, hashes: ruma_federation_api::EventHash { sha256: "aaa".to_owned(), @@ -506,6 +505,22 @@ impl Rooms { self.roomstateid_pdu.insert(key, &*pdu_json.to_string())?; } + match event_type { + EventType::RoomRedaction => { + if let Some(redact_id) = &redacts { + // TODO: Reason + let _reason = serde_json::from_value::< + EventJson, + >(content)? + .deserialize()? + .reason; + + self.redact_pdu(&redact_id)?; + } + } + _ => {} + } + self.edus.room_read_set(&room_id, &sender, index)?; Ok(pdu.event_id) diff --git a/src/pdu.rs b/src/pdu.rs index 3e1ac0ac..12496425 100644 --- a/src/pdu.rs +++ b/src/pdu.rs @@ -7,6 +7,7 @@ use ruma_events::{ use ruma_federation_api::EventHash; use ruma_identifiers::{EventId, RoomId, UserId}; use serde::{Deserialize, Serialize}; +use serde_json::json; use std::collections::HashMap; #[derive(Deserialize, Serialize)] @@ -62,6 +63,11 @@ impl PduEvent { } } + self.unsigned.insert( + "redacted_because".to_owned(), + json!({"content": {}, "type": "m.room.redaction"}), + ); + self.content = new_content.into(); }