Skip to content

Commit f80a2db

Browse files
authored
adding kics realtime support (#122)
* adding kics realtime support
1 parent ef969d4 commit f80a2db

File tree

9 files changed

+123
-14
lines changed

9 files changed

+123
-14
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"scripts": {
1515
"build": "tsc",
1616
"postbuild": "copyfiles -u 1 src/main/wrapper/resources/cx* dist/",
17-
"test": "tsc && jest --runInBand --coverage"
17+
"test": "copyfiles -u 1 src/tests/data/* dist/; tsc && jest --runInBand --coverage"
1818
},
1919
"repository": "https://github.com/CheckmarxDev/ast-cli-javascript-wrapper.git",
2020
"author": "Jay Nanduri",
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export default class CxKicsRealTime {
2+
version: string = "";
3+
count: string = "";
4+
summary : any = {};
5+
results: any = [];
6+
7+
static parseKicsRealTimeResponse(resultObject: any): CxKicsRealTime {
8+
let kicsRealTime: CxKicsRealTime = new CxKicsRealTime();
9+
kicsRealTime.version = resultObject.kics_version;
10+
kicsRealTime.count = resultObject.total_counter;
11+
kicsRealTime.results = resultObject.queries;
12+
kicsRealTime.summary = resultObject.severity_counters;
13+
return kicsRealTime;
14+
}
15+
}

src/main/wrapper/CxConstants.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export enum CxConstants {
2929
CMD_RESULT = "results",
3030
SUB_CMD_BFL = "bfl",
3131
CMD_CODE_BASHING = "codebashing",
32+
CMD_KICS_REALTIME = "kics-realtime",
3233
SCAN_INFO_FORMAT = "--scan-info-format",
3334
FORMAT = "--format",
3435
FORMAT_JSON = "json",
@@ -47,10 +48,14 @@ export enum CxConstants {
4748
REPORT_FORMAT = "--report-format",
4849
OUTPUT_NAME = "--output-name",
4950
OUTPUT_PATH = "--output-path",
51+
FILE_SOURCES = "--file",
52+
ADDITONAL_PARAMS = "--additional-params",
53+
ENGINE = "--engine",
5054
SCAN_TYPE = "CxScan",
5155
PROJECT_TYPE = "CxProject",
5256
PREDICATE_TYPE = "CxPredicate",
5357
CODE_BASHING_TYPE = "CxCodeBashing",
58+
KICS_REALTIME_TYPE = "CxKicsRealTime",
5459
BFL_TYPE = "CxBFL",
5560
SAST = "sast",
5661
LANGUAGE = "--language",

src/main/wrapper/CxWrapper.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,16 @@ export class CxWrapper {
237237
return response;
238238
}
239239

240+
async kicsRealtimeScan(fileSources: string, engine:string, additionalParams: string):Promise<[Promise<CxCommandOutput>,any]> {
241+
const commands: string[] = [CxConstants.CMD_SCAN, CxConstants.CMD_KICS_REALTIME, CxConstants.FILE_SOURCES, fileSources, CxConstants.ADDITONAL_PARAMS, additionalParams];
242+
if(engine.length>0){
243+
commands.push(CxConstants.ENGINE,engine)
244+
}
245+
commands.push(...this.initializeCommands(false));
246+
const exec = new ExecutionService();
247+
return exec.executeKicsCommands(this.config.pathToExecutable, commands, CxConstants.KICS_REALTIME_TYPE);
248+
}
249+
240250
getIndexOfBflNode(bflNodes: CxBFL[], resultNodes: any[]): number {
241251

242252
let bflNodeNotFound = -1;

src/main/wrapper/ExecutionService.ts

Lines changed: 60 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import CxResult from "../results/CxResult";
88
import CxProject from "../project/CxProject";
99
import CxCodeBashing from "../codebashing/CxCodeBashing";
1010
import CxBFL from "../bfl/CxBFL";
11+
import CxKicsRealTime from "../kicsRealtime/CxKicsRealTime";
1112

1213
const spawn = require('child_process').spawn;
1314

@@ -33,33 +34,79 @@ function transform(n:string) {
3334
}
3435

3536
export class ExecutionService {
37+
private fsObject : any = undefined
38+
3639
executeCommands(pathToExecutable: string, commands: string[], output? : string ): Promise<CxCommandOutput> {
37-
return new Promise(function (resolve, reject) {
40+
return (new Promise( (resolve, reject)=> {
3841
let stderr = "";
3942
let stdout ="";
4043

41-
let cp = spawn(pathToExecutable, transformation(commands));
42-
cp.on('error', reject);
43-
cp.on('exit',(code: number, signal: any) => {
44+
this.fsObject = spawn(pathToExecutable, transformation(commands));
45+
this.fsObject.on('error', (data: { toString: () => string; }) => {
46+
if (data) {
47+
logger.error(data.toString().replace('\n', ''));
48+
stderr += data.toString();
49+
}
50+
reject()
51+
});
52+
this.fsObject.on('exit',(code: number, signal: any) => {
4453
logger.info("Exit code received from AST-CLI: " + code);
45-
resolve(ExecutionService.onCloseCommand(code, stderr, stdout, output ));
54+
if(code==1){
55+
stderr = stdout
56+
}
57+
resolve(ExecutionService.onCloseCommand(code, stderr, stdout, output, this.fsObject ));
4658
});
47-
cp.stdout.on('data', (data: { toString: () => string; }) => {
59+
this.fsObject.stdout.on('data', (data: { toString: () => string; }) => {
4860
if (data) {
4961
logger.info(data.toString().replace('\n', ''));
5062
stdout += data.toString();
5163
}
5264
});
53-
cp.stderr.on('data', (data: { toString: () => string; }) => {
65+
this.fsObject.stderr.on('data', (data: { toString: () => string; }) => {
5466
if (data) {
5567
logger.error(data.toString().replace('\n', ''));
5668
stderr += data.toString();
5769
}
5870
});
59-
});
71+
}));
72+
}
73+
74+
executeKicsCommands(pathToExecutable: string, commands: string[], output? : string ): [Promise<CxCommandOutput>,any] {
75+
return [new Promise( (resolve, reject)=> {
76+
let stderr = "";
77+
let stdout ="";
78+
79+
this.fsObject = spawn(pathToExecutable, transformation(commands));
80+
this.fsObject.on('error', (data: { toString: () => string; }) => {
81+
if (data) {
82+
logger.error(data.toString().replace('\n', ''));
83+
stderr += data.toString();
84+
}
85+
reject()
86+
});
87+
this.fsObject.on('exit',(code: number, signal: any) => {
88+
logger.info("Exit code received from AST-CLI: " + code);
89+
if(code==1){
90+
stderr = stdout
91+
}
92+
resolve(ExecutionService.onCloseCommand(code, stderr, stdout, output, this.fsObject ));
93+
});
94+
this.fsObject.stdout.on('data', (data: { toString: () => string; }) => {
95+
if (data) {
96+
logger.info(data.toString().replace('\n', ''));
97+
stdout += data.toString();
98+
}
99+
});
100+
this.fsObject.stderr.on('data', (data: { toString: () => string; }) => {
101+
if (data) {
102+
logger.error(data.toString().replace('\n', ''));
103+
stderr += data.toString();
104+
}
105+
});
106+
}), this.fsObject];
60107
}
61108

62-
private static onCloseCommand(code: number, stderr: string, stdout: string, output: string) : CxCommandOutput {
109+
private static onCloseCommand(code: number, stderr: string, stdout: string, output: string, fsObject:any) : CxCommandOutput {
63110
const cxCommandOutput = new CxCommandOutput();
64111
cxCommandOutput.exitCode = code;
65112
if (stderr) {
@@ -68,7 +115,6 @@ export class ExecutionService {
68115
if (stdout) {
69116
const stdoutSplit = stdout.split('\n');
70117
const data = stdoutSplit.find(isJsonString);
71-
72118
if (data) {
73119
let resultObject = JSON.parse(data);
74120
switch (output) {
@@ -88,6 +134,10 @@ export class ExecutionService {
88134
let bflNode = CxBFL.parseBFLResponse(resultObject);
89135
cxCommandOutput.payload = bflNode;
90136
break;
137+
case "CxKicsRealTime":
138+
let kicsResults = CxKicsRealTime.parseKicsRealTimeResponse(resultObject);
139+
cxCommandOutput.payload = [kicsResults];
140+
break;
91141
default:
92142
cxCommandOutput.payload = resultObject;
93143
}

src/main/wrapper/resources/cx-mac

2.64 MB
Binary file not shown.

src/tests/ResultTest.test.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ describe("Results cases",() => {
1111
const auth = new CxWrapper(cxScanConfig);
1212
const cxCommandOutput: CxCommandOutput = await auth.scanList("");
1313
let sampleId = cxCommandOutput.payload.pop().id;
14-
await auth.getResults(sampleId,"json","jsonList", ".");
15-
const file = await fileExists("./jsonList.json");
16-
expect(file).toBe(true);
14+
15+
auth.getResults(sampleId,"json","jsonList", ".").then(() => {
16+
fileExists("./jsonList.json").then(file => expect(file).toBe(true));
17+
18+
});
1719
});
1820

1921
it('Result List Successful case', async () => {

src/tests/ScanTest.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,15 @@ describe("ScanCreate cases", () => {
8787
const scanShowObject = await auth.scanShow(scanObject.id);
8888
expect(scanShowObject.exitCode).toEqual(0);
8989
})
90+
91+
it('KicsRealtime Successful case ', async () => {
92+
const auth = new CxWrapper(cxScanConfig);
93+
let [outputProcess,pid] = await auth.kicsRealtimeScan("dist/tests/data/Dockerfile","docker","-v");
94+
const cxCommandOutput: CxCommandOutput = await outputProcess;
95+
console.log(" Json object from successful no wait mode case: " + JSON.stringify( cxCommandOutput.payload));
96+
const scanObject = cxCommandOutput.payload.pop();
97+
console.log(" Json object from successful no wait mode case: " + JSON.stringify(scanObject));
98+
expect(scanObject.results.length).toBeGreaterThan(0);
99+
expect(pid).toBeDefined();
100+
})
90101
});

src/tests/data/Dockerfile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM openjdk:11.0.1-jre-slim-stretch
2+
3+
ARG webwolf_version=v8.0.0-SNAPSHOT
4+
5+
RUN \
6+
apt-get update && apt-get install && \
7+
useradd --home-dir /home/webwolf --create-home -U webwolf
8+
9+
USER webwolf
10+
COPY target/webwolf-${webwolf_version}.jar /home/webwolf/webwolf.jar
11+
COPY start-webwolf.sh /home/webwolf
12+
13+
EXPOSE 9090
14+
15+
ENTRYPOINT ["/home/webwolf/start-webwolf.sh"]
16+
CMD ["--server.port=9090", "--server.address=0.0.0.0"]

0 commit comments

Comments
 (0)