Download packages/core/src/sandbox/utils/sandboxReadWriteUtils.ts from SaylorTwift/gemini-cli: direct link, hf CLI and curl.
- Browser
- Download file 2.49 kB
-
https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/packages/core/src/sandbox/utils/sandboxReadWriteUtils.ts
- Command line
-
hf download hf://SaylorTwift/gemini-cli/packages/core/src/sandbox/utils/sandboxReadWriteUtils.ts
-
curl -L -o sandboxReadWriteUtils.ts https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/packages/core/src/sandbox/utils/sandboxReadWriteUtils.ts
2.49 kB
| /** | |
| * @license | |
| * Copyright 2026 Google LLC | |
| * SPDX-License-Identifier: Apache-2.0 | |
| */ | |
| import * as path from 'node:path'; | |
| import { | |
| type SandboxPermissions, | |
| type SandboxRequest, | |
| } from '../../services/sandboxManager.js'; | |
| import { isValidPathString } from '../../utils/paths.js'; | |
| /** | |
| * Validates if the requested paths are within the allowed workspace or allowed paths. | |
| */ | |
| function validatePaths( | |
| paths: string[], | |
| workspace: string, | |
| allowedPaths: string[], | |
| ): boolean { | |
| for (const p of paths) { | |
| if (!isValidPathString(p)) { | |
| return false; // Reject malicious paths | |
| } | |
| const resolvedPath = path.resolve(p); | |
| const resolvedWorkspace = path.resolve(workspace); | |
| const isInsideWorkspace = | |
| resolvedPath.startsWith(resolvedWorkspace + path.sep) || | |
| resolvedPath === resolvedWorkspace; | |
| let isInsideAllowed = false; | |
| for (const allowed of allowedPaths) { | |
| const resolvedAllowed = path.resolve(allowed); | |
| if ( | |
| resolvedPath.startsWith(resolvedAllowed + path.sep) || | |
| resolvedPath === resolvedAllowed | |
| ) { | |
| isInsideAllowed = true; | |
| break; | |
| } | |
| } | |
| if (!isInsideWorkspace && !isInsideAllowed) { | |
| return false; // Path traversal or unauthorized access attempt | |
| } | |
| } | |
| return true; | |
| } | |
| export function handleReadWriteCommands( | |
| req: SandboxRequest, | |
| mergedAdditional: SandboxPermissions, | |
| workspace: string, | |
| allowedPaths: string[] = [], | |
| ): { command: string; args: string[] } { | |
| let finalCommand = req.command; | |
| let finalArgs = req.args; | |
| if (req.command === '__read') { | |
| finalCommand = '/bin/cat'; | |
| if (req.args.length > 0) { | |
| if (validatePaths(req.args, workspace, allowedPaths)) { | |
| mergedAdditional.fileSystem!.read!.push(...req.args); | |
| } else { | |
| throw new Error( | |
| `Sandbox Error: Path traversal or unauthorized access attempt detected in __read: ${req.args.join(', ')}`, | |
| ); | |
| } | |
| } | |
| } else if (req.command === '__write') { | |
| finalCommand = '/bin/sh'; | |
| finalArgs = ['-c', 'tee -- "$@" > /dev/null', '_', ...req.args]; | |
| if (req.args.length > 0) { | |
| if (validatePaths(req.args, workspace, allowedPaths)) { | |
| mergedAdditional.fileSystem!.write!.push(...req.args); | |
| } else { | |
| throw new Error( | |
| `Sandbox Error: Path traversal or unauthorized access attempt detected in __write: ${req.args.join(', ')}`, | |
| ); | |
| } | |
| } | |
| } | |
| return { command: finalCommand, args: finalArgs }; | |
| } | |