60 lines
1.9 KiB
TypeScript
60 lines
1.9 KiB
TypeScript
import { afterEach, expect, test } from 'bun:test'
|
|
|
|
import { getEmptyToolPermissionContext } from '../../Tool.js'
|
|
import { SandboxManager } from '../../utils/sandbox/sandbox-adapter.js'
|
|
import { bashToolHasPermission } from './bashPermissions.js'
|
|
|
|
const originalSandboxMethods = {
|
|
isSandboxingEnabled: SandboxManager.isSandboxingEnabled,
|
|
isAutoAllowBashIfSandboxedEnabled:
|
|
SandboxManager.isAutoAllowBashIfSandboxedEnabled,
|
|
areUnsandboxedCommandsAllowed: SandboxManager.areUnsandboxedCommandsAllowed,
|
|
getExcludedCommands: SandboxManager.getExcludedCommands,
|
|
}
|
|
|
|
afterEach(() => {
|
|
SandboxManager.isSandboxingEnabled =
|
|
originalSandboxMethods.isSandboxingEnabled
|
|
SandboxManager.isAutoAllowBashIfSandboxedEnabled =
|
|
originalSandboxMethods.isAutoAllowBashIfSandboxedEnabled
|
|
SandboxManager.areUnsandboxedCommandsAllowed =
|
|
originalSandboxMethods.areUnsandboxedCommandsAllowed
|
|
SandboxManager.getExcludedCommands = originalSandboxMethods.getExcludedCommands
|
|
})
|
|
|
|
function makeToolUseContext() {
|
|
const toolPermissionContext = getEmptyToolPermissionContext()
|
|
|
|
return {
|
|
abortController: new AbortController(),
|
|
options: {
|
|
isNonInteractiveSession: false,
|
|
},
|
|
getAppState() {
|
|
return {
|
|
toolPermissionContext,
|
|
}
|
|
},
|
|
} as never
|
|
}
|
|
|
|
test('sandbox auto-allow still enforces Bash path constraints', async () => {
|
|
;(globalThis as unknown as { MACRO: { VERSION: string } }).MACRO = {
|
|
VERSION: 'test',
|
|
}
|
|
|
|
SandboxManager.isSandboxingEnabled = () => true
|
|
SandboxManager.isAutoAllowBashIfSandboxedEnabled = () => true
|
|
SandboxManager.areUnsandboxedCommandsAllowed = () => true
|
|
SandboxManager.getExcludedCommands = () => []
|
|
|
|
const result = await bashToolHasPermission(
|
|
{ command: 'cat ../../../../../etc/passwd' },
|
|
makeToolUseContext(),
|
|
)
|
|
|
|
expect(result.behavior).toBe('ask')
|
|
expect(result.message).toContain('was blocked')
|
|
expect(result.message).toContain('/etc/passwd')
|
|
})
|