package cli import ( "fmt" "strings" "vpn-client/internal/config" "vpn-client/internal/security" ) // securityMenu отображает меню безопасности func securityMenu() { for { clearScreen() fmt.Println(bold("╔════════════════════════════════════════════════════════════╗")) fmt.Println(bold("║ 🔒 БЕЗОПАСНОСТЬ И ЗАЩИТА ║")) fmt.Println(bold("╚════════════════════════════════════════════════════════════╝")) fmt.Println() secManager := security.NewSecurityManager(config.ConfigDir, "default-password") status := secManager.GetSecurityStatus() // Показываем текущий статус fmt.Println(cyan("Текущий статус безопасности:")) fmt.Println(strings.Repeat("─", 60)) if status["kill_switch_enabled"].(bool) { fmt.Printf(" Kill Switch: %s (отключен в этой версии)\n", yellow("⚠")) } else { fmt.Printf(" Kill Switch: %s (отключен в этой версии)\n", yellow("⚠")) } if status["dns_protection_enabled"].(bool) { fmt.Printf(" Защита DNS: %s (активна)\n", green("✓")) } else { fmt.Printf(" Защита DNS: %s (неактивна)\n", red("✗")) } if status["encryption_enabled"].(bool) { fmt.Printf(" Шифрование конфигов: %s (включено)\n", green("✓")) } else { fmt.Printf(" Шифрование конфигов: %s (выключено)\n", yellow("⚠")) } if status["config_dir_protected"].(bool) { fmt.Printf(" Защита директории: %s (активна)\n", green("✓")) } else { fmt.Printf(" Защита директории: %s (неактивна)\n", red("✗")) } fmt.Println() fmt.Println(strings.Repeat("─", 60)) fmt.Println() fmt.Println("1. Настроить Kill Switch") fmt.Println("2. Настроить защиту DNS") fmt.Println("3. Управление шифрованием конфигов") fmt.Println("4. Проверить утечки") fmt.Println("5. Защитить директорию конфигураций") fmt.Println("6. Показать текущие DNS серверы") fmt.Println("0. Назад") fmt.Println() choice := readInput("Выберите действие: ") switch choice { case "1": configureKillSwitch(secManager) case "2": configureDNSProtection(secManager) case "3": configureEncryption(secManager) case "4": checkForLeaks(secManager) case "5": protectConfigDirectory(secManager) case "6": showCurrentDNS() case "0": return default: fmt.Printf("%s Неверный выбор\n", red("✗")) pause() } } } func configureKillSwitch(secManager *security.SecurityManager) { clearScreen() fmt.Println(bold("╔════════════════════════════════════════════════════════════╗")) fmt.Println(bold("║ НАСТРОЙКА KILL SWITCH ║")) fmt.Println(bold("╚════════════════════════════════════════════════════════════╝")) fmt.Println() fmt.Println(red("⚠️ KILL SWITCH ВРЕМЕННО ОТКЛЮЧЕН В ЭТОЙ ВЕРСИИ")) fmt.Println() fmt.Println("Kill Switch был отключен из-за проблем с блокировкой интернета.") fmt.Println("Функция будет доработана и добавлена в следующей версии.") fmt.Println() fmt.Println("Для защиты используйте:") fmt.Println(" • Защиту DNS (предотвращает DNS утечки)") fmt.Println(" • Системный прокси (работает автоматически)") fmt.Println(" • Шифрование конфигураций") fmt.Println() pause() } func configureDNSProtection(secManager *security.SecurityManager) { clearScreen() fmt.Println(bold("╔════════════════════════════════════════════════════════════╗")) fmt.Println(bold("║ НАСТРОЙКА ЗАЩИТЫ DNS ║")) fmt.Println(bold("╚════════════════════════════════════════════════════════════╝")) fmt.Println() fmt.Println("Защита DNS предотвращает утечку DNS запросов за пределы VPN.") fmt.Println() secConfig, err := secManager.LoadSecurityConfig() if err != nil { fmt.Printf("%s Ошибка загрузки конфигурации: %v\n", red("✗"), err) pause() return } fmt.Printf("Текущий статус: ") if secConfig.DNSProtectionEnabled { fmt.Println(green("Включена")) } else { fmt.Println(red("Отключена")) } fmt.Printf("\nТекущие VPN DNS серверы:\n") for i, dns := range secConfig.VPNDNSServers { fmt.Printf(" %d. %s\n", i+1, dns) } fmt.Println() fmt.Println("1. Включить/отключить защиту DNS") fmt.Println("2. Изменить DNS серверы") fmt.Println("0. Назад") fmt.Println() choice := readInput("Выберите действие: ") switch choice { case "1": secConfig.DNSProtectionEnabled = !secConfig.DNSProtectionEnabled if err := secManager.SaveSecurityConfig(secConfig); err != nil { fmt.Printf("%s Ошибка сохранения: %v\n", red("✗"), err) } else { if secConfig.DNSProtectionEnabled { fmt.Printf("%s Защита DNS включена\n", green("✓")) } else { fmt.Printf("%s Защита DNS отключена\n", yellow("⚠")) } } pause() case "2": fmt.Println("\nВведите DNS серверы (через запятую):") fmt.Println("Например: 1.1.1.1,8.8.8.8") fmt.Print("> ") dnsInput := readInput("") dnsServers := strings.Split(dnsInput, ",") var cleanDNS []string for _, dns := range dnsServers { dns = strings.TrimSpace(dns) if dns != "" { cleanDNS = append(cleanDNS, dns) } } if len(cleanDNS) > 0 { secConfig.VPNDNSServers = cleanDNS if err := secManager.SaveSecurityConfig(secConfig); err != nil { fmt.Printf("%s Ошибка сохранения: %v\n", red("✗"), err) } else { fmt.Printf("%s DNS серверы обновлены\n", green("✓")) } } else { fmt.Printf("%s Не указаны DNS серверы\n", red("✗")) } pause() } } func configureEncryption(secManager *security.SecurityManager) { clearScreen() fmt.Println(bold("╔════════════════════════════════════════════════════════════╗")) fmt.Println(bold("║ ШИФРОВАНИЕ КОНФИГУРАЦИЙ ║")) fmt.Println(bold("╚════════════════════════════════════════════════════════════╝")) fmt.Println() fmt.Println("Шифрование защищает ваши конфигурации VPN от несанкционированного") fmt.Println("доступа. Файлы шифруются с использованием AES-256-GCM.") fmt.Println() secConfig, err := secManager.LoadSecurityConfig() if err != nil { fmt.Printf("%s Ошибка загрузки конфигурации: %v\n", red("✗"), err) pause() return } fmt.Printf("Текущий статус: ") if secConfig.EncryptionEnabled { fmt.Println(green("Включено")) } else { fmt.Println(red("Отключено")) } fmt.Println() fmt.Println("1. Включить шифрование") fmt.Println("2. Отключить шифрование") fmt.Println("0. Назад") fmt.Println() choice := readInput("Выберите действие: ") switch choice { case "1": secConfig.EncryptionEnabled = true if err := secManager.SaveSecurityConfig(secConfig); err != nil { fmt.Printf("%s Ошибка сохранения: %v\n", red("✗"), err) } else { fmt.Printf("%s Шифрование включено\n", green("✓")) fmt.Println("\nВнимание: Конфигурации будут зашифрованы автоматически") } pause() case "2": fmt.Println(yellow("\n⚠ Предупреждение: Отключение шифрования снизит безопасность!")) confirm := readInput("Вы уверены? (yes/no): ") if strings.ToLower(confirm) == "yes" { secConfig.EncryptionEnabled = false if err := secManager.SaveSecurityConfig(secConfig); err != nil { fmt.Printf("%s Ошибка сохранения: %v\n", red("✗"), err) } else { fmt.Printf("%s Шифрование отключено\n", yellow("⚠")) } } pause() } } func checkForLeaks(secManager *security.SecurityManager) { clearScreen() fmt.Println(bold("╔════════════════════════════════════════════════════════════╗")) fmt.Println(bold("║ ПРОВЕРКА УТЕЧЕК ║")) fmt.Println(bold("╚════════════════════════════════════════════════════════════╝")) fmt.Println() fmt.Println("Проверка безопасности соединения...") fmt.Println() leaks, err := secManager.CheckForLeaks() if err != nil { fmt.Printf("%s Ошибка проверки: %v\n", red("✗"), err) pause() return } if len(leaks) == 0 { fmt.Printf("%s Утечек не обнаружено!\n", green("✓")) fmt.Println("\nВаше соединение безопасно:") fmt.Println(" • DNS запросы защищены") fmt.Println(" • Kill Switch активен") fmt.Println(" • Трафик идет через VPN") } else { fmt.Printf("%s Обнаружены потенциальные утечки:\n\n", red("✗")) for i, leak := range leaks { fmt.Printf(" %d. %s\n", i+1, leak) } fmt.Println("\nРекомендации:") fmt.Println(" • Проверьте настройки безопасности") fmt.Println(" • Убедитесь, что VPN подключен") fmt.Println(" • Включите Kill Switch и защиту DNS") } pause() } func protectConfigDirectory(secManager *security.SecurityManager) { clearScreen() fmt.Println(bold("╔════════════════════════════════════════════════════════════╗")) fmt.Println(bold("║ ЗАЩИТА ДИРЕКТОРИИ КОНФИГУРАЦИЙ ║")) fmt.Println(bold("╚════════════════════════════════════════════════════════════╝")) fmt.Println() fmt.Println("Установка строгих прав доступа к файлам конфигураций...") fmt.Println() if err := secManager.ProtectConfigDirectory(); err != nil { fmt.Printf("%s Ошибка: %v\n", red("✗"), err) } else { fmt.Printf("%s Директория конфигураций защищена\n", green("✓")) fmt.Println("\nТеперь только владелец может читать и изменять конфигурации") } pause() } func showCurrentDNS() { clearScreen() fmt.Println(bold("╔════════════════════════════════════════════════════════════╗")) fmt.Println(bold("║ ТЕКУЩИЕ DNS СЕРВЕРЫ ║")) fmt.Println(bold("╚════════════════════════════════════════════════════════════╝")) fmt.Println() dnsServers, err := security.GetCurrentDNS() if err != nil { fmt.Printf("%s Ошибка получения DNS: %v\n", red("✗"), err) pause() return } if len(dnsServers) == 0 { fmt.Println(yellow("DNS серверы не обнаружены")) } else { fmt.Println("Активные DNS серверы:") for i, dns := range dnsServers { fmt.Printf(" %d. %s\n", i+1, dns) } } pause() }