Skip to content

Commit 5386b66

Browse files
Adding kics realtime command (#117)
* adding kics realtime command * adding engine support * changing file flag Co-authored-by: Pedro Lopes <[email protected]>
1 parent 71b9b51 commit 5386b66

File tree

8 files changed

+220
-0
lines changed

8 files changed

+220
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.checkmarx.ast.kicsRealtimeResults.ast.kicsRealtimeResult;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonInclude;
5+
import com.fasterxml.jackson.annotation.JsonProperty;
6+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
7+
8+
@lombok.Data
9+
@JsonDeserialize()
10+
@JsonInclude(JsonInclude.Include.NON_NULL)
11+
@JsonIgnoreProperties(ignoreUnknown = true)
12+
13+
public class KicsLocation {
14+
private final String fileName;
15+
private final String similarityID;
16+
private final int line;
17+
private final String issueType;
18+
private final String searchKey;
19+
private final int searchLine;
20+
private final String searchValue;
21+
private final String expectedValue;
22+
private final String actualValue;
23+
24+
public KicsLocation(@JsonProperty("file_name") String fileName,
25+
@JsonProperty("similarity_id") String similarityID,
26+
@JsonProperty("line") int line,
27+
@JsonProperty("issue_type") String issueType,
28+
@JsonProperty("search_key") String searchKey,
29+
@JsonProperty("search_line") int searchLine,
30+
@JsonProperty("search_value") String searchValue,
31+
@JsonProperty("expected_value") String expectedValue,
32+
@JsonProperty("actual_value") String actualValue) {
33+
this.fileName = fileName;
34+
this.similarityID = similarityID;
35+
this.line = line;
36+
this.issueType = issueType;
37+
this.searchKey = searchKey;
38+
this.searchLine = searchLine;
39+
this.searchValue = searchValue;
40+
this.expectedValue = expectedValue;
41+
this.actualValue = actualValue;
42+
}
43+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.checkmarx.ast.kicsRealtimeResults.ast.kicsRealtimeResult;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonInclude;
5+
import com.fasterxml.jackson.annotation.JsonProperty;
6+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
7+
import java.util.List;
8+
9+
@lombok.Data
10+
@JsonDeserialize()
11+
@JsonInclude(JsonInclude.Include.NON_NULL)
12+
@JsonIgnoreProperties(ignoreUnknown = true)
13+
14+
public class KicsResult {
15+
private final String queryName;
16+
private final String queryID;
17+
private final String severity;
18+
private final String platform;
19+
private final String category;
20+
private final String description;
21+
private final List <KicsLocation> locations;
22+
23+
public KicsResult(@JsonProperty("query_name") String queryName,
24+
@JsonProperty("query_id") String queryID,
25+
@JsonProperty("severity") String severity,
26+
@JsonProperty("platform") String platform,
27+
@JsonProperty("category") String category,
28+
@JsonProperty("description") String description,
29+
@JsonProperty("files") List<KicsLocation> locations) {
30+
this.queryName = queryName;
31+
this.queryID = queryID;
32+
this.severity = severity;
33+
this.platform = platform;
34+
this.category = category;
35+
this.description = description;
36+
this.locations = locations;
37+
}
38+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.checkmarx.ast.kicsRealtimeResults.ast.kicsRealtimeResult;
2+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
6+
7+
8+
@lombok.Data
9+
@JsonDeserialize()
10+
@JsonInclude(JsonInclude.Include.NON_NULL)
11+
@JsonIgnoreProperties(ignoreUnknown = true)
12+
13+
public class KicsSummary {
14+
private final int high;
15+
private final int medium;
16+
private final int low;
17+
private final int info;
18+
19+
public KicsSummary(@JsonProperty("HIGH") int high,
20+
@JsonProperty("MEDIUM") int medium,
21+
@JsonProperty("LOW") int low,
22+
@JsonProperty("INFO") int info) {
23+
this.high = high;
24+
this.medium = medium;
25+
this.low = low;
26+
this.info = info;
27+
}
28+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.checkmarx.ast.kicsRealtimeResults;
2+
3+
import com.checkmarx.ast.kicsRealtimeResults.ast.kicsRealtimeResult.KicsResult;
4+
import com.checkmarx.ast.kicsRealtimeResults.ast.kicsRealtimeResult.KicsSummary;
5+
6+
import com.fasterxml.jackson.annotation.JsonCreator;
7+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
8+
import com.fasterxml.jackson.annotation.JsonInclude;
9+
import com.fasterxml.jackson.annotation.JsonProperty;
10+
import com.fasterxml.jackson.databind.JavaType;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
12+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
13+
import com.fasterxml.jackson.databind.type.TypeFactory;
14+
import lombok.Value;
15+
import org.apache.commons.lang3.StringUtils;
16+
17+
import java.io.IOException;
18+
import java.util.List;
19+
20+
@Value
21+
@JsonDeserialize()
22+
@JsonInclude(JsonInclude.Include.NON_NULL)
23+
@JsonIgnoreProperties(ignoreUnknown = true)
24+
public class kicsRealtimeResults {
25+
26+
int totalCount;
27+
String version;
28+
List<KicsResult> results;
29+
KicsSummary kicsSummary;
30+
31+
@JsonCreator
32+
public kicsRealtimeResults(@JsonProperty("total_counter") int totalCount, @JsonProperty("queries") List<KicsResult> results,@JsonProperty("kics_version") String version, @JsonProperty("severity_counters") KicsSummary kicsSummary) {
33+
this.totalCount = totalCount;
34+
this.version = version;
35+
this.results = results;
36+
this.kicsSummary = kicsSummary;
37+
}
38+
public static <T> T fromLine(String line) {
39+
return parse(line, TypeFactory.defaultInstance().constructType(kicsRealtimeResults.class));
40+
}
41+
42+
private static <T> T parse(String line, JavaType type) {
43+
T result = null;
44+
try {
45+
if (!StringUtils.isBlank(line) && isValidJSON(line)) {
46+
result = new ObjectMapper().readValue(line, type);
47+
48+
}
49+
} catch (IOException e) {
50+
e.printStackTrace();
51+
}
52+
return result;
53+
}
54+
private static boolean isValidJSON(final String json) {
55+
try {
56+
final ObjectMapper mapper = new ObjectMapper();
57+
mapper.readTree(json);
58+
return true;
59+
} catch (IOException e) {
60+
return false;
61+
}
62+
}
63+
}

src/main/java/com/checkmarx/ast/wrapper/CxConstants.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,8 @@ public final class CxConstants {
4949
static final String CWE_ID = "--cwe-id";
5050
static final String LANGUAGE = "--language";
5151
static final String VULNERABILITY_TYPE = "--vulnerability-type";
52+
static final String FILE_SOURCES = "--file";
53+
static final String ADDITONAL_PARAMS = "--additional-params";
54+
static final String ENGINE = "--engine";
55+
static final String SUB_CMD_KICS_REALTIME = "kics-realtime";
5256
}

src/main/java/com/checkmarx/ast/wrapper/CxWrapper.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.checkmarx.ast.wrapper;
22

33
import com.checkmarx.ast.codebashing.CodeBashing;
4+
import com.checkmarx.ast.kicsRealtimeResults.kicsRealtimeResults;
45
import com.checkmarx.ast.predicate.Predicate;
56
import com.checkmarx.ast.project.Project;
67
import com.checkmarx.ast.results.ReportFormat;
@@ -304,6 +305,26 @@ public int getResultsBfl(@NonNull UUID scanId, @NonNull String queryId, List<Nod
304305

305306
}
306307

308+
public kicsRealtimeResults kicsRealtimeScan(@NonNull String fileSources,String engine ,String additionalParams)
309+
throws IOException, InterruptedException, CxException {
310+
this.logger.info("Executing 'scan kics-realtime' command using the CLI.");
311+
this.logger.info("Fetching the results for fileSources {} and additionalParams {}", fileSources, additionalParams);
312+
313+
List<String> arguments = new ArrayList<>();
314+
arguments.add(CxConstants.CMD_SCAN);
315+
arguments.add(CxConstants.SUB_CMD_KICS_REALTIME);
316+
arguments.add(CxConstants.FILE_SOURCES);
317+
arguments.add(fileSources);
318+
arguments.add(CxConstants.ADDITONAL_PARAMS);
319+
arguments.add(additionalParams);
320+
if(engine.length()>0){
321+
arguments.add(CxConstants.ENGINE);
322+
arguments.add(engine);
323+
}
324+
kicsRealtimeResults kicsResults = Execution.executeCommand(withConfigArguments(arguments), logger, kicsRealtimeResults::fromLine);
325+
return kicsResults;
326+
327+
}
307328
private int getIndexOfBfLNode(List<Node> bflNodes, List<Node> resultNodes) {
308329

309330
int bflNodeNotFound = -1;

src/test/java/com/checkmarx/ast/ScanTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.checkmarx.ast;
22

3+
import com.checkmarx.ast.kicsRealtimeResults.kicsRealtimeResults;
34
import com.checkmarx.ast.scan.Scan;
45
import org.junit.jupiter.api.Assertions;
56
import org.junit.jupiter.api.Test;
@@ -31,4 +32,10 @@ void testScanCreate() throws Exception {
3132
Assertions.assertEquals("Completed", wrapper.scanShow(UUID.fromString(scan.getId())).getStatus());
3233
}
3334

35+
@Test
36+
void testKicsRealtimeScan() throws Exception {
37+
kicsRealtimeResults scan = wrapper.kicsRealtimeScan("target/test-classes/Dockerfile","","v");
38+
Assertions.assertTrue(scan.getResults().size() >= 1);
39+
}
40+
3441
}

src/test/resources/Dockerfile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM openjdk:11.0.1-jre-slim-stretch
2+
3+
ARG webwolf_version=v8.0.0-SNAPSHOT
4+
5+
RUN \
6+
apt-get update && apt-get install && \
7+
useradd --home-dir /home/webwolf --create-home -U webwolf
8+
9+
USER webwolf
10+
COPY target/webwolf-${webwolf_version}.jar /home/webwolf/webwolf.jar
11+
COPY start-webwolf.sh /home/webwolf
12+
13+
EXPOSE 9090
14+
15+
ENTRYPOINT ["/home/webwolf/start-webwolf.sh"]
16+
CMD ["--server.port=9090", "--server.address=0.0.0.0"]

0 commit comments

Comments
 (0)