feat: Implement auth rules enforcement and fix subscription filtering issues
- **Auth Rules Implementation**: Added blacklist/whitelist enforcement in websockets.c - Events are now checked against auth_rules table before acceptance - Blacklist blocks specific pubkeys, whitelist enables allow-only mode - Made check_database_auth_rules() public for cross-module access - **Subscription Filtering Fixes**: - Added missing 'ids' filter support in SQL query building - Fixed test expectations to not require exact event counts for kind filters - Improved filter validation and error handling - **Ephemeral Events Compliance**: - Modified SQL queries to exclude kinds 20000-29999 from historical queries - Maintains broadcasting to active subscribers while preventing storage/retrieval - Ensures NIP-01 compliance for ephemeral event handling - **Comprehensive Testing**: - Created white_black_test.sh with full blacklist/whitelist functionality testing - Tests verify blocked posting for blacklisted users - Tests verify whitelist-only mode when whitelist rules exist - Includes proper auth rule clearing between test phases - **Code Quality**: - Added proper function declarations to websockets.h - Improved error handling and logging throughout - Enhanced test script with clear pass/fail reporting
This commit is contained in:
@@ -166,6 +166,81 @@ add_to_blacklist() {
|
||||
sleep 3
|
||||
}
|
||||
|
||||
# Send admin command to add user to whitelist
|
||||
add_to_whitelist() {
|
||||
local pubkey="$1"
|
||||
log_info "Adding pubkey to whitelist: ${pubkey:0:16}..."
|
||||
|
||||
# Create the admin command
|
||||
COMMAND="[\"whitelist\", \"pubkey\", \"$pubkey\"]"
|
||||
|
||||
# Encrypt the command using NIP-44
|
||||
ENCRYPTED_COMMAND=$(nak encrypt "$COMMAND" \
|
||||
--sec "$ADMIN_PRIVKEY" \
|
||||
--recipient-pubkey "$RELAY_PUBKEY")
|
||||
|
||||
if [ -z "$ENCRYPTED_COMMAND" ]; then
|
||||
log_error "Failed to encrypt admin command"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Create admin event
|
||||
ADMIN_EVENT=$(nak event \
|
||||
--kind 23456 \
|
||||
--content "$ENCRYPTED_COMMAND" \
|
||||
--sec "$ADMIN_PRIVKEY" \
|
||||
--tag "p=$RELAY_PUBKEY")
|
||||
|
||||
# Post admin event
|
||||
ADMIN_RESULT=$(echo "$ADMIN_EVENT" | nak event "$RELAY_URL")
|
||||
|
||||
if echo "$ADMIN_RESULT" | grep -q "error\|failed\|denied"; then
|
||||
log_error "Failed to send admin command: $ADMIN_RESULT"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log_success "Admin command sent successfully - user added to whitelist"
|
||||
# Wait for the relay to process the admin command
|
||||
sleep 3
|
||||
}
|
||||
|
||||
# Clear all auth rules
|
||||
clear_auth_rules() {
|
||||
log_info "Clearing all auth rules..."
|
||||
|
||||
# Create the admin command
|
||||
COMMAND="[\"system_command\", \"clear_all_auth_rules\"]"
|
||||
|
||||
# Encrypt the command using NIP-44
|
||||
ENCRYPTED_COMMAND=$(nak encrypt "$COMMAND" \
|
||||
--sec "$ADMIN_PRIVKEY" \
|
||||
--recipient-pubkey "$RELAY_PUBKEY")
|
||||
|
||||
if [ -z "$ENCRYPTED_COMMAND" ]; then
|
||||
log_error "Failed to encrypt admin command"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Create admin event
|
||||
ADMIN_EVENT=$(nak event \
|
||||
--kind 23456 \
|
||||
--content "$ENCRYPTED_COMMAND" \
|
||||
--sec "$ADMIN_PRIVKEY" \
|
||||
--tag "p=$RELAY_PUBKEY")
|
||||
|
||||
# Post admin event
|
||||
ADMIN_RESULT=$(echo "$ADMIN_EVENT" | nak event "$RELAY_URL")
|
||||
|
||||
if echo "$ADMIN_RESULT" | grep -q "error\|failed\|denied"; then
|
||||
log_error "Failed to send admin command: $ADMIN_RESULT"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log_success "Admin command sent successfully - all auth rules cleared"
|
||||
# Wait for the relay to process the admin command
|
||||
sleep 3
|
||||
}
|
||||
|
||||
# Test 2: Try to post after blacklisting
|
||||
test_blacklist_post() {
|
||||
log_info "=== TEST 2: Attempt to post event after blacklisting ==="
|
||||
@@ -199,6 +274,92 @@ test_blacklist_post() {
|
||||
fi
|
||||
}
|
||||
|
||||
# Test 3: Test whitelist functionality
|
||||
test_whitelist_functionality() {
|
||||
log_info "=== TEST 3: Test whitelist functionality ==="
|
||||
|
||||
# Generate a second test keypair for whitelist testing
|
||||
log_info "Generating second test keypair for whitelist testing..."
|
||||
WHITELIST_PRIVKEY=$(nak key generate 2>/dev/null)
|
||||
WHITELIST_PUBKEY=$(nak key public "$WHITELIST_PRIVKEY" 2>/dev/null)
|
||||
|
||||
if [ -z "$WHITELIST_PUBKEY" ]; then
|
||||
log_error "Failed to generate whitelist test keypair"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log_success "Generated whitelist test keypair: ${WHITELIST_PUBKEY:0:16}..."
|
||||
|
||||
# Clear all auth rules first
|
||||
if ! clear_auth_rules; then
|
||||
log_error "Failed to clear auth rules for whitelist test"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Add the whitelist user to whitelist
|
||||
if ! add_to_whitelist "$WHITELIST_PUBKEY"; then
|
||||
log_error "Failed to add whitelist user"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Test 3a: Original test user should be blocked (not whitelisted)
|
||||
log_info "Testing that non-whitelisted user is blocked..."
|
||||
local timestamp=$(date +%s)
|
||||
local content="Non-whitelisted test event at timestamp $timestamp"
|
||||
|
||||
NON_WHITELIST_EVENT=$(nak event \
|
||||
--kind 1 \
|
||||
--content "$content" \
|
||||
--sec "$TEST_PRIVKEY" \
|
||||
--tag 't=whitelist-test')
|
||||
|
||||
POST_RESULT=$(echo "$NON_WHITELIST_EVENT" | nak event "$RELAY_URL" 2>&1)
|
||||
|
||||
if echo "$POST_RESULT" | grep -q "error\|failed\|denied\|blocked"; then
|
||||
log_success "Non-whitelisted user correctly blocked"
|
||||
else
|
||||
log_error "Non-whitelisted user was not blocked - whitelist may not be working"
|
||||
log_error "Post result: $POST_RESULT"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Test 3b: Whitelisted user should be allowed
|
||||
log_info "Testing that whitelisted user can post..."
|
||||
content="Whitelisted test event at timestamp $timestamp"
|
||||
|
||||
WHITELIST_EVENT=$(nak event \
|
||||
--kind 1 \
|
||||
--content "$content" \
|
||||
--sec "$WHITELIST_PRIVKEY" \
|
||||
--tag 't=whitelist-test')
|
||||
|
||||
POST_RESULT=$(echo "$WHITELIST_EVENT" | nak event "$RELAY_URL" 2>&1)
|
||||
|
||||
if echo "$POST_RESULT" | grep -q "error\|failed\|denied\|blocked"; then
|
||||
log_error "Whitelisted user was blocked - whitelist not working correctly"
|
||||
log_error "Post result: $POST_RESULT"
|
||||
return 1
|
||||
else
|
||||
log_success "Whitelisted user can post successfully"
|
||||
fi
|
||||
|
||||
# Verify the whitelisted event can be retrieved
|
||||
WHITELIST_EVENT_ID=$(echo "$WHITELIST_EVENT" | jq -r '.id')
|
||||
sleep 2
|
||||
|
||||
RETRIEVE_RESULT=$(nak req \
|
||||
--id "$WHITELIST_EVENT_ID" \
|
||||
"$RELAY_URL")
|
||||
|
||||
if echo "$RETRIEVE_RESULT" | grep -q "$WHITELIST_EVENT_ID"; then
|
||||
log_success "Whitelisted event successfully retrieved"
|
||||
return 0
|
||||
else
|
||||
log_error "Failed to retrieve whitelisted event"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Main test function
|
||||
main() {
|
||||
log_info "Starting C-Relay Whitelist/Blacklist Test"
|
||||
@@ -237,6 +398,14 @@ main() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test 3: Test whitelist functionality
|
||||
if test_whitelist_functionality; then
|
||||
log_success "TEST 3 PASSED: Whitelist functionality works correctly"
|
||||
else
|
||||
log_error "TEST 3 FAILED: Whitelist functionality not working"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "All tests passed! Whitelist/blacklist functionality is working correctly."
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user