parent
2ee1ff4ca4
commit
7bd35aab87
6 changed files with 105 additions and 2 deletions
5
README.md
Normal file
5
README.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
# Setup
|
||||
1. Get the `-server.jar` or `-client.jar` and make a new directory for it
|
||||
2. Run the JAR, then stop it
|
||||
3. Configure in `config`
|
||||
4. Now run the JAR. Done!
|
|
@ -18,6 +18,11 @@ public class Main {
|
|||
throw new RuntimeException("Failed to load configuration", e);
|
||||
}
|
||||
|
||||
if (config.isNew) {
|
||||
System.out.println("The program stopped to let you configure");
|
||||
return;
|
||||
}
|
||||
|
||||
URI serverUri = URI.create(config.getString("remote"));
|
||||
|
||||
var wireGuardLive = new WireGuardLive(new File(config.getString("wireguard.directory")));
|
||||
|
|
|
@ -7,6 +7,7 @@ import java.nio.file.Files;
|
|||
import java.util.Properties;
|
||||
|
||||
public class Configuration {
|
||||
public final boolean isNew;
|
||||
public final File directory = new File("config");
|
||||
private final File configFile;
|
||||
|
||||
|
@ -14,10 +15,11 @@ public class Configuration {
|
|||
|
||||
public Configuration(String profile) {
|
||||
this.configFile = new File(directory, profile + ".properties");
|
||||
this.isNew = !configFile.exists();
|
||||
}
|
||||
|
||||
|
||||
public void load() throws IOException {
|
||||
public boolean load() throws IOException {
|
||||
directory.mkdir();
|
||||
|
||||
if (!configFile.exists()) {
|
||||
|
@ -25,11 +27,15 @@ public class Configuration {
|
|||
Files.write(configFile.toPath(), is.readAllBytes());
|
||||
properties.load(is);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// this if already exists
|
||||
try (var is = new FileInputStream(configFile)) {
|
||||
properties.load(is);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public String getString(String property) {
|
||||
|
|
|
@ -5,6 +5,8 @@ import eu.m724.autopeerer.common.packet.Packets;
|
|||
import eu.m724.autopeerer.common.packet.c2s.PingResponsePacket;
|
||||
import eu.m724.autopeerer.common.packet.c2s.SessionResponsePacket;
|
||||
import eu.m724.autopeerer.common.packet.s2c.PingRequestPacket;
|
||||
import eu.m724.autopeerer.common.packet.s2c.SessionRequestPacket;
|
||||
import inet.ipaddr.ipv6.IPv6Address;
|
||||
import org.java_websocket.WebSocket;
|
||||
|
||||
import java.net.InetAddress;
|
||||
|
@ -50,10 +52,22 @@ public class ClientState {
|
|||
return future;
|
||||
}
|
||||
|
||||
CompletableFuture<SessionResponsePacket> session(long asn, IPv6Address linkLocal, String publicKey, String endpointHost, int endpointPort) {
|
||||
var future = new CompletableFuture<SessionResponsePacket>();
|
||||
|
||||
sessionConsumers.put(asn, future::complete);
|
||||
send(new SessionRequestPacket(
|
||||
asn, linkLocal, publicKey, endpointHost, endpointPort
|
||||
));
|
||||
|
||||
return future;
|
||||
}
|
||||
|
||||
|
||||
/* Packet functions */
|
||||
|
||||
private Map<Short, Consumer<PingResponsePacket>> pingConsumers = new HashMap<>();
|
||||
private Map<Long, Consumer<SessionResponsePacket>> sessionConsumers = new HashMap<>();
|
||||
|
||||
|
||||
void onPacketReceived(Packet<?> p) {
|
||||
|
@ -70,6 +84,7 @@ public class ClientState {
|
|||
}
|
||||
|
||||
private void handleSessionResponse(SessionResponsePacket packet) {
|
||||
System.out.printf("[%d] Session response #%d: %s\n", clientId, packet.sessionId, packet.result);
|
||||
System.out.printf("[%d] Session response for AS%d: %s\n", clientId, packet.asn, packet.result);
|
||||
sessionConsumers.remove(packet.asn).accept(packet);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,11 @@ public class Main {
|
|||
throw new RuntimeException("Failed to load configuration", e);
|
||||
}
|
||||
|
||||
if (config.isNew) {
|
||||
System.out.println("The program stopped to let you configure");
|
||||
return;
|
||||
}
|
||||
|
||||
var packetHandler = new PacketHandler(nodes);
|
||||
var server = new MyWebsocketServer(
|
||||
new InetSocketAddress(config.getString("socket.address"), config.getInt("socket.port")),
|
||||
|
|
|
@ -3,6 +3,10 @@ package eu.m724.autopeerer.server;
|
|||
import com.sun.net.httpserver.HttpExchange;
|
||||
import com.sun.net.httpserver.HttpHandler;
|
||||
import eu.m724.autopeerer.common.packet.c2s.PingResponsePacket;
|
||||
import eu.m724.autopeerer.common.packet.c2s.SessionResponsePacket;
|
||||
import inet.ipaddr.IPAddress;
|
||||
import inet.ipaddr.IPAddressString;
|
||||
import inet.ipaddr.ipv6.IPv6Address;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
@ -136,6 +140,69 @@ public class MyHttpHandler implements HttpHandler {
|
|||
return null;
|
||||
});
|
||||
} else if (path[0].equals("peer")) {
|
||||
requireMethod(exchange, "POST");
|
||||
|
||||
var json = getJsonBody(exchange);
|
||||
|
||||
/* */
|
||||
|
||||
if (!json.has("node")) {
|
||||
sendResponse(exchange, 400, "node");
|
||||
}
|
||||
|
||||
var node = nodes.stream()
|
||||
.filter(n -> n.id().equals(json.getString("node")))
|
||||
.findFirst().orElse(null);
|
||||
|
||||
if (node == null) {
|
||||
sendResponse(exchange, 400, "node");
|
||||
}
|
||||
|
||||
/* */
|
||||
|
||||
CompletableFuture<SessionResponsePacket> future = null;
|
||||
|
||||
try {
|
||||
future = node.getClient().session(
|
||||
json.getLong("asn"),
|
||||
new IPAddressString(json.getString("linkLocal")).getAddress().toIPv6(),
|
||||
json.getString("publicKey"),
|
||||
json.getString("endpointHost"),
|
||||
json.getInt("endpointPort")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
sendResponse(exchange, 400, "params");
|
||||
}
|
||||
|
||||
sseStart(exchange);
|
||||
|
||||
future.handle((packet, ex) -> {
|
||||
try {
|
||||
if (ex != null) {
|
||||
sseWrite(exchange, ex.getMessage());
|
||||
} else {
|
||||
var resp = new JSONObject()
|
||||
.put("result", packet.result);
|
||||
|
||||
if (packet.result == SessionResponsePacket.SessionResult.OK) {
|
||||
resp.put("port", packet.port)
|
||||
.put("publicKey", packet.publicKey);
|
||||
}
|
||||
|
||||
sseWrite(exchange, resp.toString());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
try {
|
||||
sseClose(exchange);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue