diff options
Diffstat (limited to 'core/Messenger.c')
-rw-r--r-- | core/Messenger.c | 46 |
1 files changed, 17 insertions, 29 deletions
diff --git a/core/Messenger.c b/core/Messenger.c index 00f54cfa..5589e752 100644 --- a/core/Messenger.c +++ b/core/Messenger.c | |||
@@ -56,6 +56,7 @@ static uint32_t numfriends; | |||
56 | 56 | ||
57 | 57 | ||
58 | static void set_friend_status(int friendnumber, uint8_t status); | 58 | static void set_friend_status(int friendnumber, uint8_t status); |
59 | static int write_cryptpacket_id(int crypt_connection_id, uint8_t packet_id, uint8_t *data, uint32_t length); | ||
59 | 60 | ||
60 | /* 1 if we are online | 61 | /* 1 if we are online |
61 | 0 if we are offline | 62 | 0 if we are offline |
@@ -240,11 +241,10 @@ uint32_t m_sendmessage_withid(int friendnumber, uint32_t theid, uint8_t *message | |||
240 | /* this does not mean the maximum message length is MAX_DATA_SIZE - 1, it is actually 17 bytes less. */ | 241 | /* this does not mean the maximum message length is MAX_DATA_SIZE - 1, it is actually 17 bytes less. */ |
241 | return 0; | 242 | return 0; |
242 | uint8_t temp[MAX_DATA_SIZE]; | 243 | uint8_t temp[MAX_DATA_SIZE]; |
243 | temp[0] = PACKET_ID_MESSAGE; | ||
244 | theid = htonl(theid); | 244 | theid = htonl(theid); |
245 | memcpy(temp + 1, &theid, sizeof(theid)); | 245 | memcpy(temp, &theid, sizeof(theid)); |
246 | memcpy(temp + 1 + sizeof(theid), message, length); | 246 | memcpy(temp + sizeof(theid), message, length); |
247 | return write_cryptpacket(friendlist[friendnumber].crypt_connection_id, temp, length + 1 + sizeof(theid)); | 247 | return write_cryptpacket_id(friendlist[friendnumber].crypt_connection_id, PACKET_ID_MESSAGE, temp, length + sizeof(theid)); |
248 | } | 248 | } |
249 | 249 | ||
250 | /* send an action to an online friend | 250 | /* send an action to an online friend |
@@ -256,10 +256,7 @@ int m_sendaction(int friendnumber, uint8_t *action, uint32_t length) | |||
256 | return 0; | 256 | return 0; |
257 | if (length >= MAX_DATA_SIZE || friendlist[friendnumber].status != FRIEND_ONLINE) | 257 | if (length >= MAX_DATA_SIZE || friendlist[friendnumber].status != FRIEND_ONLINE) |
258 | return 0; | 258 | return 0; |
259 | uint8_t temp[MAX_DATA_SIZE]; | 259 | return write_cryptpacket_id(friendlist[friendnumber].crypt_connection_id, PACKET_ID_ACTION, action, length); |
260 | temp[0] = PACKET_ID_ACTION; | ||
261 | memcpy(temp + 1, action, length); | ||
262 | return write_cryptpacket(friendlist[friendnumber].crypt_connection_id, temp, length + 1); | ||
263 | } | 260 | } |
264 | 261 | ||
265 | /* send a name packet to friendnumber | 262 | /* send a name packet to friendnumber |
@@ -268,10 +265,7 @@ static int m_sendname(int friendnumber, uint8_t * name, uint16_t length) | |||
268 | { | 265 | { |
269 | if(length > MAX_NAME_LENGTH || length == 0) | 266 | if(length > MAX_NAME_LENGTH || length == 0) |
270 | return 0; | 267 | return 0; |
271 | uint8_t temp[MAX_NAME_LENGTH + 1]; | 268 | return write_cryptpacket_id(friendlist[friendnumber].crypt_connection_id, PACKET_ID_NICKNAME, name, length); |
272 | memcpy(temp + 1, name, length); | ||
273 | temp[0] = PACKET_ID_NICKNAME; | ||
274 | return write_cryptpacket(friendlist[friendnumber].crypt_connection_id, temp, length + 1); | ||
275 | } | 269 | } |
276 | 270 | ||
277 | /* set the name of a friend | 271 | /* set the name of a friend |
@@ -399,22 +393,12 @@ USERSTATUS m_get_self_userstatus(void) | |||
399 | 393 | ||
400 | static int send_statusmessage(int friendnumber, uint8_t * status, uint16_t length) | 394 | static int send_statusmessage(int friendnumber, uint8_t * status, uint16_t length) |
401 | { | 395 | { |
402 | uint8_t *thepacket = malloc(length + 1); | 396 | return write_cryptpacket_id(friendlist[friendnumber].crypt_connection_id, PACKET_ID_STATUSMESSAGE, status, length); |
403 | memcpy(thepacket + 1, status, length); | ||
404 | thepacket[0] = PACKET_ID_STATUSMESSAGE; | ||
405 | int written = write_cryptpacket(friendlist[friendnumber].crypt_connection_id, thepacket, length + 1); | ||
406 | free(thepacket); | ||
407 | return written; | ||
408 | } | 397 | } |
409 | 398 | ||
410 | static int send_userstatus(int friendnumber, USERSTATUS status) | 399 | static int send_userstatus(int friendnumber, USERSTATUS status) |
411 | { | 400 | { |
412 | uint8_t *thepacket = malloc(1 + 1); | 401 | return write_cryptpacket_id(friendlist[friendnumber].crypt_connection_id, PACKET_ID_USERSTATUS, (uint8_t*)&status, sizeof(USERSTATUS)); |
413 | memcpy(thepacket + 1, &status, 1); | ||
414 | thepacket[0] = PACKET_ID_USERSTATUS; | ||
415 | int written = write_cryptpacket(friendlist[friendnumber].crypt_connection_id, thepacket, 1 + 1); | ||
416 | free(thepacket); | ||
417 | return written; | ||
418 | } | 402 | } |
419 | 403 | ||
420 | static int set_friend_statusmessage(int friendnumber, uint8_t * status, uint16_t length) | 404 | static int set_friend_statusmessage(int friendnumber, uint8_t * status, uint16_t length) |
@@ -517,6 +501,14 @@ static void set_friend_status(int friendnumber, uint8_t status) | |||
517 | friendlist[friendnumber].status = status; | 501 | friendlist[friendnumber].status = status; |
518 | } | 502 | } |
519 | 503 | ||
504 | static int write_cryptpacket_id(int crypt_connection_id, uint8_t packet_id, uint8_t *data, uint32_t length) | ||
505 | { | ||
506 | uint8_t packet[length + 1]; | ||
507 | packet[0] = packet_id; | ||
508 | memcpy(packet + 1, data, length); | ||
509 | return write_cryptpacket(crypt_connection_id, packet, length + 1); | ||
510 | } | ||
511 | |||
520 | #define PORT 33445 | 512 | #define PORT 33445 |
521 | /* run this at startup */ | 513 | /* run this at startup */ |
522 | int initMessenger(void) | 514 | int initMessenger(void) |
@@ -619,11 +611,7 @@ static void doFriends(void) | |||
619 | } | 611 | } |
620 | case PACKET_ID_MESSAGE: { | 612 | case PACKET_ID_MESSAGE: { |
621 | if (friendlist[i].receives_read_receipts) { | 613 | if (friendlist[i].receives_read_receipts) { |
622 | uint8_t *thepacket = malloc(5); | 614 | write_cryptpacket_id(friendlist[i].crypt_connection_id, PACKET_ID_RECEIPT, temp + 1, 4); |
623 | thepacket[0] = PACKET_ID_RECEIPT; | ||
624 | memcpy(thepacket + 1, temp + 1, 4); | ||
625 | write_cryptpacket(friendlist[i].crypt_connection_id, thepacket, 5); | ||
626 | free(thepacket); | ||
627 | } | 615 | } |
628 | if (friend_message_isset) | 616 | if (friend_message_isset) |
629 | (*friend_message)(i, temp + 5, len - 5); | 617 | (*friend_message)(i, temp + 5, len - 5); |