Passed everything through astyle.

This commit is contained in:
irungentoo 2013-08-16 13:11:09 -04:00
parent c5af8f44a9
commit 88ff81d9de
46 changed files with 3107 additions and 2471 deletions

View File

@ -10,8 +10,8 @@
void rand_bytes(uint8_t *b, size_t blen) void rand_bytes(uint8_t *b, size_t blen)
{ {
size_t i; size_t i;
for (i = 0; i < blen; i++)
{ for (i = 0; i < blen; i++) {
b[i] = rand(); b[i] = rand();
} }
} }
@ -86,7 +86,8 @@ START_TEST(test_known)
unsigned char m[131]; unsigned char m[131];
int clen, mlen; int clen, mlen;
ck_assert_msg(sizeof(c) == sizeof(m) + ENCRYPTION_PADDING * sizeof(unsigned char), "cyphertext should be ENCRYPTION_PADDING bytes longer than plaintext"); ck_assert_msg(sizeof(c) == sizeof(m) + ENCRYPTION_PADDING * sizeof(unsigned char),
"cyphertext should be ENCRYPTION_PADDING bytes longer than plaintext");
ck_assert_msg(sizeof(test_c) == sizeof(c), "sanity check failed"); ck_assert_msg(sizeof(test_c) == sizeof(c), "sanity check failed");
ck_assert_msg(sizeof(test_m) == sizeof(m), "sanity check failed"); ck_assert_msg(sizeof(test_m) == sizeof(m), "sanity check failed");
@ -111,7 +112,8 @@ START_TEST(test_fast_known)
encrypt_precompute(bobpk, alicesk, k); encrypt_precompute(bobpk, alicesk, k);
ck_assert_msg(sizeof(c) == sizeof(m) + ENCRYPTION_PADDING * sizeof(unsigned char), "cyphertext should be ENCRYPTION_PADDING bytes longer than plaintext"); ck_assert_msg(sizeof(c) == sizeof(m) + ENCRYPTION_PADDING * sizeof(unsigned char),
"cyphertext should be ENCRYPTION_PADDING bytes longer than plaintext");
ck_assert_msg(sizeof(test_c) == sizeof(c), "sanity check failed"); ck_assert_msg(sizeof(test_c) == sizeof(c), "sanity check failed");
ck_assert_msg(sizeof(test_m) == sizeof(m), "sanity check failed"); ck_assert_msg(sizeof(test_m) == sizeof(m), "sanity check failed");
@ -156,8 +158,7 @@ START_TEST(test_endtoend)
int testno; int testno;
// Test 100 random messages and keypairs // Test 100 random messages and keypairs
for (testno = 0; testno < 100; testno++) for (testno = 0; testno < 100; testno++) {
{
//Generate random message (random length from 100 to 500) //Generate random message (random length from 100 to 500)
mlen = (rand() % 400) + 100; mlen = (rand() % 400) + 100;
rand_bytes(m, mlen); rand_bytes(m, mlen);
@ -181,7 +182,8 @@ START_TEST(test_endtoend)
ck_assert_msg(c1len == c2len && c1len == c3len && c1len == c4len, "cyphertext lengths differ"); ck_assert_msg(c1len == c2len && c1len == c3len && c1len == c4len, "cyphertext lengths differ");
ck_assert_msg(c1len == mlen + ENCRYPTION_PADDING, "wrong cyphertext length"); ck_assert_msg(c1len == mlen + ENCRYPTION_PADDING, "wrong cyphertext length");
ck_assert_msg(memcmp(c1, c2, c1len) == 0 && memcmp(c1, c3, c1len) == 0 && memcmp(c1, c4, c1len) == 0, "crypertexts differ"); ck_assert_msg(memcmp(c1, c2, c1len) == 0 && memcmp(c1, c3, c1len) == 0
&& memcmp(c1, c4, c1len) == 0, "crypertexts differ");
//Decrypt all four ways //Decrypt all four ways
m1len = decrypt_data(pk2, sk1, n, c1, c1len, m1); m1len = decrypt_data(pk2, sk1, n, c1, c1len, m1);
@ -191,7 +193,8 @@ START_TEST(test_endtoend)
ck_assert_msg(m1len == m2len && m1len == m3len && m1len == m4len, "decrypted text lengths differ"); ck_assert_msg(m1len == m2len && m1len == m3len && m1len == m4len, "decrypted text lengths differ");
ck_assert_msg(m1len == mlen, "wrong decrypted text length"); ck_assert_msg(m1len == mlen, "wrong decrypted text length");
ck_assert_msg(memcmp(m1, m2, mlen) == 0 && memcmp(m1, m3, mlen) == 0 && memcmp(m1, m4, mlen) == 0, "decrypted texts differ"); ck_assert_msg(memcmp(m1, m2, mlen) == 0 && memcmp(m1, m3, mlen) == 0
&& memcmp(m1, m4, mlen) == 0, "decrypted texts differ");
ck_assert_msg(memcmp(m1, m, mlen) == 0, "wrong decrypted text"); ck_assert_msg(memcmp(m1, m, mlen) == 0, "wrong decrypted text");
} }
} }

5
auto_tests/friends_test.c Executable file → Normal file
View File

@ -91,8 +91,10 @@ int parent_friend_request(void)
/* wait on the status change */ /* wait on the status change */
for (i = 0; i < WAIT_COUNT; i++) { for (i = 0; i < WAIT_COUNT; i++) {
do_tox(); do_tox();
if (request_flags & FIRST_FLAG) if (request_flags & FIRST_FLAG)
break; break;
fputs(".", stdout); fputs(".", stdout);
fflush(stdout); fflush(stdout);
c_sleep(WAIT_TIME); c_sleep(WAIT_TIME);
@ -130,8 +132,10 @@ int parent_wait_for_message(void)
for (i = 0; i < WAIT_COUNT; i++) { for (i = 0; i < WAIT_COUNT; i++) {
do_tox(); do_tox();
if (request_flags & SECOND_FLAG) if (request_flags & SECOND_FLAG)
break; break;
fputs(".", stdout); fputs(".", stdout);
fflush(stdout); fflush(stdout);
c_sleep(WAIT_TIME); c_sleep(WAIT_TIME);
@ -165,6 +169,7 @@ int main(int argc, char *argv[])
MAP_SHARED | MAP_ANONYMOUS, -1, 0); MAP_SHARED | MAP_ANONYMOUS, -1, 0);
fputs("friends_test: Starting test...\n", stdout); fputs("friends_test: Starting test...\n", stdout);
if ((child_pid = fork()) == 0) { if ((child_pid = fork()) == 0) {
/* child */ /* child */
int i = 0; int i = 0;

View File

@ -42,8 +42,10 @@ unsigned char * hex_string_to_bin(char hex_string[])
unsigned char *val = calloc(1, len); unsigned char *val = calloc(1, len);
char *pos = hex_string; char *pos = hex_string;
int i = 0; int i = 0;
for (i = 0; i < len; ++i, pos += 2) for (i = 0; i < len; ++i, pos += 2)
sscanf(pos, "%2hhx", &val[i]); sscanf(pos, "%2hhx", &val[i]);
return val; return val;
} }
@ -157,6 +159,7 @@ START_TEST(test_setname)
if (setname(m, (uint8_t *)good_name, bad_length) != -1) if (setname(m, (uint8_t *)good_name, bad_length) != -1)
ck_abort_msg("setname() did NOT error on %d as a length argument!\n", ck_abort_msg("setname() did NOT error on %d as a length argument!\n",
bad_length); bad_length);
if (setname(m, (uint8_t *)good_name, good_length) != 0) if (setname(m, (uint8_t *)good_name, good_length) != 0)
ck_abort_msg("setname() did NOT return 0 on good arguments!\n"); ck_abort_msg("setname() did NOT return 0 on good arguments!\n");
} }

View File

@ -133,9 +133,11 @@ static int id_closest(uint8_t * id, uint8_t * id1, uint8_t * id2)
if (distance1 < distance2) if (distance1 < distance2)
return 1; return 1;
if (distance1 > distance2) if (distance1 > distance2)
return 2; return 2;
} }
return 0; return 0;
} }
@ -180,6 +182,7 @@ static int client_in_list(Client_data * list, uint32_t length, uint8_t * client_
return 1; return 1;
} }
} }
return 0; return 0;
} }
@ -246,6 +249,7 @@ static int get_close_nodes(uint8_t * client_id, Node_format * nodes_list)
closest = id_closest( client_id, closest = id_closest( client_id,
nodes_list[j].client_id, nodes_list[j].client_id,
close_clientlist[i].client_id ); close_clientlist[i].client_id );
if (closest == 2) { if (closest == 2) {
memcpy( nodes_list[j].client_id, memcpy( nodes_list[j].client_id,
close_clientlist[i].client_id, close_clientlist[i].client_id,
@ -284,6 +288,7 @@ static int get_close_nodes(uint8_t * client_id, Node_format * nodes_list)
closest = id_closest( client_id, closest = id_closest( client_id,
nodes_list[k].client_id, nodes_list[k].client_id,
friends_list[i].client_list[j].client_id ); friends_list[i].client_list[j].client_id );
if (closest == 2) { if (closest == 2) {
memcpy( nodes_list[k].client_id, memcpy( nodes_list[k].client_id,
friends_list[i].client_list[j].client_id, friends_list[i].client_list[j].client_id,
@ -296,6 +301,7 @@ static int get_close_nodes(uint8_t * client_id, Node_format * nodes_list)
} }
} }
} }
return num_nodes; return num_nodes;
} }
@ -310,6 +316,7 @@ static int replace_bad( Client_data * list,
{ {
uint32_t i; uint32_t i;
uint64_t temp_time = unix_time(); uint64_t temp_time = unix_time();
for (i = 0; i < length; ++i) { for (i = 0; i < length; ++i) {
/* if node is bad */ /* if node is bad */
if (is_timeout(temp_time, list[i].timestamp, BAD_NODE_TIMEOUT)) { if (is_timeout(temp_time, list[i].timestamp, BAD_NODE_TIMEOUT)) {
@ -331,9 +338,12 @@ static void sort_list(Client_data *list, uint32_t length, uint8_t *comp_client_i
{ {
if (length == 0) if (length == 0)
return; return;
uint32_t i, count; uint32_t i, count;
while (1) { while (1) {
count = 0; count = 0;
for (i = 0; i < (length - 1); ++i) { for (i = 0; i < (length - 1); ++i) {
if (id_closest(comp_client_id, list[i].client_id, list[i + 1].client_id) == 1) { if (id_closest(comp_client_id, list[i].client_id, list[i + 1].client_id) == 1) {
Client_data temp = list[i + 1]; Client_data temp = list[i + 1];
@ -342,6 +352,7 @@ static void sort_list(Client_data *list, uint32_t length, uint8_t *comp_client_i
++count; ++count;
} }
} }
if (count == 0) if (count == 0)
return; return;
} }
@ -635,6 +646,7 @@ static int handle_sendnodes(IP_Port source, uint8_t * packet, uint32_t length)
return 1; return 1;
memcpy(&ping_id, plain, sizeof(ping_id)); memcpy(&ping_id, plain, sizeof(ping_id));
if (!is_gettingnodes(source, ping_id)) if (!is_gettingnodes(source, ping_id))
return 1; return 1;
@ -644,6 +656,7 @@ static int handle_sendnodes(IP_Port source, uint8_t * packet, uint32_t length)
addto_lists(source, packet + 1); addto_lists(source, packet + 1);
uint32_t i; uint32_t i;
for (i = 0; i < num_nodes; ++i) { for (i = 0; i < num_nodes; ++i) {
send_ping_request(nodes_list[i].ip_port, (clientid_t *) &nodes_list[i].client_id); send_ping_request(nodes_list[i].ip_port, (clientid_t *) &nodes_list[i].client_id);
returnedip_ports(nodes_list[i].ip_port, nodes_list[i].client_id, packet + 1); returnedip_ports(nodes_list[i].ip_port, nodes_list[i].client_id, packet + 1);
@ -659,8 +672,10 @@ int DHT_addfriend(uint8_t * client_id)
{ {
if (friend_number(client_id) != -1) /*Is friend already in DHT?*/ if (friend_number(client_id) != -1) /*Is friend already in DHT?*/
return 1; return 1;
Friend *temp; Friend *temp;
temp = realloc(friends_list, sizeof(Friend) * (num_friends + 1)); temp = realloc(friends_list, sizeof(Friend) * (num_friends + 1));
if (temp == NULL) if (temp == NULL)
return 1; return 1;
@ -677,6 +692,7 @@ int DHT_delfriend(uint8_t * client_id)
{ {
uint32_t i; uint32_t i;
Friend *temp; Friend *temp;
for (i = 0; i < num_friends; ++i) { for (i = 0; i < num_friends; ++i) {
/* Equal */ /* Equal */
if (id_equal(friends_list[i].client_id, client_id)) { if (id_equal(friends_list[i].client_id, client_id)) {
@ -689,6 +705,7 @@ int DHT_delfriend(uint8_t * client_id)
} }
temp = realloc(friends_list, sizeof(Friend) * (num_friends)); temp = realloc(friends_list, sizeof(Friend) * (num_friends));
if (temp == NULL) if (temp == NULL)
return 1; return 1;
@ -711,12 +728,15 @@ IP_Port DHT_getfriendip(uint8_t * client_id)
/* Equal */ /* Equal */
if (id_equal(friends_list[i].client_id, client_id)) { if (id_equal(friends_list[i].client_id, client_id)) {
for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) { for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) {
if (id_equal(friends_list[i].client_list[j].client_id, client_id) && !is_timeout(temp_time, friends_list[i].client_list[j].timestamp, BAD_NODE_TIMEOUT)) if (id_equal(friends_list[i].client_list[j].client_id, client_id)
&& !is_timeout(temp_time, friends_list[i].client_list[j].timestamp, BAD_NODE_TIMEOUT))
return friends_list[i].client_list[j].ip_port; return friends_list[i].client_list[j].ip_port;
} }
return empty; return empty;
} }
} }
empty.ip.i = 1; empty.ip.i = 1;
return empty; return empty;
} }
@ -733,6 +753,7 @@ static void doDHTFriends(void)
for (i = 0; i < num_friends; ++i) { for (i = 0; i < num_friends; ++i) {
uint32_t num_nodes = 0; uint32_t num_nodes = 0;
for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) { for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) {
/* if node is not dead. */ /* if node is not dead. */
if (!is_timeout(temp_time, friends_list[i].client_list[j].timestamp, Kill_NODE_TIMEOUT)) { if (!is_timeout(temp_time, friends_list[i].client_list[j].timestamp, Kill_NODE_TIMEOUT)) {
@ -741,6 +762,7 @@ static void doDHTFriends(void)
(clientid_t *) &friends_list[i].client_list[j].client_id ); (clientid_t *) &friends_list[i].client_list[j].client_id );
friends_list[i].client_list[j].last_pinged = temp_time; friends_list[i].client_list[j].last_pinged = temp_time;
} }
/* if node is good. */ /* if node is good. */
if (!is_timeout(temp_time, friends_list[i].client_list[j].timestamp, BAD_NODE_TIMEOUT)) { if (!is_timeout(temp_time, friends_list[i].client_list[j].timestamp, BAD_NODE_TIMEOUT)) {
index[num_nodes] = j; index[num_nodes] = j;
@ -748,6 +770,7 @@ static void doDHTFriends(void)
} }
} }
} }
if (friends_list[i].lastgetnode + GET_NODE_INTERVAL <= temp_time && num_nodes != 0) { if (friends_list[i].lastgetnode + GET_NODE_INTERVAL <= temp_time && num_nodes != 0) {
rand_node = rand() % num_nodes; rand_node = rand() % num_nodes;
getnodes( friends_list[i].client_list[index[rand_node]].ip_port, getnodes( friends_list[i].client_list[index[rand_node]].ip_port,
@ -779,6 +802,7 @@ static void doClose(void)
(clientid_t *) &close_clientlist[i].client_id ); (clientid_t *) &close_clientlist[i].client_id );
close_clientlist[i].last_pinged = temp_time; close_clientlist[i].last_pinged = temp_time;
} }
/* if node is good. */ /* if node is good. */
if (!is_timeout(temp_time, close_clientlist[i].timestamp, BAD_NODE_TIMEOUT)) { if (!is_timeout(temp_time, close_clientlist[i].timestamp, BAD_NODE_TIMEOUT)) {
index[num_nodes] = i; index[num_nodes] = i;
@ -847,6 +871,7 @@ static int friend_iplist(IP_Port * ip_portlist, uint16_t friend_num)
++num_ips; ++num_ips;
} }
} }
return num_ips; return num_ips;
} }
@ -856,6 +881,7 @@ static int friend_iplist(IP_Port * ip_portlist, uint16_t friend_num)
int route_tofriend(uint8_t *friend_id, uint8_t *packet, uint32_t length) int route_tofriend(uint8_t *friend_id, uint8_t *packet, uint32_t length)
{ {
int num = friend_number(friend_id); int num = friend_number(friend_id);
if (num == -1) if (num == -1)
return 0; return 0;
@ -874,6 +900,7 @@ int route_tofriend(uint8_t * friend_id, uint8_t * packet, uint32_t length)
++sent; ++sent;
} }
} }
return sent; return sent;
} }
@ -883,6 +910,7 @@ int route_tofriend(uint8_t * friend_id, uint8_t * packet, uint32_t length)
static int routeone_tofriend(uint8_t *friend_id, uint8_t *packet, uint32_t length) static int routeone_tofriend(uint8_t *friend_id, uint8_t *packet, uint32_t length)
{ {
int num = friend_number(friend_id); int num = friend_number(friend_id);
if (num == -1) if (num == -1)
return 0; return 0;
@ -903,10 +931,13 @@ static int routeone_tofriend(uint8_t * friend_id, uint8_t * packet, uint32_t len
++n; ++n;
} }
} }
if (n < 1) if (n < 1)
return 0; return 0;
if (sendpacket(ip_list[rand() % n], packet, length) == length) if (sendpacket(ip_list[rand() % n], packet, length) == length)
return 1; return 1;
return 0; return 0;
} }
@ -919,11 +950,13 @@ static int routeone_tofriend(uint8_t * friend_id, uint8_t * packet, uint32_t len
int friend_ips(IP_Port *ip_portlist, uint8_t *friend_id) int friend_ips(IP_Port *ip_portlist, uint8_t *friend_id)
{ {
uint32_t i; uint32_t i;
for (i = 0; i < num_friends; ++i) { for (i = 0; i < num_friends; ++i) {
/* Equal */ /* Equal */
if (id_equal(friends_list[i].client_id, friend_id)) if (id_equal(friends_list[i].client_id, friend_id))
return friend_iplist(ip_portlist, i); return friend_iplist(ip_portlist, i);
} }
return -1; return -1;
} }
@ -952,6 +985,7 @@ static int send_NATping(uint8_t * public_key, uint64_t ping_id, uint8_t type)
if (num == 0) if (num == 0)
return -1; return -1;
return num; return num;
} }
@ -962,6 +996,7 @@ static int handle_NATping(IP_Port source, uint8_t * source_pubkey, uint8_t * pac
memcpy(&ping_id, packet + 1, sizeof(uint64_t)); memcpy(&ping_id, packet + 1, sizeof(uint64_t));
int friendnumber = friend_number(source_pubkey); int friendnumber = friend_number(source_pubkey);
if (friendnumber == -1) if (friendnumber == -1)
return 1; return 1;
@ -979,6 +1014,7 @@ static int handle_NATping(IP_Port source, uint8_t * source_pubkey, uint8_t * pac
return 0; return 0;
} }
} }
return 1; return 1;
} }
@ -990,6 +1026,7 @@ static int handle_NATping(IP_Port source, uint8_t * source_pubkey, uint8_t * pac
static IP NAT_commonip(IP_Port *ip_portlist, uint16_t len, uint16_t min_num) static IP NAT_commonip(IP_Port *ip_portlist, uint16_t len, uint16_t min_num)
{ {
IP zero = {{0}}; IP zero = {{0}};
if (len > MAX_FRIEND_CLIENTS) if (len > MAX_FRIEND_CLIENTS)
return zero; return zero;
@ -1001,9 +1038,11 @@ static IP NAT_commonip(IP_Port * ip_portlist, uint16_t len, uint16_t min_num)
if (ip_portlist[i].ip.i == ip_portlist[j].ip.i) if (ip_portlist[i].ip.i == ip_portlist[j].ip.i)
++numbers[i]; ++numbers[i];
} }
if (numbers[i] >= min_num) if (numbers[i] >= min_num)
return ip_portlist[i].ip; return ip_portlist[i].ip;
} }
return zero; return zero;
} }
@ -1023,6 +1062,7 @@ static uint16_t NAT_getports(uint16_t * portlist, IP_Port * ip_portlist, uint16_
++num; ++num;
} }
} }
return num; return num;
} }
@ -1040,6 +1080,7 @@ static void punch_holes(IP ip, uint16_t * port_list, uint16_t numports, uint16_t
IP_Port pinging = {ip, htons(port)}; IP_Port pinging = {ip, htons(port)};
send_ping_request(pinging, (clientid_t *) &friends_list[friend_num].client_id); send_ping_request(pinging, (clientid_t *) &friends_list[friend_num].client_id);
} }
friends_list[friend_num].punching_index = i; friends_list[friend_num].punching_index = i;
} }
@ -1060,11 +1101,13 @@ static void doNAT(void)
send_NATping(friends_list[i].client_id, friends_list[i].NATping_id, 0); /*0 is request*/ send_NATping(friends_list[i].client_id, friends_list[i].NATping_id, 0); /*0 is request*/
friends_list[i].NATping_timestamp = temp_time; friends_list[i].NATping_timestamp = temp_time;
} }
if (friends_list[i].hole_punching == 1 && if (friends_list[i].hole_punching == 1 &&
friends_list[i].punching_timestamp + PUNCH_INTERVAL < temp_time && friends_list[i].punching_timestamp + PUNCH_INTERVAL < temp_time &&
friends_list[i].recvNATping_timestamp + PUNCH_INTERVAL * 2 >= temp_time) { friends_list[i].recvNATping_timestamp + PUNCH_INTERVAL * 2 >= temp_time) {
IP ip = NAT_commonip(ip_list, num, MAX_FRIEND_CLIENTS / 2); IP ip = NAT_commonip(ip_list, num, MAX_FRIEND_CLIENTS / 2);
if (ip.i == 0) if (ip.i == 0)
continue; continue;
@ -1094,7 +1137,9 @@ int add_toping(uint8_t *client_id, IP_Port ip_port)
{ {
if (ip_port.ip.i == 0) if (ip_port.ip.i == 0)
return -1; return -1;
uint32_t i; uint32_t i;
for (i = 0; i < MAX_TOPING; ++i) { for (i = 0; i < MAX_TOPING; ++i) {
if (toping[i].ip_port.ip.i == 0) { if (toping[i].ip_port.ip.i == 0) {
memcpy(toping[i].client_id, client_id, CLIENT_ID_SIZE); memcpy(toping[i].client_id, client_id, CLIENT_ID_SIZE);
@ -1103,6 +1148,7 @@ int add_toping(uint8_t *client_id, IP_Port ip_port)
return 0; return 0;
} }
} }
for (i = 0; i < MAX_TOPING; ++i) { for (i = 0; i < MAX_TOPING; ++i) {
if (id_closest(self_public_key, toping[i].client_id, client_id) == 2) { if (id_closest(self_public_key, toping[i].client_id, client_id) == 2) {
memcpy(toping[i].client_id, client_id, CLIENT_ID_SIZE); memcpy(toping[i].client_id, client_id, CLIENT_ID_SIZE);
@ -1111,6 +1157,7 @@ int add_toping(uint8_t *client_id, IP_Port ip_port)
return 0; return 0;
} }
} }
return -1; return -1;
} }
@ -1119,13 +1166,17 @@ int add_toping(uint8_t *client_id, IP_Port ip_port)
static void do_toping() static void do_toping()
{ {
uint64_t temp_time = unix_time(); uint64_t temp_time = unix_time();
if (!is_timeout(temp_time, last_toping, TIME_TOPING)) if (!is_timeout(temp_time, last_toping, TIME_TOPING))
return; return;
last_toping = temp_time; last_toping = temp_time;
uint32_t i; uint32_t i;
for (i = 0; i < MAX_TOPING; ++i) { for (i = 0; i < MAX_TOPING; ++i) {
if (toping[i].ip_port.ip.i == 0) if (toping[i].ip_port.ip.i == 0)
return; return;
send_ping_request(toping[i].ip_port, (clientid_t *) toping[i].client_id); send_ping_request(toping[i].ip_port, (clientid_t *) toping[i].client_id);
toping[i].ip_port.ip.i = 0; toping[i].ip_port.ip.i = 0;
} }
@ -1192,11 +1243,13 @@ int DHT_load(uint8_t * data, uint32_t size)
for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) { for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) {
client = &tempfriends_list[i].client_list[j]; client = &tempfriends_list[i].client_list[j];
if (client->timestamp != 0) if (client->timestamp != 0)
getnodes(client->ip_port, client->client_id, tempfriends_list[i].client_id); getnodes(client->ip_port, client->client_id, tempfriends_list[i].client_id);
} }
} }
} }
Client_data *tempclose_clientlist = (Client_data *)data; Client_data *tempclose_clientlist = (Client_data *)data;
for (i = 0; i < LCLIENT_LIST; ++i) { for (i = 0; i < LCLIENT_LIST; ++i) {
@ -1204,6 +1257,7 @@ int DHT_load(uint8_t * data, uint32_t size)
DHT_bootstrap( tempclose_clientlist[i].ip_port, DHT_bootstrap( tempclose_clientlist[i].ip_port,
tempclose_clientlist[i].client_id ); tempclose_clientlist[i].client_id );
} }
return 0; return 0;
} }
@ -1219,5 +1273,6 @@ int DHT_isconnected(void)
if (!is_timeout(temp_time, close_clientlist[i].timestamp, BAD_NODE_TIMEOUT)) if (!is_timeout(temp_time, close_clientlist[i].timestamp, BAD_NODE_TIMEOUT))
return 1; return 1;
} }
return 0; return 0;
} }

View File

@ -51,6 +51,7 @@ static uint32_t get_broadcast(void)
ifconf.ifc_buf = (char *)i_faces; ifconf.ifc_buf = (char *)i_faces;
ifconf.ifc_len = sizeof(i_faces); ifconf.ifc_len = sizeof(i_faces);
count = ifconf.ifc_len / sizeof(struct ifreq); count = ifconf.ifc_len / sizeof(struct ifreq);
if (ioctl(sock, SIOCGIFCONF, &ifconf) < 0) { if (ioctl(sock, SIOCGIFCONF, &ifconf) < 0) {
perror("get_broadcast: ioctl() error"); perror("get_broadcast: ioctl() error");
return 0; return 0;
@ -69,7 +70,9 @@ static uint32_t get_broadcast(void)
break; break;
} }
} }
close(sock); close(sock);
if (sock_holder == NULL) { if (sock_holder == NULL) {
perror("[!] no broadcast device found"); perror("[!] no broadcast device found");
return 0; return 0;
@ -85,9 +88,11 @@ static IP broadcast_ip(void)
IP ip; IP ip;
#ifdef __linux #ifdef __linux
ip.i = get_broadcast(); ip.i = get_broadcast();
if (ip.i == 0) if (ip.i == 0)
/* error errored, but try anyway? */ /* error errored, but try anyway? */
ip.i = ~0; ip.i = ~0;
#else #else
ip.i = ~0; ip.i = ~0;
#endif #endif
@ -100,14 +105,19 @@ static int LAN_ip(IP ip)
{ {
if (ip.c[0] == 127)/* Loopback */ if (ip.c[0] == 127)/* Loopback */
return 0; return 0;
if (ip.c[0] == 10)/* 10.0.0.0 to 10.255.255.255 range */ if (ip.c[0] == 10)/* 10.0.0.0 to 10.255.255.255 range */
return 0; return 0;
if (ip.c[0] == 172 && ip.c[1] >= 16 && ip.c[1] <= 31)/* 172.16.0.0 to 172.31.255.255 range */ if (ip.c[0] == 172 && ip.c[1] >= 16 && ip.c[1] <= 31)/* 172.16.0.0 to 172.31.255.255 range */
return 0; return 0;
if (ip.c[0] == 192 && ip.c[1] == 168) /* 192.168.0.0 to 192.168.255.255 range */ if (ip.c[0] == 192 && ip.c[1] == 168) /* 192.168.0.0 to 192.168.255.255 range */
return 0; return 0;
if (ip.c[0] == 169 && ip.c[1] == 254 && ip.c[2] != 0 && ip.c[2] != 255)/* 169.254.1.0 to 169.254.254.255 range */ if (ip.c[0] == 169 && ip.c[1] == 254 && ip.c[2] != 0 && ip.c[2] != 255)/* 169.254.1.0 to 169.254.254.255 range */
return 0; return 0;
return -1; return -1;
} }
@ -115,8 +125,10 @@ static int handle_LANdiscovery(IP_Port source, uint8_t *packet, uint32_t length)
{ {
if (LAN_ip(source.ip) == -1) if (LAN_ip(source.ip) == -1)
return 1; return 1;
if (length != crypto_box_PUBLICKEYBYTES + 1) if (length != crypto_box_PUBLICKEYBYTES + 1)
return 1; return 1;
DHT_bootstrap(source, packet + 1); DHT_bootstrap(source, packet + 1);
return 0; return 0;
} }

View File

@ -130,6 +130,7 @@ static uint32_t connections_number; /* Number of connections in connections arra
int getconnection_id(IP_Port ip_port) int getconnection_id(IP_Port ip_port)
{ {
uint32_t i; uint32_t i;
for (i = 0; i < MAX_CONNECTIONS; ++i) { for (i = 0; i < MAX_CONNECTIONS; ++i) {
if (connections[i].ip_port.ip.i == ip_port.ip.i && if (connections[i].ip_port.ip.i == ip_port.ip.i &&
connections[i].ip_port.port == ip_port.port && connections[i].ip_port.port == ip_port.port &&
@ -152,11 +153,14 @@ static uint32_t randtable[6][256];
static uint32_t handshake_id(IP_Port source) static uint32_t handshake_id(IP_Port source)
{ {
uint32_t id = 0, i; uint32_t id = 0, i;
for (i = 0; i < 6; ++i) { for (i = 0; i < 6; ++i) {
if (randtable[i][((uint8_t *)&source)[i]] == 0) if (randtable[i][((uint8_t *)&source)[i]] == 0)
randtable[i][((uint8_t *)&source)[i]] = random_int(); randtable[i][((uint8_t *)&source)[i]] = random_int();
id ^= randtable[i][((uint8_t *)&source)[i]]; id ^= randtable[i][((uint8_t *)&source)[i]];
} }
if (id == 0) /* id can't be zero */ if (id == 0) /* id can't be zero */
id = 1; id = 1;
@ -183,6 +187,7 @@ static void change_handshake(IP_Port source)
int new_connection(IP_Port ip_port) int new_connection(IP_Port ip_port)
{ {
int connect = getconnection_id(ip_port); int connect = getconnection_id(ip_port);
if (connect != -1) if (connect != -1)
return connect; return connect;
@ -199,6 +204,7 @@ int new_connection(IP_Port ip_port)
} }
uint32_t i; uint32_t i;
for (i = 0; i < MAX_CONNECTIONS; ++i) { for (i = 0; i < MAX_CONNECTIONS; ++i) {
if (connections[i].status == 0) { if (connections[i].status == 0) {
memset(&connections[i], 0, sizeof(Connection)); memset(&connections[i], 0, sizeof(Connection));
@ -226,6 +232,7 @@ int new_connection(IP_Port ip_port)
return i; return i;
} }
} }
return -1; return -1;
} }
@ -252,6 +259,7 @@ static int new_inconnection(IP_Port ip_port)
} }
uint32_t i; uint32_t i;
for (i = 0; i < MAX_CONNECTIONS; ++i) { for (i = 0; i < MAX_CONNECTIONS; ++i) {
if (connections[i].status == 0) { if (connections[i].status == 0) {
memset(&connections[i], 0, sizeof(Connection)); memset(&connections[i], 0, sizeof(Connection));
@ -277,6 +285,7 @@ static int new_inconnection(IP_Port ip_port)
return i; return i;
} }
} }
return -1; return -1;
} }
@ -287,6 +296,7 @@ static int new_inconnection(IP_Port ip_port)
int incoming_connection(void) int incoming_connection(void)
{ {
uint32_t i; uint32_t i;
for (i = 0; i < MAX_CONNECTIONS; ++i) { for (i = 0; i < MAX_CONNECTIONS; ++i) {
if (connections[i].inbound == 2) { if (connections[i].inbound == 2) {
connections[i].inbound = 1; connections[i].inbound = 1;
@ -301,6 +311,7 @@ int incoming_connection(void)
static void free_connections(void) static void free_connections(void)
{ {
uint32_t i; uint32_t i;
for (i = connections_length; i != 0; --i) for (i = connections_length; i != 0; --i)
if (connections[i - 1].status != 0) if (connections[i - 1].status != 0)
break; break;
@ -310,6 +321,7 @@ static void free_connections(void)
Connection *temp; Connection *temp;
temp = realloc(connections, sizeof(Connection) * i); temp = realloc(connections, sizeof(Connection) * i);
if (temp == NULL && i != 0) if (temp == NULL && i != 0)
return; return;
@ -332,6 +344,7 @@ int kill_connection(int connection_id)
return 0; return 0;
} }
} }
return -1; return -1;
} }
@ -348,6 +361,7 @@ int kill_connection_in(int connection_id, uint32_t seconds)
return 0; return 0;
} }
} }
return -1; return -1;
} }
@ -363,6 +377,7 @@ int is_connected(int connection_id)
{ {
if (connection_id >= 0 && connection_id < MAX_CONNECTIONS) if (connection_id >= 0 && connection_id < MAX_CONNECTIONS)
return connections[connection_id].status; return connections[connection_id].status;
return 0; return 0;
} }
@ -371,6 +386,7 @@ IP_Port connection_ip(int connection_id)
{ {
if (connection_id >= 0 && connection_id < MAX_CONNECTIONS) if (connection_id >= 0 && connection_id < MAX_CONNECTIONS)
return connections[connection_id].ip_port; return connections[connection_id].ip_port;
IP_Port zero = {{{0}}, 0}; IP_Port zero = {{{0}}, 0};
return zero; return zero;
} }
@ -380,6 +396,7 @@ uint32_t sendqueue(int connection_id)
{ {
if (connection_id < 0 || connection_id >= MAX_CONNECTIONS) if (connection_id < 0 || connection_id >= MAX_CONNECTIONS)
return 0; return 0;
return connections[connection_id].sendbuff_packetnum - connections[connection_id].successful_sent; return connections[connection_id].sendbuff_packetnum - connections[connection_id].successful_sent;
} }
@ -388,6 +405,7 @@ uint32_t recvqueue(int connection_id)
{ {
if (connection_id < 0 || connection_id >= MAX_CONNECTIONS) if (connection_id < 0 || connection_id >= MAX_CONNECTIONS)
return 0; return 0;
return connections[connection_id].recv_packetnum - connections[connection_id].successful_read; return connections[connection_id].recv_packetnum - connections[connection_id].successful_read;
} }
@ -416,6 +434,7 @@ int read_packet(int connection_id, uint8_t * data)
connections[connection_id].recvbuffer[index].size = 0; connections[connection_id].recvbuffer[index].size = 0;
return size; return size;
} }
return 0; return 0;
} }
@ -530,6 +549,7 @@ static int send_DATA(uint32_t connection_id)
{ {
int ret; int ret;
uint32_t buffer[BUFFER_PACKET_NUM]; uint32_t buffer[BUFFER_PACKET_NUM];
if (connections[connection_id].num_req_paquets > 0) { if (connections[connection_id].num_req_paquets > 0) {
ret = send_data_packet(connection_id, connections[connection_id].req_packets[0]); ret = send_data_packet(connection_id, connections[connection_id].req_packets[0]);
connections[connection_id].num_req_paquets--; connections[connection_id].num_req_paquets--;
@ -537,11 +557,13 @@ static int send_DATA(uint32_t connection_id)
memcpy(connections[connection_id].req_packets, buffer, connections[connection_id].num_req_paquets * 4); memcpy(connections[connection_id].req_packets, buffer, connections[connection_id].num_req_paquets * 4);
return ret; return ret;
} }
if (connections[connection_id].sendbuff_packetnum != connections[connection_id].sent_packetnum) { if (connections[connection_id].sendbuff_packetnum != connections[connection_id].sent_packetnum) {
ret = send_data_packet(connection_id, connections[connection_id].sent_packetnum); ret = send_data_packet(connection_id, connections[connection_id].sent_packetnum);
connections[connection_id].sent_packetnum++; connections[connection_id].sent_packetnum++;
return ret; return ret;
} }
return 0; return 0;
} }
@ -573,6 +595,7 @@ static int handle_handshake(IP_Port source, uint8_t * packet, uint32_t length)
send_handshake(source, handshake_id(source), handshake_id1); send_handshake(source, handshake_id(source), handshake_id1);
return 0; return 0;
} }
if (is_connected(connection) != 1) if (is_connected(connection) != 1)
return 1; return 1;
@ -595,9 +618,11 @@ static int SYNC_valid(uint32_t length)
{ {
if (length < 4 + 4 + 2) if (length < 4 + 4 + 2)
return 0; return 0;
if (length > (BUFFER_PACKET_NUM * 4 + 4 + 4 + 2) || if (length > (BUFFER_PACKET_NUM * 4 + 4 + 4 + 2) ||
((length - 4 - 4 - 2) % 4) != 0) ((length - 4 - 4 - 2) % 4) != 0)
return 0; return 0;
return 1; return 1;
} }
@ -606,6 +631,7 @@ static int handle_SYNC1(IP_Port source, uint32_t recv_packetnum, uint32_t sent_p
{ {
if (handshake_id(source) == recv_packetnum) { if (handshake_id(source) == recv_packetnum) {
int x = new_inconnection(source); int x = new_inconnection(source);
if (x != -1) { if (x != -1) {
connections[x].orecv_packetnum = recv_packetnum; connections[x].orecv_packetnum = recv_packetnum;
connections[x].sent_packetnum = recv_packetnum; connections[x].sent_packetnum = recv_packetnum;
@ -618,6 +644,7 @@ static int handle_SYNC1(IP_Port source, uint32_t recv_packetnum, uint32_t sent_p
return x; return x;
} }
} }
return -1; return -1;
} }
@ -632,10 +659,12 @@ static int handle_SYNC2(int connection_id, uint8_t counter, uint32_t recv_packet
send_SYNC(connection_id); send_SYNC(connection_id);
return 0; return 0;
} }
return 1; return 1;
} }
/* case 3 in handle_SYNC: */ /* case 3 in handle_SYNC: */
static int handle_SYNC3(int connection_id, uint8_t counter, uint32_t recv_packetnum, uint32_t sent_packetnum, uint32_t * req_packets, static int handle_SYNC3(int connection_id, uint8_t counter, uint32_t recv_packetnum, uint32_t sent_packetnum,
uint32_t *req_packets,
uint16_t number) uint16_t number)
{ {
uint8_t comp_counter = (counter - connections[connection_id].recv_counter ); uint8_t comp_counter = (counter - connections[connection_id].recv_counter );
@ -666,6 +695,7 @@ static int handle_SYNC3(int connection_id, uint8_t counter, uint32_t recv_packet
connections[connection_id].num_req_paquets = number; connections[connection_id].num_req_paquets = number;
return 0; return 0;
} }
return 1; return 1;
} }
@ -701,6 +731,7 @@ static int handle_SYNC(IP_Port source, uint8_t *packet, uint32_t length)
if (connections[connection].status == 3) if (connections[connection].status == 3)
return handle_SYNC3(connection, counter, recv_packetnum, return handle_SYNC3(connection, counter, recv_packetnum,
sent_packetnum, req_packets, number); sent_packetnum, req_packets, number);
return 0; return 0;
} }
@ -785,6 +816,7 @@ static void doNew(void)
{ {
uint32_t i; uint32_t i;
uint64_t temp_time = current_time(); uint64_t temp_time = current_time();
for (i = 0; i < MAX_CONNECTIONS; ++i) { for (i = 0; i < MAX_CONNECTIONS; ++i) {
if (connections[i].status == 1) if (connections[i].status == 1)
if ((connections[i].last_sent + (1000000UL / connections[i].SYNC_rate)) <= temp_time) { if ((connections[i].last_sent + (1000000UL / connections[i].SYNC_rate)) <= temp_time) {
@ -809,6 +841,7 @@ static void doSYNC(void)
{ {
uint32_t i; uint32_t i;
uint64_t temp_time = current_time(); uint64_t temp_time = current_time();
for (i = 0; i < MAX_CONNECTIONS; ++i) { for (i = 0; i < MAX_CONNECTIONS; ++i) {
if (connections[i].status == 2 || connections[i].status == 3) if (connections[i].status == 2 || connections[i].status == 3)
if ((connections[i].last_SYNC + (1000000UL / connections[i].SYNC_rate)) <= temp_time) { if ((connections[i].last_SYNC + (1000000UL / connections[i].SYNC_rate)) <= temp_time) {
@ -823,11 +856,13 @@ static void doData(void)
uint32_t i; uint32_t i;
uint64_t j; uint64_t j;
uint64_t temp_time = current_time(); uint64_t temp_time = current_time();
for (i = 0; i < MAX_CONNECTIONS; ++i) for (i = 0; i < MAX_CONNECTIONS; ++i)
if (connections[i].status == 3 && sendqueue(i) != 0) if (connections[i].status == 3 && sendqueue(i) != 0)
if ((connections[i].last_sent + (1000000UL / connections[i].data_rate)) <= temp_time) { if ((connections[i].last_sent + (1000000UL / connections[i].data_rate)) <= temp_time) {
for (j = connections[i].last_sent; j < temp_time; j += (1000000UL / connections[i].data_rate)) for (j = connections[i].last_sent; j < temp_time; j += (1000000UL / connections[i].data_rate))
send_DATA(i); send_DATA(i);
connections[i].last_sent = temp_time; connections[i].last_sent = temp_time;
} }
} }
@ -843,9 +878,11 @@ static void adjustRates(void)
{ {
uint32_t i; uint32_t i;
uint64_t temp_time = current_time(); uint64_t temp_time = current_time();
for (i = 0; i < MAX_CONNECTIONS; ++i) { for (i = 0; i < MAX_CONNECTIONS; ++i) {
if (connections[i].status == 1 || connections[i].status == 2) if (connections[i].status == 1 || connections[i].status == 2)
connections[i].SYNC_rate = MAX_SYNC_RATE; connections[i].SYNC_rate = MAX_SYNC_RATE;
if (connections[i].status == 3) { if (connections[i].status == 3) {
if (sendqueue(i) != 0) { if (sendqueue(i) != 0) {
connections[i].data_rate = (BUFFER_PACKET_NUM - connections[i].num_req_paquets) * MAX_SYNC_RATE; connections[i].data_rate = (BUFFER_PACKET_NUM - connections[i].num_req_paquets) * MAX_SYNC_RATE;

View File

@ -35,10 +35,13 @@ static int write_cryptpacket_id(Messenger *m, int friendnumber, uint8_t packet_i
/* set the size of the friend list to numfriends /* set the size of the friend list to numfriends
return -1 if realloc fails */ return -1 if realloc fails */
int realloc_friendlist(Messenger *m, uint32_t num) { int realloc_friendlist(Messenger *m, uint32_t num)
{
Friend *newfriendlist = realloc(m->friendlist, num * sizeof(Friend)); Friend *newfriendlist = realloc(m->friendlist, num * sizeof(Friend));
if (newfriendlist == NULL) if (newfriendlist == NULL)
return -1; return -1;
memset(&newfriendlist[num - 1], 0, sizeof(Friend)); memset(&newfriendlist[num - 1], 0, sizeof(Friend));
m->friendlist = newfriendlist; m->friendlist = newfriendlist;
return 0; return 0;
@ -85,8 +88,10 @@ static uint16_t address_checksum(uint8_t *address, uint32_t len)
uint8_t checksum[2] = {0}; uint8_t checksum[2] = {0};
uint16_t check; uint16_t check;
uint32_t i; uint32_t i;
for (i = 0; i < len; ++i) for (i = 0; i < len; ++i)
checksum[i % 2] ^= address[i]; checksum[i % 2] ^= address[i];
memcpy(&check, checksum, sizeof(check)); memcpy(&check, checksum, sizeof(check));
return check; return check;
} }
@ -128,22 +133,30 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length)
- crypto_box_NONCEBYTES - crypto_box_BOXZEROBYTES - crypto_box_NONCEBYTES - crypto_box_BOXZEROBYTES
+ crypto_box_ZEROBYTES)) + crypto_box_ZEROBYTES))
return FAERR_TOOLONG; return FAERR_TOOLONG;
uint8_t client_id[crypto_box_PUBLICKEYBYTES]; uint8_t client_id[crypto_box_PUBLICKEYBYTES];
memcpy(client_id, address, crypto_box_PUBLICKEYBYTES); memcpy(client_id, address, crypto_box_PUBLICKEYBYTES);
uint16_t check, checksum = address_checksum(address, FRIEND_ADDRESS_SIZE - sizeof(checksum)); uint16_t check, checksum = address_checksum(address, FRIEND_ADDRESS_SIZE - sizeof(checksum));
memcpy(&check, address + crypto_box_PUBLICKEYBYTES + sizeof(uint32_t), sizeof(check)); memcpy(&check, address + crypto_box_PUBLICKEYBYTES + sizeof(uint32_t), sizeof(check));
if (check != checksum) if (check != checksum)
return FAERR_BADCHECKSUM; return FAERR_BADCHECKSUM;
if (length < 1) if (length < 1)
return FAERR_NOMESSAGE; return FAERR_NOMESSAGE;
if (memcmp(client_id, self_public_key, crypto_box_PUBLICKEYBYTES) == 0) if (memcmp(client_id, self_public_key, crypto_box_PUBLICKEYBYTES) == 0)
return FAERR_OWNKEY; return FAERR_OWNKEY;
int friend_id = getfriend_id(m, client_id); int friend_id = getfriend_id(m, client_id);
if (friend_id != -1) { if (friend_id != -1) {
uint32_t nospam; uint32_t nospam;
memcpy(&nospam, address + crypto_box_PUBLICKEYBYTES, sizeof(nospam)); memcpy(&nospam, address + crypto_box_PUBLICKEYBYTES, sizeof(nospam));
if (m->friendlist[friend_id].friendrequest_nospam == nospam) if (m->friendlist[friend_id].friendrequest_nospam == nospam)
return FAERR_ALREADYSENT; return FAERR_ALREADYSENT;
m->friendlist[friend_id].friendrequest_nospam = nospam; m->friendlist[friend_id].friendrequest_nospam = nospam;
return FAERR_SETNEWNOSPAM; return FAERR_SETNEWNOSPAM;
} }
@ -153,6 +166,7 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length)
return FAERR_NOMEM; return FAERR_NOMEM;
uint32_t i; uint32_t i;
for (i = 0; i <= m->numfriends; ++i) { for (i = 0; i <= m->numfriends; ++i) {
if (m->friendlist[i].status == NOFRIEND) { if (m->friendlist[i].status == NOFRIEND) {
DHT_addfriend(client_id); DHT_addfriend(client_id);
@ -173,6 +187,7 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length)
return i; return i;
} }
} }
return FAERR_UNKNOWN; return FAERR_UNKNOWN;
} }
@ -186,6 +201,7 @@ int m_addfriend_norequest(Messenger *m, uint8_t * client_id)
return FAERR_NOMEM; return FAERR_NOMEM;
uint32_t i; uint32_t i;
for (i = 0; i <= m->numfriends; ++i) { for (i = 0; i <= m->numfriends; ++i) {
if (m->friendlist[i].status == NOFRIEND) { if (m->friendlist[i].status == NOFRIEND) {
DHT_addfriend(client_id); DHT_addfriend(client_id);
@ -202,6 +218,7 @@ int m_addfriend_norequest(Messenger *m, uint8_t * client_id)
return i; return i;
} }
} }
return -1; return -1;
} }
@ -223,6 +240,7 @@ int m_delfriend(Messenger *m, int friendnumber)
if (m->friendlist[i - 1].status != NOFRIEND) if (m->friendlist[i - 1].status != NOFRIEND)
break; break;
} }
m->numfriends = i; m->numfriends = i;
if (realloc_friendlist(m, m->numfriends + 1) != 0) if (realloc_friendlist(m, m->numfriends + 1) != 0)
@ -240,6 +258,7 @@ int m_friendstatus(Messenger *m, int friendnumber)
{ {
if (friendnumber < 0 || friendnumber >= m->numfriends) if (friendnumber < 0 || friendnumber >= m->numfriends)
return NOFRIEND; return NOFRIEND;
return m->friendlist[friendnumber].status; return m->friendlist[friendnumber].status;
} }
@ -250,9 +269,12 @@ uint32_t m_sendmessage(Messenger *m, int friendnumber, uint8_t *message, uint32_
{ {
if (friendnumber < 0 || friendnumber >= m->numfriends) if (friendnumber < 0 || friendnumber >= m->numfriends)
return 0; return 0;
uint32_t msgid = ++m->friendlist[friendnumber].message_id; uint32_t msgid = ++m->friendlist[friendnumber].message_id;
if (msgid == 0) if (msgid == 0)
msgid = 1; /* otherwise, false error */ msgid = 1; /* otherwise, false error */
if (m_sendmessage_withid(m, friendnumber, msgid, message, length)) { if (m_sendmessage_withid(m, friendnumber, msgid, message, length)) {
return msgid; return msgid;
} }
@ -264,6 +286,7 @@ uint32_t m_sendmessage_withid(Messenger *m, int friendnumber, uint32_t theid, ui
{ {
if (length >= (MAX_DATA_SIZE - sizeof(theid))) if (length >= (MAX_DATA_SIZE - sizeof(theid)))
return 0; return 0;
uint8_t temp[MAX_DATA_SIZE]; uint8_t temp[MAX_DATA_SIZE];
theid = htonl(theid); theid = htonl(theid);
memcpy(temp, &theid, sizeof(theid)); memcpy(temp, &theid, sizeof(theid));
@ -285,6 +308,7 @@ static int m_sendname(Messenger *m, int friendnumber, uint8_t * name, uint16_t l
{ {
if (length > MAX_NAME_LENGTH || length == 0) if (length > MAX_NAME_LENGTH || length == 0)
return 0; return 0;
return write_cryptpacket_id(m, friendnumber, PACKET_ID_NICKNAME, name, length); return write_cryptpacket_id(m, friendnumber, PACKET_ID_NICKNAME, name, length);
} }
@ -295,6 +319,7 @@ static int setfriendname(Messenger *m, int friendnumber, uint8_t * name)
{ {
if (friendnumber >= m->numfriends || friendnumber < 0) if (friendnumber >= m->numfriends || friendnumber < 0)
return -1; return -1;
memcpy(m->friendlist[friendnumber].name, name, MAX_NAME_LENGTH); memcpy(m->friendlist[friendnumber].name, name, MAX_NAME_LENGTH);
return 0; return 0;
} }
@ -309,11 +334,14 @@ int setname(Messenger *m, uint8_t * name, uint16_t length)
{ {
if (length > MAX_NAME_LENGTH || length == 0) if (length > MAX_NAME_LENGTH || length == 0)
return -1; return -1;
memcpy(m->name, name, length); memcpy(m->name, name, length);
m->name_length = length; m->name_length = length;
uint32_t i; uint32_t i;
for (i = 0; i < m->numfriends; ++i) for (i = 0; i < m->numfriends; ++i)
m->friendlist[i].name_sent = 0; m->friendlist[i].name_sent = 0;
return 0; return 0;
} }
@ -344,6 +372,7 @@ int getname(Messenger *m, int friendnumber, uint8_t * name)
{ {
if (friendnumber >= m->numfriends || friendnumber < 0) if (friendnumber >= m->numfriends || friendnumber < 0)
return -1; return -1;
memcpy(name, m->friendlist[friendnumber].name, MAX_NAME_LENGTH); memcpy(name, m->friendlist[friendnumber].name, MAX_NAME_LENGTH);
return 0; return 0;
} }
@ -352,12 +381,15 @@ int m_set_statusmessage(Messenger *m, uint8_t *status, uint16_t length)
{ {
if (length > MAX_STATUSMESSAGE_LENGTH) if (length > MAX_STATUSMESSAGE_LENGTH)
return -1; return -1;
memcpy(m->statusmessage, status, length); memcpy(m->statusmessage, status, length);
m->statusmessage_length = length; m->statusmessage_length = length;
uint32_t i; uint32_t i;
for (i = 0; i < m->numfriends; ++i) for (i = 0; i < m->numfriends; ++i)
m->friendlist[i].statusmessage_sent = 0; m->friendlist[i].statusmessage_sent = 0;
return 0; return 0;
} }
@ -366,10 +398,13 @@ int m_set_userstatus(Messenger *m, USERSTATUS status)
if (status >= USERSTATUS_INVALID) { if (status >= USERSTATUS_INVALID) {
return -1; return -1;
} }
m->userstatus = status; m->userstatus = status;
uint32_t i; uint32_t i;
for (i = 0; i < m->numfriends; ++i) for (i = 0; i < m->numfriends; ++i)
m->friendlist[i].userstatus_sent = 0; m->friendlist[i].userstatus_sent = 0;
return 0; return 0;
} }
@ -379,6 +414,7 @@ int m_get_statusmessage_size(Messenger *m, int friendnumber)
{ {
if (friendnumber >= m->numfriends || friendnumber < 0) if (friendnumber >= m->numfriends || friendnumber < 0)
return -1; return -1;
return m->friendlist[friendnumber].statusmessage_length; return m->friendlist[friendnumber].statusmessage_length;
} }
@ -388,6 +424,7 @@ int m_copy_statusmessage(Messenger *m, int friendnumber, uint8_t * buf, uint32_t
{ {
if (friendnumber >= m->numfriends || friendnumber < 0) if (friendnumber >= m->numfriends || friendnumber < 0)
return -1; return -1;
memset(buf, 0, maxlen); memset(buf, 0, maxlen);
memcpy(buf, m->friendlist[friendnumber].statusmessage, MIN(maxlen, MAX_STATUSMESSAGE_LENGTH) - 1); memcpy(buf, m->friendlist[friendnumber].statusmessage, MIN(maxlen, MAX_STATUSMESSAGE_LENGTH) - 1);
return 0; return 0;
@ -404,10 +441,13 @@ USERSTATUS m_get_userstatus(Messenger *m, int friendnumber)
{ {
if (friendnumber >= m->numfriends || friendnumber < 0) if (friendnumber >= m->numfriends || friendnumber < 0)
return USERSTATUS_INVALID; return USERSTATUS_INVALID;
USERSTATUS status = m->friendlist[friendnumber].userstatus; USERSTATUS status = m->friendlist[friendnumber].userstatus;
if (status >= USERSTATUS_INVALID) { if (status >= USERSTATUS_INVALID) {
status = USERSTATUS_NONE; status = USERSTATUS_NONE;
} }
return status; return status;
} }
@ -431,6 +471,7 @@ static int set_friend_statusmessage(Messenger *m, int friendnumber, uint8_t * st
{ {
if (friendnumber >= m->numfriends || friendnumber < 0) if (friendnumber >= m->numfriends || friendnumber < 0)
return -1; return -1;
uint8_t *newstatus = calloc(length, 1); uint8_t *newstatus = calloc(length, 1);
memcpy(newstatus, status, length); memcpy(newstatus, status, length);
free(m->friendlist[friendnumber].statusmessage); free(m->friendlist[friendnumber].statusmessage);
@ -449,8 +490,10 @@ void m_set_sends_receipts(Messenger *m, int friendnumber, int yesno)
{ {
if (yesno != 0 || yesno != 1) if (yesno != 0 || yesno != 1)
return; return;
if (friendnumber >= m->numfriends || friendnumber < 0) if (friendnumber >= m->numfriends || friendnumber < 0)
return; return;
m->friendlist[friendnumber].receives_read_receipts = yesno; m->friendlist[friendnumber].receives_read_receipts = yesno;
} }
@ -462,7 +505,8 @@ void m_callback_friendrequest(Messenger *m, void (*function)(uint8_t *, uint8_t
} }
/* set the function that will be executed when a message from a friend is received. */ /* set the function that will be executed when a message from a friend is received. */
void m_callback_friendmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata) void m_callback_friendmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void *),
void *userdata)
{ {
m->friend_message = function; m->friend_message = function;
m->friend_message_userdata = userdata; m->friend_message_userdata = userdata;
@ -474,13 +518,15 @@ void m_callback_action(Messenger *m, void (*function)(Messenger *m, int, uint8_t
m->friend_action_userdata = userdata; m->friend_action_userdata = userdata;
} }
void m_callback_namechange(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata) void m_callback_namechange(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void *),
void *userdata)
{ {
m->friend_namechange = function; m->friend_namechange = function;
m->friend_namechange_userdata = userdata; m->friend_namechange_userdata = userdata;
} }
void m_callback_statusmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata) void m_callback_statusmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void *),
void *userdata)
{ {
m->friend_statusmessagechange = function; m->friend_statusmessagechange = function;
m->friend_statuschange_userdata = userdata; m->friend_statuschange_userdata = userdata;
@ -508,10 +554,13 @@ static void check_friend_connectionstatus(Messenger *m, int friendnumber, uint8_
{ {
if (!m->friend_connectionstatuschange) if (!m->friend_connectionstatuschange)
return; return;
if (status == NOFRIEND) if (status == NOFRIEND)
return; return;
const uint8_t was_connected = m->friendlist[friendnumber].status == FRIEND_ONLINE; const uint8_t was_connected = m->friendlist[friendnumber].status == FRIEND_ONLINE;
const uint8_t is_connected = status == FRIEND_ONLINE; const uint8_t is_connected = status == FRIEND_ONLINE;
if (is_connected != was_connected) if (is_connected != was_connected)
m->friend_connectionstatuschange(m, friendnumber, is_connected, m->friend_connectionstatuschange_userdata); m->friend_connectionstatuschange(m, friendnumber, is_connected, m->friend_connectionstatuschange_userdata);
} }
@ -526,8 +575,10 @@ int write_cryptpacket_id(Messenger *m, int friendnumber, uint8_t packet_id, uint
{ {
if (friendnumber < 0 || friendnumber >= m->numfriends) if (friendnumber < 0 || friendnumber >= m->numfriends)
return 0; return 0;
if (length >= MAX_DATA_SIZE || m->friendlist[friendnumber].status != FRIEND_ONLINE) if (length >= MAX_DATA_SIZE || m->friendlist[friendnumber].status != FRIEND_ONLINE)
return 0; return 0;
uint8_t packet[length + 1]; uint8_t packet[length + 1];
packet[0] = packet_id; packet[0] = packet_id;
memcpy(packet + 1, data, length); memcpy(packet + 1, data, length);
@ -552,6 +603,7 @@ int LANdiscovery(timer* t, void* arg)
Messenger *initMessenger(void) Messenger *initMessenger(void)
{ {
Messenger *m = calloc(1, sizeof(Messenger)); Messenger *m = calloc(1, sizeof(Messenger));
if ( ! m ) if ( ! m )
return 0; return 0;
@ -576,7 +628,8 @@ Messenger * initMessenger(void)
} }
/* run this before closing shop */ /* run this before closing shop */
void cleanupMessenger(Messenger *m){ void cleanupMessenger(Messenger *m)
{
/* FIXME TODO ideally cleanupMessenger will mirror initMessenger /* FIXME TODO ideally cleanupMessenger will mirror initMessenger
* this requires the other modules to expose cleanup functions * this requires the other modules to expose cleanup functions
*/ */
@ -591,115 +644,153 @@ void doFriends(Messenger *m)
uint32_t i; uint32_t i;
int len; int len;
uint8_t temp[MAX_DATA_SIZE]; uint8_t temp[MAX_DATA_SIZE];
for (i = 0; i < m->numfriends; ++i) { for (i = 0; i < m->numfriends; ++i) {
if (m->friendlist[i].status == FRIEND_ADDED) { if (m->friendlist[i].status == FRIEND_ADDED) {
int fr = send_friendrequest(m->friendlist[i].client_id, m->friendlist[i].friendrequest_nospam, m->friendlist[i].info, m->friendlist[i].info_size); 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 */ 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); set_friend_status(m, i, FRIEND_REQUESTED);
else if (fr > 0) else if (fr > 0)
set_friend_status(m, i, FRIEND_REQUESTED); set_friend_status(m, i, FRIEND_REQUESTED);
} }
if (m->friendlist[i].status == FRIEND_REQUESTED || m->friendlist[i].status == FRIEND_CONFIRMED) { /* friend is not online */
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].status == FRIEND_REQUESTED) {
if (m->friendlist[i].friend_request_id + 10 < unix_time()) { /*I know this is hackish but it should work.*/ 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); 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(); m->friendlist[i].friend_request_id = unix_time();
} }
} }
IP_Port friendip = DHT_getfriendip(m->friendlist[i].client_id); IP_Port friendip = DHT_getfriendip(m->friendlist[i].client_id);
switch (is_cryptoconnected(m->friendlist[i].crypt_connection_id)) { switch (is_cryptoconnected(m->friendlist[i].crypt_connection_id)) {
case 0: case 0:
if (friendip.ip.i > 1) if (friendip.ip.i > 1)
m->friendlist[i].crypt_connection_id = crypto_connect(m->friendlist[i].client_id, friendip); m->friendlist[i].crypt_connection_id = crypto_connect(m->friendlist[i].client_id, friendip);
break; break;
case 3: /* Connection is established */ case 3: /* Connection is established */
set_friend_status(m, i, FRIEND_ONLINE); set_friend_status(m, i, FRIEND_ONLINE);
m->friendlist[i].name_sent = 0; m->friendlist[i].name_sent = 0;
m->friendlist[i].userstatus_sent = 0; m->friendlist[i].userstatus_sent = 0;
m->friendlist[i].statusmessage_sent = 0; m->friendlist[i].statusmessage_sent = 0;
break; break;
case 4: case 4:
crypto_kill(m->friendlist[i].crypt_connection_id); crypto_kill(m->friendlist[i].crypt_connection_id);
m->friendlist[i].crypt_connection_id = -1; m->friendlist[i].crypt_connection_id = -1;
break; break;
default: default:
break; break;
} }
} }
while (m->friendlist[i].status == FRIEND_ONLINE) { /* friend is online */ while (m->friendlist[i].status == FRIEND_ONLINE) { /* friend is online */
if (m->friendlist[i].name_sent == 0) { if (m->friendlist[i].name_sent == 0) {
if (m_sendname(m, i, m->name, m->name_length)) if (m_sendname(m, i, m->name, m->name_length))
m->friendlist[i].name_sent = 1; m->friendlist[i].name_sent = 1;
} }
if (m->friendlist[i].statusmessage_sent == 0) { if (m->friendlist[i].statusmessage_sent == 0) {
if (send_statusmessage(m, i, m->statusmessage, m->statusmessage_length)) if (send_statusmessage(m, i, m->statusmessage, m->statusmessage_length))
m->friendlist[i].statusmessage_sent = 1; m->friendlist[i].statusmessage_sent = 1;
} }
if (m->friendlist[i].userstatus_sent == 0) { if (m->friendlist[i].userstatus_sent == 0) {
if (send_userstatus(m, i, m->userstatus)) if (send_userstatus(m, i, m->userstatus))
m->friendlist[i].userstatus_sent = 1; m->friendlist[i].userstatus_sent = 1;
} }
len = read_cryptpacket(m->friendlist[i].crypt_connection_id, temp); len = read_cryptpacket(m->friendlist[i].crypt_connection_id, temp);
uint8_t packet_id = temp[0]; uint8_t packet_id = temp[0];
uint8_t *data = temp + 1; uint8_t *data = temp + 1;
int data_length = len - 1; int data_length = len - 1;
if (len > 0) { if (len > 0) {
switch (packet_id) { switch (packet_id) {
case PACKET_ID_NICKNAME: { case PACKET_ID_NICKNAME: {
if (data_length >= MAX_NAME_LENGTH || data_length == 0) if (data_length >= MAX_NAME_LENGTH || data_length == 0)
break; break;
if (m->friend_namechange) if (m->friend_namechange)
m->friend_namechange(m, i, data, data_length, m->friend_namechange_userdata); m->friend_namechange(m, i, data, data_length, m->friend_namechange_userdata);
memcpy(m->friendlist[i].name, data, data_length); memcpy(m->friendlist[i].name, data, data_length);
m->friendlist[i].name[data_length - 1] = 0; /* make sure the NULL terminator is present. */ m->friendlist[i].name[data_length - 1] = 0; /* make sure the NULL terminator is present. */
break; break;
} }
case PACKET_ID_STATUSMESSAGE: { case PACKET_ID_STATUSMESSAGE: {
if (data_length == 0) if (data_length == 0)
break; break;
uint8_t *status = calloc(MIN(data_length, MAX_STATUSMESSAGE_LENGTH), 1); uint8_t *status = calloc(MIN(data_length, MAX_STATUSMESSAGE_LENGTH), 1);
memcpy(status, data, MIN(data_length, MAX_STATUSMESSAGE_LENGTH)); memcpy(status, data, MIN(data_length, MAX_STATUSMESSAGE_LENGTH));
if (m->friend_statusmessagechange) if (m->friend_statusmessagechange)
m->friend_statusmessagechange(m, i, status, MIN(data_length, MAX_STATUSMESSAGE_LENGTH), m->friend_statusmessagechange(m, i, status, MIN(data_length, MAX_STATUSMESSAGE_LENGTH),
m->friend_statuschange_userdata); m->friend_statuschange_userdata);
set_friend_statusmessage(m, i, status, MIN(data_length, MAX_STATUSMESSAGE_LENGTH)); set_friend_statusmessage(m, i, status, MIN(data_length, MAX_STATUSMESSAGE_LENGTH));
free(status); free(status);
break; break;
} }
case PACKET_ID_USERSTATUS: { case PACKET_ID_USERSTATUS: {
if (data_length != 1) if (data_length != 1)
break; break;
USERSTATUS status = data[0]; USERSTATUS status = data[0];
if (m->friend_userstatuschange) if (m->friend_userstatuschange)
m->friend_userstatuschange(m, i, status, m->friend_userstatuschange_userdata); m->friend_userstatuschange(m, i, status, m->friend_userstatuschange_userdata);
set_friend_userstatus(m, i, status); set_friend_userstatus(m, i, status);
break; break;
} }
case PACKET_ID_MESSAGE: { case PACKET_ID_MESSAGE: {
uint8_t *message_id = data; uint8_t *message_id = data;
uint8_t message_id_length = 4; uint8_t message_id_length = 4;
uint8_t *message = data + message_id_length; uint8_t *message = data + message_id_length;
uint16_t message_length = data_length - message_id_length; uint16_t message_length = data_length - message_id_length;
if (m->friendlist[i].receives_read_receipts) { if (m->friendlist[i].receives_read_receipts) {
write_cryptpacket_id(m, i, PACKET_ID_RECEIPT, message_id, message_id_length); write_cryptpacket_id(m, i, PACKET_ID_RECEIPT, message_id, message_id_length);
} }
if (m->friend_message) if (m->friend_message)
(*m->friend_message)(m, i, message, message_length, m->friend_message_userdata); (*m->friend_message)(m, i, message, message_length, m->friend_message_userdata);
break; break;
} }
case PACKET_ID_ACTION: { case PACKET_ID_ACTION: {
if (m->friend_action) if (m->friend_action)
(*m->friend_action)(m, i, data, data_length, m->friend_action_userdata); (*m->friend_action)(m, i, data, data_length, m->friend_action_userdata);
break; break;
} }
case PACKET_ID_RECEIPT: { case PACKET_ID_RECEIPT: {
uint32_t msgid; uint32_t msgid;
if (data_length < sizeof(msgid)) if (data_length < sizeof(msgid))
break; break;
memcpy(&msgid, data, sizeof(msgid)); memcpy(&msgid, data, sizeof(msgid));
msgid = ntohl(msgid); msgid = ntohl(msgid);
if (m->read_receipt) if (m->read_receipt)
(*m->read_receipt)(m, i, msgid, m->read_receipt_userdata); (*m->read_receipt)(m, i, msgid, m->read_receipt_userdata);
break; break;
} }
} }
@ -709,6 +800,7 @@ void doFriends(Messenger *m)
m->friendlist[i].crypt_connection_id = -1; m->friendlist[i].crypt_connection_id = -1;
set_friend_status(m, i, FRIEND_CONFIRMED); set_friend_status(m, i, FRIEND_CONFIRMED);
} }
break; break;
} }
} }
@ -721,8 +813,10 @@ void doInbound(Messenger *m)
uint8_t public_key[crypto_box_PUBLICKEYBYTES]; uint8_t public_key[crypto_box_PUBLICKEYBYTES];
uint8_t session_key[crypto_box_PUBLICKEYBYTES]; uint8_t session_key[crypto_box_PUBLICKEYBYTES];
int inconnection = crypto_inbound(public_key, secret_nonce, session_key); int inconnection = crypto_inbound(public_key, secret_nonce, session_key);
if (inconnection != -1) { if (inconnection != -1) {
int friend_id = getfriend_id(m, public_key); int friend_id = getfriend_id(m, public_key);
if (friend_id != -1) { if (friend_id != -1) {
crypto_kill(m->friendlist[friend_id].crypt_connection_id); crypto_kill(m->friendlist[friend_id].crypt_connection_id);
m->friendlist[friend_id].crypt_connection_id = m->friendlist[friend_id].crypt_connection_id =
@ -779,8 +873,10 @@ int Messenger_load(Messenger *m, uint8_t * data, uint32_t length)
{ {
if (length == ~0) if (length == ~0)
return -1; return -1;
if (length < crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t) * 3) if (length < crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t) * 3)
return -1; return -1;
length -= crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t) * 3; length -= crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t) * 3;
load_keys(data); load_keys(data);
data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES; data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES;
@ -794,12 +890,16 @@ int Messenger_load(Messenger *m, uint8_t * data, uint32_t length)
if (length < size) if (length < size)
return -1; return -1;
length -= size; length -= size;
if (DHT_load(data, size) == -1) if (DHT_load(data, size) == -1)
return -1; return -1;
data += size; data += size;
memcpy(&size, data, sizeof(size)); memcpy(&size, data, sizeof(size));
data += sizeof(size); data += sizeof(size);
if (length != size || length % sizeof(Friend) != 0) if (length != size || length % sizeof(Friend) != 0)
return -1; return -1;
@ -809,6 +909,7 @@ int Messenger_load(Messenger *m, uint8_t * data, uint32_t length)
uint16_t num = size / sizeof(Friend); uint16_t num = size / sizeof(Friend);
uint32_t i; uint32_t i;
for (i = 0; i < num; ++i) { for (i = 0; i < num; ++i) {
if (temp[i].status >= 3) { if (temp[i].status >= 3) {
int fnum = m_addfriend_norequest(m, temp[i].client_id); int fnum = m_addfriend_norequest(m, temp[i].client_id);
@ -824,6 +925,7 @@ int Messenger_load(Messenger *m, uint8_t * data, uint32_t length)
m_addfriend(m, address, temp[i].info, temp[i].info_size); m_addfriend(m, address, temp[i].info, temp[i].info_size);
} }
} }
free(temp); free(temp);
return 0; return 0;
} }

View File

@ -76,7 +76,8 @@ typedef enum {
USERSTATUS_AWAY, USERSTATUS_AWAY,
USERSTATUS_BUSY, USERSTATUS_BUSY,
USERSTATUS_INVALID USERSTATUS_INVALID
} USERSTATUS; }
USERSTATUS;
typedef struct { typedef struct {
uint8_t client_id[CLIENT_ID_SIZE]; uint8_t client_id[CLIENT_ID_SIZE];
@ -259,7 +260,8 @@ void m_callback_friendrequest(Messenger *m, void (*function)(uint8_t *, uint8_t
/* set the function that will be executed when a message from a friend is received. /* set the function that will be executed when a message from a friend is received.
function format is: function(int friendnumber, uint8_t * message, uint32_t length) */ function format is: function(int friendnumber, uint8_t * message, uint32_t length) */
void m_callback_friendmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata); void m_callback_friendmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void *),
void *userdata);
/* set the function that will be executed when an action from a friend is received. /* set the function that will be executed when an action from a friend is received.
function format is: function(int friendnumber, uint8_t * action, uint32_t length) */ function format is: function(int friendnumber, uint8_t * action, uint32_t length) */
@ -268,12 +270,14 @@ void m_callback_action(Messenger *m, void (*function)(Messenger *m, int, uint8_t
/* set the callback for name changes /* set the callback for name changes
function(int friendnumber, uint8_t *newname, uint16_t length) function(int friendnumber, uint8_t *newname, uint16_t length)
you are not responsible for freeing newname */ you are not responsible for freeing newname */
void m_callback_namechange(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata); void m_callback_namechange(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void *),
void *userdata);
/* set the callback for status message changes /* set the callback for status message changes
function(int friendnumber, uint8_t *newstatus, uint16_t length) function(int friendnumber, uint8_t *newstatus, uint16_t length)
you are not responsible for freeing newstatus */ you are not responsible for freeing newstatus */
void m_callback_statusmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void*), void* userdata); void m_callback_statusmessage(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void *),
void *userdata);
/* set the callback for status type changes /* set the callback for status type changes
function(int friendnumber, USERSTATUS kind) */ function(int friendnumber, USERSTATUS kind) */

View File

@ -40,7 +40,8 @@ int send_friendrequest(uint8_t * public_key, uint32_t nospam_num, uint8_t * data
memcpy(temp, &nospam_num, sizeof(nospam_num)); memcpy(temp, &nospam_num, sizeof(nospam_num));
memcpy(temp + sizeof(nospam_num), data, length); memcpy(temp + sizeof(nospam_num), data, length);
uint8_t packet[MAX_DATA_SIZE]; uint8_t packet[MAX_DATA_SIZE];
int len = create_request(packet, public_key, temp, length + sizeof(nospam_num), 32); /* 32 is friend request packet id */ int len = create_request(packet, public_key, temp, length + sizeof(nospam_num),
32); /* 32 is friend request packet id */
if (len == -1) if (len == -1)
return -1; return -1;
@ -53,6 +54,7 @@ int send_friendrequest(uint8_t * public_key, uint32_t nospam_num, uint8_t * data
if (ip_port.ip.i != 0) { if (ip_port.ip.i != 0) {
if (sendpacket(ip_port, packet, len) != -1) if (sendpacket(ip_port, packet, len) != -1)
return 0; return 0;
return -1; return -1;
} }
@ -127,10 +129,13 @@ static int friendreq_handlepacket(IP_Port source, uint8_t * source_pubkey, uint8
{ {
if (handle_friendrequest_isset == 0) if (handle_friendrequest_isset == 0)
return 1; return 1;
if (length <= sizeof(nospam)) if (length <= sizeof(nospam))
return 1; return 1;
if (request_received(source_pubkey)) if (request_received(source_pubkey))
return 1; return 1;
if (memcmp(packet, &nospam, sizeof(nospam)) != 0) if (memcmp(packet, &nospam, sizeof(nospam)) != 0)
return 1; return 1;

View File

@ -65,9 +65,11 @@ uint8_t crypto_iszero(uint8_t *mem, uint32_t length)
{ {
uint8_t check = 0; uint8_t check = 0;
uint32_t i; uint32_t i;
for (i = 0; i < length; ++i) { for (i = 0; i < length; ++i) {
check |= mem[i]; check |= mem[i];
} }
return check; // We return zero if mem is made out of zeroes. return check; // We return zero if mem is made out of zeroes.
} }
@ -148,8 +150,10 @@ int decrypt_data(uint8_t *public_key, uint8_t *secret_key, uint8_t *nonce,
static void increment_nonce(uint8_t *nonce) static void increment_nonce(uint8_t *nonce)
{ {
uint32_t i; uint32_t i;
for (i = 0; i < crypto_box_NONCEBYTES; ++i) { for (i = 0; i < crypto_box_NONCEBYTES; ++i) {
++nonce[i]; ++nonce[i];
if (nonce[i] != 0) if (nonce[i] != 0)
break; break;
} }
@ -159,6 +163,7 @@ static void increment_nonce(uint8_t *nonce)
void random_nonce(uint8_t *nonce) void random_nonce(uint8_t *nonce)
{ {
uint32_t i, temp; uint32_t i, temp;
for (i = 0; i < crypto_box_NONCEBYTES / 4; ++i) { for (i = 0; i < crypto_box_NONCEBYTES / 4; ++i) {
temp = random_int(); temp = random_int();
memcpy(nonce + 4 * i, &temp, 4); memcpy(nonce + 4 * i, &temp, 4);
@ -172,21 +177,28 @@ int read_cryptpacket(int crypt_connection_id, uint8_t *data)
{ {
if (crypt_connection_id < 0 || crypt_connection_id >= MAX_CRYPTO_CONNECTIONS) if (crypt_connection_id < 0 || crypt_connection_id >= MAX_CRYPTO_CONNECTIONS)
return 0; return 0;
if (crypto_connections[crypt_connection_id].status != CONN_ESTABLISHED) if (crypto_connections[crypt_connection_id].status != CONN_ESTABLISHED)
return 0; return 0;
uint8_t temp_data[MAX_DATA_SIZE]; uint8_t temp_data[MAX_DATA_SIZE];
int length = read_packet(crypto_connections[crypt_connection_id].number, temp_data); int length = read_packet(crypto_connections[crypt_connection_id].number, temp_data);
if (length == 0) if (length == 0)
return 0; return 0;
if (temp_data[0] != 3) if (temp_data[0] != 3)
return -1; return -1;
int len = decrypt_data_fast(crypto_connections[crypt_connection_id].shared_key, int len = decrypt_data_fast(crypto_connections[crypt_connection_id].shared_key,
crypto_connections[crypt_connection_id].recv_nonce, crypto_connections[crypt_connection_id].recv_nonce,
temp_data + 1, length - 1, data); temp_data + 1, length - 1, data);
if (len != -1) { if (len != -1) {
increment_nonce(crypto_connections[crypt_connection_id].recv_nonce); increment_nonce(crypto_connections[crypt_connection_id].recv_nonce);
return len; return len;
} }
return -1; return -1;
} }
@ -196,19 +208,26 @@ int write_cryptpacket(int crypt_connection_id, uint8_t *data, uint32_t length)
{ {
if (crypt_connection_id < 0 || crypt_connection_id >= MAX_CRYPTO_CONNECTIONS) if (crypt_connection_id < 0 || crypt_connection_id >= MAX_CRYPTO_CONNECTIONS)
return 0; return 0;
if (length - crypto_box_BOXZEROBYTES + crypto_box_ZEROBYTES > MAX_DATA_SIZE - 1) if (length - crypto_box_BOXZEROBYTES + crypto_box_ZEROBYTES > MAX_DATA_SIZE - 1)
return 0; return 0;
if (crypto_connections[crypt_connection_id].status != CONN_ESTABLISHED) if (crypto_connections[crypt_connection_id].status != CONN_ESTABLISHED)
return 0; return 0;
uint8_t temp_data[MAX_DATA_SIZE]; uint8_t temp_data[MAX_DATA_SIZE];
int len = encrypt_data_fast(crypto_connections[crypt_connection_id].shared_key, int len = encrypt_data_fast(crypto_connections[crypt_connection_id].shared_key,
crypto_connections[crypt_connection_id].sent_nonce, crypto_connections[crypt_connection_id].sent_nonce,
data, length, temp_data + 1); data, length, temp_data + 1);
if (len == -1) if (len == -1)
return 0; return 0;
temp_data[0] = 3; temp_data[0] = 3;
if (write_packet(crypto_connections[crypt_connection_id].number, temp_data, len + 1) == 0) if (write_packet(crypto_connections[crypt_connection_id].number, temp_data, len + 1) == 0)
return 0; return 0;
increment_nonce(crypto_connections[crypt_connection_id].sent_nonce); increment_nonce(crypto_connections[crypt_connection_id].sent_nonce);
return 1; return 1;
} }
@ -223,6 +242,7 @@ int create_request(uint8_t *packet, uint8_t *public_key, uint8_t *data, uint32_t
{ {
if (MAX_DATA_SIZE < length + 1 + crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES + 1 + ENCRYPTION_PADDING) if (MAX_DATA_SIZE < length + 1 + crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES + 1 + ENCRYPTION_PADDING)
return -1; return -1;
uint8_t nonce[crypto_box_NONCEBYTES]; uint8_t nonce[crypto_box_NONCEBYTES];
uint8_t temp[MAX_DATA_SIZE]; uint8_t temp[MAX_DATA_SIZE];
memcpy(temp + 1, data, length); memcpy(temp + 1, data, length);
@ -230,8 +250,10 @@ int create_request(uint8_t *packet, uint8_t *public_key, uint8_t *data, uint32_t
random_nonce(nonce); random_nonce(nonce);
int len = encrypt_data(public_key, self_secret_key, nonce, temp, length + 1, int len = encrypt_data(public_key, self_secret_key, nonce, temp, length + 1,
1 + crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES + packet); 1 + crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES + packet);
if (len == -1) if (len == -1)
return -1; return -1;
packet[0] = 32; packet[0] = 32;
memcpy(packet + 1, public_key, crypto_box_PUBLICKEYBYTES); memcpy(packet + 1, public_key, crypto_box_PUBLICKEYBYTES);
memcpy(packet + 1 + crypto_box_PUBLICKEYBYTES, self_public_key, crypto_box_PUBLICKEYBYTES); memcpy(packet + 1 + crypto_box_PUBLICKEYBYTES, self_public_key, crypto_box_PUBLICKEYBYTES);
@ -254,10 +276,13 @@ static int handle_request(uint8_t *public_key, uint8_t *data, uint8_t *request_i
uint8_t nonce[crypto_box_NONCEBYTES]; uint8_t nonce[crypto_box_NONCEBYTES];
uint8_t temp[MAX_DATA_SIZE]; uint8_t temp[MAX_DATA_SIZE];
memcpy(nonce, packet + 1 + crypto_box_PUBLICKEYBYTES * 2, crypto_box_NONCEBYTES); memcpy(nonce, packet + 1 + crypto_box_PUBLICKEYBYTES * 2, crypto_box_NONCEBYTES);
int len1 = decrypt_data(public_key, self_secret_key, nonce, packet + 1 + crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES, int len1 = decrypt_data(public_key, self_secret_key, nonce,
packet + 1 + crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES,
length - (crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES + 1), temp); length - (crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES + 1), temp);
if (len1 == -1 || len1 == 0) if (len1 == -1 || len1 == 0)
return -1; return -1;
request_id[0] = temp[0]; request_id[0] = temp[0];
--len1; --len1;
memcpy(data, temp + 1, len1); memcpy(data, temp + 1, len1);
@ -279,14 +304,18 @@ static int cryptopacket_handle(IP_Port source, uint8_t * packet, uint32_t length
if (length <= crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES + 1 + ENCRYPTION_PADDING || if (length <= crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES + 1 + ENCRYPTION_PADDING ||
length > MAX_DATA_SIZE + ENCRYPTION_PADDING) length > MAX_DATA_SIZE + ENCRYPTION_PADDING)
return 1; return 1;
if (memcmp(packet + 1, self_public_key, crypto_box_PUBLICKEYBYTES) == 0) {// check if request is for us. if (memcmp(packet + 1, self_public_key, crypto_box_PUBLICKEYBYTES) == 0) {// check if request is for us.
uint8_t public_key[crypto_box_PUBLICKEYBYTES]; uint8_t public_key[crypto_box_PUBLICKEYBYTES];
uint8_t data[MAX_DATA_SIZE]; uint8_t data[MAX_DATA_SIZE];
uint8_t number; uint8_t number;
int len = handle_request(public_key, data, &number, packet, length); int len = handle_request(public_key, data, &number, packet, length);
if (len == -1 || len == 0) if (len == -1 || len == 0)
return 1; return 1;
if (!cryptopackethandlers[number]) return 1; if (!cryptopackethandlers[number]) return 1;
cryptopackethandlers[number](source, public_key, data, len); cryptopackethandlers[number](source, public_key, data, len);
} else { /* if request is not for us, try routing it. */ } else { /* if request is not for us, try routing it. */
@ -294,6 +323,7 @@ static int cryptopacket_handle(IP_Port source, uint8_t * packet, uint32_t length
return 0; return 0;
} }
} }
return 1; return 1;
} }
@ -312,8 +342,10 @@ static int send_cryptohandshake(int connection_id, uint8_t *public_key, uint8_t
int len = encrypt_data(public_key, self_secret_key, nonce, temp, crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES, int len = encrypt_data(public_key, self_secret_key, nonce, temp, crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES,
1 + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES + temp_data); 1 + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES + temp_data);
if (len == -1) if (len == -1)
return 0; return 0;
temp_data[0] = 2; temp_data[0] = 2;
memcpy(temp_data + 1, self_public_key, crypto_box_PUBLICKEYBYTES); memcpy(temp_data + 1, self_public_key, crypto_box_PUBLICKEYBYTES);
memcpy(temp_data + 1 + crypto_box_PUBLICKEYBYTES, nonce, crypto_box_NONCEBYTES); memcpy(temp_data + 1 + crypto_box_PUBLICKEYBYTES, nonce, crypto_box_NONCEBYTES);
@ -327,12 +359,15 @@ static int handle_cryptohandshake(uint8_t *public_key, uint8_t *secret_nonce,
uint8_t *session_key, uint8_t *data, uint16_t length) uint8_t *session_key, uint8_t *data, uint16_t length)
{ {
int pad = (- crypto_box_BOXZEROBYTES + crypto_box_ZEROBYTES); int pad = (- crypto_box_BOXZEROBYTES + crypto_box_ZEROBYTES);
if (length != 1 + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES if (length != 1 + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES
+ crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + pad) { + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + pad) {
return 0; return 0;
} }
if (data[0] != 2) if (data[0] != 2)
return 0; return 0;
uint8_t temp[crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES]; uint8_t temp[crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES];
memcpy(public_key, data + 1, crypto_box_PUBLICKEYBYTES); memcpy(public_key, data + 1, crypto_box_PUBLICKEYBYTES);
@ -355,11 +390,13 @@ static int handle_cryptohandshake(uint8_t *public_key, uint8_t *secret_nonce,
static int getcryptconnection_id(uint8_t *public_key) static int getcryptconnection_id(uint8_t *public_key)
{ {
uint32_t i; uint32_t i;
for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) {
if (crypto_connections[i].status != CONN_NO_CONNECTION) if (crypto_connections[i].status != CONN_NO_CONNECTION)
if (memcmp(public_key, crypto_connections[i].public_key, crypto_box_PUBLICKEYBYTES) == 0) if (memcmp(public_key, crypto_connections[i].public_key, crypto_box_PUBLICKEYBYTES) == 0)
return i; return i;
} }
return -1; return -1;
} }
@ -370,16 +407,21 @@ int crypto_connect(uint8_t *public_key, IP_Port ip_port)
{ {
uint32_t i; uint32_t i;
int id = getcryptconnection_id(public_key); int id = getcryptconnection_id(public_key);
if (id != -1) { if (id != -1) {
IP_Port c_ip = connection_ip(crypto_connections[id].number); IP_Port c_ip = connection_ip(crypto_connections[id].number);
if (c_ip.ip.i == ip_port.ip.i && c_ip.port == ip_port.port) if (c_ip.ip.i == ip_port.ip.i && c_ip.port == ip_port.port)
return -1; return -1;
} }
for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) {
if (crypto_connections[i].status == CONN_NO_CONNECTION) { if (crypto_connections[i].status == CONN_NO_CONNECTION) {
int id = new_connection(ip_port); int id = new_connection(ip_port);
if (id == -1) if (id == -1)
return -1; return -1;
crypto_connections[i].number = id; crypto_connections[i].number = id;
crypto_connections[i].status = CONN_HANDSHAKE_SENT; crypto_connections[i].status = CONN_HANDSHAKE_SENT;
random_nonce(crypto_connections[i].recv_nonce); random_nonce(crypto_connections[i].recv_nonce);
@ -391,9 +433,11 @@ int crypto_connect(uint8_t *public_key, IP_Port ip_port)
increment_nonce(crypto_connections[i].recv_nonce); increment_nonce(crypto_connections[i].recv_nonce);
return i; return i;
} }
return -1; /* this should never happen. */ return -1; /* this should never happen. */
} }
} }
return -1; return -1;
} }
@ -407,6 +451,7 @@ int crypto_connect(uint8_t *public_key, IP_Port ip_port)
int crypto_inbound(uint8_t *public_key, uint8_t *secret_nonce, uint8_t *session_key) int crypto_inbound(uint8_t *public_key, uint8_t *secret_nonce, uint8_t *session_key)
{ {
uint32_t i; uint32_t i;
for (i = 0; i < MAX_INCOMING; ++i) { for (i = 0; i < MAX_INCOMING; ++i) {
if (incoming_connections[i] != -1) { if (incoming_connections[i] != -1) {
if (is_connected(incoming_connections[i]) == 4 || is_connected(incoming_connections[i]) == 0) { if (is_connected(incoming_connections[i]) == 4 || is_connected(incoming_connections[i]) == 0) {
@ -414,9 +459,11 @@ int crypto_inbound(uint8_t *public_key, uint8_t *secret_nonce, uint8_t *session_
incoming_connections[i] = -1; incoming_connections[i] = -1;
continue; continue;
} }
if (id_packet(incoming_connections[i]) == 2) { if (id_packet(incoming_connections[i]) == 2) {
uint8_t temp_data[MAX_DATA_SIZE]; uint8_t temp_data[MAX_DATA_SIZE];
uint16_t len = read_packet(incoming_connections[i], temp_data); uint16_t len = read_packet(incoming_connections[i], temp_data);
if (handle_cryptohandshake(public_key, secret_nonce, session_key, temp_data, len)) { if (handle_cryptohandshake(public_key, secret_nonce, session_key, temp_data, len)) {
int connection_id = incoming_connections[i]; int connection_id = incoming_connections[i];
incoming_connections[i] = -1; /* remove this connection from the incoming connection list. */ incoming_connections[i] = -1; /* remove this connection from the incoming connection list. */
@ -425,6 +472,7 @@ int crypto_inbound(uint8_t *public_key, uint8_t *secret_nonce, uint8_t *session_
} }
} }
} }
return -1; return -1;
} }
@ -435,6 +483,7 @@ int crypto_kill(int crypt_connection_id)
{ {
if (crypt_connection_id < 0 || crypt_connection_id >= MAX_CRYPTO_CONNECTIONS) if (crypt_connection_id < 0 || crypt_connection_id >= MAX_CRYPTO_CONNECTIONS)
return 1; return 1;
if (crypto_connections[crypt_connection_id].status != CONN_NO_CONNECTION) { if (crypto_connections[crypt_connection_id].status != CONN_NO_CONNECTION) {
crypto_connections[crypt_connection_id].status = CONN_NO_CONNECTION; crypto_connections[crypt_connection_id].status = CONN_NO_CONNECTION;
kill_connection(crypto_connections[crypt_connection_id].number); kill_connection(crypto_connections[crypt_connection_id].number);
@ -442,6 +491,7 @@ int crypto_kill(int crypt_connection_id)
crypto_connections[crypt_connection_id].number = ~0; crypto_connections[crypt_connection_id].number = ~0;
return 0; return 0;
} }
return 1; return 1;
} }
@ -451,8 +501,10 @@ int crypto_kill(int crypt_connection_id)
int accept_crypto_inbound(int connection_id, uint8_t *public_key, uint8_t *secret_nonce, uint8_t *session_key) int accept_crypto_inbound(int connection_id, uint8_t *public_key, uint8_t *secret_nonce, uint8_t *session_key)
{ {
uint32_t i; uint32_t i;
if (connection_id == -1) if (connection_id == -1)
return -1; return -1;
/* /*
if(getcryptconnection_id(public_key) != -1) if(getcryptconnection_id(public_key) != -1)
{ {
@ -482,9 +534,11 @@ int accept_crypto_inbound(int connection_id, uint8_t *public_key, uint8_t *secre
crypto_connections[i].status = CONN_NOT_CONFIRMED; /* set it to its proper value right after. */ crypto_connections[i].status = CONN_NOT_CONFIRMED; /* set it to its proper value right after. */
return i; return i;
} }
return -1; /* this should never happen. */ return -1; /* this should never happen. */
} }
} }
return -1; return -1;
} }
@ -495,6 +549,7 @@ int is_cryptoconnected(int crypt_connection_id)
{ {
if (crypt_connection_id >= 0 && crypt_connection_id < MAX_CRYPTO_CONNECTIONS) if (crypt_connection_id >= 0 && crypt_connection_id < MAX_CRYPTO_CONNECTIONS)
return crypto_connections[crypt_connection_id].status; return crypto_connections[crypt_connection_id].status;
return CONN_NO_CONNECTION; return CONN_NO_CONNECTION;
} }
@ -528,12 +583,14 @@ void load_keys(uint8_t *keys)
static int new_incoming(int id) static int new_incoming(int id)
{ {
uint32_t i; uint32_t i;
for (i = 0; i < MAX_INCOMING; ++i) { for (i = 0; i < MAX_INCOMING; ++i) {
if (incoming_connections[i] == -1) { if (incoming_connections[i] == -1) {
incoming_connections[i] = id; incoming_connections[i] = id;
return 0; return 0;
} }
} }
return 1; return 1;
} }
@ -542,8 +599,10 @@ static int new_incoming(int id)
static void handle_incomings(void) static void handle_incomings(void)
{ {
int income; int income;
while (1) { while (1) {
income = incoming_connection(); income = incoming_connection();
if (income == -1 || new_incoming(income) ) if (income == -1 || new_incoming(income) )
break; break;
} }
@ -553,6 +612,7 @@ static void handle_incomings(void)
static void receive_crypto(void) static void receive_crypto(void)
{ {
uint32_t i; uint32_t i;
for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) {
if (crypto_connections[i].status == CONN_HANDSHAKE_SENT) { if (crypto_connections[i].status == CONN_HANDSHAKE_SENT) {
uint8_t temp_data[MAX_DATA_SIZE]; uint8_t temp_data[MAX_DATA_SIZE];
@ -560,11 +620,14 @@ static void receive_crypto(void)
uint8_t public_key[crypto_box_PUBLICKEYBYTES]; uint8_t public_key[crypto_box_PUBLICKEYBYTES];
uint8_t session_key[crypto_box_PUBLICKEYBYTES]; uint8_t session_key[crypto_box_PUBLICKEYBYTES];
uint16_t len; uint16_t len;
if (id_packet(crypto_connections[i].number) == 1) if (id_packet(crypto_connections[i].number) == 1)
/* if the packet is a friend request drop it (because we are already friends) */ /* if the packet is a friend request drop it (because we are already friends) */
len = read_packet(crypto_connections[i].number, temp_data); len = read_packet(crypto_connections[i].number, temp_data);
if (id_packet(crypto_connections[i].number) == 2) { /* handle handshake packet. */ if (id_packet(crypto_connections[i].number) == 2) { /* handle handshake packet. */
len = read_packet(crypto_connections[i].number, temp_data); len = read_packet(crypto_connections[i].number, temp_data);
if (handle_cryptohandshake(public_key, secret_nonce, session_key, temp_data, len)) { if (handle_cryptohandshake(public_key, secret_nonce, session_key, temp_data, len)) {
if (memcmp(public_key, crypto_connections[i].public_key, crypto_box_PUBLICKEYBYTES) == 0) { if (memcmp(public_key, crypto_connections[i].public_key, crypto_box_PUBLICKEYBYTES) == 0) {
memcpy(crypto_connections[i].sent_nonce, secret_nonce, crypto_box_NONCEBYTES); memcpy(crypto_connections[i].sent_nonce, secret_nonce, crypto_box_NONCEBYTES);
@ -583,6 +646,7 @@ static void receive_crypto(void)
crypto_kill(crypto_connections[i].number); crypto_kill(crypto_connections[i].number);
} }
if (crypto_connections[i].status == CONN_NOT_CONFIRMED) { if (crypto_connections[i].status == CONN_NOT_CONFIRMED) {
if (id_packet(crypto_connections[i].number) == 3) { if (id_packet(crypto_connections[i].number) == 3) {
uint8_t temp_data[MAX_DATA_SIZE]; uint8_t temp_data[MAX_DATA_SIZE];
@ -592,6 +656,7 @@ static void receive_crypto(void)
crypto_connections[i].sessionsecret_key, crypto_connections[i].sessionsecret_key,
crypto_connections[i].recv_nonce, temp_data + 1, length - 1, data); crypto_connections[i].recv_nonce, temp_data + 1, length - 1, data);
uint32_t zero = 0; uint32_t zero = 0;
if (len == sizeof(uint32_t) && memcmp(((uint8_t *)&zero), data, sizeof(uint32_t)) == 0) { if (len == sizeof(uint32_t) && memcmp(((uint8_t *)&zero), data, sizeof(uint32_t)) == 0) {
increment_nonce(crypto_connections[i].recv_nonce); increment_nonce(crypto_connections[i].recv_nonce);
encrypt_precompute(crypto_connections[i].peersessionpublic_key, encrypt_precompute(crypto_connections[i].peersessionpublic_key,
@ -619,6 +684,7 @@ void initNetCrypto(void)
memset(incoming_connections, -1 , sizeof(incoming_connections)); memset(incoming_connections, -1 , sizeof(incoming_connections));
networking_registerhandler(32, &cryptopacket_handle); networking_registerhandler(32, &cryptopacket_handle);
uint32_t i; uint32_t i;
for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i)
crypto_connections[i].number = ~0; crypto_connections[i].number = ~0;
} }
@ -626,6 +692,7 @@ void initNetCrypto(void)
static void killTimedout(void) static void killTimedout(void)
{ {
uint32_t i; uint32_t i;
for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) {
if (crypto_connections[i].status != CONN_NO_CONNECTION && is_connected(crypto_connections[i].number) == 4) if (crypto_connections[i].status != CONN_NO_CONNECTION && is_connected(crypto_connections[i].number) == 4)
crypto_connections[i].status = CONN_TIMED_OUT; crypto_connections[i].status = CONN_TIMED_OUT;

View File

@ -80,6 +80,7 @@ static int receivepacket(IP_Port * ip_port, uint8_t * data, uint32_t * length)
uint32_t addrlen = sizeof(addr); uint32_t addrlen = sizeof(addr);
#endif #endif
(*(int32_t *)length) = recvfrom(sock, (char *) data, MAX_UDP_PACKET_SIZE, 0, (struct sockaddr *)&addr, &addrlen); (*(int32_t *)length) = recvfrom(sock, (char *) data, MAX_UDP_PACKET_SIZE, 0, (struct sockaddr *)&addr, &addrlen);
if (*(int32_t *)length <= 0) if (*(int32_t *)length <= 0)
return -1; /* nothing received or empty packet */ return -1; /* nothing received or empty packet */
@ -101,10 +102,11 @@ void networking_poll()
uint8_t data[MAX_UDP_PACKET_SIZE]; uint8_t data[MAX_UDP_PACKET_SIZE];
uint32_t length; uint32_t length;
while (receivepacket(&ip_port, data, &length) != -1) while (receivepacket(&ip_port, data, &length) != -1) {
{
if (length < 1) continue; if (length < 1) continue;
if (!packethandlers[data[0]]) continue; if (!packethandlers[data[0]]) continue;
packethandlers[data[0]](ip_port, data, length); packethandlers[data[0]](ip_port, data, length);
} }
} }
@ -119,8 +121,10 @@ int init_networking(IP ip, uint16_t port)
{ {
#ifdef WIN32 #ifdef WIN32
WSADATA wsaData; WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR) if (WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR)
return -1; return -1;
#else #else
srandom((uint32_t)current_time()); srandom((uint32_t)current_time());
#endif #endif
@ -131,11 +135,15 @@ int init_networking(IP ip, uint16_t port)
/* Check for socket error */ /* Check for socket error */
#ifdef WIN32 #ifdef WIN32
if (sock == INVALID_SOCKET) /* MSDN recommends this */ if (sock == INVALID_SOCKET) /* MSDN recommends this */
return -1; return -1;
#else #else
if (sock < 0) if (sock < 0)
return -1; return -1;
#endif #endif
/* Functions to increase the size of the send and receive UDP buffers /* Functions to increase the size of the send and receive UDP buffers

View File

@ -46,8 +46,7 @@ enum timer_state {
STATE_CALLBACK STATE_CALLBACK
}; };
struct timer struct timer {
{
enum timer_state state; enum timer_state state;
timer *_prev; timer *_prev;
timer *_next; timer *_next;
@ -68,13 +67,16 @@ inline static void timer_dequeue(timer* t, timer** queue)
} else { } else {
*queue = t->_next; *queue = t->_next;
} }
if (t->_next) t->_next->_prev = t->_prev; if (t->_next) t->_next->_prev = t->_prev;
t->state = STATE_INACTIVE; t->state = STATE_INACTIVE;
} }
static void timer_enqueue(timer *t, timer **queue, timer *prev) static void timer_enqueue(timer *t, timer **queue, timer *prev)
{ {
t->state = STATE_ACTIVE; t->state = STATE_ACTIVE;
while (true) { while (true) {
if (!*queue) { if (!*queue) {
t->_next = 0; t->_next = 0;
@ -109,12 +111,14 @@ static timer* timer_pool; /* timer_pool is SINGLY LINKED!! */
timer *new_timer(void) timer *new_timer(void)
{ {
timer *ret; timer *ret;
if (timer_pool) { if (timer_pool) {
ret = timer_pool; ret = timer_pool;
timer_pool = timer_pool->_next; timer_pool = timer_pool->_next;
} else { } else {
ret = calloc(1, sizeof(struct timer)); ret = calloc(1, sizeof(struct timer));
} }
ret->state = STATE_INACTIVE; ret->state = STATE_INACTIVE;
return ret; return ret;
} }
@ -153,13 +157,16 @@ static void timer_delay_us(timer* t, int us)
void timer_start(timer *t, int sec) void timer_start(timer *t, int sec)
{ {
uint64_t newdeadline = current_time() + sec * US_PER_SECOND; uint64_t newdeadline = current_time() + sec * US_PER_SECOND;
if (timer_is_active(t)) { if (timer_is_active(t)) {
if (t->deadline < newdeadline) { if (t->deadline < newdeadline) {
timer_delay_us(t, newdeadline - t->deadline); timer_delay_us(t, newdeadline - t->deadline);
return; return;
} }
timer_dequeue(t, &timer_main_queue); timer_dequeue(t, &timer_main_queue);
} }
t->deadline = newdeadline; t->deadline = newdeadline;
timer_enqueue(t, &timer_main_queue, 0); timer_enqueue(t, &timer_main_queue, 0);
} }
@ -177,6 +184,7 @@ int timer_stop(timer* t)
int timer_delay(timer *t, int additonalsec) int timer_delay(timer *t, int additonalsec)
{ {
if (!timer_is_active(t)) return -1; if (!timer_is_active(t)) return -1;
timer_delay_us(t, additonalsec * US_PER_SECOND); timer_delay_us(t, additonalsec * US_PER_SECOND);
return 0; return 0;
} }
@ -184,6 +192,7 @@ int timer_delay(timer* t, int additonalsec)
static uint64_t timer_diff(timer *t, uint64_t time) static uint64_t timer_diff(timer *t, uint64_t time)
{ {
if (t->deadline <= time) return 0; if (t->deadline <= time) return 0;
return time - t->deadline; return time - t->deadline;
} }
@ -193,6 +202,7 @@ static uint64_t timer_diff(timer* t, uint64_t time)
int timer_time_remaining(timer *t) int timer_time_remaining(timer *t)
{ {
if (!timer_is_active(t)) return -1; if (!timer_is_active(t)) return -1;
return timer_diff(t, current_time()) / US_PER_SECOND; return timer_diff(t, current_time()) / US_PER_SECOND;
} }
@ -228,6 +238,7 @@ void timer_poll(void)
/* Handle millisecond timers */ /* Handle millisecond timers */
while (timer_us_queue) { while (timer_us_queue) {
if (timer_diff(timer_us_queue, time) != 0) break; if (timer_diff(timer_us_queue, time) != 0) break;
timer *t = timer_us_queue; timer *t = timer_us_queue;
timer_dequeue(t, &timer_us_queue); timer_dequeue(t, &timer_us_queue);
t->cb(0, t->userdata); t->cb(0, t->userdata);
@ -240,14 +251,17 @@ void timer_poll(void)
while (timer_main_queue) { while (timer_main_queue) {
if (timer_diff(timer_main_queue, time) != 0) break; if (timer_diff(timer_main_queue, time) != 0) break;
timer *t = timer_main_queue; timer *t = timer_main_queue;
t->state = STATE_CALLBACK; t->state = STATE_CALLBACK;
int rv = t->cb(t, t->userdata); int rv = t->cb(t, t->userdata);
if (rv != 0) { if (rv != 0) {
timer_dequeue(t, &timer_main_queue); timer_dequeue(t, &timer_main_queue);
delete_timer(t); delete_timer(t);
continue; continue;
} }
if (t->state != STATE_ACTIVE) { if (t->state != STATE_ACTIVE) {
timer_dequeue(t, &timer_main_queue); timer_dequeue(t, &timer_main_queue);
} }
@ -268,6 +282,7 @@ void timer_debug_print()
{ {
timer *t = timer_main_queue; timer *t = timer_main_queue;
printf("Queue:\n"); printf("Queue:\n");
while (t) { while (t) {
printf("%" PRIu64 " (%" PRIu64 ") : %s\n", t->deadline, t->deadline / US_PER_SECOND, (char *)t->userdata); printf("%" PRIu64 " (%" PRIu64 ") : %s\n", t->deadline, t->deadline / US_PER_SECOND, (char *)t->userdata);
t = t->_next; t = t->_next;

View File

@ -50,13 +50,16 @@ void manage_keys()
uint8_t keys[KEYS_SIZE]; uint8_t keys[KEYS_SIZE];
FILE *keys_file = fopen("key", "r"); FILE *keys_file = fopen("key", "r");
if (keys_file != NULL) { if (keys_file != NULL) {
//if file was opened successfully -- load keys //if file was opened successfully -- load keys
size_t read_size = fread(keys, sizeof(uint8_t), KEYS_SIZE, keys_file); size_t read_size = fread(keys, sizeof(uint8_t), KEYS_SIZE, keys_file);
if (read_size != KEYS_SIZE) { if (read_size != KEYS_SIZE) {
printf("Error while reading the key file\nExiting.\n"); printf("Error while reading the key file\nExiting.\n");
exit(1); exit(1);
} }
load_keys(keys); load_keys(keys);
printf("Keys loaded successfully\n"); printf("Keys loaded successfully\n");
} else { } else {
@ -64,10 +67,12 @@ void manage_keys()
new_keys(); new_keys();
save_keys(keys); save_keys(keys);
keys_file = fopen("key", "w"); keys_file = fopen("key", "w");
if (fwrite(keys, sizeof(uint8_t), KEYS_SIZE, keys_file) != KEYS_SIZE) { if (fwrite(keys, sizeof(uint8_t), KEYS_SIZE, keys_file) != KEYS_SIZE) {
printf("Error while writing the key file.\nExiting.\n"); printf("Error while writing the key file.\nExiting.\n");
exit(1); exit(1);
} }
printf("Keys saved successfully\n"); printf("Keys saved successfully\n");
} }
@ -83,10 +88,10 @@ int main(int argc, char *argv[])
FILE *file; FILE *file;
file = fopen("PUBLIC_ID.txt", "w"); file = fopen("PUBLIC_ID.txt", "w");
for(i = 0; i < 32; i++) for (i = 0; i < 32; i++) {
{
if (self_public_key[i] < 16) if (self_public_key[i] < 16)
printf("0"); printf("0");
printf("%hhX", self_public_key[i]); printf("%hhX", self_public_key[i]);
fprintf(file, "%hhX", self_public_key[i]); fprintf(file, "%hhX", self_public_key[i]);
} }
@ -117,19 +122,20 @@ int main(int argc, char *argv[])
friendreq_init(); friendreq_init();
int is_waiting_for_dht_connection = 1; int is_waiting_for_dht_connection = 1;
while(1)
{ while (1) {
if (is_waiting_for_dht_connection && DHT_isconnected()) if (is_waiting_for_dht_connection && DHT_isconnected()) {
{
printf("Connected to other bootstrap server successfully.\n"); printf("Connected to other bootstrap server successfully.\n");
is_waiting_for_dht_connection = 0; is_waiting_for_dht_connection = 0;
} }
doDHT(); doDHT();
networking_poll(); networking_poll();
c_sleep(1); c_sleep(1);
} }
shutdown_networking(); shutdown_networking();
return 0; return 0;
} }

View File

@ -55,19 +55,20 @@ struct server_conf_s {
struct server_info_s info[32]; struct server_info_s info[32];
}; };
int b16_to_key(char b16_string[], uint8_t *bs_pubkey) { int b16_to_key(char b16_string[], uint8_t *bs_pubkey)
{
int i; int i;
unsigned int num1 = 0, num2 = 0; unsigned int num1 = 0, num2 = 0;
for(i = 0; i < 32; ++i) for (i = 0; i < 32; ++i) {
{
sscanf(&b16_string[i * 2], "%1X", &num1); sscanf(&b16_string[i * 2], "%1X", &num1);
sscanf(&b16_string[i * 2 + 1], "%1X", &num2); sscanf(&b16_string[i * 2 + 1], "%1X", &num2);
num1 = num1 << 4; num1 = num1 << 4;
bs_pubkey[i] = bs_pubkey[i] | num1; bs_pubkey[i] = bs_pubkey[i] | num1;
bs_pubkey[i] = bs_pubkey[i] | num2; bs_pubkey[i] = bs_pubkey[i] | num2;
} }
return 0; return 0;
} }
@ -92,11 +93,13 @@ int connect_to_servers(struct server_info_s *info)
/* Check if we're connected to the DHT */ /* Check if we're connected to the DHT */
for (c = 0; c != 100; ++c) { for (c = 0; c != 100; ++c) {
usleep(10000); usleep(10000);
if (DHT_isconnected()) { if (DHT_isconnected()) {
//puts("Connected"); //puts("Connected");
return 1; return 1;
break; break;
} }
if (DHT_isconnected() == 0 && c == 99) { if (DHT_isconnected() == 0 && c == 99) {
//puts("Not connected"); //puts("Not connected");
return -1; return -1;
@ -123,12 +126,14 @@ void manage_keys(char *keys_file)
if (stat(keys_file, &existence) >= 0) { if (stat(keys_file, &existence) >= 0) {
keysf = fopen(keys_file, "r"); keysf = fopen(keys_file, "r");
size_t read_size = fread(keys, sizeof(uint8_t), KEYS_SIZE, keysf); size_t read_size = fread(keys, sizeof(uint8_t), KEYS_SIZE, keysf);
if (read_size != KEYS_SIZE) { if (read_size != KEYS_SIZE) {
printf("Error while reading the key file\nExiting.\n"); printf("Error while reading the key file\nExiting.\n");
exit(1); exit(1);
} else { } else {
printf("Keys loaded successfully\n"); printf("Keys loaded successfully\n");
} }
load_keys(keys); load_keys(keys);
} else { } else {
@ -137,6 +142,7 @@ void manage_keys(char *keys_file)
new_keys(); new_keys();
save_keys(keys); save_keys(keys);
keysf = fopen(keys_file, "w"); keysf = fopen(keys_file, "w");
if (fwrite(keys, sizeof(uint8_t), KEYS_SIZE, keysf) != KEYS_SIZE) { if (fwrite(keys, sizeof(uint8_t), KEYS_SIZE, keysf) != KEYS_SIZE) {
printf("Error while writing the key file.\nExiting.\n"); printf("Error while writing the key file.\nExiting.\n");
exit(1); exit(1);
@ -183,8 +189,7 @@ struct server_conf_s configure_server(char *cfg_file)
config_init(&cfg); config_init(&cfg);
/* Read the file. If there is an error, report it and exit. */ /* Read the file. If there is an error, report it and exit. */
if(! config_read_file(&cfg, cfg_file)) if (! config_read_file(&cfg, cfg_file)) {
{
fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg), fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg),
config_error_line(&cfg), config_error_text(&cfg)); config_error_line(&cfg), config_error_text(&cfg));
config_destroy(&cfg); config_destroy(&cfg);
@ -217,12 +222,14 @@ struct server_conf_s configure_server(char *cfg_file)
/* Get all the servers in the list */ /* Get all the servers in the list */
server_list = config_lookup(&cfg, "bootstrap_servers"); server_list = config_lookup(&cfg, "bootstrap_servers");
if (server_list != NULL) { if (server_list != NULL) {
int count = config_setting_length(server_list); int count = config_setting_length(server_list);
int i; int i;
char tmp_ip[30]; /* IP */ char tmp_ip[30]; /* IP */
char tmp_pk[64]; /* bs_pk */ char tmp_pk[64]; /* bs_pk */
for (i = 0; i < count; ++i) { for (i = 0; i < count; ++i) {
config_setting_t *server = config_setting_get_elem(server_list, i); config_setting_t *server = config_setting_get_elem(server_list, i);
/* Get a pointer on the key aray */ /* Get a pointer on the key aray */
@ -274,7 +281,8 @@ struct server_conf_s configure_server(char *cfg_file)
return server_conf; return server_conf;
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[])
{
pid_t pid, sid; /* Process- and Session-ID */ pid_t pid, sid; /* Process- and Session-ID */
struct server_conf_s server_conf; struct server_conf_s server_conf;
@ -311,14 +319,15 @@ int main(int argc, char *argv[]) {
/* Public key */ /* Public key */
int i; int i;
printf("\nPublic Key: "); printf("\nPublic Key: ");
for(i = 0; i < 32; ++i)
{ for (i = 0; i < 32; ++i) {
uint8_t ln, hn; uint8_t ln, hn;
ln = 0x0F & self_public_key[i]; ln = 0x0F & self_public_key[i];
hn = 0xF0 & self_public_key[i]; hn = 0xF0 & self_public_key[i];
hn = hn >> 4; hn = hn >> 4;
printf("%X%X", hn, ln); printf("%X%X", hn, ln);
} }
printf("\n"); printf("\n");
/* initialize networking /* initialize networking
@ -355,6 +364,7 @@ int main(int argc, char *argv[]) {
/* Fork off from the parent process */ /* Fork off from the parent process */
pid = fork(); pid = fork();
if (pid < 0) { if (pid < 0) {
printf("Forking failed.\n"); printf("Forking failed.\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -378,6 +388,7 @@ int main(int argc, char *argv[]) {
/* Create a new SID for the child process */ /* Create a new SID for the child process */
sid = setsid(); sid = setsid();
if (sid < 0) { if (sid < 0) {
printf("SID creation failure.\n"); printf("SID creation failure.\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -396,8 +407,7 @@ int main(int argc, char *argv[]) {
/* Main loop */ /* Main loop */
friendreq_init(); friendreq_init();
while(1) while (1) {
{
doDHT(); doDHT();
networking_poll(); networking_poll();

View File

@ -58,7 +58,8 @@
void printip(IP_Port ip_port) void printip(IP_Port ip_port)
{ {
printf("\nIP: %u.%u.%u.%u Port: %u\n",ip_port.ip.c[0],ip_port.ip.c[1],ip_port.ip.c[2],ip_port.ip.c[3],ntohs(ip_port.port)); printf("\nIP: %u.%u.%u.%u Port: %u\n", ip_port.ip.c[0], ip_port.ip.c[1], ip_port.ip.c[2], ip_port.ip.c[3],
ntohs(ip_port.port));
} }
uint8_t self_public_key[crypto_box_PUBLICKEYBYTES]; uint8_t self_public_key[crypto_box_PUBLICKEYBYTES];
@ -69,14 +70,18 @@ int main(int argc, char *argv[])
printf("usage %s ip port filename(of file to send)\n", argv[0]); printf("usage %s ip port filename(of file to send)\n", argv[0]);
exit(0); exit(0);
} }
new_keys(); new_keys();
printf("OUR ID: "); printf("OUR ID: ");
uint32_t i; uint32_t i;
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
if (self_public_key[i] < 16) if (self_public_key[i] < 16)
printf("0"); printf("0");
printf("%hhX", self_public_key[i]); printf("%hhX", self_public_key[i]);
} }
printf("\n"); printf("\n");
memcpy(self_client_id, self_public_key, 32); memcpy(self_client_id, self_public_key, 32);
@ -122,9 +127,18 @@ int main(int argc, char *argv[])
uint8_t buffer2[128]; uint8_t buffer2[128];
int read2 = 0; int read2 = 0;
FILE *file1 = fopen(argv[3], "rb"); FILE *file1 = fopen(argv[3], "rb");
if ( file1==NULL ){printf("Error opening file.\n");return 1;}
if ( file1 == NULL ) {
printf("Error opening file.\n");
return 1;
}
FILE *file2 = fopen("received.txt", "wb"); FILE *file2 = fopen("received.txt", "wb");
if ( file2==NULL ){return 1;}
if ( file2 == NULL ) {
return 1;
}
read1 = fread(buffer1, 1, 128, file1); read1 = fread(buffer1, 1, 128, file1);
while (1) { while (1) {
@ -138,7 +152,9 @@ int main(int argc, char *argv[])
} }
} }
} }
friend_ip = DHT_getfriendip(friend_id); friend_ip = DHT_getfriendip(friend_id);
if (friend_ip.ip.i != 0) { if (friend_ip.ip.i != 0) {
if (connection == -1 && friendrequest == -1) { if (connection == -1 && friendrequest == -1) {
printf("Sending friend request to peer:"); printf("Sending friend request to peer:");
@ -147,23 +163,27 @@ int main(int argc, char *argv[])
/* connection = crypto_connect((uint8_t *)friend_id, friend_ip); */ /* connection = crypto_connect((uint8_t *)friend_id, friend_ip); */
/* connection = new_connection(friend_ip); */ /* connection = new_connection(friend_ip); */
} }
if (check_friendrequest(friendrequest) == 1) { if (check_friendrequest(friendrequest) == 1) {
printf("Started connecting to friend:"); printf("Started connecting to friend:");
connection = crypto_connect(friend_id, friend_ip); connection = crypto_connect(friend_id, friend_ip);
} }
} }
if (inconnection == -1) { if (inconnection == -1) {
uint8_t secret_nonce[crypto_box_NONCEBYTES]; uint8_t secret_nonce[crypto_box_NONCEBYTES];
uint8_t public_key[crypto_box_PUBLICKEYBYTES]; uint8_t public_key[crypto_box_PUBLICKEYBYTES];
uint8_t session_key[crypto_box_PUBLICKEYBYTES]; uint8_t session_key[crypto_box_PUBLICKEYBYTES];
inconnection = crypto_inbound(public_key, secret_nonce, session_key); inconnection = crypto_inbound(public_key, secret_nonce, session_key);
inconnection = accept_crypto_inbound(inconnection, acceptedfriend_public_key, secret_nonce, session_key); inconnection = accept_crypto_inbound(inconnection, acceptedfriend_public_key, secret_nonce, session_key);
/* inconnection = incoming_connection(); */ /* inconnection = incoming_connection(); */
if (inconnection != -1) { if (inconnection != -1) {
printf("Someone connected to us:\n"); printf("Someone connected to us:\n");
/* printip(connection_ip(inconnection)); */ /* printip(connection_ip(inconnection)); */
} }
} }
if (handle_friendrequest(acceptedfriend_public_key, request_data) > 1) { if (handle_friendrequest(acceptedfriend_public_key, request_data) > 1) {
printf("RECEIVED FRIEND REQUEST: %s\n", request_data); printf("RECEIVED FRIEND REQUEST: %s\n", request_data);
} }
@ -175,12 +195,16 @@ int main(int argc, char *argv[])
printf("Wrote data1.\n"); printf("Wrote data1.\n");
read1 = fread(buffer1, 1, 128, file1); read1 = fread(buffer1, 1, 128, file1);
} }
read2 = read_cryptpacket(inconnection, buffer2); read2 = read_cryptpacket(inconnection, buffer2);
if (read2 != 0) { if (read2 != 0) {
printf("Received data1.\n"); printf("Received data1.\n");
if (!fwrite(buffer2, read2, 1, file2)) { if (!fwrite(buffer2, read2, 1, file2)) {
printf("file write error1\n"); printf("file write error1\n");
} }
if (read2 < 128) { if (read2 < 128) {
printf("Closed file1 %u\n", read2); printf("Closed file1 %u\n", read2);
fclose(file2); fclose(file2);
@ -191,6 +215,7 @@ int main(int argc, char *argv[])
crypto_kill(inconnection); crypto_kill(inconnection);
} }
} }
/* if we are connected to a friend send him data from the file. /* if we are connected to a friend send him data from the file.
* also put what he sends us in a file. */ * also put what he sends us in a file. */
if (is_cryptoconnected(connection) >= 3) { if (is_cryptoconnected(connection) >= 3) {
@ -198,12 +223,16 @@ int main(int argc, char *argv[])
printf("Wrote data2.\n"); printf("Wrote data2.\n");
read1 = fread(buffer1, 1, 128, file1); read1 = fread(buffer1, 1, 128, file1);
} }
read2 = read_cryptpacket(0, buffer2); read2 = read_cryptpacket(0, buffer2);
if (read2 != 0) { if (read2 != 0) {
printf("Received data2.\n"); printf("Received data2.\n");
if (!fwrite(buffer2, read2, 1, file2)) { if (!fwrite(buffer2, read2, 1, file2)) {
printf("file write error2\n"); printf("file write error2\n");
} }
if (read2 < 128) { if (read2 < 128) {
printf("Closed file2 %u\n", read2); printf("Closed file2 %u\n", read2);
fclose(file2); fclose(file2);
@ -214,6 +243,7 @@ int main(int argc, char *argv[])
crypto_kill(connection); crypto_kill(connection);
} }
} }
doDHT(); doDHT();
doLossless_UDP(); doLossless_UDP();
doNetCrypto(); doNetCrypto();

View File

@ -56,7 +56,8 @@
void printip(IP_Port ip_port) void printip(IP_Port ip_port)
{ {
printf("\nIP: %u.%u.%u.%u Port: %u\n",ip_port.ip.c[0],ip_port.ip.c[1],ip_port.ip.c[2],ip_port.ip.c[3],ntohs(ip_port.port)); printf("\nIP: %u.%u.%u.%u Port: %u\n", ip_port.ip.c[0], ip_port.ip.c[1], ip_port.ip.c[2], ip_port.ip.c[3],
ntohs(ip_port.port));
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -67,6 +68,7 @@ int main(int argc, char *argv[])
printf("usage %s ip port client_id(of friend to find ip_port of) filename(of file to send) client_id(ours)\n", argv[0]); printf("usage %s ip port client_id(of friend to find ip_port of) filename(of file to send) client_id(ours)\n", argv[0]);
exit(0); exit(0);
} }
DHT_addfriend((uint8_t *)argv[3]); DHT_addfriend((uint8_t *)argv[3]);
IP_Port friend_ip; IP_Port friend_ip;
int connection = -1; int connection = -1;
@ -96,11 +98,14 @@ int main(int argc, char *argv[])
uint8_t buffer2[128]; uint8_t buffer2[128];
int read2 = 0; int read2 = 0;
FILE *file1 = fopen(argv[4], "rb"); FILE *file1 = fopen(argv[4], "rb");
if (file1 == NULL) { if (file1 == NULL) {
printf("Error opening file.\n"); printf("Error opening file.\n");
return 1; return 1;
} }
FILE *file2 = fopen("received.txt", "wb"); FILE *file2 = fopen("received.txt", "wb");
if (file2 == NULL) if (file2 == NULL)
return 1; return 1;
@ -115,7 +120,9 @@ int main(int argc, char *argv[])
printf("Received handled packet with length: %u\n", length); printf("Received handled packet with length: %u\n", length);
} }
} }
friend_ip = DHT_getfriendip((uint8_t *)argv[3]); friend_ip = DHT_getfriendip((uint8_t *)argv[3]);
if (friend_ip.ip.i != 0) { if (friend_ip.ip.i != 0) {
if (connection == -1) { if (connection == -1) {
printf("Started connecting to friend:"); printf("Started connecting to friend:");
@ -123,13 +130,16 @@ int main(int argc, char *argv[])
connection = new_connection(friend_ip); connection = new_connection(friend_ip);
} }
} }
if (inconnection == -1) { if (inconnection == -1) {
inconnection = incoming_connection(); inconnection = incoming_connection();
if (inconnection != -1) { if (inconnection != -1) {
printf("Someone connected to us:"); printf("Someone connected to us:");
printip(connection_ip(inconnection)); printip(connection_ip(inconnection));
} }
} }
/* if someone connected to us write what he sends to a file */ /* if someone connected to us write what he sends to a file */
/* also send him our file. */ /* also send him our file. */
if (inconnection != -1) { if (inconnection != -1) {
@ -137,16 +147,21 @@ int main(int argc, char *argv[])
printf("Wrote data.\n"); printf("Wrote data.\n");
read1 = fread(buffer1, 1, 128, file1); read1 = fread(buffer1, 1, 128, file1);
} }
read2 = read_packet(inconnection, buffer2); read2 = read_packet(inconnection, buffer2);
if (read2 != 0) { if (read2 != 0) {
printf("Received data.\n"); printf("Received data.\n");
if (!fwrite(buffer2, read2, 1, file2)) if (!fwrite(buffer2, read2, 1, file2))
printf("file write error\n"); printf("file write error\n");
if (read2 < 128) { if (read2 < 128) {
fclose(file2); fclose(file2);
} }
} }
} }
/* if we are connected to a friend send him data from the file. /* if we are connected to a friend send him data from the file.
* also put what he sends us in a file. */ * also put what he sends us in a file. */
if (is_connected(connection) == 3) { if (is_connected(connection) == 3) {
@ -154,15 +169,20 @@ int main(int argc, char *argv[])
printf("Wrote data.\n"); printf("Wrote data.\n");
read1 = fread(buffer1, 1, 128, file1); read1 = fread(buffer1, 1, 128, file1);
} }
read2 = read_packet(0, buffer2); read2 = read_packet(0, buffer2);
if (read2 != 0) { if (read2 != 0) {
printf("Received data.\n"); printf("Received data.\n");
if (!fwrite(buffer2, read2, 1, file2)) if (!fwrite(buffer2, read2, 1, file2))
printf("file write error\n"); printf("file write error\n");
if (read2 < 128) if (read2 < 128)
fclose(file2); fclose(file2);
} }
} }
doDHT(); doDHT();
doLossless_UDP(); doLossless_UDP();
/* print_clientlist(); /* print_clientlist();

View File

@ -53,11 +53,14 @@ void print_clientlist()
uint32_t i, j; uint32_t i, j;
IP_Port p_ip; IP_Port p_ip;
printf("___________________CLOSE________________________________\n"); printf("___________________CLOSE________________________________\n");
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
printf("ClientID: "); printf("ClientID: ");
for (j = 0; j < 32; j++) { for (j = 0; j < 32; j++) {
printf("%02hhX", close_clientlist[i].client_id[j]); printf("%02hhX", close_clientlist[i].client_id[j]);
} }
p_ip = close_clientlist[i].ip_port; p_ip = close_clientlist[i].ip_port;
printf("\nIP: %u.%u.%u.%u Port: %u", p_ip.ip.c[0], p_ip.ip.c[1], p_ip.ip.c[2], p_ip.ip.c[3], ntohs(p_ip.port)); printf("\nIP: %u.%u.%u.%u Port: %u", p_ip.ip.c[0], p_ip.ip.c[1], p_ip.ip.c[2], p_ip.ip.c[3], ntohs(p_ip.port));
printf("\nTimestamp: %llu", (long long unsigned int) close_clientlist[i].timestamp); printf("\nTimestamp: %llu", (long long unsigned int) close_clientlist[i].timestamp);
@ -73,12 +76,15 @@ void print_friendlist()
uint32_t i, j, k; uint32_t i, j, k;
IP_Port p_ip; IP_Port p_ip;
printf("_________________FRIENDS__________________________________\n"); printf("_________________FRIENDS__________________________________\n");
for (k = 0; k < num_friends; k++) { for (k = 0; k < num_friends; k++) {
printf("FRIEND %u\n", k); printf("FRIEND %u\n", k);
printf("ID: "); printf("ID: ");
for (j = 0; j < 32; j++) { for (j = 0; j < 32; j++) {
printf("%c", friends_list[k].client_id[j]); printf("%c", friends_list[k].client_id[j]);
} }
p_ip = DHT_getfriendip(friends_list[k].client_id); p_ip = DHT_getfriendip(friends_list[k].client_id);
printf("\nIP: %u.%u.%u.%u:%u", p_ip.ip.c[0], p_ip.ip.c[1], p_ip.ip.c[2], p_ip.ip.c[3], ntohs(p_ip.port)); printf("\nIP: %u.%u.%u.%u:%u", p_ip.ip.c[0], p_ip.ip.c[1], p_ip.ip.c[2], p_ip.ip.c[3], ntohs(p_ip.port));
@ -86,11 +92,14 @@ void print_friendlist()
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
printf("ClientID: "); printf("ClientID: ");
for (j = 0; j < 32; j++) { for (j = 0; j < 32; j++) {
if (friends_list[k].client_list[i].client_id[j] < 16) if (friends_list[k].client_list[i].client_id[j] < 16)
printf("0"); printf("0");
printf("%hhX", friends_list[k].client_list[i].client_id[j]); printf("%hhX", friends_list[k].client_list[i].client_id[j]);
} }
p_ip = friends_list[k].client_list[i].ip_port; p_ip = friends_list[k].client_list[i].ip_port;
printf("\nIP: %u.%u.%u.%u:%u", p_ip.ip.c[0], p_ip.ip.c[1], p_ip.ip.c[2], p_ip.ip.c[3], ntohs(p_ip.port)); printf("\nIP: %u.%u.%u.%u:%u", p_ip.ip.c[0], p_ip.ip.c[1], p_ip.ip.c[2], p_ip.ip.c[3], ntohs(p_ip.port));
printf("\nTimestamp: %llu", (long long unsigned int) friends_list[k].client_list[i].timestamp); printf("\nTimestamp: %llu", (long long unsigned int) friends_list[k].client_list[i].timestamp);
@ -107,11 +116,14 @@ void printpacket(uint8_t * data, uint32_t length, IP_Port ip_port)
uint32_t i; uint32_t i;
printf("UNHANDLED PACKET RECEIVED\nLENGTH:%u\nCONTENTS:\n", length); printf("UNHANDLED PACKET RECEIVED\nLENGTH:%u\nCONTENTS:\n", length);
printf("--------------------BEGIN-----------------------------\n"); printf("--------------------BEGIN-----------------------------\n");
for (i = 0; i < length; i++) { for (i = 0; i < length; i++) {
if (data[i] < 16) if (data[i] < 16)
printf("0"); printf("0");
printf("%hhX", data[i]); printf("%hhX", data[i]);
} }
printf("\n--------------------END-----------------------------\n\n\n"); printf("\n--------------------END-----------------------------\n\n\n");
} }
@ -123,17 +135,21 @@ int main(int argc, char *argv[])
printf("usage %s ip port public_key\n", argv[0]); printf("usage %s ip port public_key\n", argv[0]);
exit(0); exit(0);
} }
new_keys(); new_keys();
printf("OUR ID: "); printf("OUR ID: ");
uint32_t i; uint32_t i;
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
if (self_public_key[i] < 16) if (self_public_key[i] < 16)
printf("0"); printf("0");
printf("%hhX", self_public_key[i]); printf("%hhX", self_public_key[i]);
} }
char temp_id[128]; char temp_id[128];
printf("\nEnter the client_id of the friend you wish to add (32 bytes HEX format):\n"); printf("\nEnter the client_id of the friend you wish to add (32 bytes HEX format):\n");
if (scanf("%s", temp_id) != 1) if (scanf("%s", temp_id) != 1)
exit(0); exit(0);

View File

@ -49,17 +49,21 @@ void printpacket(uint8_t *data, uint32_t length, IP_Port ip_port)
uint32_t i; uint32_t i;
printf("UNHANDLED PACKET RECEIVED\nLENGTH:%u\nCONTENTS:\n", length); printf("UNHANDLED PACKET RECEIVED\nLENGTH:%u\nCONTENTS:\n", length);
printf("--------------------BEGIN-----------------------------\n"); printf("--------------------BEGIN-----------------------------\n");
for (i = 0; i < length; i++) { for (i = 0; i < length; i++) {
if (data[i] < 16) if (data[i] < 16)
printf("0"); printf("0");
printf("%hhX", data[i]); printf("%hhX", data[i]);
} }
printf("\n--------------------END-----------------------------\n\n\n"); printf("\n--------------------END-----------------------------\n\n\n");
} }
void printip(IP_Port ip_port) void printip(IP_Port ip_port)
{ {
printf("\nIP: %u.%u.%u.%u Port: %u", ip_port.ip.c[0], ip_port.ip.c[1], ip_port.ip.c[2], ip_port.ip.c[3], ntohs(ip_port.port)); printf("\nIP: %u.%u.%u.%u Port: %u", ip_port.ip.c[0], ip_port.ip.c[1], ip_port.ip.c[2], ip_port.ip.c[3],
ntohs(ip_port.port));
} }
/* /*
void printpackets(Data test) void printpackets(Data test)
@ -153,6 +157,7 @@ int main(int argc, char *argv[])
int read; int read;
FILE *file = fopen(argv[3], "rb"); FILE *file = fopen(argv[3], "rb");
if (file == NULL) if (file == NULL)
return 1; return 1;
@ -169,19 +174,24 @@ int main(int argc, char *argv[])
printip(serverip); printip(serverip);
int connection = new_connection(serverip); int connection = new_connection(serverip);
uint64_t timer = current_time(); uint64_t timer = current_time();
while (1) { while (1) {
/* printconnection(connection); */ /* printconnection(connection); */
Lossless_UDP(); Lossless_UDP();
if (is_connected(connection) == 3) { if (is_connected(connection) == 3) {
printf("Connecting took: %llu us\n", (unsigned long long)(current_time() - timer)); printf("Connecting took: %llu us\n", (unsigned long long)(current_time() - timer));
break; break;
} }
if (is_connected(connection) == 0) { if (is_connected(connection) == 0) {
printf("Connection timeout after: %llu us\n", (unsigned long long)(current_time() - timer)); printf("Connection timeout after: %llu us\n", (unsigned long long)(current_time() - timer));
return 1; return 1;
} }
c_sleep(1); c_sleep(1);
} }
timer = current_time(); timer = current_time();
LosslessUDP_init(); LosslessUDP_init();
@ -192,6 +202,7 @@ int main(int argc, char *argv[])
while (1) { while (1) {
/* printconnection(connection); */ /* printconnection(connection); */
Lossless_UDP(); Lossless_UDP();
if (is_connected(connection) == 3) { if (is_connected(connection) == 3) {
if (write_packet(connection, buffer, read)) { if (write_packet(connection, buffer, read)) {
@ -199,6 +210,7 @@ int main(int argc, char *argv[])
read = fread(buffer, 1, 512, file); read = fread(buffer, 1, 512, file);
} }
/* printf("%u\n", sendqueue(connection)); */ /* printf("%u\n", sendqueue(connection)); */
if (sendqueue(connection) == 0) { if (sendqueue(connection) == 0) {
if (read == 0) { if (read == 0) {
@ -206,11 +218,11 @@ int main(int argc, char *argv[])
break; break;
} }
} }
} } else {
else {
printf("Connecting Lost after: %llu us\n", (unsigned long long)(current_time() - timer)); printf("Connecting Lost after: %llu us\n", (unsigned long long)(current_time() - timer));
return 0; return 0;
} }
/* c_sleep(1); */ /* c_sleep(1); */
} }

View File

@ -50,11 +50,14 @@ void printpacket(uint8_t *data, uint32_t length, IP_Port ip_port)
uint32_t i; uint32_t i;
printf("UNHANDLED PACKET RECEIVED\nLENGTH:%u\nCONTENTS:\n", length); printf("UNHANDLED PACKET RECEIVED\nLENGTH:%u\nCONTENTS:\n", length);
printf("--------------------BEGIN-----------------------------\n"); printf("--------------------BEGIN-----------------------------\n");
for (i = 0; i < length; i++) { for (i = 0; i < length; i++) {
if (data[i] < 16) if (data[i] < 16)
printf("0"); printf("0");
printf("%hhX", data[i]); printf("%hhX", data[i]);
} }
printf("\n--------------------END-----------------------------\n\n\n"); printf("\n--------------------END-----------------------------\n\n\n");
} }
@ -149,6 +152,7 @@ int main(int argc, char *argv[])
int read; int read;
FILE *file = fopen(argv[1], "wb"); FILE *file = fopen(argv[1], "wb");
if (file == NULL) if (file == NULL)
return 1; return 1;
@ -168,13 +172,16 @@ int main(int argc, char *argv[])
while (1) { while (1) {
Lossless_UDP(); Lossless_UDP();
connection = incoming_connection(); connection = incoming_connection();
if (connection != -1) { if (connection != -1) {
if (is_connected(connection) == 2) { if (is_connected(connection) == 2) {
printf("Received the connection.\n"); printf("Received the connection.\n");
} }
break; break;
} }
c_sleep(1); c_sleep(1);
} }
@ -183,20 +190,24 @@ int main(int argc, char *argv[])
while (1) { while (1) {
//printconnection(0); //printconnection(0);
Lossless_UDP(); Lossless_UDP();
if (is_connected(connection) >= 2) { if (is_connected(connection) >= 2) {
kill_connection_in(connection, 3000000); kill_connection_in(connection, 3000000);
read = read_packet(connection, buffer); read = read_packet(connection, buffer);
if (read != 0) { if (read != 0) {
// printf("Received data.\n"); // printf("Received data.\n");
if (!fwrite(buffer, read, 1, file)) if (!fwrite(buffer, read, 1, file))
printf("file write error\n"); printf("file write error\n");
} }
} }
if (is_connected(connection) == 4) { if (is_connected(connection) == 4) {
printf("Connecting Lost after: %llu us\n", (unsigned long long)(current_time() - timer)); printf("Connecting Lost after: %llu us\n", (unsigned long long)(current_time() - timer));
fclose(file); fclose(file);
return 1; return 1;
} }
c_sleep(1); c_sleep(1);
} }

View File

@ -60,18 +60,20 @@ void print_request(uint8_t * public_key, uint8_t * data, uint16_t length, void*
printf("Friend request received from: \n"); printf("Friend request received from: \n");
printf("ClientID: "); printf("ClientID: ");
uint32_t j; uint32_t j;
for(j = 0; j < 32; j++)
{ for (j = 0; j < 32; j++) {
if (public_key[j] < 16) if (public_key[j] < 16)
printf("0"); printf("0");
printf("%hhX", public_key[j]); printf("%hhX", public_key[j]);
} }
printf("\nOf length: %u with data: %s \n", length, data); printf("\nOf length: %u with data: %s \n", length, data);
if(length != sizeof("Install Gentoo")) if (length != sizeof("Install Gentoo")) {
{
return; return;
} }
if (memcmp(data , "Install Gentoo", sizeof("Install Gentoo")) == 0 ) if (memcmp(data , "Install Gentoo", sizeof("Install Gentoo")) == 0 )
//if the request contained the message of peace the person is obviously a friend so we add him. //if the request contained the message of peace the person is obviously a friend so we add him.
{ {
@ -94,6 +96,7 @@ int main(int argc, char *argv[])
} }
m = initMessenger(); m = initMessenger();
if ( !m ) { if ( !m ) {
fputs("Failed to allocate messenger datastructure\n", stderr); fputs("Failed to allocate messenger datastructure\n", stderr);
exit(0); exit(0);
@ -106,7 +109,11 @@ int main(int argc, char *argv[])
DHT_bootstrap(bootstrap_ip_port, hex_string_to_bin(argv[3])); DHT_bootstrap(bootstrap_ip_port, hex_string_to_bin(argv[3]));
} else { } else {
FILE *file = fopen(argv[1], "rb"); FILE *file = fopen(argv[1], "rb");
if ( file==NULL ){return 1;}
if ( file == NULL ) {
return 1;
}
int read; int read;
uint8_t buffer[128000]; uint8_t buffer[128000];
read = fread(buffer, 1, 128000, file); read = fread(buffer, 1, 128000, file);
@ -114,6 +121,7 @@ int main(int argc, char *argv[])
fclose(file); fclose(file);
} }
m_callback_friendrequest(m, print_request, NULL); m_callback_friendrequest(m, print_request, NULL);
m_callback_friendmessage(m, print_message, NULL); m_callback_friendmessage(m, print_message, NULL);
@ -121,9 +129,11 @@ int main(int argc, char *argv[])
uint32_t i; uint32_t i;
uint8_t address[FRIEND_ADDRESS_SIZE]; uint8_t address[FRIEND_ADDRESS_SIZE];
getaddress(m, address); getaddress(m, address);
for (i = 0; i < FRIEND_ADDRESS_SIZE; i++) { for (i = 0; i < FRIEND_ADDRESS_SIZE; i++) {
if (address[i] < 16) if (address[i] < 16)
printf("0"); printf("0");
printf("%hhX", address[i]); printf("%hhX", address[i]);
} }
@ -131,9 +141,11 @@ int main(int argc, char *argv[])
char temp_id[128]; char temp_id[128];
printf("\nEnter the address of the friend you wish to add (38 bytes HEX format):\n"); printf("\nEnter the address of the friend you wish to add (38 bytes HEX format):\n");
if (scanf("%s", temp_id) != 1) { if (scanf("%s", temp_id) != 1) {
return 1; return 1;
} }
int num = m_addfriend(m, hex_string_to_bin(temp_id), (uint8_t *)"Install Gentoo", sizeof("Install Gentoo")); int num = m_addfriend(m, hex_string_to_bin(temp_id), (uint8_t *)"Install Gentoo", sizeof("Install Gentoo"));
perror("Initialization"); perror("Initialization");
@ -147,13 +159,22 @@ int main(int argc, char *argv[])
doMessenger(m); doMessenger(m);
c_sleep(30); c_sleep(30);
FILE *file = fopen("Save.bak", "wb"); FILE *file = fopen("Save.bak", "wb");
if ( file==NULL ){return 1;}
if ( file == NULL ) {
return 1;
}
uint8_t *buffer = malloc(Messenger_size(m)); uint8_t *buffer = malloc(Messenger_size(m));
Messenger_save(m, buffer); Messenger_save(m, buffer);
size_t write_result = fwrite(buffer, 1, Messenger_size(m), file); size_t write_result = fwrite(buffer, 1, Messenger_size(m), file);
if (write_result < Messenger_size(m)) {return 1;}
if (write_result < Messenger_size(m)) {
return 1;
}
free(buffer); free(buffer);
fclose(file); fclose(file);
} }
cleanupMessenger(m); cleanupMessenger(m);
} }

View File

@ -35,8 +35,8 @@ double get_time()
void rand_bytes(uint8_t *b, size_t blen) void rand_bytes(uint8_t *b, size_t blen)
{ {
size_t i; size_t i;
for (i = 0; i < blen; i++)
{ for (i = 0; i < blen; i++) {
b[i] = rand(); b[i] = rand();
} }
} }
@ -78,41 +78,45 @@ int main(int argc, char* argv[])
printf("starting slow...\n"); printf("starting slow...\n");
starttime = get_time(); starttime = get_time();
for (trialno = 0; trialno < numtrials; trialno++)
{ for (trialno = 0; trialno < numtrials; trialno++) {
encrypt_data(pk1, sk2, n, m, sizeof(m), c); encrypt_data(pk1, sk2, n, m, sizeof(m), c);
decrypt_data(pk2, sk1, n, c, sizeof(c), m); decrypt_data(pk2, sk1, n, c, sizeof(c), m);
} }
endtime = get_time(); endtime = get_time();
slow_time = endtime - starttime; slow_time = endtime - starttime;
printf("starting fast...\n"); printf("starting fast...\n");
starttime = get_time(); starttime = get_time();
for (trialno = 0; trialno < numtrials; trialno++)
{ for (trialno = 0; trialno < numtrials; trialno++) {
encrypt_data_fast(k1, n, m, sizeof(m), c); encrypt_data_fast(k1, n, m, sizeof(m), c);
decrypt_data_fast(k2, n, c, sizeof(c), m); decrypt_data_fast(k2, n, c, sizeof(c), m);
} }
endtime = get_time(); endtime = get_time();
fast_time = endtime - starttime; fast_time = endtime - starttime;
printf("starting keygen...\n"); printf("starting keygen...\n");
starttime = get_time(); starttime = get_time();
for (trialno = 0; trialno < numtrials; trialno++)
{ for (trialno = 0; trialno < numtrials; trialno++) {
crypto_box_keypair(pk1, sk1); crypto_box_keypair(pk1, sk1);
crypto_box_keypair(pk2, sk2); crypto_box_keypair(pk2, sk2);
} }
endtime = get_time(); endtime = get_time();
keygen_time = endtime - starttime; keygen_time = endtime - starttime;
printf("starting precompute...\n"); printf("starting precompute...\n");
starttime = get_time(); starttime = get_time();
for (trialno = 0; trialno < numtrials; trialno++)
{ for (trialno = 0; trialno < numtrials; trialno++) {
encrypt_precompute(pk1, sk2, k); encrypt_precompute(pk1, sk2, k);
encrypt_precompute(pk2, sk1, k); encrypt_precompute(pk2, sk1, k);
} }
endtime = get_time(); endtime = get_time();
precompute_time = endtime - starttime; precompute_time = endtime - starttime;

View File

@ -38,6 +38,7 @@ unsigned char * hex_string_to_bin(char hex_string[])
unsigned char *val = malloc(len); unsigned char *val = malloc(len);
char *pos = hex_string; char *pos = hex_string;
int i; int i;
for (i = 0; i < len; ++i, pos += 2) for (i = 0; i < len; ++i, pos += 2)
sscanf(pos, "%2hhx", &val[i]); sscanf(pos, "%2hhx", &val[i]);

View File

@ -146,6 +146,7 @@ static inline void _tox_array_push(struct tox_array *arr, void *new)
{ {
if (arr->length + 1 >= arr->size) if (arr->length + 1 >= arr->size)
tox_array_shrink_to_fit(arr, arr->size); tox_array_shrink_to_fit(arr, arr->size);
arr->data[arr->length++] = new; arr->data[arr->length++] = new;
} }
#define tox_array_push(arr, new) _tox_array_push(arr, (void*)new) #define tox_array_push(arr, new) _tox_array_push(arr, (void*)new)
@ -154,6 +155,7 @@ static inline void* tox_array_pop(struct tox_array *arr)
{ {
if (arr->length - 1 < arr->size / 4) if (arr->length - 1 < arr->size / 4)
tox_array_shrink_to_fit(arr, arr->length * 2); tox_array_shrink_to_fit(arr, arr->length * 2);
return arr->data[arr->length--]; return arr->data[arr->length--];
} }

View File

@ -57,8 +57,8 @@ void get_id(Messenger *m, char *data)
int i = 0; int i = 0;
uint8_t address[FRIEND_ADDRESS_SIZE]; uint8_t address[FRIEND_ADDRESS_SIZE];
getaddress(m, address); getaddress(m, address);
for(; i < FRIEND_ADDRESS_SIZE; i++)
{ for (; i < FRIEND_ADDRESS_SIZE; i++) {
sprintf(data + 2 * i + offset, "%02X ", address[i]); sprintf(data + 2 * i + offset, "%02X ", address[i]);
} }
} }
@ -66,6 +66,7 @@ void get_id(Messenger *m, char *data)
void new_lines(char *line) void new_lines(char *line)
{ {
int i = 0; int i = 0;
for (i = HISTORY - 1; i > 0; i--) for (i = HISTORY - 1; i > 0; i--)
strncpy(lines[i], lines[i - 1], STRING_LENGTH - 1); strncpy(lines[i], lines[i - 1], STRING_LENGTH - 1);
@ -79,6 +80,7 @@ void print_friendlist(Messenger *m)
char name[MAX_NAME_LENGTH]; char name[MAX_NAME_LENGTH];
int i = 0; int i = 0;
new_lines("[i] Friend List:"); new_lines("[i] Friend List:");
while (getname(m, i, (uint8_t *)name) != -1) { while (getname(m, i, (uint8_t *)name) != -1) {
/* account for the longest name and the longest "base" string */ /* account for the longest name and the longest "base" string */
char fstring[MAX_NAME_LENGTH + strlen("[i] Friend: NULL\n\tid: ")]; char fstring[MAX_NAME_LENGTH + strlen("[i] Friend: NULL\n\tid: ")];
@ -88,6 +90,7 @@ void print_friendlist(Messenger *m)
} else { } else {
sprintf(fstring, "[i] Friend: %s\n\tid: %i", (uint8_t *)name, i); sprintf(fstring, "[i] Friend: %s\n\tid: %i", (uint8_t *)name, i);
} }
i++; i++;
new_lines(fstring); new_lines(fstring);
} }
@ -99,11 +102,13 @@ void print_friendlist(Messenger *m)
char *format_message(Messenger *m, char *message, int friendnum) char *format_message(Messenger *m, char *message, int friendnum)
{ {
char name[MAX_NAME_LENGTH]; char name[MAX_NAME_LENGTH];
if (friendnum != -1) { if (friendnum != -1) {
getname(m, friendnum, (uint8_t *)name); getname(m, friendnum, (uint8_t *)name);
} else { } else {
getself_name(m, (uint8_t *)name, sizeof(name)); getself_name(m, (uint8_t *)name, sizeof(name));
} }
char *msg = malloc(100 + strlen(message) + strlen(name) + 1); char *msg = malloc(100 + strlen(message) + strlen(name) + 1);
time_t rawtime; time_t rawtime;
@ -113,12 +118,14 @@ char *format_message(Messenger *m, char *message, int friendnum)
char *time = asctime(timeinfo); char *time = asctime(timeinfo);
size_t len = strlen(time); size_t len = strlen(time);
time[len - 1] = '\0'; time[len - 1] = '\0';
if (friendnum != -1) { if (friendnum != -1) {
sprintf(msg, "[%d] %s <%s> %s", friendnum, time, name, message); sprintf(msg, "[%d] %s <%s> %s", friendnum, time, name, message);
} else { } else {
// This message came from ourselves // This message came from ourselves
sprintf(msg, "%s <%s> %s", time, name, message); sprintf(msg, "%s <%s> %s", time, name, message);
} }
return msg; return msg;
} }
@ -130,9 +137,11 @@ void line_eval(Messenger *m, char *line)
int prompt_offset = 3; int prompt_offset = 3;
strcat(prompt, line); strcat(prompt, line);
new_lines(prompt); new_lines(prompt);
if (inpt_command == 'f') { // add friend command: /f ID if (inpt_command == 'f') { // add friend command: /f ID
int i; int i;
char temp_id[128]; char temp_id[128];
for (i = 0; i < 128; i++) for (i = 0; i < 128; i++)
temp_id[i] = line[i + prompt_offset]; temp_id[i] = line[i + prompt_offset];
@ -140,96 +149,111 @@ void line_eval(Messenger *m, char *line)
int num = m_addfriend(m, bin_string, (uint8_t *)"Install Gentoo", sizeof("Install Gentoo")); int num = m_addfriend(m, bin_string, (uint8_t *)"Install Gentoo", sizeof("Install Gentoo"));
free(bin_string); free(bin_string);
char numstring[100]; char numstring[100];
switch (num) { switch (num) {
case FAERR_TOOLONG: case FAERR_TOOLONG:
sprintf(numstring, "[i] Message is too long."); sprintf(numstring, "[i] Message is too long.");
break; break;
case FAERR_NOMESSAGE: case FAERR_NOMESSAGE:
sprintf(numstring, "[i] Please add a message to your request."); sprintf(numstring, "[i] Please add a message to your request.");
break; break;
case FAERR_OWNKEY: case FAERR_OWNKEY:
sprintf(numstring, "[i] That appears to be your own ID."); sprintf(numstring, "[i] That appears to be your own ID.");
break; break;
case FAERR_ALREADYSENT: case FAERR_ALREADYSENT:
sprintf(numstring, "[i] Friend request already sent."); sprintf(numstring, "[i] Friend request already sent.");
break; break;
case FAERR_UNKNOWN: case FAERR_UNKNOWN:
sprintf(numstring, "[i] Undefined error when adding friend."); sprintf(numstring, "[i] Undefined error when adding friend.");
break; break;
default: default:
sprintf(numstring, "[i] Added friend as %d.", num); sprintf(numstring, "[i] Added friend as %d.", num);
break; break;
} }
new_lines(numstring); new_lines(numstring);
do_refresh(); do_refresh();
} } else if (inpt_command == 'd') {
else if (inpt_command == 'd') {
doMessenger(m); doMessenger(m);
} } else if (inpt_command == 'm') { //message command: /m friendnumber messsage
else if (inpt_command == 'm') { //message command: /m friendnumber messsage
size_t len = strlen(line); size_t len = strlen(line);
if (len < 3) if (len < 3)
return; return;
char numstring[len - 3]; char numstring[len - 3];
char message[len - 3]; char message[len - 3];
int i; int i;
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
if (line[i + 3] != ' ') { if (line[i + 3] != ' ') {
numstring[i] = line[i + 3]; numstring[i] = line[i + 3];
} else { } else {
int j; int j;
for (j = (i + 1); j < (len + 1); j++) for (j = (i + 1); j < (len + 1); j++)
message[j - i - 1] = line[j + 3]; message[j - i - 1] = line[j + 3];
break; break;
} }
} }
int num = atoi(numstring); int num = atoi(numstring);
if (m_sendmessage(m, num, (uint8_t *) message, strlen(message) + 1) != 1) { if (m_sendmessage(m, num, (uint8_t *) message, strlen(message) + 1) != 1) {
new_lines("[i] could not send message"); new_lines("[i] could not send message");
} else { } else {
new_lines(format_message(m, message, -1)); new_lines(format_message(m, message, -1));
} }
} } else if (inpt_command == 'n') {
else if (inpt_command == 'n') {
uint8_t name[MAX_NAME_LENGTH]; uint8_t name[MAX_NAME_LENGTH];
int i = 0; int i = 0;
size_t len = strlen(line); size_t len = strlen(line);
for (i = 3; i < len; i++) { for (i = 3; i < len; i++) {
if (line[i] == 0 || line[i] == '\n') break; if (line[i] == 0 || line[i] == '\n') break;
name[i - 3] = line[i]; name[i - 3] = line[i];
} }
name[i - 3] = 0; name[i - 3] = 0;
setname(m, name, i - 2); setname(m, name, i - 2);
char numstring[100]; char numstring[100];
sprintf(numstring, "[i] changed nick to %s", (char *)name); sprintf(numstring, "[i] changed nick to %s", (char *)name);
new_lines(numstring); new_lines(numstring);
} } else if (inpt_command == 'l') {
else if (inpt_command == 'l') {
print_friendlist(m); print_friendlist(m);
} } else if (inpt_command == 's') {
else if (inpt_command == 's') {
uint8_t status[MAX_STATUSMESSAGE_LENGTH]; uint8_t status[MAX_STATUSMESSAGE_LENGTH];
int i = 0; int i = 0;
size_t len = strlen(line); size_t len = strlen(line);
for (i = 3; i < len; i++) { for (i = 3; i < len; i++) {
if (line[i] == 0 || line[i] == '\n') break; if (line[i] == 0 || line[i] == '\n') break;
status[i - 3] = line[i]; status[i - 3] = line[i];
} }
status[i - 3] = 0; status[i - 3] = 0;
m_set_statusmessage(m, status, strlen((char *)status) + 1); m_set_statusmessage(m, status, strlen((char *)status) + 1);
char numstring[100]; char numstring[100];
sprintf(numstring, "[i] changed status to %s", (char *)status); sprintf(numstring, "[i] changed status to %s", (char *)status);
new_lines(numstring); new_lines(numstring);
} } else if (inpt_command == 'a') {
else if (inpt_command == 'a') {
uint8_t numf = atoi(line + 3); uint8_t numf = atoi(line + 3);
char numchar[100]; char numchar[100];
if (numf >= num_requests || pending_requests[numf].accepted) { if (numf >= num_requests || pending_requests[numf].accepted) {
sprintf(numchar, "[i] you either didn't receive that request or you already accepted it"); sprintf(numchar, "[i] you either didn't receive that request or you already accepted it");
new_lines(numchar); new_lines(numchar);
} else { } else {
int num = m_addfriend_norequest(m, pending_requests[numf].id); int num = m_addfriend_norequest(m, pending_requests[numf].id);
if (num != -1) { if (num != -1) {
pending_requests[numf].accepted = 1; pending_requests[numf].accepted = 1;
sprintf(numchar, "[i] friend request %u accepted", numf); sprintf(numchar, "[i] friend request %u accepted", numf);
@ -241,12 +265,11 @@ void line_eval(Messenger *m, char *line)
new_lines(numchar); new_lines(numchar);
} }
} }
do_refresh(); do_refresh();
} } else if (inpt_command == 'h') { //help
else if (inpt_command == 'h') { //help
new_lines(help); new_lines(help);
} } else if (inpt_command == 'i') { //info
else if (inpt_command == 'i') { //info
char idstring[200]; char idstring[200];
get_id(m, idstring); get_id(m, idstring);
new_lines(idstring); new_lines(idstring);
@ -269,10 +292,12 @@ void wrap(char output[STRING_LENGTH], char input[STRING_LENGTH], int line_width)
strcpy(output, input); strcpy(output, input);
size_t len = strlen(output); size_t len = strlen(output);
int i = 0; int i = 0;
for (i = line_width; i < len; i = i + line_width) { for (i = line_width; i < len; i = i + line_width) {
while (output[i] != ' ' && i != 0) { while (output[i] != ' ' && i != 0) {
i--; i--;
} }
if (i > 0) { if (i > 0) {
output[i] = '\n'; output[i] = '\n';
} }
@ -284,20 +309,24 @@ int count_lines(char *string)
size_t len = strlen(string); size_t len = strlen(string);
int count = 1; int count = 1;
int i; int i;
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
if (string[i] == '\n') if (string[i] == '\n')
count++; count++;
} }
return count; return count;
} }
char *appender(char *str, const char c) char *appender(char *str, const char c)
{ {
size_t len = strlen(str); size_t len = strlen(str);
if (len < STRING_LENGTH) { if (len < STRING_LENGTH) {
str[len + 1] = str[len]; str[len + 1] = str[len];
str[len] = c; str[len] = c;
} }
return str; return str;
} }
@ -307,16 +336,19 @@ void do_refresh()
char wrap_output[STRING_LENGTH]; char wrap_output[STRING_LENGTH];
int L; int L;
int i; int i;
for (i = 0; i < HISTORY; i++) { for (i = 0; i < HISTORY; i++) {
wrap(wrap_output, lines[i], x); wrap(wrap_output, lines[i], x);
L = count_lines(wrap_output); L = count_lines(wrap_output);
count = count + L; count = count + L;
if (count < y) { if (count < y) {
move(y - 1 - count, 0); move(y - 1 - count, 0);
printw(wrap_output); printw(wrap_output);
clrtoeol(); clrtoeol();
} }
} }
move(y - 1, 0); move(y - 1, 0);
clrtoeol(); clrtoeol();
printw(">> "); printw(">> ");
@ -346,6 +378,7 @@ void print_message(Messenger *m, int friendnumber, uint8_t * string, uint16_t le
void print_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) void print_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata)
{ {
char name[MAX_NAME_LENGTH]; char name[MAX_NAME_LENGTH];
if (getname(m, friendnumber, (uint8_t *)name) != -1) { if (getname(m, friendnumber, (uint8_t *)name) != -1) {
char msg[100 + length]; char msg[100 + length];
sprintf(msg, "[i] [%d] %s is now known as %s.", friendnumber, name, string); sprintf(msg, "[i] [%d] %s is now known as %s.", friendnumber, name, string);
@ -356,6 +389,7 @@ void print_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t
void print_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) void print_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata)
{ {
char name[MAX_NAME_LENGTH]; char name[MAX_NAME_LENGTH];
if (getname(m, friendnumber, (uint8_t *)name) != -1) { if (getname(m, friendnumber, (uint8_t *)name) != -1) {
char msg[100 + length + strlen(name) + 1]; char msg[100 + length + strlen(name) + 1];
sprintf(msg, "[i] [%d] %s's status changed to %s.", friendnumber, name, string); sprintf(msg, "[i] [%d] %s's status changed to %s.", friendnumber, name, string);
@ -375,10 +409,12 @@ void load_key(Messenger *m, char *path)
rewind(data_file); rewind(data_file);
uint8_t data[size]; uint8_t data[size];
if (fread(data, sizeof(uint8_t), size, data_file) != size) { if (fread(data, sizeof(uint8_t), size, data_file) != size) {
fputs("[!] could not read data file! exiting...\n", stderr); fputs("[!] could not read data file! exiting...\n", stderr);
goto FILE_ERROR; goto FILE_ERROR;
} }
Messenger_load(m, data, size); Messenger_load(m, data, size);
} else { } else {
@ -401,11 +437,14 @@ void load_key(Messenger *m, char *path)
if (fclose(data_file) < 0) if (fclose(data_file) < 0)
perror("[!] fclose failed"); perror("[!] fclose failed");
return; return;
FILE_ERROR: FILE_ERROR:
if (fclose(data_file) < 0) if (fclose(data_file) < 0)
perror("[!] fclose failed"); perror("[!] fclose failed");
exit(1); exit(1);
} }
@ -449,6 +488,7 @@ int main(int argc, char *argv[])
} }
m = initMessenger(); m = initMessenger();
if ( !m ) { if ( !m ) {
fputs("Failed to allocate Messenger datastructure", stderr); fputs("Failed to allocate Messenger datastructure", stderr);
exit(0); exit(0);
@ -474,6 +514,7 @@ int main(int argc, char *argv[])
IP_Port bootstrap_ip_port; IP_Port bootstrap_ip_port;
bootstrap_ip_port.port = htons(atoi(argv[2])); bootstrap_ip_port.port = htons(atoi(argv[2]));
int resolved_address = resolve_addr(argv[1]); int resolved_address = resolve_addr(argv[1]);
if (resolved_address != 0) if (resolved_address != 0)
bootstrap_ip_port.ip.i = resolved_address; bootstrap_ip_port.ip.i = resolved_address;
else else
@ -483,6 +524,7 @@ int main(int argc, char *argv[])
DHT_bootstrap(bootstrap_ip_port, binary_string); DHT_bootstrap(bootstrap_ip_port, binary_string);
free(binary_string); free(binary_string);
nodelay(stdscr, TRUE); nodelay(stdscr, TRUE);
while (true) { while (true) {
if (on == 0 && DHT_isconnected()) { if (on == 0 && DHT_isconnected()) {
new_lines("[i] connected to DHT\n[i] define username with /n"); new_lines("[i] connected to DHT\n[i] define username with /n");
@ -494,10 +536,12 @@ int main(int argc, char *argv[])
do_refresh(); do_refresh();
c = getch(); c = getch();
if (c == ERR || c == 27) if (c == ERR || c == 27)
continue; continue;
getmaxyx(stdscr, y, x); getmaxyx(stdscr, y, x);
if (c == '\n') { if (c == '\n') {
line_eval(m, line); line_eval(m, line);
strcpy(line, ""); strcpy(line, "");
@ -507,6 +551,7 @@ int main(int argc, char *argv[])
strcpy(line, appender(line, (char) c)); strcpy(line, appender(line, (char) c));
} }
} }
cleanupMessenger(m); cleanupMessenger(m);
endwin(); endwin();
return 0; return 0;

View File

@ -101,11 +101,13 @@ void load_key()
{ {
FILE *data_file = NULL; FILE *data_file = NULL;
data_file = fopen("data", "r"); data_file = fopen("data", "r");
if (data_file) { if (data_file) {
fseek(data_file, 0, SEEK_END); fseek(data_file, 0, SEEK_END);
int size = ftell(data_file); int size = ftell(data_file);
fseek(data_file, 0, SEEK_SET); fseek(data_file, 0, SEEK_SET);
uint8_t data[size]; uint8_t data[size];
if (fread(data, sizeof(uint8_t), size, data_file) != size) { if (fread(data, sizeof(uint8_t), size, data_file) != size) {
printf("\n[i] Could not read the data file. Exiting."); printf("\n[i] Could not read the data file. Exiting.");
exit(1); exit(1);
@ -124,6 +126,7 @@ void load_key()
exit(1); exit(1);
} }
} }
fclose(data_file); fclose(data_file);
} }
@ -142,8 +145,7 @@ void add_friend()
sprintf(numstring, "\n[i] Friend request sent. Wait to be accepted. Friend id: %d\n\n", num); sprintf(numstring, "\n[i] Friend request sent. Wait to be accepted. Friend id: %d\n\n", num);
printf(numstring); printf(numstring);
++maxnumfriends; ++maxnumfriends;
} } else if (num == -1)
else if (num == -1)
printf("\n[i] Message is too long.\n\n"); printf("\n[i] Message is too long.\n\n");
else if (num == -2) else if (num == -2)
@ -170,6 +172,7 @@ void list_friends()
for (i = 0; i <= maxnumfriends; i++) { for (i = 0; i <= maxnumfriends; i++) {
char name[MAX_NAME_LENGTH]; char name[MAX_NAME_LENGTH];
getname(messenger, i, (uint8_t *)name); getname(messenger, i, (uint8_t *)name);
if (m_friendstatus(messenger, i) > 0 && m_friendstatus(messenger, i) < 4) if (m_friendstatus(messenger, i) > 0 && m_friendstatus(messenger, i) < 4)
printf("[%d] %s\n", i, (uint8_t *)name); printf("[%d] %s\n", i, (uint8_t *)name);
} }
@ -295,11 +298,13 @@ void accept_friend_request()
friend_request_received = 0; friend_request_received = 0;
uint8_t numf = atoi(line + 3); uint8_t numf = atoi(line + 3);
char numchar[100]; char numchar[100];
if (numf >= num_requests || pending_requests[numf].accepted) { if (numf >= num_requests || pending_requests[numf].accepted) {
sprintf(numchar, "\n[i] you either didn't receive that request or you already accepted it"); sprintf(numchar, "\n[i] you either didn't receive that request or you already accepted it");
printf(numchar); printf(numchar);
} else { } else {
int num = m_addfriend_norequest(messenger, pending_requests[numf].id); int num = m_addfriend_norequest(messenger, pending_requests[numf].id);
if (num != -1) { if (num != -1) {
pending_requests[numf].accepted = 1; pending_requests[numf].accepted = 1;
sprintf(numchar, "\n[i] Added friendnumber: %d\n\n", num); sprintf(numchar, "\n[i] Added friendnumber: %d\n\n", num);
@ -375,11 +380,14 @@ int main(int argc, char *argv[])
printf("[!] Usage: %s [IP] [port] [public_key] <nokey>\n", argv[0]); printf("[!] Usage: %s [IP] [port] [public_key] <nokey>\n", argv[0]);
exit(0); exit(0);
} }
messenger = initMessenger(); messenger = initMessenger();
if (messenger == 0) { if (messenger == 0) {
printf("initMessenger failed"); printf("initMessenger failed");
exit(0); exit(0);
} }
if (argc > 4) { if (argc > 4) {
if (strncmp(argv[4], "nokey", 6) < 0) { if (strncmp(argv[4], "nokey", 6) < 0) {
} }
@ -392,11 +400,14 @@ int main(int argc, char *argv[])
FILE *name_file = NULL; FILE *name_file = NULL;
name_file = fopen("namefile.txt", "r"); name_file = fopen("namefile.txt", "r");
if (name_file) { if (name_file) {
uint8_t name[MAX_NAME_LENGTH]; uint8_t name[MAX_NAME_LENGTH];
while (fgets(line, MAX_NAME_LENGTH, name_file) != NULL) { while (fgets(line, MAX_NAME_LENGTH, name_file) != NULL) {
sscanf(line, "%s", (char *)name); sscanf(line, "%s", (char *)name);
} }
setname(messenger, name, strlen((char *)name) + 1); setname(messenger, name, strlen((char *)name) + 1);
nameloaded = 1; nameloaded = 1;
printf("%s\n", name); printf("%s\n", name);
@ -405,11 +416,14 @@ int main(int argc, char *argv[])
FILE *status_file = NULL; FILE *status_file = NULL;
status_file = fopen("statusfile.txt", "r"); status_file = fopen("statusfile.txt", "r");
if (status_file) { if (status_file) {
uint8_t status[MAX_STATUSMESSAGE_LENGTH]; uint8_t status[MAX_STATUSMESSAGE_LENGTH];
while (fgets(line, MAX_STATUSMESSAGE_LENGTH, status_file) != NULL) { while (fgets(line, MAX_STATUSMESSAGE_LENGTH, status_file) != NULL) {
sscanf(line, "%s", (char *)status); sscanf(line, "%s", (char *)status);
} }
m_set_statusmessage(messenger, status, strlen((char *)status) + 1); m_set_statusmessage(messenger, status, strlen((char *)status) + 1);
statusloaded = 1; statusloaded = 1;
printf("%s\n", status); printf("%s\n", status);
@ -423,16 +437,19 @@ int main(int argc, char *argv[])
char idstring1[PUB_KEY_BYTES][5]; char idstring1[PUB_KEY_BYTES][5];
char idstring2[PUB_KEY_BYTES][5]; char idstring2[PUB_KEY_BYTES][5];
int i; int i;
for(i = 0; i < PUB_KEY_BYTES; i++)
{ for (i = 0; i < PUB_KEY_BYTES; i++) {
if (self_public_key[i] < (PUB_KEY_BYTES / 2)) if (self_public_key[i] < (PUB_KEY_BYTES / 2))
strcpy(idstring1[i], "0"); strcpy(idstring1[i], "0");
else else
strcpy(idstring1[i], ""); strcpy(idstring1[i], "");
sprintf(idstring2[i], "%hhX", self_public_key[i]); sprintf(idstring2[i], "%hhX", self_public_key[i]);
} }
strcpy(users_id, "[i] your ID: "); strcpy(users_id, "[i] your ID: ");
int j; int j;
for (j = 0; j < PUB_KEY_BYTES; j++) { for (j = 0; j < PUB_KEY_BYTES; j++) {
strcat(users_id, idstring1[j]); strcat(users_id, idstring1[j]);
strcat(users_id, idstring2[j]); strcat(users_id, idstring2[j]);
@ -443,6 +460,7 @@ int main(int argc, char *argv[])
IP_Port bootstrap_ip_port; IP_Port bootstrap_ip_port;
bootstrap_ip_port.port = htons(atoi(argv[2])); bootstrap_ip_port.port = htons(atoi(argv[2]));
int resolved_address = resolve_addr(argv[1]); int resolved_address = resolve_addr(argv[1]);
if (resolved_address != 0) if (resolved_address != 0)
bootstrap_ip_port.ip.i = resolved_address; bootstrap_ip_port.ip.i = resolved_address;
else else
@ -472,13 +490,16 @@ int main(int argc, char *argv[])
printf("\n---------------------------------\n\n"); printf("\n---------------------------------\n\n");
on = 0; on = 0;
} }
if (on == 0 && DHT_isconnected()) { if (on == 0 && DHT_isconnected()) {
printf("\n[i] Connected to DHT"); printf("\n[i] Connected to DHT");
printf("\n---------------------------------\n\n"); printf("\n---------------------------------\n\n");
on = 1; on = 1;
} }
doMessenger(messenger); doMessenger(messenger);
Sleep(1); Sleep(1);
} }
return 0; return 0;
} }

View File

@ -16,12 +16,14 @@ void mssleep(int ms)
#endif #endif
} }
int callback(timer* t, void* arg){ int callback(timer *t, void *arg)
{
printf("%s\n", (char *)arg); printf("%s\n", (char *)arg);
return 1; return 1;
} }
int repeating(timer* t, void *arg) { int repeating(timer *t, void *arg)
{
printf("%s\n", (char *)arg); printf("%s\n", (char *)arg);
timer_start(t, 3); timer_start(t, 3);
return 0; return 0;

View File

@ -92,6 +92,7 @@ static void chat_onNickChange(ToxWindow *self, int num, uint8_t *nick, uint16_t
{ {
ChatContext *ctx = (ChatContext *) self->x; ChatContext *ctx = (ChatContext *) self->x;
struct tm *timeinfo = get_time(); struct tm *timeinfo = get_time();
if (ctx->friendnum != num) if (ctx->friendnum != num)
return; return;
@ -112,6 +113,7 @@ static void chat_onStatusChange(ToxWindow *self, int num, uint8_t *status, uint1
{ {
ChatContext *ctx = (ChatContext *) self->x; ChatContext *ctx = (ChatContext *) self->x;
struct tm *timeinfo = get_time(); struct tm *timeinfo = get_time();
if (ctx->friendnum != num) if (ctx->friendnum != num)
return; return;
@ -161,6 +163,7 @@ static void chat_onKey(ToxWindow *self, Messenger *m, int key)
else if (key == 0x107 || key == 0x8 || key == 0x7f) { else if (key == 0x107 || key == 0x8 || key == 0x7f) {
if (ctx->pos > 0) { if (ctx->pos > 0) {
ctx->line[--ctx->pos] = '\0'; ctx->line[--ctx->pos] = '\0';
if (x == 0) if (x == 0)
mvwdelch(self->window, y - 1, x2 - 1); mvwdelch(self->window, y - 1, x2 - 1);
else else
@ -173,6 +176,7 @@ static void chat_onKey(ToxWindow *self, Messenger *m, int key)
wclear(ctx->linewin); wclear(ctx->linewin);
wmove(self->window, y2 - CURS_Y_OFFSET, 0); wmove(self->window, y2 - CURS_Y_OFFSET, 0);
wclrtobot(self->window); wclrtobot(self->window);
if (ctx->line[0] == '/') if (ctx->line[0] == '/')
execute(self, ctx, m, ctx->line); execute(self, ctx, m, ctx->line);
else { else {
@ -189,6 +193,7 @@ static void chat_onKey(ToxWindow *self, Messenger *m, int key)
wprintw(ctx->history, "%s: ", selfname); wprintw(ctx->history, "%s: ", selfname);
wattroff(ctx->history, COLOR_PAIR(1)); wattroff(ctx->history, COLOR_PAIR(1));
wprintw(ctx->history, "%s\n", ctx->line); wprintw(ctx->history, "%s\n", ctx->line);
if (m_sendmessage(m, ctx->friendnum, (uint8_t *) ctx->line, strlen(ctx->line) + 1) == 0) { if (m_sendmessage(m, ctx->friendnum, (uint8_t *) ctx->line, strlen(ctx->line) + 1) == 0) {
wattron(ctx->history, COLOR_PAIR(3)); wattron(ctx->history, COLOR_PAIR(3));
wprintw(ctx->history, " * Failed to send message.\n"); wprintw(ctx->history, " * Failed to send message.\n");
@ -196,6 +201,7 @@ static void chat_onKey(ToxWindow *self, Messenger *m, int key)
} }
} }
} }
ctx->line[0] = '\0'; ctx->line[0] = '\0';
ctx->pos = 0; ctx->pos = 0;
} }
@ -223,10 +229,12 @@ void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd)
else if (!strncmp(cmd, "/me ", strlen("/me "))) { else if (!strncmp(cmd, "/me ", strlen("/me "))) {
struct tm *timeinfo = get_time(); struct tm *timeinfo = get_time();
char *action = strchr(cmd, ' '); char *action = strchr(cmd, ' ');
if (action == NULL) { if (action == NULL) {
wprintw(self->window, "Invalid syntax.\n"); wprintw(self->window, "Invalid syntax.\n");
return; return;
} }
action++; action++;
wattron(ctx->history, COLOR_PAIR(2)); wattron(ctx->history, COLOR_PAIR(2));
@ -241,6 +249,7 @@ void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd)
wattron(ctx->history, COLOR_PAIR(5)); wattron(ctx->history, COLOR_PAIR(5));
wprintw(ctx->history, msg); wprintw(ctx->history, msg);
wattroff(ctx->history, COLOR_PAIR(5)); wattroff(ctx->history, COLOR_PAIR(5));
if (m_sendaction(m, ctx->friendnum, (uint8_t *) msg, strlen(msg) + 1) < 0) { if (m_sendaction(m, ctx->friendnum, (uint8_t *) msg, strlen(msg) + 1) < 0) {
wattron(ctx->history, COLOR_PAIR(3)); wattron(ctx->history, COLOR_PAIR(3));
wprintw(ctx->history, " * Failed to send action\n"); wprintw(ctx->history, " * Failed to send action\n");
@ -252,12 +261,15 @@ void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd)
char *status = strchr(cmd, ' '); char *status = strchr(cmd, ' ');
char *msg; char *msg;
char *status_text; char *status_text;
if (status == NULL) { if (status == NULL) {
wprintw(ctx->history, "Invalid syntax.\n"); wprintw(ctx->history, "Invalid syntax.\n");
return; return;
} }
status++; status++;
USERSTATUS status_kind; USERSTATUS status_kind;
if (!strncmp(status, "online", strlen("online"))) { if (!strncmp(status, "online", strlen("online"))) {
status_kind = USERSTATUS_NONE; status_kind = USERSTATUS_NONE;
status_text = "ONLINE"; status_text = "ONLINE";
@ -279,11 +291,11 @@ void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd)
} }
msg = strchr(status, ' '); msg = strchr(status, ' ');
if (msg == NULL) { if (msg == NULL) {
m_set_userstatus(m, status_kind); m_set_userstatus(m, status_kind);
wprintw(ctx->history, "Status set to: %s\n", status_text); wprintw(ctx->history, "Status set to: %s\n", status_text);
} } else {
else {
msg++; msg++;
m_set_userstatus(m, status_kind); m_set_userstatus(m, status_kind);
m_set_statusmessage(m, ( uint8_t *) msg, strlen(msg) + 1); m_set_statusmessage(m, ( uint8_t *) msg, strlen(msg) + 1);
@ -294,6 +306,7 @@ void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd)
else if (!strncmp(cmd, "/nick ", strlen("/nick "))) { else if (!strncmp(cmd, "/nick ", strlen("/nick "))) {
char *nick; char *nick;
nick = strchr(cmd, ' '); nick = strchr(cmd, ' ');
if (nick == NULL) { if (nick == NULL) {
wprintw(ctx->history, "Invalid syntax.\n"); wprintw(ctx->history, "Invalid syntax.\n");
return; return;
@ -309,11 +322,13 @@ void execute(ToxWindow *self, ChatContext *ctx, Messenger *m, char *cmd)
int i; int i;
uint8_t address[FRIEND_ADDRESS_SIZE]; uint8_t address[FRIEND_ADDRESS_SIZE];
getaddress(m, address); getaddress(m, address);
for (i = 0; i < FRIEND_ADDRESS_SIZE; i++) { for (i = 0; i < FRIEND_ADDRESS_SIZE; i++) {
char xx[3]; char xx[3];
snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff); snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff);
strcat(id, xx); strcat(id, xx);
} }
wprintw(ctx->history, "%s\n", id); wprintw(ctx->history, "%s\n", id);
} }

View File

@ -50,6 +50,7 @@ char *get_user_config_dir(void)
BOOL ok; BOOL ok;
ok = SHGetSpecialFolderPathA(NULL, appdata, CSIDL_PROFILE, TRUE); ok = SHGetSpecialFolderPathA(NULL, appdata, CSIDL_PROFILE, TRUE);
if (!ok) { if (!ok) {
return NULL; return NULL;
} }
@ -72,13 +73,16 @@ char *get_user_config_dir(void)
int rc; int rc;
rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf); rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf);
if (rc == 0) { if (rc == 0) {
home = pwd.pw_dir; home = pwd.pw_dir;
} else { } else {
home = getenv("HOME"); home = getenv("HOME");
if (home == NULL) { if (home == NULL) {
return NULL; return NULL;
} }
/* env variables can be tainted */ /* env variables can be tainted */
snprintf(buf, sizeof(buf), "%s", home); snprintf(buf, sizeof(buf), "%s", home);
home = buf; home = buf;
@ -87,6 +91,7 @@ char *get_user_config_dir(void)
# if defined(__APPLE__) # if defined(__APPLE__)
len = strlen(home) + strlen("/Library/Application Support") + 1; len = strlen(home) + strlen("/Library/Application Support") + 1;
user_config_dir = malloc(len); user_config_dir = malloc(len);
if (user_config_dir == NULL) { if (user_config_dir == NULL) {
return NULL; return NULL;
} }
@ -95,6 +100,7 @@ char *get_user_config_dir(void)
# else /* __APPLE__ */ # else /* __APPLE__ */
len = strlen(home) + strlen("/.config") + 1; len = strlen(home) + strlen("/.config") + 1;
user_config_dir = malloc(len); user_config_dir = malloc(len);
if (user_config_dir == NULL) { if (user_config_dir == NULL) {
return NULL; return NULL;
} }
@ -123,6 +129,7 @@ int create_user_config_dir(char *path)
mkdir_err = _mkdir(fullpath); mkdir_err = _mkdir(fullpath);
struct __stat64 buf; struct __stat64 buf;
if (mkdir_err && (errno != EEXIST || _wstat64(fullpath, &buf) || !S_ISDIR(buf.st_mode))) { if (mkdir_err && (errno != EEXIST || _wstat64(fullpath, &buf) || !S_ISDIR(buf.st_mode))) {
free(fullpath); free(fullpath);
return -1; return -1;

View File

@ -18,6 +18,7 @@ static void dhtstatus_onKey(ToxWindow *self, Messenger *m, int key)
case 'k': case 'k':
if (--num_selected < 0) if (--num_selected < 0)
num_selected = CLIENT_ID_SIZE - 1; num_selected = CLIENT_ID_SIZE - 1;
break; break;
case KEY_DOWN: case KEY_DOWN:
@ -42,12 +43,18 @@ static void dhtstatus_onDraw(ToxWindow *self)
uint64_t now = unix_time(); uint64_t now = unix_time();
uint32_t i, j; uint32_t i, j;
ipbuf ipbuf; ipbuf ipbuf;
wprintw(self->window,"\n%llu ______________________ CLOSE LIST ________________________ ___ IP ADDR ___ _PRT_ LST PNG ____ SELF ____ _PRT_ LST\n\n", now); wprintw(self->window,
"\n%llu ______________________ CLOSE LIST ________________________ ___ IP ADDR ___ _PRT_ LST PNG ____ SELF ____ _PRT_ LST\n\n",
now);
for (i = 0; i < 32; i++) { /*Number of nodes in closelist*/ for (i = 0; i < 32; i++) { /*Number of nodes in closelist*/
Client_data *client = close_clientlist + i; Client_data *client = close_clientlist + i;
if (i == num_selected) wattron(self->window, COLOR_PAIR(3)); if (i == num_selected) wattron(self->window, COLOR_PAIR(3));
wprintw(self->window, "[%02i] ", i); wprintw(self->window, "[%02i] ", i);
uint16_t port = ntohs(client->ip_port.port); uint16_t port = ntohs(client->ip_port.port);
if (port) { if (port) {
for (j = 0; j < CLIENT_ID_SIZE; j++) for (j = 0; j < CLIENT_ID_SIZE; j++)
wprintw(self->window, "%02hhx", client->client_id[j]); wprintw(self->window, "%02hhx", client->client_id[j]);
@ -58,12 +65,15 @@ static void dhtstatus_onDraw(ToxWindow *self)
wprintw(self->window, " %3llu ", now - client->last_pinged); wprintw(self->window, " %3llu ", now - client->last_pinged);
port = ntohs(client->ret_ip_port.port); port = ntohs(client->ret_ip_port.port);
if (port) { if (port) {
printip(ipbuf, client->ret_ip_port.ip); printip(ipbuf, client->ret_ip_port.ip);
wprintw(self->window, " %15s %5u %3llu", ipbuf, port, now - close_clientlist[i].ret_timestamp); wprintw(self->window, " %15s %5u %3llu", ipbuf, port, now - close_clientlist[i].ret_timestamp);
} }
} }
wprintw(self->window, "\n"); wprintw(self->window, "\n");
if (i == num_selected) wattroff(self->window, COLOR_PAIR(3)); if (i == num_selected) wattroff(self->window, COLOR_PAIR(3));
} }

View File

@ -31,11 +31,14 @@ void fix_name(uint8_t *name)
/* Remove all non alphanumeric characters */ /* Remove all non alphanumeric characters */
uint8_t *p = name; uint8_t *p = name;
uint8_t *q = name; uint8_t *q = name;
while (*p != 0) { while (*p != 0) {
if (isprint(*p)) if (isprint(*p))
*q++ = *p; *q++ = *p;
p++; p++;
} }
*q = 0; *q = 0;
} }
@ -47,6 +50,7 @@ void friendlist_onMessage(ToxWindow *self, Messenger *m, int num, uint8_t *str,
if (friends[num].chatwin == -1) { if (friends[num].chatwin == -1) {
friends[num].chatwin = num; friends[num].chatwin = num;
int i; int i;
/* Find first open slot to hold chat window */ /* Find first open slot to hold chat window */
for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
if (WINDOW_STATUS[i] == -1) { if (WINDOW_STATUS[i] == -1) {
@ -96,15 +100,14 @@ static void friendlist_onKey(ToxWindow *self, Messenger *m, int key)
if (key == KEY_UP) { if (key == KEY_UP) {
if (--num_selected < 0) if (--num_selected < 0)
num_selected = num_friends - 1; num_selected = num_friends - 1;
} } else if (key == KEY_DOWN) {
else if (key == KEY_DOWN) {
if (num_friends != 0) if (num_friends != 0)
num_selected = (num_selected + 1) % num_friends; num_selected = (num_selected + 1) % num_friends;
} } else if (key == '\n') {
else if (key == '\n') {
/* Jump to chat window if already open */ /* Jump to chat window if already open */
if (friends[num_selected].chatwin != -1) { if (friends[num_selected].chatwin != -1) {
int i; int i;
for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
if (WINDOW_STATUS[i] == num_selected) { if (WINDOW_STATUS[i] == num_selected) {
set_active_window(i); set_active_window(i);
@ -113,6 +116,7 @@ static void friendlist_onKey(ToxWindow *self, Messenger *m, int key)
} }
} else { } else {
int i; int i;
for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
if (WINDOW_STATUS[i] == -1) { if (WINDOW_STATUS[i] == -1) {
WINDOW_STATUS[i] = num_selected; WINDOW_STATUS[i] = num_selected;
@ -129,10 +133,10 @@ static void friendlist_onDraw(ToxWindow *self)
{ {
curs_set(0); curs_set(0);
werase(self->window); werase(self->window);
if (num_friends == 0) { if (num_friends == 0) {
wprintw(self->window, "Empty. Add some friends! :-)\n"); wprintw(self->window, "Empty. Add some friends! :-)\n");
} } else {
else {
wattron(self->window, COLOR_PAIR(2) | A_BOLD); wattron(self->window, COLOR_PAIR(2) | A_BOLD);
wprintw(self->window, "Open chat with.. (up/down keys, enter)\n"); wprintw(self->window, "Open chat with.. (up/down keys, enter)\n");
wattroff(self->window, COLOR_PAIR(2) | A_BOLD); wattroff(self->window, COLOR_PAIR(2) | A_BOLD);
@ -140,9 +144,12 @@ static void friendlist_onDraw(ToxWindow *self)
wprintw(self->window, "\n"); wprintw(self->window, "\n");
int i; int i;
for (i = 0; i < num_friends; ++i) { for (i = 0; i < num_friends; ++i) {
if (i == num_selected) wattron(self->window, COLOR_PAIR(3)); if (i == num_selected) wattron(self->window, COLOR_PAIR(3));
wprintw(self->window, " [#%d] ", friends[i].num); wprintw(self->window, " [#%d] ", friends[i].num);
if (i == num_selected) wattroff(self->window, COLOR_PAIR(3)); if (i == num_selected) wattroff(self->window, COLOR_PAIR(3));
attron(A_BOLD); attron(A_BOLD);
@ -151,6 +158,7 @@ static void friendlist_onDraw(ToxWindow *self)
wprintw(self->window, "(%s)\n", friends[i].status); wprintw(self->window, "(%s)\n", friends[i].status);
} }
wrefresh(self->window); wrefresh(self->window);
} }
@ -164,7 +172,8 @@ static void friendlist_onInit(ToxWindow *self, Messenger *m)
} }
ToxWindow new_friendlist(char * ws) { ToxWindow new_friendlist(char *ws)
{
WINDOW_STATUS = ws; WINDOW_STATUS = ws;
ToxWindow ret; ToxWindow ret;
memset(&ret, 0, sizeof(ret)); memset(&ret, 0, sizeof(ret));

View File

@ -53,6 +53,7 @@ static void init_term()
init_pair(4, COLOR_BLUE, COLOR_BLACK); init_pair(4, COLOR_BLUE, COLOR_BLACK);
init_pair(5, COLOR_YELLOW, COLOR_BLACK); init_pair(5, COLOR_YELLOW, COLOR_BLACK);
} }
refresh(); refresh();
} }
@ -88,34 +89,41 @@ int init_connection(void)
return 0; return 0;
FILE *fp = fopen("../../../other/DHTservers", "r"); FILE *fp = fopen("../../../other/DHTservers", "r");
if (!fp) if (!fp)
return 1; return 1;
char servers[MAXSERVERS][MAXLINE]; char servers[MAXSERVERS][MAXLINE];
char line[MAXLINE]; char line[MAXLINE];
int linecnt = 0; int linecnt = 0;
while (fgets(line, sizeof(line), fp) && linecnt < MAXSERVERS) { while (fgets(line, sizeof(line), fp) && linecnt < MAXSERVERS) {
if (strlen(line) > MINLINE) if (strlen(line) > MINLINE)
strcpy(servers[linecnt++], line); strcpy(servers[linecnt++], line);
} }
if (linecnt < 1) { if (linecnt < 1) {
fclose(fp); fclose(fp);
return 2; return 2;
} }
fclose(fp); fclose(fp);
char *server = servers[rand() % linecnt]; char *server = servers[rand() % linecnt];
char *ip = strtok(server, " "); char *ip = strtok(server, " ");
char *port = strtok(NULL, " "); char *port = strtok(NULL, " ");
char *key = strtok(NULL, " "); char *key = strtok(NULL, " ");
if (!ip || !port || !key) if (!ip || !port || !key)
return 3; return 3;
IP_Port dht; IP_Port dht;
dht.port = htons(atoi(port)); dht.port = htons(atoi(port));
uint32_t resolved_address = resolve_addr(ip); uint32_t resolved_address = resolve_addr(ip);
if (resolved_address == 0) if (resolved_address == 0)
return 0; return 0;
dht.ip.i = resolved_address; dht.ip.i = resolved_address;
unsigned char *binary_string = hex_string_to_bin(key); unsigned char *binary_string = hex_string_to_bin(key);
DHT_bootstrap(dht, binary_string); DHT_bootstrap(dht, binary_string);
@ -128,22 +136,23 @@ static void do_tox(Messenger *m, ToxWindow * prompt)
static int conn_try = 0; static int conn_try = 0;
static int conn_err = 0; static int conn_err = 0;
static bool dht_on = false; static bool dht_on = false;
if (!dht_on && !DHT_isconnected() && !(conn_try++ % 100)) { if (!dht_on && !DHT_isconnected() && !(conn_try++ % 100)) {
if (!conn_err) { if (!conn_err) {
conn_err = init_connection(); conn_err = init_connection();
wprintw(prompt->window, "\nEstablishing connection...\n"); wprintw(prompt->window, "\nEstablishing connection...\n");
if (conn_err) if (conn_err)
wprintw(prompt->window, "\nAuto-connect failed with error code %d\n", conn_err); wprintw(prompt->window, "\nAuto-connect failed with error code %d\n", conn_err);
} }
} } else if (!dht_on && DHT_isconnected()) {
else if (!dht_on && DHT_isconnected()) {
dht_on = true; dht_on = true;
wprintw(prompt->window, "\nDHT connected.\n"); wprintw(prompt->window, "\nDHT connected.\n");
} } else if (dht_on && !DHT_isconnected()) {
else if (dht_on && !DHT_isconnected()) {
dht_on = false; dht_on = false;
wprintw(prompt->window, "\nDHT disconnected. Attempting to reconnect.\n"); wprintw(prompt->window, "\nDHT disconnected. Attempting to reconnect.\n");
} }
doMessenger(m); doMessenger(m);
} }
@ -160,18 +169,22 @@ int store_data(Messenger *m, char *path)
{ {
if (f_loadfromfile == 0) /*If file loading/saving is disabled*/ if (f_loadfromfile == 0) /*If file loading/saving is disabled*/
return 0; return 0;
FILE *fd; FILE *fd;
size_t len; size_t len;
uint8_t *buf; uint8_t *buf;
len = Messenger_size(m); len = Messenger_size(m);
buf = malloc(len); buf = malloc(len);
if (buf == NULL) { if (buf == NULL) {
return 1; return 1;
} }
Messenger_save(m, buf); Messenger_save(m, buf);
fd = fopen(path, "w"); fd = fopen(path, "w");
if (fd == NULL) { if (fd == NULL) {
free(buf); free(buf);
return 2; return 2;
@ -192,6 +205,7 @@ static void load_data(Messenger *m, char *path)
{ {
if (f_loadfromfile == 0) /*If file loading/saving is disabled*/ if (f_loadfromfile == 0) /*If file loading/saving is disabled*/
return; return;
FILE *fd; FILE *fd;
size_t len; size_t len;
uint8_t *buf; uint8_t *buf;
@ -202,12 +216,14 @@ static void load_data(Messenger *m, char *path)
fseek(fd, 0, SEEK_SET); fseek(fd, 0, SEEK_SET);
buf = malloc(len); buf = malloc(len);
if (buf == NULL) { if (buf == NULL) {
fprintf(stderr, "malloc() failed.\n"); fprintf(stderr, "malloc() failed.\n");
fclose(fd); fclose(fd);
endwin(); endwin();
exit(1); exit(1);
} }
if (fread(buf, len, 1, fd) != 1) { if (fread(buf, len, 1, fd) != 1) {
fprintf(stderr, "fread() failed.\n"); fprintf(stderr, "fread() failed.\n");
free(buf); free(buf);
@ -215,9 +231,11 @@ static void load_data(Messenger *m, char *path)
endwin(); endwin();
exit(1); exit(1);
} }
Messenger_load(m, buf, len); Messenger_load(m, buf, len);
uint32_t i; uint32_t i;
for (i = 0; i < m->numfriends; i++) { for (i = 0; i < m->numfriends; i++) {
on_friendadded(m, i); on_friendadded(m, i);
} }
@ -226,6 +244,7 @@ static void load_data(Messenger *m, char *path)
fclose(fd); fclose(fd);
} else { } else {
int st; int st;
if ((st = store_data(m, path)) != 0) { if ((st = store_data(m, path)) != 0) {
fprintf(stderr, "Store messenger failed with return code: %d\n", st); fprintf(stderr, "Store messenger failed with return code: %d\n", st);
endwin(); endwin();
@ -242,6 +261,7 @@ int main(int argc, char *argv[])
f_loadfromfile = 1; f_loadfromfile = 1;
int f_flag = 0; int f_flag = 0;
int i = 0; int i = 0;
for (i = 0; i < argc; ++i) { for (i = 0; i < argc; ++i) {
if (argv[i] == NULL) if (argv[i] == NULL)
break; break;
@ -259,6 +279,7 @@ int main(int argc, char *argv[])
if (DATA_FILE == NULL ) { if (DATA_FILE == NULL ) {
config_err = create_user_config_dir(user_config_dir); config_err = create_user_config_dir(user_config_dir);
if (config_err) { if (config_err) {
DATA_FILE = strdup("data"); DATA_FILE = strdup("data");
} else { } else {
@ -268,6 +289,7 @@ int main(int argc, char *argv[])
strcat(DATA_FILE, "data"); strcat(DATA_FILE, "data");
} }
} }
free(user_config_dir); free(user_config_dir);
init_term(); init_term();
@ -291,6 +313,7 @@ int main(int argc, char *argv[])
"defaulting to 'data' for a keyfile...\n"); "defaulting to 'data' for a keyfile...\n");
attroff(COLOR_PAIR(3) | A_BOLD); attroff(COLOR_PAIR(3) | A_BOLD);
} }
while (true) { while (true) {
/* Update tox */ /* Update tox */
do_tox(m, prompt); do_tox(m, prompt);

View File

@ -70,20 +70,24 @@ unsigned char *hex_string_to_bin(char hex_string[])
unsigned char *val = malloc(len); unsigned char *val = malloc(len);
char *pos = hex_string; char *pos = hex_string;
int i; int i;
for (i = 0; i < len; ++i, pos += 2) for (i = 0; i < len; ++i, pos += 2)
sscanf(pos, "%2hhx", &val[i]); sscanf(pos, "%2hhx", &val[i]);
return val; return val;
} }
void cmd_accept(ToxWindow *self, Messenger *m, char **args) void cmd_accept(ToxWindow *self, Messenger *m, char **args)
{ {
int num = atoi(args[1]); int num = atoi(args[1]);
if (num >= num_requests) { if (num >= num_requests) {
wprintw(self->window, "Invalid syntax.\n"); wprintw(self->window, "Invalid syntax.\n");
return; return;
} }
num = m_addfriend_norequest(m, pending_requests[num]); num = m_addfriend_norequest(m, pending_requests[num]);
if (num == -1) if (num == -1)
wprintw(self->window, "Failed to add friend.\n"); wprintw(self->window, "Failed to add friend.\n");
else { else {
@ -104,6 +108,7 @@ void cmd_add(ToxWindow *self, Messenger *m, char **args)
wprintw(self->window, "Invalid command: add expected at least one argument.\n"); wprintw(self->window, "Invalid command: add expected at least one argument.\n");
return; return;
} }
if (!msg) if (!msg)
msg = ""; msg = "";
@ -111,15 +116,19 @@ void cmd_add(ToxWindow *self, Messenger *m, char **args)
wprintw(self->window, "Invalid ID length.\n"); wprintw(self->window, "Invalid ID length.\n");
return; return;
} }
int i; int i;
for (i = 0; i < FRIEND_ADDRESS_SIZE; ++i) { for (i = 0; i < FRIEND_ADDRESS_SIZE; ++i) {
xx[0] = id[2 * i]; xx[0] = id[2 * i];
xx[1] = id[2 * i + 1]; xx[1] = id[2 * i + 1];
xx[2] = '\0'; xx[2] = '\0';
if (sscanf(xx, "%02x", &x) != 1) { if (sscanf(xx, "%02x", &x) != 1) {
wprintw(self->window, "Invalid ID.\n"); wprintw(self->window, "Invalid ID.\n");
return; return;
} }
id_bin[i] = x; id_bin[i] = x;
} }
@ -128,28 +137,36 @@ void cmd_add(ToxWindow *self, Messenger *m, char **args)
} }
int num = m_addfriend(m, id_bin, (uint8_t *) msg, strlen(msg) + 1); int num = m_addfriend(m, id_bin, (uint8_t *) msg, strlen(msg) + 1);
switch (num) { switch (num) {
case FAERR_TOOLONG: case FAERR_TOOLONG:
wprintw(self->window, "Message is too long.\n"); wprintw(self->window, "Message is too long.\n");
break; break;
case FAERR_NOMESSAGE: case FAERR_NOMESSAGE:
wprintw(self->window, "Please add a message to your request.\n"); wprintw(self->window, "Please add a message to your request.\n");
break; break;
case FAERR_OWNKEY: case FAERR_OWNKEY:
wprintw(self->window, "That appears to be your own ID.\n"); wprintw(self->window, "That appears to be your own ID.\n");
break; break;
case FAERR_ALREADYSENT: case FAERR_ALREADYSENT:
wprintw(self->window, "Friend request already sent.\n"); wprintw(self->window, "Friend request already sent.\n");
break; break;
case FAERR_UNKNOWN: case FAERR_UNKNOWN:
wprintw(self->window, "Undefined error when adding friend.\n"); wprintw(self->window, "Undefined error when adding friend.\n");
break; break;
case FAERR_BADCHECKSUM: case FAERR_BADCHECKSUM:
wprintw(self->window, "Bad checksum in address.\n"); wprintw(self->window, "Bad checksum in address.\n");
break; break;
case FAERR_SETNEWNOSPAM: case FAERR_SETNEWNOSPAM:
wprintw(self->window, "Nospam was different.\n"); wprintw(self->window, "Nospam was different.\n");
break; break;
default: default:
wprintw(self->window, "Friend added as %d.\n", num); wprintw(self->window, "Friend added as %d.\n", num);
on_friendadded_cb(m, num); on_friendadded_cb(m, num);
@ -176,6 +193,7 @@ void cmd_connect(ToxWindow *self, Messenger *m, char **args)
dht.port = htons(atoi(port)); dht.port = htons(atoi(port));
uint32_t resolved_address = resolve_addr(ip); uint32_t resolved_address = resolve_addr(ip);
if (resolved_address == 0) { if (resolved_address == 0) {
return; return;
} }
@ -221,6 +239,7 @@ void cmd_msg(ToxWindow *self, Messenger *m, char **args)
{ {
char *id = args[1]; char *id = args[1];
char *msg = args[2]; char *msg = args[2];
if (m_sendmessage(m, atoi(id), (uint8_t *) msg, strlen(msg) + 1) == 0) if (m_sendmessage(m, atoi(id), (uint8_t *) msg, strlen(msg) + 1) == 0)
wprintw(self->window, "Error occurred while sending message.\n"); wprintw(self->window, "Error occurred while sending message.\n");
else else
@ -233,11 +252,13 @@ void cmd_myid(ToxWindow *self, Messenger *m, char **args)
size_t i; size_t i;
uint8_t address[FRIEND_ADDRESS_SIZE]; uint8_t address[FRIEND_ADDRESS_SIZE];
getaddress(m, address); getaddress(m, address);
for (i = 0; i < FRIEND_ADDRESS_SIZE; ++i) { for (i = 0; i < FRIEND_ADDRESS_SIZE; ++i) {
char xx[3]; char xx[3];
snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff); snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff);
strcat(id, xx); strcat(id, xx);
} }
wprintw(self->window, "%s\n", id); wprintw(self->window, "%s\n", id);
} }
@ -254,30 +275,27 @@ void cmd_status(ToxWindow *self, Messenger *m, char **args)
char *status_text; char *status_text;
USERSTATUS status_kind; USERSTATUS status_kind;
if (!strncmp(status, "online", strlen("online"))) { if (!strncmp(status, "online", strlen("online"))) {
status_kind = USERSTATUS_NONE; status_kind = USERSTATUS_NONE;
status_text = "ONLINE"; status_text = "ONLINE";
} } else if (!strncmp(status, "away", strlen("away"))) {
else if (!strncmp(status, "away", strlen("away"))) {
status_kind = USERSTATUS_AWAY; status_kind = USERSTATUS_AWAY;
status_text = "AWAY"; status_text = "AWAY";
} } else if (!strncmp(status, "busy", strlen("busy"))) {
else if (!strncmp(status, "busy", strlen("busy"))) {
status_kind = USERSTATUS_BUSY; status_kind = USERSTATUS_BUSY;
status_text = "BUSY"; status_text = "BUSY";
} } else {
else
{
wprintw(self->window, "Invalid status.\n"); wprintw(self->window, "Invalid status.\n");
return; return;
} }
char *msg = args[2]; char *msg = args[2];
if (msg == NULL) { if (msg == NULL) {
m_set_userstatus(m, status_kind); m_set_userstatus(m, status_kind);
wprintw(self->window, "Status set to: %s\n", status_text); wprintw(self->window, "Status set to: %s\n", status_text);
} } else {
else {
m_set_userstatus(m, status_kind); m_set_userstatus(m, status_kind);
m_set_statusmessage(m, (uint8_t *) msg, strlen(msg) + 1); m_set_statusmessage(m, (uint8_t *) msg, strlen(msg) + 1);
wprintw(self->window, "Status set to: %s, %s\n", status_text, msg); wprintw(self->window, "Status set to: %s, %s\n", status_text, msg);
@ -296,6 +314,7 @@ static void execute(ToxWindow *self, Messenger *m, char *u_cmd)
int newlines = 0; int newlines = 0;
char cmd[MAX_STR_SIZE] = {0}; char cmd[MAX_STR_SIZE] = {0};
int i; int i;
for (i = 0; i < strlen(prompt_buf); ++i) { for (i = 0; i < strlen(prompt_buf); ++i) {
if (u_cmd[i] == '\n') if (u_cmd[i] == '\n')
++newlines; ++newlines;
@ -304,21 +323,27 @@ static void execute(ToxWindow *self, Messenger *m, char *u_cmd)
} }
int leading_spc = 0; int leading_spc = 0;
for (i = 0; i < MAX_STR_SIZE && isspace(cmd[i]); ++i) for (i = 0; i < MAX_STR_SIZE && isspace(cmd[i]); ++i)
leading_spc++; leading_spc++;
memmove(cmd, cmd + leading_spc, MAX_STR_SIZE - leading_spc); memmove(cmd, cmd + leading_spc, MAX_STR_SIZE - leading_spc);
int cmd_end = strlen(cmd); int cmd_end = strlen(cmd);
while (cmd_end > 0 && cmd_end--) while (cmd_end > 0 && cmd_end--)
if (!isspace(cmd[cmd_end])) if (!isspace(cmd[cmd_end]))
break; break;
cmd[cmd_end + 1] = '\0'; cmd[cmd_end + 1] = '\0';
/* insert \0 at argument boundaries */ /* insert \0 at argument boundaries */
int numargs = 0; int numargs = 0;
for (i = 0; i < MAX_STR_SIZE; i++) { for (i = 0; i < MAX_STR_SIZE; i++) {
if (cmd[i] == '\"') if (cmd[i] == '\"')
while (cmd[++i] != '\"'); /* skip over strings */ while (cmd[++i] != '\"'); /* skip over strings */
if (cmd[i] == ' ') { if (cmd[i] == ' ') {
cmd[i] = '\0'; cmd[i] = '\0';
numargs++; numargs++;
@ -334,6 +359,7 @@ static void execute(ToxWindow *self, Messenger *m, char *u_cmd)
/* read arguments into array */ /* read arguments into array */
char *cmdargs[5]; char *cmdargs[5];
int pos = 0; int pos = 0;
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
cmdargs[i] = cmd + pos; cmdargs[i] = cmd + pos;
pos += strlen(cmdargs[i]) + 1; pos += strlen(cmdargs[i]) + 1;
@ -348,6 +374,7 @@ static void execute(ToxWindow *self, Messenger *m, char *u_cmd)
if (!strcmp(cmdargs[0], commands[i].name)) { if (!strcmp(cmdargs[0], commands[i].name)) {
/* check for missing arguments */ /* check for missing arguments */
int j; int j;
for (j = 0; j <= commands[i].numargs; j++) { for (j = 0; j <= commands[i].numargs; j++) {
if (strlen(cmdargs[j]) == 0) { if (strlen(cmdargs[j]) == 0) {
wprintw(self->window, "Invalid command: %s expected %d arguments, got %d.\n", wprintw(self->window, "Invalid command: %s expected %d arguments, got %d.\n",
@ -355,11 +382,13 @@ static void execute(ToxWindow *self, Messenger *m, char *u_cmd)
return; return;
} }
} }
/* check for excess arguments */ /* check for excess arguments */
if (strcmp(cmdargs[0], "add") && strlen(cmdargs[j]) != 0) { if (strcmp(cmdargs[0], "add") && strlen(cmdargs[j]) != 0) {
wprintw(self->window, "Invalid command: too many arguments to %s.\n", commands[i].name); wprintw(self->window, "Invalid command: too many arguments to %s.\n", commands[i].name);
return; return;
} }
/* pass arguments to command function */ /* pass arguments to command function */
(commands[i].func)(self, m, cmdargs); (commands[i].func)(self, m, cmdargs);
return; return;
@ -378,15 +407,14 @@ static void prompt_onKey(ToxWindow *self, Messenger *m, int key)
wprintw(self->window, "\nToo Long.\n"); wprintw(self->window, "\nToo Long.\n");
prompt_buf_pos = 0; prompt_buf_pos = 0;
prompt_buf[0] = 0; prompt_buf[0] = 0;
} } else if (!(prompt_buf_pos == 0) && (prompt_buf_pos < COLS)
else if (!(prompt_buf_pos == 0) && (prompt_buf_pos < COLS)
&& (prompt_buf_pos % (COLS - 3) == 0)) { && (prompt_buf_pos % (COLS - 3) == 0)) {
prompt_buf[prompt_buf_pos++] = '\n'; prompt_buf[prompt_buf_pos++] = '\n';
} } else if (!(prompt_buf_pos == 0) && (prompt_buf_pos > COLS)
else if (!(prompt_buf_pos == 0) && (prompt_buf_pos > COLS)
&& ((prompt_buf_pos - (COLS - 3)) % (COLS) == 0)) { && ((prompt_buf_pos - (COLS - 3)) % (COLS) == 0)) {
prompt_buf[prompt_buf_pos++] = '\n'; prompt_buf[prompt_buf_pos++] = '\n';
} }
prompt_buf[prompt_buf_pos++] = key; prompt_buf[prompt_buf_pos++] = key;
prompt_buf[prompt_buf_pos] = 0; prompt_buf[prompt_buf_pos] = 0;
} }
@ -414,6 +442,7 @@ static void prompt_onDraw(ToxWindow *self)
getyx(self->window, y, x); getyx(self->window, y, x);
(void) x; (void) x;
int i; int i;
for (i = 0; i < (strlen(prompt_buf)); ++i) { for (i = 0; i < (strlen(prompt_buf)); ++i) {
if ((prompt_buf[i] == '\n') && (y != 0)) if ((prompt_buf[i] == '\n') && (y != 0))
--y; --y;

View File

@ -23,6 +23,7 @@ void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userd
wprintw(prompt->window, "\nFriend request from:\n"); wprintw(prompt->window, "\nFriend request from:\n");
int i; int i;
for (i = 0; i < KEY_SIZE_BYTES; ++i) { for (i = 0; i < KEY_SIZE_BYTES; ++i) {
wprintw(prompt->window, "%02x", public_key[i] & 0xff); wprintw(prompt->window, "%02x", public_key[i] & 0xff);
} }
@ -39,6 +40,7 @@ void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void* userd
void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata)
{ {
int i; int i;
for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
if (windows[i].onMessage != NULL) if (windows[i].onMessage != NULL)
windows[i].onMessage(&windows[i], m, friendnumber, string, length); windows[i].onMessage(&windows[i], m, friendnumber, string, length);
@ -48,6 +50,7 @@ void on_message(Messenger *m, int friendnumber, uint8_t *string, uint16_t length
void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata) void on_action(Messenger *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata)
{ {
int i; int i;
for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
if (windows[i].onAction != NULL) if (windows[i].onAction != NULL)
windows[i].onAction(&windows[i], m, friendnumber, string, length); windows[i].onAction(&windows[i], m, friendnumber, string, length);
@ -58,6 +61,7 @@ void on_nickchange(Messenger *m, int friendnumber, uint8_t *string, uint16_t len
{ {
wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string); wprintw(prompt->window, "\n(nickchange) %d: %s\n", friendnumber, string);
int i; int i;
for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
if (windows[i].onNickChange != NULL) if (windows[i].onNickChange != NULL)
windows[i].onNickChange(&windows[i], friendnumber, string, length); windows[i].onNickChange(&windows[i], friendnumber, string, length);
@ -68,6 +72,7 @@ void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t l
{ {
wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string); wprintw(prompt->window, "\n(statuschange) %d: %s\n", friendnumber, string);
int i; int i;
for (i = 0; i < MAX_WINDOW_SLOTS; ++i) { for (i = 0; i < MAX_WINDOW_SLOTS; ++i) {
if (windows[i].onStatusChange != NULL) if (windows[i].onStatusChange != NULL)
windows[i].onStatusChange(&windows[i], friendnumber, string, length); windows[i].onStatusChange(&windows[i], friendnumber, string, length);
@ -77,6 +82,7 @@ void on_statuschange(Messenger *m, int friendnumber, uint8_t *string, uint16_t l
void on_friendadded(Messenger *m, int friendnumber) void on_friendadded(Messenger *m, int friendnumber)
{ {
friendlist_onFriendAdded(m, friendnumber); friendlist_onFriendAdded(m, friendnumber);
if (store_data(m, DATA_FILE) != 0) { if (store_data(m, DATA_FILE) != 0) {
wprintw(prompt->window, "\nCould not store Messenger data\n"); wprintw(prompt->window, "\nCould not store Messenger data\n");
} }
@ -92,6 +98,7 @@ int add_window(Messenger *m, ToxWindow w, int n)
return -1; return -1;
w.window = newwin(LINES - 2, COLS, 0, 0); w.window = newwin(LINES - 2, COLS, 0, 0);
if (w.window == NULL) if (w.window == NULL)
return -1; return -1;
@ -108,6 +115,7 @@ void del_window(ToxWindow *w, int f_num)
active_window = 0; // Go to prompt screen active_window = 0; // Go to prompt screen
delwin(w->window); delwin(w->window);
int i; int i;
for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) { for (i = N_DEFAULT_WINS; i < MAX_WINDOW_SLOTS; ++i) {
if (WINDOW_STATUS[i] == f_num) { if (WINDOW_STATUS[i] == f_num) {
WINDOW_STATUS[i] = -1; WINDOW_STATUS[i] = -1;
@ -115,6 +123,7 @@ void del_window(ToxWindow *w, int f_num)
break; break;
} }
} }
clear(); clear();
refresh(); refresh();
} }
@ -124,14 +133,18 @@ void set_active_window(int ch)
{ {
int f_inf = 0; int f_inf = 0;
int max = MAX_WINDOW_SLOTS - 1; int max = MAX_WINDOW_SLOTS - 1;
if (ch == '\t') { if (ch == '\t') {
int i = (active_window + 1) % max; int i = (active_window + 1) % max;
while (true) { while (true) {
if (WINDOW_STATUS[i] != -1) { if (WINDOW_STATUS[i] != -1) {
active_window = i; active_window = i;
return; return;
} }
i = (i + 1) % max; i = (i + 1) % max;
if (f_inf++ > max) { // infinite loop check if (f_inf++ > max) { // infinite loop check
endwin(); endwin();
exit(2); exit(2);
@ -139,13 +152,17 @@ void set_active_window(int ch)
} }
} else { } else {
int i = active_window - 1; int i = active_window - 1;
if (i < 0) i = max; if (i < 0) i = max;
while (true) { while (true) {
if (WINDOW_STATUS[i] != -1) { if (WINDOW_STATUS[i] != -1) {
active_window = i; active_window = i;
return; return;
} }
if (--i < 0) i = max; if (--i < 0) i = max;
if (f_inf++ > max) { if (f_inf++ > max) {
endwin(); endwin();
exit(2); exit(2);
@ -158,10 +175,12 @@ void init_window_status()
{ {
/* Default window values decrement from -2 */ /* Default window values decrement from -2 */
int i; int i;
for (i = 0; i < N_DEFAULT_WINS; ++i) for (i = 0; i < N_DEFAULT_WINS; ++i)
WINDOW_STATUS[i] = -(i + 2); WINDOW_STATUS[i] = -(i + 2);
int j; int j;
for (j = N_DEFAULT_WINS; j < MAX_WINDOW_SLOTS; j++) for (j = N_DEFAULT_WINS; j < MAX_WINDOW_SLOTS; j++)
WINDOW_STATUS[j] = -1; WINDOW_STATUS[j] = -1;
} }
@ -172,6 +191,7 @@ ToxWindow *init_windows()
int n_prompt = 0; int n_prompt = 0;
int n_friendslist = 1; int n_friendslist = 1;
int n_dhtstatus = 2; int n_dhtstatus = 2;
if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1 if (add_window(m, new_prompt(on_friendadded), n_prompt) == -1
|| add_window(m, new_friendlist(WINDOW_STATUS), n_friendslist) == -1 || add_window(m, new_friendlist(WINDOW_STATUS), n_friendslist) == -1
|| add_window(m, new_dhtstatus(), n_dhtstatus) == -1) { || add_window(m, new_dhtstatus(), n_dhtstatus) == -1) {
@ -179,6 +199,7 @@ ToxWindow *init_windows()
endwin(); endwin();
exit(1); exit(1);
} }
active_window = n_prompt; active_window = n_prompt;
prompt = &windows[n_prompt]; prompt = &windows[n_prompt];
return prompt; return prompt;
@ -200,16 +221,19 @@ static void draw_bar()
attroff(COLOR_PAIR(4) | A_BOLD); attroff(COLOR_PAIR(4) | A_BOLD);
int i; int i;
for (i = 0; i < (MAX_WINDOW_SLOTS); ++i) { for (i = 0; i < (MAX_WINDOW_SLOTS); ++i) {
if (WINDOW_STATUS[i] != -1) { if (WINDOW_STATUS[i] != -1) {
if (i == active_window) if (i == active_window)
attron(A_BOLD); attron(A_BOLD);
odd = (odd + 1) % blinkrate; odd = (odd + 1) % blinkrate;
if (windows[i].blink && (odd < (blinkrate / 2))) if (windows[i].blink && (odd < (blinkrate / 2)))
attron(COLOR_PAIR(3)); attron(COLOR_PAIR(3));
printw(" %s", windows[i].title); printw(" %s", windows[i].title);
if (windows[i].blink && (odd < (blinkrate / 2))) if (windows[i].blink && (odd < (blinkrate / 2)))
attroff(COLOR_PAIR(3)); attroff(COLOR_PAIR(3));
@ -218,6 +242,7 @@ static void draw_bar()
} }
} }
} }
refresh(); refresh();
} }
@ -238,6 +263,7 @@ void draw_active_window(Messenger *m)
/* Handle input */ /* Handle input */
int ch = getch(); int ch = getch();
if (ch == '\t' || ch == KEY_BTAB) if (ch == '\t' || ch == KEY_BTAB)
set_active_window(ch); set_active_window(ch);
else if (ch != ERR) else if (ch != ERR)