summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/it_jaros/jns/CliPrinter.java83
-rw-r--r--src/main/java/com/it_jaros/jns/scan/domain/PortList.java4
2 files changed, 52 insertions, 35 deletions
diff --git a/src/main/java/com/it_jaros/jns/CliPrinter.java b/src/main/java/com/it_jaros/jns/CliPrinter.java
index 4b3a247..fded599 100644
--- a/src/main/java/com/it_jaros/jns/CliPrinter.java
+++ b/src/main/java/com/it_jaros/jns/CliPrinter.java
@@ -1,12 +1,15 @@
package com.it_jaros.jns;
import com.it_jaros.jns.scan.Scan;
+import com.it_jaros.jns.scan.domain.PortList;
import com.it_jaros.jns.scan.domain.ScanFailure;
import com.it_jaros.jns.scan.domain.ScanResult;
import com.it_jaros.jns.scan.service.ServiceType;
import java.io.BufferedReader;
import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
@@ -54,22 +57,15 @@ public class CliPrinter {
if (result.errors().isEmpty()) return;
StringBuilder sb = new StringBuilder();
- sb.append(String.format(
- "%s | errors: %d%n",
- result.host(),
- result.errors().size()
- ));
- String errors = result.errors().stream().map((ScanFailure error) -> String.format(
- "\t%dx %s: %s ports: %s",
- error.ports().size(),
- error.exception().type(),
- error.exception().message(),
- error.ports().stream().sorted().map(String::valueOf).collect(Collectors.joining(","))
- )).collect(Collectors.joining("\n"));
- sb.append(errors);
- sb.append("\n");
+ sb.append(result.host()).append(" | errors: ").append(result.errors().size()).append('\n');
+ for (ScanFailure error : result.errors()) {
+ sb.append('\t').append(error.ports().size()).append("x ")
+ .append(error.exception().type()).append(": ").append(error.exception().message())
+ .append(" ports: ").append(joinSortedPorts(error.ports())).append('\n');
+ }
+ sb.append('\n');
- System.err.println(sb);
+ System.err.print(sb);
System.err.flush();
}
@@ -79,37 +75,54 @@ public class CliPrinter {
}
StringBuilder sb = new StringBuilder();
- sb.append(result.host());
- sb.append("\n");
+ sb.append(result.host()).append('\n');
if (!result.openPorts().isEmpty()) {
- sb.append(
- String.format("\t (%d) open:\t%s%n", result.openPorts().size(), map(result.openPorts().getPorts(), result.bannerRecognition()))
- );
+ sb.append("\t (").append(result.openPorts().size()).append(") open:\t")
+ .append(joinOpenPorts(result.openPorts(), result.bannerRecognition())).append('\n');
}
if (showFilteredPorts && !result.filteredPorts().isEmpty()) {
- sb.append(
- String.format("\t (%d) filtered:\t%s%n", result.filteredPorts().size(), map(result.filteredPorts().getPorts()))
- );
+ sb.append("\t (").append(result.filteredPorts().size()).append(") filtered:\t")
+ .append(joinPorts(result.filteredPorts())).append('\n');
}
- sb.append("\n");
- System.out.println(sb);
+ sb.append('\n');
+ System.out.print(sb);
System.out.flush();
}
- private static String map(List<Integer> ports) {
- return ports.stream().map(String::valueOf).collect(Collectors.joining(","));
+ private static String joinPorts(PortList portList) {
+ StringBuilder sb = new StringBuilder();
+ boolean first = true;
+ for (int port = portList.nextSetBit(0); port >= 0; port = portList.nextSetBit(port + 1)) {
+ if (!first) {
+ sb.append(',');
+ }
+ sb.append(port);
+ first = false;
+ }
+ return sb.toString();
}
- private static String map(List<Integer> ports, Map<Integer, ServiceType> bannerRecognition) {
- return ports.stream().map(port -> {
- ServiceType serviceType = bannerRecognition.getOrDefault(port, ServiceType.UNKNOWN);
-
- if (serviceType == ServiceType.UNKNOWN) {
- return String.valueOf(port);
+ private static String joinOpenPorts(PortList portList, Map<Integer, ServiceType> bannerRecognition) {
+ StringBuilder sb = new StringBuilder();
+ boolean first = true;
+ for (int port = portList.nextSetBit(0); port >= 0; port = portList.nextSetBit(port + 1)) {
+ if (!first) {
+ sb.append(',');
+ }
+ sb.append(port);
+ ServiceType serviceType = bannerRecognition.get(port);
+ if (serviceType != null && serviceType != ServiceType.UNKNOWN) {
+ sb.append('/').append(serviceType.name().toLowerCase());
}
+ first = false;
+ }
+ return sb.toString();
+ }
- return port + "/" + serviceType.name().toLowerCase();
- }).collect(Collectors.joining(","));
+ private static String joinSortedPorts(List<Integer> ports) {
+ List<Integer> sorted = new ArrayList<>(ports);
+ Collections.sort(sorted);
+ return sorted.stream().map(String::valueOf).collect(Collectors.joining(","));
}
private static int getColumnWidth() {
diff --git a/src/main/java/com/it_jaros/jns/scan/domain/PortList.java b/src/main/java/com/it_jaros/jns/scan/domain/PortList.java
index 69a6bfc..837ce6b 100644
--- a/src/main/java/com/it_jaros/jns/scan/domain/PortList.java
+++ b/src/main/java/com/it_jaros/jns/scan/domain/PortList.java
@@ -9,6 +9,10 @@ import java.util.List;
public class PortList {
private final BitSet ports;
+ public int nextSetBit(int fromIndex) {
+ return ports.nextSetBit(fromIndex);
+ }
+
public PortList(BitSet ports) {
this.ports = ports;
}