diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp index ee88f768087b16ef62f049e1c5bf4eea0f83e86f..d415373ffc4ba80126084b0e763329105e075a46 100644 --- a/src/jamidht/conversationrepository.cpp +++ b/src/jamidht/conversationrepository.cpp @@ -521,9 +521,9 @@ add_initial_files(GitRepository& repo, */ std::string initial_commit(GitRepository& repo, - const std::shared_ptr<JamiAccount>& account, - ConversationMode mode, - const std::string& otherMember = "") + const std::shared_ptr<JamiAccount>& account, + ConversationMode mode, + const std::string& otherMember = "") { auto deviceId = std::string(account->currentDeviceId()); auto name = account->getDisplayName(); @@ -538,8 +538,10 @@ initial_commit(GitRepository& repo, // Sign commit's buffer if (git_signature_new(&sig_ptr, name.c_str(), deviceId.c_str(), std::time(nullptr), 0) < 0) { - JAMI_ERROR("Unable to create a commit signature."); - return {}; + if (git_signature_new(&sig_ptr, deviceId.c_str(), deviceId.c_str(), std::time(nullptr), 0) < 0) { + JAMI_ERROR("Unable to create a commit signature."); + return {}; + } } GitSignature sig {sig_ptr, git_signature_free}; @@ -630,8 +632,11 @@ ConversationRepository::Impl::signature() // Sign commit's buffer auto deviceId = std::string(account->currentDeviceId()); if (git_signature_new(&sig_ptr, name.c_str(), deviceId.c_str(), std::time(nullptr), 0) < 0) { - JAMI_ERROR("Unable to create a commit signature."); - return {nullptr, git_signature_free}; + // Maybe the display name is invalid (like " ") - try without + if (git_signature_new(&sig_ptr, deviceId.c_str(), deviceId.c_str(), std::time(nullptr), 0) < 0) { + JAMI_ERROR("Unable to create a commit signature."); + return {nullptr, git_signature_free}; + } } return {sig_ptr, git_signature_free}; } @@ -1745,19 +1750,10 @@ ConversationRepository::Impl::commit(const std::string& msg, bool verifyDevice) { if (verifyDevice && !validateDevice()) return {}; - auto account = account_.lock(); - auto name = getDisplayName(); - if (!account || name.empty()) - return {}; - - git_signature* sig_ptr = nullptr; - // Sign commit's buffer - auto deviceId = std::string(account->currentDeviceId()); - if (git_signature_new(&sig_ptr, name.c_str(), deviceId.c_str(), std::time(nullptr), 0) < 0) { - JAMI_ERROR("Unable to create a commit signature."); + GitSignature sig = signature(); + if (!sig) return {}; - } - GitSignature sig {sig_ptr, git_signature_free}; + auto account = account_.lock(); // Retrieve current index git_index* index_ptr = nullptr; @@ -2934,24 +2930,12 @@ ConversationRepository::addMember(const std::string& uri) std::string ConversationRepository::amend(const std::string& id, const std::string& msg) { - auto account = pimpl_->account_.lock(); - if (!account) - return {}; - auto deviceId = std::string(account->currentDeviceId()); - auto name = pimpl_->getDisplayName(); - if (name.empty()) + GitSignature sig = pimpl_->signature(); + if (!sig) return {}; + auto account = pimpl_->account_.lock(); - git_signature* sig_ptr = nullptr; git_oid tree_id, commit_id; - - // Sign commit's buffer - if (git_signature_new(&sig_ptr, name.c_str(), deviceId.c_str(), std::time(nullptr), 0) < 0) { - JAMI_ERROR("Unable to create a commit signature."); - return {}; - } - GitSignature sig {sig_ptr, git_signature_free}; - git_commit* commit_ptr = nullptr; auto repo = pimpl_->repository(); if (!repo || git_oid_fromstr(&tree_id, id.c_str()) < 0 diff --git a/test/unitTest/conversation/conversation.cpp b/test/unitTest/conversation/conversation.cpp index 5df1ff206b75cc8dd60a202e4459106c38c8faec..8630f17ac5e7d3faf7e6bf9c41ce63356d69de09 100644 --- a/test/unitTest/conversation/conversation.cpp +++ b/test/unitTest/conversation/conversation.cpp @@ -78,6 +78,7 @@ public: private: void testCreateConversation(); + void testCreateConversationInvalidDisplayName(); void testGetConversation(); void testGetConversationsAfterRm(); void testRemoveInvalidConversation(); @@ -131,6 +132,7 @@ private: CPPUNIT_TEST_SUITE(ConversationTest); CPPUNIT_TEST(testCreateConversation); + CPPUNIT_TEST(testCreateConversationInvalidDisplayName); CPPUNIT_TEST(testGetConversation); CPPUNIT_TEST(testGetConversationsAfterRm); CPPUNIT_TEST(testRemoveInvalidConversation); @@ -271,6 +273,59 @@ ConversationTest::testCreateConversation() CPPUNIT_ASSERT(deviceCrtStr == deviceCert); } +void +ConversationTest::testCreateConversationInvalidDisplayName() +{ + std::cout << "\nRunning test: " << __func__ << std::endl; + + auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId); + + std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers; + bool conversationReady = false; + confHandlers.insert(libjami::exportable_callback<libjami::ConversationSignal::ConversationReady>( + [&](const std::string& accountId, const std::string& /* conversationId */) { + if (accountId == aliceId) { + conversationReady = true; + 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(); + } + })); + auto messageAliceReceived = 0; + confHandlers.insert(libjami::exportable_callback<libjami::ConversationSignal::MessageReceived>( + [&](const std::string& accountId, + const std::string& /* conversationId */, + std::map<std::string, std::string> /*message*/) { + if (accountId == aliceId) { + messageAliceReceived += 1; + } + cv.notify_one(); + })); + libjami::registerSignalHandlers(confHandlers); + + + std::map<std::string, std::string> details; + details[ConfProperties::DISPLAYNAME] = " "; + libjami::setAccountDetails(aliceId, details); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return aliceRegistered; })); + + // Start conversation + auto convId = libjami::startConversation(aliceId); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return conversationReady; })); + messageAliceReceived = 0; + libjami::sendMessage(aliceId, convId, "hi"s, ""); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return messageAliceReceived == 1; })); +} + void ConversationTest::testGetConversation() {