dsh-webui-oauth 0.6.7 → 0.6.8

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.
Files changed (3) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/index.js +20 -11
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,33 @@
2
2
 
3
3
  本文件记录每个版本的**用户可见**变更。破坏性变更与升级动作单独标注。
4
4
 
5
+ ## 0.6.8
6
+
7
+ 修复 0.6.7 引入的回归:**登录成功后 `/api` 恒 401**。
8
+
9
+ ### 修复:/api 的 loopback 伪装在包装时被固化
10
+
11
+ - **现象**:升级到 0.6.7 后可以正常登录、页面也能打开,但所有 `/api` 请求一律 401;
12
+ 回退到 0.6.6 立即恢复。
13
+ - **原因**:0.6.7 为了让新装的插件"注册即上闸门",接管了 webServer 三张路由表的
14
+ `set`。这改变了包装时机——`/api` 可能在 `client-connection` 服务对本插件上下文
15
+ **尚不可见**时就被包装。旧代码在**包装那一刻**判定一次 `coreHasRequestGate`,
16
+ 于是把"这是旧核心"永久固化下来,之后每个 `/api` 请求都走 loopback 伪装:
17
+ `Host` 被改写成 `127.0.0.1`、`Origin` 被删除。
18
+ 而 alpha.2+ 核心的浏览器 Cookie **按 Host authority 绑定**,改写后查不到对应
19
+ Cookie,核心随即 401。登录与页面走的是 `/`,不经过这段伪装,所以"能登录、只有
20
+ `/api` 坏"。
21
+ - **修复**:把判定改为**每次请求现查** `ctx.get('connection').requestRejection`,
22
+ 不再在包装时定死。路由注册的先后顺序、服务就绪的时序都不再影响结果。
23
+ 旧核心(始终没有 `requestRejection`)仍保留 loopback 伪装,行为不变。
24
+
25
+ ### 测试
26
+
27
+ - `test/gate-default-deny.test.mjs` 新增 6 项:
28
+ - 安装时 `connection` 不可见、之后才就绪 → `/api` 的 `Host`/`Origin` 必须保持原样;
29
+ - 旧核心(始终无 `requestRejection`)→ 仍然改写 Host / 删除 Origin,确保修复没误伤。
30
+ - 全量 17 个测试文件、444 项断言通过。
31
+
5
32
  ## 0.6.7
6
33
 
7
34
  安全修复:路由闸门由**黑名单**改为**默认拒绝的白名单**。此前只包 `/api` 与
package/index.js CHANGED
@@ -1200,26 +1200,35 @@ function installRouteGate(ctx, checkRequest, log) {
1200
1200
  const undos = []
1201
1201
  let undone = false
1202
1202
 
1203
+ // alpha.2 起核心自带 Connection 浏览器认证(BrowserAuth + trusted-host fence):
1204
+ // /api handler 内建 requestRejection,且 browser cookie 按 Host authority 绑定 ——
1205
+ // 再改写 Host/Origin 会破坏 cookie 匹配。仅旧核心(无 connection.requestRejection)
1206
+ // 需要 loopback 伪装来通过 PRIVILEGED_METHODS fence。
1207
+ //
1208
+ // 【必须按请求判定,不能在包装时判定一次】。0.6.7 引入了"注册瞬间上闸门"
1209
+ // (接管路由表的 set),这使得 /api 可能在 client-connection 服务尚未对本站
1210
+ // 上下文可见时就被包装。若此时把 coreHasRequestGate 固化为 false,
1211
+ // useDeputy 就永久为 true:之后每个 /api 请求都被改写成回环 Host,
1212
+ // 而核心的 authority 绑定 Cookie 随之失配 —— 表现为"登录成功后 /api 恒 401"。
1213
+ // 这是 0.6.7 的回归,改为每次请求现查即可消除对服务就绪时序的依赖。
1214
+ const coreHasRequestGate = () => {
1215
+ try {
1216
+ const connection = ctx.get('connection')
1217
+ return !!(connection && typeof connection.requestRejection === 'function')
1218
+ } catch (e) {
1219
+ return false
1220
+ }
1221
+ }
1203
1222
  const wrapHttp = (route, opts) => {
1204
1223
  const original = route.handler
1205
1224
  const loopbackDeputy = !!(opts && opts.loopbackDeputy)
1206
- // alpha.2 起核心自带 Connection 浏览器认证(BrowserAuth + trusted-host fence):
1207
- // /api handler 内建 requestRejection,且 browser cookie 按 Host authority 绑定 ——
1208
- // 再改写 Host/Origin 会破坏 cookie 匹配。仅旧核心(无 connection.requestRejection)
1209
- // 需要 loopback 伪装来通过 PRIVILEGED_METHODS fence。
1210
- let coreHasRequestGate = false
1211
- try {
1212
- const connection = ctx.get('connection')
1213
- coreHasRequestGate = !!(connection && typeof connection.requestRejection === 'function')
1214
- } catch (e) { coreHasRequestGate = false }
1215
- const useDeputy = loopbackDeputy && !coreHasRequestGate
1216
1225
  const wrapped = async (req, res) => {
1217
1226
  if (!checkRequest(req)) {
1218
1227
  res.writeHead(401, { 'content-type': 'text/plain; charset=utf-8' })
1219
1228
  res.end('unauthorized')
1220
1229
  return
1221
1230
  }
1222
- if (useDeputy) {
1231
+ if (loopbackDeputy && !coreHasRequestGate()) {
1223
1232
  // Authenticated + this is the /api surface on a legacy core: present the request
1224
1233
  // to the core as loopback so PRIVILEGED_METHODS' strict fence (settings.*,
1225
1234
  // credentials.*, agentPreset.*, llm.discoverModels) admits it. Our session gate
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-webui-oauth",
3
- "version": "0.6.7",
3
+ "version": "0.6.8",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "scripts": {