]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
solve memory mismanagement of object life time
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Thu, 13 Apr 2023 09:44:57 +0000 (11:44 +0200)
committerMatthieu Gallien <matthieu_gallien@yahoo.fr>
Fri, 30 Jun 2023 13:32:03 +0000 (15:32 +0200)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/clientsideencryption.cpp
src/libsync/clientsideencryption.h

index 8057ba05be7ad0c0ff726217879074be19f868e3..416d1c41141ae6a0e8f8ccb9748e3c6fa6a47a2e 100644 (file)
@@ -63,9 +63,10 @@ QString e2eeBaseUrl()
 namespace {
 constexpr char accountProperty[] = "account";
 
-const char e2e_cert[] = "_e2e-certificate";
-const char e2e_private[] = "_e2e-private";
-const char e2e_mnemonic[] = "_e2e-mnemonic";
+constexpr char e2e_cert[] = "_e2e-certificate";
+constexpr char e2e_private[] = "_e2e-private";
+constexpr char e2e_public[] = "_e2e-public";
+constexpr char e2e_mnemonic[] = "_e2e-mnemonic";
 
 constexpr auto metadataKeyJsonKey = "metadataKey";
 
@@ -1333,16 +1334,22 @@ void ClientSideEncryption::sendSignRequestCSR(const AccountPtr &account, PKey ke
     job->start();
 }
 
-void ClientSideEncryption::writeKeyPair(const AccountPtr &account,
+void ClientSideEncryption::writeKeyPair(AccountPtr account,
                                         PKey keyPair,
-                                        const QByteArray &output)
+                                        QByteArray output)
 {
-    const QString kck = AbstractCredentials::keychainKey(
+    const auto privateKeyKeychainId = AbstractCredentials::keychainKey(
         account->url().toString(),
         account->credentials()->user() + e2e_private,
         account->id()
         );
 
+    const auto publicKeyKeychainId = AbstractCredentials::keychainKey(
+        account->url().toString(),
+        account->credentials()->user() + e2e_public,
+        account->id()
+        );
+
     Bio privateKey;
     if (PEM_write_bio_PrivateKey(privateKey, keyPair, nullptr, nullptr, 0, nullptr, nullptr) <= 0) {
         qCInfo(lcCse()) << "Could not read private key from bio.";
@@ -1352,9 +1359,9 @@ void ClientSideEncryption::writeKeyPair(const AccountPtr &account,
 
     auto *privateKeyJob = new WritePasswordJob(Theme::instance()->appName());
     privateKeyJob->setInsecureFallback(false);
-    privateKeyJob->setKey(kck);
+    privateKeyJob->setKey(privateKeyKeychainId);
     privateKeyJob->setBinaryData(bytearrayPrivateKey);
-    connect(privateKeyJob, &WritePasswordJob::finished, [&keyPair, kck, &account, &output, this](Job *incoming) {
+    connect(privateKeyJob, &WritePasswordJob::finished, [keyPair = std::move(keyPair), publicKeyKeychainId, account, output, this] (Job *incoming) mutable {
         Q_UNUSED(incoming);
         qCInfo(lcCse()) << "Private key stored in keychain";
 
@@ -1367,9 +1374,9 @@ void ClientSideEncryption::writeKeyPair(const AccountPtr &account,
 
         auto *publicKeyJob = new WritePasswordJob(Theme::instance()->appName());
         publicKeyJob->setInsecureFallback(false);
-        publicKeyJob->setKey(kck);
+        publicKeyJob->setKey(publicKeyKeychainId);
         publicKeyJob->setBinaryData(bytearrayPublicKey);
-        connect(publicKeyJob, &WritePasswordJob::finished, [&account, &keyPair, &output, this](Job *incoming) {
+        connect(publicKeyJob, &WritePasswordJob::finished, [account, keyPair = std::move(keyPair), output, this](Job *incoming) mutable {
             Q_UNUSED(incoming);
             qCInfo(lcCse()) << "Public key stored in keychain";
 
index ed1b560a70409dd542dfec61908a9e501b9a3ce1..03720697fc0dea2708a0a9e74db249b7913e8fe8 100644 (file)
@@ -166,9 +166,9 @@ private slots:
 private:
     void generateCSR(const AccountPtr &account, PKey keyPair);
     void sendSignRequestCSR(const AccountPtr &account, PKey keyPair, const QByteArray &csrContent);
-    void writeKeyPair(const AccountPtr &account,
+    void writeKeyPair(AccountPtr account,
                       PKey keyPair,
-                      const QByteArray &output);
+                      QByteArray output);
 
     [[nodiscard]] bool checkPublicKeyValidity(const AccountPtr &account) const;
     [[nodiscard]] bool checkServerPublicKeyValidity(const QByteArray &serverPublicKeyString) const;