diff --git a/src/call.cpp b/src/call.cpp index a0e037efdbba055367a3e4ccc6e5c957c77dc71b..7f41ddee31a22c2f450019a770f6fda36ba36e8a 100644 --- a/src/call.cpp +++ b/src/call.cpp @@ -123,8 +123,8 @@ Call::Call(const std::shared_ptr<Account>& account, // TODO: This will be removed when 1:1 swarm will have a conference. // For now, only commit for 1:1 calls if (toUsername().find('/') == std::string::npos && getCallType() == CallType::OUTGOING) { - jamiAccount->convModule()->addCallHistoryMessage(getPeerNumber(), - getCallDuration().count()); + if (auto cm = jamiAccount->convModule(true)) + cm->addCallHistoryMessage(getPeerNumber(), getCallDuration().count()); } monitor(); } diff --git a/src/client/conversation_interface.cpp b/src/client/conversation_interface.cpp index 840e54b90044867e3b2f4cca5dbb78bb17b40de8..ce751194c56f517e725813237f944a7ff97dee74 100644 --- a/src/client/conversation_interface.cpp +++ b/src/client/conversation_interface.cpp @@ -39,7 +39,7 @@ std::string startConversation(const std::string& accountId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->startConversation(); return {}; } @@ -48,7 +48,7 @@ void acceptConversationRequest(const std::string& accountId, const std::string& conversationId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) convModule->acceptConversationRequest(conversationId); } @@ -63,7 +63,7 @@ bool removeConversation(const std::string& accountId, const std::string& conversationId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->removeConversation(conversationId); return false; } @@ -72,7 +72,7 @@ std::vector<std::string> getConversations(const std::string& accountId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->getConversations(); return {}; } @@ -81,7 +81,7 @@ std::vector<std::map<std::string, std::string>> getActiveCalls(const std::string& accountId, const std::string& conversationId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->getActiveCalls(conversationId); return {}; } @@ -90,7 +90,7 @@ std::vector<std::map<std::string, std::string>> getConversationRequests(const std::string& accountId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->getConversationRequests(); return {}; } @@ -101,7 +101,7 @@ updateConversationInfos(const std::string& accountId, const std::map<std::string, std::string>& infos) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) convModule->updateConversationInfos(conversationId, infos); } @@ -109,7 +109,7 @@ std::map<std::string, std::string> conversationInfos(const std::string& accountId, const std::string& conversationId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->conversationInfos(conversationId); return {}; } @@ -120,7 +120,7 @@ setConversationPreferences(const std::string& accountId, const std::map<std::string, std::string>& prefs) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) convModule->setConversationPreferences(conversationId, prefs); } @@ -128,7 +128,7 @@ std::map<std::string, std::string> getConversationPreferences(const std::string& accountId, const std::string& conversationId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->getConversationPreferences(conversationId); return {}; } @@ -140,7 +140,7 @@ addConversationMember(const std::string& accountId, const std::string& contactUri) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) convModule->addConversationMember(conversationId, contactUri); } @@ -150,7 +150,7 @@ removeConversationMember(const std::string& accountId, const std::string& contactUri) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) convModule->removeConversationMember(conversationId, contactUri); } @@ -158,7 +158,7 @@ std::vector<std::map<std::string, std::string>> getConversationMembers(const std::string& accountId, const std::string& conversationId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->getConversationMembers(conversationId, true); return {}; } @@ -172,7 +172,7 @@ sendMessage(const std::string& accountId, const int32_t& flag) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) { + if (auto convModule = acc->convModule(true)) { if (flag == 0 /* Reply or simple commit */) { convModule->sendMessage(conversationId, message, commitId); } else if (flag == 1 /* message edition */) { @@ -190,7 +190,7 @@ loadConversationMessages(const std::string& accountId, size_t n) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->loadConversationMessages(conversationId, fromMessage, n); return 0; } @@ -202,7 +202,7 @@ loadConversation(const std::string& accountId, size_t n) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->loadConversation(conversationId, fromMessage, n); return 0; } @@ -214,7 +214,7 @@ loadConversationUntil(const std::string& accountId, const std::string& toMessage) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->loadConversationUntil(conversationId, fromMessage, toMessage); return 0; } @@ -226,7 +226,7 @@ loadSwarmUntil(const std::string& accountId, const std::string& toMessage) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->loadSwarmUntil(conversationId, fromMessage, toMessage); return 0; } @@ -239,7 +239,7 @@ countInteractions(const std::string& accountId, const std::string& authorUri) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->countInteractions(conversationId, toId, fromId, authorUri); return 0; } @@ -248,7 +248,7 @@ void clearCache(const std::string& accountId, const std::string& conversationId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) convModule->clearCache(conversationId); } @@ -271,7 +271,7 @@ searchConversation(const std::string& accountId, continue; if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accId)) { res = std::uniform_int_distribution<uint32_t>()(acc->rand); - if (auto convModule = acc->convModule()) { + if (auto convModule = acc->convModule(true)) { convModule->search(res, conversationId, filter); } } @@ -283,7 +283,7 @@ void reloadConversationsAndRequests(const std::string& accountId) { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) { - if (auto convModule = acc->convModule()) { + if (auto convModule = acc->convModule(true)) { convModule->reloadRequests(); convModule->loadConversations(); } diff --git a/src/client/datatransfer.cpp b/src/client/datatransfer.cpp index 7c5e285bb7e8555eb8e8b693949be538ff3be29e..a990ff01aa4e7562435edb4653aa9fefa03964bf 100644 --- a/src/client/datatransfer.cpp +++ b/src/client/datatransfer.cpp @@ -53,7 +53,7 @@ downloadFile(const std::string& accountId, const std::string& path) noexcept { if (auto acc = jami::Manager::instance().getAccount<jami::JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->downloadFile(conversationId, interactionId, fileId, path); return {}; } diff --git a/src/jamidht/conversation_channel_handler.cpp b/src/jamidht/conversation_channel_handler.cpp index 5da467fca0690dc53fb0986e3274a9ecbeae21bb..768e2b14d66457c9aa0fea5a98a7651873ca5611 100644 --- a/src/jamidht/conversation_channel_handler.cpp +++ b/src/jamidht/conversation_channel_handler.cpp @@ -55,7 +55,7 @@ ConversationChannelHandler::onRequest(const std::shared_ptr<dht::crypto::Certifi auto conversationId = name.substr(sep + 1); if (auto acc = account_.lock()) - if (auto convModule = acc->convModule()) { + if (auto convModule = acc->convModule(true)) { auto res = !convModule->isBanned(conversationId, cert->issuer->getId().toString()); res &= !convModule->isBanned(conversationId, cert->getLongId().toString()); return res; diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp index b74c9d9038045c74d7f49dc0343f5d1a037d92ce..daff87c09446254012f6b10cb397dc2746e08426 100644 --- a/src/jamidht/jamiaccount.cpp +++ b/src/jamidht/jamiaccount.cpp @@ -1983,6 +1983,7 @@ JamiAccount::doRegister_() } auto uri = Uri(name); + std::lock_guard lk(connManagerMtx_); auto itHandler = channelHandlers_.find(uri.scheme()); if (itHandler != channelHandlers_.end() && itHandler->second) return itHandler->second->onRequest(cert, name); @@ -2066,6 +2067,7 @@ JamiAccount::doRegister_() }); } else { // TODO move git:// + std::lock_guard lk(connManagerMtx_); auto uri = Uri(name); auto itHandler = channelHandlers_.find(uri.scheme()); if (itHandler != channelHandlers_.end() && itHandler->second) @@ -2135,8 +2137,10 @@ JamiAccount::doRegister_() } ConversationModule* -JamiAccount::convModule() +JamiAccount::convModule(bool noCreation) { + if (noCreation) + return convModule_.get(); if (!accountManager() || currentDeviceId() == "") { JAMI_ERR("[Account %s] Calling convModule() with an uninitialized account", getAccountID().c_str()); diff --git a/src/jamidht/jamiaccount.h b/src/jamidht/jamiaccount.h index 0e25fc6c20ddadfaa6592171f94953a5f2850b21..c145ba47d2fe6adbd93a382c96c72c7b4f2e4d21 100644 --- a/src/jamidht/jamiaccount.h +++ b/src/jamidht/jamiaccount.h @@ -498,7 +498,7 @@ public: */ std::shared_ptr<TransferManager> dataTransfer(const std::string& id = ""); - ConversationModule* convModule(); + ConversationModule* convModule(bool noCreation = false); SyncModule* syncModule(); /** diff --git a/src/jamidht/swarm/swarm_channel_handler.cpp b/src/jamidht/swarm/swarm_channel_handler.cpp index c1e1cc9284ba55249536143ed3f94199a46fac95..10d554eae04707895e990b31edebe3083b5c146f 100644 --- a/src/jamidht/swarm/swarm_channel_handler.cpp +++ b/src/jamidht/swarm/swarm_channel_handler.cpp @@ -56,7 +56,7 @@ SwarmChannelHandler::onRequest(const std::shared_ptr<dht::crypto::Certificate>& auto sep = name.find_last_of('/'); auto conversationId = name.substr(sep + 1); if (auto acc = account_.lock()) - if (auto convModule = acc->convModule()) { + if (auto convModule = acc->convModule(true)) { auto res = !convModule->isBanned(conversationId, cert->issuer->getId().toString()); res &= !convModule->isBanned(conversationId, cert->getLongId().toString()); return res; @@ -72,7 +72,7 @@ SwarmChannelHandler::onReady(const std::shared_ptr<dht::crypto::Certificate>&, auto sep = uri.find_last_of('/'); auto conversationId = uri.substr(sep + 1); if (auto acc = account_.lock()) { - if (auto convModule = acc->convModule()) { + if (auto convModule = acc->convModule(true)) { convModule->addSwarmChannel(conversationId, socket); } } diff --git a/src/jamidht/sync_module.cpp b/src/jamidht/sync_module.cpp index 952f92ef2e410ade85c74dcdb9158377e9041b10..7b9f94f3b478a5db7f6d20fba03773de559d90c6 100644 --- a/src/jamidht/sync_module.cpp +++ b/src/jamidht/sync_module.cpp @@ -106,7 +106,7 @@ SyncModule::Impl::syncInfos(const std::shared_ptr<dhtnet::ChannelSocket>& socket } } - auto convModule = acc->convModule(); + auto convModule = acc->convModule(true); if (!convModule) return; // Sync conversation's preferences @@ -201,7 +201,8 @@ SyncModule::cacheSyncConnection(std::shared_ptr<dhtnet::ChannelSocket>&& socket, manager->onSyncData(std::move(msg.ds), false); if (!msg.c.empty() || !msg.cr.empty() || !msg.p.empty() || !msg.ld.empty()) - acc->convModule()->onSyncData(msg, peerId, device.toString()); + if (auto cm = acc->convModule(true)) + cm->onSyncData(msg, peerId, device.toString()); } } catch (const std::exception& e) { JAMI_WARNING("[convInfo] error on sync: {:s}", e.what()); diff --git a/src/jamidht/transfer_channel_handler.cpp b/src/jamidht/transfer_channel_handler.cpp index a0cf62d6414e111dd79a88dbbc8a8cb96f59058b..187cccfd96f92edd1c6da820a1c01b4cb357729a 100644 --- a/src/jamidht/transfer_channel_handler.cpp +++ b/src/jamidht/transfer_channel_handler.cpp @@ -32,8 +32,8 @@ TransferChannelHandler::TransferChannelHandler(const std::shared_ptr<JamiAccount , account_(account) , connectionManager_(cm) { - auto acc = account_.lock(); - idPath_ = fileutils::get_data_dir() / acc->getAccountID(); + if (auto acc = account_.lock()) + idPath_ = fileutils::get_data_dir() / acc->getAccountID(); } TransferChannelHandler::~TransferChannelHandler() {} @@ -51,6 +51,9 @@ TransferChannelHandler::onRequest(const std::shared_ptr<dht::crypto::Certificate auto acc = account_.lock(); if (!acc || !cert || !cert->issuer) return false; + auto cm = acc->convModule(true); + if (!cm) + return false; auto uri = cert->issuer->getId().toString(); // Else, check if it's a profile or file in a conversation. auto idstr = std::string_view(name).substr(DATA_TRANSFER_SCHEME.size()); @@ -72,7 +75,7 @@ TransferChannelHandler::onRequest(const std::shared_ptr<dht::crypto::Certificate // Check if peer is member of the conversation if (fileId == fmt::format("{}.vcf", acc->getUsername()) || fileId == "profile.vcf") { // Or a member from the conversation - auto members = acc->convModule()->getConversationMembers(conversationId); + auto members = cm->getConversationMembers(conversationId); return std::find_if(members.begin(), members.end(), [&](auto m) { return m["uri"] == uri; }) != members.end(); } else if (fileHost == "profile") { @@ -80,7 +83,7 @@ TransferChannelHandler::onRequest(const std::shared_ptr<dht::crypto::Certificate return uri == acc->getUsername(); } - return acc->convModule()->onFileChannelRequest(conversationId, + return cm->onFileChannelRequest(conversationId, uri, std::string(fileId), acc->sha3SumVerify()); diff --git a/src/manager.cpp b/src/manager.cpp index 93f57329e5c8996a402c85eda9cd170aac89962e..4528d2df1d3555b3b247c5c212360023065938cb 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -567,8 +567,9 @@ Manager::ManagerPimpl::processRemainingParticipants(Conference& conf) return; if (auto acc = std::dynamic_pointer_cast<JamiAccount>(account)) - if (acc->convModule()->isHosting("", conf.getConfId())) - return; + if (auto cm = acc->convModule(true)) + if (cm->isHosting("", conf.getConfId())) + return; // Else go in 1:1 if (current_callId != conf.getConfId()) @@ -3235,7 +3236,7 @@ Manager::gitSocket(std::string_view accountId, std::string_view conversationId) { if (const auto acc = getAccount<JamiAccount>(accountId)) - if (auto convModule = acc->convModule()) + if (auto convModule = acc->convModule(true)) return convModule->gitSocket(deviceId, conversationId); return nullptr; }