Skip to content

Commit 0944a80

Browse files
Gavin Williamsfatmcgav
authored andcommitted
Include the security fixes from sourcebot-dev#1134
1 parent 29ac2a3 commit 0944a80

2 files changed

Lines changed: 17 additions & 1 deletion

File tree

packages/web/src/features/agents/review-agent/app.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Gitlab } from "@gitbeaker/rest";
33
import { generatePrReviews } from "@/features/agents/review-agent/nodes/generatePrReview";
44
import { githubPushPrReviews } from "@/features/agents/review-agent/nodes/githubPushPrReviews";
55
import { githubPrParser } from "@/features/agents/review-agent/nodes/githubPrParser";
6+
import { getReviewAgentLogDir } from "@/features/agents/review-agent/nodes/invokeDiffReviewLlm";
67
import { gitlabMrParser } from "@/features/agents/review-agent/nodes/gitlabMrParser";
78
import { gitlabPushMrReviews } from "@/features/agents/review-agent/nodes/gitlabPushMrReviews";
89
import { GitHubPullRequest, GitLabMergeRequestPayload } from "@/features/agents/review-agent/types";
@@ -28,7 +29,7 @@ function getReviewAgentLogPath(identifier: string): string | undefined {
2829
return undefined;
2930
}
3031

31-
const reviewAgentLogDir = path.join(env.DATA_CACHE_DIR, "review-agent");
32+
const reviewAgentLogDir = getReviewAgentLogDir();
3233
if (!fs.existsSync(reviewAgentLogDir)) {
3334
fs.mkdirSync(reviewAgentLogDir, { recursive: true });
3435
}

packages/web/src/features/agents/review-agent/nodes/invokeDiffReviewLlm.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,23 @@ import { getAISDKLanguageModelAndOptions, getConfiguredLanguageModels } from "@/
33
import { env } from "@sourcebot/shared";
44
import { generateText } from "ai";
55
import fs from "fs";
6+
import path from "path";
67
import { createLogger } from "@sourcebot/shared";
78

89
const logger = createLogger('invoke-diff-review-llm');
910

11+
export const getReviewAgentLogDir = (): string => {
12+
return path.join(env.DATA_CACHE_DIR, 'review-agent');
13+
};
14+
15+
const validateLogPath = (logPath: string): void => {
16+
const resolved = path.resolve(logPath);
17+
const logDir = getReviewAgentLogDir();
18+
if (!resolved.startsWith(logDir + path.sep)) {
19+
throw new Error('reviewAgentLogPath escapes log directory');
20+
}
21+
};
22+
1023
export const invokeDiffReviewLlm = async (reviewAgentLogPath: string | undefined, prompt: string): Promise<sourcebot_file_diff_review> => {
1124
logger.debug("Executing invoke_diff_review_llm");
1225

@@ -28,6 +41,7 @@ export const invokeDiffReviewLlm = async (reviewAgentLogPath: string | undefined
2841
const { model, providerOptions, temperature } = await getAISDKLanguageModelAndOptions(selectedModel);
2942

3043
if (reviewAgentLogPath) {
44+
validateLogPath(reviewAgentLogPath);
3145
fs.appendFileSync(reviewAgentLogPath, `\n\nPrompt:\n${prompt}`);
3246
}
3347

@@ -42,6 +56,7 @@ export const invokeDiffReviewLlm = async (reviewAgentLogPath: string | undefined
4256

4357
const responseText = result.text;
4458
if (reviewAgentLogPath) {
59+
validateLogPath(reviewAgentLogPath);
4560
fs.appendFileSync(reviewAgentLogPath, `\n\nResponse:\n${responseText}`);
4661
}
4762

0 commit comments

Comments
 (0)