Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
bfaa9d3
aimcp server changes
cx-atish-jadhav Oct 14, 2025
994bec4
oss-realtime scanner changes
cx-atish-jadhav Oct 14, 2025
f741fa1
Create OssRealtimeVulnerability.java
cx-atish-jadhav Oct 14, 2025
1551319
Unify realtime scan wrappers; consolidate Secrets/IaC models; depreca…
cx-atish-jadhav Oct 15, 2025
decc733
Add ContainersRealtimeVulnerability model for containers realtime sca…
cx-atish-jadhav Oct 15, 2025
1ac5286
Add @JsonCreator constructor to OssRealtimeVulnerability for reliable…
cx-atish-jadhav Oct 15, 2025
fa9f1b5
Refactoring package name and adding test for oss and mcp flag
cx-atish-jadhav Oct 16, 2025
ece0319
Add integration tests for OSS, Container, and Secrets realtime scanners
cx-atish-jadhav Nov 10, 2025
a395d91
Replaced Id to CVE in oss vulnerability
cx-atish-jadhav Nov 25, 2025
5564f93
Changed variable from id to CVE as per OSS response
cx-anand-nandeshwar Nov 25, 2025
95ee628
Merge remote-tracking branch 'origin/feature/agentic_ai' into feature…
cx-anand-nandeshwar Nov 25, 2025
1810e78
aimcp server changes
cx-atish-jadhav Oct 14, 2025
bf95eb7
oss-realtime scanner changes
cx-atish-jadhav Oct 14, 2025
7c72274
Create OssRealtimeVulnerability.java
cx-atish-jadhav Oct 14, 2025
0677502
Unify realtime scan wrappers; consolidate Secrets/IaC models; depreca…
cx-atish-jadhav Oct 15, 2025
2f0f55b
Add ContainersRealtimeVulnerability model for containers realtime sca…
cx-atish-jadhav Oct 15, 2025
d1cb41c
Add @JsonCreator constructor to OssRealtimeVulnerability for reliable…
cx-atish-jadhav Oct 15, 2025
b2f2588
Refactoring package name and adding test for oss and mcp flag
cx-atish-jadhav Oct 16, 2025
d647f57
Add integration tests for OSS, Container, and Secrets realtime scanners
cx-atish-jadhav Nov 10, 2025
ee4c90c
Changed variable from id to CVE as per OSS response
cx-anand-nandeshwar Nov 25, 2025
97c6c69
Add maskedResult for secret remediation and change log level from INF…
cx-atish-jadhav Dec 1, 2025
82d6c66
Remove masked secrets functionality from codebase
cx-atish-jadhav Dec 3, 2025
23ddb2d
Implemented mask cmd in java wrapper
cx-atish-jadhav Dec 11, 2025
dbd2b51
Added fix for containerTool for IAC
cx-anjali-deore Dec 18, 2025
04b7efb
Merge branch 'feature/agentic_ai' of https://github.com/CheckmarxDev/…
cx-anjali-deore Dec 18, 2025
13c6f10
Add telemetry AI command with full parameter support and tests
cx-atish-jadhav Dec 23, 2025
36872e6
Add ignoredFilePath parameter to ScanAsca method
cx-atish-jadhav Dec 24, 2025
65d7e2a
Removing ASCA ignore file path changes
cx-atish-jadhav Dec 29, 2025
00ab820
Squashed commit of the following:
cx-atish-jadhav Dec 29, 2025
1adc1f4
Add ignoredFilePath parameter to ScanAsca realtime
cx-atish-jadhav Dec 31, 2025
6fdd4cd
- Changed ast cli version
cx-anjali-deore Jan 5, 2026
fc72964
added-isdev-isoneassist-function
cx-hitesh-madgulkar Jan 12, 2026
0bd805c
- Adding engine check
cx-atish-jadhav Jan 13, 2026
7609d9f
- Added check for engine verification in path
cx-anjali-deore Jan 14, 2026
c556e24
- Added checks message for exception
cx-anjali-deore Jan 16, 2026
1c24aa9
- Added checks message for exception
cx-anjali-deore Jan 16, 2026
863b1cc
- Merged Iac fixes in ignore changes
cx-anjali-deore Jan 16, 2026
eb5d646
passing-agent-name-jb-in-all-cmd
cx-hitesh-madgulkar Jan 16, 2026
ea4ae0a
Merge branch 'feature/ASCA_IgnoreFile' of https://github.com/Checkmar…
cx-hitesh-madgulkar Jan 16, 2026
b2eeb56
merge-fix
cx-hitesh-madgulkar Jan 16, 2026
8b47577
placed-cli-exe
cx-hitesh-madgulkar Jan 16, 2026
7a6d229
Merge branch 'main' into feature/ASCA_IgnoreFile
cx-atish-jadhav Jan 19, 2026
9403703
Revert "Merge branch 'main' into feature/ASCA_IgnoreFile"
cx-atish-jadhav Jan 19, 2026
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
2 changes: 1 addition & 1 deletion checkmarx-ast-cli.version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.3.43
2.3.42-iac-engine-fallbackPath
6 changes: 5 additions & 1 deletion src/main/java/com/checkmarx/ast/wrapper/CxConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
public class CxConfig {

private static final Pattern pattern = Pattern.compile("([^\"]\\S*|\".+?\")\\s*");

private String agentName; //JETBRAINS
private String baseUri;
private String baseAuthUri;
private String tenant;
Expand Down Expand Up @@ -66,6 +66,10 @@ List<String> toArguments() {
commands.add(CxConstants.BASE_AUTH_URI);
commands.add(getBaseAuthUri());
}
if (getAgentName() != null && !getAgentName().isEmpty()) {
commands.add("--agent");
commands.add(getAgentName());
}
if (getAdditionalParameters() != null)
commands.addAll(getAdditionalParameters());

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/checkmarx/ast/wrapper/CxConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ public final class CxConstants {
static final String SUB_CMD_TENANT = "tenant";
static final String IDE_SCANS_KEY = "scan.config.plugins.ideScans";
static final String AI_MCP_SERVER_KEY = "scan.config.plugins.aiMcpServer";
static final String DEV_ASSIST_LICENSE_KEY = "scan.config.plugins.cxdevassist";
static final String ONE_ASSIST_LICENSE_KEY = "scan.config.plugins.cxoneassist";
static final String IGNORED_FILE_PATH = "--ignored-file-path";
static final String SUB_CMD_OSS_REALTIME = "oss-realtime";
static final String SUB_CMD_IAC_REALTIME = "iac-realtime";
Expand Down
106 changes: 85 additions & 21 deletions src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,17 @@

import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.*;

import static com.checkmarx.ast.wrapper.Execution.*;

public class CxWrapper {

private static final CollectionType BRANCHES_TYPE = TypeFactory.defaultInstance()
.constructCollectionType(List.class, String.class);
private static final String OS_LINUX = "linux";
private static final String OS_WINDOWS = "windows";
private static final String OS_MAC = "mac";

@NonNull
private final CxConfig cxConfig;
Expand Down Expand Up @@ -248,7 +250,7 @@ public List<Project> projectList(String filter) throws IOException, InterruptedE
return Execution.executeCommand(withConfigArguments(arguments), logger, Project::listFromLine);
}

public ScanResult ScanAsca(String fileSource, boolean ascaLatestVersion, String agent) throws IOException, InterruptedException, CxException {
public ScanResult ScanAsca(String fileSource, boolean ascaLatestVersion, String agent, String ignoredFilePath) throws IOException, InterruptedException, CxException {
this.logger.info("Fetching ASCA scanResult");

List<String> arguments = new ArrayList<>();
Expand All @@ -259,23 +261,27 @@ public ScanResult ScanAsca(String fileSource, boolean ascaLatestVersion, String
if (ascaLatestVersion) {
arguments.add(CxConstants.ASCA_LATEST_VERSION);
}
if (StringUtils.isNotBlank(ignoredFilePath)) {
arguments.add(CxConstants.IGNORED_FILE_PATH);
arguments.add(ignoredFilePath);
}


appendAgentToArguments(agent, arguments);

return Execution.executeCommand(withConfigArguments(arguments), logger, ScanResult::fromLine,
(args, ignored) ->
(args.size() >= 3 && args.get(1).equals(CxConstants.CMD_SCAN) && args.get(2).equals(CxConstants.SUB_CMD_ASCA)));
}

private static void appendAgentToArguments(String agent, List<String> arguments) {
arguments.add(CxConstants.AGENT);
if (agent != null && !agent.isEmpty()){
arguments.add(agent);
}
else{
arguments.add("CLI-Java-Wrapper");
}
}
// private static void appendAgentToArguments(String agent, List<String> arguments) {
// arguments.add(CxConstants.AGENT);
// if (agent != null && !agent.isEmpty()){
// arguments.add(agent);
// }
// else{
// arguments.add("CLI-Java-Wrapper");
// }
// }

public List<String> projectBranches(@NonNull UUID projectId, String filter)
throws CxException, IOException, InterruptedException {
Expand Down Expand Up @@ -345,10 +351,6 @@ public String results(@NonNull UUID scanId, ReportFormat reportFormat, String ag
arguments.add(fileName);
arguments.add(CxConstants.OUTPUT_PATH);
arguments.add(tempDir);
if (agent != null) {
arguments.add(CxConstants.AGENT);
arguments.add(agent);
}
return Execution.executeCommand(arguments,
logger, tempDir,
fileName + reportFormat.getExtension());
Expand Down Expand Up @@ -409,6 +411,48 @@ public KicsRealtimeResults kicsRealtimeScan(@NonNull String fileSources, String
return Execution.executeCommand(withConfigArguments(arguments), logger, KicsRealtimeResults::fromLine);
}

// public <T> T realtimeScan(@NonNull String subCommand, @NonNull String sourcePath, String containerTool, String ignoredFilePath, java.util.function.Function<String, T> resultParser)
public String checkEngineExist(@NonNull String engineName) throws CxException, IOException, InterruptedException {
String osName = System.getProperty("os.name").toLowerCase(Locale.ENGLISH);
String osType=Execution.getOperatingSystemType(osName);
return this.checkEngine(engineName,osType);
}

private String checkEngine(String engineName, String osType ) throws CxException, IOException, InterruptedException {
List<String> arguments = new ArrayList<>();
switch (osType){
case OS_MAC:
String enginePath;
arguments.add("/bin/sh");
arguments.add("-c");
arguments.add("command -v " + engineName);
try{
enginePath= Execution.executeCommand((arguments), logger, line->line);
} catch (CxException | IOException e) {
throw new CxException(
1,
"Engine '" + engineName + "' is not installed or not found at /usr/local/bin)."
);
}
return enginePath;
case OS_WINDOWS:
case OS_LINUX:
arguments.add(engineName);
arguments.add("--version");
try {
Execution.executeCommand(arguments, logger, line -> line);
return engineName;
} catch (CxException | IOException e) {
throw new CxException(
1,engineName+" is not installed or is not accessible from the system PATH."
);
}
default:
throw new IllegalArgumentException("Unsupported OS: " + osType);
}

}

public <T> T realtimeScan(@NonNull String subCommand, @NonNull String sourcePath, String containerTool, String ignoredFilePath, java.util.function.Function<String, T> resultParser)
throws IOException, InterruptedException, CxException {
this.logger.info("Executing 'scan {}' command using the CLI.", subCommand);
Expand Down Expand Up @@ -526,6 +570,28 @@ public List<TenantSetting> tenantSettings() throws CxException, IOException, Int
return Execution.executeCommand(withConfigArguments(arguments), logger, TenantSetting::listFromLine);
}



public boolean getTenantSetting(String key) throws CxException, IOException, InterruptedException {
List<TenantSetting> tenantSettings = tenantSettings();
if (tenantSettings == null) {
throw new CxException(1, "Unable to parse tenant settings");
}
return tenantSettings.stream()
.filter(t -> t.getKey().equals(key))
.findFirst()
.map(t -> Boolean.parseBoolean(t.getValue()))
.orElse(false);
}
public boolean devAssistEnabled() throws CxException, IOException, InterruptedException {
return getTenantSetting(CxConstants.DEV_ASSIST_LICENSE_KEY);

}

public boolean oneAssistEnabled() throws CxException, IOException, InterruptedException {
return getTenantSetting(CxConstants.ONE_ASSIST_LICENSE_KEY);
}

public MaskResult maskSecrets(@NonNull String filePath) throws CxException, IOException, InterruptedException {
List<String> arguments = new ArrayList<>();

Expand Down Expand Up @@ -565,8 +631,6 @@ public String telemetryAIEvent(String aiProvider, String agent, String eventType
arguments.add(CxConstants.SUB_CMD_TELEMETRY_AI);
arguments.add(CxConstants.AI_PROVIDER);
arguments.add(aiProvider);
arguments.add(CxConstants.AGENT);
arguments.add(agent);
arguments.add(CxConstants.TYPE);
arguments.add(eventType);
arguments.add(CxConstants.SUB_TYPE);
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/com/checkmarx/ast/wrapper/Execution.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.checkmarx.ast.wrapper;

import com.checkmarx.ast.kicsRealtimeResults.KicsRealtimeResults;
import lombok.NonNull;
import org.slf4j.Logger;

Expand All @@ -12,10 +13,7 @@
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Function;

Expand Down Expand Up @@ -171,7 +169,7 @@ private static String detectBinaryName(@NonNull Logger logger) {
return fileName;
}

private static String getOperatingSystemType(String osName) {
public static String getOperatingSystemType(String osName) {
if (osName.contains(OS_LINUX)) {
return OS_LINUX;
} else if (osName.contains(OS_WINDOWS)) {
Expand Down Expand Up @@ -217,4 +215,6 @@ private static String md5(InputStream a) {
}
return md5;
}


}
4 changes: 2 additions & 2 deletions src/main/resources/cx-linux
Git LFS file not shown
2 changes: 1 addition & 1 deletion src/main/resources/cx-linux-arm
Git LFS file not shown
4 changes: 2 additions & 2 deletions src/main/resources/cx-mac
Git LFS file not shown
4 changes: 2 additions & 2 deletions src/main/resources/cx.exe
Git LFS file not shown
19 changes: 16 additions & 3 deletions src/test/java/com/checkmarx/ast/ScanTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ void testScanShow() throws Exception {

@Test
void testScanAsca_WhenFileWithVulnerabilitiesIsSentWithAgent_ReturnSuccessfulResponseWithCorrectValues() throws Exception {
ScanResult scanResult = wrapper.ScanAsca("src/test/resources/python-vul-file.py", true, "vscode");
ScanResult scanResult = wrapper.ScanAsca("src/test/resources/python-vul-file.py", true, "vscode", null);

// Assertions for the scan result
Assertions.assertNotNull(scanResult.getRequestId(), "Request ID should not be null");
Expand All @@ -46,7 +46,7 @@ void testScanAsca_WhenFileWithVulnerabilitiesIsSentWithAgent_ReturnSuccessfulRes

@Test
void testScanAsca_WhenFileWithoutVulnerabilitiesIsSent_ReturnSuccessfulResponseWithCorrectValues() throws Exception {
ScanResult scanResult = wrapper.ScanAsca("src/test/resources/csharp-no-vul.cs", true, null);
ScanResult scanResult = wrapper.ScanAsca("src/test/resources/csharp-no-vul.cs", true, null, null);
Assertions.assertNotNull(scanResult.getRequestId());
Assertions.assertTrue(scanResult.isStatus());
Assertions.assertNull(scanResult.getError());
Expand All @@ -55,12 +55,25 @@ void testScanAsca_WhenFileWithoutVulnerabilitiesIsSent_ReturnSuccessfulResponseW

@Test
void testScanAsca_WhenMissingFileExtension_ReturnFileExtensionIsRequiredFailure() throws Exception {
ScanResult scanResult = wrapper.ScanAsca("CODEOWNERS", true, null);
ScanResult scanResult = wrapper.ScanAsca("CODEOWNERS", true, null, null);
Assertions.assertNotNull(scanResult.getRequestId());
Assertions.assertNotNull(scanResult.getError());
Assertions.assertEquals("The file name must have an extension.", scanResult.getError().getDescription());
}

@Test
void testScanAsca_WithIgnoreFilePath_ShouldWorkCorrectly() throws Exception {
String ignoreFile = "src/test/resources/ignored-packages.json";

// Test with ignore file - should not break the scanning process
ScanResult scanResult = wrapper.ScanAsca("src/test/resources/python-vul-file.py", true, "test-agent", ignoreFile);

// Verify the scan completes successfully
Assertions.assertNotNull(scanResult.getRequestId(), "Request ID should not be null");
Assertions.assertTrue(scanResult.isStatus(), "Status should be true");
Assertions.assertNull(scanResult.getError(), "Error should be null when scan is successful");
}

@Test
void testScanList() throws Exception {
List<Scan> cxOutput = wrapper.scanList("limit=10");
Expand Down
10 changes: 10 additions & 0 deletions src/test/java/com/checkmarx/ast/TenantTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,14 @@ void testAiMcpServerEnabled() throws Exception {
boolean enabled = Assertions.assertDoesNotThrow(() -> wrapper.aiMcpServerEnabled());
Assertions.assertTrue(enabled, "AI MCP Server flag expected to be true");
}

@Test
void testDevAssistEnabled() {
Assertions.assertDoesNotThrow(() -> wrapper.devAssistEnabled());
}

@Test
void testOneAssistEnabled() {
Assertions.assertDoesNotThrow(() -> wrapper.oneAssistEnabled());
}
}
Loading