Skip to content

🔒 限制 Agent OPFS 写操作至 workspace 并支持重命名与移动#1578

Draft
cyfung1031 wants to merge 1 commit into
scriptscat:mainfrom
cyfung1031:codex/fix-1572-agent-opfs-permissions
Draft

🔒 限制 Agent OPFS 写操作至 workspace 并支持重命名与移动#1578
cyfung1031 wants to merge 1 commit into
scriptscat:mainfrom
cyfung1031:codex/fix-1572-agent-opfs-permissions

Conversation

@cyfung1031

@cyfung1031 cyfung1031 commented Jul 12, 2026

Copy link
Copy Markdown
Collaborator

Checklist / 检查清单

  • Fixes the Agent OPFS permission issue
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

背景

Agent OPFS 浏览器此前从 OPFS 根目录开始浏览,并在任意目录提供上传和删除操作。这样会暴露 ScriptCat 的系统数据,用户也可能误修改或删除系统资源,导致扩展无法正常运行。

本次改动

  • agents/workspace/** 设为唯一可修改范围;OPFS 根目录及其他系统目录保持只读。
  • 只读目录仍可浏览,文件仍可预览和下载,同时隐藏上传、删除、重命名和移动操作,并显示只读提示。
  • 在可编辑工作区内新增文件和目录的重命名、移动功能。
  • 在文件系统辅助层统一校验上传、删除、重命名和移动权限,避免只依赖 UI 隐藏操作。
  • 移动操作同时校验源目录和目标目录,任一路径不在 agents/workspace/** 内都会拒绝。
  • 增加非法路径、非法名称、目标同名冲突以及将目录移动到自身内部等边界校验。
  • 为所有支持的语言补充只读、重命名和移动相关文案。

实现说明

UI 与底层文件系统操作共享同一套 workspace 路径判断。writeFileremoveEntryrenameEntrymoveEntry 都会在执行前验证可编辑路径和条目名称。

重命名复用移动逻辑;移动通过递归复制后删除源条目实现,并在复制前检查目标是否已存在。源目录与目标目录都必须位于 agents/workspace/**,且不允许将目录移动到自身或其子目录中。

验证

  • OPFS 定向测试:21/21 通过。
  • 完整 Vitest:289 个测试文件、3,089 个测试通过。
  • TypeScript typecheck 通过。
  • ESLint、Prettier 和 git diff --check 通过。

建议审查重点

  • 系统目录是否始终只读,同时保留浏览、预览和下载能力。
  • UI 与底层辅助函数是否一致限制所有修改操作至 agents/workspace/**
  • 移动时源目录和目标目录的双重权限检查。
  • 重命名、目录递归移动、同名目标和目录自包含移动的边界行为。

Closes #1572

@cyfung1031 cyfung1031 changed the title 🔒 限制 Agent OPFS 浏览器的修改权限 🔒 限制 Agent OPFS 写操作至 workspace 并支持重命名与移动 Jul 12, 2026
@cyfung1031 cyfung1031 added enhancement New feature or request security labels Jul 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request security

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Proposal] Agent OPFS Browser should not have the access / edit right to entire ScriptCat OPFS

1 participant