mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-01 20:23:36 +00:00
- Introduced a restricted file system wrapper to ensure all file operations are confined to the script's directory, enhancing security. - Updated various modules to utilize the new secure file system methods, replacing direct fs calls with validated operations. - Enhanced path validation in the server routes and context loaders to prevent unauthorized access to the file system. - Adjusted environment variable handling to use centralized methods for reading and writing API keys, ensuring consistent security practices. This change improves the overall security posture of the application by enforcing strict file access controls and validating paths before any operations are performed.
60 lines
1.8 KiB
TypeScript
60 lines
1.8 KiB
TypeScript
/**
|
|
* POST /validate-path endpoint - Validate and add path to allowed list
|
|
*/
|
|
|
|
import type { Request, Response } from 'express';
|
|
import * as secureFs from '../../../lib/secure-fs.js';
|
|
import path from 'path';
|
|
import { isPathAllowed, PathNotAllowedError, getAllowedRootDirectory } from '@automaker/platform';
|
|
import { getErrorMessage, logError } from '../common.js';
|
|
|
|
export function createValidatePathHandler() {
|
|
return async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const { filePath } = req.body as { filePath: string };
|
|
|
|
if (!filePath) {
|
|
res.status(400).json({ success: false, error: 'filePath is required' });
|
|
return;
|
|
}
|
|
|
|
const resolvedPath = path.resolve(filePath);
|
|
|
|
// Validate path against ALLOWED_ROOT_DIRECTORY before checking if it exists
|
|
if (!isPathAllowed(resolvedPath)) {
|
|
const allowedRoot = getAllowedRootDirectory();
|
|
const errorMessage = allowedRoot
|
|
? `Path not allowed: ${filePath}. Must be within ALLOWED_ROOT_DIRECTORY: ${allowedRoot}`
|
|
: `Path not allowed: ${filePath}`;
|
|
res.status(403).json({
|
|
success: false,
|
|
error: errorMessage,
|
|
isAllowed: false,
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Check if path exists
|
|
try {
|
|
const stats = await secureFs.stat(resolvedPath);
|
|
|
|
if (!stats.isDirectory()) {
|
|
res.status(400).json({ success: false, error: 'Path is not a directory' });
|
|
return;
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
path: resolvedPath,
|
|
isAllowed: true,
|
|
});
|
|
} catch {
|
|
res.status(400).json({ success: false, error: 'Path does not exist' });
|
|
}
|
|
} catch (error) {
|
|
logError(error, 'Validate path failed');
|
|
res.status(500).json({ success: false, error: getErrorMessage(error) });
|
|
}
|
|
};
|
|
}
|