dsh-deepseek-web-login 0.7.2 → 0.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,77 @@
2
2
 
3
3
  本项目大致遵循语义化版本;日期为本地时间。
4
4
 
5
+ ## 0.7.4 — 2026-10-10
6
+
7
+ **收窄 0.7.3 的 `--no-sandbox`:只给 headless 传输层,登录窗口保持 sandbox。**
8
+
9
+ ### 0.7.3 的问题
10
+
11
+ `--no-sandbox` 被加进 `buildBrowserArgs()`,而那个函数**被两处共用**:
12
+
13
+ | 调用点 | 用途 | 该不该关 sandbox |
14
+ |---|---|---|
15
+ | `browser-login.ts:538` | **登录窗口**(可见真实浏览器,用户在里面手动输密码) | ❌ 不该 |
16
+ | `browser-transport.ts:193` | 请求代理(headless 后台,只请求 `about:blank`) | ✅ Linux/CI 需要 |
17
+
18
+ ⇒ 0.7.3 **连登录窗口的 sandbox 也关了**。sandbox 是浏览器跑第三方网页代码时的进程隔离,
19
+ 而登录窗口要加载 DeepSeek 真实页面 —— **那才是真正扩大攻击面**。
20
+ (0.7.3 的 CHANGELOG 写"攻击面不因此变大",**那句话不准确**,这里更正。)
21
+
22
+ ### 现在
23
+
24
+ `--no-sandbox` 移到新函数 `transportExtraArgs()`,**只有 headless 传输层**调用它。
25
+ 传输层不加载任何第三方页面、只发 HTTP ⇒ 关 sandbox 的收益(Linux/CI 可用)大于代价。
26
+
27
+ ### 守卫
28
+
29
+ 三条,缺一不可:
30
+
31
+ 1. `transportExtraArgs()` 里**必须**有 `--no-sandbox`(否则 Linux/CI 起不来);
32
+ 2. `buildBrowserArgs()` 里**必须没有**(登录窗口要用);
33
+ 3. **传输层的 spawn 必须真的调用它** —— 前两条只断函数内容,断不了"调用点被删"。
34
+
35
+ 三条都做过变异验证(挪位置 / 拿掉内容 / 删调用行,各自打红)。
36
+
37
+ ### 验证
38
+
39
+ `tsc` / build / 产物 / 17 项登录 / 8 项新守卫 / 隔离 / `check-browser-transport`(真启浏览器)/ **67/67** 全过。
40
+
41
+ ## 0.7.3 — 2026-10-10
42
+
43
+ **修好 Linux/CI 上浏览器起不来的问题**(0.7.2 只在 ubuntu-latest 上挂,macOS / Windows 同 commit 通过)。
44
+
45
+ ### 根因:启动参数缺 `--no-sandbox`
46
+
47
+ `buildBrowserArgs`(`browser-login.ts:75`)没有 `--no-sandbox`。
48
+ 而**在 Linux 上跑浏览器的人只有两种**:root(容器 / CI runner)
49
+ 或没有 user namespace 权限的普通用户 —— **两种都起不来**。
50
+
51
+ 症状极具误导性:
52
+
53
+ ```
54
+ x 浏览器 fetch 可发送 POST 并读取响应: 浏览器调试端口未就绪
55
+ ```
56
+
57
+ 看起来像超时,实际是**启动失败** —— `waitForTransportDebugPort` 等满 25s 拿不到
58
+ `DevToolsActivePort`。⚠️ **调大那个超时只会掩盖真问题**(本次就没那样做)。
59
+
60
+ 该 flag 在 Windows / macOS 上无害(会被忽略),所以无条件带上。
61
+
62
+ ⚠️ 它降低的是**本机**进程隔离强度;本插件本来就用自己的 profile 跑 headless 浏览器、
63
+ 不加载用户日常 profile,攻击面不因此变大。
64
+
65
+ ### 顺带:那条用例加了重试(双保险)
66
+
67
+ `check-browser-transport.mjs` 的第 4 条是**第一个真拉浏览器**的用例(后面的 FormData 复用同一实例),
68
+ 冷启动开销全压在这里。按项目既有约定(`check-devtools.mjs:132`)加了「重试两次、两次都失败才算坏」,
69
+ 并在改造时**漏掉了 `finally` 收尾**(⇒ 端口与浏览器进程泄漏),已补回 try/finally。
70
+
71
+ ### 验证
72
+
73
+ `buildBrowserArgs` 新增行为断言(变异验证:拿掉 `--no-sandbox` 立刻红)。
74
+ `tsc` / build / 产物 / 隔离 / **67/67** 全过。
75
+
5
76
  ## 0.7.2 — 2026-10-10
6
77
 
7
78
  **修好外部审查报出的 8 条缺陷**(P1×3 / P2×4 / P3×1)。审查给了行号、复现脚本与置信度标注,
package/lib/index.js CHANGED
@@ -3994,6 +3994,29 @@ function buildBrowserArgs(profileDir, url) {
3994
3994
  url
3995
3995
  ];
3996
3996
  }
3997
+ /**
3998
+ * 只给 **headless 请求代理**追加的启动参数(0.7.3)。
3999
+ *
4000
+ * ## 为什么需要 `--no-sandbox`
4001
+ *
4002
+ * headless Chrome 在 Linux 上默认要 sandbox,而 Linux 上跑浏览器的人只有两种:
4003
+ * root(容器 / CI runner)或没有 user namespace 权限的普通用户 —— **两种都起不来**。
4004
+ * 症状伪装成「浏览器调试端口未就绪」(等满 25s 拿不到 `DevToolsActivePort`),
4005
+ * 看起来像超时、实际是启动失败 ⇒ **别去调大那个超时**,那只会掩盖真问题。
4006
+ *
4007
+ * ## 为什么只给传输层
4008
+ *
4009
+ * sandbox 是浏览器里跑第三方网页代码时的进程隔离。**登录窗口会加载 DeepSeek 的真实页面、
4010
+ * 用户还在里面手动输密码** —— 关掉它的 sandbox 才是真正扩大攻击面。
4011
+ * 传输层只请求 `about:blank` + 发 HTTP、**不加载任何第三方页面**,
4012
+ * 所以关掉它的 sandbox 换来的收益(Linux/CI 可用)大于代价。
4013
+ *
4014
+ * ⚠️ 若哪天登录窗口也要在 Linux 上跑,应在这里按 `headless` 判定,
4015
+ * **而不是把 flag 挪进 `buildBrowserArgs`**(那会连带关掉登录窗口的)。
4016
+ */
4017
+ function transportExtraArgs() {
4018
+ return ["--no-sandbox"];
4019
+ }
3997
4020
  /** 解析 `<profile>/DevToolsActivePort`:第一行是端口;容忍 CRLF 与附带内容。 */
3998
4021
  function parseDevToolsActivePort(text) {
3999
4022
  const first = String(text ?? "").split(/\r?\n/)[0]?.trim();
@@ -4676,6 +4699,7 @@ async function launchBrowserTransport() {
4676
4699
  }
4677
4700
  const child = spawn(browser.path, [
4678
4701
  ...buildBrowserArgs(PROFILE_DIR, "about:blank"),
4702
+ ...transportExtraArgs(),
4679
4703
  "--headless=new",
4680
4704
  "--disable-gpu",
4681
4705
  "--disable-dev-shm-usage",
@@ -10911,7 +10935,7 @@ async function checkForUpdate(current, fetchImpl) {
10911
10935
  * 兜底常量与 package.json 的一致性由 `tests/check-smoke.mjs` 守着,不会漂。
10912
10936
  */
10913
10937
  /** 与 package.json 保持一致的兜底版本(由测试保证不会漂)。 */
10914
- const FALLBACK_VERSION = "0.7.2";
10938
+ const FALLBACK_VERSION = "0.7.4";
10915
10939
  let cached;
10916
10940
  /** 本插件版本(如 `0.1.26`)。 */
10917
10941
  function pluginVersion() {