[network/ruqola] src/core: Decrypt message directly

Laurent Montel <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 766d20e5c10ddf2641821c2dba0a03ddaa683bd1 by Laurent Montel.
Committed on 06/08/2026 at 06:10.
Pushed by mlaurent into branch 'master'.

Decrypt message directly

M  +10   -0    src/core/messages/messageencrypted.cpp
M  +4    -0    src/core/messages/messageencrypted.h
M  +17   -2    src/core/model/messagesmodel.cpp
M  +2    -0    src/core/model/messagesmodel.h
M  +3    -0    src/core/room.cpp

https://invent.kde.org/network/ruqola/-/commit/766d20e5c10ddf2641821c2dba0a03ddaa683bd1

diff --git a/src/core/messages/messageencrypted.cpp b/src/core/messages/messageencrypted.cpp
index da5bbd9968..7b7d0ebe72 100644
--- a/src/core/messages/messageencrypted.cpp
+++ b/src/core/messages/messageencrypted.cpp
@@ -78,6 +78,16 @@ void MessageEncrypted::setIv(const QByteArray &newIv)
     mIv = newIv;
 }
 
+void MessageEncrypted::decryptContent(const QByteArray &sessionKey) const
+{
+    mDecryptedContent = decrypt(sessionKey);
+}
+
+QByteArray MessageEncrypted::decryptedContent() const
+{
+    return mDecryptedContent;
+}
+
 QByteArray MessageEncrypted::decrypt([[maybe_unused]] const QByteArray &sessionKey) const
 {
 #if USE_E2E_SUPPORT
diff --git a/src/core/messages/messageencrypted.h b/src/core/messages/messageencrypted.h
index a2c77f8dc8..f600dc1f79 100644
--- a/src/core/messages/messageencrypted.h
+++ b/src/core/messages/messageencrypted.h
@@ -41,10 +41,14 @@ public:
     [[nodiscard]] QByteArray decrypt(const QByteArray &sessionKey) const;
     [[nodiscard]] bool encrypt(const QByteArray &plainText, const QByteArray &sessionKey, const QByteArray &keyId = {});
 
+    void decryptContent(const QByteArray &sessionKey) const;
+    [[nodiscard]] QByteArray decryptedContent() const;
+
 private:
     QByteArray mAlgorithm;
     QByteArray mKeyId;
     QString mCiphertext; // TODO QByteArray ?
     QByteArray mIv;
+    mutable QByteArray mDecryptedContent;
 };
 LIBRUQOLACORE_EXPORT QDebug operator<<(QDebug d, const MessageEncrypted &t);
diff --git a/src/core/model/messagesmodel.cpp b/src/core/model/messagesmodel.cpp
index cd43ebd629..ad82d17512 100644
--- a/src/core/model/messagesmodel.cpp
+++ b/src/core/model/messagesmodel.cpp
@@ -173,13 +173,18 @@ void MessagesModel::addMessage(const Message &message)
         const QModelIndex index = createIndex(rowNumber, 0);
         Q_EMIT dataChanged(index, index, roles);
     };
+    if (mRoom && !mRoom->sessionKey().isEmpty()) {
+        if (auto f = message.messageEncrypted()) {
+            f->decryptContent(mRoom->sessionKey());
+        }
+    }
 
     // When we have 1 element.
     if (mAllMessages.count() == 1 && (*mAllMessages.begin()).messageId() == message.messageId()) {
         (*mAllMessages.begin()) = message;
         qCDebug(RUQOLA_MESSAGEMODELS_LOG) << "Update first message";
         emitChanged(0, {OriginalMessageOrAttachmentDescription});
-    } else if (((it) != mAllMessages.begin() && (*(it - 1)).messageId() == message.messageId())) {
+    } else if ((it) != mAllMessages.begin() && (*(it - 1)).messageId() == message.messageId()) {
         qCDebug(RUQOLA_MESSAGEMODELS_LOG) << "Update message: " << message.text();
         if (message.pendingMessage()) {
             // If we already have a message and we must add pending message it's that server
@@ -432,13 +437,23 @@ void MessagesModel::generateText(const Message &message, const QString &searchTe
     // mNumberOfTextSearched = numberOfTextSearched;
 }
 
+void MessagesModel::decryptMessages(const QByteArray &sessionKey)
+{
+    qDebug() << " void MessagesModel::decryptMessages(const QByteArray &sessionKey)" << mAllMessages.count();
+    for (auto &msg : std::as_const(mAllMessages)) {
+        if (auto f = msg.messageEncrypted()) {
+            f->decryptContent(sessionKey);
+        }
+    }
+}
+
 QString MessagesModel::convertedText(const Message &message, const QString &searchedText) const
 {
     if (message.messageType() == Message::System) {
         return message.systemMessageText();
     } else if (message.messageType() == Message::EncryptedText) {
         // TODO move in messageEncrypted
-        const QByteArray content = message.messageEncrypted()->decrypt(mRoom->sessionKey());
+        const QByteArray content = message.messageEncrypted()->decryptedContent();
         qDebug() << " content " << content;
         if (!content.isEmpty()) {
             const QJsonDocument doc = QJsonDocument::fromJson(content);
diff --git a/src/core/model/messagesmodel.h b/src/core/model/messagesmodel.h
index ca39ddf853..a4329525ac 100644
--- a/src/core/model/messagesmodel.h
+++ b/src/core/model/messagesmodel.h
@@ -181,6 +181,8 @@ public:
 
     void generateText(const Message &message, const QString &searchText, int hightLightStringIndex);
 
+    void decryptMessages(const QByteArray &sessionKey);
+
 private:
     LIBRUQOLACORE_NO_EXPORT void slotFileDownloaded(const QString &filePath, const QUrl &cacheImageUrl);
     /**
diff --git a/src/core/room.cpp b/src/core/room.cpp
index 84f0dc493a..f6bed95098 100644
--- a/src/core/room.cpp
+++ b/src/core/room.cpp
@@ -1268,6 +1268,9 @@ void Room::decryptSessionKeyWithPrivateKey(RSA *privateKey)
                                    << "roomName=" << name() << "roomId=" << roomId() << "e2eKeyId=" << mRoomEncryptionKey->e2eKeyId()
                                    << "e2eKeyLen=" << mRoomEncryptionKey->e2EKey().size() << "hasPrivateKey=" << (privateKey != nullptr);
     mRoomEncryptionKey->decryptWithPrivateKey(privateKey);
+    if (!mRoomEncryptionKey->sessionKey().isEmpty()) {
+        mMessageModel->decryptMessages(mRoomEncryptionKey->sessionKey());
+    }
 }
 #endif
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.