@prompd/cli 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -0
- package/bin/prompd.js +23 -0
- package/dist/commands/cache.d.ts +3 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +199 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/compile.d.ts +9 -0
- package/dist/commands/compile.d.ts.map +1 -0
- package/dist/commands/compile.js +104 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/config.d.ts +7 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +212 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +183 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/deps.d.ts +3 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +192 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/explain.d.ts +3 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +227 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/git.d.ts +3 -0
- package/dist/commands/git.d.ts.map +1 -0
- package/dist/commands/git.js +306 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +177 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +126 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +326 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/namespace.d.ts +3 -0
- package/dist/commands/namespace.d.ts.map +1 -0
- package/dist/commands/namespace.js +113 -0
- package/dist/commands/namespace.js.map +1 -0
- package/dist/commands/package.d.ts +23 -0
- package/dist/commands/package.d.ts.map +1 -0
- package/dist/commands/package.js +746 -0
- package/dist/commands/package.js.map +1 -0
- package/dist/commands/provider.d.ts +3 -0
- package/dist/commands/provider.d.ts.map +1 -0
- package/dist/commands/provider.js +285 -0
- package/dist/commands/provider.js.map +1 -0
- package/dist/commands/registry.d.ts +9 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +361 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +157 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/show.d.ts +3 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +90 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/uninstall.d.ts +3 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +95 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +57 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/version.d.ts +3 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +166 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +388 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth.d.ts +164 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +388 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/compiler/file-system.d.ts +178 -0
- package/dist/lib/compiler/file-system.d.ts.map +1 -0
- package/dist/lib/compiler/file-system.js +440 -0
- package/dist/lib/compiler/file-system.js.map +1 -0
- package/dist/lib/compiler/formatters/anthropic.d.ts +21 -0
- package/dist/lib/compiler/formatters/anthropic.d.ts.map +1 -0
- package/dist/lib/compiler/formatters/anthropic.js +95 -0
- package/dist/lib/compiler/formatters/anthropic.js.map +1 -0
- package/dist/lib/compiler/formatters/markdown.d.ts +17 -0
- package/dist/lib/compiler/formatters/markdown.d.ts.map +1 -0
- package/dist/lib/compiler/formatters/markdown.js +114 -0
- package/dist/lib/compiler/formatters/markdown.js.map +1 -0
- package/dist/lib/compiler/formatters/openai.d.ts +21 -0
- package/dist/lib/compiler/formatters/openai.d.ts.map +1 -0
- package/dist/lib/compiler/formatters/openai.js +98 -0
- package/dist/lib/compiler/formatters/openai.js.map +1 -0
- package/dist/lib/compiler/index.d.ts +56 -0
- package/dist/lib/compiler/index.d.ts.map +1 -0
- package/dist/lib/compiler/index.js +165 -0
- package/dist/lib/compiler/index.js.map +1 -0
- package/dist/lib/compiler/language-map.d.ts +31 -0
- package/dist/lib/compiler/language-map.d.ts.map +1 -0
- package/dist/lib/compiler/language-map.js +156 -0
- package/dist/lib/compiler/language-map.js.map +1 -0
- package/dist/lib/compiler/package-resolver.d.ts +68 -0
- package/dist/lib/compiler/package-resolver.d.ts.map +1 -0
- package/dist/lib/compiler/package-resolver.js +254 -0
- package/dist/lib/compiler/package-resolver.js.map +1 -0
- package/dist/lib/compiler/pipeline.d.ts +53 -0
- package/dist/lib/compiler/pipeline.d.ts.map +1 -0
- package/dist/lib/compiler/pipeline.js +209 -0
- package/dist/lib/compiler/pipeline.js.map +1 -0
- package/dist/lib/compiler/prompd-loader.d.ts +108 -0
- package/dist/lib/compiler/prompd-loader.d.ts.map +1 -0
- package/dist/lib/compiler/prompd-loader.js +270 -0
- package/dist/lib/compiler/prompd-loader.js.map +1 -0
- package/dist/lib/compiler/section-override.d.ts +40 -0
- package/dist/lib/compiler/section-override.d.ts.map +1 -0
- package/dist/lib/compiler/section-override.js +296 -0
- package/dist/lib/compiler/section-override.js.map +1 -0
- package/dist/lib/compiler/stages/assets.d.ts +71 -0
- package/dist/lib/compiler/stages/assets.d.ts.map +1 -0
- package/dist/lib/compiler/stages/assets.js +456 -0
- package/dist/lib/compiler/stages/assets.js.map +1 -0
- package/dist/lib/compiler/stages/codegen.d.ts +17 -0
- package/dist/lib/compiler/stages/codegen.d.ts.map +1 -0
- package/dist/lib/compiler/stages/codegen.js +64 -0
- package/dist/lib/compiler/stages/codegen.js.map +1 -0
- package/dist/lib/compiler/stages/dependency.d.ts +38 -0
- package/dist/lib/compiler/stages/dependency.d.ts.map +1 -0
- package/dist/lib/compiler/stages/dependency.js +307 -0
- package/dist/lib/compiler/stages/dependency.js.map +1 -0
- package/dist/lib/compiler/stages/lexical.d.ts +19 -0
- package/dist/lib/compiler/stages/lexical.d.ts.map +1 -0
- package/dist/lib/compiler/stages/lexical.js +92 -0
- package/dist/lib/compiler/stages/lexical.js.map +1 -0
- package/dist/lib/compiler/stages/semantic.d.ts +20 -0
- package/dist/lib/compiler/stages/semantic.d.ts.map +1 -0
- package/dist/lib/compiler/stages/semantic.js +166 -0
- package/dist/lib/compiler/stages/semantic.js.map +1 -0
- package/dist/lib/compiler/stages/template.d.ts +94 -0
- package/dist/lib/compiler/stages/template.d.ts.map +1 -0
- package/dist/lib/compiler/stages/template.js +1044 -0
- package/dist/lib/compiler/stages/template.js.map +1 -0
- package/dist/lib/compiler/types.d.ts +200 -0
- package/dist/lib/compiler/types.d.ts.map +1 -0
- package/dist/lib/compiler/types.js +137 -0
- package/dist/lib/compiler/types.js.map +1 -0
- package/dist/lib/config.d.ts +29 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +375 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +19 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +47 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/executor.d.ts +18 -0
- package/dist/lib/executor.d.ts.map +1 -0
- package/dist/lib/executor.js +372 -0
- package/dist/lib/executor.js.map +1 -0
- package/dist/lib/git.d.ts +74 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +254 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/index.d.ts +43 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +108 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/mcp.d.ts +42 -0
- package/dist/lib/mcp.d.ts.map +1 -0
- package/dist/lib/mcp.js +477 -0
- package/dist/lib/mcp.js.map +1 -0
- package/dist/lib/model-updater.d.ts +51 -0
- package/dist/lib/model-updater.d.ts.map +1 -0
- package/dist/lib/model-updater.js +275 -0
- package/dist/lib/model-updater.js.map +1 -0
- package/dist/lib/parser.d.ts +9 -0
- package/dist/lib/parser.d.ts.map +1 -0
- package/dist/lib/parser.js +197 -0
- package/dist/lib/parser.js.map +1 -0
- package/dist/lib/registry.d.ts +183 -0
- package/dist/lib/registry.d.ts.map +1 -0
- package/dist/lib/registry.js +786 -0
- package/dist/lib/registry.js.map +1 -0
- package/dist/lib/rpc-server.d.ts +78 -0
- package/dist/lib/rpc-server.d.ts.map +1 -0
- package/dist/lib/rpc-server.js +404 -0
- package/dist/lib/rpc-server.js.map +1 -0
- package/dist/lib/security.d.ts +120 -0
- package/dist/lib/security.d.ts.map +1 -0
- package/dist/lib/security.js +478 -0
- package/dist/lib/security.js.map +1 -0
- package/dist/lib/validation.d.ts +106 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +398 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/version.d.ts +29 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +202 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/workflow-engine.d.ts +161 -0
- package/dist/lib/workflow-engine.d.ts.map +1 -0
- package/dist/lib/workflow-engine.js +422 -0
- package/dist/lib/workflow-engine.js.map +1 -0
- package/dist/lib/workflow.d.ts +102 -0
- package/dist/lib/workflow.d.ts.map +1 -0
- package/dist/lib/workflow.js +228 -0
- package/dist/lib/workflow.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +134 -0
- package/dist/server.js.map +1 -0
- package/dist/types/index.d.ts +116 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +144 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +104 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security utilities for Prompd CLI
|
|
3
|
+
* Implements least privilege and security boundaries
|
|
4
|
+
*/
|
|
5
|
+
export declare class SecurityManager {
|
|
6
|
+
static initialize(): void;
|
|
7
|
+
private static readonly MAX_FILE_SIZE;
|
|
8
|
+
private static readonly MAX_WORKFLOW_NODES;
|
|
9
|
+
private static readonly ALLOWED_TEMP_DIR;
|
|
10
|
+
private static readonly BLOCKED_PATHS;
|
|
11
|
+
/**
|
|
12
|
+
* Validates and sanitizes file paths to prevent directory traversal
|
|
13
|
+
*/
|
|
14
|
+
static validateFilePath(filePath: string, allowedExtensions?: string[]): string;
|
|
15
|
+
/**
|
|
16
|
+
* Sanitizes tool/workflow names to prevent injection
|
|
17
|
+
*/
|
|
18
|
+
static sanitizeToolName(name: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Creates a secure temporary file path
|
|
21
|
+
*/
|
|
22
|
+
static createSecureTempPath(prefix?: string, extension?: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Validates file size before processing
|
|
25
|
+
*/
|
|
26
|
+
static validateFileSize(filePath: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Validates workflow complexity to prevent DoS
|
|
29
|
+
*/
|
|
30
|
+
static validateWorkflowComplexity(workflow: any): void;
|
|
31
|
+
/**
|
|
32
|
+
* Validates API endpoints (whitelist approach)
|
|
33
|
+
*/
|
|
34
|
+
private static isAllowedApiEndpoint;
|
|
35
|
+
/**
|
|
36
|
+
* Sanitizes user input parameters
|
|
37
|
+
*/
|
|
38
|
+
static sanitizeParameters(params: Record<string, any>, maxDepth?: number): Record<string, any>;
|
|
39
|
+
private static sanitizeParameterKey;
|
|
40
|
+
private static sanitizeStringValue;
|
|
41
|
+
private static sanitizeNumberValue;
|
|
42
|
+
private static sanitizeArrayValue;
|
|
43
|
+
/**
|
|
44
|
+
* Creates a secure execution environment
|
|
45
|
+
*/
|
|
46
|
+
static createSecureExecutionContext(): Promise<{
|
|
47
|
+
tempDir: string;
|
|
48
|
+
cleanup: () => Promise<void>;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Validates registry URL for security
|
|
52
|
+
* Only HTTPS allowed except for localhost
|
|
53
|
+
*/
|
|
54
|
+
static validateRegistryUrl(url: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Scans content for potential secrets
|
|
57
|
+
* Returns true if secrets detected
|
|
58
|
+
*/
|
|
59
|
+
static scanForSecrets(content: string): Promise<{
|
|
60
|
+
hasSecrets: boolean;
|
|
61
|
+
secrets: Array<{
|
|
62
|
+
type: string;
|
|
63
|
+
line: number;
|
|
64
|
+
}>;
|
|
65
|
+
}>;
|
|
66
|
+
/**
|
|
67
|
+
* Scans a file for potential secrets before packaging/publishing
|
|
68
|
+
*/
|
|
69
|
+
static scanFileForSecrets(filePath: string): Promise<{
|
|
70
|
+
hasSecrets: boolean;
|
|
71
|
+
secrets: Array<{
|
|
72
|
+
type: string;
|
|
73
|
+
line: number;
|
|
74
|
+
}>;
|
|
75
|
+
}>;
|
|
76
|
+
/**
|
|
77
|
+
* Sanitizes environment variables (clear sensitive data after reading)
|
|
78
|
+
*/
|
|
79
|
+
static sanitizeEnvironment(): void;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Git-specific security validation functions
|
|
83
|
+
* Ported from Python CLI security.py
|
|
84
|
+
*/
|
|
85
|
+
export declare class GitSecurityError extends Error {
|
|
86
|
+
constructor(message: string);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Validates file paths specifically for Git operations.
|
|
90
|
+
* Prevents command injection and path traversal attacks.
|
|
91
|
+
*/
|
|
92
|
+
export declare function validateGitFilePath(filePath: string): string;
|
|
93
|
+
/**
|
|
94
|
+
* Validates Git commit messages for safety.
|
|
95
|
+
* Prevents command injection in commit messages.
|
|
96
|
+
*/
|
|
97
|
+
export declare function validateGitMessage(message: string): string;
|
|
98
|
+
/**
|
|
99
|
+
* Validates semantic version strings.
|
|
100
|
+
*/
|
|
101
|
+
export declare function validateVersionString(version: string): string;
|
|
102
|
+
/**
|
|
103
|
+
* Security middleware for MCP requests
|
|
104
|
+
*/
|
|
105
|
+
export declare class MCPSecurityMiddleware {
|
|
106
|
+
private static readonly MAX_REQUEST_SIZE;
|
|
107
|
+
private static readonly RATE_LIMIT_WINDOW;
|
|
108
|
+
private static readonly RATE_LIMIT_MAX_REQUESTS;
|
|
109
|
+
private requestCounts;
|
|
110
|
+
/**
|
|
111
|
+
* Validates incoming MCP request
|
|
112
|
+
*/
|
|
113
|
+
validateRequest(request: any, clientId?: string): void;
|
|
114
|
+
private enforceRateLimit;
|
|
115
|
+
/**
|
|
116
|
+
* Cleans up old rate limit data
|
|
117
|
+
*/
|
|
118
|
+
cleanup(): void;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security utilities for Prompd CLI
|
|
4
|
+
* Implements least privilege and security boundaries
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.MCPSecurityMiddleware = exports.GitSecurityError = exports.SecurityManager = void 0;
|
|
41
|
+
exports.validateGitFilePath = validateGitFilePath;
|
|
42
|
+
exports.validateGitMessage = validateGitMessage;
|
|
43
|
+
exports.validateVersionString = validateVersionString;
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const fs = __importStar(require("fs-extra"));
|
|
46
|
+
const validation_1 = require("./validation");
|
|
47
|
+
class SecurityManager {
|
|
48
|
+
static initialize() {
|
|
49
|
+
// Initialize security settings if needed
|
|
50
|
+
console.log('Security Manager initialized');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Validates and sanitizes file paths to prevent directory traversal
|
|
54
|
+
*/
|
|
55
|
+
static validateFilePath(filePath, allowedExtensions = []) {
|
|
56
|
+
if (!filePath || typeof filePath !== 'string') {
|
|
57
|
+
throw new Error('Invalid file path');
|
|
58
|
+
}
|
|
59
|
+
// Normalize and resolve path
|
|
60
|
+
const normalized = path.normalize(path.resolve(filePath));
|
|
61
|
+
// Check for directory traversal attempts
|
|
62
|
+
for (const blockedPath of this.BLOCKED_PATHS) {
|
|
63
|
+
if (normalized.toLowerCase().includes(blockedPath.toLowerCase())) {
|
|
64
|
+
throw new Error(`Access denied: Path contains blocked directory: ${blockedPath}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Validate extension if specified
|
|
68
|
+
if (allowedExtensions.length > 0) {
|
|
69
|
+
const ext = path.extname(normalized).toLowerCase();
|
|
70
|
+
if (!allowedExtensions.includes(ext)) {
|
|
71
|
+
throw new Error(`Invalid file extension. Allowed: ${allowedExtensions.join(', ')}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return normalized;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Sanitizes tool/workflow names to prevent injection
|
|
78
|
+
*/
|
|
79
|
+
static sanitizeToolName(name) {
|
|
80
|
+
if (!name || typeof name !== 'string') {
|
|
81
|
+
throw new Error('Tool name is required');
|
|
82
|
+
}
|
|
83
|
+
// Only allow alphanumeric, hyphens, underscores
|
|
84
|
+
const sanitized = name.replace(/[^a-zA-Z0-9\-_]/g, '');
|
|
85
|
+
if (sanitized.length === 0) {
|
|
86
|
+
throw new Error('Tool name must contain valid characters (a-z, A-Z, 0-9, -, _)');
|
|
87
|
+
}
|
|
88
|
+
if (sanitized.length > 64) {
|
|
89
|
+
throw new Error('Tool name too long (max 64 characters)');
|
|
90
|
+
}
|
|
91
|
+
return sanitized;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Creates a secure temporary file path
|
|
95
|
+
*/
|
|
96
|
+
static createSecureTempPath(prefix = 'prompd', extension = '.tmp') {
|
|
97
|
+
const sanitizedPrefix = this.sanitizeToolName(prefix);
|
|
98
|
+
const timestamp = Date.now();
|
|
99
|
+
const random = Math.random().toString(36).substring(2);
|
|
100
|
+
const filename = `${sanitizedPrefix}-${timestamp}-${random}${extension}`;
|
|
101
|
+
return path.join(this.ALLOWED_TEMP_DIR, 'temp', filename);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Validates file size before processing
|
|
105
|
+
*/
|
|
106
|
+
static async validateFileSize(filePath) {
|
|
107
|
+
try {
|
|
108
|
+
const stats = await fs.stat(filePath);
|
|
109
|
+
if (stats.size > this.MAX_FILE_SIZE) {
|
|
110
|
+
throw new Error(`File too large: ${Math.round(stats.size / 1024 / 1024)}MB (max: ${this.MAX_FILE_SIZE / 1024 / 1024}MB)`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (error instanceof Error && error.message.includes('File too large')) {
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
throw new Error(`Cannot access file: ${filePath}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Validates workflow complexity to prevent DoS
|
|
122
|
+
*/
|
|
123
|
+
static validateWorkflowComplexity(workflow) {
|
|
124
|
+
if (!workflow || typeof workflow !== 'object') {
|
|
125
|
+
throw new Error('Invalid workflow format');
|
|
126
|
+
}
|
|
127
|
+
// Check node count
|
|
128
|
+
if (workflow.nodes && workflow.nodes.length > this.MAX_WORKFLOW_NODES) {
|
|
129
|
+
throw new Error(`Workflow too complex: ${workflow.nodes.length} nodes (max: ${this.MAX_WORKFLOW_NODES})`);
|
|
130
|
+
}
|
|
131
|
+
// Check for potentially dangerous node types
|
|
132
|
+
if (workflow.nodes) {
|
|
133
|
+
for (const node of workflow.nodes) {
|
|
134
|
+
if (node.type === 'transformer' && node.data?.config?.transformationType === 'javascript') {
|
|
135
|
+
throw new Error('JavaScript transformation nodes are disabled for security');
|
|
136
|
+
}
|
|
137
|
+
// Block external API calls without explicit permission
|
|
138
|
+
if (node.type === 'api' && !this.isAllowedApiEndpoint(node.data?.config?.endpoint)) {
|
|
139
|
+
throw new Error(`API endpoint not allowed: ${node.data?.config?.endpoint}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Validates API endpoints (whitelist approach)
|
|
146
|
+
*/
|
|
147
|
+
static isAllowedApiEndpoint(endpoint) {
|
|
148
|
+
if (!endpoint)
|
|
149
|
+
return false;
|
|
150
|
+
// Only allow HTTPS endpoints
|
|
151
|
+
if (!endpoint.startsWith('https://')) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
// Simple whitelist - in production this would be configurable
|
|
155
|
+
const allowedDomains = [
|
|
156
|
+
'api.openai.com',
|
|
157
|
+
'api.anthropic.com',
|
|
158
|
+
'localhost' // For development
|
|
159
|
+
];
|
|
160
|
+
try {
|
|
161
|
+
const url = new URL(endpoint);
|
|
162
|
+
return allowedDomains.some(domain => url.hostname === domain || url.hostname.endsWith(`.${domain}`));
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Sanitizes user input parameters
|
|
170
|
+
*/
|
|
171
|
+
static sanitizeParameters(params, maxDepth = 3) {
|
|
172
|
+
if (!params || typeof params !== 'object') {
|
|
173
|
+
return {};
|
|
174
|
+
}
|
|
175
|
+
const sanitized = {};
|
|
176
|
+
for (const [key, value] of Object.entries(params)) {
|
|
177
|
+
// Validate key
|
|
178
|
+
const cleanKey = this.sanitizeParameterKey(key);
|
|
179
|
+
// Sanitize value based on type
|
|
180
|
+
if (typeof value === 'string') {
|
|
181
|
+
sanitized[cleanKey] = this.sanitizeStringValue(value);
|
|
182
|
+
}
|
|
183
|
+
else if (typeof value === 'number') {
|
|
184
|
+
sanitized[cleanKey] = this.sanitizeNumberValue(value);
|
|
185
|
+
}
|
|
186
|
+
else if (typeof value === 'boolean') {
|
|
187
|
+
sanitized[cleanKey] = Boolean(value);
|
|
188
|
+
}
|
|
189
|
+
else if (Array.isArray(value)) {
|
|
190
|
+
sanitized[cleanKey] = this.sanitizeArrayValue(value, maxDepth - 1);
|
|
191
|
+
}
|
|
192
|
+
else if (typeof value === 'object' && value !== null && maxDepth > 0) {
|
|
193
|
+
sanitized[cleanKey] = this.sanitizeParameters(value, maxDepth - 1);
|
|
194
|
+
}
|
|
195
|
+
// Drop functions, undefined, symbols, etc.
|
|
196
|
+
}
|
|
197
|
+
return sanitized;
|
|
198
|
+
}
|
|
199
|
+
static sanitizeParameterKey(key) {
|
|
200
|
+
if (typeof key !== 'string') {
|
|
201
|
+
throw new Error('Parameter key must be string');
|
|
202
|
+
}
|
|
203
|
+
// Remove potentially dangerous characters
|
|
204
|
+
const sanitized = key.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
205
|
+
if (sanitized.length === 0 || sanitized.length > 128) {
|
|
206
|
+
throw new Error('Invalid parameter key length');
|
|
207
|
+
}
|
|
208
|
+
return sanitized;
|
|
209
|
+
}
|
|
210
|
+
static sanitizeStringValue(value) {
|
|
211
|
+
if (typeof value !== 'string') {
|
|
212
|
+
return '';
|
|
213
|
+
}
|
|
214
|
+
// Limit string length to prevent memory exhaustion
|
|
215
|
+
if (value.length > 10000) {
|
|
216
|
+
throw new Error('Parameter value too long (max 10000 characters)');
|
|
217
|
+
}
|
|
218
|
+
// Remove null bytes and control characters (except common whitespace)
|
|
219
|
+
return value.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
|
|
220
|
+
}
|
|
221
|
+
static sanitizeNumberValue(value) {
|
|
222
|
+
if (typeof value !== 'number' || !isFinite(value)) {
|
|
223
|
+
throw new Error('Invalid number value');
|
|
224
|
+
}
|
|
225
|
+
// Prevent extreme values
|
|
226
|
+
if (Math.abs(value) > Number.MAX_SAFE_INTEGER) {
|
|
227
|
+
throw new Error('Number value out of safe range');
|
|
228
|
+
}
|
|
229
|
+
return value;
|
|
230
|
+
}
|
|
231
|
+
static sanitizeArrayValue(value, maxDepth) {
|
|
232
|
+
if (!Array.isArray(value)) {
|
|
233
|
+
return [];
|
|
234
|
+
}
|
|
235
|
+
// Limit array size
|
|
236
|
+
if (value.length > 1000) {
|
|
237
|
+
throw new Error('Array too large (max 1000 items)');
|
|
238
|
+
}
|
|
239
|
+
if (maxDepth <= 0) {
|
|
240
|
+
return []; // Prevent deep nesting
|
|
241
|
+
}
|
|
242
|
+
return value.slice(0, 100).map(item => {
|
|
243
|
+
if (typeof item === 'string') {
|
|
244
|
+
return this.sanitizeStringValue(item);
|
|
245
|
+
}
|
|
246
|
+
else if (typeof item === 'number') {
|
|
247
|
+
return this.sanitizeNumberValue(item);
|
|
248
|
+
}
|
|
249
|
+
else if (typeof item === 'boolean') {
|
|
250
|
+
return Boolean(item);
|
|
251
|
+
}
|
|
252
|
+
else if (typeof item === 'object' && item !== null) {
|
|
253
|
+
return this.sanitizeParameters(item, maxDepth - 1);
|
|
254
|
+
}
|
|
255
|
+
return item;
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Creates a secure execution environment
|
|
260
|
+
*/
|
|
261
|
+
static async createSecureExecutionContext() {
|
|
262
|
+
const tempDir = path.join(this.ALLOWED_TEMP_DIR, 'temp', `execution-${Date.now()}-${Math.random().toString(36)}`);
|
|
263
|
+
await fs.ensureDir(tempDir);
|
|
264
|
+
// Set restrictive permissions if on Unix-like system
|
|
265
|
+
try {
|
|
266
|
+
await fs.chmod(tempDir, 0o700); // Owner read/write/execute only
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// Windows doesn't support chmod, ignore
|
|
270
|
+
}
|
|
271
|
+
const cleanup = async () => {
|
|
272
|
+
try {
|
|
273
|
+
await fs.remove(tempDir);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
console.warn(`Failed to cleanup temp directory: ${tempDir}`, error);
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
return { tempDir, cleanup };
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Validates registry URL for security
|
|
283
|
+
* Only HTTPS allowed except for localhost
|
|
284
|
+
*/
|
|
285
|
+
static validateRegistryUrl(url) {
|
|
286
|
+
return (0, validation_1.validateRegistryUrl)(url);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Scans content for potential secrets
|
|
290
|
+
* Returns true if secrets detected
|
|
291
|
+
*/
|
|
292
|
+
static async scanForSecrets(content) {
|
|
293
|
+
const { detectSecrets } = await Promise.resolve().then(() => __importStar(require('./validation')));
|
|
294
|
+
const detected = detectSecrets(content);
|
|
295
|
+
return {
|
|
296
|
+
hasSecrets: detected.length > 0,
|
|
297
|
+
secrets: detected.map(s => ({ type: s.type, line: s.line }))
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Scans a file for potential secrets before packaging/publishing
|
|
302
|
+
*/
|
|
303
|
+
static async scanFileForSecrets(filePath) {
|
|
304
|
+
try {
|
|
305
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
306
|
+
return this.scanForSecrets(content);
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
// If we can't read the file, assume no secrets (might be binary)
|
|
310
|
+
return { hasSecrets: false, secrets: [] };
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Sanitizes environment variables (clear sensitive data after reading)
|
|
315
|
+
*/
|
|
316
|
+
static sanitizeEnvironment() {
|
|
317
|
+
// Clear any temporary sensitive environment variables
|
|
318
|
+
const sensitiveVars = [
|
|
319
|
+
'TEMP_API_KEY',
|
|
320
|
+
'TEMP_TOKEN',
|
|
321
|
+
'TEMP_PASSWORD'
|
|
322
|
+
];
|
|
323
|
+
sensitiveVars.forEach(varName => {
|
|
324
|
+
if (process.env[varName]) {
|
|
325
|
+
delete process.env[varName];
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
exports.SecurityManager = SecurityManager;
|
|
331
|
+
SecurityManager.MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
|
|
332
|
+
SecurityManager.MAX_WORKFLOW_NODES = 1000;
|
|
333
|
+
SecurityManager.ALLOWED_TEMP_DIR = process.cwd();
|
|
334
|
+
SecurityManager.BLOCKED_PATHS = ['..', '~', '/etc', '/usr', '/var', 'C:\\Windows', 'C:\\Program Files'];
|
|
335
|
+
/**
|
|
336
|
+
* Git-specific security validation functions
|
|
337
|
+
* Ported from Python CLI security.py
|
|
338
|
+
*/
|
|
339
|
+
class GitSecurityError extends Error {
|
|
340
|
+
constructor(message) {
|
|
341
|
+
super(message);
|
|
342
|
+
this.name = 'GitSecurityError';
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
exports.GitSecurityError = GitSecurityError;
|
|
346
|
+
/**
|
|
347
|
+
* Validates file paths specifically for Git operations.
|
|
348
|
+
* Prevents command injection and path traversal attacks.
|
|
349
|
+
*/
|
|
350
|
+
function validateGitFilePath(filePath) {
|
|
351
|
+
if (!filePath || typeof filePath !== 'string') {
|
|
352
|
+
throw new GitSecurityError('File path is required');
|
|
353
|
+
}
|
|
354
|
+
// Normalize the path
|
|
355
|
+
const normalized = path.normalize(filePath);
|
|
356
|
+
// Check for path traversal attempts
|
|
357
|
+
const dangerousPatterns = ['..', '~', '$'];
|
|
358
|
+
for (const pattern of dangerousPatterns) {
|
|
359
|
+
if (normalized.includes(pattern)) {
|
|
360
|
+
throw new GitSecurityError(`Potentially dangerous path component '${pattern}' found in: ${normalized}`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// Prevent command injection through filenames
|
|
364
|
+
const dangerousChars = [';', '&', '|', '`', '$', '(', ')', '<', '>', '"', "'"];
|
|
365
|
+
for (const char of dangerousChars) {
|
|
366
|
+
if (normalized.includes(char)) {
|
|
367
|
+
throw new GitSecurityError(`Potentially dangerous character '${char}' in filename: ${normalized}`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// Check for absolute paths outside current directory
|
|
371
|
+
if (path.isAbsolute(normalized)) {
|
|
372
|
+
const cwd = process.cwd();
|
|
373
|
+
const resolved = path.resolve(normalized);
|
|
374
|
+
if (!resolved.startsWith(cwd)) {
|
|
375
|
+
throw new GitSecurityError(`Absolute path outside current directory not allowed: ${resolved}`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return normalized;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Validates Git commit messages for safety.
|
|
382
|
+
* Prevents command injection in commit messages.
|
|
383
|
+
*/
|
|
384
|
+
function validateGitMessage(message) {
|
|
385
|
+
if (!message || !message.trim()) {
|
|
386
|
+
throw new GitSecurityError('Commit message cannot be empty');
|
|
387
|
+
}
|
|
388
|
+
// Check message length (Git has practical limits)
|
|
389
|
+
if (message.length > 2000) {
|
|
390
|
+
throw new GitSecurityError('Commit message too long (max 2000 characters)');
|
|
391
|
+
}
|
|
392
|
+
// Check for command injection attempts in commit message
|
|
393
|
+
const dangerousPatterns = ['$(', '`', '${', '#!/', '&>', '|>', '<(', '>('];
|
|
394
|
+
for (const pattern of dangerousPatterns) {
|
|
395
|
+
if (message.includes(pattern)) {
|
|
396
|
+
throw new GitSecurityError(`Potentially dangerous pattern '${pattern}' in commit message`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return message.trim();
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Validates semantic version strings.
|
|
403
|
+
*/
|
|
404
|
+
function validateVersionString(version) {
|
|
405
|
+
if (!version || typeof version !== 'string') {
|
|
406
|
+
throw new GitSecurityError('Version string is required');
|
|
407
|
+
}
|
|
408
|
+
// Semantic version pattern (major.minor.patch with optional pre-release/build)
|
|
409
|
+
const versionPattern = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/;
|
|
410
|
+
if (!versionPattern.test(version)) {
|
|
411
|
+
throw new GitSecurityError(`Invalid semantic version format: ${version}`);
|
|
412
|
+
}
|
|
413
|
+
// Check for reasonable version numbers
|
|
414
|
+
const parts = version.split('.', 3);
|
|
415
|
+
for (let i = 0; i < 3; i++) {
|
|
416
|
+
const num = parseInt(parts[i], 10);
|
|
417
|
+
if (num < 0 || num > 999) {
|
|
418
|
+
throw new GitSecurityError(`Version component out of range (0-999): ${num}`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return version;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Security middleware for MCP requests
|
|
425
|
+
*/
|
|
426
|
+
class MCPSecurityMiddleware {
|
|
427
|
+
constructor() {
|
|
428
|
+
this.requestCounts = new Map();
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Validates incoming MCP request
|
|
432
|
+
*/
|
|
433
|
+
validateRequest(request, clientId = 'default') {
|
|
434
|
+
// Size validation
|
|
435
|
+
const requestSize = JSON.stringify(request).length;
|
|
436
|
+
if (requestSize > MCPSecurityMiddleware.MAX_REQUEST_SIZE) {
|
|
437
|
+
throw new Error(`Request too large: ${requestSize} bytes (max: ${MCPSecurityMiddleware.MAX_REQUEST_SIZE})`);
|
|
438
|
+
}
|
|
439
|
+
// Rate limiting
|
|
440
|
+
this.enforceRateLimit(clientId);
|
|
441
|
+
// Parameter validation
|
|
442
|
+
if (request.params?.arguments) {
|
|
443
|
+
request.params.arguments = SecurityManager.sanitizeParameters(request.params.arguments);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
enforceRateLimit(clientId) {
|
|
447
|
+
const now = Date.now();
|
|
448
|
+
const clientData = this.requestCounts.get(clientId);
|
|
449
|
+
if (!clientData || now > clientData.resetTime) {
|
|
450
|
+
// Reset or initialize
|
|
451
|
+
this.requestCounts.set(clientId, {
|
|
452
|
+
count: 1,
|
|
453
|
+
resetTime: now + MCPSecurityMiddleware.RATE_LIMIT_WINDOW
|
|
454
|
+
});
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
if (clientData.count >= MCPSecurityMiddleware.RATE_LIMIT_MAX_REQUESTS) {
|
|
458
|
+
throw new Error(`Rate limit exceeded. Try again in ${Math.ceil((clientData.resetTime - now) / 1000)} seconds`);
|
|
459
|
+
}
|
|
460
|
+
clientData.count++;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Cleans up old rate limit data
|
|
464
|
+
*/
|
|
465
|
+
cleanup() {
|
|
466
|
+
const now = Date.now();
|
|
467
|
+
for (const [clientId, data] of this.requestCounts.entries()) {
|
|
468
|
+
if (now > data.resetTime) {
|
|
469
|
+
this.requestCounts.delete(clientId);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
exports.MCPSecurityMiddleware = MCPSecurityMiddleware;
|
|
475
|
+
MCPSecurityMiddleware.MAX_REQUEST_SIZE = 100 * 1024; // 100KB
|
|
476
|
+
MCPSecurityMiddleware.RATE_LIMIT_WINDOW = 60 * 1000; // 1 minute
|
|
477
|
+
MCPSecurityMiddleware.RATE_LIMIT_MAX_REQUESTS = 100;
|
|
478
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"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"}
|