fixed bugs in server and moved token hash calculation to client

This commit is contained in:
2025-11-21 21:22:53 +05:00
parent baca2fb4d3
commit 0abee3f7df
20 changed files with 161 additions and 156 deletions

View File

@@ -24,18 +24,20 @@ static const str farewell_art = STR(
static Result(void) ClientCLI_askUserNameAndPassword(str* username_out, str* password_out);
static Result(void) ClientCLI_execCommand(ClientCLI* self, str command, bool* stop);
static Result(void) ClientCLI_openUserDB(ClientCLI* self);
static Result(Server*) ClientCLI_saveServerInfo(ClientCLI* self,
static Result(ServerInfo*) ClientCLI_saveServerInfo(ClientCLI* self,
str addr, str pk_base64, str name, str desc);
static Result(Server*) ClientCLI_joinNewServer(ClientCLI* self);
static Result(Server*) ClientCLI_selectServerFromCache(ClientCLI* self);
static Result(void) ClientCLI_showServerInfo(ClientCLI* self, Server* server);
static Result(ServerInfo*) ClientCLI_joinNewServer(ClientCLI* self);
static Result(ServerInfo*) ClientCLI_selectServerFromCache(ClientCLI* self);
static Result(void) ClientCLI_showServerInfo(ClientCLI* self, ServerInfo* server);
static Result(void) ClientCLI_register(ClientCLI* self);
static Result(void) ClientCLI_login(ClientCLI* self);
void ClientCLI_destroy(ClientCLI* self){
if(!self)
return;
Client_free(self->client);
idb_close(self->db);
pthread_mutex_destroy(&self->servers_cache_mutex);
List_destroy(self->servers_cache_list);
@@ -213,7 +215,7 @@ static Result(void) ClientCLI_joinNewServer(ClientCLI* self){
str server_description = str_null;
try_void(Client_getServerName(self->client, &server_name));
try_void(Client_getServerDescription(self->client, &server_description));
try(Server* server, p, ClientCLI_saveServerInfo(self,
try(ServerInfo* server, p, ClientCLI_saveServerInfo(self,
server_addr_str, server_pk_str,
server_name, server_description));
@@ -229,14 +231,14 @@ static Result(void) ClientCLI_selectServerFromCache(ClientCLI* self){
try_stderrcode(pthread_mutex_lock(&self->servers_cache_mutex));
Defer(pthread_mutex_unlock(&self->servers_cache_mutex));
u32 servers_count = List_len(self->servers_cache_list, Server);
u32 servers_count = List_len(self->servers_cache_list, ServerInfo);
if(servers_count == 0){
printf("No servers found in cache\n");
Return RESULT_VOID;
}
for(u32 id = 0; id < servers_count; id++){
Server* row = &List_index(self->servers_cache_list, Server, id);
ServerInfo* row = &List_index(self->servers_cache_list, ServerInfo, id);
printf("[%02u] "FMT_str" "FMT_str"\n",
id, row->address_len, row->address, row->name_len, row->name);
}
@@ -260,7 +262,7 @@ static Result(void) ClientCLI_selectServerFromCache(ClientCLI* self){
}
else break;
}
Server* server = &List_index(self->servers_cache_list, Server, id);
ServerInfo* server = &List_index(self->servers_cache_list, ServerInfo, id);
printf("Connecting to '"FMT_str"'...\n", server->address_len, server->address);
try_void(Client_connect(self->client, server->address, server->pk_base64));
@@ -296,7 +298,7 @@ static Result(void) ClientCLI_selectServerFromCache(ClientCLI* self){
Return RESULT_VOID;
}
static Result(void) ClientCLI_showServerInfo(ClientCLI* self, Server* server){
static Result(void) ClientCLI_showServerInfo(ClientCLI* self, ServerInfo* server){
Deferral(8);
(void)self;
@@ -320,16 +322,16 @@ static Result(void) ClientCLI_openUserDB(ClientCLI* self){
try(self->db, p, idb_open(user_db_dir, user_data_key));
// load servers table
try(self->db_servers_table, p, idb_getOrCreateTable(self->db, STR("servers"), sizeof(Server)));
try(self->db_servers_table, p, idb_getOrCreateTable(self->db, STR("servers"), sizeof(ServerInfo)));
// load whole table to list
try(u64 servers_count, u, idb_getRowCount(self->db_servers_table));
self->servers_cache_list = List_alloc(Server, servers_count);
self->servers_cache_list = List_alloc(ServerInfo, servers_count);
try_void(idb_getRows(self->db_servers_table, 0, self->servers_cache_list.data, servers_count));
self->servers_cache_list.size = sizeof(Server) * servers_count;
self->servers_cache_list.size = sizeof(ServerInfo) * servers_count;
// build address-id map
HashMap_construct(&self->servers_addr_id_map, u64, NULL);
for(u64 id = 0; id < servers_count; id++){
Server* row = &List_index(self->servers_cache_list, Server, id);
ServerInfo* row = &List_index(self->servers_cache_list, ServerInfo, id);
str key = str_construct(row->address, row->address_len, true);
if(!HashMap_tryPush(&self->servers_addr_id_map, key, &id)){
Return RESULT_ERROR_FMT("duplicate server address '"FMT_str"'", key.size, key.data);
@@ -339,13 +341,13 @@ static Result(void) ClientCLI_openUserDB(ClientCLI* self){
Return RESULT_VOID;
}
static Result(Server*) ClientCLI_saveServerInfo(ClientCLI* self,
static Result(ServerInfo*) ClientCLI_saveServerInfo(ClientCLI* self,
str addr, str pk_base64, str name, str desc){
Deferral(8);
// create new server info
Server server;
memset(&server, 0, sizeof(Server));
ServerInfo server;
memset(&server, 0, sizeof(ServerInfo));
// address
if(addr.size > HOSTADDR_SIZE_MAX)
addr.size = HOSTADDR_SIZE_MAX;
@@ -372,23 +374,23 @@ static Result(Server*) ClientCLI_saveServerInfo(ClientCLI* self,
Defer(pthread_mutex_unlock(&self->servers_cache_mutex));
// try find server id in cache
Server* cached_row_ptr = NULL;
ServerInfo* cached_row_ptr = NULL;
u64* id_ptr = NULL;
id_ptr = HashMap_tryGetPtr(&self->servers_addr_id_map, addr);
if(id_ptr){
// update existing server
u64 id = *id_ptr;
try_void(idb_updateRow(self->db_servers_table, id, &server));
try_assert(id < List_len(self->servers_cache_list, Server));
cached_row_ptr = &List_index(self->servers_cache_list, Server, id);
memcpy(cached_row_ptr, &server, sizeof(Server));
try_assert(id < List_len(self->servers_cache_list, ServerInfo));
cached_row_ptr = &List_index(self->servers_cache_list, ServerInfo, id);
memcpy(cached_row_ptr, &server, sizeof(ServerInfo));
}
else {
// push new server
try(u64 id, u, idb_pushRow(self->db_servers_table, &server));
try_assert(id == List_len(self->servers_cache_list, Server));
List_pushMany(&self->servers_cache_list, Server, &server, 1);
cached_row_ptr = &List_index(self->servers_cache_list, Server, id);
try_assert(id == List_len(self->servers_cache_list, ServerInfo));
List_pushMany(&self->servers_cache_list, ServerInfo, &server, 1);
cached_row_ptr = &List_index(self->servers_cache_list, ServerInfo, id);
try_assert(HashMap_tryPush(&self->servers_addr_id_map, addr, &id));
}