diff --git a/src/client/conversation_interface.cpp b/src/client/conversation_interface.cpp index ce751194c56f517e725813237f944a7ff97dee74..95ce7a68958652b9663586ea0021f02d1c475ed1 100644 --- a/src/client/conversation_interface.cpp +++ b/src/client/conversation_interface.cpp @@ -140,8 +140,14 @@ addConversationMember(const std::string& accountId, const std::string& contactUri) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule(true)) - convModule->addConversationMember(conversationId, contactUri); + if (auto convModule = acc->convModule(true)) { + dht::InfoHash h(contactUri); + if (not h) { + JAMI_ERROR("addConversationMember: invalid contact URI `{}`", contactUri); + return; + } + convModule->addConversationMember(conversationId, h); + } } void @@ -150,8 +156,14 @@ removeConversationMember(const std::string& accountId, const std::string& contactUri) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule(true)) - convModule->removeConversationMember(conversationId, contactUri); + if (auto convModule = acc->convModule(true)) { + dht::InfoHash h(contactUri); + if (not h) { + JAMI_ERROR("removeConversationMember: invalid contact URI `{}`", contactUri); + return; + } + convModule->removeConversationMember(conversationId, h); + } } std::vector<std::map<std::string, std::string>> diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp index d5582154ec968be9999072c87deb3863dbfffcf0..d389cf777a1b34aeb7edda35ae41236051546dfd 100644 --- a/src/jamidht/conversation_module.cpp +++ b/src/jamidht/conversation_module.cpp @@ -2596,7 +2596,7 @@ ConversationModule::fetchNewCommits(const std::string& peer, void ConversationModule::addConversationMember(const std::string& conversationId, - const std::string& contactUri, + const dht::InfoHash& contactUri, bool sendRequest) { auto conv = pimpl_->getConversation(conversationId); @@ -2606,19 +2606,20 @@ ConversationModule::addConversationMember(const std::string& conversationId, } std::unique_lock lk(conv->mtx); - if (conv->conversation->isMember(contactUri, true)) { - JAMI_DEBUG("{:s} is already a member of {:s}, resend invite", contactUri, conversationId); + auto contactUriStr = contactUri.toString(); + if (conv->conversation->isMember(contactUriStr, true)) { + JAMI_DEBUG("{:s} is already a member of {:s}, resend invite", contactUriStr, conversationId); // Note: This should not be necessary, but if for whatever reason the other side didn't // join we should not forbid new invites auto invite = conv->conversation->generateInvitation(); lk.unlock(); - pimpl_->sendMsgCb_(contactUri, {}, std::move(invite), 0); + pimpl_->sendMsgCb_(contactUriStr, {}, std::move(invite), 0); return; } conv->conversation->addMember( - contactUri, - [this, conv, conversationId, sendRequest, contactUri](bool ok, const std::string& commitId) { + contactUriStr, + [this, conv, conversationId, sendRequest, contactUriStr](bool ok, const std::string& commitId) { if (ok) { std::unique_lock lk(conv->mtx); pimpl_->sendMessageNotification(*conv->conversation, @@ -2627,7 +2628,7 @@ ConversationModule::addConversationMember(const std::string& conversationId, if (sendRequest) { auto invite = conv->conversation->generateInvitation(); lk.unlock(); - pimpl_->sendMsgCb_(contactUri, {}, std::move(invite), 0); + pimpl_->sendMsgCb_(contactUriStr, {}, std::move(invite), 0); } } }); @@ -2635,14 +2636,15 @@ ConversationModule::addConversationMember(const std::string& conversationId, void ConversationModule::removeConversationMember(const std::string& conversationId, - const std::string& contactUri, + const dht::InfoHash& contactUri, bool isDevice) { + auto contactUriStr = contactUri.toString(); if (auto conv = pimpl_->getConversation(conversationId)) { std::lock_guard lk(conv->mtx); if (conv->conversation) return conv->conversation->removeMember( - contactUri, isDevice, [this, conversationId](bool ok, const std::string& commitId) { + contactUriStr, isDevice, [this, conversationId](bool ok, const std::string& commitId) { if (ok) { pimpl_->sendMessageNotification(conversationId, true, commitId); } diff --git a/src/jamidht/conversation_module.h b/src/jamidht/conversation_module.h index bfbd9462b9320b5eee99edeae22b6184733ac49b..546590b8058d2eec19f4a882a46ce25fdc3e9f28 100644 --- a/src/jamidht/conversation_module.h +++ b/src/jamidht/conversation_module.h @@ -356,7 +356,7 @@ public: * @param sendRequest If we need to inform the peer (used for tests) */ void addConversationMember(const std::string& conversationId, - const std::string& contactUri, + const dht::InfoHash& contactUri, bool sendRequest = true); /** * Remove a member from a conversation (this will trigger a member event + new message on success) @@ -365,7 +365,7 @@ public: * @param isDevice */ void removeConversationMember(const std::string& conversationId, - const std::string& contactUri, + const dht::InfoHash& contactUri, bool isDevice = false); /** * Get members diff --git a/test/unitTest/conversation/conversation.cpp b/test/unitTest/conversation/conversation.cpp index a9a0baef78c5503c99033af561a7a5b3305c6b6f..d893aa75816dbd047886151f0321cb95e9e6b8c2 100644 --- a/test/unitTest/conversation/conversation.cpp +++ b/test/unitTest/conversation/conversation.cpp @@ -781,7 +781,7 @@ ConversationTest::testMergeTwoDifferentHeads() auto convId = libjami::startConversation(aliceId); auto msgSize = aliceData.messages.size(); - aliceAccount->convModule()->addConversationMember(convId, carlaUri, false); + aliceAccount->convModule()->addConversationMember(convId, dht::InfoHash(carlaUri), false); CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return aliceData.messages.size() == msgSize + 1; })); // Cp conversations & convInfo diff --git a/test/unitTest/conversation/conversationMembersEvent.cpp b/test/unitTest/conversation/conversationMembersEvent.cpp index 15405b532ec1b6dfde5b8b02bc713b177e5254d9..7865729c6a25a825dbd4430398daa2020876bda7 100644 --- a/test/unitTest/conversation/conversationMembersEvent.cpp +++ b/test/unitTest/conversation/conversationMembersEvent.cpp @@ -1105,7 +1105,7 @@ ConversationMembersEventTest::testMemberJoinsNoBadFile() auto convId = libjami::startConversation(aliceId); auto aliceMsgSize = aliceData.messages.size(); - aliceAccount->convModule()->addConversationMember(convId, carlaUri, false); + aliceAccount->convModule()->addConversationMember(convId, dht::InfoHash(carlaUri), false); CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&] { return aliceMsgSize + 1 == aliceData.messages.size(); })); // Cp conversations & convInfo @@ -1164,7 +1164,7 @@ ConversationMembersEventTest::testMemberAddedNoCertificate() auto convId = libjami::startConversation(aliceId); auto aliceMsgSize = aliceData.messages.size(); - aliceAccount->convModule()->addConversationMember(convId, carlaUri, false); + aliceAccount->convModule()->addConversationMember(convId, dht::InfoHash(carlaUri), false); CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&] { return aliceMsgSize + 1 == aliceData.messages.size(); })); // Cp conversations & convInfo @@ -1214,7 +1214,7 @@ ConversationMembersEventTest::testMemberJoinsInviteRemoved() auto convId = libjami::startConversation(aliceId); auto aliceMsgSize = aliceData.messages.size(); - aliceAccount->convModule()->addConversationMember(convId, carlaUri, false); + aliceAccount->convModule()->addConversationMember(convId, dht::InfoHash(carlaUri), false); CPPUNIT_ASSERT(cv.wait_for(lk, 5s, [&] { return aliceMsgSize + 1 == aliceData.messages.size(); })); // Cp conversations & convInfo