У пользователя 28 из 30 серверов попадали в «Другие»: имена из подписки не несут флагов, а при включённом скрытии адресов тег, похожий на адрес, маскировался целиком и вообще не разбирался. - Страна и протокол берутся из настоящего тега и адреса; маскируется только показываемый текст. - Офлайн-таблица DB-IP IP to Country Lite (CC BY 4.0, атрибуция в notices), assets/geoip/country.bin ~2 МБ, IPv4 и IPv6, служебные диапазоны всегда без страны; scripts/build-geoip-country.py и проверка хэша в verify-project.sh. - Имена хостов разрешаются тем же доверенным DoH, что и при подключении VPN (по IP-литералам, мимо туннеля): один запрос на хост, не чаще раза в 7 суток, без таймеров; кэш в noBackupFilesDir. - Порядок: флаг в имени → страна по IP → сосед на том же адресе → слова. - JSON-редактор: кнопки в нижней панели, сообщения над ней — снекбар после импорта больше не перекрывает «Validate» и «Сохранить». - Тест обновлятора дожидается закрытия временной VPN-сессии (закрывается в finally проверки), а не проверяет это в тот же миг. Проверено: юнит-тесты, lint, verify-project.sh, 34/34 инструментальных теста на эмуляторе API 37. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.2 KiB
Встроенные rule-set
zapret-ru-domains.json — небольшой исходный список доменных зон России и отдельных
сайтов, которые должны идти через direct. Binary .srs собирается точным audit CLI
из core.properties.
zapret-ru-ip.srs берётся из закреплённого snapshot SagerNet/sing-geoip@eb32cd6ed4a16fcb3bf9a36ccebf28e45716ae84; ожидаемый SHA-256 — bdca5cdb44cdcf0940001e5952386822a6f4ffa8b2c8eea00340aa6f585c7f9d.
Оба файла доставляются только вместе с APK. Runtime-загрузки наборов нет: они обновляются только вместе с APK (фоновая проверка и скачивание самого APK описаны в ARCHITECTURE.md).
Таблица «IP → страна» (флаги серверов)
app/src/main/assets/geoip/country.bin — офлайн-таблица DB-IP «IP to Country Lite» (CC BY 4.0, «IP Geolocation by DB-IP», https://db-ip.com). Приложение определяет по ней страну по адресу самого сервера, чтобы показать флаг, когда его нет в имени. Источник, месяц, SHA-256 и размеры — в app/src/main/assets/geoip/manifest.json; формат файла описан в начале scripts/build-geoip-country.py.
Обновление — вручную перед выпуском, не в приложении:
python3 -I scripts/build-geoip-country.py # текущий месяц, при отсутствии — предыдущий
python3 -I scripts/build-geoip-country.py --check # файл соответствует manifest.json
bash scripts/verify-project.sh # проверка хэша, размера (до 3 МиБ) и атрибуции
После обновления поправьте месяц в docs/THIRD_PARTY_NOTICES.md и скопируйте его в app/src/main/res/raw/third_party_notices.txt (файлы должны быть побайтово равны). Загрузки таблицы во время работы нет.