From 1207304f0b66385b2131a3dd0badf41bd25561a4 Mon Sep 17 00:00:00 2001 From: irungentoo Date: Fri, 16 Aug 2013 18:57:00 -0400 Subject: Metadata collection prevention part 2 of ??? Improved friend request sending. As a side effect friend requests should now be routed less than before. See added comments for details. --- core/DHT.c | 20 +++++++++++++++----- core/Messenger.c | 25 +++++++++++++++---------- core/Messenger.h | 6 +++++- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/core/DHT.c b/core/DHT.c index 226a38ca..55f34994 100644 --- a/core/DHT.c +++ b/core/DHT.c @@ -741,8 +741,8 @@ IP_Port DHT_getfriendip(uint8_t *client_id) return empty; } -/* Ping each client in the "friends" list every 60 seconds. Send a get nodes request - * every 20 seconds to a random good node for each "friend" in our "friends" list. +/* Ping each client in the "friends" list every PING_INTERVAL seconds. Send a get nodes request + * every GET_NODE_INTERVAL seconds to a random good node for each "friend" in our "friends" list. */ static void doDHTFriends(void) { @@ -783,8 +783,8 @@ static void doDHTFriends(void) static uint64_t close_lastgetnodes; -/* Ping each client in the close nodes list every 60 seconds. - * Send a get nodes request every 20 seconds to a random good node in the list. +/* Ping each client in the close nodes list every PING_INTERVAL seconds. + * Send a get nodes request every GET_NODE_INTERVAL seconds to a random good node in the list. */ static void doClose(void) { @@ -823,6 +823,7 @@ static void doClose(void) void DHT_bootstrap(IP_Port ip_port, uint8_t *public_key) { getnodes(ip_port, public_key, self_public_key); + send_ping_request(ip_port, (clientid_t *) public_key); } /* send the given packet to node with client_id @@ -875,8 +876,11 @@ static int friend_iplist(IP_Port *ip_portlist, uint16_t friend_num) return num_ips; } + /* Send the following packet to everyone who tells us they are connected to friend_id * returns the number of nodes it sent the packet to + * + * Only works if more than (MAX_FRIEND_CLIENTS / 2) return an ip for friend. */ int route_tofriend(uint8_t *friend_id, uint8_t *packet, uint32_t length) { @@ -886,6 +890,13 @@ int route_tofriend(uint8_t *friend_id, uint8_t *packet, uint32_t length) return 0; uint32_t i, sent = 0; + + IP_Port ip_list[MAX_FRIEND_CLIENTS]; + int ip_num = friend_iplist(ip_list, num); + + if (ip_num < (MAX_FRIEND_CLIENTS / 2)) + return 0; + uint64_t temp_time = unix_time(); Friend *friend = &friends_list[num]; Client_data *client; @@ -895,7 +906,6 @@ int route_tofriend(uint8_t *friend_id, uint8_t *packet, uint32_t length) /*If ip is not zero and node is good */ if (client->ret_ip_port.ip.i != 0 && !is_timeout(temp_time, client->ret_timestamp, BAD_NODE_TIMEOUT)) { - if (sendpacket(client->ip_port, packet, length) == length) ++sent; } diff --git a/core/Messenger.c b/core/Messenger.c index 09032067..d88fe51a 100644 --- a/core/Messenger.c +++ b/core/Messenger.c @@ -172,7 +172,8 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length) DHT_addfriend(client_id); m->friendlist[i].status = FRIEND_ADDED; m->friendlist[i].crypt_connection_id = -1; - m->friendlist[i].friend_request_id = -1; + m->friendlist[i].friendrequest_lastsent = 0; + m->friendlist[i].friendrequest_timeout = FRIENDREQUEST_TIMEOUT; memcpy(m->friendlist[i].client_id, client_id, CLIENT_ID_SIZE); m->friendlist[i].statusmessage = calloc(1, 1); m->friendlist[i].statusmessage_length = 1; @@ -205,9 +206,9 @@ int m_addfriend_norequest(Messenger *m, uint8_t *client_id) for (i = 0; i <= m->numfriends; ++i) { if (m->friendlist[i].status == NOFRIEND) { DHT_addfriend(client_id); - m->friendlist[i].status = FRIEND_REQUESTED; + m->friendlist[i].status = FRIEND_CONFIRMED; m->friendlist[i].crypt_connection_id = -1; - m->friendlist[i].friend_request_id = -1; + m->friendlist[i].friendrequest_lastsent = 0; memcpy(m->friendlist[i].client_id, client_id, CLIENT_ID_SIZE); m->friendlist[i].statusmessage = calloc(1, 1); m->friendlist[i].statusmessage_length = 1; @@ -622,6 +623,7 @@ Messenger *initMessenger(void) LANdiscovery_init(); set_nospam(random_int()); + send_LANdiscovery(htons(PORT)); timer_single(&LANdiscovery, 0, LAN_DISCOVERY_INTERVAL); return m; @@ -650,19 +652,22 @@ void doFriends(Messenger *m) int fr = send_friendrequest(m->friendlist[i].client_id, m->friendlist[i].friendrequest_nospam, m->friendlist[i].info, m->friendlist[i].info_size); - if (fr == 0) /* TODO: This needs to be fixed so that it sends the friend requests a couple of times in case of packet loss */ - set_friend_status(m, i, FRIEND_REQUESTED); - else if (fr > 0) + if (fr >= 0) { set_friend_status(m, i, FRIEND_REQUESTED); + m->friendlist[i].friendrequest_lastsent = unix_time(); + } } if (m->friendlist[i].status == FRIEND_REQUESTED || m->friendlist[i].status == FRIEND_CONFIRMED) { /* friend is not online */ if (m->friendlist[i].status == FRIEND_REQUESTED) { - if (m->friendlist[i].friend_request_id + 10 < unix_time()) { /*I know this is hackish but it should work.*/ - send_friendrequest(m->friendlist[i].client_id, m->friendlist[i].friendrequest_nospam, m->friendlist[i].info, - m->friendlist[i].info_size); - m->friendlist[i].friend_request_id = unix_time(); + /* If we didn't connect to friend after successfully sending him a friend request the request is deemed + unsuccessful so we set the status back to FRIEND_ADDED and try again.*/ + if (m->friendlist[i].friendrequest_lastsent + m->friendlist[i].friendrequest_timeout < unix_time()) { + set_friend_status(m, i, FRIEND_ADDED); + /* Double the default timeout everytime if friendrequest is assumed to have been + sent unsuccessfully. */ + m->friendlist[i].friendrequest_timeout *= 2; } } diff --git a/core/Messenger.h b/core/Messenger.h index cd9e6e63..20ea33fb 100644 --- a/core/Messenger.h +++ b/core/Messenger.h @@ -68,6 +68,9 @@ extern "C" { /* don't assume MAX_STATUSMESSAGE_LENGTH will stay at 128, it may be increased to an absurdly large number later */ +/* Default start timeout in seconds between friend requests */ +#define FRIENDREQUEST_TIMEOUT 5; + /* USERSTATUS * Represents userstatuses someone can have. */ @@ -82,7 +85,8 @@ USERSTATUS; typedef struct { uint8_t client_id[CLIENT_ID_SIZE]; int crypt_connection_id; - uint64_t friend_request_id; /* id of the friend request corresponding to the current friend request to the current friend. */ + uint64_t friendrequest_lastsent; /* time at which the last friend request was sent. */ + uint32_t friendrequest_timeout; /* The timeout between successful friendrequest sending attempts */ uint8_t status; /* 0 if no friend, 1 if added, 2 if friend request sent, 3 if confirmed friend, 4 if online. */ uint8_t info[MAX_DATA_SIZE]; /* the data that is sent during the friend requests we do */ uint8_t name[MAX_NAME_LENGTH]; -- cgit v1.2.3