summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/it_jaros/jscanner/Scanner.java78
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);
+ }
+ }
}