From b89c011ad5e3f7a0038c77f04f0dec7bd6433d32 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 10 Oct 2025 06:53:30 -0400 Subject: [PATCH] v0.7.2 - -m --- src/main.c | 69 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/src/main.c b/src/main.c index a3d8548..517dd33 100644 --- a/src/main.c +++ b/src/main.c @@ -19,6 +19,7 @@ #include "../nostr_core_lib/cjson/cJSON.h" #include "../nostr_core_lib/nostr_core/nostr_core.h" #include "../nostr_core_lib/nostr_core/nip013.h" // NIP-13: Proof of Work +#include "../nostr_core_lib/nostr_core/nip019.h" // NIP-19: bech32-encoded entities #include "config.h" // Configuration management system #include "sql_schema.h" // Embedded database schema #include "websockets.h" // WebSocket protocol implementation @@ -1293,8 +1294,8 @@ void print_usage(const char* program_name) { printf(" -v, --version Show version information\n"); printf(" -p, --port PORT Override relay port (first-time startup only)\n"); printf(" --strict-port Fail if exact port is unavailable (no port increment)\n"); - printf(" -a, --admin-pubkey HEX Override admin public key (64-char hex)\n"); - printf(" -r, --relay-privkey HEX Override relay private key (64-char hex)\n"); + printf(" -a, --admin-pubkey KEY Override admin public key (64-char hex or npub)\n"); + printf(" -r, --relay-privkey KEY Override relay private key (64-char hex or nsec)\n"); printf("\n"); printf("Configuration:\n"); printf(" This relay uses event-based configuration stored in the database.\n"); @@ -1375,24 +1376,25 @@ int main(int argc, char* argv[]) { return 1; } - // Validate public key format (must be 64 hex characters) - if (strlen(argv[i + 1]) != 64) { - log_error("Invalid admin public key length. Must be exactly 64 hex characters."); + const char* input_key = argv[i + 1]; + char decoded_key[65] = {0}; // Buffer for decoded hex key + + // Try to decode the input as either hex or npub format + unsigned char pubkey_bytes[32]; + if (nostr_decode_npub(input_key, pubkey_bytes) == NOSTR_SUCCESS) { + // Convert bytes back to hex string + char* hex_ptr = decoded_key; + for (int j = 0; j < 32; j++) { + sprintf(hex_ptr, "%02x", pubkey_bytes[j]); + hex_ptr += 2; + } + } else { + log_error("Invalid admin public key format. Must be 64 hex characters or valid npub format."); print_usage(argv[0]); return 1; } - // Validate hex format - for (int j = 0; j < 64; j++) { - char c = argv[i + 1][j]; - if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) { - log_error("Invalid admin public key format. Must contain only hex characters (0-9, a-f, A-F)."); - print_usage(argv[0]); - return 1; - } - } - - strncpy(cli_options.admin_pubkey_override, argv[i + 1], sizeof(cli_options.admin_pubkey_override) - 1); + strncpy(cli_options.admin_pubkey_override, decoded_key, sizeof(cli_options.admin_pubkey_override) - 1); cli_options.admin_pubkey_override[sizeof(cli_options.admin_pubkey_override) - 1] = '\0'; i++; // Skip the key argument @@ -1404,28 +1406,29 @@ int main(int argc, char* argv[]) { print_usage(argv[0]); return 1; } - - // Validate private key format (must be 64 hex characters) - if (strlen(argv[i + 1]) != 64) { - log_error("Invalid relay private key length. Must be exactly 64 hex characters."); + + const char* input_key = argv[i + 1]; + char decoded_key[65] = {0}; // Buffer for decoded hex key + + // Try to decode the input as either hex or nsec format + unsigned char privkey_bytes[32]; + if (nostr_decode_nsec(input_key, privkey_bytes) == NOSTR_SUCCESS) { + // Convert bytes back to hex string + char* hex_ptr = decoded_key; + for (int j = 0; j < 32; j++) { + sprintf(hex_ptr, "%02x", privkey_bytes[j]); + hex_ptr += 2; + } + } else { + log_error("Invalid relay private key format. Must be 64 hex characters or valid nsec format."); print_usage(argv[0]); return 1; } - - // Validate hex format - for (int j = 0; j < 64; j++) { - char c = argv[i + 1][j]; - if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) { - log_error("Invalid relay private key format. Must contain only hex characters (0-9, a-f, A-F)."); - print_usage(argv[0]); - return 1; - } - } - - strncpy(cli_options.relay_privkey_override, argv[i + 1], sizeof(cli_options.relay_privkey_override) - 1); + + strncpy(cli_options.relay_privkey_override, decoded_key, sizeof(cli_options.relay_privkey_override) - 1); cli_options.relay_privkey_override[sizeof(cli_options.relay_privkey_override) - 1] = '\0'; i++; // Skip the key argument - + log_info("Relay private key override specified"); } else if (strcmp(argv[i], "--strict-port") == 0) { // Strict port mode option