Skip to content

点击对话中工作区外的文件引用报 403 path is outside workspace,期望降级为只读预览或回退系统打开 #532

Description

@MoTingFeng

问题描述

点击对话中指向当前会话工作区之外的文件引用时,文件工作台(better-sidebar)会直接报错:

path "..." is outside workspace

而不是提供可用兜底(只读预览 / 系统编辑器打开 / 在资源管理器中定位)。

复现步骤

  1. 启动一个 DSH web 会话,工作区为任意项目目录(如 /home/user/project-a)。
  2. 让助手在对话中引用一个工作区外的文件(例如用户目录下其他位置的文件:~/.some-dir/some-file.md),并渲染成可点击的文件引用。
  3. 点击该引用。
  4. better-sidebar 文件工作台报 403:path "..." is outside workspace

期望行为

对话里的文件引用并不保证位于会话工作区内。点击后应优雅降级,而不是抛裸 403:

  • 只读预览该文件(放开工作区外的访问,同时保持仍被围栏限制),或
  • 回退到原 workspaces.openPath(系统默认方式打开),或
  • 至少提供内联操作(如「在系统编辑器中打开」/「在资源管理器中定位」)并配清晰提示。

根因(代码层面,供维护者参考)

拦截点位于 lib/index.js

async function assertWithinWorkspace(workspace, target) {
  if (!isWithin(workspace, target))
    throw new SidebarError("forbidden", `path "${target}" is outside workspace`, 403);
}

所有读路径(readText、媒体路由、编辑器打开)都经 ensureWorkspacePath(cwd, ...) 校验,cwd 取自会话 header / 客户端 cwd / 持久化 meta / process.cwd()(见 sessionCwdOf)。目前没有任何配置可添加额外工作区根或外部目录(PrefsSchema / host Config 只有大小限制、终端、浏览器、tab/viewer 开关,没有路径相关项);且 interceptOpenPath: true(默认)会让所有对话文件打开都走侧边栏,因此工作区外文件引用必然触发此错误。

可选的实现方向

  1. 增加可选的白名单/附加根目录配置(宿主配置或按会话设置),列出允许在工作区外只读打开(或限制在 readLimit / mediaLimit 内)的目录。
  2. 拦截时若目标在工作区外,回退到原始 workspaces.openPath(系统打开),而不是抛错。
  3. 只读放开工作区外的绝对路径读取(读已被 readLimit / mediaLimit 限制),写路径继续保持围栏。

如果上面某个方向可行,我可以提供补丁。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions