From 703094c58e02c32576f9bffe85e63186bc347964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Tue, 10 Jan 2017 14:33:32 -0500 Subject: [PATCH] ringaccount: add trust request confirmation Send a DHT confirmation when a trust request is accepted. Requires to bump OpenDHT to make TRs a map. Change-Id: I056b32baed8371d693634f51d3328a17c0a3913e Tuleap: #1445 --- contrib/src/opendht/rules.mak | 2 +- src/ringdht/ringaccount.cpp | 41 +++++++++++++++++++++++++++-------- src/ringdht/ringaccount.h | 7 +++++- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/contrib/src/opendht/rules.mak b/contrib/src/opendht/rules.mak index c465663792..86489fcc81 100644 --- a/contrib/src/opendht/rules.mak +++ b/contrib/src/opendht/rules.mak @@ -1,5 +1,5 @@ # OPENDHT -OPENDHT_VERSION := e7295bac7b57540905e287a37904c615de971392 +OPENDHT_VERSION := 3fb7c2acfe098b18908d1803e5aaa2437d878af4 OPENDHT_URL := https://github.com/savoirfairelinux/opendht/archive/$(OPENDHT_VERSION).tar.gz PKGS += opendht diff --git a/src/ringdht/ringaccount.cpp b/src/ringdht/ringaccount.cpp index bf7800492e..0a4f6e64ab 100644 --- a/src/ringdht/ringaccount.cpp +++ b/src/ringdht/ringaccount.cpp @@ -2083,6 +2083,9 @@ RingAccount::doRegister_() // Contact exists, update confirmation status contact->second.confirmed = true; emitSignal<DRing::ConfigurationSignal::ContactAdded>(this_.getAccountID(), peer_account.toString(), true); + // Send confirmation + if (not v.confirm) + this_.sendTrustRequestConfirm(peer_account); this_.syncDevices(); } else { // Add trust request @@ -2759,13 +2762,14 @@ RingAccount::getContactHeader(pjsip_transport* t) /* contacts */ void -RingAccount::addContact(const std::string& uri) +RingAccount::addContact(const std::string& uri, bool confirmed) { dht::InfoHash h (uri); auto c = contacts_.find(h); if (c == contacts_.end()) c = contacts_.emplace(h, Contact{}).first; c->second.added = std::time(nullptr); + c->second.confirmed = confirmed or c->second.confirmed; trust_.setCertificateStatus(uri, tls::TrustStore::PermissionStatus::ALLOWED); saveContacts(); emitSignal<DRing::ConfigurationSignal::ContactAdded>(getAccountID(), uri, c->second.confirmed); @@ -2818,7 +2822,7 @@ RingAccount::updateContact(const dht::InfoHash& id, const Contact& contact) c->second.added = std::max(contact.added, c->second.added); c->second.removed = std::max(contact.removed, c->second.removed); if (contact.confirmed != c->second.confirmed) { - c->second.confirmed = std::max(contact.confirmed, c->second.confirmed); + c->second.confirmed = contact.confirmed or c->second.confirmed; emitSignal<DRing::ConfigurationSignal::ContactAdded>(getAccountID(), id.toString(), c->second.confirmed); } } @@ -2867,13 +2871,20 @@ RingAccount::acceptTrustRequest(const std::string& from) { dht::InfoHash f(from); auto i = trustRequests_.find(f); - if (i != trustRequests_.end()) { - addContact(from); - trustRequests_.erase(i); - saveTrustRequests(); - return true; - } - return false; + if (i == trustRequests_.end()) + return false; + + // The contact sent us a TR so we are in its contact list + addContact(from, true); + + // Clear trust request + auto treq = std::move(i->second); + trustRequests_.erase(i); + saveTrustRequests(); + + // Send confirmation + sendTrustRequestConfirm(f); + return true; } bool @@ -2901,6 +2912,18 @@ RingAccount::sendTrustRequest(const std::string& to, const std::vector<uint8_t>& }); } +void +RingAccount::sendTrustRequestConfirm(const dht::InfoHash& to) +{ + dht::TrustRequest answer {DHT_TYPE_NS}; + answer.confirm = true; + forEachDevice(to, [to,answer](const std::shared_ptr<RingAccount>& shared, const dht::InfoHash& dev) + { + RING_WARN("[Account %s] sending trust request reply: %s / %s", shared->getAccountID().c_str(), to.toString().c_str(), dev.toString().c_str()); + shared->dht_.putEncrypted(dht::InfoHash::get("inbox:"+dev.toString()), dev, answer); + }); +} + void RingAccount::saveTrustRequests() const { diff --git a/src/ringdht/ringaccount.h b/src/ringdht/ringaccount.h index 7eeb58cf87..84fccbd22c 100644 --- a/src/ringdht/ringaccount.h +++ b/src/ringdht/ringaccount.h @@ -291,11 +291,16 @@ class RingAccount : public SIPAccountBase { bool acceptTrustRequest(const std::string& from); bool discardTrustRequest(const std::string& from); - void addContact(const std::string& uri); + /** + * Add contact to the account contact list. + * Set confirmed if we know the contact also added us. + */ + void addContact(const std::string& uri, bool confirmed = false); void removeContact(const std::string& uri); std::vector<std::map<std::string, std::string>> getContacts() const; void sendTrustRequest(const std::string& to, const std::vector<uint8_t>& payload); + void sendTrustRequestConfirm(const dht::InfoHash& to); virtual void sendTextMessage(const std::string& to, const std::map<std::string, std::string>& payloads, uint64_t id) override; void addDevice(const std::string& password); -- GitLab