diff --git a/src/main/java/ru/micord/av/service/service/FileScanService.java b/src/main/java/ru/micord/av/service/service/FileScanService.java index 33f4771..6ef6124 100644 --- a/src/main/java/ru/micord/av/service/service/FileScanService.java +++ b/src/main/java/ru/micord/av/service/service/FileScanService.java @@ -2,15 +2,9 @@ package ru.micord.av.service.service; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,16 +27,9 @@ public class FileScanService { public ScanResult scanFile(MultipartFile file) { File tempFile = null; - LocalDateTime startTime; - LocalDateTime stopTime; try { tempFile = saveFile(file); - startTime = LocalDateTime.now(); - String rawResult = runKeslScan(tempFile); - stopTime = LocalDateTime.now(); - return parseKeslResponse(rawResult, startTime, stopTime, tempFile, - file.getOriginalFilename() - ); + return runKeslScan(tempFile); } catch (Exception e) { throw new AvException("Error scanning file: " + file.getOriginalFilename(), e); @@ -69,64 +56,35 @@ public class FileScanService { return tempFile.toFile(); } - private String runKeslScan(File file) throws IOException, InterruptedException { + private ScanResult runKeslScan(File file) throws IOException, InterruptedException { ProcessBuilder processBuilder = new ProcessBuilder(KESL_CONTROL, KESL_SCAN, file.getAbsolutePath() ); processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); - try (InputStream inputStream = process.getInputStream()) { - String result = new String(inputStream.readAllBytes()); - int exitCode = process.waitFor(); - if (exitCode != 0 && exitCode != 72) { - throw new AvException("KESL error, exit code: " + exitCode); - } - return result; - } - } - - private ScanResult parseKeslResponse(String rawResult, LocalDateTime startTime, - LocalDateTime stopTime, File file, String originalFilename) { - Map scanResults = new HashMap<>(); - List verdicts = new ArrayList<>(); - List threats = new ArrayList<>(); - String verdict = null; - - for (String line : rawResult.split("\n")) { - if (line.startsWith("Infected objects")) { - verdict = extractInteger(line) > 0 - ? ScanResult.Scan.VERDICT_INFECTED - : ScanResult.Scan.VERDICT_CLEAN; - if (ScanResult.Scan.VERDICT_INFECTED.equals(verdict)) - threats.add(new ScanResult.Scan.Threat("", file.getAbsolutePath())); - } - if (line.startsWith("Scan errors") && extractInteger(line) > 0) { - verdict = "error"; - } - } - if (verdict != null) { - scanResults.put(originalFilename, - new ScanResult.Scan(startTime.toString(), stopTime.toString(), - threats.toArray(new ScanResult.Scan.Threat[0]), verdict - ) + int exitCode = process.waitFor(); + if (exitCode == 0) { + return new ScanResult( + null, + null, + 100, + null, + "completed", + new String[] {ScanResult.Scan.VERDICT_CLEAN} ); - verdicts.add(verdict); } - return new ScanResult(startTime.toString(), stopTime.toString(), 100, scanResults, "completed", - verdicts.toArray(new String[0]) - ); - } - - private int extractInteger(String line) { - String[] parts = line.split(":"); - if (parts.length > 1) { - try { - return Integer.parseInt(parts[1].trim()); - } - catch (NumberFormatException e) { - throw new RuntimeException(e); - } + else if (exitCode == 72) { + return new ScanResult( + null, + null, + 100, + null, + "completed", + new String[] {ScanResult.Scan.VERDICT_INFECTED} + ); + } + else { + throw new AvException("KESL error, exit code: " + exitCode); } - return 0; } }