diff --git a/src/main/oss/CxManifestStatus.ts b/src/main/oss/CxManifestStatus.ts new file mode 100644 index 00000000..3eaf8d79 --- /dev/null +++ b/src/main/oss/CxManifestStatus.ts @@ -0,0 +1,5 @@ +export enum CxManifestStatus { + malicious = "Malicious", + ok = "Ok", + unknown = "Unknown" +} diff --git a/src/main/oss/CxOss.ts b/src/main/oss/CxOss.ts new file mode 100644 index 00000000..3dbfe7e2 --- /dev/null +++ b/src/main/oss/CxOss.ts @@ -0,0 +1,46 @@ +import {CxManifestStatus} from './CxManifestStatus'; + +export default class CxOssResult { + packageManager : string; + packageName : string; + version : string; + filepath : string; + lineStart : number; + lineEnd : number; + startIndex : number; + endIndex : number; + status :CxManifestStatus; + + + static parseResult(resultObject: any): CxOssResult[] { + let ossResults: CxOssResult[] = []; + if (resultObject instanceof Array) { + ossResults = resultObject.map((member: any) => { + const ossResult = new CxOssResult(); + ossResult.packageManager = member.PackageManager; + ossResult.packageName = member.PackageName; + ossResult.version = member.Version; + ossResult.filepath = member.Filepath; + ossResult.lineStart = member.LineStart; + ossResult.lineEnd = member.LineEnd; + ossResult.startIndex = member.StartIndex; + ossResult.endIndex = member.EndIndex; + ossResult.status = member.Status as CxManifestStatus; + return ossResult; + }); + } else { + const ossResult = new CxOssResult(); + ossResult.packageManager = resultObject.PackageManager; + ossResult.packageName = resultObject.PackageName; + ossResult.version = resultObject.Version; + ossResult.filepath = resultObject.FilePath; + ossResult.lineStart = resultObject.LineStart; + ossResult.lineEnd = resultObject.LineEnd; + ossResult.startIndex = resultObject.StartIndex; + ossResult.endIndex = resultObject.EndIndex; + ossResult.status = resultObject.Status as CxManifestStatus; + ossResults.push(ossResult); + } + return ossResults; + } +} diff --git a/src/main/wrapper/CxConstants.ts b/src/main/wrapper/CxConstants.ts index 49d7643d..13eb042e 100644 --- a/src/main/wrapper/CxConstants.ts +++ b/src/main/wrapper/CxConstants.ts @@ -72,6 +72,7 @@ export enum CxConstants { CMD_ASCA = "asca", SOURCE_FILE = "--file-source", ASCA_UPDATE_VERSION = "--asca-latest-version", + CMD_OSS = "oss-realtime", PROJECT_ID = "--project-id", SIMILARITY_ID = "--similarity-id", QUERY_ID = "--query-id", @@ -87,6 +88,7 @@ export enum CxConstants { ENGINE = "--engine", SCAN_TYPE = "CxScan", SCAN_ASCA = "CxAsca", + SCAN_OSS = "CxOss", PROJECT_TYPE = "CxProject", PREDICATE_TYPE = "CxPredicate", CODE_BASHING_TYPE = "CxCodeBashing", diff --git a/src/main/wrapper/CxWrapper.ts b/src/main/wrapper/CxWrapper.ts index 228554ea..23807e8a 100644 --- a/src/main/wrapper/CxWrapper.ts +++ b/src/main/wrapper/CxWrapper.ts @@ -147,6 +147,13 @@ export class CxWrapper { return await exec.executeCommands(this.config.pathToExecutable, commands, CxConstants.SCAN_ASCA); } + async scanOss(sourceFile: string): Promise { + const commands: string[] = [CxConstants.CMD_SCAN, CxConstants.CMD_OSS, CxConstants.SOURCE, sourceFile]; + commands.push(...this.initializeCommands(false)); + const exec = new ExecutionService(); + return await exec.executeCommands(this.config.pathToExecutable, commands, CxConstants.SCAN_OSS); + } + async scanCancel(id: string): Promise { const commands: string[] = [CxConstants.CMD_SCAN, CxConstants.SUB_CMD_CANCEL, CxConstants.SCAN_ID, id]; commands.push(...this.initializeCommands(false)); diff --git a/src/main/wrapper/ExecutionService.ts b/src/main/wrapper/ExecutionService.ts index 57fff4dd..f16e1bfd 100644 --- a/src/main/wrapper/ExecutionService.ts +++ b/src/main/wrapper/ExecutionService.ts @@ -23,6 +23,7 @@ import CxScaRealTime from "../scaRealtime/CxScaRealTime"; import CxChat from "../chat/CxChat"; import CxMask from "../mask/CxMask"; import CxAsca from "../asca/CxAsca"; +import CxOssResult from "../oss/CxOss"; let skipValue = false; const fileSourceFlag = "--file-source" @@ -205,6 +206,10 @@ export class ExecutionService { const asca = CxAsca.parseScan(resultObject); cxCommandOutput.payload = [asca]; break; + case CxConstants.SCAN_OSS: + const oss = CxOssResult.parseResult(resultObject); + cxCommandOutput.payload = [oss]; + break; case CxConstants.PROJECT_TYPE: const projects = CxProject.parseProject(resultObject); cxCommandOutput.payload = projects; diff --git a/src/tests/ScanTest.test.ts b/src/tests/ScanTest.test.ts index 8fcfc86d..33011dc7 100644 --- a/src/tests/ScanTest.test.ts +++ b/src/tests/ScanTest.test.ts @@ -166,5 +166,13 @@ describe("ScanCreate cases", () => { expect(Number.isInteger(scanObject.scanDetails[0].line)).toBe(true); expect(typeof scanObject.scanDetails[0].description).toBe('string'); }); + + it('ScanOss Successful case', async () => { + const auth = new CxWrapper(cxScanConfig); + const cxCommandOutput: CxCommandOutput = await auth.scanOss("tsc/tests/data/package.json"); + console.log("Json object from scanOSS successful case: " + JSON.stringify(cxCommandOutput)); + expect(cxCommandOutput.payload).toBeDefined(); + expect(cxCommandOutput.exitCode).toBe(0); + }); }); diff --git a/tsc/tests/data/package.json b/tsc/tests/data/package.json new file mode 100644 index 00000000..0d9789b5 --- /dev/null +++ b/tsc/tests/data/package.json @@ -0,0 +1,8 @@ +{ + "name": "test", + "version": "0.0.1", + "description": "AST CLI Javascript wrapper tests", + "dependencies": { + "log4js": "^6.9.1" + } +}