diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp index 131dfe762e777d098a0c85ff5d507a9ab88232fe..da4957630d3243f76af5fae6c321922ce39f7c14 100644 --- a/src/jamidht/conversation_module.cpp +++ b/src/jamidht/conversation_module.cpp @@ -1432,6 +1432,24 @@ ConversationModule::isBannedDevice(const std::string& convId, const std::string& void ConversationModule::removeContact(const std::string& uri, bool) { + // Remove linked conversation's requests + { + std::lock_guard<std::mutex> lk(pimpl_->conversationsRequestsMtx_); + auto update = false; + auto it = pimpl_->conversationsRequests_.begin(); + while (it != pimpl_->conversationsRequests_.end()) { + if (it->second.from == uri) { + emitSignal<DRing::ConversationSignal::ConversationRequestDeclined>(pimpl_->accountId_, + it->first); + update = true; + it = pimpl_->conversationsRequests_.erase(it); + } else { + ++it; + } + } + if (update) + pimpl_->saveConvRequests(); + } // Remove related conversation auto isSelf = uri == pimpl_->username_; std::vector<std::string> toRm; diff --git a/test/unitTest/conversation/conversationRequest.cpp b/test/unitTest/conversation/conversationRequest.cpp index f1d965fbad9d84bd83e7030b279cd2f6d41226eb..c1eeb31cb27a047313a17240255979193e510585 100644 --- a/test/unitTest/conversation/conversationRequest.cpp +++ b/test/unitTest/conversation/conversationRequest.cpp @@ -63,6 +63,7 @@ public: void testRemoveContact(); void testRemoveConversationUpdateContactDetails(); void testBanContact(); + void testBanContactRemoveTrustRequest(); void testAddOfflineContactThenConnect(); void testDeclineTrustRequestDoNotGenerateAnother(); void testRemoveContactRemoveSyncing(); @@ -87,6 +88,7 @@ private: CPPUNIT_TEST(testRemoveContact); CPPUNIT_TEST(testRemoveConversationUpdateContactDetails); CPPUNIT_TEST(testBanContact); + CPPUNIT_TEST(testBanContactRemoveTrustRequest); CPPUNIT_TEST(testAddOfflineContactThenConnect); CPPUNIT_TEST(testDeclineTrustRequestDoNotGenerateAnother); CPPUNIT_TEST(testRemoveContactRemoveSyncing); @@ -695,6 +697,56 @@ ConversationRequestTest::testBanContact() CPPUNIT_ASSERT(!fileutils::isDirectory(repoPath)); } +void +ConversationRequestTest::testBanContactRemoveTrustRequest() +{ + auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); + auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); + auto bobUri = bobAccount->getUsername(); + auto aliceUri = aliceAccount->getUsername(); + std::mutex mtx; + std::unique_lock<std::mutex> lk {mtx}; + std::condition_variable cv; + std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers; + bool conversationReady = false, requestReceived = false, requestDeclined = true; + std::string convId = ""; + confHandlers.insert(DRing::exportable_callback<DRing::ConfigurationSignal::IncomingTrustRequest>( + [&](const std::string& account_id, + const std::string& /*from*/, + const std::string& /*conversationId*/, + const std::vector<uint8_t>& /*payload*/, + time_t /*received*/) { + if (account_id == bobId) + requestReceived = true; + cv.notify_one(); + })); + confHandlers.insert(DRing::exportable_callback<DRing::ConversationSignal::ConversationReady>( + [&](const std::string& accountId, const std::string& conversationId) { + if (accountId == aliceId) { + convId = conversationId; + } else if (accountId == bobId) { + conversationReady = true; + } + cv.notify_one(); + })); + confHandlers.insert( + DRing::exportable_callback<DRing::ConversationSignal::ConversationRequestDeclined>( + [&](const std::string& accountId, const std::string& conversationId) { + if (accountId == bobId) + requestDeclined = true; + cv.notify_one(); + })); + DRing::registerSignalHandlers(confHandlers); + aliceAccount->addContact(bobUri); + aliceAccount->sendTrustRequest(bobUri, {}); + // Check created files + CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(30), [&]() { return requestReceived; })); + bobAccount->removeContact(aliceUri, true); + CPPUNIT_ASSERT(cv.wait_for(lk, std::chrono::seconds(5), [&]() { return requestDeclined; })); + auto requests = DRing::getConversationRequests(bobId); + CPPUNIT_ASSERT(requests.size() == 0); +} + void ConversationRequestTest::testAddOfflineContactThenConnect() {