dsh-secure-context-fix:修复局域网 HTTP 环境下的 Web GUI 无法加载问题

前言

DeepSeek Harness (DSH) 的 Web GUI 提供了便捷的交互界面,但浏览器的安全策略限制了部分功能。crypto.randomUUID 仅在安全上下文(HTTPS 或 localhost)中存在。当你在局域网内通过纯 HTTP 访问 DSH(例如从手机访问 http://192.168.x.x:3080)时,浏览器无法识别该函数,导致 RPC 调用崩溃。这表现为工作区列表无法加载、目录选择器失效、会话无法创建,而本地 http://127.0.0.1:3080 则正常工作。

这是什么

dsh-secure-context-fix 是一个由 Li-Mingshuang 维护的小型 DSH 插件。它通过注册 webServer.tapIndex 变换,在 DSH bundle 代码运行前,向 Web GUI 的 HTML 页面注入一段脚本。该脚本提供了一个基于 crypto.getRandomValues() 的 crypto.randomUUID 实现,从而在非安全上下文(HTTP)下恢复该函数的功能。

核心功能

  • 注入 polyfill:在 DSH bundle 代码执行前,注入 crypto.randomUUID 的实现。
  • HTTP 局域网支持:允许 Web GUI 在非 HTTPS 环境下(如 LAN HTTP)正常工作。
  • 注册变换:通过 webServer.tapIndex 机制拦截并修改 HTML 输出。
  • 无侵入性:无需修改官方源码,无需构建步骤。

安装与启用

在包含插件包的目录下执行以下命令安装:

dsh plugin --profile web add ./dsh-secure-context-fix

安装完成后,重启 Web 配置文件以加载插件:

dsh --profile web

配置与使用

要让 Web GUI 在局域网内被访问,必须将服务绑定到所有网络接口。由于 DSH CLI 默认出于安全考虑拒绝 --host 0.0.0.0,需通过配置文件进行修改。

  1. 配置绑定地址:
    在 web 配置文件中添加或修改以下 cordis.patch.yml 内容:
    # $DSH_HOME/profiles/web/cordis.patch.yml
    - id: webserver
      config:
        host: '0.0.0.0'
        port: !!js ctx.webStartup.port ?? 3080
  1. 配置防火墙:
    建议仅允许局域网子网访问,避免直接暴露。以下 PowerShell 命令将规则限制在 192.168.0.0/24 网段:
    New-NetFirewallRule -DisplayName "dsh web 3080 (LAN)" -Direction Inbound -Protocol TCP -LocalPort 3080 -Action Allow -Profile Private -RemoteAddress 192.168.0.0/24
  1. 访问:
    确保手机与 DSH 设备在同一 Wi-Fi 下,打开浏览器访问 http://<your-LAN-IP>:3080。此时工作区列表、目录选择器及会话创建功能应恢复正常。

安全与注意

  • 权限风险:将 Web GUI 绑定到 0.0.0.0 会向任何能访问该端口的人暴露远程代码执行级别的控制权。
  • 网络隔离:务必使用防火墙规则限制访问源,仅允许受信任的局域网子网访问端口 3080。
  • 安装来源:从 Git 仓库安装时,若包包含 prepare 脚本,首次安装可能需要允许构建(此插件不包含构建步骤,故无需允许)。

结尾

这是一个临时性的修复方案,旨在解决 GitHub 讨论区反馈的问题,直到官方仓库将 crypto.randomUUID 的调用替换为 getRandomValues()。对于无法修改源码的用户,该插件提供了直接可用的解决方案。

目录页:dsh-secure-context-fix - SkillHub
源码地址:dsh-secure-context-fix - GitHub

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜