diff --git a/src/im/message_engine.cpp b/src/im/message_engine.cpp index 3570216e22f6d58220a065640374ea72c7ef3f74..fc6eee034e804096bca6ecb5ba398c95d2c31e4c 100644 --- a/src/im/message_engine.cpp +++ b/src/im/message_engine.cpp @@ -83,9 +83,8 @@ MessageEngine::onPeerOnline(const std::string& peer, bool retryOnTimeout) void MessageEngine::retrySend(const std::string& peer, bool retryOnTimeout) { - if (account_.getRegistrationState() != RegistrationState::REGISTERED) { + if (account_.getRegistrationState() != RegistrationState::REGISTERED) return; - } struct PendingMsg { MessageToken token; diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp index 700ead4f289cf05a788a97525cdfaf37112cdcb0..0c592c89a54c1b940d6a46b29f72a12cd992b5f1 100644 --- a/src/jamidht/conversation_module.cpp +++ b/src/jamidht/conversation_module.cpp @@ -132,6 +132,15 @@ public: std::lock_guard<std::mutex> lk(conversationsMtx_); return conversations_.find(convId) != conversations_.end(); } + /** + * @return if a convId is an accepted conversation + */ + bool isAcceptedConversation(const std::string& convId) const + { + std::lock_guard<std::mutex> lk(conversationsMtx_); + auto itConv = convInfos_.find(convId); + return itConv != convInfos_.end() && !itConv->second.removed; + } void addConvInfo(const ConvInfo& info) { @@ -1145,15 +1154,11 @@ ConversationModule::onTrustRequest(const std::string& uri, "clone the old one"); return; } - { - std::lock_guard<std::mutex> lk(pimpl_->conversationsMtx_); - auto itConv = pimpl_->conversations_.find(conversationId); - if (itConv != pimpl_->conversations_.end()) { - JAMI_INFO("[Account %s] Received a request for a conversation " - "already handled. Ignore", - pimpl_->accountId_.c_str()); - return; - } + if (pimpl_->isAcceptedConversation(conversationId)) { + JAMI_INFO("[Account %s] Received a request for a conversation " + "already handled. Ignore", + pimpl_->accountId_.c_str()); + return; } if (pimpl_->getRequest(conversationId) != std::nullopt) { JAMI_INFO("[Account %s] Received a request for a conversation " @@ -1190,6 +1195,9 @@ ConversationModule::onConversationRequest(const std::string& from, const Json::V auto convId = req.conversationId; req.from = from; + // Already accepted request, do nothing + if (pimpl_->isAcceptedConversation(convId)) + return; if (pimpl_->getRequest(convId) != std::nullopt) { JAMI_INFO("[Account %s] Received a request for a conversation already existing. " "Ignore", @@ -1624,7 +1632,7 @@ ConversationModule::onSyncData(const SyncMsg& msg, } for (const auto& [convId, req] : msg.cr) { - if (pimpl_->isConversation(convId)) { + if (pimpl_->isAcceptedConversation(convId)) { // Already accepted request pimpl_->rmConversationRequest(convId); continue; diff --git a/test/unitTest/conversation/conversation.cpp b/test/unitTest/conversation/conversation.cpp index fd71d988d5d26d0a613438c80cbe4d55b89da4e6..6404157708ac3f4fd57ae27e0685a6faa6b0e05d 100644 --- a/test/unitTest/conversation/conversation.cpp +++ b/test/unitTest/conversation/conversation.cpp @@ -396,10 +396,6 @@ ConversationTest::testSendMessageWithBadDisplayName() auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId); auto bobUri = bobAccount->getUsername(); - std::map<std::string, std::string> details; - details[ConfProperties::DISPLAYNAME] = "<o>"; - libjami::setAccountDetails(aliceId, details); - std::mutex mtx; std::unique_lock<std::mutex> lk {mtx}; std::condition_variable cv; @@ -433,8 +429,24 @@ ConversationTest::testSendMessageWithBadDisplayName() cv.notify_one(); } })); + bool aliceRegistered = false; + confHandlers.insert( + libjami::exportable_callback<libjami::ConfigurationSignal::VolatileDetailsChanged>( + [&](const std::string&, const std::map<std::string, std::string>&) { + auto details = aliceAccount->getVolatileAccountDetails(); + auto daemonStatus = details[libjami::Account::ConfProperties::Registration::STATUS]; + if (daemonStatus == "REGISTERED") { + aliceRegistered = true; + cv.notify_one(); + } + })); libjami::registerSignalHandlers(confHandlers); + std::map<std::string, std::string> details; + details[ConfProperties::DISPLAYNAME] = "<o>"; + libjami::setAccountDetails(aliceId, details); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return aliceRegistered; })); + auto convId = libjami::startConversation(aliceId); libjami::addConversationMember(aliceId, convId, bobUri);