diff --git a/contrib/src/opendht/rules.mak b/contrib/src/opendht/rules.mak index c46566379271cdb75b07685362f6d4c394086ef3..86489fcc81855197c1e6c083cce5c5d05258f1a4 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 bf7800492eb7ee9022c4c252585a9c9b7c3909d7..0a4f6e64ab783bbd97bbba5dc5a89ec12220e4e4 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 7eeb58cf8721e16978aeb1d24f61461b961bfffe..84fccbd22c53b221df701acd95f560766e3da28e 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);