summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/jscanner/scan/domain
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/it_jaros/jscanner/scan/domain')
-rw-r--r--src/main/java/com/it_jaros/jscanner/scan/domain/PortList.java27
-rw-r--r--src/main/java/com/it_jaros/jscanner/scan/domain/PortRange.java80
-rw-r--r--src/main/java/com/it_jaros/jscanner/scan/domain/PortResult.java48
-rw-r--r--src/main/java/com/it_jaros/jscanner/scan/domain/PortState.java8
-rw-r--r--src/main/java/com/it_jaros/jscanner/scan/domain/ScanFailure.java9
-rw-r--r--src/main/java/com/it_jaros/jscanner/scan/domain/ScanResult.java26
6 files changed, 198 insertions, 0 deletions
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<Integer> 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<Integer> 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<Integer, ServiceType> bannerRecognition,
+ List<ScanFailure> 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()
+ );
+ }
+}