appsec-agent 0.0.2 → 0.0.4
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/bin/agent-run.js +5 -0
- package/conf/appsec_agent.yaml +1 -1
- package/dist/agent_actions.d.ts +1 -0
- package/dist/agent_actions.d.ts.map +1 -1
- package/dist/agent_actions.js +109 -34
- package/dist/agent_actions.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +72 -11
- package/dist/main.js.map +1 -1
- package/dist/utils.d.ts +41 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +236 -11
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
package/bin/agent-run.js
CHANGED
|
@@ -67,7 +67,12 @@ if (options.list_roles) {
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
// Set Anthropic API environment variables if provided via command line
|
|
70
|
+
// SECURITY WARNING: Passing API keys via command line is insecure as they may be visible
|
|
71
|
+
// in process lists and shell history. Prefer using environment variables.
|
|
70
72
|
if (options.anthropicApiKey) {
|
|
73
|
+
console.warn('⚠️ SECURITY WARNING: API key provided via command line argument.');
|
|
74
|
+
console.warn(' Command-line arguments may be visible in process lists and shell history.');
|
|
75
|
+
console.warn(' For better security, use the ANTHROPIC_API_KEY environment variable instead.\n');
|
|
71
76
|
process.env.ANTHROPIC_API_KEY = options.anthropicApiKey;
|
|
72
77
|
}
|
|
73
78
|
if (options.anthropicBaseUrl) {
|
package/conf/appsec_agent.yaml
CHANGED
|
@@ -7,7 +7,7 @@ default: &default
|
|
|
7
7
|
simple_query_agent:
|
|
8
8
|
options:
|
|
9
9
|
system_prompt: "You are an AppSec expert assistant. You are responsible for providing security advice and guidance to the user."
|
|
10
|
-
max_turns:
|
|
10
|
+
max_turns: 100
|
|
11
11
|
output_format: "stdout"
|
|
12
12
|
verbose: True
|
|
13
13
|
code_reviewer:
|
package/dist/agent_actions.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent_actions.d.ts","sourceRoot":"","sources":["../src/agent_actions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"agent_actions.d.ts","sourceRoot":"","sources":["../src/agent_actions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAOD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,mBAAmB,CAA2B;gBAE1C,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS;IAMtE;;OAEG;IACG,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqNvE;;OAEG;IACG,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BlE;;OAEG;IACG,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA6BzE"}
|
package/dist/agent_actions.js
CHANGED
|
@@ -12,6 +12,7 @@ class AgentActions {
|
|
|
12
12
|
confDict;
|
|
13
13
|
environment;
|
|
14
14
|
args;
|
|
15
|
+
conversationHistory = []; // Store conversation history for simple_query_agent
|
|
15
16
|
constructor(confDict, environment, args) {
|
|
16
17
|
this.confDict = confDict;
|
|
17
18
|
this.environment = environment;
|
|
@@ -23,12 +24,32 @@ class AgentActions {
|
|
|
23
24
|
async simpleQueryClaudeWithOptions(yourPrompt) {
|
|
24
25
|
const agentOptions = new agent_options_1.AgentOptions(this.confDict, this.environment);
|
|
25
26
|
const options = agentOptions.getSimpleQueryAgentOptions(this.args.role);
|
|
27
|
+
// Build prompt with conversation history
|
|
28
|
+
let fullPrompt;
|
|
29
|
+
if (this.conversationHistory.length > 0) {
|
|
30
|
+
// Include previous conversation context
|
|
31
|
+
let contextPrompt = 'Previous conversation:\n';
|
|
32
|
+
for (const entry of this.conversationHistory) {
|
|
33
|
+
if (entry.role === 'user') {
|
|
34
|
+
contextPrompt += `User: ${entry.content}\n`;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
contextPrompt += `Assistant: ${entry.content}\n`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
fullPrompt = `${contextPrompt}\nUser: ${yourPrompt}`;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
fullPrompt = yourPrompt;
|
|
44
|
+
}
|
|
26
45
|
try {
|
|
27
46
|
let accumulatedText = '';
|
|
28
47
|
let hasPrintedHeader = false;
|
|
29
48
|
let hasSeenStreamEvents = false;
|
|
30
49
|
let messageCount = 0;
|
|
31
|
-
|
|
50
|
+
let assistantResponseText = '';
|
|
51
|
+
let finalResult = null;
|
|
52
|
+
for await (const msg of (0, claude_agent_sdk_1.query)({ prompt: fullPrompt, options })) {
|
|
32
53
|
messageCount++;
|
|
33
54
|
// Debug logging (remove in production)
|
|
34
55
|
if (this.args.verbose) {
|
|
@@ -48,6 +69,7 @@ class AgentActions {
|
|
|
48
69
|
}
|
|
49
70
|
// Accumulate and write streaming deltas directly
|
|
50
71
|
accumulatedText += deltaText;
|
|
72
|
+
assistantResponseText += deltaText;
|
|
51
73
|
process.stdout.write(deltaText);
|
|
52
74
|
}
|
|
53
75
|
}
|
|
@@ -58,53 +80,80 @@ class AgentActions {
|
|
|
58
80
|
console.log(`\nClaude:\n`);
|
|
59
81
|
hasPrintedHeader = true;
|
|
60
82
|
}
|
|
61
|
-
//
|
|
62
|
-
|
|
83
|
+
// Don't reset accumulatedText here - we want to accumulate ALL text across all blocks
|
|
84
|
+
// Only reset if this is truly a new message (but we can't tell that here)
|
|
85
|
+
// Actually, we should keep accumulating to get the full response
|
|
63
86
|
}
|
|
64
|
-
// Handle message stop (
|
|
87
|
+
// Handle message stop (one message/turn is complete, but stream may continue)
|
|
65
88
|
else if (streamMsg.event?.type === 'message_stop') {
|
|
66
|
-
//
|
|
89
|
+
// One message is complete, but the stream may continue with more messages
|
|
90
|
+
// (e.g., after tools execute). Don't treat this as stream end.
|
|
67
91
|
if (hasPrintedHeader && accumulatedText) {
|
|
68
|
-
//
|
|
92
|
+
// This message is done, but more may come
|
|
69
93
|
}
|
|
70
94
|
}
|
|
95
|
+
// Handle other stream event types we might not be handling
|
|
96
|
+
else if (this.args.verbose) {
|
|
97
|
+
console.error(`[DEBUG] Unhandled stream event type: ${streamMsg.event?.type}`);
|
|
98
|
+
}
|
|
71
99
|
}
|
|
72
100
|
// Handle assistant messages (complete messages) - only use if no stream events
|
|
73
101
|
// Note: If we've seen stream events, the content was already printed incrementally
|
|
74
|
-
|
|
102
|
+
// BUT: When tools are used, there may be more assistant messages after tools complete
|
|
103
|
+
// So we need to handle both cases
|
|
104
|
+
else if (msg.type === 'assistant') {
|
|
75
105
|
const assistantMsg = msg;
|
|
76
106
|
if (assistantMsg.message.content) {
|
|
77
107
|
for (const block of assistantMsg.message.content) {
|
|
78
108
|
if (block.type === 'text') {
|
|
79
109
|
const currentText = block.text || '';
|
|
80
|
-
if (currentText.length > 0
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
hasPrintedHeader
|
|
110
|
+
if (currentText && currentText.length > 0) {
|
|
111
|
+
// If we haven't seen stream events, print the complete message
|
|
112
|
+
if (!hasSeenStreamEvents) {
|
|
113
|
+
if (!hasPrintedHeader) {
|
|
114
|
+
console.log(`\nClaude:\n`);
|
|
115
|
+
hasPrintedHeader = true;
|
|
116
|
+
}
|
|
117
|
+
console.log(currentText);
|
|
118
|
+
accumulatedText = currentText;
|
|
119
|
+
assistantResponseText = currentText;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// If we've seen stream events, this might be additional content after tools
|
|
123
|
+
// Check if this is new content not already accumulated
|
|
124
|
+
if (!currentText.startsWith(accumulatedText) && currentText !== accumulatedText) {
|
|
125
|
+
// This is additional content (e.g., after tools complete)
|
|
126
|
+
const newText = currentText.slice(accumulatedText.length);
|
|
127
|
+
if (newText) {
|
|
128
|
+
process.stdout.write(newText);
|
|
129
|
+
accumulatedText = currentText;
|
|
130
|
+
assistantResponseText = currentText;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else if (currentText.length > accumulatedText.length) {
|
|
134
|
+
// More content than we've accumulated
|
|
135
|
+
const newText = currentText.slice(accumulatedText.length);
|
|
136
|
+
if (newText) {
|
|
137
|
+
process.stdout.write(newText);
|
|
138
|
+
accumulatedText = currentText;
|
|
139
|
+
assistantResponseText = currentText;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
84
142
|
}
|
|
85
|
-
// Print the complete text only if it's different from what we've accumulated
|
|
86
|
-
console.log(currentText);
|
|
87
|
-
accumulatedText = currentText;
|
|
88
143
|
}
|
|
89
144
|
}
|
|
90
145
|
}
|
|
91
146
|
}
|
|
92
147
|
}
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (this.args.verbose) {
|
|
97
|
-
console.error(`[DEBUG] Skipping assistant message (already printed via stream events)`);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// Handle result messages
|
|
148
|
+
// Handle result messages - collect but don't display until stream completes
|
|
149
|
+
// IMPORTANT: The stream may continue after a result message if tools are being used
|
|
150
|
+
// We must continue processing until the stream is truly exhausted
|
|
101
151
|
else if (msg.type === 'result') {
|
|
102
152
|
const resultMsg = msg;
|
|
103
|
-
//
|
|
104
|
-
if
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
// Check for errors in result messages
|
|
153
|
+
// Always update finalResult with the latest result message
|
|
154
|
+
// (there may be multiple result messages if tools are used)
|
|
155
|
+
finalResult = resultMsg;
|
|
156
|
+
// Check for errors in result messages - display errors immediately
|
|
108
157
|
if (resultMsg.is_error) {
|
|
109
158
|
const errorMsg = resultMsg.errors?.[0] || resultMsg.error_message || 'Unknown error occurred';
|
|
110
159
|
console.error(`\nError: ${errorMsg}`);
|
|
@@ -117,12 +166,10 @@ class AgentActions {
|
|
|
117
166
|
console.error(`To allow the agent to use tools and continue, increase max_turns in the configuration or use the code_reviewer role.`);
|
|
118
167
|
}
|
|
119
168
|
}
|
|
120
|
-
|
|
121
|
-
console.log(`\nCost: $${resultMsg.total_cost_usd.toFixed(4)}`);
|
|
122
|
-
}
|
|
123
|
-
// Debug: log turn count
|
|
169
|
+
// Debug: log turn count and continue processing (stream may not be done yet)
|
|
124
170
|
if (this.args.verbose) {
|
|
125
171
|
console.error(`[DEBUG] Result: num_turns=${resultMsg.num_turns}, is_error=${resultMsg.is_error}`);
|
|
172
|
+
console.error(`[DEBUG] Continuing to process stream (may have more messages after tools)`);
|
|
126
173
|
}
|
|
127
174
|
}
|
|
128
175
|
// Handle tool progress messages (agent might be using tools)
|
|
@@ -133,20 +180,48 @@ class AgentActions {
|
|
|
133
180
|
console.log(`[Tool Progress] ${toolMsg.tool_name}: ${toolMsg.elapsed_time_seconds}s`);
|
|
134
181
|
}
|
|
135
182
|
}
|
|
136
|
-
// Log other message types
|
|
137
|
-
else
|
|
138
|
-
|
|
183
|
+
// Log other message types - always log to help debug issues
|
|
184
|
+
else {
|
|
185
|
+
// Unknown message type - log it to help debug
|
|
186
|
+
if (this.args.verbose) {
|
|
187
|
+
console.error(`[DEBUG] Received unknown message type: ${msg.type}`);
|
|
188
|
+
console.error(`[DEBUG] Message content:`, JSON.stringify(msg, null, 2));
|
|
189
|
+
}
|
|
139
190
|
}
|
|
140
191
|
}
|
|
141
192
|
// Debug: log total messages processed
|
|
142
193
|
if (this.args.verbose) {
|
|
143
194
|
console.error(`[DEBUG] Total messages processed: ${messageCount}`);
|
|
144
195
|
}
|
|
196
|
+
// Now that the stream is complete, ensure all stdout writes are flushed
|
|
197
|
+
// Use multiple setImmediate calls to ensure the event loop processes all pending writes
|
|
198
|
+
// This is critical when using process.stdout.write() for streaming
|
|
199
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
200
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
201
|
+
// Now that the stream is complete, display the final result (cost, etc.)
|
|
202
|
+
if (finalResult) {
|
|
203
|
+
// Ensure we flush any partial output and add newline
|
|
204
|
+
if (hasPrintedHeader) {
|
|
205
|
+
console.log(); // New line after final output
|
|
206
|
+
}
|
|
207
|
+
// Display cost only after stream is completely done
|
|
208
|
+
if (!finalResult.is_error && finalResult.total_cost_usd && finalResult.total_cost_usd > 0) {
|
|
209
|
+
console.log(`\nCost: $${finalResult.total_cost_usd.toFixed(4)}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// One more flush to ensure cost is written before returning
|
|
213
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
214
|
+
// Store the current exchange in conversation history
|
|
215
|
+
this.conversationHistory.push({ role: 'user', content: yourPrompt });
|
|
216
|
+
if (assistantResponseText) {
|
|
217
|
+
this.conversationHistory.push({ role: 'assistant', content: assistantResponseText });
|
|
218
|
+
}
|
|
145
219
|
}
|
|
146
220
|
catch (error) {
|
|
147
221
|
console.error('Error during query:', error);
|
|
148
222
|
throw error;
|
|
149
223
|
}
|
|
224
|
+
// Add newline for spacing after response (matching Python version)
|
|
150
225
|
console.log();
|
|
151
226
|
return '';
|
|
152
227
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent_actions.js","sourceRoot":"","sources":["../src/agent_actions.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,qEAA8F;AAC9F,mDAA+C;
|
|
1
|
+
{"version":3,"file":"agent_actions.js","sourceRoot":"","sources":["../src/agent_actions.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAgB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG1D,wBAAsB,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAgB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG1D,wBAAsB,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiIxE"}
|
package/dist/main.js
CHANGED
|
@@ -46,38 +46,94 @@ async function main(confDict, args) {
|
|
|
46
46
|
const agentActions = new agent_actions_1.AgentActions(confDict, args.environment, args);
|
|
47
47
|
if (args.role === 'simple_query_agent') {
|
|
48
48
|
console.log('Running Simple Query Agent');
|
|
49
|
+
console.log("(Type '/end' to exit the conversation)\n");
|
|
49
50
|
const readline = require('readline');
|
|
50
51
|
const rl = readline.createInterface({
|
|
51
52
|
input: process.stdin,
|
|
52
53
|
output: process.stdout
|
|
53
54
|
});
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
// Continuous conversation loop
|
|
56
|
+
while (true) {
|
|
57
|
+
// Wait for Claude's response to complete before showing next prompt
|
|
58
|
+
const yourPrompt = await new Promise((resolve) => {
|
|
59
|
+
rl.question("Your turn (enter '/end' to exit the conversation): ", (answer) => {
|
|
60
|
+
resolve(answer);
|
|
61
|
+
});
|
|
58
62
|
});
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
// Check for exit command
|
|
64
|
+
if (yourPrompt.trim().toLowerCase() === '/end') {
|
|
65
|
+
console.log('\nExiting Simple Query Agent. Goodbye!');
|
|
66
|
+
rl.close();
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
// Skip empty prompts
|
|
70
|
+
if (!yourPrompt.trim()) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// Process the query and wait for complete response
|
|
74
|
+
// The method will add proper spacing after the response completes
|
|
75
|
+
await agentActions.simpleQueryClaudeWithOptions(yourPrompt);
|
|
76
|
+
// Ensure stdout is fully flushed and event loop processes all writes
|
|
77
|
+
// before showing next prompt. This prevents the prompt from appearing
|
|
78
|
+
// before streaming output completes.
|
|
79
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
80
|
+
}
|
|
61
81
|
}
|
|
62
82
|
else if (args.role === 'code_reviewer') {
|
|
63
83
|
console.log('Running Code Review Agent');
|
|
84
|
+
// Validate output file path
|
|
85
|
+
const validatedOutputFile = (0, utils_1.validateOutputFilePath)(args.output_file || 'code_review_report.md');
|
|
86
|
+
if (!validatedOutputFile) {
|
|
87
|
+
console.error(`Error: Invalid output file path: ${args.output_file}`);
|
|
88
|
+
console.error('Output file path must be relative to the current working directory and cannot contain directory traversal sequences.');
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
64
91
|
let userPrompt;
|
|
92
|
+
let tmpSrcDir = null;
|
|
65
93
|
if (args.src_dir) {
|
|
94
|
+
// Validate source directory path
|
|
95
|
+
if (!(0, utils_1.validateDirectoryPath)(args.src_dir, true)) {
|
|
96
|
+
console.error(`Error: Invalid source directory path: ${args.src_dir}`);
|
|
97
|
+
console.error('Source directory path must be valid and cannot contain directory traversal sequences.');
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
66
100
|
const currentWorkingDir = process.cwd();
|
|
67
|
-
|
|
68
|
-
userPrompt = `Review the code in the current working directory ${tmpSrcDir}, then provide a report of the potential security and privacy issues found in the code. Please write the review report in the ${
|
|
101
|
+
tmpSrcDir = (0, utils_1.copyProjectSrcDir)(currentWorkingDir, args.src_dir);
|
|
102
|
+
userPrompt = `Review the code in the current working directory ${tmpSrcDir}, then provide a report of the potential security and privacy issues found in the code. Please write the review report in the ${validatedOutputFile} file under current working directory in ${args.output_format} format.`;
|
|
69
103
|
}
|
|
70
104
|
else {
|
|
71
|
-
userPrompt = `Review the code in the current working directory, then provide a report of the potential security and privacy issues found in the code. Please write the review report in the ${
|
|
105
|
+
userPrompt = `Review the code in the current working directory, then provide a report of the potential security and privacy issues found in the code. Please write the review report in the ${validatedOutputFile} file under current working directory in ${args.output_format} format.`;
|
|
72
106
|
}
|
|
73
107
|
await agentActions.codeReviewerWithOptions(userPrompt);
|
|
108
|
+
// Clean up temporary source code directory if it was created
|
|
109
|
+
if (tmpSrcDir && fs.existsSync(tmpSrcDir)) {
|
|
110
|
+
try {
|
|
111
|
+
fs.removeSync(tmpSrcDir);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.warn(`Warning: Could not clean up temporary directory ${tmpSrcDir}:`, error);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
74
117
|
}
|
|
75
118
|
else if (args.role === 'threat_modeler') {
|
|
76
119
|
console.log('Running Threat Modeler');
|
|
77
|
-
|
|
120
|
+
// Validate output file path
|
|
121
|
+
const validatedOutputFile = (0, utils_1.validateOutputFilePath)(args.output_file || 'threat_model_report.md');
|
|
122
|
+
if (!validatedOutputFile) {
|
|
123
|
+
console.error(`Error: Invalid output file path: ${args.output_file}`);
|
|
124
|
+
console.error('Output file path must be relative to the current working directory and cannot contain directory traversal sequences.');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
const userPrompt0 = `Draw the ASCII text based Data Flow Diagram (DFD), with output format as <codebase_data_flow_diagram_text_timestamp>. Then proceeding to use STRIDE methodology to perform threat modeling on the DFD, without output report in the format <codebase_threat_model_timestamp>. Finally, provide a separate risk registry report including proposed remediation plan in the format <codebase_risk_registry_text_timestamp>. We're looking for 3 reports in the current working directory as the deliverable. Please write the threat modeler report in the ${validatedOutputFile} file under current working directory in ${args.output_format} format.`;
|
|
78
128
|
let tmpSrcDir = null;
|
|
79
129
|
let userPrompt;
|
|
80
130
|
if (args.src_dir) {
|
|
131
|
+
// Validate source directory path
|
|
132
|
+
if (!(0, utils_1.validateDirectoryPath)(args.src_dir, true)) {
|
|
133
|
+
console.error(`Error: Invalid source directory path: ${args.src_dir}`);
|
|
134
|
+
console.error('Source directory path must be valid and cannot contain directory traversal sequences.');
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
81
137
|
const currentWorkingDir = process.cwd();
|
|
82
138
|
tmpSrcDir = (0, utils_1.copyProjectSrcDir)(currentWorkingDir, args.src_dir);
|
|
83
139
|
userPrompt = `Review the code in the ${tmpSrcDir} directory. ${userPrompt0}`;
|
|
@@ -88,7 +144,12 @@ async function main(confDict, args) {
|
|
|
88
144
|
await agentActions.threatModelerAgentWithOptions(userPrompt);
|
|
89
145
|
// Clean up temporary source code directory
|
|
90
146
|
if (tmpSrcDir && fs.existsSync(tmpSrcDir)) {
|
|
91
|
-
|
|
147
|
+
try {
|
|
148
|
+
fs.removeSync(tmpSrcDir);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.warn(`Warning: Could not clean up temporary directory ${tmpSrcDir}:`, error);
|
|
152
|
+
}
|
|
92
153
|
}
|
|
93
154
|
}
|
|
94
155
|
else {
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQH,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -6,6 +6,38 @@
|
|
|
6
6
|
export interface ConfigDict {
|
|
7
7
|
[key: string]: any;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Security utility functions
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Validate that a path is safe and doesn't contain directory traversal sequences
|
|
14
|
+
* @param filePath The path to validate
|
|
15
|
+
* @param allowAbsolute Whether to allow absolute paths (default: false for output files)
|
|
16
|
+
* @returns true if the path is safe, false otherwise
|
|
17
|
+
*/
|
|
18
|
+
export declare function isSafePath(filePath: string, allowAbsolute?: boolean): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Validate and sanitize a file path to prevent directory traversal
|
|
21
|
+
* @param filePath The path to validate
|
|
22
|
+
* @param baseDir Optional base directory to resolve against
|
|
23
|
+
* @param allowAbsolute Whether to allow absolute paths (default: true for source dirs)
|
|
24
|
+
* @returns The normalized safe path, or null if invalid
|
|
25
|
+
*/
|
|
26
|
+
export declare function validateAndSanitizePath(filePath: string, baseDir?: string, allowAbsolute?: boolean): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Validate that a directory path is safe and exists
|
|
29
|
+
* @param dirPath The directory path to validate (can be absolute or relative)
|
|
30
|
+
* @param mustExist Whether the directory must exist (default: true)
|
|
31
|
+
* @returns true if the path is safe and valid, false otherwise
|
|
32
|
+
*/
|
|
33
|
+
export declare function validateDirectoryPath(dirPath: string, mustExist?: boolean): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Validate output file path to prevent writing outside intended directories
|
|
36
|
+
* @param filePath The output file path (must be relative, not absolute)
|
|
37
|
+
* @param baseDir The base directory (usually current working directory)
|
|
38
|
+
* @returns The validated absolute path, or null if invalid
|
|
39
|
+
*/
|
|
40
|
+
export declare function validateOutputFilePath(filePath: string, baseDir?: string): string | null;
|
|
9
41
|
/**
|
|
10
42
|
* Check if a path is a valid directory
|
|
11
43
|
*/
|
|
@@ -32,8 +64,15 @@ export declare function fileToJson(file: string): any;
|
|
|
32
64
|
export declare function jsonToFile(jsonData: any, file: string): boolean;
|
|
33
65
|
/**
|
|
34
66
|
* Execute shell command and return code, stdout, stderr
|
|
67
|
+
* SECURITY: This function should only be used with trusted, validated commands.
|
|
68
|
+
* Never pass user input directly to this function without validation.
|
|
69
|
+
* @param cmd The command to execute (should be validated and sanitized)
|
|
70
|
+
* @param options Optional execution options
|
|
35
71
|
*/
|
|
36
|
-
export declare function runCommand(cmd: string
|
|
72
|
+
export declare function runCommand(cmd: string, options?: {
|
|
73
|
+
timeout?: number;
|
|
74
|
+
maxBuffer?: number;
|
|
75
|
+
}): {
|
|
37
76
|
code: number;
|
|
38
77
|
stdout: string;
|
|
39
78
|
stderr: string;
|
|
@@ -49,6 +88,7 @@ export declare function loadYaml(confFile: string, verbose?: boolean): ConfigDic
|
|
|
49
88
|
export declare function getProperty(prop: string): string;
|
|
50
89
|
/**
|
|
51
90
|
* Copy project source code directory to current working directory
|
|
91
|
+
* SECURITY: Validates paths to prevent directory traversal attacks
|
|
52
92
|
*/
|
|
53
93
|
export declare function copyProjectSrcDir(currentWorkingDir: string, srcDir: string): string;
|
|
54
94
|
/**
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMpD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBjD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQhE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAQ5C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ/D;AAED
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AAEH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAuBpF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,aAAa,GAAE,OAAc,GAC5B,MAAM,GAAG,IAAI,CA0Cf;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAsBzF;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAiCvG;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMpD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBjD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQhE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAQ5C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ/D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAwClD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAsED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,UAAU,GAAG,IAAI,CA2BtF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA4EnF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAUzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC"}
|
package/dist/utils.js
CHANGED
|
@@ -38,6 +38,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
38
38
|
};
|
|
39
39
|
})();
|
|
40
40
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.isSafePath = isSafePath;
|
|
42
|
+
exports.validateAndSanitizePath = validateAndSanitizePath;
|
|
43
|
+
exports.validateDirectoryPath = validateDirectoryPath;
|
|
44
|
+
exports.validateOutputFilePath = validateOutputFilePath;
|
|
41
45
|
exports.isDirectory = isDirectory;
|
|
42
46
|
exports.isFile = isFile;
|
|
43
47
|
exports.fileToList = fileToList;
|
|
@@ -55,6 +59,142 @@ const fs = __importStar(require("fs-extra"));
|
|
|
55
59
|
const path = __importStar(require("path"));
|
|
56
60
|
const yaml = __importStar(require("yaml"));
|
|
57
61
|
const child_process_1 = require("child_process");
|
|
62
|
+
/**
|
|
63
|
+
* Security utility functions
|
|
64
|
+
*/
|
|
65
|
+
/**
|
|
66
|
+
* Validate that a path is safe and doesn't contain directory traversal sequences
|
|
67
|
+
* @param filePath The path to validate
|
|
68
|
+
* @param allowAbsolute Whether to allow absolute paths (default: false for output files)
|
|
69
|
+
* @returns true if the path is safe, false otherwise
|
|
70
|
+
*/
|
|
71
|
+
function isSafePath(filePath, allowAbsolute = false) {
|
|
72
|
+
if (!filePath || typeof filePath !== 'string') {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
// Check for null bytes and control characters (always dangerous)
|
|
76
|
+
if (/\0/.test(filePath) || /[\x00-\x1f]/.test(filePath)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
// Check for directory traversal patterns
|
|
80
|
+
if (/\.\./.test(filePath)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
// Check for absolute paths if not allowed
|
|
84
|
+
if (!allowAbsolute) {
|
|
85
|
+
if (/^\/+/.test(filePath) || /^[A-Za-z]:/.test(filePath)) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Validate and sanitize a file path to prevent directory traversal
|
|
93
|
+
* @param filePath The path to validate
|
|
94
|
+
* @param baseDir Optional base directory to resolve against
|
|
95
|
+
* @param allowAbsolute Whether to allow absolute paths (default: true for source dirs)
|
|
96
|
+
* @returns The normalized safe path, or null if invalid
|
|
97
|
+
*/
|
|
98
|
+
function validateAndSanitizePath(filePath, baseDir, allowAbsolute = true) {
|
|
99
|
+
if (!filePath || typeof filePath !== 'string') {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
// Check for null bytes and control characters
|
|
103
|
+
if (/\0/.test(filePath) || /[\x00-\x1f]/.test(filePath)) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
// Normalize the path
|
|
108
|
+
let normalizedPath = path.normalize(filePath);
|
|
109
|
+
// Check for directory traversal patterns after normalization
|
|
110
|
+
if (normalizedPath.includes('..')) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
// If absolute paths are not allowed, reject them
|
|
114
|
+
if (!allowAbsolute && (normalizedPath.startsWith('/') || /^[A-Za-z]:/.test(normalizedPath))) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
// If baseDir is provided, resolve against it and ensure the result is within baseDir
|
|
118
|
+
if (baseDir) {
|
|
119
|
+
const baseDirResolved = path.resolve(baseDir);
|
|
120
|
+
const resolvedPath = path.resolve(baseDir, normalizedPath);
|
|
121
|
+
// Ensure the resolved path is within the base directory
|
|
122
|
+
if (!resolvedPath.startsWith(baseDirResolved + path.sep) && resolvedPath !== baseDirResolved) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
return resolvedPath;
|
|
126
|
+
}
|
|
127
|
+
// If no baseDir, return the resolved absolute path
|
|
128
|
+
return path.resolve(normalizedPath);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Validate that a directory path is safe and exists
|
|
136
|
+
* @param dirPath The directory path to validate (can be absolute or relative)
|
|
137
|
+
* @param mustExist Whether the directory must exist (default: true)
|
|
138
|
+
* @returns true if the path is safe and valid, false otherwise
|
|
139
|
+
*/
|
|
140
|
+
function validateDirectoryPath(dirPath, mustExist = true) {
|
|
141
|
+
if (!dirPath || typeof dirPath !== 'string') {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
// Check if path is safe (allow absolute paths for source directories)
|
|
145
|
+
const sanitized = validateAndSanitizePath(dirPath, undefined, true);
|
|
146
|
+
if (!sanitized) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
// Check if directory exists if required
|
|
150
|
+
if (mustExist) {
|
|
151
|
+
try {
|
|
152
|
+
const stats = fs.statSync(sanitized);
|
|
153
|
+
return stats.isDirectory();
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Validate output file path to prevent writing outside intended directories
|
|
163
|
+
* @param filePath The output file path (must be relative, not absolute)
|
|
164
|
+
* @param baseDir The base directory (usually current working directory)
|
|
165
|
+
* @returns The validated absolute path, or null if invalid
|
|
166
|
+
*/
|
|
167
|
+
function validateOutputFilePath(filePath, baseDir = process.cwd()) {
|
|
168
|
+
if (!filePath || typeof filePath !== 'string') {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
// Basic validation - output files should be relative paths only
|
|
172
|
+
if (!isSafePath(filePath, false)) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const baseDirResolved = path.resolve(baseDir);
|
|
177
|
+
const resolvedPath = path.resolve(baseDir, filePath);
|
|
178
|
+
// Ensure the resolved path is within the base directory
|
|
179
|
+
if (!resolvedPath.startsWith(baseDirResolved + path.sep) && resolvedPath !== baseDirResolved) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
// Ensure the parent directory exists or can be created
|
|
183
|
+
const parentDir = path.dirname(resolvedPath);
|
|
184
|
+
if (!fs.existsSync(parentDir)) {
|
|
185
|
+
try {
|
|
186
|
+
fs.mkdirSync(parentDir, { recursive: true });
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return resolvedPath;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
58
198
|
/**
|
|
59
199
|
* Check if a path is a valid directory
|
|
60
200
|
*/
|
|
@@ -139,10 +279,39 @@ function jsonToFile(jsonData, file) {
|
|
|
139
279
|
}
|
|
140
280
|
/**
|
|
141
281
|
* Execute shell command and return code, stdout, stderr
|
|
282
|
+
* SECURITY: This function should only be used with trusted, validated commands.
|
|
283
|
+
* Never pass user input directly to this function without validation.
|
|
284
|
+
* @param cmd The command to execute (should be validated and sanitized)
|
|
285
|
+
* @param options Optional execution options
|
|
142
286
|
*/
|
|
143
|
-
function runCommand(cmd) {
|
|
287
|
+
function runCommand(cmd, options) {
|
|
288
|
+
// Security: Validate that the command doesn't contain dangerous patterns
|
|
289
|
+
// This is a basic check - commands should be validated before calling this function
|
|
290
|
+
if (!cmd || typeof cmd !== 'string') {
|
|
291
|
+
return { code: 1, stdout: '', stderr: 'Invalid command: command must be a non-empty string' };
|
|
292
|
+
}
|
|
293
|
+
// Check for command injection patterns
|
|
294
|
+
const dangerousPatterns = [
|
|
295
|
+
/[;&|`$(){}[\]]/, // Command chaining and injection characters
|
|
296
|
+
/\$\{/, // Variable expansion
|
|
297
|
+
/`/, // Backticks for command substitution
|
|
298
|
+
];
|
|
299
|
+
for (const pattern of dangerousPatterns) {
|
|
300
|
+
if (pattern.test(cmd)) {
|
|
301
|
+
return {
|
|
302
|
+
code: 1,
|
|
303
|
+
stdout: '',
|
|
304
|
+
stderr: 'Invalid command: command contains potentially dangerous characters'
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
}
|
|
144
308
|
try {
|
|
145
|
-
const
|
|
309
|
+
const execOptions = {
|
|
310
|
+
encoding: 'utf-8',
|
|
311
|
+
timeout: options?.timeout || 30000, // 30 second default timeout
|
|
312
|
+
maxBuffer: options?.maxBuffer || 1024 * 1024, // 1MB default buffer
|
|
313
|
+
};
|
|
314
|
+
const stdout = (0, child_process_1.execSync)(cmd, execOptions);
|
|
146
315
|
return { code: 0, stdout, stderr: '' };
|
|
147
316
|
}
|
|
148
317
|
catch (error) {
|
|
@@ -260,21 +429,77 @@ function getProperty(prop) {
|
|
|
260
429
|
}
|
|
261
430
|
/**
|
|
262
431
|
* Copy project source code directory to current working directory
|
|
432
|
+
* SECURITY: Validates paths to prevent directory traversal attacks
|
|
263
433
|
*/
|
|
264
434
|
function copyProjectSrcDir(currentWorkingDir, srcDir) {
|
|
265
|
-
|
|
266
|
-
|
|
435
|
+
// Validate source directory path
|
|
436
|
+
if (!srcDir || typeof srcDir !== 'string') {
|
|
437
|
+
console.error('Error: Source directory path is invalid');
|
|
438
|
+
process.exit(1);
|
|
439
|
+
}
|
|
440
|
+
// Validate that the source directory path is safe (allow absolute paths for source dirs)
|
|
441
|
+
const sanitizedSrcDir = validateAndSanitizePath(srcDir, undefined, true);
|
|
442
|
+
if (!sanitizedSrcDir) {
|
|
443
|
+
console.error(`Error: Source directory path contains invalid or dangerous characters: ${srcDir}`);
|
|
444
|
+
process.exit(1);
|
|
445
|
+
}
|
|
446
|
+
// Check if source directory exists
|
|
447
|
+
if (!fs.existsSync(sanitizedSrcDir)) {
|
|
448
|
+
console.error(`Error: Source directory ${sanitizedSrcDir} does not exist`);
|
|
449
|
+
process.exit(1);
|
|
450
|
+
}
|
|
451
|
+
// Verify it's actually a directory
|
|
452
|
+
try {
|
|
453
|
+
const stats = fs.statSync(sanitizedSrcDir);
|
|
454
|
+
if (!stats.isDirectory()) {
|
|
455
|
+
console.error(`Error: Source path ${sanitizedSrcDir} is not a directory`);
|
|
456
|
+
process.exit(1);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
catch (error) {
|
|
460
|
+
console.error(`Error: Cannot access source directory ${sanitizedSrcDir}:`, error);
|
|
461
|
+
process.exit(1);
|
|
462
|
+
}
|
|
463
|
+
// Validate current working directory
|
|
464
|
+
const sanitizedCwd = path.resolve(currentWorkingDir);
|
|
465
|
+
if (!fs.existsSync(sanitizedCwd)) {
|
|
466
|
+
console.error(`Error: Current working directory ${sanitizedCwd} does not exist`);
|
|
467
|
+
process.exit(1);
|
|
468
|
+
}
|
|
469
|
+
// Create safe temporary directory name
|
|
470
|
+
const srcDirName = path.basename(sanitizedSrcDir);
|
|
471
|
+
if (!srcDirName || srcDirName === '.' || srcDirName === '..') {
|
|
472
|
+
console.error(`Error: Invalid source directory name: ${srcDirName}`);
|
|
473
|
+
process.exit(1);
|
|
474
|
+
}
|
|
475
|
+
// Ensure the temporary directory name is safe
|
|
476
|
+
const safeTmpDirName = '.' + srcDirName.replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
477
|
+
const tmpSrcDir = path.join(sanitizedCwd, safeTmpDirName);
|
|
478
|
+
// Ensure the temporary directory path is within the current working directory
|
|
479
|
+
const tmpSrcDirResolved = path.resolve(tmpSrcDir);
|
|
480
|
+
if (!tmpSrcDirResolved.startsWith(sanitizedCwd + path.sep) && tmpSrcDirResolved !== sanitizedCwd) {
|
|
481
|
+
console.error(`Error: Temporary directory path would be outside working directory`);
|
|
267
482
|
process.exit(1);
|
|
268
483
|
}
|
|
269
|
-
const srcDirList = srcDir.split(path.sep).filter(Boolean);
|
|
270
|
-
const tmpSrcDir = path.join(currentWorkingDir, '.' + srcDirList[srcDirList.length - 1]);
|
|
271
484
|
// Remove existing directory if it exists
|
|
272
|
-
if (fs.existsSync(
|
|
273
|
-
|
|
485
|
+
if (fs.existsSync(tmpSrcDirResolved) && fs.statSync(tmpSrcDirResolved).isDirectory()) {
|
|
486
|
+
try {
|
|
487
|
+
fs.removeSync(tmpSrcDirResolved);
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
console.error(`Error: Cannot remove existing temporary directory ${tmpSrcDirResolved}:`, error);
|
|
491
|
+
process.exit(1);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
console.log(`Copying project source code directory from ${sanitizedSrcDir} to ${tmpSrcDirResolved}`);
|
|
495
|
+
try {
|
|
496
|
+
fs.copySync(sanitizedSrcDir, tmpSrcDirResolved);
|
|
497
|
+
}
|
|
498
|
+
catch (error) {
|
|
499
|
+
console.error(`Error: Failed to copy directory:`, error);
|
|
500
|
+
process.exit(1);
|
|
274
501
|
}
|
|
275
|
-
|
|
276
|
-
fs.copySync(srcDir, tmpSrcDir);
|
|
277
|
-
return tmpSrcDir;
|
|
502
|
+
return tmpSrcDirResolved;
|
|
278
503
|
}
|
|
279
504
|
/**
|
|
280
505
|
* List all available roles
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|