Skip to content

Commit

Permalink
Add scan result classes
Browse files Browse the repository at this point in the history
  • Loading branch information
NeRdTheNed committed Jul 7, 2023
1 parent 4e82d45 commit 27d482d
Show file tree
Hide file tree
Showing 8 changed files with 314 additions and 0 deletions.
1 change: 1 addition & 0 deletions concoction-lib/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,6 @@ repositories {
}

dependencies {
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
implementation 'com.github.xxdark:ssvm:1.9.0.3'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package info.mmpa.concoction.result;

import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

public class ArchiveScanResults {
public boolean errorReadingArchive;
@JsonInclude(value = Include.NON_EMPTY, content = Include.NON_NULL)
public final Map<String, ArchiveScanResults> recursiveArchiveScanResults;
public final Map<String, FileScanResults> fileScanResults;

public ArchiveScanResults(boolean errorReadingArchive, Map<String, ArchiveScanResults> recursiveArchiveScanResults, Map<String, FileScanResults> fileScanResults) {
this.errorReadingArchive = errorReadingArchive;
this.recursiveArchiveScanResults = recursiveArchiveScanResults;
this.fileScanResults = fileScanResults;
}

public ArchiveScanResults(Map<String, ArchiveScanResults> recursiveArchiveScanResults, Map<String, FileScanResults> fileScanResults) {
this(false, recursiveArchiveScanResults, fileScanResults);
}

public ArchiveScanResults(boolean errorReadingArchive, Map<String, FileScanResults> fileScanResults) {
this(errorReadingArchive, new HashMap<>(), fileScanResults);
}

public ArchiveScanResults(Map<String, FileScanResults> fileScanResults) {
this(false, fileScanResults);
}

public ArchiveScanResults() {
this(new HashMap<>());
}

public ArchiveScanResults add(String jij, ArchiveScanResults recursiveRes) {
recursiveArchiveScanResults.merge(jij, recursiveRes, ArchiveScanResults::add);
return this;
}

public ArchiveScanResults addRec(Map<String, ArchiveScanResults> recursiveRes) {
recursiveRes.forEach(this::add);
return this;
}

public ArchiveScanResults add(String fileName, FileScanResults res) {
fileScanResults.merge(fileName, res, FileScanResults::add);
return this;
}

public ArchiveScanResults add(Map<String, FileScanResults> res) {
res.forEach(this::add);
return this;
}

public ArchiveScanResults add(ArchiveScanResults archRes) {
if (archRes.errorReadingArchive) {
errorReadingArchive = true;
}

return addRec(archRes.recursiveArchiveScanResults).add(archRes.fileScanResults);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package info.mmpa.concoction.result;

import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;

public class CheckResults {
@JsonIgnore
public final Map<String, Integer> checkResultsMap;

@JsonAnyGetter
private Map<String, Integer> getCheckResultsMap() {
return checkResultsMap;
}

@JsonAnySetter
private void addToCheckResultsMap(String str, Integer integer) {
checkResultsMap.put(str, integer);
}

public CheckResults(Map<String, Integer> checkResultsMap) {
this.checkResultsMap = checkResultsMap;
}

public CheckResults(String result, int amount) {
this(new HashMap<>());
checkResultsMap.put(result, amount);
}

public CheckResults(String result) {
this(result, 1);
}

public CheckResults() {
this(new HashMap<>());
}

public CheckResults add(String result, int amount) {
checkResultsMap.merge(result, amount, Integer::sum);
return this;
}

public CheckResults add(String result) {
return add(result, 1);
}

public CheckResults add(Map<String, Integer> results) {
results.forEach(this::add);
return this;
}

public CheckResults add(CheckResults result) {
return add(result.checkResultsMap);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package info.mmpa.concoction.result;

import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

public class FileScanResults {
public boolean errorReadingFile;
public final Map<TestResultLevel, Map<String, CheckResults>> scanResultGroups;

public FileScanResults(boolean errorReadingFile, Map<TestResultLevel, Map<String, CheckResults>> scanResultGroups) {
this.errorReadingFile = errorReadingFile;
this.scanResultGroups = scanResultGroups;
}

public FileScanResults(boolean errorReadingFile) {
this(errorReadingFile, new EnumMap<>(TestResultLevel.class));
}

public FileScanResults() {
this(false);
}

public FileScanResults add(TestResultLevel level, Map<String, CheckResults> res) {
scanResultGroups.merge(level, res, (existing, toAdd) -> { toAdd.forEach((group, newRes) -> existing.merge(group, newRes, CheckResults::add)); return existing; });
return this;
}

public FileScanResults add(TestResultLevel level, String group, CheckResults res) {
scanResultGroups.computeIfAbsent(level, k -> new HashMap<>()).merge(group, res, CheckResults::add);
return this;
}

public FileScanResults add(TestResultLevel level, String group, String reason, int amount) {
scanResultGroups.computeIfAbsent(level, k -> new HashMap<>()).computeIfAbsent(group, k -> new CheckResults()).add(reason, amount);
return this;
}

public FileScanResults add(TestResultLevel level, String group, String reason) {
return add(level, group, reason, 1);
}

public FileScanResults add(Map<TestResultLevel, Map<String, CheckResults>> groups) {
groups.forEach(this::add);
return this;
}

public FileScanResults add(FileScanResults res) {
if (res.errorReadingFile) {
errorReadingFile = true;
}

return add(res.scanResultGroups);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package info.mmpa.concoction.result;

public enum TestResultLevel {
// TODO Better names
VIRUS(),
STRONG_SUS(),
SUS(),
BENIGN(),
VERY_BENIGN();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package info.mmpa.concoction.result.printer;

import java.io.PrintWriter;
import java.util.Map;
import java.util.Map.Entry;

import info.mmpa.concoction.result.ArchiveScanResults;
import info.mmpa.concoction.result.CheckResults;
import info.mmpa.concoction.result.FileScanResults;
import info.mmpa.concoction.result.TestResultLevel;

public class HumanReadablePrinter extends Printer {

public HumanReadablePrinter(Map<String, ArchiveScanResults> scanResults) {
super(scanResults);
}

public HumanReadablePrinter(String archiveName, ArchiveScanResults scanResult) {
super(archiveName, scanResult);
}

private void print(PrintWriter writer, String archiveName, ArchiveScanResults archiveResults, String formatBase, boolean first) {
writer.printf(formatBase, (first ? "Results for archive " : "Results for bundled archive ") + archiveName);
formatBase = " " + formatBase;

if (archiveResults.errorReadingArchive) {
writer.printf(formatBase, "Error while reading archive " + archiveName + ", scan results may be missing");
}

// TODO Better formatting code
final String indentOne = " " + formatBase;
final String indentTwo = " " + indentOne;
final String indentThree = " " + indentTwo;
final String indentFour = " " + indentThree;
archiveResults.recursiveArchiveScanResults.forEach((e, f) -> print(writer, e, f, indentOne, false));
boolean firstLog = true;

for (final Entry<String, FileScanResults> fileResultGroup : archiveResults.fileScanResults.entrySet()) {
boolean firstLogForFile = true;

for (final Entry<TestResultLevel, Map<String, CheckResults>> scanGroup : fileResultGroup.getValue().scanResultGroups.entrySet()) {
final TestResultLevel groupLevel = scanGroup.getKey();

if (firstLog) {
writer.printf(formatBase, "Detected results for archive " + archiveName);
firstLog = false;
}

if (firstLogForFile) {
writer.printf(indentOne, "Detected results for file " + fileResultGroup.getKey());
firstLogForFile = false;
}

writer.printf(indentTwo, "Result level " + groupLevel);
final Map<String, CheckResults> resultMap = scanGroup.getValue();

for (final Entry<String, CheckResults> checkEntry : resultMap.entrySet()) {
writer.printf(indentThree, "Result found by checker " + checkEntry.getKey());

for (final Entry<String, Integer> scanEntry : checkEntry.getValue().checkResultsMap.entrySet()) {
writer.printf(indentFour, "Detected " + scanEntry.getValue() + " time(s): " + scanEntry.getKey());
}
}
}
}
}

@Override
public void print(PrintWriter writer) {
scanResults.forEach((archiveName, archiveResults) -> print(writer, archiveName, archiveResults, "- %s%n", true));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package info.mmpa.concoction.result.printer;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import com.fasterxml.jackson.databind.ObjectMapper;
import info.mmpa.concoction.result.ArchiveScanResults;

public class JSONPrinter extends Printer {

public JSONPrinter(Map<String, ArchiveScanResults> scanResults) {
super(scanResults);
}

public JSONPrinter(String archiveName, ArchiveScanResults scanResult) {
super(archiveName, scanResult);
}

@Override
public void print(PrintWriter writer) {
try {
final String jsonString = new ObjectMapper().writeValueAsString(scanResults);
writer.write(jsonString);
} catch (final IOException e) {
// TODO Handle errors more gracefully
e.printStackTrace();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package info.mmpa.concoction.result.printer;

import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import info.mmpa.concoction.result.ArchiveScanResults;

public abstract class Printer {
protected final Map<String, ArchiveScanResults> scanResults;

protected Printer(Map<String, ArchiveScanResults> scanResults) {
this.scanResults = scanResults;
}

protected Printer(String archiveName, ArchiveScanResults scanResult) {
this(new HashMap<>());
scanResults.put(archiveName, scanResult);
}

public abstract void print(PrintWriter writer);
}

0 comments on commit 27d482d

Please sign in to comment.