From f4a01a3fe5b5e0fea624fcc781b62fbb373fce0a Mon Sep 17 00:00:00 2001 From: Anthony Cagliano Date: Tue, 12 Jul 2022 12:58:53 -0400 Subject: [PATCH] server list is now by keyfile, not by separate configuration. --- src/classes/settings.c | 1 - src/classes/settings.h | 1 - src/flags.h | 5 -- src/lcars/gui.c | 24 ++------- src/lcars/gui.h | 2 - src/lcars/text.c | 6 +++ src/lcars/text.h | 1 + src/main.c | 116 ++++++++++++++++++++--------------------- src/network/network.h | 6 +++ src/versioning.c | 2 +- 10 files changed, 75 insertions(+), 89 deletions(-) diff --git a/src/classes/settings.c b/src/classes/settings.c index 0094fd7..06e2098 100644 --- a/src/classes/settings.c +++ b/src/classes/settings.c @@ -41,7 +41,6 @@ void set_defaults(void){ settings.limits.packet_limit = 5; settings.limits.network_timeout = DEFAULT_NET_TIMEOUT; settings.limits.log_limit = 100; - strcpy(settings.server[0].hostname, "play.titrek.us"); } bool write_settings(void){ diff --git a/src/classes/settings.h b/src/classes/settings.h index 8a1c26d..9a83f78 100644 --- a/src/classes/settings.h +++ b/src/classes/settings.h @@ -25,7 +25,6 @@ typedef struct { typedef struct { bool debug; limiter_t limits; - serverdata_t server[10]; bool key_loaded; } settings_t; extern settings_t settings; diff --git a/src/flags.h b/src/flags.h index c045b0e..3473b25 100644 --- a/src/flags.h +++ b/src/flags.h @@ -13,9 +13,4 @@ typedef struct { extern flags_t gameflags; -typedef struct { - uint8_t server; -} bridge_config_t; -extern bridge_config_t bridge_config; - #endif diff --git a/src/lcars/gui.c b/src/lcars/gui.c index 43f14fe..704ff34 100644 --- a/src/lcars/gui.c +++ b/src/lcars/gui.c @@ -218,7 +218,7 @@ bool gui_Login(uint8_t* key) { aes_ctx ctx; uint8_t iv[AES_BLOCKSIZE]; uint8_t ct[PPT_LEN]; - char *keyfile = settings.server[bridge_config.server].keyfile; + char *keyfile = serverinfo.appvname; ti_var_t kf = ti_Open(keyfile, "r"); if(!kf) return false; @@ -231,7 +231,9 @@ bool gui_Login(uint8_t* key) { // this is no longer necessary as of HASHLIB 8 // Encrypt the login token with AES-256 - if(aes_encrypt(ti_GetDataPtr(kf)+7, LOGIN_TOKEN_SIZE, ct, &ctx, iv, AES_MODE_CBC, SCHM_DEFAULT) != AES_OK) return false; + char* hostname = ti_GetDataPtr(kf)+7; + char* keydata = hostname+strlen(hostname)+1; + if(aes_encrypt(keydata, LOGIN_TOKEN_SIZE, ct, &ctx, iv, AES_MODE_CBC, SCHM_DEFAULT) != AES_OK) return false; gfx_TextClearBG("logging you in...", 20, 190, true); ntwk_send(LOGIN, PS_PTR(iv, AES_BLOCKSIZE), @@ -278,21 +280,3 @@ void srv_request_client(hash_ctx *ctx){ ntwk_send(MAIN_REQ_UPDATE, PS_PTR(digest, SHA256_DIGEST_SIZE)); } -void gfx_RenderServerMenu(serverdata_t *servers, uint8_t menucount, uint8_t selected, uint24_t x, uint8_t y, uint24_t w, uint8_t h){ - gfx_SetColor(195); - gfx_Rectangle(x-2, y-2, w+4, h+4); - gfx_Rectangle(x-1, y-1, w+2, h+2); - for(uint8_t i = 0; ihostname[0]) return; - char *filename = server->keyfile; - gfx_PrintStringXY("Keyfile: ", 5, 190); - if(filename[0] == 0) { - gfx_PrintString("none"); - } else { - gfx_PrintString(filename); - } -} diff --git a/src/lcars/gui.h b/src/lcars/gui.h index ec8f1ad..441e92c 100644 --- a/src/lcars/gui.h +++ b/src/lcars/gui.h @@ -44,7 +44,5 @@ uint8_t prompt_for(char* prompt, char* buffer, size_t len, uint24_t x, uint8_t y void srv_request_gfx(hash_ctx *ctx); void srv_request_client(hash_ctx *ctx); -void gfx_RenderServerMenu(serverdata_t *servers, uint8_t menucount, uint8_t selected, uint24_t x, uint8_t y, uint24_t w, uint8_t h); -void gfx_RenderServerMeta(serverdata_t *server); #endif diff --git a/src/lcars/text.c b/src/lcars/text.c index dcb4d2f..88b4102 100644 --- a/src/lcars/text.c +++ b/src/lcars/text.c @@ -80,6 +80,12 @@ void gfx_HighlightedText(const char* string, uint24_t x, uint8_t y, uint8_t text gfx_SetTextFGColor(oldcolor); } +void gfx_ColoredText(const char* string, uint24_t x, uint8_t y, uint8_t color){ + uint8_t oldcolor = gfx_SetTextFGColor(color); + gfx_PrintStringXY(string, x, y); + gfx_SetTextFGColor(oldcolor); +} + void gfx_TextClearBG(const char* string, uint24_t x, uint8_t y, bool full_line){ uint8_t old_gfx_color = gfx_SetColor(0); if(full_line) gfx_FillRectangle(0, y, 320, 8); diff --git a/src/lcars/text.h b/src/lcars/text.h index efb5e4e..46c2fb1 100644 --- a/src/lcars/text.h +++ b/src/lcars/text.h @@ -8,6 +8,7 @@ int text_GetCenterX(char* string); int num_GetLength(int number); uint8_t gfx_VCenterText(uint8_t y, uint8_t box_height, uint8_t font_height); void gfx_HighlightedText(const char* string, uint24_t x, uint8_t y, uint8_t text_color, uint8_t highlight_color); +void gfx_ColoredText(const char* string, uint24_t x, uint8_t y, uint8_t color); void gfx_TextClearBG(const char* string, uint24_t x, uint8_t y, bool full_line); void gfx_ErrorClearBG(const char* error, uint24_t x, uint8_t y); #endif diff --git a/src/main.c b/src/main.c index 51a6e3b..dd27aa1 100644 --- a/src/main.c +++ b/src/main.c @@ -84,7 +84,7 @@ uint8_t playgame_return = 0; bool full_redraw = true; bool gfx_loaded = false; uint8_t errors = 0; -bridge_config_t bridge_config = {0}; +serverinfo_t serverinfo = {0}; ti_var_t update_fp = 0; @@ -141,76 +141,73 @@ void MainMenu(void) { } void ServerSelect(void){ +#define CEMU_CONSOLE ((char*)0xFB0000) uint8_t i, selected = 0; bool firstrender = true; - sk_key_t key; + sk_key_t key = 0; + char *var_name; + void *vat_ptr = NULL; + char *filenames = NULL; + size_t filect = 0, offset=0; if(gameflags.gfx_error) return; + + // parse VAT for files containing TrekKey string at beginning. + while ((var_name = ti_Detect(&vat_ptr, "TrekKey"))){ + filenames = realloc(filenames, sizeof(filenames)+9); + strncpy(9*filect+filenames, var_name, 9); + filect++; + } + filect; + if(filenames==NULL) return; do { + char* hostinfo; key = getKey(); - if(key == sk_Down) selected += (selected < 9); - if(key == sk_Up) selected -= (selected > 0); + if(key == sk_Clear) break; - if((key == sk_Del) && (selected != 0)){ - prompt_for("Add Server:", settings.server[selected].hostname, 49, 20, 210, 0); - } - if(key== sk_Store){ - window_data_t win = {160-40, 80, 120-20, 35, 195, 2, 0}; - bool firstrun = true; - char *var_name; - void *vat_ptr = NULL; - char *filenames = NULL; - size_t filect = 0; - while ((var_name = ti_Detect(&vat_ptr, "TrekKey"))){ - filenames = realloc(filenames, sizeof(filenames)+9); - strncpy(9*filect+filenames, var_name, 9); - filect++; - } - filect--; - if(filenames!=NULL){ - size_t offset = 0; - size_t limit = sizeof(filenames)-9; - while(1){ - key = getKey(); - if(key==sk_Clear) break; - if((key==sk_Left) && offset) offset--; - if((key==sk_Right) && (offset < filect)) offset++; - if(key==sk_Enter) { - strncpy(settings.server[selected].keyfile, offset*9+filenames, 9); - break; - } - if(key || firstrun) { - gfx_RenderWindow(&win); - if(offset) gfx_PrintStringXY("<", 125, 120); - if(offset", 190, 120); - gfx_TextClearBG(offset*9+filenames, 125, 105, false); - gfx_BlitBuffer(); - } - } - } - key = 0; - firstrender=true; - free(filenames); + if((key == sk_Left) && (offset>0)) offset--; + if((key == sk_Right) && (offset<(filect-1))) offset++; + + if(key == sk_Enter){ + ti_var_t fp = ti_Open(9*offset+filenames, "r"); + if(!fp) return; + strcpy(serverinfo.appvname, 9*offset+filenames); + strcpy(serverinfo.hostname, ti_GetDataPtr(fp)+7); + ti_Close(fp); + playgame_return = PlayGame(); + break; } + if(key || firstrender){ + window_data_t win = {3, 260, 20, 100, 195, 2, 181}; + ti_var_t tfp = ti_Open(9*offset+filenames, "r"); gfx_ZeroScreen(); - gfx_RenderMenuTitle("Server List", 3, 5); - gfx_RenderServerMenu(settings.server, 10, selected, 5, 20, 200, 160); + + // main GUI elements + gfx_RenderMenuTitle("Server Info", 3, 5); + gfx_RenderWindow(&win); gfx_SetTextFGColor(255); - gfx_RenderServerMeta(&settings.server[selected]); - gfx_PrintStringXY("[Enter] Select", 210, 30); - gfx_PrintStringXY("[Del] Edit/Add", 210, 40); - gfx_PrintStringXY("[Sto] Link Key", 210, 50); + gfx_PrintStringXY("[Enter] Connect to selected host", 5, 130); + if(offset>0) gfx_ColoredText("[Left] Select previous server", 5, 140, 255); + else gfx_ColoredText("[Left] Select previous server", 5, 140, 74); + if(offset<(filect-1)) gfx_ColoredText("[Right] Select next server", 5, 150, 255); + else gfx_ColoredText("[Right] Select next server", 5, 150, 74); + gfx_SetTextFGColor(0); + if(tfp) { + // if appv opened + gfx_PrintStringXY("Hostname: ", 10, 30); + gfx_PrintStringXY(ti_GetDataPtr(tfp)+7, 15, 40); + gfx_PrintStringXY("Keyfile: ", 10, 55); + gfx_PrintStringXY(9*offset+filenames, 15, 65); + ti_Close(tfp); + } + else { + gfx_PrintStringXY("Error opening file", 10, 25); + } gfx_BlitBuffer(); firstrender = false; } - if(key == sk_Enter){ - if(settings.server[selected].hostname[0]){ - bridge_config.server = selected; - playgame_return = PlayGame(); - break; - } - } - ntwk_process(); + + ntwk_process(); } while (1); } @@ -368,7 +365,8 @@ uint8_t PlayGame(void){ gameflags.exit = false; netflags.bridge_up = false; gfx_InitModuleIcons(); - ntwk_send(CONNECT, PS_STR(settings.server[bridge_config.server].hostname)); + gfx_SetTextFGColor(255); + ntwk_send(CONNECT, PS_STR(serverinfo.hostname)); gfx_TextClearBG("Waiting for bridge...", 20, 190, true); gfx_TextClearBG("[Clear] to stop", 20, 200, true); gfx_BlitBuffer(); diff --git a/src/network/network.h b/src/network/network.h index 6a2ef82..18b270e 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -38,6 +38,12 @@ typedef struct { void (*write)(void *data, size_t size); } net_mode_t; +typedef struct { + char appvname[9]; + char hostname[256]; +} serverinfo_t; +extern serverinfo_t serverinfo; + extern net_mode_t mode_srl; extern net_mode_t mode_pipe; diff --git a/src/versioning.c b/src/versioning.c index 7395d2b..f7ba26e 100644 --- a/src/versioning.c +++ b/src/versioning.c @@ -6,7 +6,7 @@ #include "flags.h" #define TrekGFX_HEADER_SIZE 2 -uint8_t version[] = {0, 0, 109}; +uint8_t version[] = {0, 0, 110}; char versionstr[16] = {0}; uint8_t gfx_version[2] = {0}; uint8_t gfx_reqd[2] = {1, 5};