From ff14e0fc4e3fe4f5b8a67640d28850064661d7ab Mon Sep 17 00:00:00 2001 From: Matthias Jaros Date: Wed, 12 Aug 2026 13:24:27 +0200 Subject: Major refactoring of package structure --- .../it_jaros/jscanner/scan/domain/PortList.java | 27 ++++++++ .../it_jaros/jscanner/scan/domain/PortRange.java | 80 ++++++++++++++++++++++ .../it_jaros/jscanner/scan/domain/PortResult.java | 48 +++++++++++++ .../it_jaros/jscanner/scan/domain/PortState.java | 8 +++ .../it_jaros/jscanner/scan/domain/ScanFailure.java | 9 +++ .../it_jaros/jscanner/scan/domain/ScanResult.java | 26 +++++++ 6 files changed, 198 insertions(+) create mode 100644 src/main/java/com/it_jaros/jscanner/scan/domain/PortList.java create mode 100644 src/main/java/com/it_jaros/jscanner/scan/domain/PortRange.java create mode 100644 src/main/java/com/it_jaros/jscanner/scan/domain/PortResult.java create mode 100644 src/main/java/com/it_jaros/jscanner/scan/domain/PortState.java create mode 100644 src/main/java/com/it_jaros/jscanner/scan/domain/ScanFailure.java create mode 100644 src/main/java/com/it_jaros/jscanner/scan/domain/ScanResult.java (limited to 'src/main/java/com/it_jaros/jscanner/scan/domain') diff --git a/src/main/java/com/it_jaros/jscanner/scan/domain/PortList.java b/src/main/java/com/it_jaros/jscanner/scan/domain/PortList.java new file mode 100644 index 0000000..f145700 --- /dev/null +++ b/src/main/java/com/it_jaros/jscanner/scan/domain/PortList.java @@ -0,0 +1,27 @@ +package com.it_jaros.jscanner.scan.domain; + +import java.util.BitSet; +import java.util.List; + +/** + * Encapsulates a port scan result and is immutable + */ +public class PortList { + private final BitSet ports; + + public PortList(BitSet ports) { + this.ports = ports; + } + + public List getPorts() { + return ports.stream().boxed().toList(); + } + + public boolean isEmpty() { + return ports.isEmpty(); + } + + public int size() { + return ports.cardinality(); + } +} diff --git a/src/main/java/com/it_jaros/jscanner/scan/domain/PortRange.java b/src/main/java/com/it_jaros/jscanner/scan/domain/PortRange.java new file mode 100644 index 0000000..4434763 --- /dev/null +++ b/src/main/java/com/it_jaros/jscanner/scan/domain/PortRange.java @@ -0,0 +1,80 @@ +package com.it_jaros.jscanner.scan.domain; + +import com.it_jaros.jscanner.scan.engine.PortRangeIterator; + +import java.util.BitSet; +import java.util.Iterator; + +public class PortRange { + + public static final int MIN_PORT = 1; + public static final int MAX_PORT = 65535; + private final BitSet specifiedPorts = new BitSet(MAX_PORT); + + public PortRange(String ports) { + if (ports == null || "".equals(ports)) { + specifiedPorts.set(MIN_PORT, 1024); + } else if ("all".equalsIgnoreCase(ports)) { + specifiedPorts.set(MIN_PORT, MAX_PORT + 1); + } else { + parsePortRange(ports); + } + } + + /** + * Possible values are 1,10 or 1-10 or a mix of 1,5-10 + * So we treat , stronger and handle them first and then check for - + * + * @param ports + */ + private void parsePortRange(String ports) { + String[] splitComma = ports.split(","); + for (String commaValue : splitComma) { + String[] rangeValue = commaValue.split("-"); + + // more then two values are not possible + if (rangeValue.length > 2) { + throw new IllegalArgumentException(String.format("Argument contains too many '-'' %s", commaValue)); + } + + // no range given, only single port + int port = Integer.parseInt(rangeValue[0]); + if (rangeValue.length == 1) { + checkValue(port); + specifiedPorts.set(port); + continue; + } + + // range given + int end = Integer.parseInt(rangeValue[1]); + checkValues(port, end); + specifiedPorts.set(port, end + 1); + } + } + + private void checkValues(int start, int end) { + checkValue(start); + checkValue(end); + + if (start >= end) { + throw new IllegalArgumentException( + String.format("Start value cannot be equal or bigger than end value '%s >= %s'", start, end)); + } + } + + private void checkValue(int port) { + if (port < MIN_PORT) { + throw new IllegalArgumentException( + String.format("Port value is too low: %s < %s", port, MIN_PORT)); + } + + if (port > MAX_PORT) { + throw new IllegalArgumentException( + String.format("Port value is too high: %s > %s", port, MAX_PORT)); + } + } + + public Iterator iterator() { + return new PortRangeIterator(specifiedPorts); + } +} \ No newline at end of file diff --git a/src/main/java/com/it_jaros/jscanner/scan/domain/PortResult.java b/src/main/java/com/it_jaros/jscanner/scan/domain/PortResult.java new file mode 100644 index 0000000..9e70cc5 --- /dev/null +++ b/src/main/java/com/it_jaros/jscanner/scan/domain/PortResult.java @@ -0,0 +1,48 @@ +package com.it_jaros.jscanner.scan.domain; + +import java.io.IOException; + +public class PortResult { + private int port; + private PortState state; + private byte[] banner; + private Exception exception; + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public PortState getState() { + return state; + } + + public void setState(PortState state) { + this.state = state; + } + + public byte[] getBanner() { + return banner; + } + + public void setBanner(byte[] banner) { + this.banner = banner; + } + + public void setException(IOException e) { + exception = e; + } + + public Exception getException() { + return exception; + } + + public static PortResult empty() { + PortResult portResult = new PortResult(); + portResult.setState(PortState.UNKNOWN); + return portResult; + } +} diff --git a/src/main/java/com/it_jaros/jscanner/scan/domain/PortState.java b/src/main/java/com/it_jaros/jscanner/scan/domain/PortState.java new file mode 100644 index 0000000..6db4b2e --- /dev/null +++ b/src/main/java/com/it_jaros/jscanner/scan/domain/PortState.java @@ -0,0 +1,8 @@ +package com.it_jaros.jscanner.scan.domain; + +public enum PortState { + CLOSED, + FILTERED, + OPEN, + UNKNOWN +} diff --git a/src/main/java/com/it_jaros/jscanner/scan/domain/ScanFailure.java b/src/main/java/com/it_jaros/jscanner/scan/domain/ScanFailure.java new file mode 100644 index 0000000..db33465 --- /dev/null +++ b/src/main/java/com/it_jaros/jscanner/scan/domain/ScanFailure.java @@ -0,0 +1,9 @@ +package com.it_jaros.jscanner.scan.domain; + +import com.it_jaros.jscanner.scan.ExceptionInfo; + +public record ScanFailure( + Integer port, + ExceptionInfo exception +) { +} diff --git a/src/main/java/com/it_jaros/jscanner/scan/domain/ScanResult.java b/src/main/java/com/it_jaros/jscanner/scan/domain/ScanResult.java new file mode 100644 index 0000000..e18e75d --- /dev/null +++ b/src/main/java/com/it_jaros/jscanner/scan/domain/ScanResult.java @@ -0,0 +1,26 @@ +package com.it_jaros.jscanner.scan.domain; + +import com.it_jaros.jscanner.scan.service.ServiceType; + +import java.util.BitSet; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public record ScanResult( + String host, + PortList openPorts, + PortList filteredPorts, + Map bannerRecognition, + List errors +) { + public static ScanResult empty(String host) { + return new ScanResult( + host, + new PortList(new BitSet(PortRange.MAX_PORT)), + new PortList(new BitSet(PortRange.MAX_PORT)), + Collections.emptyMap(), + Collections.emptyList() + ); + } +} -- cgit v1.3.1