mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-02-07 14:18:25 +00:00
559 lines
22 KiB
C
559 lines
22 KiB
C
/*
|
|
liblinphone_tester - liblinphone test suite
|
|
Copyright (C) 2013 Belledonne Communications SARL
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include "CUnit/Basic.h"
|
|
#include "linphonecore.h"
|
|
#include "private.h"
|
|
#include "liblinphone_tester.h"
|
|
#include "lime.h"
|
|
|
|
static char* message_external_body_url;
|
|
|
|
void text_message_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from_address, const char *message) {
|
|
stats* counters = get_stats(lc);
|
|
counters->number_of_LinphoneMessageReceivedLegacy++;
|
|
}
|
|
|
|
void message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage* message) {
|
|
char* from=linphone_address_as_string(linphone_chat_message_get_from(message));
|
|
stats* counters;
|
|
const char *text=linphone_chat_message_get_text(message);
|
|
const char *external_body_url=linphone_chat_message_get_external_body_url(message);
|
|
ms_message("Message from [%s] is [%s] , external URL [%s]",from?from:""
|
|
,text?text:""
|
|
,external_body_url?external_body_url:"");
|
|
ms_free(from);
|
|
counters = get_stats(lc);
|
|
counters->number_of_LinphoneMessageReceived++;
|
|
if (linphone_chat_message_get_external_body_url(message)) {
|
|
counters->number_of_LinphoneMessageExtBodyReceived++;
|
|
CU_ASSERT_STRING_EQUAL(linphone_chat_message_get_external_body_url(message),message_external_body_url);
|
|
}
|
|
}
|
|
|
|
void is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) {
|
|
stats *counters = get_stats(lc);
|
|
if (room->remote_is_composing == LinphoneIsComposingActive) {
|
|
counters->number_of_LinphoneIsComposingActiveReceived++;
|
|
} else {
|
|
counters->number_of_LinphoneIsComposingIdleReceived++;
|
|
}
|
|
}
|
|
|
|
void liblinphone_tester_chat_message_state_change(LinphoneChatMessage* msg,LinphoneChatMessageState state,void* ud) {
|
|
LinphoneCore* lc=(LinphoneCore*)ud;
|
|
stats* counters = get_stats(lc);
|
|
ms_message("Message [%s] [%s]",linphone_chat_message_get_text(msg),linphone_chat_message_state_to_string(state));
|
|
switch (state) {
|
|
case LinphoneChatMessageStateDelivered:
|
|
counters->number_of_LinphoneMessageDelivered++;
|
|
break;
|
|
case LinphoneChatMessageStateNotDelivered:
|
|
counters->number_of_LinphoneMessageNotDelivered++;
|
|
break;
|
|
case LinphoneChatMessageStateInProgress:
|
|
counters->number_of_LinphoneMessageInProgress++;
|
|
break;
|
|
default:
|
|
ms_error("Unexpected state [%s] for message [%p]",linphone_chat_message_state_to_string(state),msg);
|
|
}
|
|
|
|
}
|
|
|
|
static void text_message(void) {
|
|
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
|
|
char* to = linphone_address_as_string(marie->identity);
|
|
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
|
ms_free(to);
|
|
|
|
linphone_chat_room_send_message(chat_room,"Bla bla bla bla");
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1));
|
|
CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1);
|
|
|
|
CU_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity));
|
|
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
static void text_message_within_dialog(void) {
|
|
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
|
|
lp_config_set_int(pauline->lc->config,"sip","chat_use_call_dialogs",1);
|
|
|
|
char* to = linphone_address_as_string(marie->identity);
|
|
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
|
ms_free(to);
|
|
|
|
CU_ASSERT_TRUE(call(marie,pauline));
|
|
|
|
linphone_chat_room_send_message(chat_room,"Bla bla bla bla");
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1));
|
|
|
|
CU_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity));
|
|
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
static LinphoneAuthInfo* text_message_with_credential_from_auth_cb_auth_info;
|
|
static void text_message_with_credential_from_auth_cb_auth_info_requested(LinphoneCore *lc, const char *realm, const char *username, const char *domain) {
|
|
stats* counters;
|
|
ms_message("text_message_with_credential_from_auth_cb:Auth info requested for user id [%s] at realm [%s]\n"
|
|
,username
|
|
,realm);
|
|
counters = get_stats(lc);
|
|
counters->number_of_auth_info_requested++;
|
|
linphone_core_add_auth_info(lc,text_message_with_credential_from_auth_cb_auth_info); /*add stored authentication info to LinphoneCore*/
|
|
}
|
|
|
|
|
|
static void text_message_with_credential_from_auth_cb(void) {
|
|
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
text_message_with_credential_from_auth_cb_auth_info=linphone_auth_info_clone((LinphoneAuthInfo*)(linphone_core_get_auth_info_list(marie->lc)->data));
|
|
|
|
/*to force cb to be called*/
|
|
linphone_core_clear_all_auth_info(marie->lc);
|
|
marie->lc->vtable.auth_info_requested=text_message_with_credential_from_auth_cb_auth_info_requested;
|
|
|
|
char* to = linphone_address_as_string(marie->identity);
|
|
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
|
ms_free(to);
|
|
|
|
|
|
linphone_chat_room_send_message(chat_room,"Bla bla bla bla");
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1));
|
|
CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1);
|
|
|
|
CU_ASSERT_PTR_NOT_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity));
|
|
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
static void text_message_with_privacy(void) {
|
|
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
LinphoneProxyConfig* pauline_proxy;
|
|
char* to = linphone_address_as_string(marie->identity);
|
|
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
|
ms_free(to);
|
|
|
|
/*test proxy config privacy*/
|
|
linphone_core_get_default_proxy(pauline->lc,&pauline_proxy);
|
|
linphone_proxy_config_set_privacy(pauline_proxy,LinphonePrivacyId);
|
|
|
|
CU_ASSERT_PTR_NULL(linphone_core_get_chat_room(marie->lc,pauline->identity));
|
|
|
|
linphone_chat_room_send_message(chat_room,"Bla bla bla bla");
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1));
|
|
CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageReceivedLegacy,1);
|
|
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
static void text_message_compatibility_mode(void) {
|
|
char route[256];
|
|
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
LinphoneProxyConfig* proxy;
|
|
LinphoneAddress* proxy_address;
|
|
char*tmp;
|
|
LCSipTransports transport;
|
|
char* to = linphone_address_as_string(pauline->identity);
|
|
LinphoneChatRoom* chat_room;
|
|
|
|
linphone_core_get_default_proxy(marie->lc,&proxy);
|
|
CU_ASSERT_PTR_NOT_NULL (proxy);
|
|
proxy_address=linphone_address_new(linphone_proxy_config_get_addr(proxy));
|
|
linphone_address_clean(proxy_address);
|
|
tmp=linphone_address_as_string_uri_only(proxy_address);
|
|
linphone_proxy_config_set_server_addr(proxy,tmp);
|
|
sprintf(route,"sip:%s",test_route);
|
|
linphone_proxy_config_set_route(proxy,route);
|
|
ms_free(tmp);
|
|
linphone_address_destroy(proxy_address);
|
|
linphone_core_get_sip_transports(marie->lc,&transport);
|
|
transport.udp_port=0;
|
|
transport.tls_port=0;
|
|
transport.dtls_port=0;
|
|
/*only keep tcp*/
|
|
linphone_core_set_sip_transports(marie->lc,&transport);
|
|
marie->stat.number_of_LinphoneRegistrationOk=0;
|
|
|
|
CU_ASSERT_TRUE (wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneRegistrationOk,1));
|
|
|
|
chat_room = linphone_core_create_chat_room(marie->lc,to);
|
|
linphone_chat_room_send_message(chat_room,"Bla bla bla bla");
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageReceived,1));
|
|
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageReceivedLegacy,1);
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
static void text_message_with_ack(void) {
|
|
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
char* to = linphone_address_as_string(marie->identity);
|
|
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
|
LinphoneChatMessage* message = linphone_chat_room_create_message(chat_room,"Bli bli bli \n blu");
|
|
linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc);
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1));
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDelivered,1));
|
|
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1);
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
static void text_message_with_external_body(void) {
|
|
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
char* to = linphone_address_as_string(marie->identity);
|
|
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
|
LinphoneChatMessage* message = linphone_chat_room_create_message(chat_room,"Bli bli bli \n blu");
|
|
linphone_chat_message_set_external_body_url(message,message_external_body_url="http://www.linphone.org");
|
|
linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc);
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1));
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDelivered,1));
|
|
|
|
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1);
|
|
CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,1);
|
|
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
static void text_message_with_send_error(void) {
|
|
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
char* to = linphone_address_as_string(pauline->identity);
|
|
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(marie->lc,to);
|
|
LinphoneChatMessage* message = linphone_chat_room_create_message(chat_room,"Bli bli bli \n blu");
|
|
/*simultate a network error*/
|
|
sal_set_send_error(marie->lc->sal, -1);
|
|
linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,marie->lc);
|
|
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageNotDelivered,1));
|
|
/*CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageInProgress,1);*/
|
|
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageReceived,0);
|
|
|
|
sal_set_send_error(marie->lc->sal, 0);
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
static void text_message_denied(void) {
|
|
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
char* to = linphone_address_as_string(pauline->identity);
|
|
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(marie->lc,to);
|
|
LinphoneChatMessage* message = linphone_chat_room_create_message(chat_room,"Bli bli bli \n blu");
|
|
|
|
/*pauline doesn't want to be disturbed*/
|
|
linphone_core_disable_chat(pauline->lc,LinphoneReasonDoNotDisturb);
|
|
|
|
linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,marie->lc);
|
|
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageNotDelivered,1));
|
|
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageReceived,0);
|
|
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
static const char *info_content="<somexml>blabla</somexml>";
|
|
|
|
void info_message_received(LinphoneCore *lc, LinphoneCall* call, const LinphoneInfoMessage *msg){
|
|
stats* counters = get_stats(lc);
|
|
|
|
if (counters->last_received_info_message) {
|
|
linphone_info_message_destroy(counters->last_received_info_message);
|
|
}
|
|
counters->last_received_info_message=linphone_info_message_copy(msg);
|
|
counters->number_of_inforeceived++;
|
|
}
|
|
|
|
|
|
|
|
static void info_message_with_args(bool_t with_content) {
|
|
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
LinphoneInfoMessage *info;
|
|
const LinphoneContent *content;
|
|
const char *hvalue;
|
|
|
|
CU_ASSERT_TRUE(call(pauline,marie));
|
|
|
|
info=linphone_core_create_info_message(marie->lc);
|
|
linphone_info_message_add_header(info,"Weather","still bad");
|
|
if (with_content) {
|
|
LinphoneContent ct={0};
|
|
ct.type="application";
|
|
ct.subtype="somexml";
|
|
ct.data=(void*)info_content;
|
|
ct.size=strlen(info_content);
|
|
linphone_info_message_set_content(info,&ct);
|
|
}
|
|
linphone_call_send_info_message(linphone_core_get_current_call(marie->lc),info);
|
|
linphone_info_message_destroy(info);
|
|
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_inforeceived,1));
|
|
|
|
CU_ASSERT_PTR_NOT_NULL(pauline->stat.last_received_info_message);
|
|
hvalue=linphone_info_message_get_header(pauline->stat.last_received_info_message, "Weather");
|
|
content=linphone_info_message_get_content(pauline->stat.last_received_info_message);
|
|
|
|
CU_ASSERT_PTR_NOT_NULL(hvalue);
|
|
if (hvalue)
|
|
CU_ASSERT_TRUE(strcmp(hvalue,"still bad")==0);
|
|
|
|
if (with_content){
|
|
CU_ASSERT_PTR_NOT_NULL(content);
|
|
if (content) {
|
|
CU_ASSERT_PTR_NOT_NULL(content->data);
|
|
CU_ASSERT_PTR_NOT_NULL(content->type);
|
|
CU_ASSERT_PTR_NOT_NULL(content->subtype);
|
|
if (content->type) CU_ASSERT_TRUE(strcmp(content->type,"application")==0);
|
|
if (content->subtype) CU_ASSERT_TRUE(strcmp(content->subtype,"somexml")==0);
|
|
if (content->data)CU_ASSERT_TRUE(strcmp((const char*)content->data,info_content)==0);
|
|
CU_ASSERT_EQUAL(content->size,strlen(info_content));
|
|
}
|
|
}
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
static void info_message(){
|
|
info_message_with_args(FALSE);
|
|
}
|
|
|
|
static void info_message_with_body(){
|
|
info_message_with_args(TRUE);
|
|
}
|
|
|
|
static void is_composing_notification(void) {
|
|
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
|
|
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
|
char* to = linphone_address_as_string(marie->identity);
|
|
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc, to);
|
|
int dummy = 0;
|
|
|
|
ms_free(to);
|
|
linphone_chat_room_compose(chat_room);
|
|
wait_for_until(pauline->lc, marie->lc, &dummy, 1, 1500); /*just to sleep while iterating*/
|
|
linphone_chat_room_send_message(chat_room, "Composing a message");
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingActiveReceived, 1));
|
|
CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingIdleReceived, 2));
|
|
|
|
linphone_core_manager_destroy(marie);
|
|
linphone_core_manager_destroy(pauline);
|
|
}
|
|
|
|
void printHex(char *title, uint8_t *data, uint32_t length) {
|
|
printf ("%s : ", title);
|
|
int i;
|
|
for (i=0; i<length; i++) {
|
|
printf ("0x%02x, ", data[i]);
|
|
}
|
|
printf ("\n");
|
|
}
|
|
|
|
static void lime(void) {
|
|
int retval;
|
|
/* Load Alice cache file */
|
|
FILE *CACHE = fopen("ZIDCacheAlice.xml", "r+");
|
|
fseek(CACHE, 0L, SEEK_END); /* Position to end of file */
|
|
int size = ftell(CACHE); /* Get file length */
|
|
rewind(CACHE); /* Back to start of file */
|
|
uint8_t *cacheBufferString = (uint8_t *)malloc(size*sizeof(uint8_t)+1);
|
|
fread(cacheBufferString, 1, size, CACHE);
|
|
*(cacheBufferString+size) = '\0';
|
|
fclose(CACHE);
|
|
/* parse it to an xmlDoc */
|
|
xmlDocPtr cacheBufferAlice = xmlParseDoc(cacheBufferString);
|
|
free(cacheBufferString);
|
|
|
|
/* Load Bob cache file */
|
|
CACHE = fopen("ZIDCacheBob.xml", "r+");
|
|
fseek(CACHE, 0L, SEEK_END); /* Position to end of file */
|
|
size = ftell(CACHE); /* Get file length */
|
|
rewind(CACHE); /* Back to start of file */
|
|
cacheBufferString = (uint8_t *)malloc(size*sizeof(uint8_t)+1);
|
|
fread(cacheBufferString, 1, size, CACHE);
|
|
*(cacheBufferString+size) = '\0';
|
|
fclose(CACHE);
|
|
/* parse it to an xmlDoc */
|
|
xmlDocPtr cacheBufferBob = xmlParseDoc(cacheBufferString);
|
|
free(cacheBufferString);
|
|
|
|
|
|
|
|
/* encrypt a message */
|
|
uint8_t *multipartMessage = NULL;
|
|
retval = lime_createMultipartMessage(cacheBufferAlice, (uint8_t *)"Bonjour les petits lapins,ca va? éh oui oui", (uint8_t *)"pipo1@pipo.com", &multipartMessage);
|
|
|
|
printf("create message return %d\n", retval);
|
|
if (retval == 0) {
|
|
printf("message is %s\n", multipartMessage);
|
|
}
|
|
|
|
/* decrypt the multipart message */
|
|
uint8_t *decryptedMessage = NULL;
|
|
retval = lime_decryptMultipartMessage(cacheBufferBob, multipartMessage, &decryptedMessage);
|
|
|
|
printf("decrypt message return %d\n", retval);
|
|
if (retval == 0) {
|
|
printf("message is %s##END\n", decryptedMessage);
|
|
}
|
|
free(multipartMessage);
|
|
free(decryptedMessage);
|
|
|
|
/* update ZID files */
|
|
/* dump the xml document into a string */
|
|
xmlChar *xmlStringOutput;
|
|
int xmlStringLength;
|
|
xmlDocDumpFormatMemoryEnc(cacheBufferAlice, &xmlStringOutput, &xmlStringLength, "UTF-8", 0);
|
|
/* write it to the file */
|
|
CACHE = fopen("ZIDCacheAlice.xml", "w+");
|
|
fwrite(xmlStringOutput, 1, xmlStringLength, CACHE);
|
|
xmlFree(xmlStringOutput);
|
|
fclose(CACHE);
|
|
|
|
xmlDocDumpFormatMemoryEnc(cacheBufferBob, &xmlStringOutput, &xmlStringLength, "UTF-8", 0);
|
|
/* write it to the file */
|
|
CACHE = fopen("ZIDCacheBob.xml", "w+");
|
|
fwrite(xmlStringOutput, 1, xmlStringLength, CACHE);
|
|
xmlFree(xmlStringOutput);
|
|
fclose(CACHE);
|
|
|
|
|
|
xmlFreeDoc(cacheBufferAlice);
|
|
xmlFreeDoc(cacheBufferBob);
|
|
|
|
/* Load cache file */
|
|
CACHE = fopen("ZIDCache.xml", "r+");
|
|
fseek(CACHE, 0L, SEEK_END); /* Position to end of file */
|
|
size = ftell(CACHE); /* Get file length */
|
|
rewind(CACHE); /* Back to start of file */
|
|
cacheBufferString = (uint8_t *)malloc(size*sizeof(uint8_t)+1);
|
|
fread(cacheBufferString, 1, size, CACHE);
|
|
*(cacheBufferString+size) = '\0';
|
|
fclose(CACHE);
|
|
/* parse it to an xmlDoc */
|
|
xmlDocPtr cacheBuffer = xmlParseDoc(cacheBufferString);
|
|
free(cacheBufferString);
|
|
|
|
/* get data from cache : sender */
|
|
limeURIKeys_t associatedKeys;
|
|
associatedKeys.peerURI = (uint8_t *)malloc(15);
|
|
memcpy(associatedKeys.peerURI, "pipo1@pipo.com", 15);
|
|
associatedKeys.associatedZIDNumber = 0;
|
|
retval = lime_getCachedSndKeysByURI(cacheBuffer, &associatedKeys);
|
|
printf("getCachedKeys returns %d, number of key found %d\n", retval, associatedKeys.associatedZIDNumber);
|
|
|
|
int i;
|
|
for (i=0; i<associatedKeys.associatedZIDNumber; i++) {
|
|
printHex("ZID", associatedKeys.peerKeys[i]->peerZID, 12);
|
|
printHex("key", associatedKeys.peerKeys[i]->key, 32);
|
|
printHex("sessionID", associatedKeys.peerKeys[i]->sessionId, 32);
|
|
printf("session index %d\n", associatedKeys.peerKeys[i]->sessionIndex);
|
|
}
|
|
|
|
/* get data from cache : receiver */
|
|
limeKey_t associatedKey;
|
|
uint8_t targetZID[12] = {0x00, 0x5d, 0xbe, 0x03, 0x99, 0x64, 0x3d, 0x95, 0x3a, 0x22, 0x02, 0xdd};
|
|
memcpy(associatedKey.peerZID, targetZID, 12);
|
|
retval = lime_getCachedRcvKeyByZid(cacheBuffer, &associatedKey);
|
|
printf("getCachedKey by ZID return %d\n", retval);
|
|
|
|
printHex("Key", associatedKey.key, 32);
|
|
printHex("sessionID", associatedKey.sessionId, 32);
|
|
printf("session index %d\n", associatedKey.sessionIndex);
|
|
|
|
/* encrypt/decrypt a message */
|
|
uint8_t senderZID[12] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0};
|
|
uint8_t encryptedMessage[48];
|
|
uint8_t plainMessage[48];
|
|
lime_encryptMessage(associatedKeys.peerKeys[0], (uint8_t *)"bla Bla bla b! Pipo", 20, senderZID, encryptedMessage);
|
|
printHex("Ciphered", encryptedMessage, 32);
|
|
/* invert sender and receiverZID to decrypt/authenticate */
|
|
uint8_t receiverZID[12];
|
|
memcpy(receiverZID, associatedKeys.peerKeys[0]->peerZID, 12);
|
|
memcpy(associatedKeys.peerKeys[0]->peerZID, senderZID, 12);
|
|
retval = lime_decryptMessage(associatedKeys.peerKeys[0], encryptedMessage, 36, receiverZID, plainMessage);
|
|
printf("Decrypt and auth returned %d\nPlain: %s\n", retval, plainMessage);
|
|
|
|
/* update receiver data */
|
|
associatedKey.sessionIndex++;
|
|
associatedKey.key[0]++;
|
|
associatedKey.sessionId[0]++;
|
|
retval = lime_setCachedKey(cacheBuffer, &associatedKey, LIME_RECEIVER);
|
|
printf("setCachedKey return %d\n", retval);
|
|
|
|
/* 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);
|
|
printf("setCachedKey return %d\n", retval);
|
|
|
|
/* free memory */
|
|
lime_freeKeys(associatedKeys);
|
|
|
|
/* write the file */
|
|
/* dump the xml document into a string */
|
|
xmlDocDumpFormatMemoryEnc(cacheBuffer, &xmlStringOutput, &xmlStringLength, "UTF-8", 0);
|
|
/* write it to the file */
|
|
CACHE = fopen("ZIDCache.xml", "w+");
|
|
fwrite(xmlStringOutput, 1, xmlStringLength, CACHE);
|
|
xmlFree(xmlStringOutput);
|
|
fclose(CACHE);
|
|
xmlFreeDoc(cacheBuffer);
|
|
}
|
|
|
|
test_t message_tests[] = {
|
|
{ "Text message", text_message },
|
|
{ "Text message within call's dialog", text_message_within_dialog},
|
|
{ "Text message with credentials from auth info cb", text_message_with_credential_from_auth_cb},
|
|
{ "Text message with privacy", text_message_with_privacy },
|
|
{ "Text message compatibility mode", text_message_compatibility_mode },
|
|
{ "Text message with ack", text_message_with_ack },
|
|
{ "Text message with send error", text_message_with_send_error },
|
|
{ "Text message with external body", text_message_with_external_body },
|
|
{ "Text message denied", text_message_denied },
|
|
{ "Info message", info_message },
|
|
{ "Info message with body", info_message_with_body },
|
|
{ "IsComposing notification", is_composing_notification },
|
|
{ "Lime", lime }
|
|
};
|
|
|
|
test_suite_t message_test_suite = {
|
|
"Message",
|
|
NULL,
|
|
NULL,
|
|
sizeof(message_tests) / sizeof(message_tests[0]),
|
|
message_tests
|
|
};
|
|
|