# -*- coding: utf-8 -*- """让爆破测试从**另一个源 IP** 发起。 现在限速是按来源 IP 的(防止别人用错码把你锁在门外)。 测试如果从 127.0.0.1 爆破,就会把同 IP 的合法配对也锁上。 Windows 整个 127.0.0.0/8 都是回环,所以从 127.0.0.2 发就能模拟"另一台机器", 顺带真正验证了按 IP 隔离。 """ from __future__ import annotations import sys from pathlib import Path E2E = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\_tests" r"\test_e2e_features.py") # Client 支持指定源地址 CLIENT_OLD = '''class Client: def __init__(self, host, port, timeout=10.0): self.sock = socket.create_connection((host, port), timeout=timeout)''' CLIENT_NEW = '''class Client: def __init__(self, host, port, timeout=10.0, source_ip=None): if source_ip: # 绑定一个具体的源地址,用来模拟"另一台机器" # (Windows 上整个 127.0.0.0/8 都是回环) self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(timeout) self.sock.bind((source_ip, 0)) self.sock.connect((host, port)) else: self.sock = socket.create_connection((host, port), timeout=timeout)''' # 爆破客户端换源地址 BREAKER_OLD = ' breaker = Client("127.0.0.1", PORT)' BREAKER_NEW = (' # 从 127.0.0.2 发起 —— 限速是按 IP 的,\n' ' # 用同一个 IP 会把后面的合法配对一起锁掉\n' ' breaker = Client("127.0.0.1", PORT, source_ip="127.0.0.2")') # 顺带断言"另一个 IP 被锁不影响本机" EXTRA_CHECK = ''' check("连续错码会被限速", limited, f"12 次都没触发限速,最后一次: {r}") breaker.close() # 反向验证:另一个 IP 被锁住了,本机不受影响 probe = Client("127.0.0.1", PORT) reply_probe = probe.call({"cmd": "pair", "deviceId": "probe", "deviceName": "本机", "code": code}, timeout=10) check("★ 别的 IP 被锁不影响本机配对", reply_probe.get("ok") is True, str(reply_probe)[:120]) probe.close() # 上面这台已经配上并自动关闭了配对窗口,所以后面的合法配对 # 用已保存的令牌继续(重新起一个连接) paired_token = reply_probe.get("token", "") ''' def main() -> int: text = E2E.read_text(encoding="utf-8") if "source_ip" in text: print(" 已经改过") return 0 for old, new, tag in ((CLIENT_OLD, CLIENT_NEW, "Client 支持源地址"), (BREAKER_OLD, BREAKER_NEW, "爆破用 127.0.0.2")): if old not in text: print(f" [跳过] {tag} —— 锚点没找到") return 1 text = text.replace(old, new, 1) print(f" {tag}: OK") # 在爆破检查之后插入反向验证 old_tail = ''' check("连续错码会被限速", limited, f"12 次都没触发限速,最后一次: {r}") breaker.close() ''' if old_tail in text: text = text.replace(old_tail, EXTRA_CHECK, 1) print(" 反向验证: OK") E2E.write_text(text, encoding="utf-8") import ast try: ast.parse(E2E.read_text(encoding="utf-8")) print(" 语法 OK") except SyntaxError as exc: print(f" 语法错误: {exc}") return 1 return 0 if __name__ == "__main__": sys.exit(main())