diff --git a/src/main.c b/src/main.c index 0cf69e8..21719b6 100644 --- a/src/main.c +++ b/src/main.c @@ -503,8 +503,8 @@ int socket_name_random(char *out, size_t out_len); /* Version information (auto-updated by build/version tooling) */ #define NSIGNER_VERSION_MAJOR 0 #define NSIGNER_VERSION_MINOR 0 -#define NSIGNER_VERSION_PATCH 39 -#define NSIGNER_VERSION "v0.0.39" +#define NSIGNER_VERSION_PATCH 40 +#define NSIGNER_VERSION "v0.0.40" /* NSIGNER_HEADERLESS_DECLS_END */ @@ -1671,6 +1671,59 @@ static int prompt_transport_selection(void) { return selected; } +/* + * Interactive index whitelist prompt. + * Shown after transport selection when no --allow-index flag was given. + * Returns a malloc'd spec string (caller must free), or NULL for "all". + */ +static char *prompt_index_whitelist(void) { + char input[256]; + + for (;;) { + tui_render_content_screen(NULL, "Index whitelist — restrict which nostr_index values this session can access"); + printf("Enter allowed indices, or press Enter for 'all' (no restriction):\n\n"); + printf(" Examples:\n"); + printf(" all (default — allow all indices)\n"); + printf(" 0 (only index 0)\n"); + printf(" 0,1,3 (specific indices)\n"); + printf(" 0-3 (range 0 through 3)\n"); + printf(" 0,2-3,7 (mixed list and ranges)\n"); + printf("\n Enter = all\n"); + printf("> "); + fflush(stdout); + + if (read_line_stdin(input, sizeof(input)) != 0) { + return NULL; + } + + /* Trim trailing whitespace */ + { + size_t len = strlen(input); + while (len > 0 && (input[len-1] == '\n' || input[len-1] == '\r' || + input[len-1] == ' ' || input[len-1] == '\t')) { + input[--len] = '\0'; + } + } + + if (input[0] == '\0') { + /* Enter pressed — default to "all" */ + return NULL; + } + + /* Validate by parsing into a temp whitelist */ + { + server_ctx_t tmp; + memset(&tmp, 0, sizeof(tmp)); + if (server_set_index_whitelist(&tmp, input) != 0) { + printf("Invalid spec: '%s'. Try again or press Enter for 'all'.\n", input); + continue; + } + } + + return strdup(input); + } +} + int main(int argc, char *argv[]) { mnemonic_state_t mnemonic; role_table_t role_table; @@ -1969,6 +2022,14 @@ int main(int argc, char *argv[]) { return 1; } + /* Index whitelist prompt (only if --allow-index wasn't given on CLI) */ + if (allow_index_spec == NULL) { + char *wl_spec = prompt_index_whitelist(); + if (wl_spec != NULL) { + allow_index_spec = wl_spec; /* will be freed at program exit */ + } + } + /* Persistent listeners — configure from menu selection */ multi_listen = 1;