diff --git a/src/jamidht/contact_list.cpp b/src/jamidht/contact_list.cpp index 0d37d28ea9a39b038f67df73aa353ca290710832..0f2d2d14847367b67ea69ef1f257ca8920bb3b34 100644 --- a/src/jamidht/contact_list.cpp +++ b/src/jamidht/contact_list.cpp @@ -385,7 +385,6 @@ ContactList::acceptTrustRequest(const dht::InfoHash& from) auto i = trustRequests_.find(from); if (i == trustRequests_.end()) return false; - addContact(from, true, i->second.conversationId); // Clear trust request trustRequests_.erase(i); diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp index 547eea4869d6113ad207607121252b9c2c9c31c0..623db0a95b9e41bd3e6bedd7a70e95b64579790f 100644 --- a/src/jamidht/conversation_module.cpp +++ b/src/jamidht/conversation_module.cpp @@ -59,7 +59,8 @@ public: SengMsgCb&& sendMsgCb, NeedSocketCb&& onNeedSocket, NeedSocketCb&& onNeedSwarmSocket, - UpdateConvReq&& updateConvReqCb); + UpdateConvReq&& updateConvReqCb, + OneToOneRecvCb&& oneToOneRecvCb); // Retrieving recent commits /** @@ -185,6 +186,7 @@ public: NeedSocketCb onNeedSocket_; NeedSocketCb onNeedSwarmSocket_; UpdateConvReq updateConvReqCb_; + OneToOneRecvCb oneToOneRecvCb_; std::string accountId_ {}; std::string deviceId_ {}; @@ -320,13 +322,15 @@ ConversationModule::Impl::Impl(std::weak_ptr<JamiAccount>&& account, SengMsgCb&& sendMsgCb, NeedSocketCb&& onNeedSocket, NeedSocketCb&& onNeedSwarmSocket, - UpdateConvReq&& updateConvReqCb) + UpdateConvReq&& updateConvReqCb, + OneToOneRecvCb&& oneToOneRecvCb) : account_(account) , needsSyncingCb_(needsSyncingCb) , sendMsgCb_(sendMsgCb) , onNeedSocket_(onNeedSocket) , onNeedSwarmSocket_(onNeedSwarmSocket) , updateConvReqCb_(updateConvReqCb) + , oneToOneRecvCb_(oneToOneRecvCb) { if (auto shared = account.lock()) { accountId_ = shared->getAccountID(); @@ -1093,13 +1097,15 @@ ConversationModule::ConversationModule(std::weak_ptr<JamiAccount>&& account, SengMsgCb&& sendMsgCb, NeedSocketCb&& onNeedSocket, NeedSocketCb&& onNeedSwarmSocket, - UpdateConvReq&& updateConvReqCb) + UpdateConvReq&& updateConvReqCb, + OneToOneRecvCb&& oneToOneRecvCb) : pimpl_ {std::make_unique<Impl>(std::move(account), std::move(needsSyncingCb), std::move(sendMsgCb), std::move(onNeedSocket), std::move(onNeedSwarmSocket), - std::move(updateConvReqCb))} + std::move(updateConvReqCb), + std::move(oneToOneRecvCb))} { loadConversations(); } @@ -1452,10 +1458,12 @@ ConversationModule::onConversationRequest(const std::string& from, const Json::V } req.received = std::time(nullptr); auto reqMap = req.toMap(); + auto isOneToOne = req.isOneToOne(); if (pimpl_->addConversationRequest(convId, std::move(req))) { // Note: no need to sync here because other connected devices should receive // the same conversation request. Will sync when the conversation will be added - + if (isOneToOne) + pimpl_->oneToOneRecvCb_(convId, from); emitSignal<libjami::ConversationSignal::ConversationRequestReceived>(pimpl_->accountId_, convId, reqMap); diff --git a/src/jamidht/conversation_module.h b/src/jamidht/conversation_module.h index dddedb6ac7f5cc459ec4534b0c22375877edeeab..eb54b33b88f477e24117be2b4881604c655d869f 100644 --- a/src/jamidht/conversation_module.h +++ b/src/jamidht/conversation_module.h @@ -54,6 +54,7 @@ using SengMsgCb = std::function< uint64_t(const std::string&, const DeviceId&, std::map<std::string, std::string>, uint64_t)>; using NeedsSyncingCb = std::function<void(std::shared_ptr<SyncMsg>&&)>; using UpdateConvReq = std::function<void(const std::string&, const std::string&, bool)>; +using OneToOneRecvCb = std::function<void(const std::string&, const std::string&)>; class ConversationModule { @@ -63,7 +64,8 @@ public: SengMsgCb&& sendMsgCb, NeedSocketCb&& onNeedSocket, NeedSocketCb&& onNeedSwarmSocket, - UpdateConvReq&& updateConvReqCb); + UpdateConvReq&& updateConvReqCb, + OneToOneRecvCb&& oneToOneRecvCb); ~ConversationModule() = default; /** diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp index fcbeb69e396b88ab23468593babab1ad5ea6737f..1fdf4a079442c0b9bde52571b342799f89b8b160 100644 --- a/src/jamidht/jamiaccount.cpp +++ b/src/jamidht/jamiaccount.cpp @@ -1128,9 +1128,8 @@ JamiAccount::loadAccount(const std::string& archive_password, // Here account can be initializing if (auto cm = shared->convModule()) { auto activeConv = cm->getOneToOneConversation(uri); - if (activeConv != conversationId) { + if (activeConv != conversationId) cm->onTrustRequest(uri, conversationId, payload, received); - } } } }); @@ -1150,6 +1149,7 @@ JamiAccount::loadAccount(const std::string& archive_password, // Note: Do not retrigger on another thread. This has to be done // at the same time of acceptTrustRequest a synced state between TrustRequest // and convRequests. + convModule()->acceptConversationRequest(conversationId); }, [this](const std::string& uri, const std::string& convFromReq) { @@ -2253,6 +2253,19 @@ JamiAccount::convModule() } else { updateConvForContact(contactUri, convId, ""); } + }, + [this](auto&& convId, auto&& from) { + accountManager_->findCertificate(dht::InfoHash(from), [this, from, convId](const std::shared_ptr<dht::crypto::Certificate>& cert) { + auto info = accountManager_->getInfo(); + if (!cert || !info) + return; + info->contacts->onTrustRequest(dht::InfoHash(from), + cert->getSharedPublicKey(), + time(nullptr), + false, + convId, + {}); + }); }); } return convModule_.get(); diff --git a/test/unitTest/conversation/conversationRequest.cpp b/test/unitTest/conversation/conversationRequest.cpp index 2c4f7511f35989f4997665098ea5840f38d938df..09b7fee5806bd3ef40b4f3efdd65bfcc78620169 100644 --- a/test/unitTest/conversation/conversationRequest.cpp +++ b/test/unitTest/conversation/conversationRequest.cpp @@ -76,7 +76,6 @@ public: void testCacheRequestFromClient(); void testNeedsSyncingWithForCloning(); void testRemoveContactRemoveTrustRequest(); - std::string aliceId; std::string bobId; std::string bob2Id; @@ -628,8 +627,10 @@ ConversationRequestTest::testInviteFromMessageAfterRemoved() libjami::sendMessage(aliceId, convId, "hi"s, ""); CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; })); conversationReady = false; + CPPUNIT_ASSERT(bobAccount->getContacts().size() == 0); libjami::acceptConversationRequest(bobId, convId); CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return conversationReady; })); + CPPUNIT_ASSERT(bobAccount->getContacts().size() == 1); } void