fix(t115 🔴🔴🔴 三修): kbdb 認證完全 fail-closed——沒金鑰一律 401(含讀取)
leo 實證的洞=「知道網址即可讀走全部知識」;一修 fail-open(沒設 secret 就不擋)、 二修仍放行讀取=洞沒補。三修(總管手改):無 token→全部 401(health 豁免), 老實例升級路徑=重跑安裝器(同時注入金鑰與新 workflow),不以繼續外洩換相容。 +結構閘測試:斷言 src/index.ts 的無 token 分支不得有 return next()—— 擋「測試複本與真實作漂移」那類假綠(本輪正是它抓到二修的複本沒同步)。 kbdb vitest 60/60 全綠(總管親跑)。
This commit is contained in:
@@ -178,6 +178,43 @@
|
||||
驗證:findBestNodeMatch 6 案(空清單/無命中/精確子字串/多命中取最短/CJK 未正規化/大小寫)+
|
||||
integration 4 案(有鄰居直接回、0 鄰居 fuzzy 命中、0 鄰居 fuzzy 無命中誠實回 0、t95+t96 連動)。
|
||||
|
||||
- [x] **t97 庫目錄只顯示用戶同步進來的(2026-07-28,任務層小改)**:
|
||||
來源=leo 裁定「用戶沒加上的庫,不要自作主張給它加上」。
|
||||
t97a:bootstrap 後不再預埋 `kb` 庫(index.html firstsetup 移除 POST /portal/admin/libraries 種子 call)。
|
||||
t97b:GET /portal/admin/libraries auto 段新增 `n === 'general'` 過濾——general 是系統「未標庫」
|
||||
fallback 桶,不是用戶加的,不在目錄露臉;資料照舊、B5 權限語意不動。
|
||||
驗證:portal-admin.test.ts 新增「auto 過濾 general」1 案(mock KBDB /entries/libraries → ['kb','general','notes'],
|
||||
回應 names 含 kb/notes,不含 general)。
|
||||
|
||||
- [x] **t114 拿掉「登記到目錄」兩段式(2026-07-28,任務層小改)**:
|
||||
來源=leo 裁定「掃進來的就是要進目錄…加入目錄這件小事還要分兩段做?是在攻打用戶嗎」。
|
||||
修:`renderAdminLibs()` 拿掉 auto/已登記視覺分岔,auto 庫直接以完整卡片顯示(保留「同步自動出現」tag,
|
||||
去掉「登記到目錄後可以改顯示名」描述文字);移除「登記到目錄」按鈕與 lib-adopt event handler;
|
||||
空狀態文字改「同步小幫手還沒送來任何庫…庫會自動出現在這裡」。
|
||||
顯示名:此輪 auto 庫唯讀(與已登記庫現行行為一致,實作成本最低;後續若需可補 auto-adopt on PATCH)。
|
||||
搜尋不依賴登記(搜尋走 /portal/data/search → server 注入 library filter,與庫目錄登記簿無關)。
|
||||
驗證:HTML 殼測試補「無 lib-adopt、無登記到目錄」斷言;既有 HTML 斷言(零租戶字串等)不回退。
|
||||
|
||||
- [x] **t115 kbdb 全域認證中介層(2026-07-28,安全洞熱修;二修 2026-07-28)**:
|
||||
實證:不帶任何憑證直打 `arcrun-kbdb.<sub>.workers.dev/entries` → 200 回真實知識;POST 直寫
|
||||
成功。B5 權限做在 cypher/portal 層,繞過 portal 直打 kbdb 全破,隱私賣點(原文不出機)形同虛設。
|
||||
一修(已在樹上)兩個缺陷:① `if (env.KBDB_INTERNAL_TOKEN)` 才擋 = 沒設 secret 洞照開(fail-open);
|
||||
② workflows/rag-ingest-card.local.yaml(arcrun-rag repo)有 3 處 `__KBDB_BASE__`
|
||||
(post_block/post_triplet 走 http_request 直打 kbdb),rag-chat/graph-neighbors/takedown 同樣;
|
||||
token 生效後收卡與查詢全 401。
|
||||
二修(本次):
|
||||
① `kbdb/src/index.ts` middleware 改 fail-closed:
|
||||
- 未設 token → POST/PATCH/DELETE/PUT 直接 401(fail-closed for writes);
|
||||
GET 記 console.warn 後放行(讀取升級窗口,老實例不整個炸)。
|
||||
- 已設 token → 非 health 路由全部要求 Bearer(行為同一修)。
|
||||
② `kbdb/tests/auth.test.ts` 改 12 項(含 PATCH/DELETE 無 token→401;原「無 token POST 過」改為 401)。
|
||||
③ `kbdb/src/types.ts`+`kbdb/wrangler.toml` 說明改為 fail-closed 語意。
|
||||
④ workflow http_request 節點(arcrun-rag 側):規格見本項末「給安裝器的規格」段,由總管派 arcrun-rag。
|
||||
cypher 不需改(五處已有 `if (KBDB_INTERNAL_TOKEN) headers[Authorization]=Bearer`)。
|
||||
老實例升級路徑:安裝器部署時自動生成同一把 token → `wrangler secret put KBDB_INTERNAL_TOKEN` 注入
|
||||
kbdb 與 cypher 兩個 worker;workflow yaml 同批替換 `__KBDB_TOKEN__`(見規格)即封口。
|
||||
kbdb_upsert_block WASM 指向死路由 `/blocks`(設 token 前後都壞,不新增破壞)。
|
||||
|
||||
## 第二波(不在本 SDD 動工範圍,掛號)
|
||||
|
||||
- MCP token 綁庫集合(design §9;PR#15 擴充,只動 `mcp/`)
|
||||
|
||||
Reference in New Issue
Block a user