Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion packages/checkmarx/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,13 @@
"icon": "$(search)",
"enablement": "ast-results.isValidCredentials"
},
{
"command": "ast-results.environmentPick",
"category": "ast-results",
"title": "Select Environment",
"icon": "$(edit)",
"enablement": "ast-results.isValidCredentials"
},
{
"command": "ast-results.filterNotExploitableActive",
"category": "ast-results",
Expand Down Expand Up @@ -696,6 +703,11 @@
"command": "ast-results.scanInput",
"group": "inline",
"when": "viewItem == scan-item"
},
{
"command": "ast-results.environmentPick",
"group": "inline",
"when": "viewItem == environment-item"
}
],
"view/title": [
Expand Down Expand Up @@ -882,7 +894,7 @@
{
"id": "dastResults",
"type": "tree",
"name": "DAST Results",
"name": "Checkmarx One DAST Results",
"when": "ast-results.isDastEnabled"
},
{
Expand Down Expand Up @@ -934,6 +946,11 @@
"view": "astResults",
"contents": "In order to use Checkmarx One, you need to setup your credentials.\n[Open settings](command:ast-results.viewSettings)\nTo learn more about how to use Checkmarx One [read our docs](https://docs.checkmarx.com/en/34965-123549-installing-and-setting-up-the-checkmarx-vs-code-extension.html).",
"when": "!ast-results.isValidCredentials"
},
{
"view": "dastResults",
"contents": "In order to use Checkmarx One DAST, you need to setup your credentials.\n[Open settings](command:ast-results.viewSettings)\nTo learn more about how to use Checkmarx One DAST [read our docs](https://docs.checkmarx.com/en/34965-123549-installing-and-setting-up-the-checkmarx-vs-code-extension.html).",
"when": "!ast-results.isValidCredentials"
}
],
"configuration": [
Expand Down
23 changes: 20 additions & 3 deletions packages/core/src/activate/activateCxOne.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,12 +184,23 @@ export async function activateCxOne(context: vscode.ExtensionContext, logs: Logs
const isDastEnabled = isFeatureEnabled(DAST_ENABLED);
vscode.commands.executeCommand(commands.setContext, commands.isDastEnabled, isDastEnabled);

let dastResultsProvider: DastResultsProvider | undefined;
if (isDastEnabled) {
const dastResultsProvider = new DastResultsProvider();
dastResultsProvider = new DastResultsProvider(
context,
logs,
statusBarItem,
diagnosticCollection,
filterCommand,
groupByCommand
);
vscode.window.registerTreeDataProvider(constants.dastTreeName, dastResultsProvider);
vscode.window.createTreeView(constants.dastTreeName, {
treeDataProvider: dastResultsProvider,
});

// Refresh DAST tree to show root items on startup
dastResultsProvider.refreshData();
}

// SCA auto scanning commands register
Expand Down Expand Up @@ -249,7 +260,13 @@ export async function activateCxOne(context: vscode.ExtensionContext, logs: Logs
// Execute command to listen to settings change
await executeCheckSettingsChange(context, kicsStatusBarItem, logs);

const treeCommand = new TreeCommand(context, astResultsProvider, scaResultsProvider, logs);
const treeCommand = new TreeCommand(
context,
astResultsProvider,
scaResultsProvider,
logs,
dastResultsProvider,
);

// Register refresh sca and results Tree Command
treeCommand.registerRefreshCommands();
Expand All @@ -264,7 +281,7 @@ export async function activateCxOne(context: vscode.ExtensionContext, logs: Logs
filterCommand.registerFilters();

// Register pickers command
const pickerCommand = new PickerCommand(context, logs, astResultsProvider);
const pickerCommand = new PickerCommand(context, logs, astResultsProvider, isDastEnabled);
pickerCommand.registerPickerCommands();

// Visual feedback on wrapper errors
Expand Down
21 changes: 20 additions & 1 deletion packages/core/src/commands/pickerCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
import { multiStepInput } from "../views/resultsView/astMultiStepInput";
import {
branchPicker,
environmentPicker,
projectPicker,
scanInput,
scanPicker,
Expand All @@ -16,10 +17,17 @@ export class PickerCommand {
context: vscode.ExtensionContext;
logs: Logs;
resultsProvider: AstResultsProvider;
constructor(context: vscode.ExtensionContext, logs: Logs, resultsProvider: AstResultsProvider) {
isDastEnabled: boolean;
constructor(
context: vscode.ExtensionContext,
logs: Logs,
resultsProvider: AstResultsProvider,
isDastEnabled: boolean,
) {
this.context = context;
this.logs = logs;
this.resultsProvider = resultsProvider;
this.isDastEnabled = isDastEnabled;
}

public registerPickerCommands() {
Expand All @@ -28,6 +36,9 @@ export class PickerCommand {
this.createBranchPickCommand();
this.createScanPickCommand();
this.createScanInputCommand();
if (this.isDastEnabled) {
this.createEnvironmentPickCommand();
}
}

private createGeneralPickCommand() {
Expand Down Expand Up @@ -69,4 +80,12 @@ export class PickerCommand {
})
);
}

private createEnvironmentPickCommand() {
this.context.subscriptions.push(
vscode.commands.registerCommand(commands.environmentPick, async () => {
await environmentPicker(this.context, this.logs);
})
);
}
}
34 changes: 33 additions & 1 deletion packages/core/src/commands/treeCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,38 @@ import {
} from "../utils/common/commandBuilder";
import { AstResultsProvider } from "../views/resultsView/astResultsProvider";
import { SCAResultsProvider } from "../views/scaView/scaResultsProvider";
import { DastResultsProvider } from "../views/dastView/dastResultsProvider";

export class TreeCommand {
context: vscode.ExtensionContext;
astResultsProvider: AstResultsProvider;
scaResultsProvider: SCAResultsProvider;
dastResultsProvider?: DastResultsProvider;
logs: Logs;
constructor(
context: vscode.ExtensionContext,
astResultsProvider: AstResultsProvider,
scaResultsProvider: SCAResultsProvider,
logs: Logs
logs: Logs,
dastResultsProvider?: DastResultsProvider
) {
this.context = context;
this.astResultsProvider = astResultsProvider;
this.scaResultsProvider = scaResultsProvider;
this.dastResultsProvider = dastResultsProvider;
this.logs = logs;
}

public registerRefreshCommands() {
this.createRefreshTreeCommand();
this.createRefreshScaTreeCommand();
this.createRefreshDastTreeCommand();
}

public registerClearCommands() {
this.clearCommand();
this.clearScaCommand();
this.clearDastCommand();
}

private createRefreshTreeCommand() {
Expand Down Expand Up @@ -68,4 +74,30 @@ export class TreeCommand {
)
);
}

private createRefreshDastTreeCommand() {
this.context.subscriptions.push(
vscode.commands.registerCommand(
commands.refreshDastTree,
async () => {
if (this.dastResultsProvider) {
await this.dastResultsProvider.refreshData();
}
}
)
);
}

private clearDastCommand() {
this.context.subscriptions.push(
vscode.commands.registerCommand(
commands.clearDast,
async () => {
if (this.dastResultsProvider) {
await this.dastResultsProvider.clean();
}
}
)
);
}
}
29 changes: 29 additions & 0 deletions packages/core/src/cx/cx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { CxWrapper } from "@checkmarx/ast-cli-javascript-wrapper";
import CxScaRealtime from "@checkmarx/ast-cli-javascript-wrapper/dist/main/scaRealtime/CxScaRealTime";
import CxScan from "@checkmarx/ast-cli-javascript-wrapper/dist/main/scan/CxScan";
import CxProject from "@checkmarx/ast-cli-javascript-wrapper/dist/main/project/CxProject";
import CxDastEnvironment from "@checkmarx/ast-cli-javascript-wrapper/dist/main/dast/CxDastEnvironment";
import CxCodeBashing from "@checkmarx/ast-cli-javascript-wrapper/dist/main/codebashing/CxCodeBashing";
import { CxConfig } from "@checkmarx/ast-cli-javascript-wrapper/dist/main/wrapper/CxConfig";
import { constants } from "../utils/common/constants";
Expand Down Expand Up @@ -906,4 +907,32 @@ export class Cx implements CxPlatform {
scanType, status, totalCount);
}
}

async getDastEnvironmentsListWithParams(params: string): Promise<CxDastEnvironment[] | undefined> {
let r = [];
const config = await this.getAstConfiguration();
if (!config) {
return [];
}
const cx = new CxWrapper(config);
const envs = await cx.dastEnvironmentsList(params ?? "");
if (envs.exitCode === 0) {
r = envs.payload ?? [];
} else {
throw new Error(envs.status);
}
return r;
}

async isDastLicenseEnabled(logs: Logs): Promise<boolean> {
return this.getCachedFeatureEnabled(
constants.dastLicenseEnabledGlobalState,
logs,
async (cx: CxWrapper) => {
const anyCx = cx as unknown as { dastEnabled?: () => Promise<boolean> };
return anyCx.dastEnabled ? await anyCx.dastEnabled() : false;
},
"license details (DAST)"
);
}
}
9 changes: 9 additions & 0 deletions packages/core/src/cx/cxMock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { CxCommandOutput } from "@checkmarx/ast-cli-javascript-wrapper/dist/main
import CxOssResult from "@checkmarx/ast-cli-javascript-wrapper/dist/main/oss/CxOss";
import CxSecretsResult from "@checkmarx/ast-cli-javascript-wrapper/dist/main/secrets/CxSecrets";
import CxIacResult from "@checkmarx/ast-cli-javascript-wrapper/dist/main/iacRealtime/CxIac";
import CxDastEnvironment from "@checkmarx/ast-cli-javascript-wrapper/dist/main/dast/CxDastEnvironment";

export class CxMock implements CxPlatform {
private context: vscode.ExtensionContext;
Expand Down Expand Up @@ -1680,4 +1681,12 @@ export class CxMock implements CxPlatform {

setUserEventDataForDetectionLogs(): void {
}

async getDastEnvironmentsListWithParams(): Promise<CxDastEnvironment[] | undefined> {
return [];
}

async isDastLicenseEnabled(): Promise<boolean> {
return false;
}
}
3 changes: 3 additions & 0 deletions packages/core/src/services/authService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,7 @@ export class AuthService {
// Only refresh tree for Checkmarx extension (not Developer Assist)
if (getExtensionType() === EXTENSION_TYPE.CHECKMARX) {
await vscode.commands.executeCommand(commands.refreshTree);
await vscode.commands.executeCommand(commands.refreshDastTree);
}
await vscode.commands.executeCommand(commands.updateCxOneAssist);
}
Expand Down Expand Up @@ -433,7 +434,9 @@ export class AuthService {
// Only refresh tree for Checkmarx extension (not Developer Assist)
if (getExtensionType() === EXTENSION_TYPE.CHECKMARX) {
await vscode.commands.executeCommand(commands.refreshTree);
await vscode.commands.executeCommand(commands.refreshDastTree);
await vscode.commands.executeCommand(commands.clear);
await vscode.commands.executeCommand(commands.clearDast);
}

await vscode.commands.executeCommand(commands.updateCxOneAssist);
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/unit/pickerCommand.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ describe("PickerCommand", () => {
sinon.stub(logs, "log");

resultsProvider = {} as AstResultsProvider;
pickerCommand = new PickerCommand(mockContext, logs, resultsProvider);
pickerCommand = new PickerCommand(mockContext, logs, resultsProvider, false);
});

afterEach(() => {
Expand Down
10 changes: 10 additions & 0 deletions packages/core/src/utils/common/commandBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ const COMMAND_NAMES = {
clearDastTree: 'clearDastTree',
clear: 'clear',
clearSca: 'clearSca',
clearDast: 'clearDast',

// Details
newDetails: 'newDetails',
Expand Down Expand Up @@ -143,6 +144,7 @@ const COMMAND_NAMES = {
branchPick: 'branchPick',
scanPick: 'scanPick',
scanInput: 'scanInput',
environmentPick: 'environmentPick',

// Views
docAndFeedback: 'docAndFeedback',
Expand Down Expand Up @@ -336,6 +338,10 @@ class CommandBuilder {
return this.buildCommand(COMMAND_NAMES.clearSca);
}

get clearDast(): string {
return this.buildCommand(COMMAND_NAMES.clearDast);
}

// Details
get newDetails(): string {
return this.buildCommand(COMMAND_NAMES.newDetails);
Expand Down Expand Up @@ -640,6 +646,10 @@ class CommandBuilder {
return this.buildCommand(COMMAND_NAMES.scanInput);
}

get environmentPick(): string {
return this.buildCommand(COMMAND_NAMES.environmentPick);
}

// Views
get docAndFeedback(): string {
return COMMAND_NAMES.docAndFeedback; // View ID, no prefix
Expand Down
10 changes: 9 additions & 1 deletion packages/core/src/utils/common/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,15 @@ export const constants = {
viewDetails: "viewDetails",
ignoreAll: "ignoreAll",
ignorePackage: "ignorePackage",
emptyResultsScanId: "3"
emptyResultsScanId: "3",

// DAST Scanner
dastLicenseEnabledGlobalState: "dastLicenseEnabled",
environmentIdKey: "ast-results-environment-id",
environmentLabel: "Environment: ",
environmentPlaceholder: "Select environment",
environmentPickerTitle: "Checkmarx One Environment selection",
environmentItem: "environment-item",
};

export enum Platform {
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/utils/common/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,4 +131,6 @@ export const messages = {
settings
</a>
`,
loadingEnvironments: "Loading environments",
dastLicenseNotEnabled: "DAST license is not enabled",
};
Loading
Loading