diff options
| -rw-r--r-- | src/main/java/com/it_jaros/jscanner/Scanner.java | 78 |
1 files changed, 48 insertions, 30 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/Scanner.java b/src/main/java/com/it_jaros/jscanner/Scanner.java index a90fc55..021eb32 100644 --- a/src/main/java/com/it_jaros/jscanner/Scanner.java +++ b/src/main/java/com/it_jaros/jscanner/Scanner.java @@ -231,16 +231,18 @@ public class Scanner implements AutoCloseable { * @return */ private ScanResult scanHostPorts(final String host, final Scan scan) { - PortRange portRange = new PortRange(scan.getPorts()); - BitSet openPorts = new BitSet(PortRange.MAX_PORT); - BitSet filteredPorts = new BitSet(PortRange.MAX_PORT); - HashMap<Integer, ServiceType> serviceTypes = new HashMap<>(); - if (!disableOnlineCheck && !checkHostOnline(host)) { // Unreachable host - return new ScanResult(host, openPorts, filteredPorts, serviceTypes, List.of()); + return new ScanResult( + host, + new BitSet(PortRange.MAX_PORT), + new BitSet(PortRange.MAX_PORT), + new HashMap<>(), + List.of() + ); } + final PortRange portRange = new PortRange(scan.getPorts()); final AtomicLong portSlotFactory = new AtomicLong(System.nanoTime()); // producer thread ProducerState<PortResult> state = startProducer( @@ -250,10 +252,10 @@ public class Scanner implements AutoCloseable { scan.getThreadCounter() ); - List<ScanFailure> scanFailures = new ArrayList<>(); // consumer is the main thread // we run as long as the producer is running or as long as things are in pipeline to be processed // only exception is when cancelled is set + final PortResultAccumulator accumulator = new PortResultAccumulator(host); while (!cancelled && (state.running().get() || state.inPipeline().get() > 0)) { try { PortResult portResult = getPortResult(state); @@ -261,13 +263,13 @@ public class Scanner implements AutoCloseable { continue; } - handlePortResult(portResult, openPorts, serviceTypes, filteredPorts, scanFailures); + accumulator.add(portResult); } catch (InterruptedException ignored) { Thread.currentThread().interrupt(); } } - return new ScanResult(host, openPorts, filteredPorts, serviceTypes, scanFailures); + return accumulator.build(); } private boolean checkHostOnline(String host) { @@ -298,27 +300,6 @@ public class Scanner implements AutoCloseable { } return portResult; } - - private void handlePortResult(PortResult portResult, BitSet openPorts, HashMap<Integer, ServiceType> serviceTypes, BitSet filteredPorts, List<ScanFailure> scanFailures) { - switch (portResult.getState()) { - case OPEN -> { - // bitset is not thread-safe, so it is set - // outside the other virtual threads that update progress - openPorts.set(portResult.getPort()); - serviceTypes.put(portResult.getPort(), ServiceDetector.detect(portResult.getBanner())); - } - case FILTERED -> { - filteredPorts.set(portResult.getPort()); - } - default -> { - // sonarcube glücklich machen - } - } - Exception e = portResult.getException(); - if (e != null) { - scanFailures.add(new ScanFailure(portResult.getPort(), ExceptionInfo.from(e))); - } - } } private final class ScanPortTask implements Callable<PortResult> { @@ -405,4 +386,41 @@ public class Scanner implements AutoCloseable { return null; } } + + private final class PortResultAccumulator { + private final String host; + private final BitSet openPorts = new BitSet(PortRange.MAX_PORT); + private final BitSet filteredPorts = new BitSet(PortRange.MAX_PORT); + private final Map<Integer, ServiceType> serviceTypes = new HashMap<>(); + private final List<ScanFailure> scanFailures = new ArrayList<>(); + + private PortResultAccumulator(String host) { + this.host = host; + } + + void add(PortResult portResult) { + switch (portResult.getState()) { + case OPEN -> { + // bitset is not thread-safe, so it is set + // outside the other virtual threads that update progress + openPorts.set(portResult.getPort()); + serviceTypes.put(portResult.getPort(), ServiceDetector.detect(portResult.getBanner())); + } + case FILTERED -> { + filteredPorts.set(portResult.getPort()); + } + default -> { + // sonarcube glücklich machen + } + } + Exception e = portResult.getException(); + if (e != null) { + scanFailures.add(new ScanFailure(portResult.getPort(), ExceptionInfo.from(e))); + } + } + + ScanResult build() { + return new ScanResult(host, openPorts, filteredPorts, serviceTypes, scanFailures); + } + } } |
