Improve state event redaction

This commit is contained in:
Nicolas Werner 2023-03-26 23:37:28 +02:00
parent ef53644155
commit c543b2d4fa
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9
3 changed files with 41 additions and 10 deletions

View file

@ -3628,9 +3628,29 @@ Cache::saveTimelineMessages(lmdb::txn &txn,
te); te);
// overwrite the content and add redation data // overwrite the content and add redation data
std::visit( std::visit(
[redaction](auto &ev) { [&redaction, &room_id, &txn, &eventsDb, this](auto &ev) {
ev.unsigned_data.redacted_because = *redaction; ev.unsigned_data.redacted_because = *redaction;
ev.unsigned_data.redacted_by = redaction->event_id; ev.unsigned_data.redacted_by = redaction->event_id;
if constexpr (isStateEvent_<decltype(ev)>) {
auto statesdb = getStatesDb(txn, room_id);
auto stateskeydb = getStatesKeyDb(txn, room_id);
auto membersdb = getMembersDb(txn, room_id);
mtx::events::StateEvent<mtx::events::msg::Redacted> 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); te.data);
event = mtx::accessors::serialize_event(te.data); event = mtx::accessors::serialize_event(te.data);
@ -5194,8 +5214,8 @@ to_json(nlohmann::json &j, const MemberInfo &info)
void void
from_json(const nlohmann::json &j, MemberInfo &info) from_json(const nlohmann::json &j, MemberInfo &info)
{ {
info.name = j.at("name").get<std::string>(); info.name = j.value("name", "");
info.avatar_url = j.at("avatar_url").get<std::string>(); info.avatar_url = j.value("avatar_url", "");
info.is_direct = j.value("is_direct", false); info.is_direct = j.value("is_direct", false);
info.reason = j.value("reason", ""); info.reason = j.value("reason", "");
} }

View file

@ -113,8 +113,8 @@ struct MemberInfo
{ {
std::string name; std::string name;
std::string avatar_url; std::string avatar_url;
std::string reason; std::string reason = "";
bool is_direct = false; bool is_direct = false;
}; };
void void

View file

@ -436,11 +436,22 @@ private:
if (e.type != EventType::Unsupported) { if (e.type != EventType::Unsupported) {
if (std::is_same_v<std::remove_cv_t<std::remove_reference_t<decltype(e)>>, if (std::is_same_v<std::remove_cv_t<std::remove_reference_t<decltype(e)>>,
StateEvent<mtx::events::msg::Redacted>>) { StateEvent<mtx::events::msg::Redacted>>) {
if (e.type == EventType::RoomMember) // apply the redaction event
membersdb.del(txn, e.state_key, ""); if (e.type == EventType::RoomMember) {
else if (e.state_key.empty()) // membership is not revoked, but names are yeeted (so we set the name
statesdb.del(txn, to_string(e.type)); // to the mxid)
else 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( stateskeydb.del(
txn, to_string(e.type), e.state_key + '\0' + e.event_id); txn, to_string(e.type), e.state_key + '\0' + e.event_id);
} else if (e.state_key.empty()) { } else if (e.state_key.empty()) {