safe-commander-mcp
Version:
A secure MCP server for executing whitelisted development commands with comprehensive security controls and resource limits
105 lines (104 loc) • 5.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateStartupConfiguration = validateStartupConfiguration;
const command_validator_1 = require("../commands/command-validator");
const path_validator_1 = require("../security/path-validator");
const sanitizer_1 = require("../security/sanitizer");
const command_categorizer_1 = require("../commands/command-categorizer");
const config_loader_1 = require("./config-loader");
const logger_1 = require("../utils/logger");
/**
* Comprehensive startup validation
*
* @throws Error if any startup validation checks fail
*/
function validateStartupConfiguration() {
try {
(0, logger_1.log)("info", "Running startup validation checks...");
// Validate command categorization first
const categoryValidation = (0, command_categorizer_1.validateCommandCategories)(config_loader_1.CONFIG.ALLOWED_COMMANDS);
if (!categoryValidation.valid) {
(0, logger_1.log)("warn", "Some commands are missing categorization or descriptions", {
missingCategories: categoryValidation.missingCategories,
missingDescriptions: categoryValidation.missingDescriptions,
note: 'These commands will be placed in the "other" category',
});
}
else {
(0, logger_1.log)("debug", "All commands have proper categorization and descriptions");
}
// Test command validation logic with each allowed command
for (const cmd of config_loader_1.CONFIG.ALLOWED_COMMANDS) {
try {
(0, command_validator_1.validateCommand)(cmd);
(0, logger_1.log)("debug", `Command validation successful for: ${cmd}`);
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : "Unknown validation error";
throw new Error(`Startup validation failed for allowed command '${cmd}': ${errorMessage}`);
}
}
// Test path validation logic with the allowed path
try {
(0, path_validator_1.validatePath)(".", config_loader_1.CONFIG.ALLOWED_PATH);
(0, path_validator_1.validatePath)("./test", config_loader_1.CONFIG.ALLOWED_PATH);
(0, logger_1.log)("debug", "Path validation logic working correctly");
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : "Unknown path validation error";
throw new Error(`Path validation logic failed: ${errorMessage}`);
}
// Test sanitizeCommand function with safe commands
try {
for (const cmd of config_loader_1.CONFIG.ALLOWED_COMMANDS) {
const sanitized = (0, sanitizer_1.sanitizeCommand)(cmd);
if (sanitized !== cmd) {
throw new Error(`Command '${cmd}' failed sanitization check`);
}
}
(0, logger_1.log)("debug", "Command sanitization logic working correctly");
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : "Unknown sanitization error";
throw new Error(`Command sanitization failed: ${errorMessage}`);
}
// Validate configuration values
if (config_loader_1.CONFIG.MAX_COMMAND_LENGTH <= 0) {
throw new Error("MAX_COMMAND_LENGTH must be greater than 0");
}
if (config_loader_1.CONFIG.MAX_OUTPUT_SIZE <= 0) {
throw new Error("MAX_OUTPUT_SIZE must be greater than 0");
}
if (config_loader_1.CONFIG.COMMAND_TIMEOUT <= 0) {
throw new Error("COMMAND_TIMEOUT must be greater than 0");
}
if (config_loader_1.CONFIG.MAX_CONCURRENT_COMMANDS <= 0) {
throw new Error("MAX_CONCURRENT_COMMANDS must be greater than 0");
}
// Test that dangerous commands are properly rejected
const dangerousCommands = ["rm -rf", "sudo rm", "chmod +x; /bin/sh", "cat /etc/passwd", "dangerous_cmd"];
for (const dangerousCmd of dangerousCommands) {
try {
(0, command_validator_1.validateCommand)(dangerousCmd);
// If we get here, validation failed to catch a dangerous command
throw new Error(`Validation failed to reject dangerous command: ${dangerousCmd}`);
}
catch (error) {
// This is expected - dangerous commands should be rejected
(0, logger_1.log)("debug", `Correctly rejected dangerous command: ${dangerousCmd}`);
}
}
// Log validation summary
(0, logger_1.log)("info", "All startup validation checks passed successfully", {
totalCommands: config_loader_1.CONFIG.ALLOWED_COMMANDS.length,
categorizedCommands: categoryValidation.known.length,
uncategorizedCommands: categoryValidation.unknown.length,
configurationValid: true,
});
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : "Unknown startup validation error";
(0, logger_1.log)("error", "Startup validation failed", { error: errorMessage });
throw new Error(`Startup validation failed: ${errorMessage}`);
}
}