From 05fa405f5aca783425d3c527bbae21dbb42448db Mon Sep 17 00:00:00 2001 From: synt-xerror <169557594+synt-xerror@users.noreply.github.com> Date: Sun, 1 Mar 2026 03:40:27 -0300 Subject: [PATCH] login is now possible, but needs refinement --- Makefile | 2 + neogities | Bin 29088 -> 38064 bytes neogities.c | 217 ++++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 194 insertions(+), 25 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..24a556b --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +make: + gcc neogities.c -o neogities -lcurl -ljansson -lreadline diff --git a/neogities b/neogities index 0cc72d539efebd041170adfac2177f24e81e71cd..d6ac90c3c4a7ab56254c1c3303aedfb81fbfafc5 100755 GIT binary patch literal 38064 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 RiNWkI-XSzb7zPH*{u{Nd;`0Ci literal 29088 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 Ss_cp*oZuJING*aUvi}8F9-IIG diff --git a/neogities.c b/neogities.c index 4e16f7d..1704dd1 100644 --- a/neogities.c +++ b/neogities.c @@ -17,6 +17,8 @@ #include #include +#define MAX_LINE 256 + // ------------------------- // HTTP response buffer // ------------------------- @@ -249,6 +251,42 @@ int neocities_upload( return 0; } +// ------------------------- +// key — GET /api/key +// ------------------------- +int neocities_apikey(const char *user, const char *pass, char **out) { + struct response resp = {0}; + + char userpass[256]; + snprintf(userpass, sizeof(userpass), "%s:%s", user, pass); + + CURL *curl = curl_easy_init(); + if (!curl) return 1; + + resp.data = malloc(1); + resp.len = 0; + resp.data[0] = '\0'; + + curl_easy_setopt(curl, CURLOPT_URL, "https://neocities.org/api/key"); + curl_easy_setopt(curl, CURLOPT_USERPWD, userpass); // aqui é equivalente ao -u do curl + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resp); + + CURLcode res = curl_easy_perform(curl); + long http_code = 0; + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + + curl_easy_cleanup(curl); + + if (res != CURLE_OK || http_code >= 400) { + free(resp.data); + return 2; + } + + *out = resp.data; // resposta da API + return 0; +} + char* home() { struct passwd *u; @@ -302,13 +340,18 @@ char* get_dir(const char* HOME, const char* DIR_NAME) { return DIR_FINAL; } + char* get_file(const char* ROOT, const char* FILE_NAME) { - char* FINAL_FILE; + char* FINAL_FILE = malloc(strlen(ROOT) + strlen(FILE_NAME) + 2); // +2 para '/' e '\0' + if (!FINAL_FILE) return NULL; - FINAL_FILE = malloc(strlen(ROOT) + strlen(FILE_NAME) + 1); - sprintf(FINAL_FILE, "%s/%s", ROOT, FILE_NAME); + sprintf(FINAL_FILE, "%s/%s", ROOT, FILE_NAME); - return FINAL_FILE; + // Tenta abrir o arquivo em modo append (cria se não existir) + FILE* f = fopen(FINAL_FILE, "a"); + if (f) fclose(f); // Fecha imediatamente + + return FINAL_FILE; } struct termios orig_termios; @@ -392,15 +435,12 @@ const char* CONFIG_DIR = ".config/neogities"; const char* CONFIG_FILE = "neogities.conf"; const char* ACCESS_FILE = "credentials"; -int main() { + +//char* DEF_DATA_DIR = get_dir(home(), DATA_DIR); +//char* DEF_ACCESS_FILE = get_dir(DEF_DATA_DIR, ACCESS_FILE); + +void title() { static const char* version = "v0.1.0"; - - const char* DEF_DATA_DIR = get_dir(home(), DATA_DIR); - const char* DEF_CONFIG_DIR = get_dir(home(), DATA_DIR); - - const char* DEF_CONFIG_FILE = get_file(DEF_CONFIG_DIR, CONFIG_FILE); - const char* DEF_ACCESS_FILE = get_file(DEF_DATA_DIR, ACCESS_FILE); - srand(time(NULL) ^ getpid()); int a = rand() % 2; @@ -412,14 +452,151 @@ int main() { const char* eye = eyes[a]; const char* mouth = mouths[b]; - static const char *logo = + static const char* logo = "|\\---/|---------------o\n" "| %s | Neogities / \\\n" " \\_%s_/ %s / o\n" " o\n"; - - printf("Hello! You're not logged in.\n\n"); + printf(logo, eye, mouth, version); +} + +char* get_conf(const char* conf) { + char* DEF_CONFIG_DIR = get_dir(home(), CONFIG_DIR); + char* DEF_CONFIG_FILE = get_file(DEF_CONFIG_DIR, CONFIG_FILE); + + if (!conf) { + printf("get_conf: No option provided."); + return "err"; + } + + FILE *fp = fopen(DEF_CONFIG_FILE, "r"); + if (!fp) { + printf("Error when opening config file on: %s", DEF_CONFIG_FILE); + return "err"; + } + + char line[MAX_LINE]; + char lastLine[MAX_LINE] = ""; + + // Ler linha por linha e guardar a última que contém a conf + while (fgets(line, sizeof(line), fp)) { + if (strstr(line, conf)) { + strcpy(lastLine, line); + } + } + fclose(fp); + free((char*)DEF_CONFIG_DIR); + free((char*)DEF_CONFIG_FILE); + + if (strlen(lastLine) == 0) { + return "err"; + } + + // Tokenizar a linha + char *token1 = NULL, *token2 = NULL; + char *rest = lastLine; + + token1 = strtok_r(rest, " \t\n", &rest); + token2 = strtok_r(rest, " \t\n", &rest); + + + + if (token1 && token2) { + char *result = malloc(strlen(token2)+1); + strcpy(result, token2); + return result; + } else { + return "err"; + } +} + +void login() { + //free((char*)DEF_ACCESS_FILE); +} + +// TODO +// fix segfault at menu +// support to many accounts, credential files for single one with username and api key togheter +// loggedas only to define with which one the user is logged in +// detect when a account is logged and suggest the menu to choose which one to log + +int main(int argc, char* argv[]) { + static const char* commands = + " login Login to your Neocities account\n"; + + const char* loggedas = get_conf("loggedas"); + if (strcmp(loggedas, "err") != 0) { + printf("Hello, %s.\n\n", loggedas); + free((char*)loggedas); // liberar memória alocada + } else { + printf("Hello! You're not logged in.\n\n"); + } + title(); + + if (!argv){ + printf("Core commands:\n"); + printf("%s", commands); + } else if (strcmp(argv[1], "login") == 0) { + printf("\nLOGIN:\n"); + + char *user = readline("Username: "); + char *password = readline("Password: "); + + char* out = NULL; + json_error_t error; + + if (neocities_apikey(user, password, &out) == 0) { + json_t *root = json_loads(out, 0, &error); + json_t *api_key = json_object_get(root, "api_key"); + const char* str = json_string_value(api_key); + + printf("Please wait..."); + if (str) { + const char* DEF_CONFIG_DIR = get_file(home(), CONFIG_DIR); + const char* DEF_CONFIG_FILE = get_file(DEF_CONFIG_DIR, CONFIG_FILE); + const char* DEF_DATA_DIR = get_file(home(), DATA_DIR); + const char* DEF_ACCESS_FILE = get_file(DEF_DATA_DIR, ACCESS_FILE); + + FILE* access_f = fopen(DEF_ACCESS_FILE, "w"); + if (!access_f) { + return 1; + } + + fprintf(access_f, "%s", str); + fclose(access_f); + + char loggedas[64]; + snprintf(loggedas, sizeof(loggedas), "loggedas %s", user); + + FILE* config_f = fopen(DEF_CONFIG_FILE, "r+"); + if (!config_f) { + return 1; + } + + fseek(config_f, 0, SEEK_SET); + + fwrite(loggedas, strlen(loggedas), 1, config_f); + + char* user_f = get_conf("loggedas"); + + fclose(config_f); + + free((char*)DEF_CONFIG_DIR); + free((char*)DEF_CONFIG_FILE); + + free((char*)DEF_DATA_DIR); + free((char*)DEF_ACCESS_FILE); + + printf("Success! You have successfully logged as %s", user); + } else { + printf("Could not get API key, please check username and password and your internet connection."); + } + } + + free(user); + free(password); + } /* char *titles[] = {"Meu Menu"}; char *options[] = {"Opção 1", "Opção 2", "Opção 3"}; @@ -428,14 +605,4 @@ int main() { printf("Selecionou: %d\n", choice); */ - /* char *input = readline("Nome: "); // mostra prompt e permite editar - if (input != NULL) { - printf("Você digitou: %s\n", input); - } - - free(input); */ - free((char*)DEF_DATA_DIR); - free((char*)DEF_CONFIG_DIR); - free((char*)DEF_CONFIG_FILE); - free((char*)DEF_ACCESS_FILE); }