本应用是本地 Windows EXE。默认不联网,不上传本地配置,不做遥测,不做统计,不自动检查更新,不使用 CDN。
只有以下用户主动触发的场景允许联网:
- 用户主动添加订阅 URL 后测试或刷新订阅。
- 用户主动点击延迟测试或下载测速。
- 用户主动点击连通性检测。
- 用户主动检查远程 proxy-provider 或 rule-provider。
- 不上传本地 YAML。
- 不上传节点信息。
- 不上传订阅 URL。
- 不上传日志。
- 不做遥测。
- 不做统计。
- 不自动检查更新。
- 不访问未知域名。
- 不使用 CDN。
所有网络请求必须集中在:
subscription/
speedtest/
connectivity/
provider_check/
其他模块不得直接发起网络请求。
当前已实现的联网入口:
src/services/subscription/subscriptionRefresh.ts- 只允许
http:/https:订阅 URL。 - 只在用户点击订阅页“测试订阅”或“刷新”按钮时请求。
- Tauri 桌面端优先调用
src-tauri/src/commands/subscription_commands.rs的本地请求命令,避免浏览器 CORS / User-Agent 限制导致误判;浏览器预览模式回退到原生fetch。 - 桌面端本地请求使用系统
curl.exe,按 Mihomo、Clash.Meta、Clash Verge、Clash for Windows、Browser、curl 多种 User-Agent profile 尝试,不新增 HTTP 依赖。 - 桌面端本地请求必须与前端保持同等 URL 边界:使用 Rust
urlcrate 解析和规范化 URL,只允许http/https、必须有主机名、不得包含空白或控制字符,端口合法性交给 URL parser 严格处理。 - 桌面端本地请求的响应头和响应体只能写入
tempfile创建的独占临时目录,请求结束或失败后必须清理,禁止使用可预测固定临时文件名。 - 桌面端本地请求返回 curl stderr 前必须按当前请求 URL 脱敏;完整 URL、path、query、username、password 不得进入 Rust error、UI 或日志。
- 响应内容仅在本地解析为 Clash/Mihomo YAML 或节点链接。
- 日志只记录脱敏 URL 摘要,例如
https://example.com/...?token=<redacted>。 - 订阅刷新失败错误必须通过
sanitizeSubscriptionError脱敏,覆盖完整 URL、同域规范化 URL、path、query、username、password,页面层不得手写替代逻辑。 - 支持解析
subscription-userinfo响应头中的流量信息。
- 只允许
src/services/provider_check/providerCheck.ts- 只提取当前 YAML 中用户已配置的
proxy-providers/rule-providers。 - 只检查
type: http且url为http:/https:的 provider。 - 只在用户点击 OpenClash 页“检查”按钮时请求。
- 使用原生
fetch,不引入额外 HTTP 依赖。 - 默认最多读取每个 provider 响应前 2 MiB,确认可访问后取消后续响应流,避免超大订阅占用过多内存。
- HTTP 成功后只做轻量内容结构校验:
proxy-providers识别proxiesYAML 或常见代理链接列表,rule-providers识别payloadYAML、format: text文本规则或format: mrs连通性。 - 可访问但返回 HTML、登录页、验证码页、空响应或未知结构时必须标记为 warning;不得把单纯 HTTP 200 当作 provider 可用。
- 请求不携带本地 YAML、节点信息、订阅 URL 或日志内容。
- UI 和日志只展示脱敏 URL 摘要,例如
https://example.com/...?token=<redacted>。
- 只提取当前 YAML 中用户已配置的
src/services/speedtest/speedtestPlanner.ts- 生成本地测速任务队列、取消队列和计算结果评分。
src/services/speedtest/speedtestDefaults.ts- 延迟测试默认 URL 为
https://www.gstatic.com/generate_204,依据 Mihomo url-test / health-check 常见示例。 - 下载测速默认 URL 为
https://speed.cloudflare.com/__down?bytes=5242880,依据 Cloudflare speedtest 下载 API。 - 这些 URL 只作为测速页输入框默认值,应用启动、打开文件、切换页面时不得自动请求。
- 延迟测试默认 URL 为
src/services/speedtest/speedtestRunner.ts- 只在用户点击测速页“开始测速”按钮时请求。
- 节点级延迟 / 可用性 / 稳定性测速只访问本机 Mihomo / OpenClash external-controller,controller 地址必须是
127.0.0.1、localhost或::1,0.0.0.0会映射为127.0.0.1。 - 使用 Mihomo
/proxies/{name}/delay?url=...&timeout=...API,测试 URL 来自测速页输入框,且只允许http:/https:。 - 下载测速只访问测速页输入框中的下载 URL,并记录本地速度样本;当前不自动切换代理分组,不声称这是完整按节点下载测速。
- 使用原生
fetch和AbortController,不引入额外 HTTP 依赖。 - 下载测速的超时 / 取消必须覆盖响应头获取和响应体读取,避免慢速或卡住的下载流阻塞队列。
- 测速日志只记录本机 controller 摘要、脱敏测速 URL、状态、耗时和错误类型,不记录完整 token。
- 测速失败错误必须脱敏下载 URL、controller request URL 中嵌套的测速 URL、path 和 query;异常 message 不得直接透传用户输入 URL。
当前明确不联网的配置优化入口:
src/services/config/configOptimizer.ts- 写入机场订阅 provider 时只改写当前 YAML,不刷新订阅、不检查 URL 可达性。
- DNS/IP 防泄露优化只补齐本地配置字段和 rules,不下载 rule-provider,不请求泄露测试网站。
- UI 和日志展示订阅 URL 时必须使用脱敏结果。
每次网络请求必须记录本地审计日志:
- 触发来源
- 请求类型
- 目标域名或 URL 摘要
- 开始时间
- 结束时间
- 成功或失败
- 错误类型
日志不得包含代理节点密码、完整订阅 URL token 或本地 YAML 内容。
网络行为必须在 UI 中可见:
- 订阅刷新状态
- 测速任务状态
- 连通性检查状态
- provider 检查状态
- 最近错误信息