Яндекс-эндпоинты блокируют запросы от Android/OkHttp по TLS fingerprint
и возвращают 403, что приводило к ложному срабатыванию детектора VPN.
Заменены на 2ip.ru и api.sypexgeo.net — оба хостятся в России, используют
стандартные CA и корректно отвечают на запросы от Android.
Добавлен парсинг JSON-поля "ip" в extractIp для поддержки sypexgeo.net.
Перенос корутины сканирования в CheckViewModel (viewModelScope), который
переживает пересоздание Activity. Результаты и прогресс накапливаются в
StateFlow<List<ScanEvent>> и воспроизводятся новым экземпляром Activity.
Add SimCardInfo data class and replace flat simMcc/simCountryIso/isRoaming
fields on LocationSnapshot with simCards: List<SimCardInfo>. Collect SIM data
from all active subscriptions via SubscriptionManager.getActiveSubscriptionInfoList()
with a fallback to the default TelephonyManager for single-SIM devices or when
permission is denied. Each SIM emits its own informational finding. Roaming
confidence is derived from the SIM whose MCC matches the active network MCC.
Closes#19
Apps excluded from VPN via per-app split tunnel cannot use
network.socketFactory to reach the VPN network. Add BindSocketFactory
which calls Network.bindSocket() on each unconnected socket before
connect, equivalent to curl --interface tun0 (SO_BINDTODEVICE).
UnderlyingNetworkProber now falls back to this method if the standard
network.socketFactory path fails, allowing vpnIp to be obtained even
when the app is excluded from the tunnel.
Найденные установленные VPN-приложения и объявленные VpnService-провайдеры
теперь отображаются в info-секции карточки «Прямые признаки», а не как
сигналы «Требует проверки». Статус карточки больше не становится жёлтым
из-за одного лишь факта установки приложения.
Добавляет EvidenceSource.TUN_ACTIVE_PROBE и два информационных finding
в BypassChecker.reportUnderlyingNetworkResult:
- успех: запрос через vpnNetwork.openConnection() вернул IP (TUN живой)
- неудача: VPN активен, но запрос через VPN Network недоступен
Это отличает активное подтверждение маршрутизируемости TUN от пассивного
детектирования по имени интерфейса (tun0/ppp0) в IndirectSignsChecker.
Сигнал информационный, на вердикт не влияет.
Underlying сеть с доступом в интернет не означает обход туннеля, если
IP через VPN и underlying сеть совпадают. Теперь VPN_GATEWAY_LEAK с
detected=true выставляется только при расхождении IP-адресов; при
совпадении добавляется информационный finding без влияния на вердикт.
Fixes#8
- SettingsActivity с секциями: Проверки, Приватность, Оформление, О приложении
- Material 3 TopAppBar с иконкой шестерёнки на главном экране
- Перенос GitHub и кнопки разрешений в настройки
- Тогл Split tunnel bypass (пропускает BypassChecker при отключении)
- Диапазон портов: пресеты Популярные/Расширенный/Полный/Кастомный
- ScanMode.POPULAR_ONLY в ProxyScanner
- Тогл сетевых запросов с диалогом подтверждения (пропускает GeoIP, IpComparison, BeaconDB)
- Приватный режим: маскировка последних 2 октетов IPv4 во всех карточках UI
- Выбор темы Светлая/Тёмная/Системная через AppCompatDelegate
- Тема применяется при запуске до setContentView
- Юнит-тесты для maskIp (6 тест-кейсов)