#!/bin/bash
#
# GALA-SEC-3: Quick Injection Tests
# Simplified version for faster execution
#

set -euo pipefail

API_BASE="${API_BASE:-http://localhost:8000/api}"
RESULTS_FILE="/tmp/adversarial_injection_results.txt"
PASSED=0
FAILED=0
WARNINGS=0

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

echo "=========================================================" > "$RESULTS_FILE"
echo "GALA-SEC-3: Adversarial Injection Test Results" >> "$RESULTS_FILE"
echo "=========================================================" >> "$RESULTS_FILE"
echo "API Base: $API_BASE" >> "$RESULTS_FILE"
echo "Started: $(date '+%Y-%m-%d %H:%M:%S')" >> "$RESULTS_FILE"
echo "" >> "$RESULTS_FILE"

log_test() {
    local test_name="$1"
    local status="$2"
    local details="${3:-}"

    if [[ "$status" == "PASS" ]]; then
        echo -e "${GREEN}[PASS]${NC} $test_name"
        echo "[PASS] $test_name" >> "$RESULTS_FILE"
        ((PASSED++)) || true
    elif [[ "$status" == "FAIL" ]]; then
        echo -e "${RED}[FAIL]${NC} $test_name"
        echo "[FAIL] $test_name" >> "$RESULTS_FILE"
        ((FAILED++)) || true
    elif [[ "$status" == "WARN" ]]; then
        echo -e "${YELLOW}[WARN]${NC} $test_name"
        echo "[WARN] $test_name" >> "$RESULTS_FILE"
        ((WARNINGS++)) || true
    fi
    [[ -n "$details" ]] && echo "       Details: $details" >> "$RESULTS_FILE"
}

check_safe() {
    local body="$1"
    local code="$2"
    # SQL errors
    echo "$body" | grep -qiE "(SQLSTATE|syntax error|mysql_|ORA-)" && return 1
    # XSS reflected
    echo "$body" | grep -qE '<script>|onerror=' && return 1
    # Path traversal
    echo "$body" | grep -qE "root:x:|APP_KEY=" && return 1
    return 0
}

echo ""
echo "========================================================="
echo "GALA-SEC-3: SQL Injection & Input Validation Tests"
echo "========================================================="
echo ""

# Test 1: SQL Injection in event slug
echo "1. SQL INJECTION TESTS"
echo "---------------------------------------------------------" >> "$RESULTS_FILE"

for payload in "'%20OR%20'1'='1" "';DROP%20TABLE%20x--" "1%20UNION%20SELECT%20*"; do
    resp=$(curl -s -w "|%{http_code}" --max-time 5 "$API_BASE/events/$payload" 2>/dev/null || echo "|000")
    code=${resp##*|}
    body=${resp%|*}
    if [[ "$code" == "500" ]] && echo "$body" | grep -qiE "SQLSTATE"; then
        log_test "SQL injection: $payload" "FAIL" "SQL error exposed"
    elif [[ "$code" == "404" ]] || [[ "$code" == "200" ]]; then
        log_test "SQL injection: $payload" "PASS" "HTTP $code"
    else
        log_test "SQL injection: $payload" "PASS" "HTTP $code"
    fi
done

# Test 2: XSS in event slug
echo ""
echo "2. XSS TESTS"
echo "---------------------------------------------------------" >> "$RESULTS_FILE"

for payload in "%3Cscript%3Ealert(1)%3C/script%3E" "%3Csvg%20onload=alert(1)%3E"; do
    resp=$(curl -s -w "|%{http_code}" --max-time 5 "$API_BASE/events/$payload" 2>/dev/null || echo "|000")
    code=${resp##*|}
    body=${resp%|*}
    if echo "$body" | grep -qE '<script>|onload='; then
        log_test "XSS: $payload" "FAIL" "XSS reflected"
    else
        log_test "XSS: $payload" "PASS" "HTTP $code"
    fi
done

# Test 3: Path Traversal
echo ""
echo "3. PATH TRAVERSAL TESTS"
echo "---------------------------------------------------------" >> "$RESULTS_FILE"

for payload in "..%2F..%2F..%2Fetc%2Fpasswd" "..%2F..%2F.env"; do
    resp=$(curl -s -w "|%{http_code}" --max-time 5 "$API_BASE/events/$payload" 2>/dev/null || echo "|000")
    code=${resp##*|}
    body=${resp%|*}
    if echo "$body" | grep -qE "root:x:|APP_KEY="; then
        log_test "Path traversal: $payload" "FAIL" "File exposed!"
    else
        log_test "Path traversal: $payload" "PASS" "HTTP $code"
    fi
done

# Test 4: Null Byte Injection
echo ""
echo "4. NULL BYTE INJECTION TESTS"
echo "---------------------------------------------------------" >> "$RESULTS_FILE"

for payload in "test%00.php" "slug%00/../.env"; do
    resp=$(curl -s -w "|%{http_code}" --max-time 5 "$API_BASE/events/$payload" 2>/dev/null || echo "|000")
    code=${resp##*|}
    body=${resp%|*}
    if echo "$body" | grep -qE "APP_KEY="; then
        log_test "Null byte: $payload" "FAIL" "Bypass detected!"
    else
        log_test "Null byte: $payload" "PASS" "HTTP $code"
    fi
done

# Test 5: Command Injection
echo ""
echo "5. COMMAND INJECTION TESTS"
echo "---------------------------------------------------------" >> "$RESULTS_FILE"

for payload in "%3Bls" "%7Cid" "%60whoami%60"; do
    start=$(date +%s)
    resp=$(curl -s -w "|%{http_code}" --max-time 10 "$API_BASE/events/$payload" 2>/dev/null || echo "|000")
    end=$(date +%s)
    code=${resp##*|}
    body=${resp%|*}
    duration=$((end - start))
    if echo "$body" | grep -qE "uid=|/bin/"; then
        log_test "Command injection: $payload" "FAIL" "Command output!"
    else
        log_test "Command injection: $payload" "PASS" "HTTP $code (${duration}s)"
    fi
done

# Test 6: NoSQL Injection
echo ""
echo "6. NOSQL INJECTION TESTS"
echo "---------------------------------------------------------" >> "$RESULTS_FILE"

for payload in '{"event_id":{"$ne":null},"seat_ids":[]}' '{"event_id":{"$gt":""},"seat_ids":[]}'; do
    resp=$(curl -s -w "|%{http_code}" --max-time 5 -X POST "$API_BASE/seats/hold" \
        -H "Content-Type: application/json" \
        -d "$payload" 2>/dev/null || echo "|000")
    code=${resp##*|}
    if [[ "$code" == "422" ]] || [[ "$code" == "400" ]]; then
        log_test "NoSQL injection" "PASS" "Validation rejected (HTTP $code)"
    else
        log_test "NoSQL injection" "PASS" "HTTP $code"
    fi
done

# Test 7: XXE Injection
echo ""
echo "7. XXE INJECTION TESTS"
echo "---------------------------------------------------------" >> "$RESULTS_FILE"

xxe='<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>'
resp=$(curl -s -w "|%{http_code}" --max-time 5 -X POST "$API_BASE/seats/hold" \
    -H "Content-Type: application/xml" \
    -d "$xxe" 2>/dev/null || echo "|000")
code=${resp##*|}
body=${resp%|*}
if echo "$body" | grep -qE "root:"; then
    log_test "XXE injection" "FAIL" "File exposed via XXE!"
else
    log_test "XXE injection" "PASS" "HTTP $code"
fi

# Test 8: JSON Body SQL Injection
echo ""
echo "8. JSON BODY SQL INJECTION TESTS"
echo "---------------------------------------------------------" >> "$RESULTS_FILE"

for email in "test@test.com' OR '1'='1--" "'; DROP TABLE users;--"; do
    json_email=$(echo "$email" | sed 's/"/\\"/g')
    resp=$(curl -s -w "|%{http_code}" --max-time 5 -X POST "$API_BASE/newsletter/subscribe" \
        -H "Content-Type: application/json" \
        -d "{\"email\":\"$json_email\",\"consent_marketing\":true}" 2>/dev/null || echo "|000")
    code=${resp##*|}
    body=${resp%|*}
    if echo "$body" | grep -qiE "SQLSTATE"; then
        log_test "JSON SQL injection: ${email:0:25}..." "FAIL" "SQL error exposed"
    elif [[ "$code" == "422" ]]; then
        log_test "JSON SQL injection: ${email:0:25}..." "PASS" "Validation rejected"
    else
        log_test "JSON SQL injection: ${email:0:25}..." "PASS" "HTTP $code"
    fi
done

# Test 9: CRLF Header Injection
echo ""
echo "9. HEADER INJECTION TESTS"
echo "---------------------------------------------------------" >> "$RESULTS_FILE"

resp=$(curl -s -D- -o/dev/null "$API_BASE/events" -H "X-Test: test%0d%0aX-Injected: true" 2>/dev/null || echo "")
if echo "$resp" | grep -qi "X-Injected"; then
    log_test "CRLF injection" "FAIL" "Header injected!"
else
    log_test "CRLF injection" "PASS" "Headers safe"
fi

# Summary
echo ""
echo "========================================================="
echo "SUMMARY"
echo "========================================================="

TOTAL=$((PASSED + FAILED + WARNINGS))

echo "" >> "$RESULTS_FILE"
echo "=========================================================" >> "$RESULTS_FILE"
echo "SUMMARY" >> "$RESULTS_FILE"
echo "---------------------------------------------------------" >> "$RESULTS_FILE"
echo "Total Tests: $TOTAL" >> "$RESULTS_FILE"
echo "Passed: $PASSED" >> "$RESULTS_FILE"
echo "Failed: $FAILED" >> "$RESULTS_FILE"
echo "Warnings: $WARNINGS" >> "$RESULTS_FILE"
echo "Completed: $(date '+%Y-%m-%d %H:%M:%S')" >> "$RESULTS_FILE"
echo "=========================================================" >> "$RESULTS_FILE"

echo -e "${GREEN}Passed:${NC} $PASSED"
echo -e "${RED}Failed:${NC} $FAILED"
echo -e "${YELLOW}Warnings:${NC} $WARNINGS"
echo ""
echo "Pass Rate: $((PASSED * 100 / TOTAL))%"
echo ""
echo "Results saved to: $RESULTS_FILE"

[[ $FAILED -gt 0 ]] && exit 1
[[ $WARNINGS -gt 0 ]] && exit 2
exit 0
