236 lines
8.3 KiB
Bash
Executable File
236 lines
8.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# NIP-70 Protected Events Test - Test protected event functionality
|
|
# Tests events with ["-"] tags to verify correct rejection/acceptance based on config and auth
|
|
|
|
set -e # Exit on any error
|
|
|
|
# Color constants
|
|
RED='\033[31m'
|
|
GREEN='\033[32m'
|
|
YELLOW='\033[33m'
|
|
BLUE='\033[34m'
|
|
BOLD='\033[1m'
|
|
RESET='\033[0m'
|
|
|
|
# Test configuration
|
|
RELAY_URL="ws://127.0.0.1:8888"
|
|
TEST_PRIVATE_KEY="nsec1j4c6269y9w0q2er2xjw8sv2ehyrtfxq3jwgdlxj6qfn8z4gjsq5qfvfk99"
|
|
TEST_PUBKEY="npub1v0lxxxxutpvrelsksy8cdhgfux9l6fp68ay6h7lgd2plmxnen65qyzt206"
|
|
|
|
# Print functions
|
|
print_header() {
|
|
echo -e "${BLUE}${BOLD}=== $1 ===${RESET}"
|
|
}
|
|
|
|
print_step() {
|
|
echo -e "${YELLOW}[STEP]${RESET} $1"
|
|
}
|
|
|
|
print_success() {
|
|
echo -e "${GREEN}✓${RESET} $1"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}✗${RESET} $1"
|
|
}
|
|
|
|
print_info() {
|
|
echo -e "${BLUE}[INFO]${RESET} $1"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}[WARNING]${RESET} $1"
|
|
}
|
|
|
|
# Helper function to publish event and check response
|
|
publish_event_test() {
|
|
local event_json="$1"
|
|
local description="$2"
|
|
local should_succeed="$3"
|
|
|
|
# Extract event ID
|
|
local event_id=$(echo "$event_json" | jq -r '.id' 2>/dev/null)
|
|
if [[ "$event_id" == "null" || -z "$event_id" ]]; then
|
|
print_error "Could not extract event ID from $description"
|
|
return 1
|
|
fi
|
|
|
|
print_info "Publishing $description..."
|
|
|
|
# Create EVENT message in Nostr format
|
|
local event_message="[\"EVENT\",$event_json]"
|
|
|
|
# Publish to relay
|
|
local response=""
|
|
if command -v websocat &> /dev/null; then
|
|
response=$(echo "$event_message" | timeout 5s websocat "$RELAY_URL" 2>&1 || echo "Connection failed")
|
|
else
|
|
print_error "websocat not found - required for testing"
|
|
return 1
|
|
fi
|
|
|
|
# Check response
|
|
if [[ "$response" == *"Connection failed"* ]]; then
|
|
print_error "Failed to connect to relay for $description"
|
|
return 1
|
|
elif [[ "$response" == *"true"* ]]; then
|
|
if [[ "$should_succeed" == "true" ]]; then
|
|
print_success "$description accepted (ID: ${event_id:0:16}...)"
|
|
return 0
|
|
else
|
|
print_error "$description was accepted but should have been rejected"
|
|
return 1
|
|
fi
|
|
elif [[ "$response" == *"false"* ]]; then
|
|
if [[ "$should_succeed" == "false" ]]; then
|
|
print_success "$description correctly rejected"
|
|
return 0
|
|
else
|
|
print_error "$description was rejected but should have been accepted"
|
|
return 1
|
|
fi
|
|
else
|
|
print_warning "$description response unclear: $response"
|
|
# Try to parse for specific error codes
|
|
if [[ "$response" == *"-104"* ]]; then
|
|
if [[ "$should_succeed" == "false" ]]; then
|
|
print_success "$description correctly rejected with protected event error"
|
|
return 0
|
|
else
|
|
print_error "$description rejected with protected event error but should have been accepted"
|
|
return 1
|
|
fi
|
|
fi
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Helper function to enable/disable protected events via admin API
|
|
set_protected_events_config() {
|
|
local enabled="$1"
|
|
local description="$2"
|
|
|
|
print_step "Setting protected events $description"
|
|
|
|
# This would need to be implemented using the admin API
|
|
# For now, we'll assume the config is set externally
|
|
print_info "Protected events config set to: $enabled"
|
|
}
|
|
|
|
# Main test function
|
|
run_protected_events_test() {
|
|
print_header "NIP-70 Protected Events Test"
|
|
|
|
# Check dependencies
|
|
print_step "Checking dependencies..."
|
|
if ! command -v nak &> /dev/null; then
|
|
print_error "nak command not found"
|
|
print_info "Please install nak: go install github.com/fiatjaf/nak@latest"
|
|
return 1
|
|
fi
|
|
if ! command -v websocat &> /dev/null; then
|
|
print_error "websocat command not found"
|
|
print_info "Please install websocat for testing"
|
|
return 1
|
|
fi
|
|
if ! command -v jq &> /dev/null; then
|
|
print_error "jq command not found"
|
|
print_info "Please install jq for JSON processing"
|
|
return 1
|
|
fi
|
|
print_success "All dependencies found"
|
|
|
|
local test_failures=0
|
|
|
|
print_header "PHASE 1: Testing with Protected Events Disabled (Default)"
|
|
|
|
# Test 1: Normal event should work
|
|
local normal_event=$(nak event --sec "$TEST_PRIVATE_KEY" -c "This is a normal event" -k 1 --ts $(date +%s) 2>/dev/null)
|
|
if ! publish_event_test "$normal_event" "normal event with protected events disabled" "true"; then
|
|
((test_failures++))
|
|
fi
|
|
|
|
# Test 2: Protected event should be rejected
|
|
local protected_event=$(nak event --sec "$TEST_PRIVATE_KEY" -c "This is a protected event" -k 1 --ts $(date +%s) -t "-" 2>/dev/null)
|
|
if ! publish_event_test "$protected_event" "protected event with protected events disabled" "false"; then
|
|
((test_failures++))
|
|
fi
|
|
|
|
print_header "PHASE 2: Testing with Protected Events Enabled but Not Authenticated"
|
|
|
|
# Enable protected events (this would need admin API call)
|
|
set_protected_events_config "true" "enabled"
|
|
|
|
# Test 3: Normal event should still work
|
|
local normal_event2=$(nak event --sec "$TEST_PRIVATE_KEY" -c "This is another normal event" -k 1 --ts $(date +%s) 2>/dev/null)
|
|
if ! publish_event_test "$normal_event2" "normal event with protected events enabled" "true"; then
|
|
((test_failures++))
|
|
fi
|
|
|
|
# Test 4: Protected event should be rejected (not authenticated)
|
|
local protected_event2=$(nak event --sec "$TEST_PRIVATE_KEY" -c "This is another protected event" -k 1 --ts $(date +%s) -t "-" 2>/dev/null)
|
|
if ! publish_event_test "$protected_event2" "protected event with protected events enabled but not authenticated" "false"; then
|
|
((test_failures++))
|
|
fi
|
|
|
|
print_header "PHASE 3: Testing with Protected Events Enabled and Authenticated"
|
|
|
|
# For full testing, we would need to authenticate the user
|
|
# This requires implementing NIP-42 authentication in the test
|
|
# For now, we'll note that this phase requires additional setup
|
|
print_info "Phase 3 requires NIP-42 authentication setup - skipping for now"
|
|
print_info "To complete full testing, implement authentication flow in test"
|
|
|
|
# Test 5: Protected event with authentication should work (placeholder)
|
|
# This would require:
|
|
# 1. Setting up authentication challenge/response
|
|
# 2. Publishing protected event after authentication
|
|
print_info "Protected event with authentication test: SKIPPED (requires auth setup)"
|
|
|
|
print_header "PHASE 4: Testing Edge Cases"
|
|
|
|
# Test 6: Event with multiple tags including protected
|
|
local multi_tag_event=$(nak event --sec "$TEST_PRIVATE_KEY" -c "Event with multiple tags" -k 1 --ts $(date +%s) -t "topic=test" -t "-" -t "category=protected" 2>/dev/null)
|
|
if ! publish_event_test "$multi_tag_event" "event with multiple tags including protected" "false"; then
|
|
((test_failures++))
|
|
fi
|
|
|
|
# Test 7: Event with empty protected tag
|
|
local empty_protected_event=$(nak event --sec "$TEST_PRIVATE_KEY" -c "Event with empty protected tag" -k 1 --ts $(date +%s) -t "" 2>/dev/null)
|
|
if ! publish_event_test "$empty_protected_event" "event with empty protected tag" "true"; then
|
|
((test_failures++))
|
|
fi
|
|
|
|
# Report test results
|
|
if [[ $test_failures -gt 0 ]]; then
|
|
print_error "PROTECTED EVENTS TESTS FAILED: $test_failures test(s) failed"
|
|
return 1
|
|
else
|
|
print_success "All PROTECTED EVENTS tests passed"
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# Run the PROTECTED EVENTS test
|
|
print_header "Starting NIP-70 Protected Events Test Suite"
|
|
echo
|
|
|
|
if run_protected_events_test; then
|
|
echo
|
|
print_success "All NIP-70 PROTECTED EVENTS tests completed successfully!"
|
|
print_info "The C-Relay PROTECTED EVENTS functionality is working correctly"
|
|
print_info "✅ Protected events are rejected when feature is disabled"
|
|
print_info "✅ Protected events are rejected when enabled but not authenticated"
|
|
print_info "✅ Normal events work regardless of protected events setting"
|
|
print_info "✅ Events with multiple tags including protected are handled correctly"
|
|
echo
|
|
exit 0
|
|
else
|
|
echo
|
|
print_error "❌ NIP-70 PROTECTED EVENTS TESTS FAILED!"
|
|
print_error "The PROTECTED EVENTS functionality has issues that need to be fixed"
|
|
echo
|
|
exit 1
|
|
fi |