diff options
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/java/com/it_jaros/jns/CliPrinter.java | 83 | ||||
| -rw-r--r-- | src/main/java/com/it_jaros/jns/scan/domain/PortList.java | 4 |
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; } |
