[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