diff --git a/src/jamidht/account_manager.cpp b/src/jamidht/account_manager.cpp index 010ac1859f4c44c94c9b305d793868cd83253846..61e8e0278ab7034e8912c471bebe91f84c5ac122 100644 --- a/src/jamidht/account_manager.cpp +++ b/src/jamidht/account_manager.cpp @@ -26,6 +26,7 @@ #include "libdevcrypto/Common.h" #include <opendht/thread_pool.h> +#include <opendht/crypto.h> #include <exception> #include <future> @@ -33,6 +34,19 @@ namespace jami { +AccountManager::CertRequest +AccountManager::buildRequest(PrivateKey fDeviceKey) +{ + return dht::ThreadPool::computation().get<std::unique_ptr<dht::crypto::CertificateRequest>>([fDeviceKey]{ + auto request = std::make_unique<dht::crypto::CertificateRequest>(); + request->setName("Jami device"); + auto deviceKey = fDeviceKey.get(); + request->setUID(deviceKey->getPublicKey().getId().toString()); + request->sign(*deviceKey); + return request; + }); +} + dht::crypto::Identity AccountManager::loadIdentity(const std::string& crt_path, const std::string& key_path, const std::string& key_pwd) const { diff --git a/src/jamidht/account_manager.h b/src/jamidht/account_manager.h index 4aa1e1822d3fe6514cb2d68e13b18d472191586e..4ce18ade1c86c73925cf455a6c326a57034b5a8b 100644 --- a/src/jamidht/account_manager.h +++ b/src/jamidht/account_manager.h @@ -101,6 +101,9 @@ public: using AuthFailureCallback = std::function<void(AuthError error, const std::string& message)>; using DeviceSyncCallback = std::function<void(DeviceSync&& syncData)>; using CertRequest = std::future<std::unique_ptr<dht::crypto::CertificateRequest>>; + using PrivateKey = std::shared_future<std::shared_ptr<dht::crypto::PrivateKey>>; + + CertRequest buildRequest(PrivateKey fDeviceKey); struct AccountCredentials { std::string scheme; @@ -110,7 +113,7 @@ public: }; virtual void initAuthentication( - CertRequest request, + PrivateKey request, std::string deviceName, std::unique_ptr<AccountCredentials> credentials, AuthSuccessCallback onSuccess, diff --git a/src/jamidht/archive_account_manager.cpp b/src/jamidht/archive_account_manager.cpp index c5f1202773e70920b156fadaf6132656e3c2cc17..7fb81a473165fcdc6110d6867611d048567a6383 100644 --- a/src/jamidht/archive_account_manager.cpp +++ b/src/jamidht/archive_account_manager.cpp @@ -36,7 +36,7 @@ const constexpr auto EXPORT_KEY_RENEWAL_TIME = std::chrono::minutes(20); void ArchiveAccountManager::initAuthentication( - CertRequest request, + PrivateKey key, std::string deviceName, std::unique_ptr<AccountCredentials> credentials, AuthSuccessCallback onSuccess, @@ -44,7 +44,8 @@ ArchiveAccountManager::initAuthentication( OnChangeCallback onChange) { auto ctx = std::make_shared<AuthContext>(); - ctx->request = std::move(request); + ctx->key = key; + ctx->request = buildRequest(key); ctx->deviceName = std::move(deviceName); ctx->credentials = dynamic_unique_cast<ArchiveAccountCredentials>(std::move(credentials)); ctx->onSuccess = std::move(onSuccess); @@ -324,6 +325,7 @@ ArchiveAccountManager::onArchiveLoaded( auto receiptSignature = a.id.first->sign({receipt.first.begin(), receipt.first.end()}); auto info = std::make_unique<AccountInfo>(); + info->identity.first = ctx.key.get(); info->identity.second = deviceCertificate; info->accountId = a.id.second->getId().toString(); info->deviceId = deviceCertificate->getPublicKey().getId().toString(); diff --git a/src/jamidht/archive_account_manager.h b/src/jamidht/archive_account_manager.h index ef7778aa1c41621774f663843de8c49fa7b011bc..55b5ef063ca5e258ba5314da13f98ab4a8275995 100644 --- a/src/jamidht/archive_account_manager.h +++ b/src/jamidht/archive_account_manager.h @@ -43,7 +43,7 @@ public: }; void initAuthentication( - CertRequest request, + PrivateKey request, std::string deviceName, std::unique_ptr<AccountCredentials> credentials, AuthSuccessCallback onSuccess, @@ -71,6 +71,7 @@ public: private: struct DhtLoadContext; struct AuthContext { + PrivateKey key; CertRequest request; std::string deviceName; std::unique_ptr<ArchiveAccountCredentials> credentials; diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp index 080d979acbdeaaf4e55fe03a670a4d50c07cdd81..b92bceac4b023585b494543e800f19d6cbb8e416 100644 --- a/src/jamidht/jamiaccount.cpp +++ b/src/jamidht/jamiaccount.cpp @@ -1118,15 +1118,6 @@ JamiAccount::loadAccount(const std::string& archive_password, const std::string& return std::make_shared<dht::crypto::PrivateKey>(dht::crypto::PrivateKey::generate()); }); - auto fReq = dht::ThreadPool::computation().get<std::unique_ptr<dht::crypto::CertificateRequest>>([fDeviceKey]{ - auto request = std::make_unique<dht::crypto::CertificateRequest>(); - request->setName("Jami device"); - auto deviceKey = fDeviceKey.get(); - request->setUID(deviceKey->getPublicKey().getId().toString()); - request->sign(*deviceKey); - return request; - }); - std::unique_ptr<AccountManager::AccountCredentials> creds; if (managerUri_.empty()) { auto acreds = std::make_unique<ArchiveAccountManager::ArchiveAccountCredentials>(); @@ -1164,7 +1155,7 @@ JamiAccount::loadAccount(const std::string& archive_password, const std::string& bool isManaged = !managerUri_.empty(); accountManager_->initAuthentication( - std::move(fReq), + fDeviceKey, ip_utils::getDeviceName(), std::move(creds), [this, fDeviceKey, migrating](const AccountInfo& info, diff --git a/src/jamidht/server_account_manager.cpp b/src/jamidht/server_account_manager.cpp index cc913fbc5246be68adca07345107b7d134939186..688db1677a093b22b7c9c69f29f22584bc059a19 100644 --- a/src/jamidht/server_account_manager.cpp +++ b/src/jamidht/server_account_manager.cpp @@ -58,7 +58,7 @@ ServerAccountManager::setAuthHeaderFields(Request& request) const { void ServerAccountManager::initAuthentication( - CertRequest csrRequest, + PrivateKey key, std::string deviceName, std::unique_ptr<AccountCredentials> credentials, AuthSuccessCallback onSuccess, @@ -66,7 +66,8 @@ ServerAccountManager::initAuthentication( OnChangeCallback onChange) { auto ctx = std::make_shared<AuthContext>(); - ctx->request = std::move(csrRequest); + ctx->key = key; + ctx->request = buildRequest(key); ctx->deviceName = std::move(deviceName); ctx->credentials = dynamic_unique_cast<ServerAccountCredentials>(std::move(credentials)); ctx->onSuccess = std::move(onSuccess); @@ -125,6 +126,7 @@ ServerAccountManager::initAuthentication( auto receiptSignature = base64::decode(json["receiptSignature"].asString()); auto info = std::make_unique<AccountInfo>(); + info->identity.first = ctx->key.get(); info->identity.second = cert; info->deviceId = cert->getPublicKey().getId().toString(); info->accountId = accountCert->getId().toString(); diff --git a/src/jamidht/server_account_manager.h b/src/jamidht/server_account_manager.h index f510cf4b1522208b45136031435d5fee8324d9fa..6b33cb41abf62f550d1040f2bc89cd3d7035a0df 100644 --- a/src/jamidht/server_account_manager.h +++ b/src/jamidht/server_account_manager.h @@ -39,7 +39,7 @@ public: }; void initAuthentication( - CertRequest request, + PrivateKey request, std::string deviceName, std::unique_ptr<AccountCredentials> credentials, AuthSuccessCallback onSuccess, @@ -59,6 +59,7 @@ public: private: struct AuthContext { + PrivateKey key; CertRequest request; std::string deviceName; std::unique_ptr<ServerAccountCredentials> credentials;