diff options
Diffstat (limited to 'toxcore/onion_client.c')
-rw-r--r-- | toxcore/onion_client.c | 69 |
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 | */ |
1006 | int onion_set_friend_DHT_pubkey(Onion_Client *onion_c, int friend_num, const uint8_t *dht_key, uint64_t timestamp) | 1012 | int 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 | */ | ||
1029 | int 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 | */ |
1042 | uint64_t onion_getfriend_DHT_pubkey(const Onion_Client *onion_c, int friend_num, uint8_t *dht_key) | 1057 | unsigned 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 | |||
1195 | static 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. */ |
1211 | void oniondata_registerhandler(Onion_Client *onion_c, uint8_t byte, oniondata_handler_callback cb, void *object) | 1209 | void 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 | ||