From c543b2d4fa8eb3a39a12c0620385ccc155bc06dd Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sun, 26 Mar 2023 23:37:28 +0200 Subject: [PATCH] Improve state event redaction --- src/Cache.cpp | 26 +++++++++++++++++++++++--- src/CacheStructs.h | 4 ++-- src/Cache_p.h | 21 ++++++++++++++++----- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/Cache.cpp b/src/Cache.cpp index aecf5f7c..329be386 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -3628,9 +3628,29 @@ Cache::saveTimelineMessages(lmdb::txn &txn, te); // overwrite the content and add redation data std::visit( - [redaction](auto &ev) { + [&redaction, &room_id, &txn, &eventsDb, this](auto &ev) { ev.unsigned_data.redacted_because = *redaction; ev.unsigned_data.redacted_by = redaction->event_id; + + if constexpr (isStateEvent_) { + auto statesdb = getStatesDb(txn, room_id); + auto stateskeydb = getStatesKeyDb(txn, room_id); + auto membersdb = getMembersDb(txn, room_id); + mtx::events::StateEvent redactedEvent; + redactedEvent.event_id = ev.event_id; + redactedEvent.state_key = ev.state_key; + redactedEvent.type = ev.type; + nhlog::db()->critical("Redacting: {}", + nlohmann::json(redactedEvent).dump(2)); + + saveStateEvent(txn, + statesdb, + stateskeydb, + membersdb, + eventsDb, + room_id, + mtx::events::collections::StateEvents{redactedEvent}); + } }, te.data); event = mtx::accessors::serialize_event(te.data); @@ -5194,8 +5214,8 @@ to_json(nlohmann::json &j, const MemberInfo &info) void from_json(const nlohmann::json &j, MemberInfo &info) { - info.name = j.at("name").get(); - info.avatar_url = j.at("avatar_url").get(); + info.name = j.value("name", ""); + info.avatar_url = j.value("avatar_url", ""); info.is_direct = j.value("is_direct", false); info.reason = j.value("reason", ""); } diff --git a/src/CacheStructs.h b/src/CacheStructs.h index 07984931..aa3e85d2 100644 --- a/src/CacheStructs.h +++ b/src/CacheStructs.h @@ -113,8 +113,8 @@ struct MemberInfo { std::string name; std::string avatar_url; - std::string reason; - bool is_direct = false; + std::string reason = ""; + bool is_direct = false; }; void diff --git a/src/Cache_p.h b/src/Cache_p.h index 69e99fa0..cc016d4b 100644 --- a/src/Cache_p.h +++ b/src/Cache_p.h @@ -436,11 +436,22 @@ private: if (e.type != EventType::Unsupported) { if (std::is_same_v>, StateEvent>) { - if (e.type == EventType::RoomMember) - membersdb.del(txn, e.state_key, ""); - else if (e.state_key.empty()) - statesdb.del(txn, to_string(e.type)); - else + // apply the redaction event + if (e.type == EventType::RoomMember) { + // membership is not revoked, but names are yeeted (so we set the name + // to the mxid) + MemberInfo tmp{e.state_key, ""}; + membersdb.put(txn, e.state_key, nlohmann::json(tmp).dump()); + } else if (e.state_key.empty()) { + // strictly speaking some stuff in those events can be redacted, but + // this is close enough. Ref: + // https://spec.matrix.org/v1.6/rooms/v10/#redactions + if (e.type != EventType::RoomCreate && + e.type != EventType::RoomJoinRules && + e.type != EventType::RoomPowerLevels && + e.type != EventType::RoomHistoryVisibility) + statesdb.del(txn, to_string(e.type)); + } else stateskeydb.del( txn, to_string(e.type), e.state_key + '\0' + e.event_id); } else if (e.state_key.empty()) {