mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
commit
1ec95162a0
112
core/Messenger.c
112
core/Messenger.c
|
@ -47,8 +47,9 @@ uint8_t self_public_key[crypto_box_PUBLICKEYBYTES];
|
||||||
static uint8_t self_name[MAX_NAME_LENGTH];
|
static uint8_t self_name[MAX_NAME_LENGTH];
|
||||||
static uint16_t self_name_length;
|
static uint16_t self_name_length;
|
||||||
|
|
||||||
static uint8_t *self_statusmessage;
|
static uint8_t self_statusmessage[MAX_STATUSMESSAGE_LENGTH];
|
||||||
static uint16_t self_statusmessage_len;
|
static uint16_t self_statusmessage_length;
|
||||||
|
|
||||||
static USERSTATUS self_userstatus;
|
static USERSTATUS self_userstatus;
|
||||||
|
|
||||||
static Friend *friendlist;
|
static Friend *friendlist;
|
||||||
|
@ -56,6 +57,7 @@ static uint32_t numfriends;
|
||||||
|
|
||||||
|
|
||||||
static void set_friend_status(int friendnumber, uint8_t status);
|
static void set_friend_status(int friendnumber, uint8_t status);
|
||||||
|
static int write_cryptpacket_id(int friendnumber, uint8_t packet_id, uint8_t *data, uint32_t length);
|
||||||
|
|
||||||
/* 1 if we are online
|
/* 1 if we are online
|
||||||
0 if we are offline
|
0 if we are offline
|
||||||
|
@ -234,17 +236,13 @@ uint32_t m_sendmessage(int friendnumber, uint8_t *message, uint32_t length)
|
||||||
|
|
||||||
uint32_t m_sendmessage_withid(int friendnumber, uint32_t theid, uint8_t *message, uint32_t length)
|
uint32_t m_sendmessage_withid(int friendnumber, uint32_t theid, uint8_t *message, uint32_t length)
|
||||||
{
|
{
|
||||||
if (friendnumber < 0 || friendnumber >= numfriends)
|
if (length >= (MAX_DATA_SIZE - sizeof(theid)))
|
||||||
return 0;
|
|
||||||
if (length >= (MAX_DATA_SIZE - sizeof(theid)) || friendlist[friendnumber].status != FRIEND_ONLINE)
|
|
||||||
/* this does not mean the maximum message length is MAX_DATA_SIZE - 1, it is actually 17 bytes less. */
|
|
||||||
return 0;
|
return 0;
|
||||||
uint8_t temp[MAX_DATA_SIZE];
|
uint8_t temp[MAX_DATA_SIZE];
|
||||||
temp[0] = PACKET_ID_MESSAGE;
|
|
||||||
theid = htonl(theid);
|
theid = htonl(theid);
|
||||||
memcpy(temp + 1, &theid, sizeof(theid));
|
memcpy(temp, &theid, sizeof(theid));
|
||||||
memcpy(temp + 1 + sizeof(theid), message, length);
|
memcpy(temp + sizeof(theid), message, length);
|
||||||
return write_cryptpacket(friendlist[friendnumber].crypt_connection_id, temp, length + 1 + sizeof(theid));
|
return write_cryptpacket_id(friendnumber, PACKET_ID_MESSAGE, temp, length + sizeof(theid));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* send an action to an online friend
|
/* send an action to an online friend
|
||||||
|
@ -252,14 +250,7 @@ uint32_t m_sendmessage_withid(int friendnumber, uint32_t theid, uint8_t *message
|
||||||
return 0 if it was not */
|
return 0 if it was not */
|
||||||
int m_sendaction(int friendnumber, uint8_t *action, uint32_t length)
|
int m_sendaction(int friendnumber, uint8_t *action, uint32_t length)
|
||||||
{
|
{
|
||||||
if (friendnumber < 0 || friendnumber >= numfriends)
|
return write_cryptpacket_id(friendnumber, PACKET_ID_ACTION, action, length);
|
||||||
return 0;
|
|
||||||
if (length >= MAX_DATA_SIZE || friendlist[friendnumber].status != FRIEND_ONLINE)
|
|
||||||
return 0;
|
|
||||||
uint8_t temp[MAX_DATA_SIZE];
|
|
||||||
temp[0] = PACKET_ID_ACTION;
|
|
||||||
memcpy(temp + 1, action, length);
|
|
||||||
return write_cryptpacket(friendlist[friendnumber].crypt_connection_id, temp, length + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* send a name packet to friendnumber
|
/* send a name packet to friendnumber
|
||||||
|
@ -268,10 +259,7 @@ static int m_sendname(int friendnumber, uint8_t * name, uint16_t length)
|
||||||
{
|
{
|
||||||
if(length > MAX_NAME_LENGTH || length == 0)
|
if(length > MAX_NAME_LENGTH || length == 0)
|
||||||
return 0;
|
return 0;
|
||||||
uint8_t temp[MAX_NAME_LENGTH + 1];
|
return write_cryptpacket_id(friendnumber, PACKET_ID_NICKNAME, name, length);
|
||||||
memcpy(temp + 1, name, length);
|
|
||||||
temp[0] = PACKET_ID_NICKNAME;
|
|
||||||
return write_cryptpacket(friendlist[friendnumber].crypt_connection_id, temp, length + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set the name of a friend
|
/* set the name of a friend
|
||||||
|
@ -330,11 +318,8 @@ int m_set_statusmessage(uint8_t *status, uint16_t length)
|
||||||
{
|
{
|
||||||
if (length > MAX_STATUSMESSAGE_LENGTH)
|
if (length > MAX_STATUSMESSAGE_LENGTH)
|
||||||
return -1;
|
return -1;
|
||||||
uint8_t *newstatus = calloc(length, 1);
|
memcpy(self_statusmessage, status, length);
|
||||||
memcpy(newstatus, status, length);
|
self_statusmessage_length = length;
|
||||||
free(self_statusmessage);
|
|
||||||
self_statusmessage = newstatus;
|
|
||||||
self_statusmessage_len = length;
|
|
||||||
|
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
for (i = 0; i < numfriends; ++i)
|
for (i = 0; i < numfriends; ++i)
|
||||||
|
@ -399,22 +384,12 @@ USERSTATUS m_get_self_userstatus(void)
|
||||||
|
|
||||||
static int send_statusmessage(int friendnumber, uint8_t * status, uint16_t length)
|
static int send_statusmessage(int friendnumber, uint8_t * status, uint16_t length)
|
||||||
{
|
{
|
||||||
uint8_t *thepacket = malloc(length + 1);
|
return write_cryptpacket_id(friendnumber, PACKET_ID_STATUSMESSAGE, status, length);
|
||||||
memcpy(thepacket + 1, status, length);
|
|
||||||
thepacket[0] = PACKET_ID_STATUSMESSAGE;
|
|
||||||
int written = write_cryptpacket(friendlist[friendnumber].crypt_connection_id, thepacket, length + 1);
|
|
||||||
free(thepacket);
|
|
||||||
return written;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int send_userstatus(int friendnumber, USERSTATUS status)
|
static int send_userstatus(int friendnumber, USERSTATUS status)
|
||||||
{
|
{
|
||||||
uint8_t *thepacket = malloc(1 + 1);
|
return write_cryptpacket_id(friendnumber, PACKET_ID_USERSTATUS, (uint8_t*)&status, sizeof(USERSTATUS));
|
||||||
memcpy(thepacket + 1, &status, 1);
|
|
||||||
thepacket[0] = PACKET_ID_USERSTATUS;
|
|
||||||
int written = write_cryptpacket(friendlist[friendnumber].crypt_connection_id, thepacket, 1 + 1);
|
|
||||||
free(thepacket);
|
|
||||||
return written;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_friend_statusmessage(int friendnumber, uint8_t * status, uint16_t length)
|
static int set_friend_statusmessage(int friendnumber, uint8_t * status, uint16_t length)
|
||||||
|
@ -517,6 +492,18 @@ static void set_friend_status(int friendnumber, uint8_t status)
|
||||||
friendlist[friendnumber].status = status;
|
friendlist[friendnumber].status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int write_cryptpacket_id(int friendnumber, uint8_t packet_id, uint8_t *data, uint32_t length)
|
||||||
|
{
|
||||||
|
if (friendnumber < 0 || friendnumber >= numfriends)
|
||||||
|
return 0;
|
||||||
|
if (length >= MAX_DATA_SIZE || friendlist[friendnumber].status != FRIEND_ONLINE)
|
||||||
|
return 0;
|
||||||
|
uint8_t packet[length + 1];
|
||||||
|
packet[0] = packet_id;
|
||||||
|
memcpy(packet + 1, data, length);
|
||||||
|
return write_cryptpacket(friendlist[friendnumber].crypt_connection_id, packet, length + 1);
|
||||||
|
}
|
||||||
|
|
||||||
#define PORT 33445
|
#define PORT 33445
|
||||||
/* run this at startup */
|
/* run this at startup */
|
||||||
int initMessenger(void)
|
int initMessenger(void)
|
||||||
|
@ -578,7 +565,7 @@ static void doFriends(void)
|
||||||
friendlist[i].name_sent = 1;
|
friendlist[i].name_sent = 1;
|
||||||
}
|
}
|
||||||
if (friendlist[i].statusmessage_sent == 0) {
|
if (friendlist[i].statusmessage_sent == 0) {
|
||||||
if (send_statusmessage(i, self_statusmessage, self_statusmessage_len))
|
if (send_statusmessage(i, self_statusmessage, self_statusmessage_length))
|
||||||
friendlist[i].statusmessage_sent = 1;
|
friendlist[i].statusmessage_sent = 1;
|
||||||
}
|
}
|
||||||
if (friendlist[i].userstatus_sent == 0) {
|
if (friendlist[i].userstatus_sent == 0) {
|
||||||
|
@ -586,59 +573,62 @@ static void doFriends(void)
|
||||||
friendlist[i].userstatus_sent = 1;
|
friendlist[i].userstatus_sent = 1;
|
||||||
}
|
}
|
||||||
len = read_cryptpacket(friendlist[i].crypt_connection_id, temp);
|
len = read_cryptpacket(friendlist[i].crypt_connection_id, temp);
|
||||||
|
uint8_t packet_id = temp[0];
|
||||||
|
uint8_t* data = temp + 1;
|
||||||
|
int data_length = len - 1;
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
switch (temp[0]) {
|
switch (packet_id) {
|
||||||
case PACKET_ID_NICKNAME: {
|
case PACKET_ID_NICKNAME: {
|
||||||
if (len >= MAX_NAME_LENGTH + 1 || len == 1)
|
if (data_length >= MAX_NAME_LENGTH || data_length == 0)
|
||||||
break;
|
break;
|
||||||
if(friend_namechange_isset)
|
if(friend_namechange_isset)
|
||||||
friend_namechange(i, temp + 1, len - 1);
|
friend_namechange(i, data, data_length);
|
||||||
memcpy(friendlist[i].name, temp + 1, len - 1);
|
memcpy(friendlist[i].name, data, data_length);
|
||||||
friendlist[i].name[len - 2] = 0; /* make sure the NULL terminator is present. */
|
friendlist[i].name[data_length - 1] = 0; /* make sure the NULL terminator is present. */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PACKET_ID_STATUSMESSAGE: {
|
case PACKET_ID_STATUSMESSAGE: {
|
||||||
if (len < 2)
|
if (data_length == 0)
|
||||||
break;
|
break;
|
||||||
uint8_t *status = calloc(MIN(len - 1, MAX_STATUSMESSAGE_LENGTH), 1);
|
uint8_t *status = calloc(MIN(data_length, MAX_STATUSMESSAGE_LENGTH), 1);
|
||||||
memcpy(status, temp + 1, MIN(len - 1, MAX_STATUSMESSAGE_LENGTH));
|
memcpy(status, data, MIN(data_length, MAX_STATUSMESSAGE_LENGTH));
|
||||||
if (friend_statusmessagechange_isset)
|
if (friend_statusmessagechange_isset)
|
||||||
friend_statusmessagechange(i, status, MIN(len - 1, MAX_STATUSMESSAGE_LENGTH));
|
friend_statusmessagechange(i, status, MIN(data_length, MAX_STATUSMESSAGE_LENGTH));
|
||||||
set_friend_statusmessage(i, status, MIN(len - 1, MAX_STATUSMESSAGE_LENGTH));
|
set_friend_statusmessage(i, status, MIN(data_length, MAX_STATUSMESSAGE_LENGTH));
|
||||||
free(status);
|
free(status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PACKET_ID_USERSTATUS: {
|
case PACKET_ID_USERSTATUS: {
|
||||||
if (len != 2)
|
if (data_length != 1)
|
||||||
break;
|
break;
|
||||||
USERSTATUS status = temp[1];
|
USERSTATUS status = data[0];
|
||||||
if (friend_userstatuschange_isset)
|
if (friend_userstatuschange_isset)
|
||||||
friend_userstatuschange(i, status);
|
friend_userstatuschange(i, status);
|
||||||
set_friend_userstatus(i, status);
|
set_friend_userstatus(i, status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PACKET_ID_MESSAGE: {
|
case PACKET_ID_MESSAGE: {
|
||||||
|
uint8_t *message_id = data;
|
||||||
|
uint8_t message_id_length = 4;
|
||||||
|
uint8_t *message = data + message_id_length;
|
||||||
|
uint16_t message_length = data_length - message_id_length;
|
||||||
if (friendlist[i].receives_read_receipts) {
|
if (friendlist[i].receives_read_receipts) {
|
||||||
uint8_t *thepacket = malloc(5);
|
write_cryptpacket_id(i, PACKET_ID_RECEIPT, message_id, message_id_length);
|
||||||
thepacket[0] = PACKET_ID_RECEIPT;
|
|
||||||
memcpy(thepacket + 1, temp + 1, 4);
|
|
||||||
write_cryptpacket(friendlist[i].crypt_connection_id, thepacket, 5);
|
|
||||||
free(thepacket);
|
|
||||||
}
|
}
|
||||||
if (friend_message_isset)
|
if (friend_message_isset)
|
||||||
(*friend_message)(i, temp + 5, len - 5);
|
(*friend_message)(i, message, message_length);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PACKET_ID_ACTION: {
|
case PACKET_ID_ACTION: {
|
||||||
if (friend_action_isset)
|
if (friend_action_isset)
|
||||||
(*friend_action)(i, temp + 1, len - 1);
|
(*friend_action)(i, data, data_length);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PACKET_ID_RECEIPT: {
|
case PACKET_ID_RECEIPT: {
|
||||||
uint32_t msgid;
|
uint32_t msgid;
|
||||||
if (len < 1 + sizeof(msgid))
|
if (data_length < sizeof(msgid))
|
||||||
break;
|
break;
|
||||||
memcpy(&msgid, temp + 1, sizeof(msgid));
|
memcpy(&msgid, data, sizeof(msgid));
|
||||||
msgid = ntohl(msgid);
|
msgid = ntohl(msgid);
|
||||||
if (read_receipt_isset)
|
if (read_receipt_isset)
|
||||||
(*read_receipt)(i, msgid);
|
(*read_receipt)(i, msgid);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user