Skip to content

Commit a0bab36

Browse files
Add results priority (AST-105849) (#1227)
* Add Containers Realtime Scanner * Add results priority feature
1 parent f101ee5 commit a0bab36

File tree

5 files changed

+122
-5
lines changed

5 files changed

+122
-5
lines changed

package.json

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,58 @@
954954
]
955955
}
956956
}
957+
},
958+
{
959+
"title": "Activate ASCA Realtime",
960+
"id": "asca-realtime-scanner",
961+
"order": 2,
962+
"properties": {
963+
"Checkmarx AI Secure Coding Assistant (ASCA) Realtime Scanner.Activate ASCA Realtime": {
964+
"type": "boolean",
965+
"order": 3,
966+
"default": false,
967+
"markdownDescription": "Scans your code files for security best practices as you code"
968+
}
969+
}
970+
},
971+
{
972+
"title": "Activate OSS-Realtime",
973+
"id": "realtime-scanner",
974+
"order": 2,
975+
"properties": {
976+
"Checkmarx Open Source Realtime Scanner (OSS-Realtime).Activate OSS-Realtime": {
977+
"type": "boolean",
978+
"order": 3,
979+
"default": false,
980+
"markdownDescription": "Scans your manifest files as you code"
981+
}
982+
}
983+
},
984+
{
985+
"title": "Activate Secret Detection Realtime",
986+
"id": "secret-scanner",
987+
"order": 2,
988+
"properties": {
989+
"Checkmarx Secret Detection Realtime Scanner.Activate Secret Detection Realtime": {
990+
"type": "boolean",
991+
"order": 3,
992+
"default": false,
993+
"markdownDescription": "Scans your files for potential secrets and credentials as you code"
994+
}
995+
}
996+
},
997+
{
998+
"title": "Activate Containers Realtime",
999+
"id": "containers-realtime-scanner",
1000+
"order": 2,
1001+
"properties": {
1002+
"Checkmarx Containers Realtime Scanner.Activate Containers Realtime": {
1003+
"type": "boolean",
1004+
"order": 3,
1005+
"default": false,
1006+
"markdownDescription": "Scans your Docker files and container configurations for vulnerabilities as you code"
1007+
}
1008+
}
9571009
}
9581010
]
9591011
},

src/realtimeScanners/common/baseScannerService.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,33 @@ import * as fs from "fs";
33
import * as path from "path";
44
import * as os from "os";
55
import { Logs } from "../../models/logs";
6-
import { IScannerService, IScannerConfig } from "./types";
6+
import { IScannerService, IScannerConfig, AscaHoverData, SecretsHoverData } from "./types";
77
import { createHash } from "crypto";
88

99
export abstract class BaseScannerService implements IScannerService {
1010
public config: IScannerConfig;
1111
diagnosticCollection: vscode.DiagnosticCollection;
1212

13+
private static diagnosticCollections = new Map<string, vscode.DiagnosticCollection>();
14+
private static hoverDataMaps = new Map<string, Map<string, SecretsHoverData | AscaHoverData>>();
15+
1316
constructor(config: IScannerConfig) {
1417
this.config = config;
1518
this.diagnosticCollection = vscode.languages.createDiagnosticCollection(
1619
config.engineName
1720
);
21+
22+
BaseScannerService.diagnosticCollections.set(config.engineName, this.diagnosticCollection);
23+
}
24+
25+
protected getOtherScannerCollection(engineName: string): vscode.DiagnosticCollection | undefined {
26+
return BaseScannerService.diagnosticCollections.get(engineName);
27+
}
28+
protected registerHoverDataMap(hoverDataMap: Map<string, SecretsHoverData | AscaHoverData>): void {
29+
BaseScannerService.hoverDataMaps.set(this.config.engineName, hoverDataMap);
30+
}
31+
protected getOtherScannerHoverData(engineName: string): Map<string, SecretsHoverData | AscaHoverData> | undefined {
32+
return BaseScannerService.hoverDataMaps.get(engineName);
1833
}
1934

2035
abstract scan(document: vscode.TextDocument, logs: Logs): Promise<void>;
@@ -70,7 +85,7 @@ export abstract class BaseScannerService implements IScannerService {
7085

7186
protected generateFileHash(input: string): string {
7287
return createHash("sha256")
73-
.update(input )
88+
.update(input)
7489
.digest("hex")
7590
.substring(0, 16);
7691
}

src/realtimeScanners/scanners/asca/ascaScannerService.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ export class AscaScannerService extends BaseScannerService {
5656
errorMessage: constants.errorAscaScanRealtime
5757
};
5858
super(config);
59+
60+
this.registerHoverDataMap(this.ascaHoverData);
5961
}
6062

6163
shouldScanFile(document: vscode.TextDocument): boolean {
@@ -120,6 +122,21 @@ export class AscaScannerService extends BaseScannerService {
120122
}
121123
}
122124

125+
private hasSecretsAtLine(uri: vscode.Uri, lineNumber: number): boolean {
126+
const secretsCollection = this.getOtherScannerCollection(constants.secretsScannerEngineName);
127+
if (secretsCollection) {
128+
const secretsDiagnostics = vscode.languages.getDiagnostics(uri).filter(diagnostic => {
129+
const diagnosticData = (diagnostic as vscode.Diagnostic & { data?: CxDiagnosticData }).data;
130+
return diagnosticData?.cxType === constants.secretsScannerEngineName;
131+
});
132+
133+
if (secretsDiagnostics.some(diagnostic => diagnostic.range.start.line === lineNumber)) {
134+
return true;
135+
}
136+
}
137+
return false;
138+
}
139+
123140
updateProblems<T = unknown>(problems: T, uri: vscode.Uri): void {
124141
const scanResults = problems as unknown as CxAsca;
125142
const filePath = uri.fsPath;
@@ -133,6 +150,10 @@ export class AscaScannerService extends BaseScannerService {
133150
const lowDecorations: vscode.DecorationOptions[] = [];
134151

135152
for (const result of scanResults.scanDetails) {
153+
if (this.hasSecretsAtLine(uri, result.line - 1)) {
154+
continue;
155+
}
156+
136157
const problemText = result.problematicLine;
137158
const startIndex = problemText.length - problemText.trimStart().length;
138159

src/realtimeScanners/scanners/secrets/secretsScannerService.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import * as vscode from "vscode";
33
import { Logs } from "../../../models/logs";
44
import { BaseScannerService } from "../../common/baseScannerService";
5-
import { IScannerConfig, CxDiagnosticData } from "../../common/types";
5+
import { IScannerConfig, CxDiagnosticData, SecretsHoverData } from "../../common/types";
66
import { constants } from "../../../utils/common/constants";
77
import { IgnoreFileManager } from "../../common/ignoreFileManager";
88
import { minimatch } from "minimatch";
@@ -21,7 +21,7 @@ export class SecretsScannerService extends BaseScannerService {
2121

2222
private documentOpenListener: vscode.Disposable | undefined;
2323
private editorChangeListener: vscode.Disposable | undefined;
24-
public secretsHoverData: Map<string, any> = new Map();
24+
public secretsHoverData: Map<string, SecretsHoverData> = new Map();
2525

2626
private createDecoration(iconName: string, size: string = "auto"): vscode.TextEditorDecorationType {
2727
return vscode.window.createTextEditorDecorationType({
@@ -50,6 +50,8 @@ export class SecretsScannerService extends BaseScannerService {
5050
errorMessage: constants.errorSecretsScanRealtime,
5151
};
5252
super(config);
53+
54+
this.registerHoverDataMap(this.secretsHoverData);
5355
}
5456

5557
shouldScanFile(document: vscode.TextDocument): boolean {
@@ -138,6 +140,29 @@ export class SecretsScannerService extends BaseScannerService {
138140
}
139141
}
140142

143+
private removeAscaDiagnosticsAtLine(uri: vscode.Uri, lineNumber: number): void {
144+
const ascaCollection = this.getOtherScannerCollection(constants.ascaRealtimeScannerEngineName);
145+
if (!ascaCollection) { return; }
146+
147+
const ascaDiagnostics = vscode.languages.getDiagnostics(uri).filter(diagnostic => {
148+
const diagnosticData = (diagnostic as vscode.Diagnostic & { data?: CxDiagnosticData }).data;
149+
return diagnosticData?.cxType === 'asca';
150+
});
151+
152+
const filteredDiagnostics = ascaDiagnostics.filter(diagnostic =>
153+
diagnostic.range.start.line !== lineNumber
154+
);
155+
ascaCollection.set(uri, filteredDiagnostics);
156+
}
157+
158+
private removeAscaHoverDataAtLine(filePath: string, lineNumber: number): void {
159+
const ascaHoverData = this.getOtherScannerHoverData(constants.ascaRealtimeScannerEngineName);
160+
if (!ascaHoverData) { return; }
161+
162+
const key = `${filePath}:${lineNumber}`;
163+
ascaHoverData.delete(key);
164+
}
165+
141166
updateProblems<T = unknown>(problems: T, uri: vscode.Uri): void {
142167
const secretsProblems = problems as CxSecretsResult[];
143168
const filePath = uri.fsPath;
@@ -149,6 +174,10 @@ export class SecretsScannerService extends BaseScannerService {
149174
for (const problem of secretsProblems) {
150175
if (problem.locations.length === 0) { continue; }
151176
const location = problem.locations[0];
177+
178+
this.removeAscaDiagnosticsAtLine(uri, location.line);
179+
this.removeAscaHoverDataAtLine(filePath, location.line);
180+
152181
const range = new vscode.Range(
153182
new vscode.Position(location.line, location.startIndex),
154183
new vscode.Position(location.line, location.endIndex)

src/utils/common/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ export const constants = {
157157
ascaRealtimeScanner: "Checkmarx AI Secure Coding Assistant (ASCA) Realtime Scanner",
158158
ascaRealtimeScannerStart: "ASCA Realtime Scanner Engine started",
159159
ascaRealtimeScannerDisabled: "ASCA Realtime Scanner Engine disabled",
160-
ascaRealtimeScannerEngineName: "AscaRealtimeScanner",
160+
ascaRealtimeScannerEngineName: "Asca",
161161
ascaRealtimeScannerDirectory: "Cx-asca-realtime-scanner",
162162
errorAscaInstallation: "Failed to run ASCA engine",
163163
errorAscaScanRealtime: "Failed to handle ASCA Realtime scan",

0 commit comments

Comments
 (0)