summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/Cache.cpp26
-rw-r--r--src/CacheStructs.h4
-rw-r--r--src/Cache_p.h21
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_<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);
                 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<std::string>();
-    info.avatar_url = j.at("avatar_url").get<std::string>();
+    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<std::remove_cv_t<std::remove_reference_t<decltype(e)>>,
                                          StateEvent<mtx::events::msg::Redacted>>) {
-                          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()) {