summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Levermann <simon@levermaenner.de>2013-08-08 18:05:41 +0200
committerSimon Levermann <simon@levermaenner.de>2013-08-08 18:05:41 +0200
commitcaedd4489ef34e4afffbde9c4917439f3187f6ab (patch)
tree18719c3be8f9c0e21a6ae37a880f4351510ebc4b
parentd7e2cca854cbc3d0f2418fd95f7033d6b352b587 (diff)
parentcd22973d48102a6b90dbcb46e58616f7decc1d59 (diff)
Merge branch 'master' of https://github.com/irungentoo/ProjectTox-Core into upstream
-rw-r--r--.gitignore6
-rw-r--r--.travis.yml1
-rw-r--r--auto_tests/CMakeLists.txt12
-rw-r--r--auto_tests/messenger_test.c3
-rw-r--r--core/DHT.h2
-rw-r--r--core/Messenger.c38
-rw-r--r--core/Messenger.h4
-rw-r--r--core/network.h5
-rw-r--r--testing/toxic/CMakeLists.txt3
-rw-r--r--testing/toxic/chat.c50
-rw-r--r--testing/toxic/main.c7
-rw-r--r--testing/toxic/prompt.c32
-rw-r--r--testing/toxic/windows.h4
13 files changed, 124 insertions, 43 deletions
diff --git a/.gitignore b/.gitignore
index 0e4e35ef..47cfd84a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,12 @@ install_manifest.txt
14testing/data 14testing/data
15*~ 15*~
16 16
17# Vim
18*.swp
19
20# Ctags
21tags
22
17# Object files 23# Object files
18*.o 24*.o
19 25
diff --git a/.travis.yml b/.travis.yml
index b8699ec1..c8b479f8 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -30,6 +30,7 @@ script:
30 - mkdir build && cd build 30 - mkdir build && cd build
31 - cmake .. 31 - cmake ..
32 - make -j3 32 - make -j3
33 - make test
33# build docs separately 34# build docs separately
34 - make docs 35 - make docs
35 36
diff --git a/auto_tests/CMakeLists.txt b/auto_tests/CMakeLists.txt
index 237dae1b..fbbcb7d7 100644
--- a/auto_tests/CMakeLists.txt
+++ b/auto_tests/CMakeLists.txt
@@ -6,3 +6,15 @@ include_directories(${CHECK_INCLUDE_DIRS})
6find_package(Check REQUIRED) 6find_package(Check REQUIRED)
7include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/messenger_test.cmake) 7include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/messenger_test.cmake)
8include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/friends_test.cmake) 8include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/friends_test.cmake)
9
10include( CTest )
11enable_testing()
12
13add_test(messenger messenger_test)
14# TODO enable once test is fixed
15#add_test(friends friends_test)
16
17add_custom_target(
18 test COMMAND ${CMAKE_CTEST_COMMAND} -V
19 DEPENDS messenger_test
20)
diff --git a/auto_tests/messenger_test.c b/auto_tests/messenger_test.c
index cc624ab6..4c5c29ad 100644
--- a/auto_tests/messenger_test.c
+++ b/auto_tests/messenger_test.c
@@ -137,9 +137,12 @@ START_TEST(test_m_addfriend)
137 ck_abort_msg("m_addfriend did NOT catch the following length: %d\n", bad_len); 137 ck_abort_msg("m_addfriend did NOT catch the following length: %d\n", bad_len);
138 138
139 /* this should REALLY error */ 139 /* this should REALLY error */
140 /*
141 * TODO: validate client_id in m_addfriend?
140 if(m_addfriend((uint8_t *)bad_id, (uint8_t *)good_data, good_len) >= 0) 142 if(m_addfriend((uint8_t *)bad_id, (uint8_t *)good_data, good_len) >= 0)
141 ck_abort_msg("The following ID passed through " 143 ck_abort_msg("The following ID passed through "
142 "m_addfriend without an error:\n'%s'\n", bad_id_str); 144 "m_addfriend without an error:\n'%s'\n", bad_id_str);
145 */
143} 146}
144END_TEST 147END_TEST
145 148
diff --git a/core/DHT.h b/core/DHT.h
index 2308abd8..cb5697ea 100644
--- a/core/DHT.h
+++ b/core/DHT.h
@@ -30,8 +30,6 @@
30extern "C" { 30extern "C" {
31#endif 31#endif
32 32
33/* Current time, unix format */
34#define unix_time() ((uint64_t)time(NULL))
35 33
36/* size of the client_id in bytes */ 34/* size of the client_id in bytes */
37#define CLIENT_ID_SIZE crypto_box_PUBLICKEYBYTES 35#define CLIENT_ID_SIZE crypto_box_PUBLICKEYBYTES
diff --git a/core/Messenger.c b/core/Messenger.c
index 3d991e63..1df49d2a 100644
--- a/core/Messenger.c
+++ b/core/Messenger.c
@@ -51,16 +51,31 @@ static uint8_t *self_statusmessage;
51static uint16_t self_statusmessage_len; 51static uint16_t self_statusmessage_len;
52static USERSTATUS self_userstatus; 52static USERSTATUS self_userstatus;
53 53
54#define MAX_NUM_FRIENDS 256 54static Friend *friendlist;
55 55static uint32_t numallocated;
56static Friend friendlist[MAX_NUM_FRIENDS];
57
58static uint32_t numfriends; 56static uint32_t numfriends;
59 57
58
60/* 1 if we are online 59/* 1 if we are online
61 0 if we are offline 60 0 if we are offline
62 static uint8_t online; */ 61 static uint8_t online; */
63 62
63/* double the size of the friend list
64 return -1 if realloc fails */
65int realloc_friendlist(void) {
66 if (numallocated == 0)
67 numallocated = 1; /* initial size */
68 else
69 numallocated *= 2; /* double each time */
70
71 Friend *newfriendlist = realloc(friendlist, numallocated*sizeof(Friend));
72 if (newfriendlist == NULL)
73 return -1;
74
75 friendlist = newfriendlist;
76 return 0;
77}
78
64/* return the friend id associated to that public key. 79/* return the friend id associated to that public key.
65 return -1 if no such friend */ 80 return -1 if no such friend */
66int getfriend_id(uint8_t *client_id) 81int getfriend_id(uint8_t *client_id)
@@ -118,8 +133,12 @@ int m_addfriend(uint8_t *client_id, uint8_t *data, uint16_t length)
118 if (getfriend_id(client_id) != -1) 133 if (getfriend_id(client_id) != -1)
119 return FAERR_ALREADYSENT; 134 return FAERR_ALREADYSENT;
120 135
136 /* resize the friend list if necessary */
137 if (numfriends + 1 > numallocated)
138 realloc_friendlist();
139
121 uint32_t i; 140 uint32_t i;
122 for (i = 0; i <= numfriends && i <= MAX_NUM_FRIENDS; ++i) { /*TODO: dynamic memory allocation to allow for more than MAX_NUM_FRIENDS friends */ 141 for (i = 0; i <= numfriends; ++i) {
123 if (friendlist[i].status == NOFRIEND) { 142 if (friendlist[i].status == NOFRIEND) {
124 DHT_addfriend(client_id); 143 DHT_addfriend(client_id);
125 friendlist[i].status = FRIEND_ADDED; 144 friendlist[i].status = FRIEND_ADDED;
@@ -145,8 +164,13 @@ int m_addfriend_norequest(uint8_t * client_id)
145{ 164{
146 if (getfriend_id(client_id) != -1) 165 if (getfriend_id(client_id) != -1)
147 return -1; 166 return -1;
167
168 /* resize the friend list if necessary */
169 if (numfriends + 1 > numallocated)
170 realloc_friendlist();
171
148 uint32_t i; 172 uint32_t i;
149 for (i = 0; i <= numfriends && i <= MAX_NUM_FRIENDS; ++i) { /*TODO: dynamic memory allocation to allow for more than MAX_NUM_FRIENDS friends */ 173 for (i = 0; i <= numfriends; ++i) {
150 if(friendlist[i].status == NOFRIEND) { 174 if(friendlist[i].status == NOFRIEND) {
151 DHT_addfriend(client_id); 175 DHT_addfriend(client_id);
152 friendlist[i].status = FRIEND_REQUESTED; 176 friendlist[i].status = FRIEND_REQUESTED;
@@ -158,7 +182,7 @@ int m_addfriend_norequest(uint8_t * client_id)
158 friendlist[i].userstatus = USERSTATUS_NONE; 182 friendlist[i].userstatus = USERSTATUS_NONE;
159 friendlist[i].message_id = 0; 183 friendlist[i].message_id = 0;
160 friendlist[i].receives_read_receipts = 1; /* default: YES */ 184 friendlist[i].receives_read_receipts = 1; /* default: YES */
161 numfriends++; 185 ++numfriends;
162 return i; 186 return i;
163 } 187 }
164 } 188 }
diff --git a/core/Messenger.h b/core/Messenger.h
index d2fa8945..3a9a56df 100644
--- a/core/Messenger.h
+++ b/core/Messenger.h
@@ -188,6 +188,10 @@ void m_callback_namechange(void (*function)(int, uint8_t *, uint16_t));
188 you are not responsible for freeing newstatus */ 188 you are not responsible for freeing newstatus */
189void m_callback_statusmessage(void (*function)(int, uint8_t *, uint16_t)); 189void m_callback_statusmessage(void (*function)(int, uint8_t *, uint16_t));
190 190
191/* set the callback for status type changes
192 function(int friendnumber, USERSTATUS kind) */
193void m_callback_userstatus(void (*function)(int, USERSTATUS));
194
191/* set the callback for read receipts 195/* set the callback for read receipts
192 function(int friendnumber, uint32_t receipt) 196 function(int friendnumber, uint32_t receipt)
193 if you are keeping a record of returns from m_sendmessage, 197 if you are keeping a record of returns from m_sendmessage,
diff --git a/core/network.h b/core/network.h
index d246a9d1..d3c39333 100644
--- a/core/network.h
+++ b/core/network.h
@@ -66,6 +66,11 @@ extern "C" {
66 66
67#define MAX_UDP_PACKET_SIZE 65507 67#define MAX_UDP_PACKET_SIZE 65507
68 68
69
70/* Current time, unix format */
71#define unix_time() ((uint64_t)time(NULL))
72
73
69typedef union { 74typedef union {
70 uint8_t c[4]; 75 uint8_t c[4];
71 uint16_t s[2]; 76 uint16_t s[2];
diff --git a/testing/toxic/CMakeLists.txt b/testing/toxic/CMakeLists.txt
index f30d8e9e..38f02dc6 100644
--- a/testing/toxic/CMakeLists.txt
+++ b/testing/toxic/CMakeLists.txt
@@ -1,6 +1,9 @@
1cmake_minimum_required(VERSION 2.6.0) 1cmake_minimum_required(VERSION 2.6.0)
2project(toxic C) 2project(toxic C)
3 3
4execute_process(COMMAND git rev-list HEAD --count OUTPUT_VARIABLE COMMIT)
5SET(GCC_COVERAGE_COMPILE_FLAGS '-DTOXICVER="0.1.1_r${COMMIT}"')
6add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
4set(exe_name toxic) 7set(exe_name toxic)
5 8
6add_executable(${exe_name} 9add_executable(${exe_name}
diff --git a/testing/toxic/chat.c b/testing/toxic/chat.c
index 28c5de6c..83765777 100644
--- a/testing/toxic/chat.c
+++ b/testing/toxic/chat.c
@@ -16,7 +16,7 @@
16 16
17typedef struct { 17typedef struct {
18 int friendnum; 18 int friendnum;
19 char line[256]; 19 char line[MAX_STR_SIZE];
20 size_t pos; 20 size_t pos;
21 WINDOW* history; 21 WINDOW* history;
22 WINDOW* linewin; 22 WINDOW* linewin;
@@ -154,15 +154,47 @@ void execute(ToxWindow *self, ChatContext *ctx, char *cmd)
154 } 154 }
155 155
156 else if (!strncmp(cmd, "/status ", strlen("/status "))) { 156 else if (!strncmp(cmd, "/status ", strlen("/status "))) {
157 char *status = strchr(cmd, ' ');
157 char *msg; 158 char *msg;
158 msg = strchr(cmd, ' '); 159 char *status_text;
159 if (msg == NULL) { 160 if (status == NULL) {
160 wprintw(ctx->history, "Invalid syntax.\n"); 161 wprintw(ctx->history, "Invalid syntax.\n");
161 return; 162 return;
162 } 163 }
163 msg++; 164 status++;
164 m_set_statusmessage((uint8_t*) msg, strlen(msg)+1); 165 USERSTATUS status_kind;
165 wprintw(ctx->history, "Status set to: %s\n", msg); 166 if (!strncmp(status, "online", strlen("online"))) {
167 status_kind = USERSTATUS_NONE;
168 status_text = "ONLINE";
169 }
170
171 else if (!strncmp(status, "away", strlen("away"))) {
172 status_kind = USERSTATUS_AWAY;
173 status_text = "AWAY";
174 }
175
176 else if (!strncmp(status, "busy", strlen("busy"))) {
177 status_kind = USERSTATUS_BUSY;
178 status_text = "BUSY";
179 }
180
181 else
182 {
183 wprintw(ctx->history, "Invalid status.\n");
184 return;
185 }
186
187 msg = strchr(status, ' ');
188 if (msg == NULL) {
189 m_set_userstatus(status_kind);
190 wprintw(ctx->history, "Status set to: %s\n", status_text);
191 }
192 else {
193 msg++;
194 m_set_userstatus(status_kind);
195 m_set_statusmessage((uint8_t*) msg, strlen(msg)+1);
196 wprintw(ctx->history, "Status set to: %s, %s\n", status_text, msg);
197 }
166 } 198 }
167 199
168 else if (!strncmp(cmd, "/nick ", strlen("/nick "))) { 200 else if (!strncmp(cmd, "/nick ", strlen("/nick "))) {
@@ -178,9 +210,9 @@ void execute(ToxWindow *self, ChatContext *ctx, char *cmd)
178 } 210 }
179 211
180 else if (!strcmp(cmd, "/myid")) { 212 else if (!strcmp(cmd, "/myid")) {
181 char id[32*2 + 1] = {0}; 213 char id[KEY_SIZE_BYTES*2+1] = {0};
182 int i; 214 int i;
183 for (i = 0; i < 32; i++) { 215 for (i = 0; i < KEY_SIZE_BYTES; i++) {
184 char xx[3]; 216 char xx[3];
185 snprintf(xx, sizeof(xx), "%02x", self_public_key[i] & 0xff); 217 snprintf(xx, sizeof(xx), "%02x", self_public_key[i] & 0xff);
186 strcat(id, xx); 218 strcat(id, xx);
@@ -231,7 +263,7 @@ void print_help(ChatContext *self)
231 wprintw(self->history, "Commands:\n"); 263 wprintw(self->history, "Commands:\n");
232 wattroff(self->history, A_BOLD); 264 wattroff(self->history, A_BOLD);
233 265
234 wprintw(self->history, " /status <message> : Set your status\n"); 266 wprintw(self->history, " /status <type> <message> : Set your status\n");
235 wprintw(self->history, " /nick <nickname> : Set your nickname\n"); 267 wprintw(self->history, " /nick <nickname> : Set your nickname\n");
236 wprintw(self->history, " /myid : Print your ID\n"); 268 wprintw(self->history, " /myid : Print your ID\n");
237 wprintw(self->history, " /clear : Clear the screen\n"); 269 wprintw(self->history, " /clear : Clear the screen\n");
diff --git a/testing/toxic/main.c b/testing/toxic/main.c
index ec439c84..bf5e1e6b 100644
--- a/testing/toxic/main.c
+++ b/testing/toxic/main.c
@@ -23,7 +23,10 @@ extern int add_req(uint8_t *public_key); // XXX
23 23
24/* Holds status of chat windows */ 24/* Holds status of chat windows */
25char WINDOW_STATUS[MAX_WINDOW_SLOTS]; 25char WINDOW_STATUS[MAX_WINDOW_SLOTS];
26#define TOXICVER "0.1.0" //Will be moved to a -D flag later 26
27#ifndef TOXICVER
28#define TOXICVER "NOVER" //Use the -D flag to set this
29#endif
27 30
28static ToxWindow windows[MAX_WINDOW_SLOTS]; 31static ToxWindow windows[MAX_WINDOW_SLOTS];
29static ToxWindow* prompt; 32static ToxWindow* prompt;
@@ -38,7 +41,7 @@ void on_request(uint8_t *public_key, uint8_t *data, uint16_t length)
38 wprintw(prompt->window, "\nFriend request from:\n"); 41 wprintw(prompt->window, "\nFriend request from:\n");
39 42
40 int i; 43 int i;
41 for (i = 0; i < 32; ++i) { 44 for (i = 0; i < KEY_SIZE_BYTES; ++i) {
42 wprintw(prompt->window, "%02x", public_key[i] & 0xff); 45 wprintw(prompt->window, "%02x", public_key[i] & 0xff);
43 } 46 }
44 47
diff --git a/testing/toxic/prompt.c b/testing/toxic/prompt.c
index 661d881f..eaa8d7bc 100644
--- a/testing/toxic/prompt.c
+++ b/testing/toxic/prompt.c
@@ -12,12 +12,12 @@
12 12
13#include "windows.h" 13#include "windows.h"
14 14
15uint8_t pending_requests[256][CLIENT_ID_SIZE]; // XXX 15uint8_t pending_requests[MAX_STR_SIZE][CLIENT_ID_SIZE]; // XXX
16uint8_t num_requests=0; // XXX 16uint8_t num_requests=0; // XXX
17 17
18extern void on_friendadded(int friendnumber); 18extern void on_friendadded(int friendnumber);
19static void print_usage(ToxWindow *self); 19static void print_usage(ToxWindow *self);
20static char prompt_buf[256] = {0}; 20static char prompt_buf[MAX_STR_SIZE] = {0};
21static int prompt_buf_pos = 0; 21static int prompt_buf_pos = 0;
22 22
23// XXX: 23// XXX:
@@ -43,7 +43,7 @@ unsigned char *hex_string_to_bin(char hex_string[])
43static void execute(ToxWindow *self, char *u_cmd) 43static void execute(ToxWindow *self, char *u_cmd)
44{ 44{
45 int newlines = 0; 45 int newlines = 0;
46 char cmd[256] = {0}; 46 char cmd[MAX_STR_SIZE] = {0};
47 int i; 47 int i;
48 for (i = 0; i < strlen(prompt_buf); ++i) { 48 for (i = 0; i < strlen(prompt_buf); ++i) {
49 if (u_cmd[i] == '\n') 49 if (u_cmd[i] == '\n')
@@ -53,9 +53,9 @@ static void execute(ToxWindow *self, char *u_cmd)
53 } 53 }
54 54
55 int leading_spc = 0; 55 int leading_spc = 0;
56 for (i = 0; i < 256 && isspace(cmd[i]); ++i) 56 for (i = 0; i < MAX_STR_SIZE && isspace(cmd[i]); ++i)
57 leading_spc++; 57 leading_spc++;
58 memmove(cmd, cmd + leading_spc, 256 - leading_spc); 58 memmove(cmd, cmd + leading_spc, MAX_STR_SIZE - leading_spc);
59 59
60 int cmd_end = strlen(cmd); 60 int cmd_end = strlen(cmd);
61 while (cmd_end > 0 && cmd_end--) 61 while (cmd_end > 0 && cmd_end--)
@@ -121,7 +121,7 @@ static void execute(ToxWindow *self, char *u_cmd)
121 } 121 }
122 122
123 else if (!strncmp(cmd, "add ", strlen("add "))) { 123 else if (!strncmp(cmd, "add ", strlen("add "))) {
124 uint8_t id_bin[32]; 124 uint8_t id_bin[KEY_SIZE_BYTES];
125 char xx[3]; 125 char xx[3];
126 uint32_t x; 126 uint32_t x;
127 char *id = strchr(cmd, ' '); 127 char *id = strchr(cmd, ' ');
@@ -136,12 +136,12 @@ static void execute(ToxWindow *self, char *u_cmd)
136 msg++; 136 msg++;
137 } 137 }
138 else msg = ""; 138 else msg = "";
139 if (strlen(id) != 2*32) { 139 if (strlen(id) != 2*KEY_SIZE_BYTES) {
140 wprintw(self->window, "Invalid ID length.\n"); 140 wprintw(self->window, "Invalid ID length.\n");
141 return; 141 return;
142 } 142 }
143 int i; 143 int i;
144 for (i = 0; i < 32; ++i) { 144 for (i = 0; i < KEY_SIZE_BYTES; ++i) {
145 xx[0] = id[2*i]; 145 xx[0] = id[2*i];
146 xx[1] = id[2*i+1]; 146 xx[1] = id[2*i+1];
147 xx[2] = '\0'; 147 xx[2] = '\0';
@@ -228,17 +228,6 @@ static void execute(ToxWindow *self, char *u_cmd)
228 } 228 }
229 } 229 }
230 230
231 else if (!strncmp(cmd, "statusmsg ", strlen("statumsg "))) {
232 char *msg = strchr(cmd, ' ');
233 if (msg == NULL) {
234 wprintw(self->window, "Invalid syntax.\n");
235 return;
236 }
237 msg++;
238 m_set_statusmessage((uint8_t*) msg, strlen(msg)+1);
239 wprintw(self->window, "Status set to: %s\n", msg);
240 }
241
242 else if (!strncmp(cmd, "nick ", strlen("nick "))) { 231 else if (!strncmp(cmd, "nick ", strlen("nick "))) {
243 char *nick = strchr(cmd, ' '); 232 char *nick = strchr(cmd, ' ');
244 if (nick == NULL) { 233 if (nick == NULL) {
@@ -251,9 +240,9 @@ static void execute(ToxWindow *self, char *u_cmd)
251 } 240 }
252 241
253 else if (!strcmp(cmd, "myid")) { 242 else if (!strcmp(cmd, "myid")) {
254 char id[32*2 + 1] = {0}; 243 char id[KEY_SIZE_BYTES*2 + 1] = {0};
255 size_t i; 244 size_t i;
256 for (i = 0; i < 32; ++i) { 245 for (i = 0; i < KEY_SIZE_BYTES; ++i) {
257 char xx[3]; 246 char xx[3];
258 snprintf(xx, sizeof(xx), "%02x", self_public_key[i] & 0xff); 247 snprintf(xx, sizeof(xx), "%02x", self_public_key[i] & 0xff);
259 strcat(id, xx); 248 strcat(id, xx);
@@ -372,7 +361,6 @@ static void print_usage(ToxWindow *self)
372 wprintw(self->window, " connect <ip> <port> <key> : Connect to DHT server\n"); 361 wprintw(self->window, " connect <ip> <port> <key> : Connect to DHT server\n");
373 wprintw(self->window, " add <id> <message> : Add friend\n"); 362 wprintw(self->window, " add <id> <message> : Add friend\n");
374 wprintw(self->window, " status <type> <message> : Set your status\n"); 363 wprintw(self->window, " status <type> <message> : Set your status\n");
375 wprintw(self->window, " statusmsg <message> : Set your status\n");
376 wprintw(self->window, " nick <nickname> : Set your nickname\n"); 364 wprintw(self->window, " nick <nickname> : Set your nickname\n");
377 wprintw(self->window, " accept <number> : Accept friend request\n"); 365 wprintw(self->window, " accept <number> : Accept friend request\n");
378 wprintw(self->window, " myid : Print your ID\n"); 366 wprintw(self->window, " myid : Print your ID\n");
diff --git a/testing/toxic/windows.h b/testing/toxic/windows.h
index cb45614d..287e534a 100644
--- a/testing/toxic/windows.h
+++ b/testing/toxic/windows.h
@@ -5,7 +5,9 @@
5#include <stdbool.h> 5#include <stdbool.h>
6#define TOXWINDOWS_MAX_NUM 32 6#define TOXWINDOWS_MAX_NUM 32
7#define MAX_FRIENDS_NUM 100 7#define MAX_FRIENDS_NUM 100
8 8#define MAX_STR_SIZE 256
9#define KEY_SIZE_BYTES 32
10
9/* number of permanent default windows */ 11/* number of permanent default windows */
10#define N_DEFAULT_WINS 2 12#define N_DEFAULT_WINS 2
11 13