224 lines
8.4 KiB
Bash
224 lines
8.4 KiB
Bash
#!/bin/bash
|
||
#
|
||
# Тест fail-secure поведения SOCKS5 прокси
|
||
# Версия: 1.0
|
||
# Дата: 22 ноября 2025
|
||
#
|
||
# Этот скрипт тестирует, что SOCKS5 прокси корректно прерывает соединение
|
||
# при недоступности Phantom сети вместо установки прямого подключения.
|
||
#
|
||
|
||
set -e
|
||
|
||
# Цвета для вывода
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
echo "========================================="
|
||
echo "Тест Fail-Secure Поведения SOCKS5 Прокси"
|
||
echo "========================================="
|
||
echo ""
|
||
|
||
# Функция для вывода результата теста
|
||
test_result() {
|
||
local test_name="$1"
|
||
local result="$2"
|
||
|
||
if [ "$result" = "PASS" ]; then
|
||
echo -e "${GREEN}✅ PASS${NC}: $test_name"
|
||
elif [ "$result" = "FAIL" ]; then
|
||
echo -e "${RED}❌ FAIL${NC}: $test_name"
|
||
exit 1
|
||
else
|
||
echo -e "${YELLOW}⚠️ SKIP${NC}: $test_name"
|
||
fi
|
||
}
|
||
|
||
# Проверка наличия Python
|
||
echo "Проверка зависимостей..."
|
||
if ! command -v python3 &> /dev/null; then
|
||
echo -e "${RED}❌ Python3 не найден${NC}"
|
||
exit 1
|
||
fi
|
||
echo -e "${GREEN}✅ Python3 найден${NC}"
|
||
echo ""
|
||
|
||
# Проверка наличия файла прокси
|
||
PROXY_FILE="../examples/socks5-proxy.py"
|
||
if [ ! -f "$PROXY_FILE" ]; then
|
||
echo -e "${RED}❌ Файл $PROXY_FILE не найден${NC}"
|
||
exit 1
|
||
fi
|
||
echo -e "${GREEN}✅ Файл socks5-proxy.py найден${NC}"
|
||
echo ""
|
||
|
||
# Тест 1: Проверка отсутствия fallback кода
|
||
echo "Тест 1: Проверка отсутствия fallback механизма..."
|
||
if grep -q "Fallback: прямое подключение" "$PROXY_FILE"; then
|
||
test_result "Отсутствие fallback кода" "FAIL"
|
||
echo -e "${RED}Найден опасный fallback код!${NC}"
|
||
exit 1
|
||
else
|
||
test_result "Отсутствие fallback кода" "PASS"
|
||
fi
|
||
echo ""
|
||
|
||
# Тест 2: Проверка наличия fail-secure логики
|
||
echo "Тест 2: Проверка наличия fail-secure логики..."
|
||
if grep -q "Соединение прервано для обеспечения безопасности" "$PROXY_FILE"; then
|
||
test_result "Наличие fail-secure логики" "PASS"
|
||
else
|
||
test_result "Наличие fail-secure логики" "FAIL"
|
||
echo -e "${RED}Fail-secure логика не найдена!${NC}"
|
||
exit 1
|
||
fi
|
||
echo ""
|
||
|
||
# Тест 3: Проверка возврата False при ошибке
|
||
echo "Тест 3: Проверка возврата False при ошибке..."
|
||
FAIL_SECURE_COUNT=$(grep -c "return False" "$PROXY_FILE" || true)
|
||
if [ "$FAIL_SECURE_COUNT" -ge 2 ]; then
|
||
test_result "Возврат False при ошибке" "PASS"
|
||
echo " Найдено $FAIL_SECURE_COUNT точек возврата False"
|
||
else
|
||
test_result "Возврат False при ошибке" "FAIL"
|
||
echo -e "${RED}Недостаточно точек fail-secure!${NC}"
|
||
exit 1
|
||
fi
|
||
echo ""
|
||
|
||
# Тест 4: Проверка предупреждающих сообщений
|
||
echo "Тест 4: Проверка предупреждающих сообщений..."
|
||
if grep -q "ВНИМАНИЕ: Прямое подключение ЗАПРЕЩЕНО" "$PROXY_FILE"; then
|
||
test_result "Наличие предупреждений" "PASS"
|
||
else
|
||
test_result "Наличие предупреждений" "FAIL"
|
||
echo -e "${RED}Предупреждающие сообщения не найдены!${NC}"
|
||
exit 1
|
||
fi
|
||
echo ""
|
||
|
||
# Тест 5: Синтаксическая проверка Python кода
|
||
echo "Тест 5: Синтаксическая проверка Python кода..."
|
||
if python3 -m py_compile "$PROXY_FILE" 2>/dev/null; then
|
||
test_result "Синтаксис Python" "PASS"
|
||
else
|
||
test_result "Синтаксис Python" "FAIL"
|
||
echo -e "${RED}Синтаксические ошибки в коде!${NC}"
|
||
exit 1
|
||
fi
|
||
echo ""
|
||
|
||
# Тест 6: Проверка версии в документации
|
||
echo "Тест 6: Проверка обновления документации..."
|
||
DOC_FILE="../docs/user-guide-complete-ru.md"
|
||
if [ -f "$DOC_FILE" ]; then
|
||
if grep -q "Fail-Secure Поведение" "$DOC_FILE"; then
|
||
test_result "Обновление документации" "PASS"
|
||
else
|
||
test_result "Обновление документации" "FAIL"
|
||
echo -e "${RED}Документация не обновлена!${NC}"
|
||
exit 1
|
||
fi
|
||
else
|
||
test_result "Обновление документации" "SKIP"
|
||
echo " Файл документации не найден"
|
||
fi
|
||
echo ""
|
||
|
||
# Тест 7: Функциональный тест (симуляция)
|
||
echo "Тест 7: Функциональный тест (симуляция)..."
|
||
echo " Создание тестового скрипта..."
|
||
|
||
cat > /tmp/test_socks5_failsecure.py << 'EOF'
|
||
#!/usr/bin/env python3
|
||
import sys
|
||
import socket
|
||
|
||
# Симуляция теста: проверяем, что при ошибке подключения
|
||
# функция connect() возвращает False
|
||
|
||
class MockRoute:
|
||
def __init__(self):
|
||
self.nodes = [("127.0.0.1", 9999)] # Несуществующий узел
|
||
|
||
class TestPhantomConnection:
|
||
def __init__(self):
|
||
self.route = MockRoute()
|
||
self.socket = None
|
||
self.connected = False
|
||
|
||
def connect(self, target_host, target_port):
|
||
"""Упрощенная версия функции connect для теста"""
|
||
try:
|
||
if not self.route.nodes:
|
||
print("❌ Маршрут не построен")
|
||
return False
|
||
|
||
first_hop = self.route.nodes[0]
|
||
print(f"Попытка подключения к {first_hop[0]}:{first_hop[1]}...")
|
||
|
||
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
self.socket.settimeout(2)
|
||
|
||
try:
|
||
self.socket.connect(first_hop)
|
||
except socket.error as e:
|
||
print(f"❌ Не удалось подключиться к первому хопу Phantom сети: {e}")
|
||
print(f"🔒 Соединение прервано для обеспечения безопасности")
|
||
print(f"⚠️ ВНИМАНИЕ: Прямое подключение ЗАПРЕЩЕНО для сохранения анонимности")
|
||
self.socket.close()
|
||
return False # FAIL-SECURE!
|
||
|
||
self.connected = True
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"Ошибка подключения: {e}")
|
||
return False
|
||
|
||
# Запуск теста
|
||
print("Тест fail-secure поведения...")
|
||
conn = TestPhantomConnection()
|
||
result = conn.connect("example.com", 80)
|
||
|
||
if result == False and conn.connected == False:
|
||
print("\n✅ ТЕСТ ПРОЙДЕН: Соединение корректно прервано")
|
||
sys.exit(0)
|
||
else:
|
||
print("\n❌ ТЕСТ ПРОВАЛЕН: Соединение не было прервано!")
|
||
sys.exit(1)
|
||
EOF
|
||
|
||
chmod +x /tmp/test_socks5_failsecure.py
|
||
|
||
if python3 /tmp/test_socks5_failsecure.py 2>&1 | grep -q "ТЕСТ ПРОЙДЕН"; then
|
||
test_result "Функциональный тест" "PASS"
|
||
else
|
||
test_result "Функциональный тест" "FAIL"
|
||
echo -e "${RED}Функциональный тест не прошел!${NC}"
|
||
exit 1
|
||
fi
|
||
echo ""
|
||
|
||
# Итоговый результат
|
||
echo "========================================="
|
||
echo -e "${GREEN}✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ УСПЕШНО!${NC}"
|
||
echo "========================================="
|
||
echo ""
|
||
echo "Результаты:"
|
||
echo " ✅ Fallback код удален"
|
||
echo " ✅ Fail-secure логика реализована"
|
||
echo " ✅ Возврат False при ошибках"
|
||
echo " ✅ Предупреждающие сообщения добавлены"
|
||
echo " ✅ Синтаксис Python корректен"
|
||
echo " ✅ Документация обновлена"
|
||
echo " ✅ Функциональный тест пройден"
|
||
echo ""
|
||
echo "SOCKS5 прокси готов к использованию! 🎉"
|
||
echo ""
|
||
|
||
exit 0
|