From b9603b6264d0918ec1ddc37be4fbff999ff324d7 Mon Sep 17 00:00:00 2001 From: Minecon724 Date: Thu, 23 Jan 2025 20:59:30 +0100 Subject: [PATCH] minor refactoring --- .../m724/autopeerer/client/PacketHandler.java | 57 ++++++++++++------- .../m724/autopeerer/common/AddressTools.java | 2 +- .../common/packet/c2s/PingResponsePacket.java | 14 ++++- .../m724/autopeerer/server/MyHttpHandler.java | 6 +- .../java/eu/m724/autopeerer/server/Node.java | 2 +- 5 files changed, 54 insertions(+), 27 deletions(-) diff --git a/src/main/java/eu/m724/autopeerer/client/PacketHandler.java b/src/main/java/eu/m724/autopeerer/client/PacketHandler.java index 33180c2..7fa5b76 100644 --- a/src/main/java/eu/m724/autopeerer/client/PacketHandler.java +++ b/src/main/java/eu/m724/autopeerer/client/PacketHandler.java @@ -18,6 +18,8 @@ import eu.m724.autopeerer.common.packet.c2s.SessionResponsePacket; import java.io.BufferedReader; import java.io.IOException; import java.io.OutputStream; +import java.net.Inet4Address; +import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.BufferUnderflowException; @@ -76,38 +78,51 @@ public class PacketHandler { private void handlePingRequest(PingRequestPacket packet) { System.out.printf("Ping request #%d to %s\n", packet.requestId, packet.target.getHostAddress()); + + + + CompletableFuture.runAsync(() -> { float average = -1, meanDeviation = -1; var status = PingResponsePacket.PingResponseStatus.ERROR; - try { - // -3 was also an arumetn but not wokring on all - Process process = Runtime.getRuntime().exec(new String[] { "ping", "-Ac", "10", "-W", "1", packet.target.getHostAddress() }); + if (packet.target instanceof Inet6Address && !Connectivity.ipv6()) { + // target ipv6 but no ipv6 + status = PingResponsePacket.PingResponseStatus.UNREACHABLE_PROTOCOL; + } else if (packet.target instanceof Inet4Address && !Connectivity.ipv4()) { + // target ipv4 but no ipv4 + status = PingResponsePacket.PingResponseStatus.UNREACHABLE_PROTOCOL; + } else { + // target ip version supported + try { + // -3 was also an arumetn but not wokring on all + Process process = Runtime.getRuntime().exec(new String[] { "ping", "-Ac", "10", "-W", "1", packet.target.getHostAddress() }); - try (BufferedReader reader = process.inputReader()) { - for (String l : reader.lines().toList()) { - boolean end = l.startsWith("rtt"); + try (BufferedReader reader = process.inputReader()) { + for (String l : reader.lines().toList()) { + boolean end = l.startsWith("rtt"); - if (l.startsWith("PING")) { - status = PingResponsePacket.PingResponseStatus.UNREACHABLE; - } + if (l.startsWith("PING")) { + status = PingResponsePacket.PingResponseStatus.UNREACHABLE; + } - if (end) { - String[] results = l.split(" ")[3].split("/"); - average = Float.parseFloat(results[1]); - meanDeviation = Float.parseFloat(results[3]); - status = PingResponsePacket.PingResponseStatus.OK; + if (end) { + String[] results = l.split(" ")[3].split("/"); + average = Float.parseFloat(results[1]); + meanDeviation = Float.parseFloat(results[3]); + status = PingResponsePacket.PingResponseStatus.OK; + } } } - } - var code = process.waitFor(); - if (code != 0) { - System.out.printf("ping returned " + code); - } + var code = process.waitFor(); + if (code != 0) { + System.out.printf("ping returned " + code); + } - } catch (IOException | InterruptedException e) { - System.err.println("Error executing ping request: " + e.getMessage()); + } catch (IOException | InterruptedException e) { + System.err.println("Error executing ping request: " + e.getMessage()); + } } System.out.printf("Ping request #%d to %s - %s avg %.3f / mdev %.3f ms\n", packet.requestId, packet.target.getHostAddress(), status, average, meanDeviation); diff --git a/src/main/java/eu/m724/autopeerer/common/AddressTools.java b/src/main/java/eu/m724/autopeerer/common/AddressTools.java index 21470c8..1b4c95a 100644 --- a/src/main/java/eu/m724/autopeerer/common/AddressTools.java +++ b/src/main/java/eu/m724/autopeerer/common/AddressTools.java @@ -7,7 +7,7 @@ import java.net.UnknownHostException; import java.util.Arrays; public class AddressTools { - private static boolean isIp(InetAddress address, boolean ipv6) { + public static boolean isIp(InetAddress address, boolean ipv6) { return ipv6 ? address instanceof Inet6Address : address instanceof Inet4Address; } diff --git a/src/main/java/eu/m724/autopeerer/common/packet/c2s/PingResponsePacket.java b/src/main/java/eu/m724/autopeerer/common/packet/c2s/PingResponsePacket.java index ea3b35c..6407d82 100644 --- a/src/main/java/eu/m724/autopeerer/common/packet/c2s/PingResponsePacket.java +++ b/src/main/java/eu/m724/autopeerer/common/packet/c2s/PingResponsePacket.java @@ -29,8 +29,12 @@ public class PingResponsePacket implements Packet { var status = PingResponseStatus.OK; - if (average == -1) { - status = meanDeviation == 0 ? PingResponseStatus.UNREACHABLE : PingResponseStatus.ERROR; + if (average == -1 && meanDeviation == 0) { + status = PingResponseStatus.UNREACHABLE; + } else if (average == -1 && meanDeviation == -1) { + status = PingResponseStatus.ERROR; + } else if (average == 0 && meanDeviation == -1) { + status = PingResponseStatus.UNREACHABLE_PROTOCOL; } return new PingResponsePacket(requestId, status, average, meanDeviation); @@ -53,11 +57,15 @@ public class PingResponsePacket implements Packet { bb.putFloat(-1); bb.putFloat(-1); } + case UNREACHABLE_PROTOCOL -> { + bb.putFloat(0); + bb.putFloat(-1); + } } return bb; } public enum PingResponseStatus { - OK, UNREACHABLE, ERROR + OK, UNREACHABLE, ERROR, UNREACHABLE_PROTOCOL } } diff --git a/src/main/java/eu/m724/autopeerer/server/MyHttpHandler.java b/src/main/java/eu/m724/autopeerer/server/MyHttpHandler.java index 6926012..df6779e 100644 --- a/src/main/java/eu/m724/autopeerer/server/MyHttpHandler.java +++ b/src/main/java/eu/m724/autopeerer/server/MyHttpHandler.java @@ -187,7 +187,9 @@ public class MyHttpHandler implements HttpHandler { if (packet.result == SessionResponsePacket.SessionResult.OK) { resp.put("port", packet.port) - .put("publicKey", packet.publicKey); + .put("publicKey", packet.publicKey) + .put("endpoint", node.getNodeProfile().hostname() + ":" + packet.port) + .put("linkLocal", node.getNodeProfile().linkLocal()); } sseWrite(exchange, resp.toString()); @@ -205,6 +207,8 @@ public class MyHttpHandler implements HttpHandler { return null; }); + } else { + sendResponse(exchange, 404); } } } diff --git a/src/main/java/eu/m724/autopeerer/server/Node.java b/src/main/java/eu/m724/autopeerer/server/Node.java index 1adb40b..df8b2a8 100644 --- a/src/main/java/eu/m724/autopeerer/server/Node.java +++ b/src/main/java/eu/m724/autopeerer/server/Node.java @@ -71,8 +71,8 @@ public final class Node { properties.getProperty("hostname"), linkLocal, ipv4.equalsIgnoreCase("yes") || ipv4.equalsIgnoreCase("restricted"), - ipv4.equalsIgnoreCase("restricted"), ipv6.equalsIgnoreCase("yes") || ipv6.equalsIgnoreCase("restricted"), + ipv4.equalsIgnoreCase("restricted"), ipv6.equalsIgnoreCase("restricted") ) );