Skip to content

Commit 51b25dc

Browse files
author
Mithilesh Pawar
authored
Added results BFL command (#90)
* Added support for getting BFL * Using env variable in github actions CI.
1 parent 9edd336 commit 51b25dc

File tree

6 files changed

+95
-4
lines changed

6 files changed

+95
-4
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,9 @@ jobs:
3030
- name: Checkmarx AST CLI Action
3131
uses: checkmarxDev/ast-github-action@main
3232
with:
33-
project_name: ast-cli-javascript-wrapper
34-
branch: master
33+
project_name: ${{ github.repository }}
3534
base_uri: ${{ secrets.BASE_URI }}
3635
cx_tenant: ${{ secrets.TENANT }}
3736
cx_client_id: ${{ secrets.CLIENT_ID }}
3837
cx_client_secret: ${{ secrets.CLIENT_SECRET }}
39-
additional_params: --tags galactica-team
38+
additional_params: --tags "Galactica"

src/main/bfl/CxBFL.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
export default class CxBFL {
2+
column: number;
3+
fileName: string = "";
4+
fullName: string = "";
5+
length: number;
6+
line: number;
7+
methodLine: number;
8+
method: string = "";
9+
name: string = "";
10+
domType: string = "";
11+
12+
13+
static parseBFLResponse(resultObject: any[]): CxBFL[] {
14+
let bflNode: CxBFL[] = [];
15+
bflNode = resultObject.map((member: any) => {
16+
let bflNode = new CxBFL();
17+
bflNode.column = member.column;
18+
bflNode.fileName = member.fileName;
19+
bflNode.fullName = member.fullName;
20+
bflNode.length = member.length;
21+
bflNode.line = member.line;
22+
bflNode.methodLine = member.methodLine;
23+
bflNode.method = member.method;
24+
bflNode.name = member.name;
25+
bflNode.domType = member.domType;
26+
return bflNode;
27+
});
28+
return bflNode;
29+
}
30+
}

src/main/wrapper/CxConstants.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export enum CxConstants {
2626
CMD_TRIAGE = "triage",
2727
SUB_CMD_UPDATE = "update",
2828
CMD_RESULT = "results",
29+
SUB_CMD_BFL = "bfl",
2930
CMD_CODE_BASHING = "codebashing",
3031
SCAN_INFO_FORMAT = "--scan-info-format",
3132
FORMAT = "--format",
@@ -38,6 +39,7 @@ export enum CxConstants {
3839
SCAN_ID = "--scan-id",
3940
PROJECT_ID = "--project-id",
4041
SIMILARITY_ID = "--similarity-id",
42+
QUERY_ID = "--query-id",
4143
STATE = "--state",
4244
COMMENT = "--comment",
4345
SEVERITY = "--severity",
@@ -48,6 +50,7 @@ export enum CxConstants {
4850
PROJECT_TYPE = "CxProject",
4951
PREDICATE_TYPE = "CxPredicate",
5052
CODE_BASHING_TYPE = "CxCodeBashing",
53+
BFL_TYPE = "CxBFL",
5154
SAST = "sast",
5255
LANGUAGE = "--language",
5356
VULNERABILITY_TYPE = "--vulnerabity-type",

src/main/wrapper/CxWrapper.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {CxCommandOutput} from "./CxCommandOutput";
66
import { logger } from "./loggerConfig";
77
import * as fs from "fs"
88
import * as os from "os";
9+
import CxBFL from "../bfl/CxBFL";
910

1011
type ParamTypeMap = Map<CxParamType, string>;
1112

@@ -216,6 +217,46 @@ export class CxWrapper {
216217
return commands;
217218
}
218219

220+
async getResultsBfl(scanId: string, queryId: string, resultNodes: any[]) {
221+
const commands: string[] = [CxConstants.CMD_RESULT, CxConstants.SUB_CMD_BFL, CxConstants.SCAN_ID, scanId, CxConstants.QUERY_ID, queryId];
222+
commands.push(...this.initializeCommands(true));
223+
const exec = new ExecutionService();
224+
const response = await exec.executeCommands(this.config.pathToExecutable, commands, CxConstants.BFL_TYPE);
225+
const bflNodeIndex = this.getIndexOfBflNode(response.payload, resultNodes)
226+
response.payload[0] = bflNodeIndex;
227+
return response;
228+
}
229+
230+
getIndexOfBflNode(bflNodes: CxBFL[], resultNodes: any[]): number {
231+
232+
let bflNodeNotFound = -1;
233+
for (const bflNode of bflNodes) {
234+
for (const resultNode of resultNodes) {
235+
236+
if(this.compareNodes(bflNode,resultNode))
237+
{
238+
return resultNodes.indexOf(resultNode);
239+
}
240+
}
241+
242+
}
243+
return bflNodeNotFound;
244+
245+
}
246+
247+
compareNodes(bflNode: CxBFL, resultNode : any): boolean{
248+
249+
return bflNode.line == resultNode.line &&
250+
bflNode.column == resultNode.column &&
251+
bflNode.length == resultNode.length &&
252+
bflNode.name == resultNode.name &&
253+
bflNode.method == resultNode.method &&
254+
bflNode.domType == resultNode.domType &&
255+
bflNode.fileName == resultNode.fileName &&
256+
bflNode.fullName == resultNode.fullName &&
257+
bflNode.methodLine == resultNode.methodLine;
258+
}
259+
219260
filterArguments(filters:string):string[]{
220261
let r = [];
221262
if(filters.length>0){

src/main/wrapper/ExecutionService.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as path from "path";
77
import CxResult from "../results/CxResult";
88
import CxProject from "../project/CxProject";
99
import CxCodeBashing from "../codebashing/CxCodeBashing";
10+
import CxBFL from "../bfl/CxBFL";
1011

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

@@ -83,6 +84,10 @@ export class ExecutionService {
8384
let codeBashing = CxCodeBashing.parseCodeBashing(resultObject);
8485
cxCommandOutput.payload = codeBashing;
8586
break;
87+
case "CxBFL":
88+
let bflNode = CxBFL.parseBFLResponse(resultObject);
89+
cxCommandOutput.payload = bflNode;
90+
break;
8691
default:
8792
cxCommandOutput.payload = resultObject;
8893
}
@@ -121,7 +126,7 @@ export class ExecutionService {
121126
let cxCommandOutput = new CxCommandOutput();
122127
// Need to check if file output is json or html
123128
if(fileExtension.includes("json")){
124-
let read_json = JSON.parse(read);
129+
let read_json = JSON.parse(read.replace(/:([0-9]{15,}),/g, ':"$1",'));
125130
if (read_json.results){
126131
let r : CxResult[] = read_json.results.map((member:any)=>{return Object.assign( new CxResult(),member);});
127132
cxCommandOutput.payload = r;

src/tests/ResultTest.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import {CxWrapper} from '../main/wrapper/CxWrapper';
22
import {CxCommandOutput} from "../main/wrapper/CxCommandOutput";
33
import {BaseTest} from "./BaseTest";
44
import * as fs from "fs";
5+
import { CxConstants } from '../main/wrapper/CxConstants';
6+
import CxResult from '../main/results/CxResult';
57

68
describe("Results cases",() => {
79
let cxScanConfig = new BaseTest();
@@ -46,6 +48,17 @@ describe("Results cases",() => {
4648
expect(cxCommandOutput.payload.length).toBeGreaterThan(0);
4749
});
4850

51+
it('Result bfl successful case', async () => {
52+
const auth = new CxWrapper(cxScanConfig);
53+
console.log("ScanID : " + cxScanConfig.scanId)
54+
const results = await auth.getResultsList(cxScanConfig.scanId)
55+
const result: CxResult = results.payload.find(res => res.type == CxConstants.SAST)
56+
const data = result.data
57+
const queryId = data.queryId
58+
console.log("QueryID :" + result.data.queryId)
59+
const cxCommandOutput: CxCommandOutput = await auth.getResultsBfl(cxScanConfig.scanId, queryId, data.nodes);
60+
expect(cxCommandOutput.payload.length).toBeGreaterThanOrEqual(-1);
61+
});
4962
});
5063

5164
const fileExists = (file:any) => {

0 commit comments

Comments
 (0)