- Home
- Plugin
- Sicurezza e permessi
- dsh-trust-lan
dsh-trust-lan
cbalaa/dsh-trust-lan
DSH web plugin: a loopback-only General-settings switch that grants non-loopback (LAN) browsers Host settings persistence, through the trust-lan settings namespace and the remoteSettingsAccess gate consulted by the seam-patched dsh-client-ui-settings.
Installazione
dsh plugin --profile web add github:cbalaa/dsh-trust-lanREADME
dsh-trust-lan
DSH Web 插件:在「设置 → 通用」里增加一个只在回环页面(localhost/127.0.0.1)显示的开关。开关打开后,通过局域网地址(LAN IP)打开的页面也能持久化主机设置(模型、凭据等)——也就是把 DSH 刻意的"非回环页面只读"边界变成一个可选项。
默认关闭。关闭状态下行为与原版完全一致。
它解决什么问题
DSH 出于安全考虑,把 Web 页面分成两类:
- 回环页面(
localhost/127.0.0.1):设置读写都落盘到主机文档; - 局域网页面(例如
http://192.168.x.x:9000):设置镜像进入终态unavailable,写入在客户端直接短路,配置改了也不生效、也不落盘。
适合「端口层已有自己的访问控制、希望 LAN 页面也有完整配置能力」的环境——这个插件就是那个"开关"。
组成
| 部分 | 文件 | 作用 |
|---|---|---|
| 主机半(node) | src/index.ts | 注册 trust-lan 设置命名空间({ enabled: boolean },默认 false),这是开关的持久化载体 |
| 浏览器半 | src/client/ | 提供 remoteSettingsAccess 门控服务;在回环页面注册开关行;自己维护一份 describe 读取,让开关值实时生效 |
| seam 补丁 | patches/0001-*.patch | 给 packages/client/ui-settings 打的 4 处小改动,把"每页面一次性"的持久化决策变成"每次读写都重新解析",并新增对 remoteSettingsAccess 服务的咨询 |
数据流(开关打开的瞬间会发生什么)
回环页面点开关 ──mutate('trust-lan')──▶ 主机文档(enabled: true)
│
▼ settings/document-updated
插件 client 半重新 describe ──▶ access-store 更新 ──▶ onEnabledChange
│
▼ settingsScope.describe().ensure()
共享设置镜像重新解析持久化 ──▶ 'memory' → 'host',从 unavailable 重试读取
│
▼
当前页面(以及所有已打开的 LAN 页面,无需刷新)立即获得主机设置的读写
关闭开关走同一条链路,方向相反:镜像退回 unavailable,所有 LAN 页面立即回到只读进程内状态。
依赖:dsh-lan-access
本插件依赖 dsh-lan-access:它把 Web GUI 绑定到 0.0.0.0,并为非安全上下文(局域网 HTTP)注入 crypto.randomUUID polyfill——没有它就不存在「局域网页面」,本插件毫无用武之地。
package.json的dependencies已声明"dsh-lan-access": "^0.1.3"(版本契约 + 安装时自动拉取);- 但 DSH 的 bundle 层归并只认 profile 的直接依赖:
dsh plugin add只把命令行上点名、且声明了dsh.bundle.patch的包加进dsh.profile.bundles。作为本插件的传递依赖装进来的 dsh-lan-access 不会自动挂层,所以新 profile 需要显式装一次(见下)。
安装(dsh 插件管理器,npm 发布版)
插件已发布到 npm。dsh plugin add 转发到 profile 目录下的 pnpm add,随后归并 dsh.profile.bundles:本包声明了 dsh.bundle.patch,会自动挂到 bundle 栈——无需手改 cordis.patch.yml。
# 0.(前提)dsh-lan-access:把 Web GUI 绑到 0.0.0.0 + 局域网 HTTP 的 crypto polyfill
dsh plugin --profile web add dsh-lan-access
# 1. 安装本插件
dsh plugin --profile web add dsh-trust-lan
# 2. 给 harness 打 seam 补丁(必须,见下一节)
git clone https://github.com/CBalaa/dsh-trust-lan.git
cd dsh-trust-lan && ./scripts/apply-seam.sh
# 3. 重启 dsh web,浏览器强制刷新(Ctrl+Shift+R)
dsh web
验证:从 127.0.0.1 打开 设置 → 通用,应看到「允许局域网配置主机设置」开关(默认关);打开后,局域网页面无需刷新即获得主机设置的读写。
为什么还有第 2 步——DSH 在
dsh-client-ui-settings里把非回环页面的设置持久化硬编码为进程内只读。本插件提供开关值,但让 ui-settings 咨询这个开关需要一处 seam 补丁(对packages/client/ui-settings的 4 处小改动,见patches/0001-*.patch),随插件仓库分发。不打补丁时插件无害:开关照常可写,只是没人咨询它,LAN 页面保持只读。
要求——Node.js >= 20;harness checkout(打补丁用)。运行时依赖
dsh-lan-access;@deepseek-ai/cordis与react由 harness 运行环境提供(浏览器侧走模块表)。
seam 补丁(必读)
前提:本机有 deepseek-harness 的 checkout(git clone + 根目录 pnpm install)。apply-seam.sh 默认在 ~/gitprojects/deepseek-harness 找它,可用 DSH_HARNESS 指到别处。
./scripts/apply-seam.sh 会:
git apply补丁到packages/client/ui-settings(要求该目录无未提交改动);- 重建 harness 的 client 面(
pnpm run build:lib:client,较慢); - 默认把重建出的
dsh-client-ui-settings/lib/client.js同步进全局安装的 dsh(npm root -g下那份),并重启后生效;--no-sync跳过同步,改从 checkout 源码启动 GUI(pnpm dsh web,profile 数据共用)。
版本差异提醒:全局安装的 dsh 与 checkout 版本不同时,同步过去的是 checkout 版本的完整 ui-settings bundle(不止 seam 几行),脚本会打警告。harness 升级后补丁需重新应用(不再贴合时脚本会报错退出,不会静默失败)。撤销用 ./scripts/revert-seam.sh(反向补丁 + 重建 + 还原全局那份)。
安装(本地 checkout,开发用)
# 1. 构建插件(产物:lib/index.js + lib/client.js)
pnpm install && pnpm build
# 2. 装进 web profile(file:. 从 checkout 根目录执行,link 链接,改完 src 重新 build 即生效)
dsh plugin --profile web add file:.
# 3. seam 补丁 + 重启(同上)
./scripts/apply-seam.sh && dsh web
前提:
- harness checkout 在
~/gitprojects/deepseek-harness(可用DSH_HARNESS覆盖),packages/client/ui-settings无未提交改动; - checkout 内已执行过
pnpm install。
回滚
# 只关功能不动代码:设置页把开关关掉即可,LAN 页面立即回到只读
# 卸载插件:
dsh plugin --profile web remove dsh-trust-lan
# 撤销 seam(反向补丁 + 重建 + 还原全局那份 client.js):
./scripts/revert-seam.sh
安全模型
开箱状态(开关关闭)与原版一致:LAN 页面读不到主机设置文档,也写不进去。
打开开关意味着:
- 能访问该端口的所有设备都能读写完整的主机设置——模型、Base URL、API Key;
- 已有密钥仍然不可读(describe 走密钥脱敏),但可被替换:局域网内的攻击者可以把 Base URL 指向自己的中转、替换凭据,从而接管后续模型流量;
- 因此本插件只适合端口本身已有访问控制(防火墙、VPN、绑定特定网卡等)的环境;
- 开关行只在回环页面渲染,LAN 页面上看不到、也改不了这个开关本身。
开发
pnpm typecheck # tsc --noEmit(paths 指向 harness checkout 的构建产物)
pnpm test # vitest:access-store 门控/写入/唤醒契约
pnpm build # tsc 声明 + tsdown 双 bundle
seam 补丁在 harness 侧的验证记录:packages/client/ui-settings 家族 55/55 测试通过(含新增的 4 个动态门控用例),全仓 pnpm run typecheck 通过。
已知边界
- 未打 seam 补丁时插件无害:命名空间照常注册、开关照常可写,只是没有任何代码咨询它,LAN 页面保持只读。
trust-lan命名空间的 base 层默认值取自插件Config.enabled(默认false);用户文档一旦写过,以用户层为准。- 卸载
dsh-lan-access(或它不再绑0.0.0.0)后本插件自动失去意义——没有局域网页面,开关只是闲置。
Plugin correlati
dsh-infinite-gen-4
minglink/dsh-infinite-gen-4
api-relay-audit
toby-bridges/api-relay-audit
dsh-redteam-model
seaof0/dsh-redteam-model
dsh-auto-review
perrylink/dsh-auto-review