Skip to content

Commit 5f6ae1b

Browse files
Sast Lightweight Scan Add New Command (AST-42347) (#648)
* Sast Lightweight Scan Add New Command
1 parent 97ac398 commit 5f6ae1b

File tree

8 files changed

+329
-1
lines changed

8 files changed

+329
-1
lines changed

src/main/vorpal/CxVorpal.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import VorpalScanDetail from "./VorpalScanDetail";
2+
3+
export default class CxVorpal {
4+
requestId: string;
5+
status: boolean;
6+
message: string;
7+
scanDetails: VorpalScanDetail[];
8+
error: any;
9+
10+
constructor() {
11+
this.requestId = '';
12+
this.status = false;
13+
this.message = '';
14+
this.scanDetails = [];
15+
this.error = null;
16+
}
17+
18+
static parseScan(resultObject: any): CxVorpal {
19+
const scan = new CxVorpal();
20+
scan.requestId = resultObject.request_id;
21+
scan.status = resultObject.status;
22+
scan.message = resultObject.message;
23+
scan.error = resultObject.error;
24+
25+
if (resultObject.scan_details instanceof Array) {
26+
scan.scanDetails = resultObject.scan_details.map((detail: any) => {
27+
const scanDetail = new VorpalScanDetail();
28+
scanDetail.ruleId = detail.rule_id;
29+
scanDetail.language = detail.language;
30+
scanDetail.ruleName = detail.rule_name;
31+
scanDetail.severity = detail.severity;
32+
scanDetail.fileName = detail.file_name;
33+
scanDetail.line = detail.line;
34+
scanDetail.length = detail.length;
35+
scanDetail.problematicLine = detail.problematicLine;
36+
scanDetail.remediationAdvise = detail.remediationAdvise;
37+
scanDetail.description = detail.description;
38+
return scanDetail;
39+
});
40+
}
41+
42+
return scan;
43+
}
44+
}

src/main/vorpal/VorpalScanDetail.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
export default class VorpalScanDetail {
2+
ruleId: number;
3+
language: string;
4+
ruleName: string;
5+
severity: string;
6+
fileName: string;
7+
line: number;
8+
length: number;
9+
problematicLine: string;
10+
remediationAdvise: string;
11+
description: string;
12+
13+
constructor() {
14+
this.ruleId = 0;
15+
this.language = '';
16+
this.ruleName = '';
17+
this.severity = '';
18+
this.fileName = '';
19+
this.line = 0;
20+
this.length = 0;
21+
this.problematicLine = '';
22+
this.remediationAdvise = '';
23+
this.description = '';
24+
}
25+
}

src/main/wrapper/CxConstants.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ export enum CxConstants {
6565
FORMAT_HTML_CLI = "summaryHTML",
6666
FILTER = "--filter",
6767
SCAN_ID = "--scan-id",
68+
CMD_VORPAL = "vorpal",
69+
SOURCE_FILE = "--file-source",
70+
VORPAL_UPDATE_VERSION = "--vorpal-latest-version",
6871
PROJECT_ID = "--project-id",
6972
SIMILARITY_ID = "--similarity-id",
7073
QUERY_ID = "--query-id",
@@ -78,6 +81,7 @@ export enum CxConstants {
7881
ADDITONAL_PARAMS = "--additional-params",
7982
ENGINE = "--engine",
8083
SCAN_TYPE = "CxScan",
84+
SCAN_VORPAL = "CxVorpal",
8185
PROJECT_TYPE = "CxProject",
8286
PREDICATE_TYPE = "CxPredicate",
8387
CODE_BASHING_TYPE = "CxCodeBashing",

src/main/wrapper/CxWrapper.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,28 @@ export class CxWrapper {
125125
return await exec.executeCommands(this.config.pathToExecutable, commands, CxConstants.SCAN_TYPE);
126126
}
127127

128+
async scanVorpal(sourceFile: string, updateVersion = false, agent?: string | null): Promise<CxCommandOutput> {
129+
const commands: string[] = [CxConstants.CMD_SCAN, CxConstants.CMD_VORPAL, CxConstants.SOURCE_FILE, sourceFile];
130+
131+
if (updateVersion) {
132+
commands.push(CxConstants.VORPAL_UPDATE_VERSION);
133+
}
134+
if (agent) {
135+
commands.push(CxConstants.AGENT);
136+
commands.push(agent);
137+
}
138+
else {
139+
commands.push(CxConstants.AGENT);
140+
// if we don't send any parameter in the flag
141+
// then in the cli takes the default and this is not true
142+
commands.push('"js-wrapper"');
143+
}
144+
145+
commands.push(...this.initializeCommands(false));
146+
const exec = new ExecutionService();
147+
return await exec.executeCommands(this.config.pathToExecutable, commands, CxConstants.SCAN_VORPAL);
148+
}
149+
128150
async scanCancel(id: string): Promise<CxCommandOutput> {
129151
const commands: string[] = [CxConstants.CMD_SCAN, CxConstants.SUB_CMD_CANCEL, CxConstants.SCAN_ID, id];
130152
commands.push(...this.initializeCommands(false));

src/main/wrapper/ExecutionService.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import CxKicsRemediation from "../remediation/CxKicsRemediation";
2222
import CxScaRealTime from "../scaRealtime/CxScaRealTime";
2323
import CxChat from "../chat/CxChat";
2424
import CxMask from "../mask/CxMask";
25+
import CxVorpal from "../vorpal/CxVorpal";
2526

2627

2728
function isJsonString(s: string) {
@@ -183,6 +184,10 @@ export class ExecutionService {
183184
const scans = CxScan.parseProject(resultObject);
184185
cxCommandOutput.payload = scans;
185186
break;
187+
case CxConstants.SCAN_VORPAL:
188+
const vorpal = CxVorpal.parseScan(resultObject);
189+
cxCommandOutput.payload = [vorpal];
190+
break;
186191
case CxConstants.PROJECT_TYPE:
187192
const projects = CxProject.parseProject(resultObject);
188193
cxCommandOutput.payload = projects;

src/tests/ScanTest.test.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,36 @@ describe("ScanCreate cases", () => {
125125
expect(aiEnabled).toBeDefined();
126126
})
127127

128-
});
128+
it('ScanVorpal fail case Without extensions', async () => {
129+
const auth = new CxWrapper(cxScanConfig);
130+
const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/python-file");
131+
console.log(" Json object from failure case: " + JSON.stringify(cxCommandOutput));
132+
133+
expect(cxCommandOutput.payload[0].error.description).toEqual("The file name must have an extension.");
134+
expect(cxCommandOutput.exitCode).toBe(0);
135+
expect(cxCommandOutput.payload[0].status).toBeUndefined();
136+
});
137+
138+
it('ScanVorpal Successful case', async () => {
139+
const auth = new CxWrapper(cxScanConfig);
140+
const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/python-vul-file.py");
141+
console.log("Json object from scanVorpal successful case: " + JSON.stringify(cxCommandOutput));
142+
const scanObject = cxCommandOutput.payload.pop();
143+
expect(cxCommandOutput.payload).toBeDefined();
144+
expect(cxCommandOutput.exitCode).toBe(0);
145+
expect(scanObject.status).toEqual(true);
146+
});
147+
148+
it('ScanVorpal Successful case with update version', async () => {
149+
const auth = new CxWrapper(cxScanConfig);
150+
const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/python-vul-file.py", true);
151+
console.log("Json object from scanVorpal successful case with update version: " + JSON.stringify(cxCommandOutput));
152+
const scanObject = cxCommandOutput.payload.pop();
153+
expect(cxCommandOutput.payload).toBeDefined();
154+
expect(cxCommandOutput.exitCode).toBe(0);
155+
expect(scanObject.status).toEqual(true);
156+
expect(Number.isInteger(scanObject.scanDetails[0].line)).toBe(true);
157+
expect(typeof scanObject.scanDetails[0].description).toBe('string');
158+
});
159+
160+
});

0 commit comments

Comments
 (0)