zapretgui/tests/test_dns_interception.py
loop-uh a8ac7b2c8a
All checks were successful
Zapret source guards / validate (push) Successful in 9s
Windows-сборка / Dev Dev 21.1.7.36 опубликован
Проверки сети: общая основа для запросов DNS — у каждого способа связи своя функция (обычный DNS по UDP и по TCP, шифрованный DoT на порту 853 и DoH на порту 443), запрос можно снять кнопкой «Стоп», а вместо текста ошибки возвращается вид сбоя: сервер молчит, порт закрыт, соединение оборвано, чужой сертификат, ошибка HTTP; эталонных серверов для сравнения ответов теперь четыре вместо двух и список один на BlockCheck и «Проверку домена» — если провайдер закрыл один из них (как 8.8.8.8), BlockCheck и «DNS подмена» называют его с причиной и советуют не выбирать для защищённого DNS; перехват DNS по контрольному адресу, виды адресов-заглушек и отмена запросов сведены в одно место вместо двух-трёх копий с разной логикой; адрес внутренней сети провайдера (100.64.0.0/10) в ответе DNS считается подменой; удалена старая проверка, которую никто не вызывал (preflight, isp_page_detector, ping_tester) вместе с её настройками и моделями
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 19:59:00 +03:00

47 lines
1.6 KiB
Python

from __future__ import annotations
import unittest
from ipaddress import ip_address, ip_network
from unittest.mock import patch
from utils import dns_interception
from utils.dns_wire import (
FAILURE_TIMEOUT,
STATUS_NXDOMAIN,
STATUS_OK,
STATUS_TIMEOUT,
DnsQueryResult,
)
class CanaryTests(unittest.TestCase):
def test_canary_address_is_from_documentation_network(self) -> None:
"""Настоящего сервера по этому адресу быть не может (RFC 5737)."""
self.assertIn(ip_address(dns_interception.CANARY_SERVER), ip_network("192.0.2.0/24"))
def _ask(self, result: DnsQueryResult) -> tuple[bool, list]:
calls: list = []
def fake_query(server, name, rtype, **kwargs):
calls.append((server, name, kwargs))
return result
with patch.object(dns_interception, "query_udp", fake_query):
return dns_interception.canary_answered("example.com"), calls
def test_any_answer_means_interception_even_no_such_site(self) -> None:
for status, rcode in ((STATUS_OK, 0), (STATUS_NXDOMAIN, 3)):
with self.subTest(status=status):
answered, calls = self._ask(DnsQueryResult(status=status, rcode=rcode))
self.assertTrue(answered)
self.assertEqual(calls[0][0], dns_interception.CANARY_SERVER)
self.assertEqual(calls[0][1], "example.com")
def test_silence_means_no_interception(self) -> None:
answered, _calls = self._ask(DnsQueryResult(status=STATUS_TIMEOUT, failure=FAILURE_TIMEOUT))
self.assertFalse(answered)
if __name__ == "__main__":
unittest.main()