fixed bugs in server and moved token hash calculation to client
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user