created directory ./include/
This commit is contained in:
parent
eec45cac71
commit
a1a11c10e2
1
.vscode/c_cpp_properties.json
vendored
1
.vscode/c_cpp_properties.json
vendored
@ -5,6 +5,7 @@
|
||||
"defines": [],
|
||||
"includePath": [
|
||||
"src",
|
||||
"include",
|
||||
"dependencies/BearSSL/inc",
|
||||
"dependencies/BearSSL/src",
|
||||
"dependencies/tlibc/include",
|
||||
|
||||
2
dependencies/tlibc
vendored
2
dependencies/tlibc
vendored
@ -1 +1 @@
|
||||
Subproject commit 89aab2b5bffd46ec0538a5e7c2f1674d59d5677a
|
||||
Subproject commit bc415772486c087abd9cac9b9f2dc2b5dd5e98db
|
||||
9
include/tcp-chat/server.h
Normal file
9
include/tcp-chat/server.h
Normal file
@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
#include "tlibc/errors.h"
|
||||
#include "tlibc/string/str.h"
|
||||
|
||||
typedef struct Server Server;
|
||||
|
||||
Result(Server*) Server_createFromConfig(str config_str);
|
||||
void Server_free(Server* server);
|
||||
Result(void) Server_run(Server* server);
|
||||
@ -35,7 +35,7 @@ OBJDIR="obj"
|
||||
OUTDIR="bin"
|
||||
STATIC_LIB_FILE="$PROJECT.a"
|
||||
|
||||
INCLUDE="-Isrc -I$DEPENDENCIES_DIR/BearSSL/inc -I$DEPENDENCIES_DIR/tlibc/include"
|
||||
INCLUDE="-Isrc -Iinclude -I$DEPENDENCIES_DIR/BearSSL/inc -I$DEPENDENCIES_DIR/tlibc/include"
|
||||
|
||||
# OS-specific options
|
||||
case "$OS" in
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
#include "ClientCLI/ClientCLI.h"
|
||||
#include "ClientCLI/db_tables.h"
|
||||
#include "term.h"
|
||||
#include "common_constants.h"
|
||||
#include "cli/ClientCLI/ClientCLI.h"
|
||||
#include "cli/ClientCLI/db_tables.h"
|
||||
#include "cli/term.h"
|
||||
#include "tcp-chat/common_constants.h"
|
||||
#include "tlibc/time.h"
|
||||
#include "tlibc/filesystem.h"
|
||||
|
||||
@ -25,7 +25,9 @@ static const str farewell_art = STR(
|
||||
static Result(void) ClientCLI_askUserNameAndPassword(str* username_out, str* password_out);
|
||||
static Result(void) ClientCLI_commandExec(ClientCLI* self, str command, bool* stop);
|
||||
static Result(void) ClientCLI_openUserDB(ClientCLI* self);
|
||||
static Result(void) ClientCLI_saveServerInfo(ClientCLI* self, cstr server_addr_cstr, cstr server_pk_base64);
|
||||
static Result(void) ClientCLI_saveServerInfo(ClientCLI* self,
|
||||
cstr server_addr_cstr, cstr server_pk_base64,
|
||||
str server_name, str server_description);
|
||||
|
||||
|
||||
void ClientCLI_destroy(ClientCLI* self){
|
||||
@ -75,6 +77,7 @@ Result(void) ClientCLI_run(ClientCLI* self) {
|
||||
|
||||
ResultVar(void) com_result = ClientCLI_commandExec(self, command_input, &stop);
|
||||
if(com_result.error){
|
||||
Error_addCallPos(com_result.error, ErrorCallPos_here());
|
||||
str e_str = Error_toStr(com_result.error);
|
||||
printf("%s\n", e_str.data);
|
||||
str_free(e_str);
|
||||
@ -157,7 +160,7 @@ static Result(void) ClientCLI_commandExec(ClientCLI* self, str command, bool* st
|
||||
str_trim(&server_addr_str, true);
|
||||
|
||||
// ask server public key
|
||||
printf("Enter server public key (RSA-Public-<SIZE>:<DATA_BASE64>):\n");
|
||||
printf("Enter server public key (RSA-Public-<SIZE>:<DATA>):\n");
|
||||
char server_pk_cstr[PUBLIC_KEY_BASE64_SIZE_MAX + 1];
|
||||
try_void(term_readLine(server_pk_cstr, sizeof(server_pk_cstr)));
|
||||
str server_pk_str = str_from_cstr(server_pk_cstr);
|
||||
@ -169,11 +172,15 @@ static Result(void) ClientCLI_commandExec(ClientCLI* self, str command, bool* st
|
||||
printf("connection established\n");
|
||||
|
||||
// show server info
|
||||
// printf("server name: %s\n", client->server_connection->server_name.data);
|
||||
// printf("server description: %s\n", client->server_connection->server_description.data);
|
||||
str server_name = str_null;
|
||||
str server_description = str_null;
|
||||
try_void(Client_getServerName(self->client, &server_name));
|
||||
try_void(Client_getServerName(self->client, &server_description));
|
||||
printf("server name: %s\n", server_name.data);
|
||||
printf("server description: %s\n", server_description.data);
|
||||
|
||||
|
||||
try_void(ClientCLI_saveServerInfo(self, server_addr_cstr, server_pk_cstr));
|
||||
try_void(ClientCLI_saveServerInfo(self, server_addr_cstr, server_pk_cstr,
|
||||
server_name, server_description));
|
||||
// TODO: ask in loop: log in / register
|
||||
|
||||
//TODO: call Client_runIO():
|
||||
@ -205,7 +212,9 @@ static Result(void) ClientCLI_openUserDB(ClientCLI* self){
|
||||
Return RESULT_VOID;
|
||||
}
|
||||
|
||||
static Result(void) ClientCLI_saveServerInfo(ClientCLI* self, cstr server_addr_cstr, cstr server_pk_base64){
|
||||
static Result(void) ClientCLI_saveServerInfo(ClientCLI* self,
|
||||
cstr server_addr_cstr, cstr server_pk_base64,
|
||||
str server_name, str server_description){
|
||||
Deferral(8);
|
||||
|
||||
ServerInfo si;
|
||||
@ -222,15 +231,11 @@ static Result(void) ClientCLI_saveServerInfo(ClientCLI* self, cstr server_addr_c
|
||||
si.pk_base64[si.pk_base64_len] = 0;
|
||||
|
||||
// name
|
||||
str server_name = str_null;
|
||||
try_void(Client_getServerName(self->client, &server_name));
|
||||
si.name_len = server_name.size;
|
||||
memcpy(si.name, server_name.data, si.name_len);
|
||||
si.name[si.name_len] = 0;
|
||||
|
||||
// description
|
||||
str server_description = str_null;
|
||||
try_void(Client_getServerName(self->client, &server_description));
|
||||
si.desc_len = server_name.size;
|
||||
memcpy(si.desc, server_description.data, si.desc_len);
|
||||
si.desc[si.desc_len] = 0;
|
||||
@ -1,5 +1,5 @@
|
||||
#pragma once
|
||||
#include "client/client.h"
|
||||
#include "tcp-chat/client.h"
|
||||
#include "db/idb.h"
|
||||
|
||||
typedef struct ClientCLI {
|
||||
@ -1,5 +1,5 @@
|
||||
#pragma once
|
||||
#include "common_constants.h"
|
||||
#include "tcp-chat/common_constants.h"
|
||||
#include "tlibc/time.h"
|
||||
|
||||
typedef struct ServerInfo {
|
||||
24
src/main.c → src/cli/main.c
Executable file → Normal file
24
src/main.c → src/cli/main.c
Executable file → Normal file
@ -1,8 +1,9 @@
|
||||
#include "network/network.h"
|
||||
#include "ClientCLI/ClientCLI.h"
|
||||
#include "server/server.h"
|
||||
#include "tlibc/tlibc.h"
|
||||
#include "tlibc/base64.h"
|
||||
#include "tlibc/filesystem.h"
|
||||
#include "network/network.h"
|
||||
#include "cli/ClientCLI/ClientCLI.h"
|
||||
#include "server/server_internal.h"
|
||||
|
||||
#define _DEFAULT_CONFIG_PATH_CLIENT "tcp-chat-client.config"
|
||||
#define _DEFAULT_CONFIG_PATH_SERVER "tcp-chat-server.config"
|
||||
@ -152,8 +153,23 @@ int main(const int argc, cstr const* argv){
|
||||
if(!config_path)
|
||||
config_path = _DEFAULT_CONFIG_PATH_SERVER;
|
||||
|
||||
try_fatal(Server* server, p, Server_createFromConfig(config_path));
|
||||
// open file
|
||||
try_fatal(FILE* config_file, p, file_open(config_path, FO_ReadExisting));
|
||||
Defer(file_close(config_file));
|
||||
// read whole file into str
|
||||
Array(u8) config_buf = Array_null;
|
||||
try_fatal_void(file_readWhole(config_file, &config_buf));
|
||||
Defer(Array_free(config_buf));
|
||||
str config_str = Array_castTo_str(config_buf, false);
|
||||
config_buf.data = NULL;
|
||||
// init server
|
||||
try_fatal(Server* server, p, Server_createFromConfig(config_str));
|
||||
Defer(Server_free(server));
|
||||
// manually close file and free config_buf
|
||||
file_close(config_file);
|
||||
config_file = NULL;
|
||||
Array_free(config_buf);
|
||||
// start infinite loop on main thread
|
||||
try_fatal_void(Server_run(server));
|
||||
break;
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
#pragma once
|
||||
#include "client.h"
|
||||
#include "tcp-chat/client.h"
|
||||
#include "cryptography/AES.h"
|
||||
#include "cryptography/RSA.h"
|
||||
#include "network/encrypted_sockets.h"
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
#include "tlibc/collections/Array.h"
|
||||
#include "tlibc/errors.h"
|
||||
#include "bearssl_rand.h"
|
||||
#include "common_constants.h"
|
||||
#include "tcp-chat/common_constants.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// //
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
#include "tlibc/errors.h"
|
||||
#include "magic.h"
|
||||
#include "common_constants.h"
|
||||
#include "tcp-chat/common_constants.h"
|
||||
|
||||
#define AES_SESSION_KEY_SIZE 32
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "server.h"
|
||||
#include "server/server_internal.h"
|
||||
#include "network/tcp-chat-protocol/v1.h"
|
||||
|
||||
void ClientConnection_close(ClientConnection* conn){
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#pragma once
|
||||
#include "common_constants.h"
|
||||
#include "tcp-chat/common_constants.h"
|
||||
#include "tlibc/time.h"
|
||||
|
||||
typedef struct User {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
#include "network/tcp-chat-protocol/v1.h"
|
||||
#include "server/server.h"
|
||||
#include "server/server_internal.h"
|
||||
#include "log.h"
|
||||
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
#include "tlibc/filesystem.h"
|
||||
#include "tlibc/time.h"
|
||||
#include "tlibc/base64.h"
|
||||
#include "server.h"
|
||||
#include "server/server_internal.h"
|
||||
#include "config.h"
|
||||
#include "log.h"
|
||||
#include "network/tcp-chat-protocol/v1.h"
|
||||
@ -26,7 +26,7 @@ void Server_free(Server* self){
|
||||
HashMap_destroy(&self->users_name_id_map);
|
||||
}
|
||||
|
||||
Result(Server*) Server_createFromConfig(cstr config_path){
|
||||
Result(Server*) Server_createFromConfig(str config_str){
|
||||
Deferral(16);
|
||||
cstr log_ctx = "ServerInit";
|
||||
logInfo(log_ctx, "parsing config");
|
||||
@ -36,16 +36,6 @@ Result(Server*) Server_createFromConfig(cstr config_path){
|
||||
bool success = false;
|
||||
Defer(if(!success) Server_free(server));
|
||||
|
||||
// open file
|
||||
try(FILE* config_file, p, file_open(config_path, FO_ReadExisting));
|
||||
Defer(file_close(config_file));
|
||||
// read whole file into Array(char)
|
||||
try(i64 config_file_size, i, file_getSize(config_file));
|
||||
Array(char) config_buf = Array_alloc(char, config_file_size);
|
||||
Defer(free(config_buf.data));
|
||||
try_void(file_readBytesArray(config_file, config_buf));
|
||||
str config_str = Array_castTo_str(config_buf, false);
|
||||
|
||||
// parse name
|
||||
str tmp_str = str_null;
|
||||
try_void(config_findValue(config_str, STR("name"), &tmp_str, true));
|
||||
@ -150,26 +140,25 @@ static void* handleConnection(void* _args){
|
||||
|
||||
ResultVar(void) r = try_handleConnection(args, log_ctx);
|
||||
if(r.error){
|
||||
Error_addCallPos(r.error, ErrorCallPos_here());
|
||||
str e_str = Error_toStr(r.error);
|
||||
logError(log_ctx, "%s", e_str.data);
|
||||
str_free(e_str);
|
||||
Error_free(r.error);
|
||||
}
|
||||
|
||||
|
||||
logInfo(log_ctx, "session end");
|
||||
free(args);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static Result(void) try_handleConnection(ConnectionHandlerArgs* args, cstr log_ctx){
|
||||
Deferral(16);
|
||||
Defer(free(args));
|
||||
|
||||
ClientConnection* conn = NULL;
|
||||
Defer(
|
||||
ClientConnection_close(conn);
|
||||
logInfo(log_ctx, "session closed");
|
||||
);
|
||||
// establish encrypted connection
|
||||
try(conn, p, ClientConnection_accept(args));
|
||||
Defer(ClientConnection_close(conn));
|
||||
logInfo(log_ctx, "session accepted");
|
||||
|
||||
// handle requests
|
||||
|
||||
@ -1,14 +1,31 @@
|
||||
#pragma once
|
||||
#include <pthread.h>
|
||||
#include "tlibc/collections/HashMap.h"
|
||||
#include "tlibc/collections/List.h"
|
||||
#include "tcp-chat/server.h"
|
||||
#include "cryptography/AES.h"
|
||||
#include "cryptography/RSA.h"
|
||||
#include "network/encrypted_sockets.h"
|
||||
#include "db/idb.h"
|
||||
#include "tlibc/collections/HashMap.h"
|
||||
#include "tlibc/collections/List.h"
|
||||
#include "db_tables.h"
|
||||
#include <pthread.h>
|
||||
#include "server/db_tables.h"
|
||||
|
||||
typedef struct ClientConnection ClientConnection;
|
||||
|
||||
typedef struct Server {
|
||||
str name;
|
||||
str description;
|
||||
u64 landing_channel_id;
|
||||
EndpointIPv4 local_end;
|
||||
br_rsa_private_key rsa_sk;
|
||||
br_rsa_public_key rsa_pk;
|
||||
|
||||
IncrementalDB* db;
|
||||
Table* db_users_table;
|
||||
pthread_mutex_t users_cache_mutex;
|
||||
List(User) users_cache_list; // index is id
|
||||
HashMap(u64) users_name_id_map; //key is user name
|
||||
} Server;
|
||||
|
||||
typedef struct Server Server;
|
||||
|
||||
typedef struct ClientConnection {
|
||||
u64 session_id;
|
||||
@ -30,21 +47,3 @@ Result(ClientConnection*) ClientConnection_accept(ConnectionHandlerArgs* args);
|
||||
void ClientConnection_close(ClientConnection* conn);
|
||||
|
||||
|
||||
typedef struct Server {
|
||||
str name;
|
||||
str description;
|
||||
u64 landing_channel_id;
|
||||
EndpointIPv4 local_end;
|
||||
br_rsa_private_key rsa_sk;
|
||||
br_rsa_public_key rsa_pk;
|
||||
|
||||
IncrementalDB* db;
|
||||
Table* db_users_table;
|
||||
pthread_mutex_t users_cache_mutex;
|
||||
List(User) users_cache_list; // index is id
|
||||
HashMap(u64) users_name_id_map; //key is user name
|
||||
} Server;
|
||||
|
||||
Result(Server*) Server_createFromConfig(cstr config_path);
|
||||
void Server_free(Server* server);
|
||||
Result(void) Server_run(Server* server);
|
||||
Loading…
Reference in New Issue
Block a user