summaryrefslogtreecommitdiff
path: root/toxcore/onion_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/onion_client.c')
-rw-r--r--toxcore/onion_client.c69
1 files changed, 33 insertions, 36 deletions
diff --git a/toxcore/onion_client.c b/toxcore/onion_client.c
index 3b130602..8ba1fdc5 100644
--- a/toxcore/onion_client.c
+++ b/toxcore/onion_client.c
@@ -638,7 +638,12 @@ static int handle_fakeid_announce(void *object, const uint8_t *source_pubkey, co
638 return 1; 638 return 1;
639 639
640 onion_c->friends_list[friend_num].last_noreplay = no_replay; 640 onion_c->friends_list[friend_num].last_noreplay = no_replay;
641 onion_set_friend_DHT_pubkey(onion_c, friend_num, data + 1 + sizeof(uint64_t), current_time_monotonic()); 641
642 if (onion_c->friends_list[friend_num].dht_pk_callback)
643 onion_c->friends_list[friend_num].dht_pk_callback(onion_c->friends_list[friend_num].dht_pk_callback_object,
644 onion_c->friends_list[friend_num].dht_pk_callback_number, data + 1 + sizeof(uint64_t));
645
646 onion_set_friend_DHT_pubkey(onion_c, friend_num, data + 1 + sizeof(uint64_t));
642 onion_c->friends_list[friend_num].last_seen = unix_time(); 647 onion_c->friends_list[friend_num].last_seen = unix_time();
643 648
644 uint16_t len_nodes = length - FAKEID_DATA_MIN_LENGTH; 649 uint16_t len_nodes = length - FAKEID_DATA_MIN_LENGTH;
@@ -957,8 +962,8 @@ int onion_delfriend(Onion_Client *onion_c, int friend_num)
957 if ((uint32_t)friend_num >= onion_c->num_friends) 962 if ((uint32_t)friend_num >= onion_c->num_friends)
958 return -1; 963 return -1;
959 964
960 if (onion_c->friends_list[friend_num].is_fake_clientid) 965 //if (onion_c->friends_list[friend_num].is_fake_clientid)
961 DHT_delfriend(onion_c->dht, onion_c->friends_list[friend_num].fake_client_id); 966 // DHT_delfriend(onion_c->dht, onion_c->friends_list[friend_num].fake_client_id, 0);
962 967
963 memset(&(onion_c->friends_list[friend_num]), 0, sizeof(Onion_Friend)); 968 memset(&(onion_c->friends_list[friend_num]), 0, sizeof(Onion_Friend));
964 uint32_t i; 969 uint32_t i;
@@ -996,22 +1001,37 @@ int recv_tcp_relay_handler(Onion_Client *onion_c, int friend_num, int (*tcp_rela
996 return 0; 1001 return 0;
997} 1002}
998 1003
999/* Set a friends DHT public key. 1004/* Set the function for this friend that will be callbacked with object and number
1000 * timestamp is the time (current_time_monotonic()) at which the key was last confirmed belonging to 1005 * when that friend gives us his DHT temporary public key.
1001 * the other peer. 1006 *
1007 * object and number will be passed as argument to this function.
1002 * 1008 *
1003 * return -1 on failure. 1009 * return -1 on failure.
1004 * return 0 on success. 1010 * return 0 on success.
1005 */ 1011 */
1006int onion_set_friend_DHT_pubkey(Onion_Client *onion_c, int friend_num, const uint8_t *dht_key, uint64_t timestamp) 1012int onion_dht_pk_callback(Onion_Client *onion_c, int friend_num, void (*function)(void *data, int32_t number,
1013 const uint8_t *dht_public_key), void *object, uint32_t number)
1007{ 1014{
1008 if ((uint32_t)friend_num >= onion_c->num_friends) 1015 if ((uint32_t)friend_num >= onion_c->num_friends)
1009 return -1; 1016 return -1;
1010 1017
1011 if (onion_c->friends_list[friend_num].status == 0) 1018 onion_c->friends_list[friend_num].dht_pk_callback = function;
1019 onion_c->friends_list[friend_num].dht_pk_callback_object = object;
1020 onion_c->friends_list[friend_num].dht_pk_callback_number = number;
1021 return 0;
1022}
1023
1024/* Set a friends DHT public key.
1025 *
1026 * return -1 on failure.
1027 * return 0 on success.
1028 */
1029int onion_set_friend_DHT_pubkey(Onion_Client *onion_c, int friend_num, const uint8_t *dht_key)
1030{
1031 if ((uint32_t)friend_num >= onion_c->num_friends)
1012 return -1; 1032 return -1;
1013 1033
1014 if (onion_c->friends_list[friend_num].fake_client_id_timestamp >= timestamp) 1034 if (onion_c->friends_list[friend_num].status == 0)
1015 return -1; 1035 return -1;
1016 1036
1017 if (onion_c->friends_list[friend_num].is_fake_clientid) { 1037 if (onion_c->friends_list[friend_num].is_fake_clientid) {
@@ -1019,16 +1039,11 @@ int onion_set_friend_DHT_pubkey(Onion_Client *onion_c, int friend_num, const uin
1019 return -1; 1039 return -1;
1020 } 1040 }
1021 1041
1022 DHT_delfriend(onion_c->dht, onion_c->friends_list[friend_num].fake_client_id); 1042 onion_c->friends_list[friend_num].is_fake_clientid = 0;
1023 }
1024
1025 if (DHT_addfriend(onion_c->dht, dht_key) == 1) {
1026 return -1;
1027 } 1043 }
1028 1044
1029 onion_c->friends_list[friend_num].last_seen = unix_time(); 1045 onion_c->friends_list[friend_num].last_seen = unix_time();
1030 onion_c->friends_list[friend_num].is_fake_clientid = 1; 1046 onion_c->friends_list[friend_num].is_fake_clientid = 1;
1031 onion_c->friends_list[friend_num].fake_client_id_timestamp = timestamp;
1032 memcpy(onion_c->friends_list[friend_num].fake_client_id, dht_key, crypto_box_PUBLICKEYBYTES); 1047 memcpy(onion_c->friends_list[friend_num].fake_client_id, dht_key, crypto_box_PUBLICKEYBYTES);
1033 1048
1034 return 0; 1049 return 0;
@@ -1037,9 +1052,9 @@ int onion_set_friend_DHT_pubkey(Onion_Client *onion_c, int friend_num, const uin
1037/* Copy friends DHT public key into dht_key. 1052/* Copy friends DHT public key into dht_key.
1038 * 1053 *
1039 * return 0 on failure (no key copied). 1054 * return 0 on failure (no key copied).
1040 * return timestamp on success (key copied). 1055 * return 1 on success (key copied).
1041 */ 1056 */
1042uint64_t onion_getfriend_DHT_pubkey(const Onion_Client *onion_c, int friend_num, uint8_t *dht_key) 1057unsigned int onion_getfriend_DHT_pubkey(const Onion_Client *onion_c, int friend_num, uint8_t *dht_key)
1043{ 1058{
1044 if ((uint32_t)friend_num >= onion_c->num_friends) 1059 if ((uint32_t)friend_num >= onion_c->num_friends)
1045 return 0; 1060 return 0;
@@ -1051,7 +1066,7 @@ uint64_t onion_getfriend_DHT_pubkey(const Onion_Client *onion_c, int friend_num,
1051 return 0; 1066 return 0;
1052 1067
1053 memcpy(dht_key, onion_c->friends_list[friend_num].fake_client_id, crypto_box_PUBLICKEYBYTES); 1068 memcpy(dht_key, onion_c->friends_list[friend_num].fake_client_id, crypto_box_PUBLICKEYBYTES);
1054 return onion_c->friends_list[friend_num].fake_client_id_timestamp; 1069 return 1;
1055} 1070}
1056 1071
1057/* Get the ip of friend friendnum and put it in ip_port 1072/* Get the ip of friend friendnum and put it in ip_port
@@ -1189,23 +1204,6 @@ static void do_friend(Onion_Client *onion_c, uint16_t friendnum)
1189 } 1204 }
1190} 1205}
1191 1206
1192/* Timeout before which a peer is considered dead and removed from the DHT search. */
1193#define DEAD_ONION_TIMEOUT (10 * 60)
1194
1195static void cleanup_friend(Onion_Client *onion_c, uint16_t friendnum)
1196{
1197 if (friendnum >= onion_c->num_friends)
1198 return;
1199
1200 if (onion_c->friends_list[friendnum].status == 0)
1201 return;
1202
1203 if (onion_c->friends_list[friendnum].is_fake_clientid && !onion_c->friends_list[friendnum].is_online
1204 && is_timeout(onion_c->friends_list[friendnum].last_seen, DEAD_ONION_TIMEOUT)) {
1205 onion_c->friends_list[friendnum].is_fake_clientid = 0;
1206 DHT_delfriend(onion_c->dht, onion_c->friends_list[friendnum].fake_client_id);
1207 }
1208}
1209 1207
1210/* Function to call when onion data packet with contents beginning with byte is received. */ 1208/* Function to call when onion data packet with contents beginning with byte is received. */
1211void oniondata_registerhandler(Onion_Client *onion_c, uint8_t byte, oniondata_handler_callback cb, void *object) 1209void oniondata_registerhandler(Onion_Client *onion_c, uint8_t byte, oniondata_handler_callback cb, void *object)
@@ -1278,7 +1276,6 @@ void do_onion_client(Onion_Client *onion_c)
1278 if (onion_isconnected(onion_c)) { 1276 if (onion_isconnected(onion_c)) {
1279 for (i = 0; i < onion_c->num_friends; ++i) { 1277 for (i = 0; i < onion_c->num_friends; ++i) {
1280 do_friend(onion_c, i); 1278 do_friend(onion_c, i);
1281 cleanup_friend(onion_c, i);
1282 } 1279 }
1283 } 1280 }
1284 1281