ffi-tox 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ProjectTox-Core/CMakeLists.txt +24 -2
- data/ProjectTox-Core/INSTALL.md +41 -5
- data/ProjectTox-Core/README.md +29 -30
- data/ProjectTox-Core/cmake/FindLIBCONFIG.cmake +15 -0
- data/ProjectTox-Core/cmake/FindNaCl.cmake +17 -0
- data/ProjectTox-Core/cmake/FindSODIUM.cmake +15 -0
- data/ProjectTox-Core/core/CMakeLists.txt +2 -0
- data/ProjectTox-Core/core/Lossless_UDP.c +6 -0
- data/ProjectTox-Core/core/Messenger.c +24 -9
- data/ProjectTox-Core/core/Messenger.h +13 -5
- data/ProjectTox-Core/core/friend_requests.h +1 -1
- data/ProjectTox-Core/core/net_crypto.c +17 -6
- data/ProjectTox-Core/core/network.c +32 -15
- data/ProjectTox-Core/core/network.h +11 -11
- data/ProjectTox-Core/docs/commands.md +25 -0
- data/ProjectTox-Core/docs/start_guide.de.md +40 -0
- data/ProjectTox-Core/docs/start_guide.md +38 -0
- data/ProjectTox-Core/testing/CMakeLists.txt +3 -3
- data/ProjectTox-Core/testing/DHT_cryptosendfiletest.c +2 -2
- data/ProjectTox-Core/testing/DHT_test.c +1 -1
- data/ProjectTox-Core/testing/Lossless_UDP_testclient.c +2 -2
- data/ProjectTox-Core/testing/Lossless_UDP_testserver.c +2 -2
- data/ProjectTox-Core/testing/misc_tools.h +1 -1
- data/ProjectTox-Core/testing/nTox.c +154 -73
- data/ProjectTox-Core/testing/nTox.h +1 -0
- data/ProjectTox-Core/testing/nTox_win32.c +122 -58
- data/ProjectTox-Core/testing/nTox_win32.h +9 -0
- metadata +25 -25
@@ -65,14 +65,19 @@ int encrypt_data(uint8_t *public_key, uint8_t *secret_key, uint8_t *nonce,
|
|
65
65
|
|
66
66
|
uint8_t temp_plain[MAX_DATA_SIZE + crypto_box_ZEROBYTES - crypto_box_BOXZEROBYTES] = {0};
|
67
67
|
uint8_t temp_encrypted[MAX_DATA_SIZE + crypto_box_ZEROBYTES];
|
68
|
-
uint8_t zeroes[crypto_box_BOXZEROBYTES] = {0};
|
69
68
|
|
70
69
|
memcpy(temp_plain + crypto_box_ZEROBYTES, plain, length); /* pad the message with 32 0 bytes. */
|
71
70
|
|
72
71
|
crypto_box(temp_encrypted, temp_plain, length + crypto_box_ZEROBYTES, nonce, public_key, secret_key);
|
73
72
|
|
74
|
-
/* if encryption is successful the first crypto_box_BOXZEROBYTES of the message will be zero
|
75
|
-
|
73
|
+
/* if encryption is successful the first crypto_box_BOXZEROBYTES of the message will be zero
|
74
|
+
apparently memcmp should not be used so we do this instead:*/
|
75
|
+
uint32_t i;
|
76
|
+
uint32_t check = 0;
|
77
|
+
for(i = 0; i < crypto_box_BOXZEROBYTES; ++i) {
|
78
|
+
check |= temp_encrypted[i] ^ 0;
|
79
|
+
}
|
80
|
+
if(check != 0)
|
76
81
|
return -1;
|
77
82
|
|
78
83
|
/* unpad the encrypted message */
|
@@ -92,7 +97,6 @@ int decrypt_data(uint8_t *public_key, uint8_t *secret_key, uint8_t *nonce,
|
|
92
97
|
|
93
98
|
uint8_t temp_plain[MAX_DATA_SIZE - crypto_box_ZEROBYTES + crypto_box_BOXZEROBYTES];
|
94
99
|
uint8_t temp_encrypted[MAX_DATA_SIZE + crypto_box_ZEROBYTES] = {0};
|
95
|
-
uint8_t zeroes[crypto_box_ZEROBYTES] = {0};
|
96
100
|
|
97
101
|
memcpy(temp_encrypted + crypto_box_BOXZEROBYTES, encrypted, length); /* pad the message with 16 0 bytes. */
|
98
102
|
|
@@ -100,8 +104,14 @@ int decrypt_data(uint8_t *public_key, uint8_t *secret_key, uint8_t *nonce,
|
|
100
104
|
nonce, public_key, secret_key) == -1)
|
101
105
|
return -1;
|
102
106
|
|
103
|
-
/* if decryption is successful the first crypto_box_ZEROBYTES of the message will be zero
|
104
|
-
|
107
|
+
/* if decryption is successful the first crypto_box_ZEROBYTES of the message will be zero
|
108
|
+
apparently memcmp should not be used so we do this instead:*/
|
109
|
+
uint32_t i;
|
110
|
+
uint32_t check = 0;
|
111
|
+
for(i = 0; i < crypto_box_ZEROBYTES; ++i) {
|
112
|
+
check |= temp_plain[i] ^ 0;
|
113
|
+
}
|
114
|
+
if(check != 0)
|
105
115
|
return -1;
|
106
116
|
|
107
117
|
/* unpad the plain message */
|
@@ -365,6 +375,7 @@ int crypto_kill(int crypt_connection_id)
|
|
365
375
|
if (crypto_connections[crypt_connection_id].status != 0) {
|
366
376
|
crypto_connections[crypt_connection_id].status = 0;
|
367
377
|
kill_connection(crypto_connections[crypt_connection_id].number);
|
378
|
+
memset(&crypto_connections[crypt_connection_id], 0 ,sizeof(Crypto_Connection));
|
368
379
|
crypto_connections[crypt_connection_id].number = ~0;
|
369
380
|
return 0;
|
370
381
|
}
|
@@ -164,25 +164,42 @@ void shutdown_networking()
|
|
164
164
|
return;
|
165
165
|
}
|
166
166
|
|
167
|
-
/*
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
167
|
+
/*
|
168
|
+
resolve_addr():
|
169
|
+
address should represent IPv4 or a hostname with A record
|
170
|
+
|
171
|
+
returns a data in network byte order that can be used to set IP.i or IP_Port.ip.i
|
172
|
+
returns 0 on failure
|
173
|
+
|
174
|
+
TODO: Fix ipv6 support
|
175
|
+
*/
|
176
|
+
uint32_t resolve_addr(const char *address)
|
173
177
|
{
|
174
|
-
struct addrinfo
|
178
|
+
struct addrinfo *server = NULL;
|
179
|
+
struct addrinfo hints;
|
180
|
+
int rc;
|
181
|
+
uint32_t addr;
|
182
|
+
|
175
183
|
memset(&hints, 0, sizeof(hints));
|
176
|
-
hints.ai_family
|
177
|
-
hints.ai_socktype = SOCK_DGRAM; //type of socket Tox uses
|
184
|
+
hints.ai_family = AF_INET; // IPv4 only right now.
|
185
|
+
hints.ai_socktype = SOCK_DGRAM; // type of socket Tox uses.
|
178
186
|
|
179
|
-
|
187
|
+
rc = getaddrinfo(address, "echo", &hints, &server);
|
180
188
|
|
181
|
-
|
182
|
-
if(
|
183
|
-
return
|
189
|
+
// Lookup failed.
|
190
|
+
if(rc != 0) {
|
191
|
+
return 0;
|
192
|
+
}
|
193
|
+
|
194
|
+
// IPv4 records only..
|
195
|
+
if(server->ai_family != AF_INET) {
|
196
|
+
freeaddrinfo(server);
|
197
|
+
return 0;
|
198
|
+
}
|
199
|
+
|
200
|
+
|
201
|
+
addr = ((struct sockaddr_in*)server->ai_addr)->sin_addr.s_addr;
|
184
202
|
|
185
|
-
int resolved = ((struct sockaddr_in*)server->ai_addr)->sin_addr.s_addr;
|
186
203
|
freeaddrinfo(server);
|
187
|
-
return
|
204
|
+
return addr;
|
188
205
|
}
|
@@ -56,11 +56,7 @@
|
|
56
56
|
/* we use libsodium by default */
|
57
57
|
#include <sodium.h>
|
58
58
|
#else
|
59
|
-
|
60
|
-
/* TODO: Including stuff like this is bad. This needs fixing.
|
61
|
-
We keep support for the original NaCl for now. */
|
62
|
-
#include "../nacl/build/Linux/include/amd64/crypto_box.h"
|
63
|
-
|
59
|
+
#include <crypto_box.h>
|
64
60
|
#endif
|
65
61
|
|
66
62
|
#ifdef __cplusplus
|
@@ -120,12 +116,16 @@ int init_networking(IP ip, uint16_t port);
|
|
120
116
|
/* function to cleanup networking stuff(doesn't do much right now) */
|
121
117
|
void shutdown_networking();
|
122
118
|
|
123
|
-
/*
|
124
|
-
|
125
|
-
address should represent IPv4
|
126
|
-
|
127
|
-
|
128
|
-
|
119
|
+
/*
|
120
|
+
resolve_addr():
|
121
|
+
address should represent IPv4 or a hostname with A record
|
122
|
+
|
123
|
+
returns a data in network byte order that can be used to set IP.i or IP_Port.ip.i
|
124
|
+
returns 0 on failure
|
125
|
+
|
126
|
+
TODO: Fix ipv6 support
|
127
|
+
*/
|
128
|
+
uint32_t resolve_addr(const char *address);
|
129
129
|
|
130
130
|
#ifdef __cplusplus
|
131
131
|
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Tox User Commands
|
2
|
+
Here's a list of commands that nTox accepts,
|
3
|
+
which can all be used by starting your line with
|
4
|
+
a */*. Currently there can be no spaces before this.
|
5
|
+
|
6
|
+
* */f* [ID]
|
7
|
+
+ Add a friend with ID [ID].
|
8
|
+
* */d*
|
9
|
+
+ Call doMessenger() which does...something?
|
10
|
+
* */m* \[FRIEND\_NUM\] \[MESSAGE\]
|
11
|
+
+ Message \[FRIEND\_NUM\] \[MESSAGE\].
|
12
|
+
* */n* \[NAME\]
|
13
|
+
+ Change your username to \[NAME\].
|
14
|
+
* */l*
|
15
|
+
+ Print your list of friends. (like you have any)
|
16
|
+
* */s* \[STATUS\]
|
17
|
+
+ Set your status to \[STATUS\].
|
18
|
+
* */a* \[ID\]
|
19
|
+
+ Accept friend request from \[ID\].
|
20
|
+
* */i*
|
21
|
+
+ Print useful info about your client.
|
22
|
+
* */h*
|
23
|
+
+ Print some help.
|
24
|
+
* */q/*
|
25
|
+
+ Quit Tox. (why ;_;)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# Tox nutzen
|
2
|
+
1. Tox erstellen
|
3
|
+
2. Fehler korrigieren
|
4
|
+
3. Im IRC nach Hilfe fragen
|
5
|
+
4. Auf Debug-Reise für Entwickler
|
6
|
+
5. Tox wirklich erstellen
|
7
|
+
6. ???
|
8
|
+
|
9
|
+
Trotz der ganzen Arbeit, die wir bisher in Tox
|
10
|
+
gesteckt haben, gibt es noch keine richtige
|
11
|
+
Anleitung, wie man Tox _benutzt_.
|
12
|
+
Dies ist ein anwenderfreundlicher Versuch.
|
13
|
+
|
14
|
+
1. Verbinde dich zum Netzwerk!
|
15
|
+
+ Du musst dich zu einem Bootstrap-Server verbinden, um einen öffentlichen Schlüssel zu erhalten.
|
16
|
+
+ Wo finde ich einen öffentlichen Server? Zur Zeit hier:
|
17
|
+
(die Hilfe-Nachricht von nTox ohne Kommandos hilft auch)
|
18
|
+
+ 198.46.136.167 33445 728925473812C7AAC482BE7250BCCAD0B8CB9F737BF3D42ABD34459C1768F854
|
19
|
+
+ 192.81.133.111 33445 8CD5A9BF0A6CE358BA36F7A653F99FA6B258FF756E490F52C1F98CC420F78858
|
20
|
+
+ 66.175.223.88 33445 AC4112C975240CAD260BB2FCD134266521FAAF0A5D159C5FD3201196191E4F5D
|
21
|
+
+ 192.184.81.118 33445 5CD7EB176C19A2FD840406CD56177BB8E75587BB366F7BB3004B19E3EDC04143
|
22
|
+
2. Finde einen Freund!
|
23
|
+
+ Jetzt, da du im Netzwerk bist, brauchst du einen Freund. Um einen zu bekommen,
|
24
|
+
musst du eine Anfrage senden oder erhalten. Was eine Anfrage ist?
|
25
|
+
Es ist wie eine Freundschaftsanfrage, jedoch benutzen wir unglaublich schaurige
|
26
|
+
und kryptische Nummern anstatt Namen. When nTox startet, erscheint _deine_ lange,
|
27
|
+
schaurige Nummer, auch *öffentlicher Schlüssel* genannt. Diesen kannst du an
|
28
|
+
andere Personen weitergeben und sie können dich als "Freund" hinzufügen. Oder du
|
29
|
+
fügst andere Personen mit dem */f*-Befehl hinzu, wenn du möchtest.
|
30
|
+
3. Chatte drauf los!
|
31
|
+
+ Benutze nun den */m*-Befehl, um eine Nachricht an jemanden zu senden. Wow, du chattest!
|
32
|
+
4. Mach etwas kaputt!
|
33
|
+
+ Jep, pre-alpha-alpha-Software stürzt manchmal ab. Wir arbeiten daran.
|
34
|
+
+ Bitte melde alle Abstürze entweder an die GitHub-Seite oder #tox-dev im freenode-IRC.
|
35
|
+
5. Nichts ist kaputt, aber was bedeutet */f*?
|
36
|
+
+ nTox liest einen Text als Befehl, wenn das erste Zeichen ein Schrägstrich ist ('/').
|
37
|
+
Du kannst alle Befehle in commands.md nachlesen.
|
38
|
+
6. Benutze und unterstütze Tox!
|
39
|
+
+ Programmiere, debugge, dokumentiere, übersetze für uns, oder sprich einfach über uns!
|
40
|
+
+ Je mehr Interesse wir erhalten, desto mehr Arbeit wird getan und desto besser wird Tox.
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Using Tox
|
2
|
+
1. [Build Tox](../INSTALL.md)
|
3
|
+
2. Fix errors
|
4
|
+
3. Consult IRC for help
|
5
|
+
4. Go on debugging journey for devs
|
6
|
+
5. Build Tox for real
|
7
|
+
6. ???
|
8
|
+
|
9
|
+
For all the work we've put into Tox so far,
|
10
|
+
there isn't yet a decent guide for how you _use_
|
11
|
+
Tox. Here's a user-friendly attempt at it.
|
12
|
+
|
13
|
+
1. Connect to the network!
|
14
|
+
+ You need to connect to a bootstrapping server, to give you a public key.
|
15
|
+
+ Where can I find a public server? Right here, as of now:
|
16
|
+
(the help message from running `nTox` with no args will help)
|
17
|
+
+ `198.46.136.167 33445 728925473812C7AAC482BE7250BCCAD0B8CB9F737BF3D42ABD34459C1768F854`
|
18
|
+
+ `192.81.133.111 33445 8CD5A9BF0A6CE358BA36F7A653F99FA6B258FF756E490F52C1F98CC420F78858`
|
19
|
+
+ `66.175.223.88 33445 AC4112C975240CAD260BB2FCD134266521FAAF0A5D159C5FD3201196191E4F5D`
|
20
|
+
+ `192.184.81.118 33445 5CD7EB176C19A2FD840406CD56177BB8E75587BB366F7BB3004B19E3EDC04143`
|
21
|
+
2. Find a friend!
|
22
|
+
+ Now that you're on the network, you need a friend. To get one of those,
|
23
|
+
you need to to send or receive a request. What's a request, you ask?
|
24
|
+
It's like a friend request, but we use really scary and cryptic numbers
|
25
|
+
instead of names. When `nTox` starts, it shows _your_ long, scary number,
|
26
|
+
called your *public key*. Give that to people, and they can add you as
|
27
|
+
a "friend". Or, you can add someone else, with the `/f` command, if you like.
|
28
|
+
3. Chat it up!
|
29
|
+
+ Now use the `/m` command to send a message to someone. Wow, you're chatting!
|
30
|
+
4. But something broke!
|
31
|
+
+ Yeah, pre-alpha-alpha software tends to do that. We're working on it.
|
32
|
+
+ Please report all crashes to either the GitHub page, or `#tox-dev` on freenode.
|
33
|
+
5. Nothing broke, but what does `/f` mean?
|
34
|
+
+ `nTox` parses text as a command if the first character is a forward-slash (`/`).
|
35
|
+
You can check all commands in commands.md.
|
36
|
+
6. Use and support Tox!
|
37
|
+
+ Code for us, debug for us, document for us, translate for us, even just talk about us!
|
38
|
+
+ The more interest we get, the more work gets done, the better Tox is.
|
@@ -9,10 +9,10 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Lossless_UDP_testclient.cmake)
|
|
9
9
|
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Lossless_UDP_testserver.cmake)
|
10
10
|
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Messenger_test.cmake)
|
11
11
|
if(WIN32)
|
12
|
-
|
12
|
+
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/nTox_win32.cmake)
|
13
13
|
endif()
|
14
14
|
|
15
15
|
if(NOT WIN32)
|
16
|
-
|
17
|
-
|
16
|
+
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/nTox.cmake)
|
17
|
+
add_subdirectory(toxic)
|
18
18
|
endif()
|
@@ -186,7 +186,7 @@ int main(int argc, char *argv[])
|
|
186
186
|
fclose(file2);
|
187
187
|
}
|
188
188
|
}
|
189
|
-
|
189
|
+
/* if buffer is empty and the connection timed out. */
|
190
190
|
else if(is_cryptoconnected(inconnection) == 4) {
|
191
191
|
crypto_kill(inconnection);
|
192
192
|
}
|
@@ -209,7 +209,7 @@ int main(int argc, char *argv[])
|
|
209
209
|
fclose(file2);
|
210
210
|
}
|
211
211
|
}
|
212
|
-
|
212
|
+
/* if buffer is empty and the connection timed out. */
|
213
213
|
else if(is_cryptoconnected(connection) == 4) {
|
214
214
|
crypto_kill(connection);
|
215
215
|
}
|
@@ -87,7 +87,7 @@ void print_friendlist()
|
|
87
87
|
for(i = 0; i < 4; i++) {
|
88
88
|
printf("ClientID: ");
|
89
89
|
for(j = 0; j < 32; j++) {
|
90
|
-
if(
|
90
|
+
if(friends_list[k].client_list[i].client_id[j] < 16)
|
91
91
|
printf("0");
|
92
92
|
printf("%hhX", friends_list[k].client_list[i].client_id[j]);
|
93
93
|
}
|
@@ -4,7 +4,7 @@
|
|
4
4
|
*
|
5
5
|
* Best used in combination with Lossless_UDP_testserver
|
6
6
|
*
|
7
|
-
* Compile with: gcc -O2 -Wall -o testclient ../core/network.c ../core/Lossless_UDP.c Lossless_UDP_testclient.c
|
7
|
+
* Compile with: gcc -O2 -Wall -lsodium -o testclient ../core/network.c ../core/Lossless_UDP.c Lossless_UDP_testclient.c
|
8
8
|
*
|
9
9
|
* Command line arguments are the ip and port to connect and send the file to.
|
10
10
|
* EX: ./testclient 127.0.0.1 33445 filename.txt
|
@@ -211,4 +211,4 @@ int main(int argc, char *argv[])
|
|
211
211
|
}
|
212
212
|
|
213
213
|
return 0;
|
214
|
-
}
|
214
|
+
}
|
@@ -4,7 +4,7 @@
|
|
4
4
|
*
|
5
5
|
* Best used in combination with Lossless_UDP_testclient
|
6
6
|
*
|
7
|
-
* Compile with: gcc -O2 -Wall -o testserver ../core/network.c ../core/Lossless_UDP.c Lossless_UDP_testserver.c
|
7
|
+
* Compile with: gcc -O2 -Wall -lsodium -o testserver ../core/network.c ../core/Lossless_UDP.c Lossless_UDP_testserver.c
|
8
8
|
*
|
9
9
|
* Command line argument is the name of the file to save what we recieve to.
|
10
10
|
* EX: ./testserver filename1.txt
|
@@ -198,4 +198,4 @@ int main(int argc, char *argv[])
|
|
198
198
|
}
|
199
199
|
|
200
200
|
return 0;
|
201
|
-
}
|
201
|
+
}
|
@@ -23,9 +23,9 @@
|
|
23
23
|
#include "nTox.h"
|
24
24
|
#include "misc_tools.h"
|
25
25
|
|
26
|
-
|
27
26
|
#include <stdio.h>
|
28
27
|
#include <time.h>
|
28
|
+
|
29
29
|
#ifdef WIN32
|
30
30
|
#define c_sleep(x) Sleep(1*x)
|
31
31
|
#else
|
@@ -35,30 +35,33 @@
|
|
35
35
|
|
36
36
|
char lines[HISTORY][STRING_LENGTH];
|
37
37
|
char line[STRING_LENGTH];
|
38
|
-
|
38
|
+
|
39
|
+
char *help = "[i] commands: /f ID (to add friend), /m friendnumber message (to send message), /s status (to change status)\n"
|
40
|
+
"[i] /l list (list friends), /h for help, /i for info, /n nick (to change nickname), /q (to quit)";
|
41
|
+
int x, y;
|
42
|
+
|
39
43
|
|
40
44
|
uint8_t pending_requests[256][CLIENT_ID_SIZE];
|
41
|
-
uint8_t num_requests;
|
45
|
+
uint8_t num_requests = 0;
|
42
46
|
|
43
47
|
void new_lines(char *line)
|
44
48
|
{
|
45
49
|
int i;
|
46
50
|
for (i = HISTORY-1; i > 0; i--)
|
47
|
-
strcpy(lines[i],lines[i-1]);
|
51
|
+
strcpy(lines[i], lines[i-1]);
|
48
52
|
|
49
|
-
strcpy(lines[0],line);
|
53
|
+
strcpy(lines[0], line);
|
50
54
|
do_refresh();
|
51
55
|
}
|
52
56
|
|
57
|
+
|
53
58
|
void print_friendlist()
|
54
59
|
{
|
55
60
|
char name[MAX_NAME_LENGTH];
|
56
|
-
uint32_t i;
|
57
|
-
|
58
61
|
new_lines("[i] Friend List:");
|
59
|
-
|
62
|
+
uint32_t i;
|
63
|
+
for (i = 0; i <= num_requests; i++) {
|
60
64
|
char fstring[128];
|
61
|
-
|
62
65
|
getname(i, (uint8_t*)name);
|
63
66
|
if (strlen(name) <= 0) {
|
64
67
|
sprintf(fstring, "[i] Friend: NULL\n\tid: %i", i);
|
@@ -69,89 +72,164 @@ void print_friendlist()
|
|
69
72
|
}
|
70
73
|
}
|
71
74
|
|
75
|
+
char *format_message(char *message, int friendnum)
|
76
|
+
{
|
77
|
+
char name[MAX_NAME_LENGTH];
|
78
|
+
if (friendnum != -1) {
|
79
|
+
getname(friendnum, (uint8_t*)name);
|
80
|
+
} else {
|
81
|
+
getself_name((uint8_t*)name);
|
82
|
+
}
|
83
|
+
char *msg = malloc(100+strlen(message)+strlen(name)+1);
|
84
|
+
|
85
|
+
time_t rawtime;
|
86
|
+
struct tm * timeinfo;
|
87
|
+
time ( &rawtime );
|
88
|
+
timeinfo = localtime ( &rawtime );
|
89
|
+
char* time = asctime(timeinfo);
|
90
|
+
size_t len = strlen(time);
|
91
|
+
time[len-1] = '\0';
|
92
|
+
sprintf(msg, "[%d] %s <%s> %s", friendnum, time, name, message); // timestamp
|
93
|
+
return msg;
|
94
|
+
}
|
95
|
+
|
72
96
|
void line_eval(char lines[HISTORY][STRING_LENGTH], char *line)
|
73
97
|
{
|
74
98
|
if (line[0] == '/') {
|
75
|
-
char
|
76
|
-
|
77
|
-
|
78
|
-
|
99
|
+
char inpt_command = line[1];
|
100
|
+
char prompt[STRING_LENGTH+2] = "> ";
|
101
|
+
int prompt_offset = 3;
|
102
|
+
strcat(prompt, line);
|
103
|
+
new_lines(prompt);
|
104
|
+
if (inpt_command == 'f') { // add friend command: /f ID
|
79
105
|
int i;
|
80
106
|
char temp_id[128];
|
81
|
-
for (i=0; i<128; i++)
|
82
|
-
temp_id[i] = line[i+
|
107
|
+
for (i = 0; i < 128; i++)
|
108
|
+
temp_id[i] = line[i+prompt_offset];
|
83
109
|
int num = m_addfriend(hex_string_to_bin(temp_id), (uint8_t*)"Install Gentoo", sizeof("Install Gentoo"));
|
84
110
|
char numstring[100];
|
85
|
-
|
111
|
+
switch (num) {
|
112
|
+
case -1:
|
113
|
+
sprintf(numstring, "[i] Incorrect key length");
|
114
|
+
break;
|
115
|
+
case -2:
|
116
|
+
sprintf(numstring, "[i] That appears to be your own key");
|
117
|
+
break;
|
118
|
+
case -3:
|
119
|
+
sprintf(numstring, "[i] Friend request already sent");
|
120
|
+
break;
|
121
|
+
case -4:
|
122
|
+
sprintf(numstring, "[i] Could not add friend");
|
123
|
+
break;
|
124
|
+
default:
|
125
|
+
sprintf(numstring, "[i] Added friend %d", num);
|
126
|
+
break;
|
127
|
+
}
|
86
128
|
new_lines(numstring);
|
87
129
|
do_refresh();
|
88
130
|
}
|
89
|
-
else if (
|
131
|
+
else if (inpt_command == 'd') {
|
90
132
|
doMessenger();
|
91
133
|
}
|
92
|
-
else if (
|
93
|
-
int i;
|
134
|
+
else if (inpt_command == 'm') { //message command: /m friendnumber messsage
|
94
135
|
size_t len = strlen(line);
|
136
|
+
if(len < 3)
|
137
|
+
return;
|
138
|
+
|
95
139
|
char numstring[len-3];
|
96
140
|
char message[len-3];
|
97
|
-
|
141
|
+
int i;
|
142
|
+
for (i = 0; i < len; i++) {
|
98
143
|
if (line[i+3] != ' ') {
|
99
144
|
numstring[i] = line[i+3];
|
100
145
|
} else {
|
101
146
|
int j;
|
102
|
-
for (j=i+1; j<len; j++)
|
147
|
+
for (j = (i+1); j < (len+1); j++)
|
103
148
|
message[j-i-1] = line[j+3];
|
104
149
|
break;
|
105
150
|
}
|
106
151
|
}
|
107
152
|
int num = atoi(numstring);
|
108
|
-
if(m_sendmessage(num, (uint8_t*) message,
|
153
|
+
if (m_sendmessage(num, (uint8_t*) message, strlen(message) + 1) != 1) {
|
109
154
|
new_lines("[i] could not send message");
|
155
|
+
} else {
|
156
|
+
new_lines(format_message(message, -1));
|
110
157
|
}
|
111
158
|
}
|
112
|
-
else if (
|
159
|
+
else if (inpt_command == 'n') {
|
113
160
|
uint8_t name[MAX_NAME_LENGTH];
|
114
161
|
int i = 0;
|
115
162
|
size_t len = strlen(line);
|
116
|
-
for (i=3; i<len; i++) {
|
163
|
+
for (i = 3; i < len; i++) {
|
117
164
|
if (line[i] == 0 || line[i] == '\n') break;
|
118
|
-
name[i
|
165
|
+
name[i-3] = line[i];
|
119
166
|
}
|
120
|
-
name[i
|
121
|
-
setname(name, i);
|
167
|
+
name[i-3] = 0;
|
168
|
+
setname(name, i - 2);
|
122
169
|
char numstring[100];
|
123
170
|
sprintf(numstring, "[i] changed nick to %s", (char*)name);
|
124
171
|
new_lines(numstring);
|
125
172
|
}
|
126
|
-
else if (
|
173
|
+
else if (inpt_command == 'l') {
|
127
174
|
print_friendlist();
|
128
175
|
}
|
129
|
-
else if (
|
176
|
+
else if (inpt_command == 's') {
|
130
177
|
uint8_t status[MAX_USERSTATUS_LENGTH];
|
131
178
|
int i = 0;
|
132
179
|
size_t len = strlen(line);
|
133
|
-
for (i=3; i<len; i++) {
|
180
|
+
for (i = 3; i < len; i++) {
|
134
181
|
if (line[i] == 0 || line[i] == '\n') break;
|
135
|
-
status[i
|
182
|
+
status[i-3] = line[i];
|
136
183
|
}
|
137
|
-
status[i
|
138
|
-
m_set_userstatus(status, strlen((char*)status));
|
184
|
+
status[i-3] = 0;
|
185
|
+
m_set_userstatus(status, strlen((char*)status) + 1);
|
139
186
|
char numstring[100];
|
140
187
|
sprintf(numstring, "[i] changed status to %s", (char*)status);
|
141
188
|
new_lines(numstring);
|
142
189
|
}
|
143
|
-
else if (
|
190
|
+
else if (inpt_command == 'a') {
|
144
191
|
uint8_t numf = atoi(line + 3);
|
145
192
|
char numchar[100];
|
146
|
-
sprintf(numchar, "[i] friend request %u accepted", numf);
|
147
|
-
new_lines(numchar);
|
148
193
|
int num = m_addfriend_norequest(pending_requests[numf]);
|
149
|
-
|
150
|
-
|
194
|
+
if (num != -1) {
|
195
|
+
sprintf(numchar, "[i] friend request %u accepted", numf);
|
196
|
+
new_lines(numchar);
|
197
|
+
sprintf(numchar, "[i] added friendnumber %d", num);
|
198
|
+
new_lines(numchar);
|
199
|
+
} else {
|
200
|
+
sprintf(numchar, "[i] failed to add friend");
|
201
|
+
new_lines(numchar);
|
202
|
+
}
|
151
203
|
do_refresh();
|
152
|
-
|
153
204
|
}
|
154
|
-
|
205
|
+
else if (inpt_command == 'h') { //help
|
206
|
+
new_lines("[i] commands: /f ID (to add friend), /m friendnumber message (to send message), /s status (to change status)");
|
207
|
+
new_lines("[i] /l list (list friends), /h for help, /i for info, /n nick (to change nickname), /q (to quit)");
|
208
|
+
}
|
209
|
+
else if (inpt_command == 'i') { //info
|
210
|
+
char idstring0[200];
|
211
|
+
char idstring1[PUB_KEY_BYTES][5];
|
212
|
+
char idstring2[PUB_KEY_BYTES][5];
|
213
|
+
int i;
|
214
|
+
for (i = 0; i < PUB_KEY_BYTES; i++)
|
215
|
+
{
|
216
|
+
if (self_public_key[i] < (PUB_KEY_BYTES/2))
|
217
|
+
strcpy(idstring1[i],"0");
|
218
|
+
else
|
219
|
+
strcpy(idstring1[i], "");
|
220
|
+
sprintf(idstring2[i], "%hhX", self_public_key[i]);
|
221
|
+
}
|
222
|
+
//
|
223
|
+
strcpy(idstring0,"[i] ID: ");
|
224
|
+
int j;
|
225
|
+
for (j = 0; j < PUB_KEY_BYTES; j++) {
|
226
|
+
strcat(idstring0,idstring1[j]);
|
227
|
+
strcat(idstring0,idstring2[j]);
|
228
|
+
}
|
229
|
+
new_lines(idstring0);
|
230
|
+
}
|
231
|
+
|
232
|
+
else if (inpt_command == 'q') { //exit
|
155
233
|
endwin();
|
156
234
|
exit(EXIT_SUCCESS);
|
157
235
|
} else {
|
@@ -165,9 +243,9 @@ void line_eval(char lines[HISTORY][STRING_LENGTH], char *line)
|
|
165
243
|
|
166
244
|
void wrap(char output[STRING_LENGTH], char input[STRING_LENGTH], int line_width)
|
167
245
|
{
|
168
|
-
int i = 0;
|
169
246
|
strcpy(output,input);
|
170
247
|
size_t len = strlen(output);
|
248
|
+
int i = 0;
|
171
249
|
for (i = line_width; i < len; i = i + line_width) {
|
172
250
|
while (output[i] != ' ' && i != 0) {
|
173
251
|
i--;
|
@@ -181,9 +259,9 @@ void wrap(char output[STRING_LENGTH], char input[STRING_LENGTH], int line_width)
|
|
181
259
|
int count_lines(char *string)
|
182
260
|
{
|
183
261
|
size_t len = strlen(string);
|
184
|
-
int i;
|
185
262
|
int count = 1;
|
186
|
-
|
263
|
+
int i;
|
264
|
+
for (i = 0; i < len; i++) {
|
187
265
|
if (string[i] == '\n')
|
188
266
|
count++;
|
189
267
|
}
|
@@ -194,7 +272,7 @@ char *appender(char *str, const char c)
|
|
194
272
|
{
|
195
273
|
size_t len = strlen(str);
|
196
274
|
if (len < STRING_LENGTH) {
|
197
|
-
str[len
|
275
|
+
str[len+1] = str[len];
|
198
276
|
str[len] = c;
|
199
277
|
}
|
200
278
|
return str;
|
@@ -202,21 +280,21 @@ char *appender(char *str, const char c)
|
|
202
280
|
|
203
281
|
void do_refresh()
|
204
282
|
{
|
205
|
-
int i;
|
206
283
|
int count=0;
|
207
|
-
int l;
|
208
284
|
char wrap_output[STRING_LENGTH];
|
209
|
-
|
285
|
+
int L;
|
286
|
+
int i;
|
287
|
+
for (i = 0; i < HISTORY; i++) {
|
210
288
|
wrap(wrap_output, lines[i], x);
|
211
|
-
|
212
|
-
count = count +
|
289
|
+
L = count_lines(wrap_output);
|
290
|
+
count = count + L;
|
213
291
|
if (count < y) {
|
214
|
-
move(y-1-count,0);
|
292
|
+
move(y-1-count, 0);
|
215
293
|
printw(wrap_output);
|
216
294
|
clrtoeol();
|
217
295
|
}
|
218
296
|
}
|
219
|
-
move(y-1,0);
|
297
|
+
move(y-1, 0);
|
220
298
|
clrtoeol();
|
221
299
|
printw(">> ");
|
222
300
|
printw(line);
|
@@ -247,12 +325,13 @@ void print_message(int friendnumber, uint8_t * string, uint16_t length)
|
|
247
325
|
timeinfo = localtime ( &rawtime );
|
248
326
|
char* temp = asctime(timeinfo);
|
249
327
|
size_t len = strlen(temp);
|
250
|
-
temp[len-1]='\0';
|
328
|
+
temp[len-1] = '\0';
|
251
329
|
sprintf(msg, "[%d] %s <%s> %s", friendnumber, temp, name, string); // timestamp
|
252
|
-
new_lines(
|
330
|
+
new_lines(format_message((char*)string, friendnumber));
|
253
331
|
}
|
254
332
|
|
255
|
-
void print_nickchange(int friendnumber, uint8_t *string, uint16_t length)
|
333
|
+
void print_nickchange(int friendnumber, uint8_t *string, uint16_t length)
|
334
|
+
{
|
256
335
|
char name[MAX_NAME_LENGTH];
|
257
336
|
getname(friendnumber, (uint8_t*)name);
|
258
337
|
char msg[100+length];
|
@@ -260,7 +339,8 @@ void print_nickchange(int friendnumber, uint8_t *string, uint16_t length) {
|
|
260
339
|
new_lines(msg);
|
261
340
|
}
|
262
341
|
|
263
|
-
void print_statuschange(int friendnumber, uint8_t *string, uint16_t length)
|
342
|
+
void print_statuschange(int friendnumber, uint8_t *string, uint16_t length)
|
343
|
+
{
|
264
344
|
char name[MAX_NAME_LENGTH];
|
265
345
|
getname(friendnumber, (uint8_t*)name);
|
266
346
|
char msg[100+length+strlen(name)+1];
|
@@ -268,15 +348,17 @@ void print_statuschange(int friendnumber, uint8_t *string, uint16_t length) {
|
|
268
348
|
new_lines(msg);
|
269
349
|
}
|
270
350
|
|
271
|
-
void load_key()
|
351
|
+
void load_key()
|
352
|
+
{
|
272
353
|
FILE *data_file = NULL;
|
273
|
-
|
354
|
+
data_file = fopen("data","r");
|
355
|
+
if (data_file) {
|
274
356
|
//load keys
|
275
357
|
fseek(data_file, 0, SEEK_END);
|
276
358
|
int size = ftell(data_file);
|
277
359
|
fseek(data_file, 0, SEEK_SET);
|
278
360
|
uint8_t data[size];
|
279
|
-
if(fread(data, sizeof(uint8_t), size, data_file) != size){
|
361
|
+
if (fread(data, sizeof(uint8_t), size, data_file) != size){
|
280
362
|
printf("[i] could not read data file\n[i] exiting\n");
|
281
363
|
exit(1);
|
282
364
|
}
|
@@ -287,7 +369,7 @@ void load_key(){
|
|
287
369
|
uint8_t data[size];
|
288
370
|
Messenger_save(data);
|
289
371
|
data_file = fopen("data","w");
|
290
|
-
if(fwrite(data, sizeof(uint8_t), size, data_file) != size){
|
372
|
+
if (fwrite(data, sizeof(uint8_t), size, data_file) != size){
|
291
373
|
printf("[i] could not write data file\n[i] exiting\n");
|
292
374
|
exit(1);
|
293
375
|
}
|
@@ -317,34 +399,34 @@ int main(int argc, char *argv[])
|
|
317
399
|
m_callback_namechange(print_nickchange);
|
318
400
|
m_callback_userstatus(print_statuschange);
|
319
401
|
char idstring0[200];
|
320
|
-
char idstring1[
|
321
|
-
char idstring2[
|
322
|
-
|
323
|
-
for(i = 0; i <
|
402
|
+
char idstring1[PUB_KEY_BYTES][5];
|
403
|
+
char idstring2[PUB_KEY_BYTES][5];
|
404
|
+
int i;
|
405
|
+
for(i = 0; i < PUB_KEY_BYTES; i++)
|
324
406
|
{
|
325
|
-
if(self_public_key[i] <
|
407
|
+
if (self_public_key[i] < (PUB_KEY_BYTES / 2))
|
326
408
|
strcpy(idstring1[i],"0");
|
327
409
|
else
|
328
410
|
strcpy(idstring1[i], "");
|
329
411
|
sprintf(idstring2[i], "%hhX",self_public_key[i]);
|
330
412
|
}
|
331
413
|
strcpy(idstring0,"[i] your ID: ");
|
332
|
-
|
333
|
-
|
334
|
-
strcat(idstring0,
|
414
|
+
int j;
|
415
|
+
for (j = 0; j < PUB_KEY_BYTES; j++) {
|
416
|
+
strcat(idstring0,idstring1[j]);
|
417
|
+
strcat(idstring0,idstring2[j]);
|
335
418
|
}
|
336
419
|
initscr();
|
337
420
|
noecho();
|
338
421
|
raw();
|
339
|
-
getmaxyx(stdscr,y,x);
|
422
|
+
getmaxyx(stdscr, y, x);
|
340
423
|
new_lines(idstring0);
|
341
|
-
new_lines(
|
342
|
-
new_lines("[i] /l list (list friends), /n nick (to change nickname), /q (to quit)");
|
424
|
+
new_lines(help);
|
343
425
|
strcpy(line, "");
|
344
426
|
IP_Port bootstrap_ip_port;
|
345
427
|
bootstrap_ip_port.port = htons(atoi(argv[2]));
|
346
428
|
int resolved_address = resolve_addr(argv[1]);
|
347
|
-
if (resolved_address !=
|
429
|
+
if (resolved_address != 0)
|
348
430
|
bootstrap_ip_port.ip.i = resolved_address;
|
349
431
|
else
|
350
432
|
exit(1);
|
@@ -362,7 +444,6 @@ int main(int argc, char *argv[])
|
|
362
444
|
do_refresh();
|
363
445
|
|
364
446
|
c = getch();
|
365
|
-
|
366
447
|
if (c == ERR || c == 27)
|
367
448
|
continue;
|
368
449
|
|
@@ -371,7 +452,7 @@ int main(int argc, char *argv[])
|
|
371
452
|
line_eval(lines, line);
|
372
453
|
strcpy(line, "");
|
373
454
|
} else if (c == 127) {
|
374
|
-
line[strlen(line)
|
455
|
+
line[strlen(line)-1] = '\0';
|
375
456
|
} else if (isalnum(c) || ispunct(c) || c == ' ') {
|
376
457
|
strcpy(line, appender(line, (char) c));
|
377
458
|
}
|