# -*- coding: utf-8 -*- """把 TlsCompat 接进 RelayTransport —— 让 HTTPS 用上内置根证书。 原来: (HttpURLConnection) new URL(baseUrl + path).openConnection(); HTTPS 时拿到的是 HttpsURLConnection,用的是**系统默认** SSL 上下文。 老手表缺 GTS Root R4 -> Chain validation failed。 改后: TlsCompat.open(...) -> 挂上"系统库 或 内置库"的组合信任。 """ from __future__ import annotations import ast import sys from pathlib import Path ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote") TRANSPORT = (ROOT / "android" / "src" / "com" / "lanremote" / "watch" / "RelayTransport.java") TLS = (ROOT / "android" / "src" / "com" / "lanremote" / "watch" / "TlsCompat.java") # ---------- 1. RelayTransport 改用它 ---------- OLD = ''' HttpURLConnection connection = (HttpURLConnection) new URL(baseUrl + path).openConnection(); try { connection.setRequestMethod("POST");''' NEW = ''' // 走 TlsCompat:老手表缺根证书时用内置的那两个补上。 // 不这么改会报 SSLHandshakeException: Chain validation failed // (廉价手表的系统根证书库常缺 GTS Root R4)。 HttpURLConnection connection = TlsCompat.open(baseUrl + path); try { connection.setRequestMethod("POST");''' # ---------- 2. TlsCompat.open 改成抛 IOException ---------- SIG_OLD = ''' public static HttpURLConnection open(String urlText, int timeoutMs) throws Exception { HttpURLConnection connection = (HttpURLConnection) new URL(urlText).openConnection(); connection.setConnectTimeout(timeoutMs); connection.setReadTimeout(timeoutMs); connection.setRequestProperty("User-Agent", "LanRemote/1.4.0"); connection.setRequestProperty("Accept-Encoding", "identity"); if (connection instanceof HttpsURLConnection) { SSLSocketFactory ssl = factory(); if (ssl != null) { ((HttpsURLConnection) connection).setSSLSocketFactory(ssl); } } return connection; }''' SIG_NEW = ''' public static HttpURLConnection open(String urlText) throws IOException { HttpURLConnection connection = (HttpURLConnection) new URL(urlText).openConnection(); connection.setUseCaches(false); if (connection instanceof HttpsURLConnection) { SSLSocketFactory ssl = factory(); if (ssl != null) { ((HttpsURLConnection) connection).setSSLSocketFactory(ssl); } } return connection; }''' def main() -> int: ok = True # ---- RelayTransport ---- text = TRANSPORT.read_text(encoding="utf-8") if "TlsCompat.open(" in text: print(" RelayTransport 已经改过") elif OLD in text: text = text.replace(OLD, NEW, 1) TRANSPORT.write_text(text, encoding="utf-8", newline="\n") print(" RelayTransport:改用 TlsCompat.open()") else: print(" [失败] RelayTransport 锚点没找到") ok = False # ---- TlsCompat 签名 ---- text = TLS.read_text(encoding="utf-8") if SIG_OLD in text: text = text.replace(SIG_OLD, SIG_NEW, 1) TLS.write_text(text, encoding="utf-8", newline="\n") print(" TlsCompat:open() 改成抛 IOException") elif "throws IOException" in text and "TlsCompat.open" not in text: print(" TlsCompat:签名已经是 IOException") else: print(" TlsCompat:签名已经改过") # ---- 补 import ---- text = TLS.read_text(encoding="utf-8") if "import java.io.IOException;" not in text: text = text.replace("import java.io.ByteArrayInputStream;", "import java.io.ByteArrayInputStream;\n" "import java.io.IOException;", 1) TLS.write_text(text, encoding="utf-8", newline="\n") print(" TlsCompat:补了 import java.io.IOException") return 0 if ok else 1 if __name__ == "__main__": sys.exit(main())