All checks were successful
Zapret source guards / validate (push) Successful in 9s
- Чужой сертификат по адресу из DNS теперь перепроверяется тем же запросом к настоящему адресу сайта (как контроль у OONI). Если и там чужой — HTTPS подменяет антивирус, прокси или сеть, а не DNS: это «не узнали», а не «подмена». Без эталона чужой сертификат тоже ничего не доказывает. - Сводка итога вынесена из виджетов в dns_check_plans; строка состояния строится из неё: при сбое и остановке больше нет зелёного «Проверка завершена», «Сохранить» доступно, только когда есть что сохранять. - Все адреса заданы на компьютере или в сети (hosts, VPN fake-ip, домашний фильтр) — не «Ваш DNS честный», а «адреса берутся не у провайдера»; такой домен подписан «Адрес не от провайдера», а не «Адрес из файла hosts». - Проверка, где не удалось проверить ни один адрес, пишется в историю как «не узнали», а не предупреждение. - Удалены неиспользуемые create_dns_check_worker (к тому же сломанный) и create_dns_check_save_worker в dns/commands.py, план очистки потока. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
64 lines
2.5 KiB
Python
64 lines
2.5 KiB
Python
"""Итог и список доменов вкладки «DNS подмена»."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import unittest
|
|
|
|
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
|
|
|
from PyQt6.QtWidgets import QApplication
|
|
|
|
from dns.dns_check_plans import summarize_dns_results
|
|
from dns.ui.dns_check_widgets import DnsDomainsView, DnsSummaryPanel
|
|
|
|
SPOOFED = {
|
|
"summary": {"dns_poisoning_detected": True},
|
|
"domains": {
|
|
"www.youtube.com": {"state": "ok", "system_ips": ["1.1.1.1"], "reference_ips": ["1.1.1.1"]},
|
|
"discord.com": {"state": "spoofed", "reason": "заглушка", "system_ips": ["195.82.146.214"], "reference_ips": ["2.2.2.2"]},
|
|
},
|
|
}
|
|
|
|
|
|
class SummarizeTests(unittest.TestCase):
|
|
def test_kinds(self) -> None:
|
|
spoofed = summarize_dns_results(SPOOFED)
|
|
self.assertEqual(spoofed["kind"], "spoofed")
|
|
self.assertIn("1 сайта", spoofed["title"])
|
|
self.assertIn("Настройка DNS", spoofed["detail"])
|
|
honest = {"domains": {"a": {"state": "ok"}}}
|
|
self.assertEqual(summarize_dns_results(honest)["kind"], "ok")
|
|
self.assertEqual(summarize_dns_results({"domains": {"a": {"state": "unknown"}}})["kind"], "partial")
|
|
self.assertEqual(summarize_dns_results({"stopped": True})["kind"], "stopped")
|
|
self.assertEqual(summarize_dns_results({})["kind"], "error")
|
|
|
|
|
|
class WidgetsTests(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
cls.app = QApplication.instance() or QApplication([])
|
|
|
|
def test_panel_offers_dns_settings_only_when_spoofed(self) -> None:
|
|
opened = []
|
|
panel = DnsSummaryPanel(on_open_dns_settings=lambda: opened.append(True))
|
|
self.addCleanup(panel.deleteLater)
|
|
panel.show_results({"domains": {"a": {"state": "ok"}}})
|
|
self.assertFalse(panel._actions_host.isVisibleTo(panel))
|
|
panel.show_results(SPOOFED)
|
|
self.assertTrue(panel._actions_host.isVisibleTo(panel))
|
|
self.assertEqual(panel.mascot.mood(), "alarm")
|
|
panel.open_settings_btn.click()
|
|
self.assertEqual(opened, [True])
|
|
|
|
def test_domains_sorted_spoofed_first(self) -> None:
|
|
view = DnsDomainsView()
|
|
self.addCleanup(view.deleteLater)
|
|
view.show_results(SPOOFED)
|
|
rows = view.rows()
|
|
self.assertEqual([row.state for row in rows], ["spoofed", "ok"])
|
|
self.assertIn("подменено 1", view.property("screenReaderStateText"))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|