jamiaccount: remove too big payload for request

Because the encoded avatar can be greater than 64k, a SIP message
will fail, and the trust request may not be sent.

https: //git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1491
https: //git.jami.net/savoirfairelinux/jami-client-android/-/issues/1537
Change-Id: Ieba2db521a3c7e72890be75d3578f93e496dc968
This commit is contained in:
Sébastien Blin
2024-01-09 15:11:15 -05:00
parent 6665114f65
commit 7509382335
3 changed files with 31 additions and 4 deletions

View File

@ -1772,6 +1772,10 @@ Conversation::generateInvitation() const
Json::Value root;
auto& metadata = root[ConversationMapKeys::METADATAS];
for (const auto& [k, v] : infos()) {
if (v.size() >= 64000) {
JAMI_WARNING("Cutting invite because the SIP message will be too long");
continue;
}
metadata[k] = v;
}
root[ConversationMapKeys::CONVERSATIONID] = id();

View File

@ -1742,7 +1742,7 @@ JamiAccount::onTrackedBuddyOnline(const dht::InfoHash& contactId)
} catch (...) {
}
if (payload.size() > 64000) {
if (payload.size() >= 64000) {
JAMI_WARN() << "Trust request is too big, reset payload";
payload.clear();
}
@ -2978,8 +2978,8 @@ JamiAccount::sendTrustRequest(const std::string& to, const std::vector<uint8_t>&
req.write(reinterpret_cast<const char*>(payload.data()), payload.size());
}
if (payload.size() > 64000) {
JAMI_WARN() << "Trust request is too big";
if (payload.size() >= 64000) {
JAMI_WARN() << "Trust request is too big. Remove payload";
}
auto conversation = convModule()->getOneToOneConversation(to);
@ -2988,7 +2988,7 @@ JamiAccount::sendTrustRequest(const std::string& to, const std::vector<uint8_t>&
if (not conversation.empty()) {
std::lock_guard lock(configurationMutex_);
if (accountManager_)
accountManager_->sendTrustRequest(to, conversation, payload);
accountManager_->sendTrustRequest(to, conversation, payload.size() >= 64000 ? std::vector<uint8_t> {} : payload);
else
JAMI_WARN("[Account %s] sendTrustRequest: account not loaded", getAccountID().c_str());
} else

View File

@ -93,6 +93,7 @@ public:
void testNeedsSyncingWithForCloning();
void testRemoveContactRemoveTrustRequest();
void testAddConversationNoPresenceThenConnects();
void testRequestBigPayload();
std::string aliceId;
UserData aliceData;
std::string bobId;
@ -133,6 +134,7 @@ private:
CPPUNIT_TEST(testNeedsSyncingWithForCloning);
CPPUNIT_TEST(testRemoveContactRemoveTrustRequest);
CPPUNIT_TEST(testAddConversationNoPresenceThenConnects);
CPPUNIT_TEST(testRequestBigPayload);
CPPUNIT_TEST_SUITE_END();
};
@ -1083,6 +1085,27 @@ ConversationRequestTest::testAddConversationNoPresenceThenConnects()
CPPUNIT_ASSERT(carlaDetails["conversationId"] == aliceDetails["conversationId"] && carlaDetails["conversationId"] == convId);
}
void
ConversationRequestTest::testRequestBigPayload()
{
connectSignals();
auto aliceAccount = Manager::instance().getAccount<JamiAccount>(aliceId);
auto bobAccount = Manager::instance().getAccount<JamiAccount>(bobId);
auto bobUri = bobAccount->getUsername();
aliceAccount->addContact(bobUri);
auto data = std::string(64000, 'A');
std::vector<uint8_t> payload(data.begin(), data.end());
aliceAccount->sendTrustRequest(bobUri, payload);
CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return bobData.requestReceived; }));
CPPUNIT_ASSERT(bobAccount->getTrustRequests().size() == 1);
libjami::acceptConversationRequest(bobId, aliceData.conversationId);
CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return !bobData.conversationId.empty(); }));
CPPUNIT_ASSERT(bobAccount->getTrustRequests().size() == 0);
}
} // namespace test
} // namespace jami