summaryrefslogtreecommitdiff
path: root/core/Messenger.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/Messenger.c')
-rw-r--r--core/Messenger.c56
1 files changed, 32 insertions, 24 deletions
diff --git a/core/Messenger.c b/core/Messenger.c
index cb3d2551..25a4ff98 100644
--- a/core/Messenger.c
+++ b/core/Messenger.c
@@ -108,9 +108,8 @@ static uint16_t address_checksum(uint8_t *address, uint32_t len)
108 */ 108 */
109void getaddress(Messenger *m, uint8_t *address) 109void getaddress(Messenger *m, uint8_t *address)
110{ 110{
111 //memcpy(address, m->public_key, crypto_box_PUBLICKEYBYTES); //TODO 111 memcpy(address, m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES);
112 memcpy(address, self_public_key, crypto_box_PUBLICKEYBYTES); 112 uint32_t nospam = get_nospam(&(m->fr));
113 uint32_t nospam = get_nospam();
114 memcpy(address + crypto_box_PUBLICKEYBYTES, &nospam, sizeof(nospam)); 113 memcpy(address + crypto_box_PUBLICKEYBYTES, &nospam, sizeof(nospam));
115 uint16_t checksum = address_checksum(address, FRIEND_ADDRESS_SIZE - sizeof(checksum)); 114 uint16_t checksum = address_checksum(address, FRIEND_ADDRESS_SIZE - sizeof(checksum));
116 memcpy(address + crypto_box_PUBLICKEYBYTES + sizeof(nospam), &checksum, sizeof(checksum)); 115 memcpy(address + crypto_box_PUBLICKEYBYTES + sizeof(nospam), &checksum, sizeof(checksum));
@@ -150,7 +149,7 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length)
150 if (length < 1) 149 if (length < 1)
151 return FAERR_NOMESSAGE; 150 return FAERR_NOMESSAGE;
152 151
153 if (memcmp(client_id, self_public_key, crypto_box_PUBLICKEYBYTES) == 0) 152 if (memcmp(client_id, m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES) == 0)
154 return FAERR_OWNKEY; 153 return FAERR_OWNKEY;
155 154
156 int friend_id = getfriend_id(m, client_id); 155 int friend_id = getfriend_id(m, client_id);
@@ -176,7 +175,7 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length)
176 175
177 for (i = 0; i <= m->numfriends; ++i) { 176 for (i = 0; i <= m->numfriends; ++i) {
178 if (m->friendlist[i].status == NOFRIEND) { 177 if (m->friendlist[i].status == NOFRIEND) {
179 DHT_addfriend(client_id); 178 DHT_addfriend(m->dht, client_id);
180 m->friendlist[i].status = FRIEND_ADDED; 179 m->friendlist[i].status = FRIEND_ADDED;
181 m->friendlist[i].crypt_connection_id = -1; 180 m->friendlist[i].crypt_connection_id = -1;
182 m->friendlist[i].friendrequest_lastsent = 0; 181 m->friendlist[i].friendrequest_lastsent = 0;
@@ -216,7 +215,7 @@ int m_addfriend_norequest(Messenger *m, uint8_t *client_id)
216 215
217 for (i = 0; i <= m->numfriends; ++i) { 216 for (i = 0; i <= m->numfriends; ++i) {
218 if (m->friendlist[i].status == NOFRIEND) { 217 if (m->friendlist[i].status == NOFRIEND) {
219 DHT_addfriend(client_id); 218 DHT_addfriend(m->dht, client_id);
220 m->friendlist[i].status = FRIEND_CONFIRMED; 219 m->friendlist[i].status = FRIEND_CONFIRMED;
221 m->friendlist[i].crypt_connection_id = -1; 220 m->friendlist[i].crypt_connection_id = -1;
222 m->friendlist[i].friendrequest_lastsent = 0; 221 m->friendlist[i].friendrequest_lastsent = 0;
@@ -245,7 +244,7 @@ int m_delfriend(Messenger *m, int friendnumber)
245 if (friendnumber >= m->numfriends || friendnumber < 0) 244 if (friendnumber >= m->numfriends || friendnumber < 0)
246 return -1; 245 return -1;
247 246
248 DHT_delfriend(m->friendlist[friendnumber].client_id); 247 DHT_delfriend(m->dht, m->friendlist[friendnumber].client_id);
249 crypto_kill(m->net_crypto, m->friendlist[friendnumber].crypt_connection_id); 248 crypto_kill(m->net_crypto, m->friendlist[friendnumber].crypt_connection_id);
250 free(m->friendlist[friendnumber].statusmessage); 249 free(m->friendlist[friendnumber].statusmessage);
251 memset(&(m->friendlist[friendnumber]), 0, sizeof(Friend)); 250 memset(&(m->friendlist[friendnumber]), 0, sizeof(Friend));
@@ -522,7 +521,7 @@ void m_set_sends_receipts(Messenger *m, int friendnumber, int yesno)
522/* set the function that will be executed when a friend request is received. */ 521/* set the function that will be executed when a friend request is received. */
523void m_callback_friendrequest(Messenger *m, void (*function)(uint8_t *, uint8_t *, uint16_t, void *), void *userdata) 522void m_callback_friendrequest(Messenger *m, void (*function)(uint8_t *, uint8_t *, uint16_t, void *), void *userdata)
524{ 523{
525 callback_friendrequest(function, userdata); 524 callback_friendrequest(&(m->fr), function, userdata);
526} 525}
527 526
528/* set the function that will be executed when a message from a friend is received. */ 527/* set the function that will be executed when a message from a friend is received. */
@@ -617,7 +616,7 @@ int write_cryptpacket_id(Messenger *m, int friendnumber, uint8_t packet_id, uint
617/*Send a LAN discovery packet every LAN_DISCOVERY_INTERVAL seconds*/ 616/*Send a LAN discovery packet every LAN_DISCOVERY_INTERVAL seconds*/
618int LANdiscovery(timer *t, void *arg) 617int LANdiscovery(timer *t, void *arg)
619{ 618{
620 send_LANdiscovery(htons(PORT)); 619 send_LANdiscovery(htons(PORT), temp_net_crypto);
621 timer_start(t, LAN_DISCOVERY_INTERVAL); 620 timer_start(t, LAN_DISCOVERY_INTERVAL);
622 return 0; 621 return 0;
623} 622}
@@ -637,19 +636,26 @@ Messenger *initMessenger(void)
637 } 636 }
638 m->net_crypto = new_net_crypto(m->net); 637 m->net_crypto = new_net_crypto(m->net);
639 if (m->net_crypto == NULL) { 638 if (m->net_crypto == NULL) {
639 kill_networking(m->net);
640 free(m);
641 return NULL;
642 }
643 m->dht = new_DHT(m->net_crypto);
644 if (m->dht == NULL) {
645 kill_net_crypto(m->net_crypto);
646 kill_networking(m->net);
640 free(m); 647 free(m);
641 free(m->net);
642 return NULL; 648 return NULL;
643 } 649 }
644 new_keys(m->net_crypto); 650 new_keys(m->net_crypto);
645 m_set_statusmessage(m, (uint8_t *)"Online", sizeof("Online")); 651 m_set_statusmessage(m, (uint8_t *)"Online", sizeof("Online"));
646 652
647 DHT_init(); 653 friendreq_init(&(m->fr), m->net_crypto);
648 friendreq_init(); 654 LANdiscovery_init(m->dht);
649 LANdiscovery_init(); 655 set_nospam(&(m->fr), random_int());
650 set_nospam(random_int()); 656 init_cryptopackets(m->dht);
651 657
652 send_LANdiscovery(htons(PORT)); 658 send_LANdiscovery(htons(PORT), m->net_crypto);
653 timer_single(&LANdiscovery, 0, LAN_DISCOVERY_INTERVAL); 659 timer_single(&LANdiscovery, 0, LAN_DISCOVERY_INTERVAL);
654 660
655 return m; 661 return m;
@@ -661,7 +667,9 @@ void cleanupMessenger(Messenger *m)
661 /* FIXME TODO ideally cleanupMessenger will mirror initMessenger 667 /* FIXME TODO ideally cleanupMessenger will mirror initMessenger
662 * this requires the other modules to expose cleanup functions 668 * this requires the other modules to expose cleanup functions
663 */ 669 */
670 kill_DHT(m->dht);
664 kill_net_crypto(m->net_crypto); 671 kill_net_crypto(m->net_crypto);
672 kill_networking(m->net);
665 free(m->friendlist); 673 free(m->friendlist);
666 free(m); 674 free(m);
667} 675}
@@ -677,7 +685,7 @@ void doFriends(Messenger *m)
677 685
678 for (i = 0; i < m->numfriends; ++i) { 686 for (i = 0; i < m->numfriends; ++i) {
679 if (m->friendlist[i].status == FRIEND_ADDED) { 687 if (m->friendlist[i].status == FRIEND_ADDED) {
680 int fr = send_friendrequest(m->friendlist[i].client_id, m->friendlist[i].friendrequest_nospam, m->friendlist[i].info, 688 int fr = send_friendrequest(m->dht, m->friendlist[i].client_id, m->friendlist[i].friendrequest_nospam, m->friendlist[i].info,
681 m->friendlist[i].info_size); 689 m->friendlist[i].info_size);
682 690
683 if (fr >= 0) { 691 if (fr >= 0) {
@@ -699,7 +707,7 @@ void doFriends(Messenger *m)
699 } 707 }
700 } 708 }
701 709
702 IP_Port friendip = DHT_getfriendip(m->friendlist[i].client_id); 710 IP_Port friendip = DHT_getfriendip(m->dht, m->friendlist[i].client_id);
703 711
704 switch (is_cryptoconnected(m->net_crypto, m->friendlist[i].crypt_connection_id)) { 712 switch (is_cryptoconnected(m->net_crypto, m->friendlist[i].crypt_connection_id)) {
705 case 0: 713 case 0:
@@ -883,7 +891,7 @@ void doMessenger(Messenger *m)
883{ 891{
884 networking_poll(m->net); 892 networking_poll(m->net);
885 893
886 doDHT(); 894 do_DHT(m->dht);
887 do_net_crypto(m->net_crypto); 895 do_net_crypto(m->net_crypto);
888 doInbound(m); 896 doInbound(m);
889 doFriends(m); 897 doFriends(m);
@@ -897,7 +905,7 @@ uint32_t Messenger_size(Messenger *m)
897 return crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES 905 return crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES
898 + sizeof(uint32_t) // nospam 906 + sizeof(uint32_t) // nospam
899 + sizeof(uint32_t) // DHT size 907 + sizeof(uint32_t) // DHT size
900 + DHT_size() // DHT itself 908 + DHT_size(m->dht) // DHT itself
901 + sizeof(uint32_t) // Friendlist size 909 + sizeof(uint32_t) // Friendlist size
902 + sizeof(Friend) * m->numfriends // Friendlist itself 910 + sizeof(Friend) * m->numfriends // Friendlist itself
903 + sizeof(uint16_t) // Own nickname length 911 + sizeof(uint16_t) // Own nickname length
@@ -910,13 +918,13 @@ void Messenger_save(Messenger *m, uint8_t *data)
910{ 918{
911 save_keys(m->net_crypto, data); 919 save_keys(m->net_crypto, data);
912 data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES; 920 data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES;
913 uint32_t nospam = get_nospam(); 921 uint32_t nospam = get_nospam(&(m->fr));
914 memcpy(data, &nospam, sizeof(nospam)); 922 memcpy(data, &nospam, sizeof(nospam));
915 data += sizeof(nospam); 923 data += sizeof(nospam);
916 uint32_t size = DHT_size(); 924 uint32_t size = DHT_size(m->dht);
917 memcpy(data, &size, sizeof(size)); 925 memcpy(data, &size, sizeof(size));
918 data += sizeof(size); 926 data += sizeof(size);
919 DHT_save(data); 927 DHT_save(m->dht, data);
920 data += size; 928 data += size;
921 size = sizeof(Friend) * m->numfriends; 929 size = sizeof(Friend) * m->numfriends;
922 memcpy(data, &size, sizeof(size)); 930 memcpy(data, &size, sizeof(size));
@@ -943,7 +951,7 @@ int Messenger_load(Messenger *m, uint8_t *data, uint32_t length)
943 data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES; 951 data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES;
944 uint32_t nospam; 952 uint32_t nospam;
945 memcpy(&nospam, data, sizeof(nospam)); 953 memcpy(&nospam, data, sizeof(nospam));
946 set_nospam(nospam); 954 set_nospam(&(m->fr), nospam);
947 data += sizeof(nospam); 955 data += sizeof(nospam);
948 uint32_t size; 956 uint32_t size;
949 memcpy(&size, data, sizeof(size)); 957 memcpy(&size, data, sizeof(size));
@@ -954,7 +962,7 @@ int Messenger_load(Messenger *m, uint8_t *data, uint32_t length)
954 962
955 length -= size; 963 length -= size;
956 964
957 if (DHT_load(data, size) == -1) 965 if (DHT_load(m->dht, data, size) == -1)
958 return -1; 966 return -1;
959 967
960 data += size; 968 data += size;