Files
lou b55c0cb7bb 开源化: MIT LICENSE + 详细 README + deploy/watchdog + 全仓脱敏(云服IP/学校域/凭据 → RFC5737 占位)
- LICENSE: MIT © 2026 edgevoid
- README: 三层架构/逐字段伪装对照/部署/验证/安全边界/看门狗自启
- 脱敏(filter-repo 全历史): 8.136.202.225→203.0.113.10, .zjipc.cn→.internal.example, 学校DNS→192.0.2.53
- hook.sh 更新为安全形态(FORWARD-only 绑 WAN, 去掉 OUTPUT 全挂断网形态)
- router_deploy.sh: SSHPASS 改环境变量注入(明文密码清除)
- watchdog.sh 纳入 deploy/(接口变量化)
- 内部语境泛化(认证网关/学校DNS/寝室部署备注)
2026-09-09 18:14:10 +08:00

50 lines
1.6 KiB
Python

"""dnsmsg 单测: qname 提取与畸形防护。"""
from __future__ import annotations
import struct
import unittest
from channel.dnsmsg import parse_qname
def _query(name: str) -> bytes:
labels = [len(p.encode()) for p in name.split(".")]
qname = b"".join(
bytes((labels[i],)) + name.split(".")[i].encode()
for i in range(len(labels))
) + b"\x00"
header = struct.pack("!HHHHHH", 0x1234, 0x0100, 1, 0, 0, 0)
return header + qname + struct.pack("!HH", 1, 1) # A IN
class DnsMsgTest(unittest.TestCase):
def test_plain_name(self) -> None:
self.assertEqual(parse_qname(_query("www.internal.example")), "www.internal.example")
def test_upper_mixed_normalized(self) -> None:
self.assertEqual(parse_qname(_query("WWW.INTERNAL.EXAMPLE")), "www.internal.example")
def test_single_label(self) -> None:
self.assertEqual(parse_qname(_query("router")), "router")
def test_too_short(self) -> None:
self.assertIsNone(parse_qname(b"\x00\x01"))
def test_compression_pointer_rejected(self) -> None:
pkt = bytearray(_query("www.internal.example"))
pkt[12] = 0xC0 # qname 首字节变压缩指针
self.assertIsNone(parse_qname(bytes(pkt)))
def test_no_terminator(self) -> None:
pkt = _query("www.internal.example")
self.assertIsNone(parse_qname(pkt[:-5])) # 切掉 0 结尾和 qtype
def test_non_ascii_label(self) -> None:
pkt = bytearray(_query("www.internal.example"))
pkt[14] = 0xFF # 标签内容变非法 ascii
self.assertIsNone(parse_qname(bytes(pkt)))
if __name__ == "__main__":
unittest.main()