conversationrepository remove "<>" from display name

This should not appears in user.name as it will fail during
the signature creation.

Change-Id: I8bc04b9fdd60cb6c80fc267d064433ab331f6338
This commit is contained in:
Sébastien Blin
2023-01-04 16:39:25 -05:00
committed by Adrien Béraud
parent e4fa5074ca
commit 33e6ac4348
2 changed files with 88 additions and 12 deletions

View File

@ -42,6 +42,8 @@ constexpr size_t MAX_FETCH_SIZE {256 * 1024 * 1024}; // 256Mb
namespace jami {
static const std::regex regex_display_name("<|>");
inline std::string_view
as_view(const git_blob* blob)
{
@ -91,6 +93,16 @@ public:
return {std::move(repo), git_repository_free};
}
std::string getDisplayName() const {
auto shared = account_.lock();
if (!shared)
return {};
auto name = shared->getDisplayName();
if (name.empty())
name = std::string(shared->currentDeviceId());
return std::regex_replace(name, regex_display_name, "");
}
GitSignature signature();
bool mergeFastforward(const git_oid* target_oid, int is_unborn);
std::string createMergeCommit(git_index* index, const std::string& wanted_ref);
@ -471,6 +483,7 @@ initial_commit(GitRepository& repo,
auto name = account->getDisplayName();
if (name.empty())
name = deviceId;
name = std::regex_replace(name, regex_display_name, "");
git_signature* sig_ptr = nullptr;
git_index* index_ptr = nullptr;
@ -563,15 +576,13 @@ GitSignature
ConversationRepository::Impl::signature()
{
auto account = account_.lock();
if (!account)
auto name = getDisplayName();
if (!account || name.empty())
return {nullptr, git_signature_free};
auto deviceId = std::string(account->currentDeviceId());
auto name = account->getDisplayName();
if (name.empty())
name = deviceId;
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_ERR("Unable to create a commit signature.");
return {nullptr, git_signature_free};
@ -1636,15 +1647,13 @@ ConversationRepository::Impl::commit(const std::string& msg)
if (!validateDevice())
return {};
auto account = account_.lock();
if (!account)
auto name = getDisplayName();
if (!account || name.empty())
return {};
auto deviceId = std::string(account->currentDeviceId());
auto name = account->getDisplayName();
if (name.empty())
name = deviceId;
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_ERR("Unable to create a commit signature.");
return {};
@ -2816,9 +2825,9 @@ ConversationRepository::amend(const std::string& id, const std::string& msg)
if (!account)
return {};
auto deviceId = std::string(account->currentDeviceId());
auto name = account->getDisplayName();
auto name = pimpl_->getDisplayName();
if (name.empty())
name = deviceId;
return {};
git_signature* sig_ptr = nullptr;
git_oid tree_id, commit_id;

View File

@ -77,6 +77,7 @@ private:
void testGetConversationsAfterRm();
void testRemoveInvalidConversation();
void testSendMessage();
void testSendMessageWithBadDisplayName();
void testReplaceWithBadCertificate();
void testSendMessageTriggerMessageReceived();
void testMergeTwoDifferentHeads();
@ -125,6 +126,7 @@ private:
CPPUNIT_TEST(testGetConversationsAfterRm);
CPPUNIT_TEST(testRemoveInvalidConversation);
CPPUNIT_TEST(testSendMessage);
CPPUNIT_TEST(testSendMessageWithBadDisplayName);
CPPUNIT_TEST(testReplaceWithBadCertificate);
CPPUNIT_TEST(testSendMessageTriggerMessageReceived);
CPPUNIT_TEST(testMergeTwoDifferentHeads);
@ -387,6 +389,71 @@ ConversationTest::testSendMessage()
cv.wait_for(lk, 30s, [&]() { return messageBobReceived == 1; });
}
void
ConversationTest::testSendMessageWithBadDisplayName()
{
auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
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;
std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers;
auto messageBobReceived = 0, messageAliceReceived = 0;
bool requestReceived = false;
bool conversationReady = false;
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 == bobId) {
messageBobReceived += 1;
} else {
messageAliceReceived += 1;
}
cv.notify_one();
}));
confHandlers.insert(
libjami::exportable_callback<libjami::ConversationSignal::ConversationRequestReceived>(
[&](const std::string& /*accountId*/,
const std::string& /* conversationId */,
std::map<std::string, std::string> /*metadatas*/) {
requestReceived = true;
cv.notify_one();
}));
confHandlers.insert(libjami::exportable_callback<libjami::ConversationSignal::ConversationReady>(
[&](const std::string& accountId, const std::string& /* conversationId */) {
if (accountId == bobId) {
conversationReady = true;
cv.notify_one();
}
}));
libjami::registerSignalHandlers(confHandlers);
auto convId = libjami::startConversation(aliceId);
libjami::addConversationMember(aliceId, convId, bobUri);
CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return requestReceived; }));
libjami::acceptConversationRequest(bobId, convId);
CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return conversationReady; }));
// Assert that repository exists
auto repoPath = fileutils::get_data_dir() + DIR_SEPARATOR_STR + bobAccount->getAccountID()
+ DIR_SEPARATOR_STR + "conversations" + DIR_SEPARATOR_STR + convId;
CPPUNIT_ASSERT(fileutils::isDirectory(repoPath));
// Wait that alice sees Bob
cv.wait_for(lk, 30s, [&]() { return messageAliceReceived == 2; });
libjami::sendMessage(aliceId, convId, "hi"s, "");
cv.wait_for(lk, 30s, [&]() { return messageBobReceived == 1; });
}
void
ConversationTest::testReplaceWithBadCertificate()
{