You've already forked agentic-coding-workflow
ACP / MCP 完善
This commit is contained in:
@@ -94,6 +94,37 @@ func TestResolveSafePath_NonexistentInsideOK(t *testing.T) {
|
||||
got, err := acp.ResolveSafePath(tmp, want)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, want, got)
|
||||
|
||||
// 多级不存在的中间目录(祖先均为 cwd 内真实目录)同样合法,不能误杀
|
||||
want = filepath.Join(tmp, "newdir", "sub", "newfile.txt")
|
||||
got, err = acp.ResolveSafePath(tmp, want)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, want, got)
|
||||
}
|
||||
|
||||
// 父目录是指向外部的 symlink 且叶子文件不存在 → 必须被拒,
|
||||
// 否则 fs/write_text_file 会跟随 symlink 把新建文件写出 worktree。
|
||||
func TestResolveSafePath_SymlinkDirEscapeNonexistentLeaf(t *testing.T) {
|
||||
t.Parallel()
|
||||
tmp := t.TempDir()
|
||||
outside := t.TempDir()
|
||||
|
||||
link := filepath.Join(tmp, "link-dir")
|
||||
if err := os.Symlink(outside, link); err != nil {
|
||||
t.Skipf("symlink not supported on this platform: %v", err)
|
||||
}
|
||||
|
||||
// 叶子不存在
|
||||
_, err := acp.ResolveSafePath(tmp, filepath.Join(link, "newfile.txt"))
|
||||
ae, ok := errs.As(err)
|
||||
require.True(t, ok)
|
||||
assert.Equal(t, errs.CodeAcpFsPathOutsideWorktree, ae.Code)
|
||||
|
||||
// 叶子与中间目录都不存在(symlink 是更远的祖先)同样被拒
|
||||
_, err = acp.ResolveSafePath(tmp, filepath.Join(link, "sub", "newfile.txt"))
|
||||
ae, ok = errs.As(err)
|
||||
require.True(t, ok)
|
||||
assert.Equal(t, errs.CodeAcpFsPathOutsideWorktree, ae.Code)
|
||||
}
|
||||
|
||||
func TestResolveSafePath_RelativeCwdRejected(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user