v0.7.43 - Add plain text 'status' command handler for NIP-17 DMs

This commit is contained in:
Your Name
2025-10-27 13:19:10 -04:00
parent 5242f066e7
commit edbc4f1359
12 changed files with 1150 additions and 8 deletions

View File

@@ -1314,6 +1314,9 @@ int send_nip17_response(const char* sender_pubkey, const char* response_content,
return -1;
}
// Get timestamp delay configuration
long max_delay_sec = get_config_int("nip59_timestamp_max_delay_sec", 0);
// Create and sign gift wrap using library function
cJSON* gift_wraps[1];
int send_result = nostr_nip17_send_dm(
@@ -1322,7 +1325,8 @@ int send_nip17_response(const char* sender_pubkey, const char* response_content,
1, // num_recipients
relay_privkey, // sender_private_key
gift_wraps, // gift_wraps_out
1 // max_gift_wraps
1, // max_gift_wraps
max_delay_sec // max_delay_sec
);
cJSON_Delete(dm_response);

View File

@@ -1144,6 +1144,20 @@ static int validate_config_field(const char* key, const char* value, char* error
}
return 0;
}
// NIP-59 Gift Wrap Timestamp Configuration
if (strcmp(key, "nip59_timestamp_max_delay_sec") == 0) {
if (!is_valid_non_negative_integer(value)) {
snprintf(error_msg, error_size, "invalid nip59_timestamp_max_delay_sec '%s' (must be non-negative integer)", value);
return -1;
}
long val = strtol(value, NULL, 10);
if (val > 604800) { // Max 7 days
snprintf(error_msg, error_size, "nip59_timestamp_max_delay_sec '%s' too large (max 604800 seconds = 7 days)", value);
return -1;
}
return 0;
}
if (strcmp(key, "nip42_auth_required_kinds") == 0) {
// Validate comma-separated list of kind numbers
@@ -2538,7 +2552,7 @@ int handle_kind_23456_unified(cJSON* event, char* error_message, size_t error_si
}
// Perform NIP-44 decryption (relay as recipient, admin as sender)
char decrypted_text[4096]; // Buffer for decrypted content
char decrypted_text[16384]; // Buffer for decrypted content (16KB)
int decrypt_result = nostr_nip44_decrypt(relay_privkey_bytes, sender_pubkey_bytes, content, decrypted_text, sizeof(decrypted_text));
// Clean up private key immediately after use

View File

@@ -78,7 +78,10 @@ static const struct {
// Trust proxy headers (X-Forwarded-For, X-Real-IP) for accurate client IP detection
// Safe for informational/debugging use. Only becomes a security concern if you implement
// IP-based rate limiting or access control (which would require firewall protection anyway)
{"trust_proxy_headers", "true"}
{"trust_proxy_headers", "true"},
// NIP-59 Gift Wrap Timestamp Configuration
{"nip59_timestamp_max_delay_sec", "0"}
};
// Number of default configuration values

Binary file not shown.

View File

@@ -368,13 +368,17 @@ cJSON* process_nip17_admin_message(cJSON* gift_wrap_event, char* error_message,
if (success_dm) {
cJSON* success_gift_wraps[1];
// Get timestamp delay configuration
long max_delay_sec = get_config_int("nip59_timestamp_max_delay_sec", 0);
int send_result = nostr_nip17_send_dm(
success_dm, // dm_event
(const char**)&sender_pubkey, // recipient_pubkeys
1, // num_recipients
relay_privkey, // sender_private_key
success_gift_wraps, // gift_wraps_out
1 // max_gift_wraps
1, // max_gift_wraps
max_delay_sec // max_delay_sec
);
cJSON_Delete(success_dm);
@@ -565,6 +569,35 @@ int process_nip17_admin_command(cJSON* dm_event, char* error_message, size_t err
DEBUG_INFO("DM_ADMIN: Config command processed successfully");
return 0;
}
// Check for status commands
else if (strstr(content_lower, "status") != NULL) {
DEBUG_INFO("DM_ADMIN: Processing status command");
// Create synthetic event for system_command handler
cJSON* synthetic_event = cJSON_CreateObject();
cJSON_AddNumberToObject(synthetic_event, "kind", 23456);
cJSON_AddStringToObject(synthetic_event, "pubkey", sender_pubkey);
// Create tags array with system_command
cJSON* tags = cJSON_CreateArray();
cJSON* cmd_tag = cJSON_CreateArray();
cJSON_AddItemToArray(cmd_tag, cJSON_CreateString("system_command"));
cJSON_AddItemToArray(cmd_tag, cJSON_CreateString("system_status"));
cJSON_AddItemToArray(tags, cmd_tag);
cJSON_AddItemToObject(synthetic_event, "tags", tags);
char error_msg[256];
int result = handle_system_command_unified(synthetic_event, "system_status", error_msg, sizeof(error_msg), wsi);
cJSON_Delete(synthetic_event);
if (result != 0) {
DEBUG_ERROR(error_msg);
return -1;
}
DEBUG_INFO("DM_ADMIN: Status command processed successfully");
return 0;
}
else {
DEBUG_INFO("DM_ADMIN: Checking for confirmation or config change requests");
// Check if it's a confirmation response (yes/no)

View File

@@ -10,10 +10,10 @@
#define MAIN_H
// Version information (auto-updated by build system)
#define VERSION "v0.7.42"
#define VERSION "v0.7.43"
#define VERSION_MAJOR 0
#define VERSION_MINOR 7
#define VERSION_PATCH 42
#define VERSION_PATCH 43
// Relay metadata (authoritative source for NIP-11 information)
#define RELAY_NAME "C-Relay"

View File

@@ -1512,7 +1512,7 @@ int process_dm_stats_command(cJSON* dm_event, char* error_message, size_t error_
const char* encrypted_content = cJSON_GetStringValue(content_obj);
// Decrypt content
char decrypted_content[4096];
char decrypted_content[16384];
int decrypt_result = nostr_nip44_decrypt(relay_privkey, sender_pubkey_bytes,
encrypted_content, decrypted_content, sizeof(decrypted_content));