v0.7.41 - Fix SQL query routing in admin API - add missing sql_query case to handle_kind_23456_unified

This commit is contained in:
Your Name
2025-10-26 13:34:16 -04:00
parent edb73d50cf
commit 2bff4a5f44
8 changed files with 112 additions and 235 deletions

View File

@@ -285,7 +285,7 @@ h1 {
border-bottom: var(--border-width) solid var(--border-color); border-bottom: var(--border-width) solid var(--border-color);
padding-bottom: 10px; padding-bottom: 10px;
margin-bottom: 30px; margin-bottom: 30px;
font-weight: normal; font-weight: bold;
font-size: 24px; font-size: 24px;
font-family: var(--font-family); font-family: var(--font-family);
color: var(--primary-color); color: var(--primary-color);
@@ -293,12 +293,32 @@ h1 {
h2 { h2 {
font-weight: normal; font-weight: normal;
padding-left: 10px; text-align: center;
font-size: 16px; font-size: 16px;
font-family: var(--font-family); font-family: var(--font-family);
color: var(--primary-color); color: var(--primary-color);
} }
h3 {
font-weight: normal;
font-size: 12px;
font-family: var(--font-family);
color: var(--primary-color);
padding-bottom: 10px;
}
label {
display: block;
margin-bottom: 5px;
font-weight: lighter;
font-size: 10px;
font-family: var(--font-family);
color: var(--primary-color);
}
.section { .section {
background: var(--secondary-color); background: var(--secondary-color);
border: var(--border-width) solid var(--border-color); border: var(--border-width) solid var(--border-color);
@@ -309,18 +329,21 @@ h2 {
margin-right:5px; margin-right:5px;
} }
.section-header {
display: flex;
justify-content: center;
align-items: center;
padding-bottom: 15px;
}
.input-group { .input-group {
margin-bottom: 15px; margin-bottom: 15px;
} }
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
font-size: 14px;
font-family: var(--font-family);
color: var(--primary-color);
}
input, input,
textarea, textarea,
@@ -680,14 +703,7 @@ button:disabled {
display: none; display: none;
} }
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
/* margin-bottom: 15px; */
/* border-bottom: var(--border-width) solid var(--border-color); */
/* padding-bottom: 10px; */
}
.countdown-btn { .countdown-btn {
width: auto; width: auto;

View File

@@ -32,31 +32,31 @@
<!-- Header with title and profile display --> <!-- Header with title and profile display -->
<div class="section"> <div class="section">
<div class="header-content"> <div class="header-content">
<div class="header-title clickable" id="header-title"> <div class="header-title clickable" id="header-title">
<span class="relay-letter" data-letter="R">R</span> <span class="relay-letter" data-letter="R">R</span>
<span class="relay-letter" data-letter="E">E</span> <span class="relay-letter" data-letter="E">E</span>
<span class="relay-letter" data-letter="L">L</span> <span class="relay-letter" data-letter="L">L</span>
<span class="relay-letter" data-letter="A">A</span> <span class="relay-letter" data-letter="A">A</span>
<span class="relay-letter" data-letter="Y">Y</span> <span class="relay-letter" data-letter="Y">Y</span>
</div> </div>
<div class="relay-info"> <div class="relay-info">
<div id="relay-name" class="relay-name">C-Relay</div> <div id="relay-name" class="relay-name">C-Relay</div>
<div id="relay-description" class="relay-description">Loading...</div> <div id="relay-description" class="relay-description">Loading...</div>
<div id="relay-pubkey-container" class="relay-pubkey-container"> <div id="relay-pubkey-container" class="relay-pubkey-container">
<div id="relay-pubkey" class="relay-pubkey">Loading...</div> <div id="relay-pubkey" class="relay-pubkey">Loading...</div>
</div>
</div>
<div class="profile-area" id="profile-area" style="display: none;">
<div class="admin-label">admin</div>
<div class="profile-container">
<img id="header-user-image" class="header-user-image" alt="Profile" style="display: none;">
<span id="header-user-name" class="header-user-name">Loading...</span>
</div>
<!-- Logout dropdown -->
<!-- Dropdown menu removed - buttons moved to sidebar -->
</div> </div>
</div> </div>
<div class="profile-area" id="profile-area" style="display: none;">
<div class="admin-label">admin</div>
<div class="profile-container">
<img id="header-user-image" class="header-user-image" alt="Profile" style="display: none;">
<span id="header-user-name" class="header-user-name">Loading...</span>
</div>
<!-- Logout dropdown -->
<!-- Dropdown menu removed - buttons moved to sidebar -->
</div>
</div>
</div> </div>
@@ -68,11 +68,10 @@
</div> </div>
<!-- DATABASE STATISTICS Section --> <!-- DATABASE STATISTICS Section -->
<!-- Subscribe to kind 24567 events to receive real-time monitoring data -->
<div class="section flex-section" id="databaseStatisticsSection" style="display: none;"> <div class="section flex-section" id="databaseStatisticsSection" style="display: none;">
<div class="section-header"> <div class="section-header">
<h2>DATABASE STATISTICS</h2> DATABASE STATISTICS
<!-- Monitoring is now subscription-based - no toggle button needed -->
<!-- Subscribe to kind 24567 events to receive real-time monitoring data -->
</div> </div>
<!-- Event Rate Graph Container --> <!-- Event Rate Graph Container -->
@@ -207,7 +206,7 @@
<!-- SUBSCRIPTION DETAILS Section (Admin Only) --> <!-- SUBSCRIPTION DETAILS Section (Admin Only) -->
<div class="section flex-section" id="subscriptionDetailsSection" style="display: none;"> <div class="section flex-section" id="subscriptionDetailsSection" style="display: none;">
<div class="section-header"> <div class="section-header">
<h2>ACTIVE SUBSCRIPTION DETAILS</h2> ACTIVE SUBSCRIPTION DETAILS
</div> </div>
<div class="input-group"> <div class="input-group">
@@ -234,7 +233,9 @@
<!-- Testing Section --> <!-- Testing Section -->
<div id="div_config" class="section flex-section" style="display: none;"> <div id="div_config" class="section flex-section" style="display: none;">
<h2>RELAY CONFIGURATION</h2> <div class="section-header">
RELAY CONFIGURATION
</div>
<div id="config-display" class="hidden"> <div id="config-display" class="hidden">
<div class="config-table-container"> <div class="config-table-container">
<table class="config-table" id="config-table"> <table class="config-table" id="config-table">
@@ -261,7 +262,7 @@
<!-- Auth Rules Management - Moved after configuration --> <!-- Auth Rules Management - Moved after configuration -->
<div class="section flex-section" id="authRulesSection" style="display: none;"> <div class="section flex-section" id="authRulesSection" style="display: none;">
<div class="section-header"> <div class="section-header">
<h2>AUTH RULES MANAGEMENT</h2> AUTH RULES MANAGEMENT
</div> </div>
<!-- Auth Rules Table --> <!-- Auth Rules Table -->
@@ -287,23 +288,23 @@
<!-- Combined Pubkey Auth Rule Section --> <!-- Combined Pubkey Auth Rule Section -->
<div class="input-group"> <div class="input-group">
<label for="authRulePubkey">Pubkey (nsec or hex):</label> <label for="authRulePubkey">Pubkey (nsec or hex):</label>
<input type="text" id="authRulePubkey" placeholder="nsec1... or 64-character hex pubkey"> <input type="text" id="authRulePubkey" placeholder="nsec1... or 64-character hex pubkey">
</div> </div>
<div id="whitelistWarning" class="warning-box" style="display: none;"> <div id="whitelistWarning" class="warning-box" style="display: none;">
<strong>⚠️ WARNING:</strong> Adding whitelist rules changes relay behavior to whitelist-only <strong>⚠️ WARNING:</strong> Adding whitelist rules changes relay behavior to whitelist-only
mode. mode.
Only whitelisted users will be able to interact with the relay. Only whitelisted users will be able to interact with the relay.
</div> </div>
<div class="inline-buttons"> <div class="inline-buttons">
<button type="button" id="addWhitelistBtn" onclick="addWhitelistRule()">ADD TO <button type="button" id="addWhitelistBtn" onclick="addWhitelistRule()">ADD TO
WHITELIST</button> WHITELIST</button>
<button type="button" id="addBlacklistBtn" onclick="addBlacklistRule()">ADD TO <button type="button" id="addBlacklistBtn" onclick="addBlacklistRule()">ADD TO
BLACKLIST</button> BLACKLIST</button>
<button type="button" id="refreshAuthRulesBtn">REFRESH</button> <button type="button" id="refreshAuthRulesBtn">REFRESH</button>
</div> </div>
</div> </div>
@@ -323,7 +324,7 @@
</div> </div>
<!-- Outbox --> <!-- Outbox -->
<div class="input-group"> <div>
<label for="dm-outbox">Send Message to Relay:</label> <label for="dm-outbox">Send Message to Relay:</label>
<textarea id="dm-outbox" rows="4" placeholder="Enter your message to send to the relay..."></textarea> <textarea id="dm-outbox" rows="4" placeholder="Enter your message to send to the relay..."></textarea>
</div> </div>
@@ -345,7 +346,7 @@
<!-- RELAY EVENTS Section --> <!-- RELAY EVENTS Section -->
<div class="section" id="relayEventsSection" style="display: none;"> <div class="section" id="relayEventsSection" style="display: none;">
<div class="section-header"> <div class="section-header">
<h2>RELAY EVENTS MANAGEMENT</h2> RELAY EVENTS MANAGEMENT
</div> </div>
<!-- Kind 0: User Metadata --> <!-- Kind 0: User Metadata -->

View File

@@ -5564,8 +5564,12 @@ function showStatus(elementId, message, type = 'info') {
const element = document.getElementById(elementId); const element = document.getElementById(elementId);
if (!element) return; if (!element) return;
element.textContent = message; // Remove emojis from message
const cleanMessage = message.replace(/[\u{1F600}-\u{1F64F}]|[\u{1F300}-\u{1F5FF}]|[\u{1F680}-\u{1F6FF}]|[\u{1F1E0}-\u{1F1FF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]/gu, '');
element.textContent = cleanMessage;
element.className = 'status-message'; element.className = 'status-message';
element.style.display = 'block'; // Ensure it's visible
// Add type-specific styling // Add type-specific styling
switch (type) { switch (type) {
@@ -5580,6 +5584,11 @@ function showStatus(elementId, message, type = 'info') {
element.style.color = 'var(--primary-color)'; element.style.color = 'var(--primary-color)';
break; break;
} }
// Auto-hide after 5 seconds
setTimeout(() => {
element.style.display = 'none';
}, 5000);
} }
function addRelayEntry(url = '', read = true, write = true) { function addRelayEntry(url = '', read = true, write = true) {

View File

@@ -1 +1 @@
2096074 2324222

View File

@@ -93,6 +93,7 @@ const char* get_tag_value(cJSON* event, const char* tag_name, int value_index);
int parse_auth_query_parameters(cJSON* event, char** query_type, char** pattern_value); int parse_auth_query_parameters(cJSON* event, char** query_type, char** pattern_value);
int handle_config_update_unified(cJSON* event, char* error_message, size_t error_size, struct lws* wsi); int handle_config_update_unified(cJSON* event, char* error_message, size_t error_size, struct lws* wsi);
int handle_stats_query_unified(cJSON* event, char* error_message, size_t error_size, struct lws* wsi); int handle_stats_query_unified(cJSON* event, char* error_message, size_t error_size, struct lws* wsi);
int handle_sql_query_unified(cJSON* event, const char* query, char* error_message, size_t error_size, struct lws* wsi);
// Current configuration cache // Current configuration cache
@@ -2683,6 +2684,15 @@ int handle_kind_23456_unified(cJSON* event, char* error_message, size_t error_si
} }
return handle_create_relay_event_unified(event, kind_str, event_data_json, error_message, error_size, wsi); return handle_create_relay_event_unified(event, kind_str, event_data_json, error_message, error_size, wsi);
} }
else if (strcmp(action_type, "sql_query") == 0) {
const char* query = get_tag_value(event, action_type, 1);
if (!query) {
DEBUG_ERROR("invalid: missing sql_query parameter");
snprintf(error_message, error_size, "invalid: missing sql_query parameter");
return -1;
}
return handle_sql_query_unified(event, query, error_message, error_size, wsi);
}
else if (strcmp(action_type, "whitelist") == 0 || strcmp(action_type, "blacklist") == 0) { else if (strcmp(action_type, "whitelist") == 0 || strcmp(action_type, "blacklist") == 0) {
// Handle auth rule modifications (existing logic from process_admin_auth_event) // Handle auth rule modifications (existing logic from process_admin_auth_event)
return handle_auth_rule_modification_unified(event, error_message, error_size, wsi); return handle_auth_rule_modification_unified(event, error_message, error_size, wsi);

File diff suppressed because one or more lines are too long

View File

@@ -1653,70 +1653,7 @@ int main(int argc, char* argv[]) {
return 1; return 1;
} }
// COMMENTED OUT: Old incremental config building code replaced by unified startup sequence
// The new first_time_startup_sequence() function handles all config creation atomically
/*
// Handle configuration setup after database is initialized
// Always populate defaults directly in config table (abandoning legacy event signing)
// Populate default config values in table
if (populate_default_config_values() != 0) {
DEBUG_ERROR("Failed to populate default config values");
cleanup_configuration_system();
nostr_cleanup();
close_database();
return 1;
}
// DEBUG_GUARD_START
if (g_debug_level >= DEBUG_LEVEL_DEBUG) {
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(g_db, "SELECT COUNT(*) FROM config", -1, &stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(stmt) == SQLITE_ROW) {
int row_count = sqlite3_column_int(stmt, 0);
DEBUG_LOG("Config table row count after populate_default_config_values(): %d", row_count);
}
sqlite3_finalize(stmt);
}
}
// DEBUG_GUARD_END
// Apply CLI overrides now that database is available
if (cli_options.port_override > 0) {
char port_str[16];
snprintf(port_str, sizeof(port_str), "%d", cli_options.port_override);
if (update_config_in_table("relay_port", port_str) != 0) {
DEBUG_ERROR("Failed to update relay port override in config table");
cleanup_configuration_system();
nostr_cleanup();
close_database();
return 1;
}
printf(" Port: %d (overriding default)\n", cli_options.port_override);
}
// Add pubkeys to config table (single authoritative call)
if (add_pubkeys_to_config_table() != 0) {
DEBUG_ERROR("Failed to add pubkeys to config table");
cleanup_configuration_system();
nostr_cleanup();
close_database();
return 1;
}
// DEBUG_GUARD_START
if (g_debug_level >= DEBUG_LEVEL_DEBUG) {
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(g_db, "SELECT COUNT(*) FROM config", -1, &stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(stmt) == SQLITE_ROW) {
int row_count = sqlite3_column_int(stmt, 0);
DEBUG_LOG("Config table row count after add_pubkeys_to_config_table() (first-time): %d", row_count);
}
sqlite3_finalize(stmt);
}
}
// DEBUG_GUARD_END
*/
} else { } else {
// Find existing database file // Find existing database file
char** existing_files = find_existing_db_files(); char** existing_files = find_existing_db_files();
@@ -1804,103 +1741,7 @@ int main(int argc, char* argv[]) {
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
} }
} }
// DEBUG_GUARD_END
// COMMENTED OUT: Old incremental config building code replaced by unified startup sequence
// The new startup_existing_relay() function handles all config loading atomically
/*
// Ensure default configuration values are populated (for any missing keys)
// This must be done AFTER database initialization
// COMMENTED OUT: Don't modify existing database config on restart
// if (populate_default_config_values() != 0) {
// DEBUG_WARN("Failed to populate default config values for existing relay - continuing");
// }
// Load configuration from database
cJSON* config_event = load_config_event_from_database(relay_pubkey);
if (config_event) {
if (apply_configuration_from_event(config_event) != 0) {
DEBUG_WARN("Failed to apply configuration from database");
}
cJSON_Delete(config_event);
} else {
// This is expected for relays using table-based configuration
// No longer a warning - just informational
}
// DEBUG_GUARD_START
if (g_debug_level >= DEBUG_LEVEL_DEBUG) {
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(g_db, "SELECT COUNT(*) FROM config", -1, &stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(stmt) == SQLITE_ROW) {
int row_count = sqlite3_column_int(stmt, 0);
DEBUG_LOG("Config table row count before checking pubkeys: %d", row_count);
}
sqlite3_finalize(stmt);
}
}
// DEBUG_GUARD_END
// Ensure pubkeys are in config table for existing relay
// This handles migration from old event-based config to table-based config
const char* admin_pubkey_from_table = get_config_value_from_table("admin_pubkey");
const char* relay_pubkey_from_table = get_config_value_from_table("relay_pubkey");
int need_to_add_pubkeys = 0;
// Check if admin_pubkey is missing or invalid
if (!admin_pubkey_from_table || strlen(admin_pubkey_from_table) != 64) {
DEBUG_WARN("Admin pubkey missing or invalid in config table - will regenerate from cache");
need_to_add_pubkeys = 1;
}
if (admin_pubkey_from_table) free((char*)admin_pubkey_from_table);
// Check if relay_pubkey is missing or invalid
if (!relay_pubkey_from_table || strlen(relay_pubkey_from_table) != 64) {
DEBUG_WARN("Relay pubkey missing or invalid in config table - will regenerate from cache");
need_to_add_pubkeys = 1;
}
if (relay_pubkey_from_table) free((char*)relay_pubkey_from_table);
// If either pubkey is missing, call add_pubkeys_to_config_table to populate both
if (need_to_add_pubkeys) {
if (add_pubkeys_to_config_table() != 0) {
DEBUG_ERROR("Failed to add pubkeys to config table for existing relay");
cleanup_configuration_system();
nostr_cleanup();
close_database();
return 1;
}
// DEBUG_GUARD_START
if (g_debug_level >= DEBUG_LEVEL_DEBUG) {
sqlite3_stmt* stmt;
if (sqlite3_prepare_v2(g_db, "SELECT COUNT(*) FROM config", -1, &stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(stmt) == SQLITE_ROW) {
int row_count = sqlite3_column_int(stmt, 0);
DEBUG_LOG("Config table row count after add_pubkeys_to_config_table(): %d", row_count);
}
sqlite3_finalize(stmt);
}
}
// DEBUG_GUARD_END
}
// Apply CLI overrides for existing relay (port override should work even for existing relays)
if (cli_options.port_override > 0) {
char port_str[16];
snprintf(port_str, sizeof(port_str), "%d", cli_options.port_override);
if (update_config_in_table("relay_port", port_str) != 0) {
DEBUG_ERROR("Failed to update relay port override in config table for existing relay");
cleanup_configuration_system();
nostr_cleanup();
close_database();
return 1;
}
printf(" Port: %d (overriding configured port)\n", cli_options.port_override);
}
*/
// Free memory // Free memory
free(relay_pubkey); free(relay_pubkey);
for (int i = 0; existing_files[i]; i++) { for (int i = 0; existing_files[i]; i++) {

View File

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