zapretgui/tests/test_dns_answering.py
loop-uh aa5dfaafd2
All checks were successful
Zapret source guards / validate (push) Successful in 9s
Windows-сборка / Dev Dev 21.1.7.137 опубликован
Настройка DNS: «Отвечает: Cloudflare (AS13335)» и предупреждение о перехвате
На адаптере может стоять 1.1.1.1, а отвечать — провайдер. Панель «Сейчас
DNS» теперь второй строкой под адресами называет сеть, которая на самом
деле разбирает имена, без новых элементов.

- dns/answering.py: whoami.akamai.net у выбранного адреса → сеть по
  Team Cymru шифрованным путём → канарейка; общий срок 8 с; короткое
  имя сети (short_owner). «Перехват» — только по канарейке.
- utils/dns_reference.reference_ask — общий для проверки серверов и этой.
- DnsAnsweringWorker, фабрика в фасаде, дорожка dns_answering; итог
  помнится 10 минут, во время экскурсии не спрашиваем.
- Перехват при выбранном сервере (не «Автоматически» и не шифрованный
  режим): «— не выбранный сервер» и подпись «Вы выбрали …, но отвечает
  не он, а …». Подпись одна на два источника (_render_notice): замер
  скорости её больше не стирает.
- Экскурсия dns_now — про эту строку.

Проверено вживую с win10: 1.1.1.1 → Cloudflare (AS13335), 8.8.8.8 →
Google LLC (AS15169), 77.88.8.8 → YANDEX LLC (AS13238).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 02:21:19 +03:00

55 lines
2.4 KiB
Python

"""Кто на самом деле отвечает на DNS: короткое имя сети и проверка в три вопроса."""
from __future__ import annotations
import unittest
from unittest.mock import patch
from dns import answering
from utils.dns_wire import STATUS_OK, TYPE_A, DnsQueryResult, DnsRecord
from utils.ip_owner import IpOwner
class ShortOwnerTests(unittest.TestCase):
def test_owner_is_named_without_network_code_country_and_company_form(self) -> None:
for raw, short in (
("CLOUDFLARENET - Cloudflare, Inc., US", "Cloudflare"),
("GOOGLE - Google LLC, US", "Google LLC"),
("ROSTELECOM-AS PJSC Rostelecom. Technical Team, RU", "ROSTELECOM-AS PJSC Rostelecom. Technical Team"),
("", ""),
):
with self.subTest(raw=raw):
self.assertEqual(answering.short_owner(IpOwner(asn="1", owner=raw)), short)
self.assertEqual(answering.short_owner(None), "")
class CheckTests(unittest.TestCase):
def _check(self, *, egress: tuple[str, ...], owner: IpOwner | None, canary: bool):
records = tuple(DnsRecord(name="whoami.akamai.net", rtype=TYPE_A, ttl=20, value=ip) for ip in egress)
whoami = DnsQueryResult(status=STATUS_OK, records=records)
with (
patch.object(answering, "query_udp", return_value=whoami) as asked,
patch.object(answering, "lookup_ip_owner", return_value=owner) as owner_of,
patch.object(answering, "canary_answered", return_value=canary),
):
result = answering.check_answering("1.1.1.1")
return result, asked, owner_of
def test_network_that_resolves_names_is_named(self) -> None:
result, asked, owner_of = self._check(
egress=("172.68.1.1",), owner=IpOwner(asn="13335", owner="CLOUDFLARENET - Cloudflare, Inc., US"), canary=False
)
self.assertEqual(result, answering.Answering(owner="Cloudflare", asn="13335", intercepted=False))
self.assertEqual(asked.call_args.args[:2], ("1.1.1.1", answering.WHOAMI_DOMAIN))
self.assertEqual(owner_of.call_args.args[0], "172.68.1.1")
def test_interception_is_said_only_by_the_canary(self) -> None:
result, _asked, owner_of = self._check(egress=(), owner=None, canary=True)
self.assertEqual(result, answering.Answering(intercepted=True))
owner_of.assert_not_called()
if __name__ == "__main__":
unittest.main()