@1mcp/agent 0.18.1 → 0.20.0
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 +64 -27
- package/build/commands/mcp/add.d.ts +3 -0
- package/build/commands/mcp/add.d.ts.map +1 -1
- package/build/commands/mcp/add.js +24 -0
- package/build/commands/mcp/add.js.map +1 -1
- package/build/commands/mcp/index.d.ts.map +1 -1
- package/build/commands/mcp/index.js +24 -0
- package/build/commands/mcp/index.js.map +1 -1
- package/build/commands/mcp/list.d.ts +1 -0
- package/build/commands/mcp/list.d.ts.map +1 -1
- package/build/commands/mcp/list.js +26 -8
- package/build/commands/mcp/list.js.map +1 -1
- package/build/commands/mcp/update.d.ts +3 -0
- package/build/commands/mcp/update.d.ts.map +1 -1
- package/build/commands/mcp/update.js +21 -0
- package/build/commands/mcp/update.js.map +1 -1
- package/build/config/mcpConfigManager.d.ts.map +1 -1
- package/build/config/mcpConfigManager.js +7 -3
- package/build/config/mcpConfigManager.js.map +1 -1
- package/build/constants.d.ts +1 -1
- package/build/constants.js +1 -1
- package/build/core/types/server.d.ts +3 -0
- package/build/core/types/server.d.ts.map +1 -1
- package/build/core/types/server.js.map +1 -1
- package/build/core/types/transport.d.ts +27 -5
- package/build/core/types/transport.d.ts.map +1 -1
- package/build/core/types/transport.js +7 -2
- package/build/core/types/transport.js.map +1 -1
- package/build/handlers/requestHandlers.d.ts.map +1 -1
- package/build/handlers/requestHandlers.js +20 -5
- package/build/handlers/requestHandlers.js.map +1 -1
- package/build/index.js +39 -5
- package/build/index.js.map +1 -1
- package/build/transport/http/middlewares/scopeAuthMiddleware.d.ts +9 -0
- package/build/transport/http/middlewares/scopeAuthMiddleware.d.ts.map +1 -1
- package/build/transport/http/middlewares/scopeAuthMiddleware.js +55 -6
- package/build/transport/http/middlewares/scopeAuthMiddleware.js.map +1 -1
- package/build/transport/http/middlewares/tagsExtractor.d.ts +8 -2
- package/build/transport/http/middlewares/tagsExtractor.d.ts.map +1 -1
- package/build/transport/http/middlewares/tagsExtractor.js +109 -7
- package/build/transport/http/middlewares/tagsExtractor.js.map +1 -1
- package/build/transport/http/routes/oauthRoutes.d.ts +2 -1
- package/build/transport/http/routes/oauthRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/oauthRoutes.js +13 -1
- package/build/transport/http/routes/oauthRoutes.js.map +1 -1
- package/build/transport/http/routes/sseRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/sseRoutes.js +6 -2
- package/build/transport/http/routes/sseRoutes.js.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.js +6 -2
- package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
- package/build/transport/http/server.js +1 -1
- package/build/transport/http/server.js.map +1 -1
- package/build/transport/restartableStdioTransport.d.ts +84 -0
- package/build/transport/restartableStdioTransport.d.ts.map +1 -0
- package/build/transport/restartableStdioTransport.js +185 -0
- package/build/transport/restartableStdioTransport.js.map +1 -0
- package/build/transport/transportFactory.d.ts.map +1 -1
- package/build/transport/transportFactory.js +38 -2
- package/build/transport/transportFactory.js.map +1 -1
- package/build/utils/clientFiltering.d.ts +8 -1
- package/build/utils/clientFiltering.d.ts.map +1 -1
- package/build/utils/clientFiltering.js +38 -3
- package/build/utils/clientFiltering.js.map +1 -1
- package/build/utils/envProcessor.d.ts +45 -0
- package/build/utils/envProcessor.d.ts.map +1 -0
- package/build/utils/envProcessor.js +214 -0
- package/build/utils/envProcessor.js.map +1 -0
- package/build/utils/sanitization.d.ts +63 -0
- package/build/utils/sanitization.d.ts.map +1 -1
- package/build/utils/sanitization.js +308 -0
- package/build/utils/sanitization.js.map +1 -1
- package/build/utils/tagQueryParser.d.ts +76 -0
- package/build/utils/tagQueryParser.d.ts.map +1 -0
- package/build/utils/tagQueryParser.js +336 -0
- package/build/utils/tagQueryParser.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { getDefaultEnvironment } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
2
|
+
import logger from '../logger/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Converts environment array format to object format
|
|
5
|
+
* @param envArray Array in format ["KEY=value", "PATH=/usr/bin"]
|
|
6
|
+
* @returns Object in format {KEY: "value", PATH: "/usr/bin"}
|
|
7
|
+
*/
|
|
8
|
+
export function parseEnvArray(envArray) {
|
|
9
|
+
const envObject = {};
|
|
10
|
+
for (const entry of envArray) {
|
|
11
|
+
const equalIndex = entry.indexOf('=');
|
|
12
|
+
if (equalIndex === -1) {
|
|
13
|
+
// No equals sign, treat as inheritance key
|
|
14
|
+
const key = entry.trim();
|
|
15
|
+
const value = process.env[key];
|
|
16
|
+
if (value !== undefined) {
|
|
17
|
+
envObject[key] = value;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
// Has equals sign, treat as key=value assignment
|
|
22
|
+
const key = entry.slice(0, equalIndex).trim();
|
|
23
|
+
const value = entry.slice(equalIndex + 1);
|
|
24
|
+
envObject[key] = value;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return envObject;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Checks if an environment variable key matches any pattern
|
|
31
|
+
* @param key Environment variable key
|
|
32
|
+
* @param patterns Array of patterns with optional ! prefix for denial
|
|
33
|
+
* @returns true if key should be included, false if denied or not matched
|
|
34
|
+
*/
|
|
35
|
+
function matchesEnvPattern(key, patterns) {
|
|
36
|
+
let matched = false;
|
|
37
|
+
let denied = false;
|
|
38
|
+
for (const pattern of patterns) {
|
|
39
|
+
if (pattern.startsWith('!')) {
|
|
40
|
+
// Denial pattern
|
|
41
|
+
const denyPattern = pattern.slice(1);
|
|
42
|
+
if (matchesGlobPattern(key, denyPattern)) {
|
|
43
|
+
denied = true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Allow pattern
|
|
48
|
+
if (matchesGlobPattern(key, pattern)) {
|
|
49
|
+
matched = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// If explicitly denied, return false
|
|
54
|
+
// If matched by allow pattern and not denied, return true
|
|
55
|
+
// If no allow patterns specified but denied patterns exist, default to true unless denied
|
|
56
|
+
if (denied)
|
|
57
|
+
return false;
|
|
58
|
+
if (matched)
|
|
59
|
+
return true;
|
|
60
|
+
// Check if there are any allow patterns - if not, default to allow (only deny patterns)
|
|
61
|
+
const hasAllowPatterns = patterns.some((p) => !p.startsWith('!'));
|
|
62
|
+
return !hasAllowPatterns;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Simple glob pattern matching for environment variable names
|
|
66
|
+
* Supports * wildcard at the end of patterns
|
|
67
|
+
* @param text Text to match
|
|
68
|
+
* @param pattern Pattern with optional * wildcard
|
|
69
|
+
* @returns true if text matches pattern
|
|
70
|
+
*/
|
|
71
|
+
function matchesGlobPattern(text, pattern) {
|
|
72
|
+
if (pattern === text) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
if (pattern.endsWith('*')) {
|
|
76
|
+
const prefix = pattern.slice(0, -1);
|
|
77
|
+
return text.startsWith(prefix);
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Applies environment variable filtering based on patterns
|
|
83
|
+
* @param env Environment variables to filter
|
|
84
|
+
* @param patterns Array of allow/deny patterns
|
|
85
|
+
* @returns Filtered environment variables and list of filtered keys
|
|
86
|
+
*/
|
|
87
|
+
function applyEnvPatterns(env, patterns) {
|
|
88
|
+
const filtered = {};
|
|
89
|
+
const filteredKeys = [];
|
|
90
|
+
for (const [key, value] of Object.entries(env)) {
|
|
91
|
+
if (matchesEnvPattern(key, patterns)) {
|
|
92
|
+
filtered[key] = value;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
filteredKeys.push(key);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return { filtered, filteredKeys };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Gets environment variables from parent process, excluding dangerous ones
|
|
102
|
+
* @returns Safe environment variables from parent process
|
|
103
|
+
*/
|
|
104
|
+
function getParentEnvironment() {
|
|
105
|
+
const parentEnv = {};
|
|
106
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
107
|
+
if (value === undefined)
|
|
108
|
+
continue;
|
|
109
|
+
// Skip bash functions and other potentially dangerous variables
|
|
110
|
+
if (value.startsWith('()')) {
|
|
111
|
+
logger.debug(`Skipping dangerous environment variable: ${key}`);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
parentEnv[key] = value;
|
|
115
|
+
}
|
|
116
|
+
return parentEnv;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Substitutes environment variables in configuration values
|
|
120
|
+
* @param configValue Configuration value that may contain ${VAR} patterns
|
|
121
|
+
* @returns Value with environment variables substituted
|
|
122
|
+
*/
|
|
123
|
+
export function substituteEnvVars(configValue) {
|
|
124
|
+
return configValue.replace(/\$\{([^}]+)\}/g, (match, envVar) => {
|
|
125
|
+
const value = process.env[envVar.trim()];
|
|
126
|
+
if (value === undefined) {
|
|
127
|
+
logger.warn(`Environment variable ${envVar} not found, keeping placeholder: ${match}`);
|
|
128
|
+
return match;
|
|
129
|
+
}
|
|
130
|
+
return value;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Recursively substitutes environment variables in a configuration object
|
|
135
|
+
* @param config Configuration object
|
|
136
|
+
* @returns Configuration object with environment variables substituted
|
|
137
|
+
*/
|
|
138
|
+
export function substituteEnvVarsInConfig(config) {
|
|
139
|
+
if (typeof config === 'string') {
|
|
140
|
+
return substituteEnvVars(config);
|
|
141
|
+
}
|
|
142
|
+
if (Array.isArray(config)) {
|
|
143
|
+
return config.map((item) => substituteEnvVarsInConfig(item));
|
|
144
|
+
}
|
|
145
|
+
if (config && typeof config === 'object') {
|
|
146
|
+
const result = {};
|
|
147
|
+
for (const [key, value] of Object.entries(config)) {
|
|
148
|
+
result[key] = substituteEnvVarsInConfig(value);
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
return config;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Processes environment configuration for stdio transport
|
|
156
|
+
* @param config Environment processing configuration
|
|
157
|
+
* @returns Processed environment variables with metadata
|
|
158
|
+
*/
|
|
159
|
+
export function processEnvironment(config) {
|
|
160
|
+
// 1. Start with SDK safe defaults
|
|
161
|
+
const sdkDefaults = getDefaultEnvironment();
|
|
162
|
+
const sdkDefaultKeys = Object.keys(sdkDefaults);
|
|
163
|
+
logger.debug(`SDK default environment variables: ${sdkDefaultKeys.join(', ')}`);
|
|
164
|
+
// 2. Optionally inherit from parent process
|
|
165
|
+
let inheritedEnv = {};
|
|
166
|
+
let inheritedKeys = [];
|
|
167
|
+
if (config.inheritParentEnv) {
|
|
168
|
+
const parentEnv = getParentEnvironment();
|
|
169
|
+
inheritedEnv = { ...parentEnv };
|
|
170
|
+
inheritedKeys = Object.keys(parentEnv).filter((key) => !sdkDefaultKeys.includes(key));
|
|
171
|
+
logger.debug(`Inheriting ${inheritedKeys.length} additional environment variables from parent`);
|
|
172
|
+
}
|
|
173
|
+
// 3. Combine SDK defaults and inherited environment
|
|
174
|
+
let combinedEnv = { ...sdkDefaults, ...inheritedEnv };
|
|
175
|
+
// 4. Apply pattern filtering if specified
|
|
176
|
+
let filteredKeys = [];
|
|
177
|
+
if (config.envFilter && config.envFilter.length > 0) {
|
|
178
|
+
const filterResult = applyEnvPatterns(combinedEnv, config.envFilter);
|
|
179
|
+
combinedEnv = filterResult.filtered;
|
|
180
|
+
filteredKeys = filterResult.filteredKeys;
|
|
181
|
+
logger.debug(`Environment filtering removed ${filteredKeys.length} variables: ${filteredKeys.join(', ')}`);
|
|
182
|
+
}
|
|
183
|
+
// 5. Add custom environment variables
|
|
184
|
+
let customEnv = {};
|
|
185
|
+
let customKeys = [];
|
|
186
|
+
if (config.env) {
|
|
187
|
+
if (Array.isArray(config.env)) {
|
|
188
|
+
customEnv = parseEnvArray(config.env);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
customEnv = { ...config.env };
|
|
192
|
+
}
|
|
193
|
+
// Apply environment variable substitution to custom env
|
|
194
|
+
for (const [key, value] of Object.entries(customEnv)) {
|
|
195
|
+
customEnv[key] = substituteEnvVars(value);
|
|
196
|
+
}
|
|
197
|
+
customKeys = Object.keys(customEnv);
|
|
198
|
+
logger.debug(`Adding ${customKeys.length} custom environment variables: ${customKeys.join(', ')}`);
|
|
199
|
+
}
|
|
200
|
+
// 6. Final merge (custom env overrides everything)
|
|
201
|
+
const processedEnv = { ...combinedEnv, ...customEnv };
|
|
202
|
+
const result = {
|
|
203
|
+
processedEnv,
|
|
204
|
+
sources: {
|
|
205
|
+
sdkDefaults: sdkDefaultKeys,
|
|
206
|
+
inherited: inheritedKeys,
|
|
207
|
+
custom: customKeys,
|
|
208
|
+
filtered: filteredKeys,
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
logger.debug(`Environment processing complete. Total variables: ${Object.keys(processedEnv).length}`);
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=envProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envProcessor.js","sourceRoot":"","sources":["../../src/utils/envProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,69 @@ export declare function sanitizeErrorMessage(error: string): string;
|
|
|
48
48
|
* @returns Sanitized headers object safe for logging
|
|
49
49
|
*/
|
|
50
50
|
export declare function sanitizeHeaders(headers: Record<string, any>): Record<string, any>;
|
|
51
|
+
/**
|
|
52
|
+
* Tag validation result interface
|
|
53
|
+
*/
|
|
54
|
+
export interface TagValidationResult {
|
|
55
|
+
isValid: boolean;
|
|
56
|
+
sanitizedTag: string;
|
|
57
|
+
warnings: string[];
|
|
58
|
+
errors: string[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Validates and sanitizes a single tag
|
|
62
|
+
* Checks for problematic characters and provides warnings/errors
|
|
63
|
+
*
|
|
64
|
+
* @param tag - The tag to validate and sanitize
|
|
65
|
+
* @returns Validation result with sanitized tag and any warnings/errors
|
|
66
|
+
*/
|
|
67
|
+
export declare function validateAndSanitizeTag(tag: string): TagValidationResult;
|
|
68
|
+
/**
|
|
69
|
+
* Validates and sanitizes an array of tags
|
|
70
|
+
* Filters out invalid tags and provides consolidated warnings
|
|
71
|
+
*
|
|
72
|
+
* @param tags - Array of tags to validate
|
|
73
|
+
* @param maxTags - Maximum number of tags allowed (default: 50)
|
|
74
|
+
* @returns Object with valid tags, warnings, and errors
|
|
75
|
+
*/
|
|
76
|
+
export declare function validateAndSanitizeTags(tags: string[], maxTags?: number): {
|
|
77
|
+
validTags: string[];
|
|
78
|
+
warnings: string[];
|
|
79
|
+
errors: string[];
|
|
80
|
+
invalidTags: string[];
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Normalizes a tag for consistent comparison
|
|
84
|
+
* Applies the same normalization used in validation
|
|
85
|
+
*
|
|
86
|
+
* @param tag - The tag to normalize
|
|
87
|
+
* @returns Normalized tag
|
|
88
|
+
*/
|
|
89
|
+
export declare function normalizeTag(tag: string): string;
|
|
90
|
+
/**
|
|
91
|
+
* Redacts sensitive values using pattern matching
|
|
92
|
+
* Identifies and redacts common sensitive patterns like API keys, tokens, passwords
|
|
93
|
+
*
|
|
94
|
+
* @param value - The value to check and potentially redact
|
|
95
|
+
* @returns Redacted value if sensitive patterns are found, otherwise original value
|
|
96
|
+
*/
|
|
97
|
+
export declare function redactSensitiveValue(value: string): string;
|
|
98
|
+
/**
|
|
99
|
+
* Redacts sensitive information from command line arguments
|
|
100
|
+
* Handles both --key=value and --key value formats
|
|
101
|
+
*
|
|
102
|
+
* @param args - Array of command line arguments
|
|
103
|
+
* @returns Array with sensitive values redacted
|
|
104
|
+
*/
|
|
105
|
+
export declare function redactCommandArgs(args: string[]): string[];
|
|
106
|
+
/**
|
|
107
|
+
* Redacts sensitive information from URLs
|
|
108
|
+
* Handles basic auth, query parameters with sensitive data
|
|
109
|
+
*
|
|
110
|
+
* @param url - The URL to sanitize
|
|
111
|
+
* @returns URL with sensitive information redacted
|
|
112
|
+
*/
|
|
113
|
+
export declare function redactUrl(url: string): string;
|
|
51
114
|
/**
|
|
52
115
|
* Comprehensive sanitization for server configuration data
|
|
53
116
|
* Applies appropriate sanitization based on the context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitization.d.ts","sourceRoot":"","sources":["../../src/utils/sanitization.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CASjD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAkB7D;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAqBvE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAc1D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAkBjF;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,UAAU,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAC/C,MAAM,CAaR"}
|
|
1
|
+
{"version":3,"file":"sanitization.d.ts","sourceRoot":"","sources":["../../src/utils/sanitization.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CASjD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAkB7D;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAqBvE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAc1D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAkBjF;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAgGvE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,MAAW,GACnB;IACD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAgDA;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAahD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgC1D;AA4BD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA0C1D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAyC7C;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,UAAU,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAC/C,MAAM,CAaR"}
|
|
@@ -124,6 +124,314 @@ export function sanitizeHeaders(headers) {
|
|
|
124
124
|
}
|
|
125
125
|
return sanitized;
|
|
126
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Validates and sanitizes a single tag
|
|
129
|
+
* Checks for problematic characters and provides warnings/errors
|
|
130
|
+
*
|
|
131
|
+
* @param tag - The tag to validate and sanitize
|
|
132
|
+
* @returns Validation result with sanitized tag and any warnings/errors
|
|
133
|
+
*/
|
|
134
|
+
export function validateAndSanitizeTag(tag) {
|
|
135
|
+
const result = {
|
|
136
|
+
isValid: true,
|
|
137
|
+
sanitizedTag: '',
|
|
138
|
+
warnings: [],
|
|
139
|
+
errors: [],
|
|
140
|
+
};
|
|
141
|
+
// Handle null/undefined tags
|
|
142
|
+
if (tag === null || tag === undefined || typeof tag !== 'string') {
|
|
143
|
+
result.isValid = false;
|
|
144
|
+
result.errors.push('Tag cannot be empty or null');
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
// Trim whitespace
|
|
148
|
+
const trimmedTag = tag.trim();
|
|
149
|
+
if (trimmedTag.length === 0) {
|
|
150
|
+
result.isValid = false;
|
|
151
|
+
result.errors.push('Tag cannot be empty or whitespace only');
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
// Check length limits
|
|
155
|
+
if (trimmedTag.length > 100) {
|
|
156
|
+
result.isValid = false;
|
|
157
|
+
result.errors.push('Tag length cannot exceed 100 characters');
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
if (trimmedTag.length < 1) {
|
|
161
|
+
result.isValid = false;
|
|
162
|
+
result.errors.push('Tag must be at least 1 character long');
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
// Decode URL encoding if present
|
|
166
|
+
let decodedTag = trimmedTag;
|
|
167
|
+
try {
|
|
168
|
+
// Check if it's URL encoded and decode it
|
|
169
|
+
if (trimmedTag.includes('%')) {
|
|
170
|
+
decodedTag = decodeURIComponent(trimmedTag);
|
|
171
|
+
if (decodedTag !== trimmedTag) {
|
|
172
|
+
result.warnings.push('Tag was URL decoded');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch (_e) {
|
|
177
|
+
result.warnings.push('Tag contains invalid URL encoding');
|
|
178
|
+
decodedTag = trimmedTag; // Keep original if decode fails
|
|
179
|
+
}
|
|
180
|
+
// Check for problematic characters and warn
|
|
181
|
+
const problematicChars = {
|
|
182
|
+
',': 'commas can interfere with tag list parsing',
|
|
183
|
+
'&': 'ampersands can interfere with URL parameters',
|
|
184
|
+
'=': 'equals signs can interfere with URL parameters',
|
|
185
|
+
'?': 'question marks can interfere with URL parsing',
|
|
186
|
+
'#': 'hash symbols can interfere with URL fragments',
|
|
187
|
+
'/': 'slashes can interfere with URL paths',
|
|
188
|
+
'\\': 'backslashes can cause parsing issues',
|
|
189
|
+
'<': 'less-than symbols can cause HTML injection issues',
|
|
190
|
+
'>': 'greater-than symbols can cause HTML injection issues',
|
|
191
|
+
'"': 'double quotes can cause parsing issues',
|
|
192
|
+
"'": 'single quotes can cause parsing issues',
|
|
193
|
+
'`': 'backticks can cause script injection issues',
|
|
194
|
+
'\n': 'newlines can cause parsing issues',
|
|
195
|
+
'\r': 'carriage returns can cause parsing issues',
|
|
196
|
+
'\t': 'tabs can cause formatting issues',
|
|
197
|
+
};
|
|
198
|
+
// Check each character for problems
|
|
199
|
+
for (const [char, reason] of Object.entries(problematicChars)) {
|
|
200
|
+
if (decodedTag.includes(char)) {
|
|
201
|
+
result.warnings.push(`Contains '${char}' - ${reason}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Check for control characters
|
|
205
|
+
// eslint-disable-next-line no-control-regex
|
|
206
|
+
const controlCharRegex = /[\x00-\x1f\x7f]/;
|
|
207
|
+
if (controlCharRegex.test(decodedTag)) {
|
|
208
|
+
result.warnings.push('Contains control characters that may cause issues');
|
|
209
|
+
}
|
|
210
|
+
// Check for non-ASCII characters (international characters are OK, but warn)
|
|
211
|
+
// eslint-disable-next-line no-control-regex
|
|
212
|
+
const nonAsciiRegex = /[^\x00-\x7f]/;
|
|
213
|
+
if (nonAsciiRegex.test(decodedTag)) {
|
|
214
|
+
result.warnings.push('Contains non-ASCII characters (international characters)');
|
|
215
|
+
}
|
|
216
|
+
// Normalize the tag for consistent comparison
|
|
217
|
+
result.sanitizedTag = decodedTag.trim().toLowerCase();
|
|
218
|
+
return result;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Validates and sanitizes an array of tags
|
|
222
|
+
* Filters out invalid tags and provides consolidated warnings
|
|
223
|
+
*
|
|
224
|
+
* @param tags - Array of tags to validate
|
|
225
|
+
* @param maxTags - Maximum number of tags allowed (default: 50)
|
|
226
|
+
* @returns Object with valid tags, warnings, and errors
|
|
227
|
+
*/
|
|
228
|
+
export function validateAndSanitizeTags(tags, maxTags = 50) {
|
|
229
|
+
const result = {
|
|
230
|
+
validTags: [],
|
|
231
|
+
warnings: [],
|
|
232
|
+
errors: [],
|
|
233
|
+
invalidTags: [],
|
|
234
|
+
};
|
|
235
|
+
if (!Array.isArray(tags)) {
|
|
236
|
+
result.errors.push('Tags must be an array');
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
if (tags.length > maxTags) {
|
|
240
|
+
result.errors.push(`Too many tags: maximum ${maxTags} allowed, got ${tags.length}`);
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
const seenTags = new Set();
|
|
244
|
+
for (let i = 0; i < tags.length; i++) {
|
|
245
|
+
const tag = tags[i];
|
|
246
|
+
const validation = validateAndSanitizeTag(tag);
|
|
247
|
+
if (!validation.isValid) {
|
|
248
|
+
result.invalidTags.push(tag);
|
|
249
|
+
validation.errors.forEach((error) => {
|
|
250
|
+
result.errors.push(`Tag ${i + 1} "${tag}": ${error}`);
|
|
251
|
+
});
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
// Check for duplicates
|
|
255
|
+
if (seenTags.has(validation.sanitizedTag)) {
|
|
256
|
+
result.warnings.push(`Duplicate tag after normalization: "${tag}"`);
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
seenTags.add(validation.sanitizedTag);
|
|
260
|
+
result.validTags.push(validation.sanitizedTag);
|
|
261
|
+
// Add warnings with tag context
|
|
262
|
+
validation.warnings.forEach((warning) => {
|
|
263
|
+
result.warnings.push(`Tag "${tag}": ${warning}`);
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Normalizes a tag for consistent comparison
|
|
270
|
+
* Applies the same normalization used in validation
|
|
271
|
+
*
|
|
272
|
+
* @param tag - The tag to normalize
|
|
273
|
+
* @returns Normalized tag
|
|
274
|
+
*/
|
|
275
|
+
export function normalizeTag(tag) {
|
|
276
|
+
if (!tag || typeof tag !== 'string') {
|
|
277
|
+
return '';
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
// Decode URL encoding if present
|
|
281
|
+
let normalized = tag.includes('%') ? decodeURIComponent(tag) : tag;
|
|
282
|
+
return normalized.trim().toLowerCase();
|
|
283
|
+
}
|
|
284
|
+
catch (_e) {
|
|
285
|
+
// If decode fails, just normalize without decoding
|
|
286
|
+
return tag.trim().toLowerCase();
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Redacts sensitive values using pattern matching
|
|
291
|
+
* Identifies and redacts common sensitive patterns like API keys, tokens, passwords
|
|
292
|
+
*
|
|
293
|
+
* @param value - The value to check and potentially redact
|
|
294
|
+
* @returns Redacted value if sensitive patterns are found, otherwise original value
|
|
295
|
+
*/
|
|
296
|
+
export function redactSensitiveValue(value) {
|
|
297
|
+
if (!value || typeof value !== 'string') {
|
|
298
|
+
return value;
|
|
299
|
+
}
|
|
300
|
+
// Define patterns for sensitive data
|
|
301
|
+
const sensitivePatterns = [
|
|
302
|
+
/^(sk-|pk-|rk-|ak-)[a-zA-Z0-9]{10,}$/i, // API keys (common prefixes, reduced min length)
|
|
303
|
+
/^[A-Za-z0-9_-]{32,}$/, // Long tokens/keys (32+ chars, alphanumeric + _-)
|
|
304
|
+
/^[A-Fa-f0-9]{32,}$/, // Hex tokens (32+ chars)
|
|
305
|
+
/^ghp_[a-zA-Z0-9]{36}$/, // GitHub personal access tokens
|
|
306
|
+
/^gho_[a-zA-Z0-9]{36}$/, // GitHub OAuth tokens
|
|
307
|
+
/^(AKIA|ASIA)[A-Z0-9]{16}$/, // AWS access keys
|
|
308
|
+
/^[a-zA-Z0-9+/]{40}==$/, // Base64 encoded secrets (common lengths)
|
|
309
|
+
/^bearer\s+.{10,}$/i, // Bearer tokens
|
|
310
|
+
/^[a-zA-Z0-9]{64}$/, // 64 character hex tokens
|
|
311
|
+
];
|
|
312
|
+
// Check for sensitive patterns
|
|
313
|
+
const isSensitive = sensitivePatterns.some((pattern) => pattern.test(value));
|
|
314
|
+
if (isSensitive) {
|
|
315
|
+
return '[REDACTED]';
|
|
316
|
+
}
|
|
317
|
+
// Check for sensitive environment variable names
|
|
318
|
+
const envVarName = value.includes('=') ? value.split('=')[0] : '';
|
|
319
|
+
if (envVarName && isSensitiveEnvVar(envVarName)) {
|
|
320
|
+
return '[REDACTED]';
|
|
321
|
+
}
|
|
322
|
+
return value;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Checks if an environment variable name indicates sensitive content
|
|
326
|
+
*
|
|
327
|
+
* @param name - The environment variable name to check
|
|
328
|
+
* @returns True if the name suggests sensitive content
|
|
329
|
+
*/
|
|
330
|
+
function isSensitiveEnvVar(name) {
|
|
331
|
+
const sensitiveEnvPatterns = [
|
|
332
|
+
/password/i,
|
|
333
|
+
/secret/i,
|
|
334
|
+
/key/i,
|
|
335
|
+
/token/i,
|
|
336
|
+
/auth/i,
|
|
337
|
+
/credential/i,
|
|
338
|
+
/private/i,
|
|
339
|
+
/api[_-]?key/i,
|
|
340
|
+
/access[_-]?token/i,
|
|
341
|
+
/client[_-]?secret/i,
|
|
342
|
+
/database[_-]?url/i,
|
|
343
|
+
/db[_-]?url/i,
|
|
344
|
+
/connection[_-]?string/i,
|
|
345
|
+
];
|
|
346
|
+
return sensitiveEnvPatterns.some((pattern) => pattern.test(name));
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Redacts sensitive information from command line arguments
|
|
350
|
+
* Handles both --key=value and --key value formats
|
|
351
|
+
*
|
|
352
|
+
* @param args - Array of command line arguments
|
|
353
|
+
* @returns Array with sensitive values redacted
|
|
354
|
+
*/
|
|
355
|
+
export function redactCommandArgs(args) {
|
|
356
|
+
if (!args || !Array.isArray(args)) {
|
|
357
|
+
return args;
|
|
358
|
+
}
|
|
359
|
+
const redactedArgs = [];
|
|
360
|
+
const sensitiveFlags = [/^-{1,2}(api[_-]?key|token|password|secret|auth|credential|private[_-]?key)$/i];
|
|
361
|
+
for (let i = 0; i < args.length; i++) {
|
|
362
|
+
const arg = args[i];
|
|
363
|
+
// Handle --key=value format
|
|
364
|
+
if (arg.includes('=')) {
|
|
365
|
+
const [flag, value] = arg.split('=', 2);
|
|
366
|
+
const isSensitiveFlag = sensitiveFlags.some((pattern) => pattern.test(flag));
|
|
367
|
+
if (isSensitiveFlag || redactSensitiveValue(value) === '[REDACTED]') {
|
|
368
|
+
redactedArgs.push(`${flag}=[REDACTED]`);
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
redactedArgs.push(arg);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Handle --key value format
|
|
375
|
+
else if (i < args.length - 1) {
|
|
376
|
+
const isSensitiveFlag = sensitiveFlags.some((pattern) => pattern.test(arg));
|
|
377
|
+
const nextArg = args[i + 1];
|
|
378
|
+
if (isSensitiveFlag || (!nextArg.startsWith('-') && redactSensitiveValue(nextArg) === '[REDACTED]')) {
|
|
379
|
+
redactedArgs.push(arg);
|
|
380
|
+
redactedArgs.push('[REDACTED]');
|
|
381
|
+
i++; // Skip the next argument since we processed it
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
redactedArgs.push(arg);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// Regular argument or flag without value
|
|
388
|
+
else {
|
|
389
|
+
redactedArgs.push(arg);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return redactedArgs;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Redacts sensitive information from URLs
|
|
396
|
+
* Handles basic auth, query parameters with sensitive data
|
|
397
|
+
*
|
|
398
|
+
* @param url - The URL to sanitize
|
|
399
|
+
* @returns URL with sensitive information redacted
|
|
400
|
+
*/
|
|
401
|
+
export function redactUrl(url) {
|
|
402
|
+
if (!url || typeof url !== 'string') {
|
|
403
|
+
return url;
|
|
404
|
+
}
|
|
405
|
+
try {
|
|
406
|
+
const urlObj = new URL(url);
|
|
407
|
+
// Redact basic authentication
|
|
408
|
+
if (urlObj.username || urlObj.password) {
|
|
409
|
+
urlObj.username = 'REDACTED';
|
|
410
|
+
urlObj.password = 'REDACTED';
|
|
411
|
+
}
|
|
412
|
+
// Redact sensitive query parameters
|
|
413
|
+
const sensitiveQueryParams = [/^(api[_-]?key|token|password|secret|auth|access[_-]?token|client[_-]?secret)$/i];
|
|
414
|
+
const params = new URLSearchParams(urlObj.search);
|
|
415
|
+
let hasChanges = false;
|
|
416
|
+
for (const [key, value] of params.entries()) {
|
|
417
|
+
const isSensitive = sensitiveQueryParams.some((pattern) => pattern.test(key)) || redactSensitiveValue(value) === '[REDACTED]';
|
|
418
|
+
if (isSensitive) {
|
|
419
|
+
params.set(key, 'REDACTED');
|
|
420
|
+
hasChanges = true;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
if (hasChanges) {
|
|
424
|
+
urlObj.search = params.toString();
|
|
425
|
+
}
|
|
426
|
+
return urlObj.toString();
|
|
427
|
+
}
|
|
428
|
+
catch (_error) {
|
|
429
|
+
// If URL parsing fails, try basic string replacement for common patterns
|
|
430
|
+
return url
|
|
431
|
+
.replace(/(https?:\/\/)[^:]+:[^@]+@/i, '$1REDACTED:REDACTED@')
|
|
432
|
+
.replace(/([?&])(api[_-]?key|token|password|secret|auth)=([^&]*)/gi, '$1$2=REDACTED');
|
|
433
|
+
}
|
|
434
|
+
}
|
|
127
435
|
/**
|
|
128
436
|
* Comprehensive sanitization for server configuration data
|
|
129
437
|
* Applies appropriate sanitization based on the context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitization.js","sourceRoot":"","sources":["../../src/utils/sanitization.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sanitization.js","sourceRoot":"","sources":["../../src/utils/sanitization.ts"],"names":[],"mappings":"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"}
|