diff --git a/coreapi/chat.c b/coreapi/chat.c index df2c5a0fb..933909121 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -466,7 +466,7 @@ void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatMessage } linphone_chat_room_delete_composing_idle_timer(cr); linphone_chat_room_delete_composing_refresh_timer(cr); - + if (call && call->op == op) { /*In this case, chat delivery status is not notified, so unrefing chat message right now*/ /*Might be better fixed by delivering status, but too costly for now*/ @@ -475,7 +475,7 @@ void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatMessage linphone_chat_message_unref(msg); return; } - + } // if operation failed, we should not change message state diff --git a/coreapi/chat_file_transfer.c b/coreapi/chat_file_transfer.c index 2351aa59c..9a5782cea 100644 --- a/coreapi/chat_file_transfer.c +++ b/coreapi/chat_file_transfer.c @@ -49,27 +49,30 @@ static void _release_http_request(LinphoneChatMessage* msg) { static void linphone_chat_message_process_io_error_upload(void *data, const belle_sip_io_error_event_t *event) { LinphoneChatMessage *msg = (LinphoneChatMessage *)data; ms_error("I/O Error during file upload of msg [%p]", msg); - linphone_chat_message_set_state(msg, LinphoneChatMessageStateNotDelivered); + linphone_chat_message_update_state(msg, LinphoneChatMessageStateNotDelivered); _release_http_request(msg); + linphone_chat_message_unref(msg); } static void linphone_chat_message_process_auth_requested_upload(void *data, belle_sip_auth_event_t *event) { LinphoneChatMessage *msg = (LinphoneChatMessage *)data; ms_error("Error during file upload: auth requested for msg [%p]", msg); - linphone_chat_message_set_state(msg, LinphoneChatMessageStateNotDelivered); + linphone_chat_message_update_state(msg, LinphoneChatMessageStateNotDelivered); _release_http_request(msg); + linphone_chat_message_unref(msg); } static void linphone_chat_message_process_io_error_download(void *data, const belle_sip_io_error_event_t *event) { LinphoneChatMessage *msg = (LinphoneChatMessage *)data; ms_error("I/O Error during file download msg [%p]", msg); - linphone_chat_message_set_state(msg, LinphoneChatMessageStateFileTransferError); + linphone_chat_message_update_state(msg, LinphoneChatMessageStateFileTransferError); _release_http_request(msg); } + static void linphone_chat_message_process_auth_requested_download(void *data, belle_sip_auth_event_t *event) { LinphoneChatMessage *msg = (LinphoneChatMessage *)data; ms_error("Error during file download : auth requested for msg [%p]", msg); - linphone_chat_message_set_state(msg, LinphoneChatMessageStateFileTransferError); + linphone_chat_message_update_state(msg, LinphoneChatMessageStateFileTransferError); _release_http_request(msg); } @@ -577,6 +580,10 @@ void linphone_chat_message_cancel_file_transfer(LinphoneChatMessage *msg) { , msg , msg->chat_room); belle_http_provider_cancel_request(msg->chat_room->lc->http_provider, msg->http_request); + if (msg->dir == LinphoneChatMessageOutgoing) { + // must release it + linphone_chat_message_unref(msg); + } } else { ms_message("Warning: http request still running for ORPHAN msg [%p]: this is a memory leak", msg); } diff --git a/oRTP b/oRTP index e7ae3587d..e3ed91f49 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit e7ae3587d3b7638a59c0929b332a50b78d84aa1c +Subproject commit e3ed91f4937ba972046ac084c0c856cafaa0b4d3 diff --git a/tester/liblinphone_tester.c b/tester/liblinphone_tester.c index 45f91fbed..da778a50d 100644 --- a/tester/liblinphone_tester.c +++ b/tester/liblinphone_tester.c @@ -229,7 +229,7 @@ int main (int argc, char *argv[]) #endif liblinphone_tester_init(NULL); - linphone_core_set_log_level(ORTP_FATAL); + linphone_core_set_log_level(ORTP_ERROR); for(i = 1; i < argc; ++i) { if (strcmp(argv[i], "--verbose") == 0) { diff --git a/tester/message_tester.c b/tester/message_tester.c index 6f535ee9b..6d5dcd99c 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -634,23 +634,23 @@ static void file_transfer_2_messages_simultaneously(void) { } ms_error("%s", buf); } - + cbs = linphone_chat_message_get_callbacks(msg); linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_received); linphone_chat_message_download_file(msg); - + cbs = linphone_chat_message_get_callbacks(msg2); linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_received); linphone_chat_message_download_file(msg2); - + BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,2)); - + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,4, int, "%d"); BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,2, int, "%d"); compare_files(send_filepath, receive_filepath); - + linphone_chat_message_unref(msg); } } @@ -986,10 +986,10 @@ static void lime_unit(void) { uint8_t receiverZID[12]; xmlDocPtr cacheBuffer; FILE *CACHE; - + /**** Low level tests using on cache file to extract keys, encrypt/decrypt ****/ /**** use functions that are not directly used by external entities ****/ - + /* create and load cache file */ CACHE = fopen_from_write_dir("ZIDCache.xml", "wb"); fprintf (CACHE, "\nef7692d0792a67491ae2d44e005dbe0399643d953a2202dd9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899pipo1@pipo.com963c57bb28e62068d2df23e8f9b771932d3c57bb28e62068d2df23e8f9b7719305d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b771935f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719302ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b7719300000069000001e8011234567889643d953a2202ee9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899pipo1@pipo.com123456789012345678901234567890123456765431262068d2df23e8f9b7719325d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719322ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b77193000000010000000001"); @@ -1001,7 +1001,7 @@ static void lime_unit(void) { /* parse it to an xmlDoc */ cacheBuffer = xmlParseDoc(cacheBufferString); ms_free(cacheBufferString); - + /* get data from cache : sender */ associatedKeys.peerURI = (uint8_t *)malloc(15); memcpy(associatedKeys.peerURI, "pipo1@pipo.com", 15); @@ -1010,14 +1010,14 @@ static void lime_unit(void) { BC_ASSERT_EQUAL(retval, 0, int, "%d"); BC_ASSERT_EQUAL(associatedKeys.associatedZIDNumber, 2, int, "%d"); /* there are 2 keys associated to pipo1@pipo.com address in the cache above*/ ms_message("Get cached key by URI, for sender, return %d keys", associatedKeys.associatedZIDNumber); - + for (i=0; ipeerZID, 12); printHex("key", associatedKeys.peerKeys[i]->key, 32); printHex("sessionID", associatedKeys.peerKeys[i]->sessionId, 32); ms_message("session index %d\n", associatedKeys.peerKeys[i]->sessionIndex); } - + /* get data from cache : receiver */ memcpy(associatedKey.peerZID, targetZID, 12); retval = lime_getCachedRcvKeyByZid(cacheBuffer, &associatedKey); @@ -1026,7 +1026,7 @@ static void lime_unit(void) { printHex("Key", associatedKey.key, 32); printHex("sessionID", associatedKey.sessionId, 32); ms_message("session index %d\n", associatedKey.sessionIndex); - + /* encrypt/decrypt a msg */ lime_encryptMessage(associatedKeys.peerKeys[0], (uint8_t *)PLAIN_TEXT_TEST_MESSAGE, (uint32_t)strlen(PLAIN_TEXT_TEST_MESSAGE), senderZID, encryptedMessage); printHex("Ciphered", encryptedMessage, strlen((char *)encryptedMessage)); @@ -1037,24 +1037,24 @@ static void lime_unit(void) { BC_ASSERT_EQUAL(retval, 0, int, "%d"); BC_ASSERT_STRING_EQUAL((char *)plainMessage, (char *)PLAIN_TEXT_TEST_MESSAGE); ms_message("Decrypt and auth returned %d\nPlain text is %s\n", retval, plainMessage); - + /* update receiver data */ associatedKey.sessionIndex++; associatedKey.key[0]++; associatedKey.sessionId[0]++; retval = lime_setCachedKey(cacheBuffer, &associatedKey, LIME_RECEIVER); BC_ASSERT_EQUAL(retval, 0, int, "%d"); - + /* update sender data */ associatedKeys.peerKeys[0]->sessionIndex++; associatedKeys.peerKeys[0]->key[0]++; associatedKeys.peerKeys[0]->sessionId[0]++; retval = lime_setCachedKey(cacheBuffer, associatedKeys.peerKeys[0], LIME_SENDER); BC_ASSERT_EQUAL(retval, 0, int, "%d"); - + /* free memory */ lime_freeKeys(&associatedKeys); - + /* write the file */ /* dump the xml document into a string */ xmlDocDumpFormatMemoryEnc(cacheBuffer, &xmlStringOutput, &xmlStringLength, "UTF-8", 0); @@ -1064,7 +1064,7 @@ static void lime_unit(void) { xmlFree(xmlStringOutput); fclose(CACHE); xmlFreeDoc(cacheBuffer); - + /**** Higher level tests using 2 caches to encrypt/decrypt a msg ****/ /* Create Alice cache file and then load it */ CACHE = fopen_from_write_dir("ZIDCacheAlice.xml", "wb"); @@ -1077,7 +1077,7 @@ static void lime_unit(void) { /* parse it to an xmlDoc */ cacheBufferAlice = xmlParseDoc(cacheBufferString); ms_free(cacheBufferString); - + /* Create Bob cache file and then load it */ CACHE = fopen_from_write_dir("ZIDCacheBob.xml", "wb"); fprintf(CACHE, "\n005dbe0399643d953a2202ddef7692d0792a67491ae2d44e9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899sip:marie@sip.example.org9111ebeb52e50edcc6fcb3eea1a2d3ae3c2c75d3668923e83c59d0f47245515060f020a3fe11dc2cc0e1e8ed9341b4cd14944db806ca4fc95456bbe45d95c43a5f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193bcffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b7719300000080000001cf011234567889643d953a2202ee9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899sip:marie@sip.example.org81e6e6362c34dc974263d1f77cbb9a8d6d6a718330994379099a8fa19fb12faa25d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b7719322ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b771930000002e0000000001"); @@ -1089,20 +1089,20 @@ static void lime_unit(void) { /* parse it to an xmlDoc */ cacheBufferBob = xmlParseDoc(cacheBufferString); ms_free(cacheBufferString); - - - + + + /* encrypt a msg */ retval = lime_createMultipartMessage(cacheBufferAlice, (uint8_t *)PLAIN_TEXT_TEST_MESSAGE, (uint8_t *)"sip:pauline@sip.example.org", &multipartMessage); - + BC_ASSERT_EQUAL(retval, 0, int, "%d"); if (retval == 0) { ms_message("Encrypted msg created is %s", multipartMessage); } - + /* decrypt the multipart msg */ retval = lime_decryptMultipartMessage(cacheBufferBob, multipartMessage, &decryptedMessage); - + BC_ASSERT_EQUAL(retval, 0, int, "%d"); if (retval == 0) { BC_ASSERT_STRING_EQUAL((char *)decryptedMessage, (char *)PLAIN_TEXT_TEST_MESSAGE); @@ -1110,7 +1110,7 @@ static void lime_unit(void) { } free(multipartMessage); free(decryptedMessage); - + /* update ZID files */ /* dump the xml document into a string */ xmlDocDumpFormatMemoryEnc(cacheBufferAlice, &xmlStringOutput, &xmlStringLength, "UTF-8", 0); @@ -1119,15 +1119,15 @@ static void lime_unit(void) { fwrite(xmlStringOutput, 1, xmlStringLength, CACHE); xmlFree(xmlStringOutput); fclose(CACHE); - + xmlDocDumpFormatMemoryEnc(cacheBufferBob, &xmlStringOutput, &xmlStringLength, "UTF-8", 0); /* write it to the file */ CACHE = fopen_from_write_dir("ZIDCacheBob.xml", "wb+"); fwrite(xmlStringOutput, 1, xmlStringLength, CACHE); xmlFree(xmlStringOutput); fclose(CACHE); - - + + xmlFreeDoc(cacheBufferAlice); xmlFreeDoc(cacheBufferBob); } else { @@ -1352,6 +1352,19 @@ static void text_status_after_destroying_chat_room(void) { linphone_core_manager_destroy(marie); } + +static void file_transfer_not_sent_if_invalid_url(void) { + LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); + LinphoneChatRoom *chatroom = linphone_core_get_chat_room_from_uri(marie->lc, ""); + LinphoneChatMessage *msg = create_message_from_nowebcam(chatroom); + LinphoneChatMessageCbs *cbs = linphone_chat_message_get_callbacks(msg); + linphone_chat_message_cbs_set_msg_state_changed(cbs,liblinphone_tester_chat_message_msg_state_changed); + linphone_core_set_file_transfer_server(marie->lc, "INVALID URL"); + linphone_chat_room_send_chat_message(chatroom, msg); + BC_ASSERT_TRUE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneMessageNotDelivered, 1, 1000)); + linphone_core_manager_destroy(marie); +} + void file_transfer_io_error_base(char *server_url, bool_t destroy_room) { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneChatRoom *chatroom = linphone_core_get_chat_room_from_uri(marie->lc, ""); @@ -1366,25 +1379,13 @@ void file_transfer_io_error_base(char *server_url, bool_t destroy_room) { linphone_core_delete_chat_room(marie->lc, chatroom); BC_ASSERT_FALSE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneMessageNotDelivered, 1, 1000)); } else { - BC_ASSERT_TRUE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneMessageNotDelivered, 1, 1000)); + BC_ASSERT_TRUE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneMessageNotDelivered, 1, 3000)); } linphone_core_manager_destroy(marie); } -static void file_transfer_not_sent_if_invalid_url(void) { - LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); - LinphoneChatRoom *chatroom = linphone_core_get_chat_room_from_uri(marie->lc, ""); - LinphoneChatMessage *msg = create_message_from_nowebcam(chatroom); - LinphoneChatMessageCbs *cbs = linphone_chat_message_get_callbacks(msg); - linphone_chat_message_cbs_set_msg_state_changed(cbs,liblinphone_tester_chat_message_msg_state_changed); - linphone_core_set_file_transfer_server(marie->lc, "INVALID URL"); - linphone_chat_room_send_chat_message(chatroom, msg); - BC_ASSERT_TRUE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneMessageNotDelivered, 1, 1000)); - linphone_core_manager_destroy(marie); -} - static void file_transfer_not_sent_if_host_not_found(void) { - file_transfer_io_error_base("https://not_existing_url.com", FALSE); + file_transfer_io_error_base("https://not-existing-url.com", FALSE); } static void file_transfer_not_sent_if_url_moved_permanently(void) { @@ -1835,7 +1836,7 @@ test_t message_tests[] = { TEST_NO_TAG("Transfer message with http proxy", file_transfer_with_http_proxy), TEST_NO_TAG("Transfer message with upload io error", transfer_message_with_upload_io_error), TEST_NO_TAG("Transfer message with download io error", transfer_message_with_download_io_error), - TEST_ONE_TAG("Transfer message upload cancelled", transfer_message_upload_cancelled, "LeaksMemory"), + TEST_NO_TAG("Transfer message upload cancelled", transfer_message_upload_cancelled), TEST_NO_TAG("Transfer message download cancelled", transfer_message_download_cancelled), TEST_ONE_TAG("Transfer message using external body url", file_transfer_using_external_body_url, "LeaksMemory"), TEST_NO_TAG("Transfer 2 messages simultaneously", file_transfer_2_messages_simultaneously), @@ -1846,7 +1847,7 @@ test_t message_tests[] = { TEST_NO_TAG("Lime text message", lime_text_message), TEST_NO_TAG("Lime text message to non lime", lime_text_message_to_non_lime), TEST_NO_TAG("Lime transfer message", lime_transfer_message), - TEST_ONE_TAG("Lime transfer message from history", lime_transfer_message_from_history,"LeaksMemory"), + TEST_NO_TAG("Lime transfer message from history", lime_transfer_message_from_history), TEST_NO_TAG("Lime transfer message without encryption", lime_transfer_message_without_encryption), TEST_NO_TAG("Lime unitary", lime_unit), #ifdef SQLITE_STORAGE_ENABLED @@ -1858,13 +1859,15 @@ test_t message_tests[] = { TEST_NO_TAG("Transfer not sent if invalid url", file_transfer_not_sent_if_invalid_url), TEST_NO_TAG("Transfer not sent if host not found", file_transfer_not_sent_if_host_not_found), TEST_NO_TAG("Transfer not sent if url moved permanently", file_transfer_not_sent_if_url_moved_permanently), - TEST_NO_TAG("Transfer io error after destroying chatroom", file_transfer_io_error_after_destroying_chatroom), + TEST_ONE_TAG("Transfer io error after destroying chatroom", file_transfer_io_error_after_destroying_chatroom, "LeaksMemory"), TEST_ONE_TAG("Real Time Text message", real_time_text_message, "RTT"), TEST_ONE_TAG("Real Time Text SQL storage", real_time_text_sql_storage, "RTT"), TEST_ONE_TAG("Real Time Text SQL storage with RTT messages not stored", real_time_text_sql_storage_rtt_disabled, "RTT"), TEST_ONE_TAG("Real Time Text conversation", real_time_text_conversation, "RTT"), TEST_ONE_TAG("Real Time Text without audio", real_time_text_without_audio, "RTT"), +#if HAVE_SRTP TEST_ONE_TAG("Real Time Text with srtp", real_time_text_srtp, "RTT"), +#endif TEST_ONE_TAG("Real Time Text with ice", real_time_text_ice, "RTT"), TEST_ONE_TAG("Real Time Text message compatibility crlf", real_time_text_message_compat_crlf, "RTT"), TEST_ONE_TAG("Real Time Text message compatibility lf", real_time_text_message_compat_lf, "RTT"),