From 1353a641fc064b39a3414ab0cd074dd0ebfcb54c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Mon, 19 Mar 2018 12:18:19 -0400
Subject: [PATCH] ringaccount: acceptTrustRequest(): check URI, always add
 contact

Change-Id: I6fcb702cedd6204b88ac9b6a6437a18a4728cc12
Reviewed-by: Sebastien Blin <sebastien.blin@savoirfairelinux.com>
---
 src/ringdht/ringaccount.cpp | 28 +++++++++++++++++++++-------
 src/ringdht/ringaccount.h   |  1 +
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/src/ringdht/ringaccount.cpp b/src/ringdht/ringaccount.cpp
index a3c786adb3..c5d1bd28b0 100644
--- a/src/ringdht/ringaccount.cpp
+++ b/src/ringdht/ringaccount.cpp
@@ -2880,12 +2880,18 @@ RingAccount::getContactHeader(pjsip_transport* t)
 void
 RingAccount::addContact(const std::string& uri, bool confirmed)
 {
-    RING_WARN("[Account %s] addContact: %s", getAccountID().c_str(), uri.c_str());
     dht::InfoHash h (uri);
     if (not h) {
         RING_ERR("[Account %s] addContact: invalid contact URI", getAccountID().c_str());
         return;
     }
+    addContact(h, confirmed);
+}
+
+void
+RingAccount::addContact(const dht::InfoHash& h, bool confirmed)
+{
+    RING_WARN("[Account %s] addContact: %s", getAccountID().c_str(), h.to_c_str());
     auto c = contacts_.find(h);
     if (c == contacts_.end())
         c = contacts_.emplace(h, Contact{}).first;
@@ -2893,9 +2899,10 @@ RingAccount::addContact(const std::string& uri, bool confirmed)
         return;
     c->second.added = std::time(nullptr);
     c->second.confirmed = confirmed or c->second.confirmed;
-    trust_.setCertificateStatus(uri, tls::TrustStore::PermissionStatus::ALLOWED);
+    auto hStr = h.toString();
+    trust_.setCertificateStatus(hStr, tls::TrustStore::PermissionStatus::ALLOWED);
     saveContacts();
-    emitSignal<DRing::ConfigurationSignal::ContactAdded>(getAccountID(), uri, c->second.confirmed);
+    emitSignal<DRing::ConfigurationSignal::ContactAdded>(getAccountID(), hStr, c->second.confirmed);
     syncDevices();
 }
 
@@ -3031,12 +3038,15 @@ bool
 RingAccount::acceptTrustRequest(const std::string& from)
 {
     dht::InfoHash f(from);
-    auto i = trustRequests_.find(f);
-    if (i == trustRequests_.end())
+    if (not f)
         return false;
 
     // The contact sent us a TR so we are in its contact list
-    addContact(from, true);
+    addContact(f, true);
+
+    auto i = trustRequests_.find(f);
+    if (i == trustRequests_.end())
+        return false;
 
     // Clear trust request
     auto treq = std::move(i->second);
@@ -3062,8 +3072,12 @@ RingAccount::discardTrustRequest(const std::string& from)
 void
 RingAccount::sendTrustRequest(const std::string& to, const std::vector<uint8_t>& payload)
 {
-    addContact(to);
     auto toH = dht::InfoHash(to);
+    if (not toH) {
+        RING_ERR("[Account %s] can't send trust request to invalid hash: %s", getAccountID().c_str(), to.c_str());
+        return;
+    }
+    addContact(toH);
     forEachDevice(toH, [toH,payload](const std::shared_ptr<RingAccount>& shared, const dht::InfoHash& dev)
     {
         RING_WARN("[Account %s] sending trust request to: %s / %s", shared->getAccountID().c_str(), toH.toString().c_str(), dev.toString().c_str());
diff --git a/src/ringdht/ringaccount.h b/src/ringdht/ringaccount.h
index b51fcae0de..455b97d29e 100644
--- a/src/ringdht/ringaccount.h
+++ b/src/ringdht/ringaccount.h
@@ -525,6 +525,7 @@ class RingAccount : public SIPAccountBase {
         void loadContacts();
         void saveContacts() const;
         void updateContact(const dht::InfoHash&, const Contact&);
+        void addContact(const dht::InfoHash&, bool confirmed = false);
 
         // Trust store with Ring account main certificate as the only CA
         dht::crypto::TrustList accountTrust_;
-- 
GitLab