diff --git a/src/jamidht/account_manager.cpp b/src/jamidht/account_manager.cpp index 144cb6a43d31ee807b63fea65532bfc837435d6a..384b73912b960997b9f5a0a22153bb3a1d4934a3 100644 --- a/src/jamidht/account_manager.cpp +++ b/src/jamidht/account_manager.cpp @@ -84,7 +84,7 @@ AccountManager::loadIdentity(const std::string& crt_path, std::shared_ptr<dht::Value> AccountManager::parseAnnounce(const std::string& announceBase64, const std::string& accountId, - const std::string& deviceId) + const std::string& deviceSha1) { auto announce_val = std::make_shared<dht::Value>(); try { @@ -98,7 +98,7 @@ AccountManager::parseAnnounce(const std::string& announceBase64, } DeviceAnnouncement da; da.unpackValue(*announce_val); - if (da.from.toString() != accountId or da.dev.toString() != deviceId) { + if (da.from.toString() != accountId or da.dev.toString() != deviceSha1) { JAMI_ERR("[Auth] device ID mismatch in announce"); return {}; } @@ -165,7 +165,13 @@ AccountManager::useIdentity(const dht::crypto::Identity& identity, return nullptr; } - auto announce = parseAnnounce(root["announce"].asString(), id, dev_id); + auto devicePk = identity.first->getSharedPublicKey(); + if (!devicePk) { + JAMI_ERR("[Auth] No device pk found"); + return nullptr; + } + + auto announce = parseAnnounce(root["announce"].asString(), id, devicePk->getId().toString()); if (not announce) { return nullptr; } @@ -177,7 +183,7 @@ AccountManager::useIdentity(const dht::crypto::Identity& identity, info->contacts = std::move(contactList); info->contacts->load(); info->accountId = id; - info->devicePk = identity.first->getSharedPublicKey(); + info->devicePk = std::move(devicePk); info->deviceId = info->devicePk->getLongId().toString(); info->announce = std::move(announce); info->ethAccount = root["eth"].asString(); @@ -704,9 +710,7 @@ AccountManager::sendTrustRequestConfirm(const dht::InfoHash& toH, const std::str JAMI_WARN("sending trust request reply: %s / %s", toH.toString().c_str(), dev->getLongId().toString().c_str()); - dht_->putEncrypted(dht::InfoHash::get("inbox:" + dev->getId().toString()), - dev, - answer); + dht_->putEncrypted(dht::InfoHash::get("inbox:" + dev->getId().toString()), dev, answer); }); } diff --git a/src/jamidht/account_manager.h b/src/jamidht/account_manager.h index 0c751e60e7238e743f965798be4cb062ff760c97..43ec7c7e3c939ef73397a4176b767877708ab5db 100644 --- a/src/jamidht/account_manager.h +++ b/src/jamidht/account_manager.h @@ -182,7 +182,9 @@ public: using PeerCertificateCb = std::function<void(const std::shared_ptr<dht::crypto::Certificate>& crt, const dht::InfoHash& peer_account)>; - void onPeerMessage(const dht::crypto::PublicKey& peer_device, bool allowPublic, PeerCertificateCb&& cb); + void onPeerMessage(const dht::crypto::PublicKey& peer_device, + bool allowPublic, + PeerCertificateCb&& cb); bool onPeerCertificate(const std::shared_ptr<dht::crypto::Certificate>& crt, bool allowPublic, dht::InfoHash& account_id); @@ -251,7 +253,7 @@ public: static std::shared_ptr<dht::Value> parseAnnounce(const std::string& announceBase64, const std::string& accountId, - const std::string& deviceId); + const std::string& deviceSha1); // Name resolver using LookupCallback = NameDirectory::LookupCallback; diff --git a/src/jamidht/server_account_manager.cpp b/src/jamidht/server_account_manager.cpp index 0560a63fb525634f8f1aa29c55993c3b4ac38efb..a3b84cbea33361267d4b9b788d359848e68be8b7 100644 --- a/src/jamidht/server_account_manager.cpp +++ b/src/jamidht/server_account_manager.cpp @@ -146,7 +146,8 @@ ServerAccountManager::initAuthentication(PrivateKey key, auto info = std::make_unique<AccountInfo>(); info->identity.first = ctx->key.get(); info->identity.second = cert; - info->devicePk = std::make_shared<dht::crypto::PublicKey>(cert->getPublicKey()); + info->devicePk = std::make_shared<dht::crypto::PublicKey>( + cert->getPublicKey()); info->deviceId = info->devicePk->getLongId().toString(); info->accountId = accountCert->getId().toString(); info->contacts = std::make_unique<ContactList>(accountCert, @@ -159,9 +160,10 @@ ServerAccountManager::initAuthentication(PrivateKey key, ctx->deviceName, clock::now()); info->ethAccount = receiptJson["eth"].asString(); - info->announce = parseAnnounce(receiptJson["announce"].asString(), - info->accountId, - info->deviceId); + info->announce + = parseAnnounce(receiptJson["announce"].asString(), + info->accountId, + info->devicePk->getId().toString()); if (not info->announce) { ctx->onFailure(AuthError::SERVER_ERROR, "Can't parse announce from server"); @@ -178,8 +180,9 @@ ServerAccountManager::initAuthentication(PrivateKey key, if (!nameServer.empty() && nameServer[0] == '/') nameServer = this_.managerHostname_ + nameServer; this_.nameDir_ = NameDirectory::instance(nameServer); - config.emplace(DRing::Account::ConfProperties::RingNS::URI, - std::move(nameServer)); + config + .emplace(DRing::Account::ConfProperties::RingNS::URI, + std::move(nameServer)); } else if (name == "userPhoto"sv) { this_.info_->photo = json["userPhoto"].asString(); } else { @@ -212,13 +215,15 @@ ServerAccountManager::initAuthentication(PrivateKey key, } void -ServerAccountManager::onAuthEnded(const Json::Value& json, const dht::http::Response& response, TokenScope expectedScope) +ServerAccountManager::onAuthEnded(const Json::Value& json, + const dht::http::Response& response, + TokenScope expectedScope) { if (response.status_code >= 200 && response.status_code < 300) { auto scopeStr = json["scope"].asString(); - auto scope = scopeStr == "DEVICE"sv ? TokenScope::Device - : (scopeStr == "USER"sv ? TokenScope::User - : TokenScope::None); + auto scope = scopeStr == "DEVICE"sv + ? TokenScope::Device + : (scopeStr == "USER"sv ? TokenScope::User : TokenScope::None); auto expires_in = json["expires_in"].asLargestUInt(); auto expiration = std::chrono::steady_clock::now() + std::chrono::seconds(expires_in); JAMI_WARN("[Auth] Got server response: %d %s", response.status_code, response.body.c_str()); @@ -237,11 +242,17 @@ ServerAccountManager::authenticateDevice() } const std::string url = managerHostname_ + JAMI_PATH_LOGIN; JAMI_WARN("[Auth] getting a device token: %s", url.c_str()); - auto request = std::make_shared<Request>(*Manager::instance().ioContext(), url, Json::Value{Json::objectValue}, [onAsync = onAsync_](Json::Value json, const dht::http::Response& response) { - onAsync([=] (AccountManager& accountManager) { - static_cast<ServerAccountManager*>(&accountManager)->onAuthEnded(json, response, TokenScope::Device); - }); - }, logger_); + auto request = std::make_shared<Request>( + *Manager::instance().ioContext(), + url, + Json::Value {Json::objectValue}, + [onAsync = onAsync_](Json::Value json, const dht::http::Response& response) { + onAsync([=](AccountManager& accountManager) { + static_cast<ServerAccountManager*>(&accountManager) + ->onAuthEnded(json, response, TokenScope::Device); + }); + }, + logger_); request->set_identity(info_->identity); // request->set_certificate_authority(info_->identity.second->issuer->issuer); sendRequest(request); @@ -252,11 +263,17 @@ ServerAccountManager::authenticateAccount(const std::string& username, const std { const std::string url = managerHostname_ + JAMI_PATH_LOGIN; JAMI_WARN("[Auth] getting a device token: %s", url.c_str()); - auto request = std::make_shared<Request>(*Manager::instance().ioContext(), url, Json::Value{Json::objectValue}, [onAsync = onAsync_] (Json::Value json, const dht::http::Response& response){ - onAsync([=] (AccountManager& accountManager) { - static_cast<ServerAccountManager*>(&accountManager)->onAuthEnded(json, response, TokenScope::User); - }); - }, logger_); + auto request = std::make_shared<Request>( + *Manager::instance().ioContext(), + url, + Json::Value {Json::objectValue}, + [onAsync = onAsync_](Json::Value json, const dht::http::Response& response) { + onAsync([=](AccountManager& accountManager) { + static_cast<ServerAccountManager*>(&accountManager) + ->onAuthEnded(json, response, TokenScope::User); + }); + }, + logger_); request->set_auth(username, password); sendRequest(request); } @@ -354,7 +371,8 @@ ServerAccountManager::sendDeviceRequest(const std::shared_ptr<dht::http::Request } void -ServerAccountManager::sendAccountRequest(const std::shared_ptr<dht::http::Request>& req, const std::string& pwd) +ServerAccountManager::sendAccountRequest(const std::shared_ptr<dht::http::Request>& req, + const std::string& pwd) { std::lock_guard<std::mutex> lock(tokenLock_); if (hasAuthorization(TokenScope::User)) { @@ -463,26 +481,30 @@ ServerAccountManager::revokeDevice(const std::string& password, } const std::string url = managerHostname_ + PATH_DEVICE + "/" + device; JAMI_WARN("[Revoke] Revoking device of %s at %s", info_->username.c_str(), url.c_str()); - auto request = std::make_shared<Request>(*Manager::instance().ioContext(), url, [cb, onAsync = onAsync_] (Json::Value json, const dht::http::Response& response){ - onAsync([=] (AccountManager& accountManager) { - JAMI_DBG("[Revoke] Got request callback with status code=%u", response.status_code); - auto& this_ = *static_cast<ServerAccountManager*>(&accountManager); - if (response.status_code >= 200 && response.status_code < 300) { - try { - JAMI_WARN("[Revoke] Got server response"); - if (json["errorDetails"].empty()) { - if (cb) - cb(RevokeDeviceResult::SUCCESS); - this_.syncDevices(); + auto request = std::make_shared<Request>( + *Manager::instance().ioContext(), + url, + [cb, onAsync = onAsync_](Json::Value json, const dht::http::Response& response) { + onAsync([=](AccountManager& accountManager) { + JAMI_DBG("[Revoke] Got request callback with status code=%u", response.status_code); + auto& this_ = *static_cast<ServerAccountManager*>(&accountManager); + if (response.status_code >= 200 && response.status_code < 300) { + try { + JAMI_WARN("[Revoke] Got server response"); + if (json["errorDetails"].empty()) { + if (cb) + cb(RevokeDeviceResult::SUCCESS); + this_.syncDevices(); + } + } catch (const std::exception& e) { + JAMI_ERR("Error when loading device list: %s", e.what()); } - } catch (const std::exception& e) { - JAMI_ERR("Error when loading device list: %s", e.what()); - } - } else if (cb) - cb(RevokeDeviceResult::ERROR_NETWORK); - this_.clearRequest(response.request); - }); - }, logger_); + } else if (cb) + cb(RevokeDeviceResult::ERROR_NETWORK); + this_.clearRequest(response.request); + }); + }, + logger_); request->set_method(restinio::http_method_delete()); sendAccountRequest(request, password); return false;