aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Fella <fella@posteo.de>2021-12-08 23:07:14 +0100
committerTobias Fella <fella@posteo.de>2021-12-08 23:07:14 +0100
commita0ce17dfe793c924205b449c026f2f776b032ff3 (patch)
tree99f5b7e45777a240e5fc87f5349cd0edd5371c91
parent9fb07da8451f024085061e2985e9be384e7beb5c (diff)
downloadlibquotient-a0ce17dfe793c924205b449c026f2f776b032ff3.tar.gz
libquotient-a0ce17dfe793c924205b449c026f2f776b032ff3.zip
Store encryptedevent in decrypted roomevents
-rw-r--r--lib/events/roomevent.cpp13
-rw-r--r--lib/events/roomevent.h4
-rw-r--r--lib/room.cpp7
3 files changed, 22 insertions, 2 deletions
diff --git a/lib/events/roomevent.cpp b/lib/events/roomevent.cpp
index fb921af6..b99d1381 100644
--- a/lib/events/roomevent.cpp
+++ b/lib/events/roomevent.cpp
@@ -126,3 +126,16 @@ CallEventBase::CallEventBase(Event::Type type, const QJsonObject& json)
if (callId().isEmpty())
qCWarning(EVENTS) << id() << "is a call event with an empty call id";
}
+
+void RoomEvent::setOriginalEvent(event_ptr_tt<RoomEvent> originalEvent)
+{
+ _originalEvent = std::move(originalEvent);
+}
+
+const QJsonObject RoomEvent::encryptedJson() const
+{
+ if(!_originalEvent) {
+ return {};
+ }
+ return _originalEvent->fullJson();
+}
diff --git a/lib/events/roomevent.h b/lib/events/roomevent.h
index 7f13f6f2..35527a62 100644
--- a/lib/events/roomevent.h
+++ b/lib/events/roomevent.h
@@ -60,11 +60,15 @@ public:
//! callback for that in RoomEvent.
void addId(const QString& newId);
+ void setOriginalEvent(event_ptr_tt<RoomEvent> originalEvent);
+ const QJsonObject encryptedJson() const;
+
protected:
void dumpTo(QDebug dbg) const override;
private:
event_ptr_tt<RedactionEvent> _redactedBecause;
+ event_ptr_tt<RoomEvent> _originalEvent;
};
using RoomEventPtr = event_ptr_tt<RoomEvent>;
using RoomEvents = EventsArray<RoomEvent>;
diff --git a/lib/room.cpp b/lib/room.cpp
index 8e348089..b3a092f3 100644
--- a/lib/room.cpp
+++ b/lib/room.cpp
@@ -1517,6 +1517,7 @@ void Room::handleRoomKeyEvent(const RoomKeyEvent& roomKeyEvent,
auto decrypted = decryptMessage(*encryptedEvent);
if(decrypted) {
auto oldEvent = event->replaceEvent(std::move(decrypted));
+ decrypted->setOriginalEvent(std::move(oldEvent));
emit replacedEvent(event->event(), rawPtr(oldEvent));
d->undecryptedEvents[roomKeyEvent.sessionId()] -= eventId;
}
@@ -2596,7 +2597,8 @@ Room::Changes Room::Private::addNewMessageEvents(RoomEvents&& events)
if(auto* encrypted = eventCast<EncryptedEvent>(events[i])) {
auto decrypted = q->decryptMessage(*encrypted);
if(decrypted) {
- events[i] = std::move(decrypted);
+ auto oldEvent = std::exchange(events[i], std::move(decrypted));
+ events[i]->setOriginalEvent(std::move(oldEvent));
} else {
undecryptedEvents[encrypted->sessionId()] += encrypted->id();
}
@@ -2760,7 +2762,8 @@ void Room::Private::addHistoricalMessageEvents(RoomEvents&& events)
if(auto* encrypted = eventCast<EncryptedEvent>(events[i])) {
auto decrypted = q->decryptMessage(*encrypted);
if(decrypted) {
- events[i] = std::move(decrypted);
+ auto oldEvent = std::exchange(events[i], std::move(decrypted));
+ events[i]->setOriginalEvent(std::move(oldEvent));
} else {
undecryptedEvents[encrypted->sessionId()] += encrypted->id();
}