[network/ruqola] src/core/localdatabase: Adapt new identifier

Laurent Montel <[email protected]> Wed, 5 Aug 2026 06:37:11 +0000 (UTC)
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 012ec8535a3068ffe178cca814fffae1e8943da7 by Laurent Montel.
Committed on 05/08/2026 at 06:34.
Pushed by mlaurent into branch 'master'.

Adapt new identifier

M  +22   -20   src/core/localdatabase/autotests/e2eroomsdatabasetest.cpp
M  +21   -8    src/core/localdatabase/e2eroomsdatabase.cpp
M  +7    -4    src/core/localdatabase/e2eroomsdatabase.h

https://invent.kde.org/network/ruqola/-/commit/012ec8535a3068ffe178cca814fffae1e8943da7

diff --git a/src/core/localdatabase/autotests/e2eroomsdatabasetest.cpp b/src/core/localdatabase/autotests/e2eroomsdatabasetest.cpp
index e59b8e4442..f0e7448a68 100644
--- a/src/core/localdatabase/autotests/e2eroomsdatabasetest.cpp
+++ b/src/core/localdatabase/autotests/e2eroomsdatabasetest.cpp
@@ -10,8 +10,10 @@
 
 QTEST_GUILESS_MAIN(E2ERoomsDataBaseTest)
 using namespace Qt::Literals::StringLiterals;
-const auto testUser = QStringLiteral("testuser");
-const auto otherUser = QStringLiteral("otheruser");
+const auto testRoom = QStringLiteral("testRoom");
+const auto testKey = QStringLiteral("testKey");
+const auto testOtherRoom = QStringLiteral("testOtherRoom");
+const auto testOtherKey = QStringLiteral("testOtherKey");
 static QString accountName()
 {
     return u"myAccount"_s;
@@ -20,8 +22,8 @@ using namespace Qt::Literals::StringLiterals;
 void E2ERoomsDataBaseTest::initTestCase()
 {
     E2ERoomsDataBase store;
-    QVERIFY(store.deleteKey(accountName(), testUser));
-    QVERIFY(store.deleteKey(accountName(), otherUser));
+    QVERIFY(store.deleteKey(accountName(), testRoom, testKey));
+    QVERIFY(store.deleteKey(accountName(), testOtherRoom, testOtherKey));
 }
 
 void E2ERoomsDataBaseTest::shouldDefaultValues()
@@ -34,28 +36,28 @@ void E2ERoomsDataBaseTest::shouldDefaultValues()
 void E2ERoomsDataBaseTest::testSaveLoadDelete()
 {
     E2ERoomsDataBase store;
-    const auto userId = testUser;
+    const auto userId = testRoom;
     const auto rsaKeyPair = EncryptionUtils::generateRSAKey();
     const auto priv = rsaKeyPair.publicKey;
     const auto pub = rsaKeyPair.privateKey;
 
-    QVERIFY(store.saveKey(accountName(), userId, priv, pub));
-    QVERIFY(store.hasKey(accountName(), userId));
+    QVERIFY(store.saveKey(accountName(), testRoom, testKey, priv, pub));
+    QVERIFY(store.hasKey(accountName(), testRoom, testKey));
 
     QByteArray loadedPriv;
     QByteArray loadedPub;
-    QVERIFY(store.loadKey(accountName(), userId, loadedPriv, loadedPub));
+    QVERIFY(store.loadKey(accountName(), testRoom, testKey, loadedPriv, loadedPub));
     QCOMPARE(loadedPriv, priv);
     QCOMPARE(loadedPub, pub);
 
-    QVERIFY(store.deleteKey(accountName(), userId));
-    QVERIFY(!store.hasKey(accountName(), userId));
+    QVERIFY(store.deleteKey(accountName(), testRoom, testKey));
+    QVERIFY(!store.hasKey(accountName(), testRoom, testKey));
 }
 
 void E2ERoomsDataBaseTest::testOverwrite()
 {
     E2ERoomsDataBase store;
-    const auto userId = testUser;
+    const auto userId = testRoom;
     const auto rsaKeyPair1 = EncryptionUtils::generateRSAKey();
     const auto rsaKeyPair2 = EncryptionUtils::generateRSAKey();
 
@@ -64,32 +66,32 @@ void E2ERoomsDataBaseTest::testOverwrite()
     const auto priv2 = rsaKeyPair2.privateKey;
     const auto pub2 = rsaKeyPair2.publicKey;
 
-    QVERIFY(store.saveKey(accountName(), userId, priv1, pub1));
+    QVERIFY(store.saveKey(accountName(), testRoom, testKey, priv1, pub1));
     {
         QByteArray loadedPriv, loadedPub;
-        QVERIFY(store.loadKey(accountName(), userId, loadedPriv, loadedPub));
+        QVERIFY(store.loadKey(accountName(), testRoom, testKey, loadedPriv, loadedPub));
         QCOMPARE(loadedPriv, priv1);
         QCOMPARE(loadedPub, pub1);
     }
 
-    QVERIFY(store.saveKey(accountName(), userId, priv2, pub2));
+    QVERIFY(store.saveKey(accountName(), testRoom, testKey, priv2, pub2));
     {
         QByteArray loadedPriv, loadedPub;
-        QVERIFY(store.loadKey(accountName(), userId, loadedPriv, loadedPub));
+        QVERIFY(store.loadKey(accountName(), testRoom, testKey, loadedPriv, loadedPub));
         QCOMPARE(loadedPriv, priv2);
         QCOMPARE(loadedPub, pub2);
     }
-    QVERIFY(store.deleteKey(accountName(), userId));
+    QVERIFY(store.deleteKey(accountName(), testRoom, testKey));
 }
 
 void E2ERoomsDataBaseTest::testNonExistentKey()
 {
     E2ERoomsDataBase store;
-    const auto userId = otherUser;
+    const auto userId = testOtherRoom;
     QByteArray priv, pub;
-    QVERIFY(!store.hasKey(accountName(), userId));
-    QVERIFY(!store.loadKey(accountName(), userId, priv, pub));
-    QVERIFY(store.deleteKey(accountName(), userId));
+    QVERIFY(!store.hasKey(accountName(), testRoom, testKey));
+    QVERIFY(!store.loadKey(accountName(), testRoom, testKey, priv, pub));
+    QVERIFY(store.deleteKey(accountName(), testRoom, testKey));
 }
 
 #include "moc_e2eroomsdatabasetest.cpp"
diff --git a/src/core/localdatabase/e2eroomsdatabase.cpp b/src/core/localdatabase/e2eroomsdatabase.cpp
index a1b422fded..290c8b445c 100644
--- a/src/core/localdatabase/e2eroomsdatabase.cpp
+++ b/src/core/localdatabase/e2eroomsdatabase.cpp
@@ -32,7 +32,20 @@ QString E2ERoomsDataBase::schemaDataBase() const
     return QString::fromLatin1(s_schemaE2ERoomsKeysStore);
 }
 
-bool E2ERoomsDataBase::saveKey(const QString &accountName, const QString &userId, const QByteArray &encryptedPrivateKey, const QByteArray &publicKey)
+QString E2ERoomsDataBase::generateRoomKeyId(const QString &roomId, const QString &keyId) const
+{
+    if (roomId.isEmpty() || keyId.isEmpty()) {
+        qCWarning(RUQOLA_DATABASE_LOG) << "Impossible to generate identifier";
+        return {};
+    }
+    return u"%1-%2"_s.arg(roomId, keyId);
+}
+
+bool E2ERoomsDataBase::saveKey(const QString &accountName,
+                               const QString &roomId,
+                               const QString &keyId,
+                               const QByteArray &encryptedPrivateKey,
+                               const QByteArray &publicKey)
 {
     QSqlDatabase db;
     if (!initializeDataBase(accountName, db)) {
@@ -40,7 +53,7 @@ bool E2ERoomsDataBase::saveKey(const QString &accountName, const QString &userId
     }
     QSqlQuery query(db);
     query.prepare(QStringLiteral("INSERT OR REPLACE INTO E2EROOMSKEYS (roomKeyId, encryptedPrivateKey, publicKey) VALUES (?, ?, ?)"));
-    query.addBindValue(userId);
+    query.addBindValue(generateRoomKeyId(roomId, keyId));
     query.addBindValue(encryptedPrivateKey);
     query.addBindValue(publicKey);
     if (!query.exec()) {
@@ -50,7 +63,7 @@ bool E2ERoomsDataBase::saveKey(const QString &accountName, const QString &userId
     return true;
 }
 
-bool E2ERoomsDataBase::loadKey(const QString &accountName, const QString &userId, QByteArray &encryptedPrivateKey, QByteArray &publicKey)
+bool E2ERoomsDataBase::loadKey(const QString &accountName, const QString &roomId, const QString &keyId, QByteArray &encryptedPrivateKey, QByteArray &publicKey)
 {
     QSqlDatabase db;
     if (!initializeDataBase(accountName, db)) {
@@ -58,7 +71,7 @@ bool E2ERoomsDataBase::loadKey(const QString &accountName, const QString &userId
     }
     QSqlQuery query(db);
     query.prepare(QStringLiteral("SELECT encryptedPrivateKey, publicKey FROM E2EROOMSKEYS WHERE roomKeyId = ?"));
-    query.addBindValue(userId);
+    query.addBindValue(generateRoomKeyId(roomId, keyId));
     if (query.exec() && query.first()) {
         encryptedPrivateKey = query.value(0).toByteArray();
         publicKey = query.value(1).toByteArray();
@@ -67,7 +80,7 @@ bool E2ERoomsDataBase::loadKey(const QString &accountName, const QString &userId
     return false;
 }
 
-bool E2ERoomsDataBase::deleteKey(const QString &accountName, const QString &userId)
+bool E2ERoomsDataBase::deleteKey(const QString &accountName, const QString &roomId, const QString &keyId)
 {
     QSqlDatabase db;
     if (!initializeDataBase(accountName, db)) {
@@ -75,7 +88,7 @@ bool E2ERoomsDataBase::deleteKey(const QString &accountName, const QString &user
     }
     QSqlQuery query(db);
     query.prepare(QStringLiteral("DELETE FROM E2EROOMSKEYS WHERE roomKeyId = ?"));
-    query.addBindValue(userId);
+    query.addBindValue(generateRoomKeyId(roomId, keyId));
     if (!query.exec()) {
         qCWarning(RUQOLA_DATABASE_LOG) << "Couldn't delete from E2EROOMSKEYS table" << db.databaseName() << query.lastError();
         return false;
@@ -83,7 +96,7 @@ bool E2ERoomsDataBase::deleteKey(const QString &accountName, const QString &user
     return true;
 }
 
-bool E2ERoomsDataBase::hasKey(const QString &accountName, const QString &userId)
+bool E2ERoomsDataBase::hasKey(const QString &accountName, const QString &roomId, const QString &keyId)
 {
     QSqlDatabase db;
     if (!initializeDataBase(accountName, db)) {
@@ -91,7 +104,7 @@ bool E2ERoomsDataBase::hasKey(const QString &accountName, const QString &userId)
     }
     QSqlQuery query(db);
     query.prepare(QStringLiteral("SELECT 1 FROM E2EROOMSKEYS WHERE roomKeyId = ?"));
-    query.addBindValue(userId);
+    query.addBindValue(generateRoomKeyId(roomId, keyId));
     return query.exec() && query.first();
 }
 
diff --git a/src/core/localdatabase/e2eroomsdatabase.h b/src/core/localdatabase/e2eroomsdatabase.h
index e40e6dd873..d9f6ffeb56 100644
--- a/src/core/localdatabase/e2eroomsdatabase.h
+++ b/src/core/localdatabase/e2eroomsdatabase.h
@@ -16,13 +16,16 @@ public:
     E2ERoomsDataBase();
     ~E2ERoomsDataBase() override;
 
-    [[nodiscard]] bool saveKey(const QString &accountName, const QString &userId, const QByteArray &encryptedPrivateKey, const QByteArray &publicKey);
-    [[nodiscard]] bool loadKey(const QString &accountName, const QString &userId, QByteArray &encryptedPrivateKey, QByteArray &publicKey);
-    [[nodiscard]] bool deleteKey(const QString &accountName, const QString &userId);
-    [[nodiscard]] bool hasKey(const QString &accountName, const QString &userId);
+    [[nodiscard]] bool
+    saveKey(const QString &accountName, const QString &roomId, const QString &keyId, const QByteArray &encryptedPrivateKey, const QByteArray &publicKey);
+    [[nodiscard]] bool loadKey(const QString &accountName, const QString &roomId, const QString &keyId, QByteArray &encryptedPrivateKey, QByteArray &publicKey);
+    [[nodiscard]] bool deleteKey(const QString &accountName, const QString &roomId, const QString &keyId);
+    [[nodiscard]] bool hasKey(const QString &accountName, const QString &roomId, const QString &keyId);
 
     [[nodiscard]] std::unique_ptr<QSqlTableModel> createE2eRoomsModel(const QString &accountName) const;
 
+    [[nodiscard]] QString generateRoomKeyId(const QString &roomId, const QString &keyId) const;
+
 protected:
     [[nodiscard]] QString schemaDataBase() const override;
 };