diff --git a/src/main/java/com/checkmarx/ast/tenant/TenantSetting.java b/src/main/java/com/checkmarx/ast/tenant/TenantSetting.java new file mode 100644 index 00000000..3ffcc2ed --- /dev/null +++ b/src/main/java/com/checkmarx/ast/tenant/TenantSetting.java @@ -0,0 +1,38 @@ +package com.checkmarx.ast.tenant; + +import com.checkmarx.ast.wrapper.CxBaseObject; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.type.TypeFactory; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.Value; + +import java.util.List; + +@Value +@EqualsAndHashCode() +@JsonDeserialize() +@ToString(callSuper = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +public class TenantSetting { + + String key; + String value; + + @JsonCreator + public TenantSetting(@JsonProperty("key") String key, @JsonProperty("value") String value) { + this.key = key; + this.value = value; + } + + public static List listFromLine(String line) { + return CxBaseObject.parse(line, + TypeFactory.defaultInstance() + .constructCollectionType(List.class, TenantSetting.class)); + } +} diff --git a/src/main/java/com/checkmarx/ast/wrapper/CxBaseObject.java b/src/main/java/com/checkmarx/ast/wrapper/CxBaseObject.java index 9fc009d7..f9911c14 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/CxBaseObject.java +++ b/src/main/java/com/checkmarx/ast/wrapper/CxBaseObject.java @@ -35,7 +35,7 @@ protected CxBaseObject(@JsonProperty("ID") String id, this.tags = tags; } - protected static T parse(String line, JavaType type) { + public static T parse(String line, JavaType type) { T result = null; if (!StringUtils.isBlank(line) && isValidJSON(line)) { try { @@ -47,7 +47,7 @@ protected static T parse(String line, JavaType type) { return result; } - private static boolean isValidJSON(final String json) { + public static boolean isValidJSON(final String json) { try { final ObjectMapper mapper = new ObjectMapper(); mapper.readTree(json); diff --git a/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java b/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java index c88b45a1..4c4456d2 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java +++ b/src/main/java/com/checkmarx/ast/wrapper/CxConstants.java @@ -65,4 +65,6 @@ public final class CxConstants { static final String KICS_REMEDIATION_KICS_FILE = "--kics-files"; static final String KICS_REMEDIATION_SIMILARITY = "--similarity-ids"; static final String SUB_CMD_LEARN_MORE = "learn-more"; + static final String SUB_CMD_TENANT = "tenant"; + static final String IDE_SCANS_KEY = "scan.config.plugins.ideScans"; } diff --git a/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java b/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java index 875f694e..3485e5f2 100644 --- a/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java +++ b/src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java @@ -11,6 +11,7 @@ import com.checkmarx.ast.results.ResultsSummary; import com.checkmarx.ast.results.result.Node; import com.checkmarx.ast.scan.Scan; +import com.checkmarx.ast.tenant.TenantSetting; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.CollectionType; import com.fasterxml.jackson.databind.type.TypeFactory; @@ -38,13 +39,11 @@ public class CxWrapper { @NonNull private final String executable; - public CxWrapper(CxConfig cxConfig) - throws CxConfig.InvalidCLIConfigException, IOException { + public CxWrapper(CxConfig cxConfig) throws IOException { this(cxConfig, LoggerFactory.getLogger(CxWrapper.class)); } - public CxWrapper(@NonNull CxConfig cxConfig, @NonNull Logger logger) throws CxConfig.InvalidCLIConfigException, - IOException { + public CxWrapper(@NonNull CxConfig cxConfig, @NonNull Logger logger) throws IOException { this.cxConfig = cxConfig; this.logger = logger; this.executable = StringUtils.isBlank(this.cxConfig.getPathToExecutable()) @@ -281,24 +280,9 @@ public String results(@NonNull UUID scanId, ReportFormat reportFormat) fileName + reportFormat.getExtension()); } - public List buildResultsArguments(@NonNull UUID scanId, ReportFormat reportFormat) { - return withConfigArguments(buildResultsArgumentsArray(scanId, reportFormat)); - } - - private List buildResultsArgumentsArray(UUID scanId, ReportFormat reportFormat) { - List arguments = new ArrayList<>(); - arguments.add(CxConstants.CMD_RESULT); - arguments.add(CxConstants.SUB_CMD_SHOW); - arguments.add(CxConstants.SCAN_ID); - arguments.add(scanId.toString()); - arguments.add(CxConstants.REPORT_FORMAT); - arguments.add(reportFormat.toString()); - - return arguments; - } - public String scaRemediation(String packageFiles, String packages, String packageVersion) throws CxException, IOException, InterruptedException { List arguments = new ArrayList<>(); + arguments.add(CxConstants.CMD_UTILS); arguments.add(CxConstants.CMD_REMEDIATION); arguments.add(CxConstants.SUB_CMD_REMEDIATION_SCA); @@ -347,8 +331,8 @@ public KicsRealtimeResults kicsRealtimeScan(@NonNull String fileSources, String arguments.add(CxConstants.ENGINE); arguments.add(engine); } - KicsRealtimeResults kicsResults = Execution.executeCommand(withConfigArguments(arguments), logger, KicsRealtimeResults::fromLine); - return kicsResults; + + return Execution.executeCommand(withConfigArguments(arguments), logger, KicsRealtimeResults::fromLine); } public KicsRemediation kicsRemediate(@NonNull String resultsFile, String kicsFile, String engine,String similarityIds) @@ -373,8 +357,8 @@ public KicsRemediation kicsRemediate(@NonNull String resultsFile, String kicsFil arguments.add(CxConstants.KICS_REMEDIATION_SIMILARITY); arguments.add(similarityIds); } - KicsRemediation remediation = Execution.executeCommand(arguments, logger, KicsRemediation::fromLine); - return remediation; + + return Execution.executeCommand(arguments, logger, KicsRemediation::fromLine); } public List learnMore(String queryId) throws CxException, IOException, InterruptedException { @@ -387,8 +371,28 @@ public List learnMore(String queryId) throws CxException, IOException arguments.add(CxConstants.FORMAT); arguments.add(CxConstants.FORMAT_JSON); - List learnMore = Execution.executeCommand(withConfigArguments(arguments), logger, LearnMore::listFromLine); - return learnMore; + return Execution.executeCommand(withConfigArguments(arguments), logger, LearnMore::listFromLine); + } + + public boolean ideScansEnabled() throws CxException, IOException, InterruptedException { + List tenantSettings = tenantSettings(); + if (tenantSettings == null) { + throw new CxException(1, "Unable to parse tenant settings"); + } + return tenantSettings.stream() + .filter(t -> t.getKey().equals(CxConstants.IDE_SCANS_KEY)) + .findFirst() + .map(t -> Boolean.parseBoolean(t.getValue())) + .orElse(false); + } + + public List tenantSettings() throws CxException, IOException, InterruptedException { + List arguments = jsonArguments(); + + arguments.add(CxConstants.CMD_UTILS); + arguments.add(CxConstants.SUB_CMD_TENANT); + + return Execution.executeCommand(withConfigArguments(arguments), logger, TenantSetting::listFromLine); } private int getIndexOfBfLNode(List bflNodes, List resultNodes) { @@ -404,6 +408,22 @@ private int getIndexOfBfLNode(List bflNodes, List resultNodes) { return bflNodeNotFound; } + public List buildResultsArguments(@NonNull UUID scanId, ReportFormat reportFormat) { + return withConfigArguments(buildResultsArgumentsArray(scanId, reportFormat)); + } + + private List buildResultsArgumentsArray(UUID scanId, ReportFormat reportFormat) { + List arguments = new ArrayList<>(); + arguments.add(CxConstants.CMD_RESULT); + arguments.add(CxConstants.SUB_CMD_SHOW); + arguments.add(CxConstants.SCAN_ID); + arguments.add(scanId.toString()); + arguments.add(CxConstants.REPORT_FORMAT); + arguments.add(reportFormat.toString()); + + return arguments; + } + private List withConfigArguments(List commands) { List arguments = new ArrayList<>(); diff --git a/src/test/java/com/checkmarx/ast/TenantTest.java b/src/test/java/com/checkmarx/ast/TenantTest.java new file mode 100644 index 00000000..b9ac752c --- /dev/null +++ b/src/test/java/com/checkmarx/ast/TenantTest.java @@ -0,0 +1,21 @@ +package com.checkmarx.ast; + +import com.checkmarx.ast.tenant.TenantSetting; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +public class TenantTest extends BaseTest { + + @Test + void testTenantSettings() throws Exception { + List tenantSettings = wrapper.tenantSettings(); + Assertions.assertTrue(tenantSettings.size() > 0); + } + + @Test + void testIdeScansEnabled() { + Assertions.assertDoesNotThrow(() -> wrapper.ideScansEnabled()); + } +}