From 707b09532daba262615698afaa322b5da86eb39b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Thu, 30 Sep 2021 13:06:56 -0400 Subject: [PATCH] swarm: banContact should also remove conversation's requests Change-Id: Idbe771a647bf16b45d88755d684623895e5a8e82 --- src/jamidht/conversation_module.cpp | 18 +++++++ .../conversation/conversationRequest.cpp | 52 +++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp index 131dfe762e..da4957630d 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 f1d965fbad..c1eeb31cb2 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() { -- GitLab