From 0b2a35127866da5af6ccaf57f18ac420a9939f5f Mon Sep 17 00:00:00 2001 From: LAX1DUDE Date: Sun, 7 Aug 2022 23:46:13 -0700 Subject: [PATCH] wrote a signaling server, untested, needs ratelimiting --- ...Java-WebSocket-1.5.1-with-dependencies.jar | Bin 0 -> 240423 bytes .../sp/relay/ByteBufferInputStream.java | 63 ++++ .../eaglercraft/sp/relay/Constants.java | 8 + .../eaglercraft/sp/relay/DebugLogger.java | 275 +++++++++++++++ .../eaglercraft/sp/relay/EaglerSPClient.java | 119 +++++++ .../eaglercraft/sp/relay/EaglerSPRelay.java | 313 ++++++++++++++++++ .../sp/relay/EaglerSPRelayConfig.java | 298 +++++++++++++++++ .../relay/EaglerSPRelayConfigRelayList.java | 161 +++++++++ .../eaglercraft/sp/relay/EaglerSPServer.java | 129 ++++++++ .../eaglercraft/sp/relay/LoginState.java | 24 ++ .../lax1dude/eaglercraft/sp/relay/Util.java | 18 + .../eaglercraft/sp/relay/pkt/IPacket.java | 146 ++++++++ .../sp/relay/pkt/IPacket00Handshake.java | 41 +++ .../sp/relay/pkt/IPacket01ICEServers.java | 39 +++ .../sp/relay/pkt/IPacket02NewClient.java | 22 ++ .../sp/relay/pkt/IPacket03ICECandidate.java | 34 ++ .../sp/relay/pkt/IPacket04Description.java | 34 ++ .../sp/relay/pkt/IPacket05ClientSuccess.java | 30 ++ .../sp/relay/pkt/IPacket06ClientFailure.java | 30 ++ .../relay/pkt/IPacketFEDisconnectClient.java | 45 +++ .../sp/relay/pkt/IPacketFFErrorCode.java | 46 +++ sp-relay/src/main/resources/relays.txt | 13 + 22 files changed, 1888 insertions(+) create mode 100644 sp-relay/Java-WebSocket-1.5.1-with-dependencies.jar create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/ByteBufferInputStream.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/Constants.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/DebugLogger.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPClient.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelay.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelayConfig.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelayConfigRelayList.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPServer.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/LoginState.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/Util.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket00Handshake.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket01ICEServers.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket02NewClient.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket03ICECandidate.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket04Description.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket05ClientSuccess.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket06ClientFailure.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacketFEDisconnectClient.java create mode 100644 sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacketFFErrorCode.java create mode 100644 sp-relay/src/main/resources/relays.txt diff --git a/sp-relay/Java-WebSocket-1.5.1-with-dependencies.jar b/sp-relay/Java-WebSocket-1.5.1-with-dependencies.jar new file mode 100644 index 0000000000000000000000000000000000000000..8f103a76fc9c59a7af711d86acdf4780882469a3 GIT binary patch literal 240423 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�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 Qv>yNJMquNu3(r02f7pNE>;M1& literal 0 HcmV?d00001 diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/ByteBufferInputStream.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/ByteBufferInputStream.java new file mode 100644 index 0000000..b7779d8 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/ByteBufferInputStream.java @@ -0,0 +1,63 @@ +package net.lax1dude.eaglercraft.sp.relay; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; + +public class ByteBufferInputStream extends InputStream { + + private final ByteBuffer buffer; + + public ByteBufferInputStream(ByteBuffer buf) { + buffer = buf; + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + int max = buffer.remaining(); + if(len > max) { + len = max; + } + buffer.get(b, off, len); + return len; + } + + @Override + public int read() throws IOException { + if(buffer.remaining() == 0) { + return -1; + }else { + return (int)buffer.get() & 0xFF; + } + } + + @Override + public long skip(long n) throws IOException { + int max = buffer.remaining(); + if(n > max) { + n = (int)max; + } + return max; + } + + @Override + public int available() throws IOException { + return buffer.remaining(); + } + + @Override + public synchronized void mark(int readlimit) { + buffer.mark(); + } + + @Override + public synchronized void reset() throws IOException { + buffer.reset(); + } + + @Override + public boolean markSupported() { + return true; + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/Constants.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/Constants.java new file mode 100644 index 0000000..083bf7f --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/Constants.java @@ -0,0 +1,8 @@ +package net.lax1dude.eaglercraft.sp.relay; + +public class Constants { + + public static final String versionName = "0.1a"; + public static final int protocolVersion = 1; + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/DebugLogger.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/DebugLogger.java new file mode 100644 index 0000000..baa0c39 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/DebugLogger.java @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2022 Calder Young. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package net.lax1dude.eaglercraft.sp.relay; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class DebugLogger { + + private static Level debugLoggingLevel = Level.INFO; + + public static void enableDebugLogging(Level level) { + if(level == null) { + level = Level.NONE; + } + debugLoggingLevel = level; + } + + public static boolean debugLoggingEnabled() { + return debugLoggingLevel != Level.NONE; + } + + private static final Map loggers = new HashMap(); + + public static DebugLogger getLogger(String name) { + DebugLogger ret = loggers.get(name); + if(ret == null) { + ret = new DebugLogger(name); + loggers.put(name, ret); + } + return ret; + } + + private final String name; + + private DebugLogger(String name) { + this.name = name; + } + + public static enum Level { + + NONE("NONE", 0, System.out), DEBUG("DEBUG", 4, System.out), INFO("INFO", 3, System.out), + WARN("WARN", 2, System.err), ERROR("ERROR", 1, System.err); + + public final String label; + public final int level; + public final PrintStream output; + + private Level(String label, int level, PrintStream output) { + this.label = label; + this.level = level; + this.output = output; + } + + } + + private class LogStream extends OutputStream { + + private final Level logLevel; + private final ByteArrayOutputStream lineBuffer = new ByteArrayOutputStream(); + + private LogStream(Level logLevel) { + this.logLevel = logLevel; + } + + @Override + public void write(int b) throws IOException { + if(b == (int)'\r') { + return; + }else if(b == (int)'\n') { + byte[] line = lineBuffer.toByteArray(); + lineBuffer.reset(); + log(logLevel, new String(line, StandardCharsets.UTF_8)); + }else { + lineBuffer.write(b); + } + } + + } + + private OutputStream infoOutputStream = null; + private PrintStream infoPrintStream = null; + + private OutputStream warnOutputStream = null; + private PrintStream warnPrintStream = null; + + private OutputStream errorOutputStream = null; + private PrintStream errorPrintStream = null; + + public OutputStream getOutputStream(Level lvl) { + switch(lvl) { + case INFO: + default: + if(infoOutputStream == null) { + infoOutputStream = new LogStream(Level.INFO); + } + return infoOutputStream; + case WARN: + if(warnOutputStream == null) { + warnOutputStream = new LogStream(Level.WARN); + } + return warnOutputStream; + case ERROR: + if(errorOutputStream == null) { + errorOutputStream = new LogStream(Level.ERROR); + } + return errorOutputStream; + } + } + + public PrintStream getPrintStream(Level lvl) { + switch(lvl) { + case INFO: + default: + if(infoPrintStream == null) { + infoPrintStream = new PrintStream(getOutputStream(Level.INFO)); + } + return infoPrintStream; + case WARN: + if(warnPrintStream == null) { + warnPrintStream = new PrintStream(getOutputStream(Level.WARN)); + } + return warnPrintStream; + case ERROR: + if(errorPrintStream == null) { + errorPrintStream = new PrintStream(getOutputStream(Level.ERROR)); + } + return errorPrintStream; + } + } + + private static final SimpleDateFormat fmt = new SimpleDateFormat("hh:mm:ss+SSS"); + private final Date dateInstance = new Date(); + + public static String formatParams(String msg, Object... params) { + if(params.length > 0) { + StringBuilder builtString = new StringBuilder(); + for(int i = 0; i < params.length; ++i) { + int idx = msg.indexOf("{}"); + if(idx != -1) { + builtString.append(msg.substring(0, idx)); + if(params[i] instanceof InetSocketAddress) { + params[i] = Util.sock2String((InetSocketAddress)params[i]); + } + builtString.append(params[i]); + msg = msg.substring(idx + 2); + }else { + break; + } + } + builtString.append(msg); + return builtString.toString(); + }else { + return msg; + } + } + + public void log(Level lvl, String msg, Object... params) { + if(debugLoggingLevel.level >= lvl.level) { + synchronized(this) { + dateInstance.setTime(System.currentTimeMillis()); + System.out.println("[" + fmt.format(dateInstance) + "][" + Thread.currentThread().getName() + "/" + lvl.label + "][" + name + "]: " + + (params.length == 0 ? msg : formatParams(msg, params))); + } + } + } + + public void log(Level lvl, Throwable stackTrace) { + stackTrace.printStackTrace(getPrintStream(lvl)); + } + + public void debug(String msg) { + if(debugLoggingLevel.level >= Level.DEBUG.level) { + log(Level.DEBUG, msg); + } + } + + public void debug(String msg, Object... params) { + if(debugLoggingLevel.level >= Level.DEBUG.level) { + log(Level.DEBUG, msg, params); + } + } + + public void debug(Throwable t) { + if(debugLoggingLevel.level >= Level.DEBUG.level) { + log(Level.DEBUG, t); + } + } + + public void info(String msg) { + if(debugLoggingLevel.level >= Level.INFO.level) { + log(Level.INFO, msg); + } + } + + public void info(String msg, Object... params) { + if(debugLoggingLevel.level >= Level.INFO.level) { + log(Level.INFO, msg, params); + } + } + + public void info(Throwable t) { + if(debugLoggingLevel.level >= Level.INFO.level) { + log(Level.INFO, t); + } + } + + public void warn(String msg) { + if(debugLoggingLevel.level >= Level.WARN.level) { + log(Level.WARN, msg); + } + } + + public void warn(String msg, Object... params) { + if(debugLoggingLevel.level >= Level.WARN.level) { + log(Level.WARN, msg, params); + } + } + + public void warn(Throwable t) { + if(debugLoggingLevel.level >= Level.WARN.level) { + log(Level.WARN, t); + } + } + + public void error(String msg) { + if(debugLoggingLevel.level >= Level.ERROR.level) { + log(Level.ERROR, msg); + } + } + + public void error(String msg, Object... params) { + if(debugLoggingLevel.level >= Level.ERROR.level) { + log(Level.ERROR, msg, params); + } + } + + public void error(Throwable t) { + if(debugLoggingLevel.level >= Level.ERROR.level) { + log(Level.ERROR, t); + } + } +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPClient.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPClient.java new file mode 100644 index 0000000..00b8beb --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPClient.java @@ -0,0 +1,119 @@ +package net.lax1dude.eaglercraft.sp.relay; + +import java.io.IOException; +import java.util.Random; + +import org.java_websocket.WebSocket; + +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket04Description; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket03ICECandidate; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket05ClientSuccess; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket06ClientFailure; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacketFEDisconnectClient; + +public class EaglerSPClient { + + public final WebSocket socket; + public final EaglerSPServer server; + public final String id; + public final long createdOn; + public boolean serverNotifiedOfClose = false; + public LoginState state = LoginState.INIT; + + EaglerSPClient(WebSocket sock, EaglerSPServer srv, String id) { + this.socket = sock; + this.server = srv; + this.id = id; + this.createdOn = System.currentTimeMillis(); + } + + public void send(IPacket packet) { + if(this.socket.isOpen()) { + try { + this.socket.send(IPacket.writePacket(packet)); + }catch(IOException ex) { + EaglerSPRelay.logger.debug("Error sending data to {}", this.socket.getRemoteSocketAddress()); + EaglerSPRelay.logger.debug(ex); + disconnect(IPacketFEDisconnectClient.TYPE_INTERNAL_ERROR, "Internal Server Error"); + this.socket.close(); + } + }else { + EaglerSPRelay.logger.debug("WARNING: Tried to send data to {} after the connection closed.", this.socket.getRemoteSocketAddress()); + } + } + + public boolean handle(IPacket packet) throws IOException { + if(packet instanceof IPacket03ICECandidate) { + if(LoginState.assertEquals(this, LoginState.INIT)) { + state = LoginState.SENT_ICE_CANDIDATE; + server.handleClientICECandidate(this, (IPacket03ICECandidate)packet); + EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x03: ICECandidate", socket.getRemoteSocketAddress()); + } + return true; + }else if(packet instanceof IPacket04Description) { + if(LoginState.assertEquals(this, LoginState.RECIEVED_ICE_CANIDATE)) { + state = LoginState.SENT_DESCRIPTION; + server.handleClientDescription(this, (IPacket04Description)packet); + EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x04: Description", socket.getRemoteSocketAddress()); + } + return true; + }else if(packet instanceof IPacket05ClientSuccess) { + if(LoginState.assertEquals(this, LoginState.RECIEVED_DESCRIPTION)) { + state = LoginState.FINISHED; + server.handleClientSuccess(this, (IPacket05ClientSuccess)packet); + EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x05: ClientSuccess", socket.getRemoteSocketAddress()); + disconnect(IPacketFEDisconnectClient.TYPE_FINISHED_SUCCESS, "Successful connection"); + } + return true; + }else if(packet instanceof IPacket06ClientFailure) { + if(LoginState.assertEquals(this, LoginState.RECIEVED_DESCRIPTION)) { + state = LoginState.FINISHED; + server.handleClientFailure(this, (IPacket06ClientFailure)packet); + EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x05: ClientFailure", socket.getRemoteSocketAddress()); + disconnect(IPacketFEDisconnectClient.TYPE_FINISHED_FAILED, "Failed connection"); + } + return true; + }else { + return false; + } + } + + public void handleServerICECandidate(IPacket03ICECandidate desc) { + send(new IPacket03ICECandidate("", desc.candidate)); + } + + public void handleServerDescription(IPacket04Description desc) { + send(new IPacket04Description("", desc.description)); + } + + public void handleServerDisconnectClient(IPacketFEDisconnectClient packet) { + disconnect(packet.code, packet.reason); + } + + public void disconnect(int code, String reason) { + IPacket pkt = new IPacketFEDisconnectClient(id, code, reason); + if(!serverNotifiedOfClose) { + server.send(pkt); + serverNotifiedOfClose = true; + } + if(this.socket.isOpen()) { + send(pkt); + socket.close(); + } + EaglerSPRelay.logger.debug("[{}][Relay -> Client] PKT 0xFE: #{} {}", socket.getRemoteSocketAddress(), code, reason); + } + + public static final int clientCodeLength = 16; + private static final String clientCodeChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + public static String generateClientId() { + Random r = new Random(); + char[] ret = new char[clientCodeLength]; + for(int i = 0; i < ret.length; ++i) { + ret[i] = clientCodeChars.charAt(r.nextInt(clientCodeChars.length())); + } + return new String(ret); + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelay.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelay.java new file mode 100644 index 0000000..5a0e962 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelay.java @@ -0,0 +1,313 @@ +package net.lax1dude.eaglercraft.sp.relay; + +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import org.java_websocket.WebSocket; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.server.WebSocketServer; + +import net.lax1dude.eaglercraft.sp.relay.pkt.*; + +public class EaglerSPRelay extends WebSocketServer { + + public static EaglerSPRelay instance; + public static final EaglerSPRelayConfig config = new EaglerSPRelayConfig(); + + public static final DebugLogger logger = DebugLogger.getLogger("EaglerSPRelay"); + + public static void main(String[] args) throws IOException, InterruptedException { + for(int i = 0; i < args.length; ++i) { + if(args[i].equalsIgnoreCase("--debug")) { + DebugLogger.enableDebugLogging(DebugLogger.Level.DEBUG); + logger.debug("Debug logging enabled"); + } + } + logger.info("Starting EaglerSPRelay version {}...", Constants.versionName); + config.load(new File("relayConfig.ini")); + EaglerSPRelayConfigRelayList.loadRelays(new File("relays.txt")); + logger.info("Starting WebSocket Server..."); + instance = new EaglerSPRelay(new InetSocketAddress(config.getAddress(), config.getPort())); + instance.setConnectionLostTimeout(20); + instance.setReuseAddr(true); + instance.start(); + + Thread tickThread = new Thread((() -> { + while(true) { + try { + long millis = System.currentTimeMillis(); + synchronized(pendingConnections) { + Iterator> itr = pendingConnections.entrySet().iterator(); + while(itr.hasNext()) { + Entry etr = itr.next(); + if(millis - etr.getValue().longValue() > 1000l) { + etr.getKey().close(); + itr.remove(); + } + } + } + synchronized(clientConnections) { + Iterator itr = clientConnections.values().iterator(); + while(itr.hasNext()) { + EaglerSPClient cl = itr.next(); + if(millis - cl.createdOn > 6000l) { + cl.disconnect(IPacketFEDisconnectClient.TYPE_TIMEOUT, "Took too long to connect!"); + } + } + } + }catch(Throwable t) { + logger.error("Error in update loop!"); + logger.error(t); + } + Util.sleep(50l); + } + }), "Relay Tick"); + tickThread.setDaemon(true); + tickThread.start(); + + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + String s; + while((s = reader.readLine()) != null) { + s = s.trim(); + if(s.equalsIgnoreCase("stop") || s.equalsIgnoreCase("end")) { + logger.info("Shutting down..."); + instance.stop(); + System.exit(0); + }else { + logger.info("Unknown command: {}", s); + logger.info("Type 'stop' to exit, 'reload' to reload config"); + } + } + + } + + private EaglerSPRelay(InetSocketAddress addr) { + super(addr); + } + + private static final Map pendingConnections = new HashMap(); + private static final Map clientIds = new HashMap(); + private static final Map clientConnections = new HashMap(); + private static final Map serverCodes = new HashMap(); + private static final Map serverConnections = new HashMap(); + + @Override + public void onStart() { + logger.info("Listening on {}", getAddress()); + logger.info("Type 'stop' to exit"); + } + + @Override + public void onOpen(WebSocket arg0, ClientHandshake arg1) { + synchronized(pendingConnections) { + logger.debug("[{}]: Connection opened", arg0.getRemoteSocketAddress()); + pendingConnections.put(arg0, System.currentTimeMillis()); + } + } + + @Override + public void onMessage(WebSocket arg0, ByteBuffer arg1) { + DataInputStream sid = new DataInputStream(new ByteBufferInputStream(arg1)); + boolean waiting; + synchronized(pendingConnections) { + waiting = pendingConnections.remove(arg0) != null; + } + try { + IPacket pkt = IPacket.readPacket(sid); + if(waiting) { + if(pkt instanceof IPacket00Handshake) { + IPacket00Handshake ipkt = (IPacket00Handshake)pkt; + if(ipkt.connectionVersion != Constants.protocolVersion) { + logger.debug("[{}]: Connected with unsupported protocol version: {} (supported " + + "version: {})", arg0.getRemoteSocketAddress(), Constants.protocolVersion); + if(ipkt.connectionVersion < Constants.protocolVersion) { + arg0.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_PROTOCOL_VERSION, + "Outdated Client! (v" + Constants.protocolVersion + " req)"))); + }else { + arg0.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_PROTOCOL_VERSION, + "Outdated Server! (still on v" + Constants.protocolVersion + ")"))); + } + arg0.close(); + return; + } + if(ipkt.connectionType == 0x01) { + logger.debug("[{}]: Connected as a server", arg0.getRemoteSocketAddress()); + EaglerSPServer srv; + synchronized(serverCodes) { + int j = 0; + String code; + do { + if(++j > 100) { + logger.error("Error: relay is running out of codes!"); + logger.error("Closing connection to {}", arg0.getRemoteSocketAddress()); + arg0.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_INTERNAL_ERROR, + "Internal Server Error"))); + arg0.close(); + return; + } + code = config.generateCode(); + }while(serverCodes.containsKey(code)); + srv = new EaglerSPServer(arg0, code); + serverCodes.put(code, srv); + ipkt.connectionCode = code; + arg0.send(IPacket.writePacket(ipkt)); + logger.debug("[{}][Relay -> Server] PKT 0x00: Assign join code: {}", arg0.getRemoteSocketAddress(), code); + } + synchronized(serverConnections) { + serverConnections.put(arg0, srv); + } + srv.send(new IPacket01ICEServers(EaglerSPRelayConfigRelayList.relayServers)); + logger.debug("[{}][Relay -> Server] PKT 0x01: Send ICE server list to server", arg0.getRemoteSocketAddress()); + }else if(ipkt.connectionType == 0x02) { + String code = ipkt.connectionCode; + logger.debug("[{}]: Connected as a client, requested server code: {}", arg0.getRemoteSocketAddress(), code); + if(code.length() != config.getCodeLength()) { + logger.debug("The code '{}' is invalid because it's the wrong length, disconnecting"); + arg0.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_CODE_LENGTH, + "The join code is the wrong length, it should be " + config.getCodeLength() + " chars long"))); + arg0.close(); + }else { + EaglerSPServer srv; + synchronized(serverCodes) { + srv = serverCodes.get(code); + } + if(srv == null) { + arg0.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_INCORRECT_CODE, + "Invalid code, no LAN world found!"))); + arg0.close(); + return; + } + String id; + EaglerSPClient cl; + synchronized(clientIds) { + int j = 0; + do { + id = EaglerSPClient.generateClientId(); + }while(clientIds.containsKey(id)); + cl = new EaglerSPClient(arg0, srv, id); + clientIds.put(id, cl); + ipkt.connectionCode = id; + arg0.send(IPacket.writePacket(ipkt)); + srv.handleNewClient(cl); + } + synchronized(clientConnections) { + clientConnections.put(arg0, cl); + } + cl.send(new IPacket01ICEServers(EaglerSPRelayConfigRelayList.relayServers)); + logger.debug("[{}][Relay -> Client] PKT 0x01: Send ICE server list to client", arg0.getRemoteSocketAddress()); + } + }else { + logger.debug("[{}]: Unknown connection type: {}", arg0.getRemoteSocketAddress(), ipkt.connectionType); + arg0.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_ILLEGAL_OPERATION, + "Unexpected Init Packet"))); + arg0.close(); + } + }else { + logger.debug("[{}]: Pending connection did not send a 0x00 packet to identify " + + "as a client or server", arg0.getRemoteSocketAddress()); + arg0.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_ILLEGAL_OPERATION, + "Unexpected Init Packet"))); + arg0.close(); + } + }else { + EaglerSPServer srv; + synchronized(serverConnections) { + srv = serverConnections.get(arg0); + } + if(srv != null) { + if(!srv.handle(pkt)) { + logger.debug("[{}]: Server sent invalid packet: {}", arg0.getRemoteSocketAddress(), pkt.getClass().getSimpleName()); + arg0.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_INVALID_PACKET, + "Invalid Packet Recieved"))); + arg0.close(); + } + }else { + EaglerSPClient cl; + synchronized(clientConnections) { + cl = clientConnections.get(arg0); + } + if(cl != null) { + if(cl.handle(pkt)) { + logger.debug("[{}]: Client sent invalid packet: {}", arg0.getRemoteSocketAddress(), pkt.getClass().getSimpleName()); + arg0.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_INVALID_PACKET, + "Invalid Packet Recieved"))); + arg0.close(); + } + }else { + logger.debug("[{}]: Connection has no client/server attached to it!", arg0.getRemoteSocketAddress()); + arg0.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_ILLEGAL_OPERATION, + "Internal Server Error"))); + arg0.close(); + } + } + } + }catch(Throwable t) { + logger.error("[{}]: Failed to handle binary frame: {}", arg0.getRemoteSocketAddress(), t); + arg0.close(); + } + } + + @Override + public void onMessage(WebSocket arg0, String arg1) { + logger.debug("[{}]: Sent a text frame, disconnecting", arg0.getRemoteSocketAddress()); + arg0.close(); + } + + @Override + public void onClose(WebSocket arg0, int arg1, String arg2, boolean arg3) { + EaglerSPServer srv; + synchronized(serverConnections) { + srv = serverConnections.remove(arg0); + } + if(srv != null) { + logger.debug("[{}]: Server closed, code: {}", arg0.getRemoteSocketAddress(), srv.code); + synchronized(serverCodes) { + serverCodes.remove(srv.code); + } + ArrayList clientList; + synchronized(clientConnections) { + clientList = new ArrayList(clientConnections.values()); + } + Iterator itr = clientList.iterator(); + while(itr.hasNext()) { + EaglerSPClient cl = itr.next(); + if(cl.server == srv) { + logger.debug("[{}]: Disconnecting client: {} (id: ", cl.socket.getRemoteSocketAddress(), cl.id); + cl.socket.close(); + } + } + }else { + EaglerSPClient cl; + synchronized(clientConnections) { + cl = clientConnections.remove(arg0); + } + if(cl != null) { + logger.debug("[{}]: Client closed, id: {}", arg0.getRemoteSocketAddress(), cl.id); + synchronized(clientIds) { + clientIds.remove(cl.id); + } + cl.server.handleClientDisconnect(cl); + }else { + logger.debug("[{}]: Connection Closed: {} ", arg0.getRemoteSocketAddress()); + } + } + } + + @Override + public void onError(WebSocket arg0, Exception arg1) { + logger.error("[{}]: Exception thrown: {}", arg0.getRemoteSocketAddress(), arg1.toString()); + logger.debug(arg1); + arg0.close(); + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelayConfig.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelayConfig.java new file mode 100644 index 0000000..6b460d5 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelayConfig.java @@ -0,0 +1,298 @@ +package net.lax1dude.eaglercraft.sp.relay; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class EaglerSPRelayConfig { + + private String address = "0.0.0.0"; + private int port = 6699; + private int codeLength = 5; + private String codeChars = "abcdefghijklmnopqrstuvwxyz0123456789$%&*+?!"; + private boolean codeMixCase = false; + private int connectionsPerIP = 256; + private boolean rateLimitEnable = false; + private int rateLimitPeriod = 128; + private int rateLimitLimit = 48; + private int rateLimitLockoutLimit = 64; + private int rateLimitLockoutDuration = 600; + private String originWhitelist = ""; + private String[] originWhitelistArray = new String[0]; + private boolean enableRealIpHeader = false; + + public void load(File conf) { + if(!conf.isFile()) { + EaglerSPRelay.logger.info("Creating config file: {}", conf.getAbsoluteFile()); + save(conf); + }else { + EaglerSPRelay.logger.info("Loading config file: {}", conf.getAbsoluteFile()); + boolean gotPort = false, gotCodeLength = false, gotCodeChars = false; + boolean gotCodeMixCase = false, gotConnectionsPerIP = false; + boolean gotRateLimitEnable = false, gotRateLimitPeriod = false; + boolean gotRateLimitLimit = false, gotRateLimitLockoutLimit = false; + boolean gotRateLimitLockoutDuration = false, gotOriginWhitelist = false; + boolean gotEnableRealIpHeader = false, gotAddress = false; + Throwable t2 = null; + try(BufferedReader reader = new BufferedReader(new FileReader(conf))) { + String s; + while((s = reader.readLine()) != null) { + String[] ss = s.trim().split("=", 2); + if(ss.length == 2) { + if(ss[0].equalsIgnoreCase("port")) { + try { + port = Integer.parseInt(ss[1]); + gotPort = true; + }catch(Throwable t) { + t2 = t; + break; + } + }else if(ss[0].equalsIgnoreCase("address")) { + address = ss[1]; + gotAddress = true; + }else if(ss[0].equalsIgnoreCase("code-length")) { + try { + codeLength = Integer.parseInt(ss[1]); + gotCodeLength = true; + }catch(Throwable t) { + EaglerSPRelay.logger.warn("Invalid code-length {} in conf {}", ss[1], conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t); + t2 = t; + break; + } + }else if(ss[0].equalsIgnoreCase("code-chars")) { + if(ss[1].length() < 2) { + t2 = new IllegalArgumentException("not enough chars"); + EaglerSPRelay.logger.warn("Invalid code-chars {} in conf {}", ss[1], conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t2); + }else { + codeChars = ss[1]; + gotCodeChars = true; + } + }else if(ss[0].equalsIgnoreCase("code-mix-case")) { + try { + codeMixCase = getBooleanValue(ss[1]); + gotCodeMixCase = true; + }catch(Throwable t) { + EaglerSPRelay.logger.warn("Invalid code-mix-case {} in conf {}", ss[1], conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t); + t2 = t; + break; + } + }else if(ss[0].equalsIgnoreCase("connections-per-ip")) { + try { + connectionsPerIP = Integer.parseInt(ss[1]); + gotConnectionsPerIP = true; + }catch(Throwable t) { + EaglerSPRelay.logger.warn("Invalid connections-per-ip {} in conf {}", ss[1], conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t); + t2 = t; + break; + } + }else if(ss[0].equalsIgnoreCase("ratelimit-enable")) { + try { + rateLimitEnable = getBooleanValue(ss[1]); + gotRateLimitEnable = true; + }catch(Throwable t) { + EaglerSPRelay.logger.warn("Invalid rate-limit-enable {} in conf {}", ss[1], conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t); + t2 = t; + break; + } + }else if(ss[0].equalsIgnoreCase("ratelimit-period")) { + try { + rateLimitPeriod = Integer.parseInt(ss[1]); + gotRateLimitPeriod = true; + }catch(Throwable t) { + EaglerSPRelay.logger.warn("Invalid ratelimit-period {} in conf {}", ss[1], conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t); + t2 = t; + break; + } + }else if(ss[0].equalsIgnoreCase("ratelimit-limit")) { + try { + rateLimitLimit = Integer.parseInt(ss[1]); + gotRateLimitLimit = true; + }catch(Throwable t) { + EaglerSPRelay.logger.warn("Invalid ratelimit-limit {} in conf {}", ss[1], conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t); + t2 = t; + break; + } + }else if(ss[0].equalsIgnoreCase("ratelimit-lockout-limit")) { + try { + rateLimitLockoutLimit = Integer.parseInt(ss[1]); + gotRateLimitLockoutLimit = true; + }catch(Throwable t) { + EaglerSPRelay.logger.warn("Invalid ratelimit-lockout-limit {} in conf {}", ss[1], conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t); + t2 = t; + break; + } + }else if(ss[0].equalsIgnoreCase("ratelimit-lockout-duration")) { + try { + rateLimitLockoutDuration = Integer.parseInt(ss[1]); + gotRateLimitLockoutDuration = true; + }catch(Throwable t) { + EaglerSPRelay.logger.warn("Invalid ratelimit-lockout-duration {} in conf {}", ss[1], conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t); + t2 = t; + break; + } + }else if(ss[0].equalsIgnoreCase("origin-whitelist")) { + originWhitelist = ss[1]; + gotOriginWhitelist = true; + }else if(ss[0].equalsIgnoreCase("enable-real-ip-header")) { + try { + enableRealIpHeader = getBooleanValue(ss[1]); + gotEnableRealIpHeader = true; + }catch(Throwable t) { + EaglerSPRelay.logger.warn("Invalid enable-real-ip-header {} in conf {}", ss[1], conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t); + t2 = t; + break; + } + } + } + } + }catch(IOException t) { + EaglerSPRelay.logger.error("Failed to load config file: {}", conf.getAbsoluteFile()); + EaglerSPRelay.logger.error(t); + }catch(Throwable t) { + EaglerSPRelay.logger.warn("Invalid config file: {}", conf.getAbsoluteFile()); + EaglerSPRelay.logger.warn(t); + t2 = t; + } + if(t2 != null || !gotPort || !gotCodeLength || !gotCodeChars || + !gotCodeMixCase || !gotConnectionsPerIP || !gotRateLimitEnable || + !gotRateLimitPeriod || !gotRateLimitLimit || !gotRateLimitLockoutLimit || + !gotRateLimitLockoutDuration || !gotOriginWhitelist || + !gotEnableRealIpHeader || !gotAddress) { + EaglerSPRelay.logger.warn("Updating config file: {}", conf.getAbsoluteFile()); + save(conf); + } + String[] splitted = originWhitelist.split(";"); + List splittedList = new ArrayList(); + for(int i = 0; i < splitted.length; ++i) { + splitted[i] = splitted[i].trim(); + if(splitted[i].length() > 0) { + splittedList.add(splitted[i]); + } + } + originWhitelistArray = new String[splittedList.size()]; + for(int i = 0; i < originWhitelistArray.length; ++i) { + originWhitelistArray[i] = splittedList.get(i); + } + } + } + + public void save(File conf) { + try(PrintWriter w = new PrintWriter(new FileOutputStream(conf))) { + w.println("address=" + address); + w.println("port=" + port); + w.println("code-length=" + codeLength); + w.println("code-chars=" + codeChars); + w.println("code-mix-case=" + codeMixCase); + w.println("connections-per-ip=" + connectionsPerIP); + w.println("ratelimit-enable=" + rateLimitEnable); + w.println("ratelimit-period=" + rateLimitPeriod); + w.println("ratelimit-limit=" + rateLimitLimit); + w.println("ratelimit-lockout-limit=" + rateLimitLockoutLimit); + w.println("ratelimit-lockout-duration=" + rateLimitLockoutDuration); + w.println("origin-whitelist=" + originWhitelist); + w.print("enable-real-ip-header=" + enableRealIpHeader); + }catch(IOException t) { + EaglerSPRelay.logger.error("Failed to write config file: {}", conf.getAbsoluteFile()); + EaglerSPRelay.logger.error(t); + } + } + + private static boolean getBooleanValue(String str) { + if(str.equalsIgnoreCase("true") || str.equals("1")) { + return true; + }else if(str.equalsIgnoreCase("false") || str.equals("0")) { + return false; + }else { + throw new IllegalArgumentException("Not a boolean: " + str); + } + } + + public String getAddress() { + return address; + } + + public int getPort() { + return port; + } + + public int getCodeLength() { + return codeLength; + } + + public String getCodeChars() { + return codeChars; + } + + public boolean isCodeMixCase() { + return codeMixCase; + } + + public int getConnectionsPerIP() { + return connectionsPerIP; + } + + public boolean isRateLimitEnable() { + return rateLimitEnable; + } + + public int getRateLimitPeriod() { + return rateLimitPeriod; + } + + public int getRateLimitLimit() { + return rateLimitLimit; + } + + public int getRateLimitLockoutLimit() { + return rateLimitLockoutLimit; + } + + public int getRateLimitLockoutDuration() { + return rateLimitLockoutDuration; + } + + public String getOriginWhitelist() { + return originWhitelist; + } + + public String[] getOriginWhitelistArray() { + return originWhitelistArray; + } + + public boolean isEnableRealIpHeader() { + return enableRealIpHeader; + } + + public String generateCode() { + Random r = new Random(); + char[] ret = new char[codeLength]; + for(int i = 0; i < codeLength; ++i) { + ret[i] = codeChars.charAt(r.nextInt(codeChars.length())); + if(codeMixCase) { + if(r.nextBoolean()) { + ret[i] = Character.toLowerCase(ret[i]); + }else { + ret[i] = Character.toUpperCase(ret[i]); + } + } + } + return new String(ret); + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelayConfigRelayList.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelayConfigRelayList.java new file mode 100644 index 0000000..68d2ae1 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPRelayConfigRelayList.java @@ -0,0 +1,161 @@ +package net.lax1dude.eaglercraft.sp.relay; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; + +public class EaglerSPRelayConfigRelayList { + + public static enum RelayType { + STUN, TURN; + } + + public static class RelayServer { + + public final RelayType type; + public final String address; + public final String username; + public final String password; + + protected RelayServer(RelayType type, String address, String username, String password) { + this.type = type; + this.address = address; + this.username = username; + this.password = password; + } + + protected RelayServer(RelayType type, String address) { + this.type = type; + this.address = address; + this.username = null; + this.password = null; + } + + } + + public static final Collection relayServers = new ArrayList(); + + public static void loadRelays(File list) throws IOException { + ArrayList loading = new ArrayList(); + + if(!list.isFile()) { + EaglerSPRelay.logger.info("Creating new {}...", list.getName()); + try(InputStream is = EaglerSPRelayConfigRelayList.class.getResourceAsStream("/relays.txt"); + FileOutputStream os = new FileOutputStream(list)) { + byte[] buffer = new byte[4096]; + int i; + while((i = is.read(buffer)) != -1) { + os.write(buffer, 0, i); + } + } + } + + EaglerSPRelay.logger.info("Loading STUN/TURN relays from: {}", list.getName()); + + RelayType addType = null; + String addAddress = null; + String addUsername = null; + String addPassword = null; + try(BufferedReader reader = new BufferedReader(new FileReader(list))) { + String line; + while((line = reader.readLine()) != null) { + line = line.trim(); + if(line.length() == 0) { + continue; + } + boolean isSTUNHead = line.equals("[STUN]"); + boolean isTURNHead = line.equals("[TURN]"); + if(isSTUNHead || isTURNHead) { + if(addType != null) { + add(list.getName(), loading, addType, addAddress, addUsername, addPassword); + } + addAddress = null; + addUsername = null; + addPassword = null; + addType = null; + } + if(isSTUNHead) { + addType = RelayType.STUN; + }else if(isTURNHead) { + addType = RelayType.TURN; + }else if(line.startsWith("url")) { + int spidx = line.indexOf('='); + if(spidx < 3) { + EaglerSPRelay.logger.error("Error: Invalid line in {}: ", line); + }else { + line = line.substring(spidx).trim(); + if(line.length() < 1) { + EaglerSPRelay.logger.error("Error: Invalid line in {}: ", line); + }else { + addAddress = line; + } + } + }else if(line.startsWith("username")) { + int spidx = line.indexOf('='); + if(spidx < 8) { + EaglerSPRelay.logger.error("Error: Invalid line in {}: ", line); + }else { + line = line.substring(spidx).trim(); + if(line.length() < 1) { + EaglerSPRelay.logger.error("Error: Invalid line in {}: ", line); + }else { + addUsername = line; + } + } + }else if(line.startsWith("password")) { + int spidx = line.indexOf('='); + if(spidx < 8) { + EaglerSPRelay.logger.error("Error: Invalid line in {}: ", line); + }else { + line = line.substring(spidx).trim(); + if(line.length() < 1) { + EaglerSPRelay.logger.error("Error: Invalid line in {}: ", line); + }else { + addPassword = line; + } + } + }else { + EaglerSPRelay.logger.error("Error: Invalid line in {}: ", line); + } + } + } + + if(addType != null) { + add(list.getName(), loading, addType, addAddress, addUsername, addPassword); + } + + if(loading.size() == 0) { + throw new IOException(list.getName() + ": no servers loaded"); + }else { + relayServers.clear(); + relayServers.addAll(loading); + } + + } + + private static void add(String filename, Collection loading, RelayType type, String url, String user, String pass) { + if(type == RelayType.STUN) { + if(url == null) { + EaglerSPRelay.logger.error("Error: Invalid [STUN] in {}, missing 'url'", filename); + }else { + loading.add(new RelayServer(RelayType.STUN, url)); + } + }else if(type == RelayType.TURN) { + if(url == null) { + EaglerSPRelay.logger.error("Error: Invalid [TURN] in {}, missing 'url'", filename); + }else if(user == null) { + EaglerSPRelay.logger.error("Error: Invalid [TURN] in {}, missing 'user' for {}", filename, url); + }else if(pass == null) { + EaglerSPRelay.logger.error("Error: Invalid [TURN] in {}, missing 'pass' for {}", filename, url); + }else { + loading.add(new RelayServer(RelayType.TURN, url, user, pass)); + } + } + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPServer.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPServer.java new file mode 100644 index 0000000..3fae423 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/EaglerSPServer.java @@ -0,0 +1,129 @@ +package net.lax1dude.eaglercraft.sp.relay; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.java_websocket.WebSocket; + +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket02NewClient; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket04Description; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket03ICECandidate; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket05ClientSuccess; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacket06ClientFailure; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacketFEDisconnectClient; +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacketFFErrorCode; + +public class EaglerSPServer { + + public final WebSocket socket; + public final String code; + public final Map clients; + + EaglerSPServer(WebSocket sock, String code) { + this.socket = sock; + this.code = code; + this.clients = new HashMap(); + } + + public void send(IPacket packet) { + if(this.socket.isOpen()) { + try { + this.socket.send(IPacket.writePacket(packet)); + }catch(IOException ex) { + EaglerSPRelay.logger.debug("Error sending data to {}", this.socket.getRemoteSocketAddress()); + EaglerSPRelay.logger.debug(ex); + try { + this.socket.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_INTERNAL_ERROR, + "Internal Server Error"))); + }catch(IOException ex2) { + } + this.socket.close(); + } + }else { + EaglerSPRelay.logger.debug("WARNING: Tried to send data to {} after the connection closed.", this.socket.getRemoteSocketAddress()); + } + } + + public boolean handle(IPacket _packet) throws IOException { + if(_packet instanceof IPacket03ICECandidate) { + IPacket03ICECandidate packet = (IPacket03ICECandidate)_packet; + EaglerSPClient cl = clients.get(packet.peerId); + if(cl != null) { + if(LoginState.assertEquals(cl, LoginState.SENT_ICE_CANDIDATE)) { + cl.state = LoginState.RECIEVED_ICE_CANIDATE; + cl.handleServerICECandidate(packet); + EaglerSPRelay.logger.debug("[{}][Server -> Relay -> Client] PKT 0x03: ICECandidate", cl.socket.getRemoteSocketAddress()); + } + }else { + this.socket.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_UNKNOWN_CLIENT, + "Unknown Client ID: " + packet.peerId))); + } + return true; + }else if(_packet instanceof IPacket04Description) { + IPacket04Description packet = (IPacket04Description)_packet; + EaglerSPClient cl = clients.get(packet.peerId); + if(cl != null) { + if(LoginState.assertEquals(cl, LoginState.SENT_DESCRIPTION)) { + cl.state = LoginState.RECIEVED_DESCRIPTION; + cl.handleServerDescription(packet); + EaglerSPRelay.logger.debug("[{}][Server -> Relay -> Client] PKT 0x04: Description", cl.socket.getRemoteSocketAddress()); + } + }else { + this.socket.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_UNKNOWN_CLIENT, + "Unknown Client ID: " + packet.peerId))); + } + return true; + }else if(_packet instanceof IPacketFEDisconnectClient) { + IPacketFEDisconnectClient packet = (IPacketFEDisconnectClient)_packet; + EaglerSPClient cl = clients.get(packet.clientId); + if(cl != null) { + cl.handleServerDisconnectClient(packet); + EaglerSPRelay.logger.debug("[{}][Server -> Relay -> Client] PKT 0xFE: Disconnect: {}: {}", cl.socket.getRemoteSocketAddress(), + packet.code, packet.reason); + }else { + this.socket.send(IPacket.writePacket(new IPacketFFErrorCode(IPacketFFErrorCode.TYPE_UNKNOWN_CLIENT, + "Unknown Client ID: " + packet.clientId))); + } + return true; + }else { + return false; + } + } + + public void handleNewClient(EaglerSPClient client) { + synchronized(clients) { + clients.put(client.id, client); + send(new IPacket02NewClient(client.id)); + EaglerSPRelay.logger.debug("[{}][Relay -> Server] PKT 0x02: Notify server of the client, id: {}", socket.getRemoteSocketAddress(), client.id); + } + } + + public void handleClientDisconnect(EaglerSPClient client) { + synchronized(clients) { + clients.remove(client.id); + } + if(!client.serverNotifiedOfClose) { + send(new IPacketFEDisconnectClient(client.id, IPacketFEDisconnectClient.TYPE_UNKNOWN, "End of stream")); + client.serverNotifiedOfClose = true; + } + } + + public void handleClientICECandidate(EaglerSPClient client, IPacket03ICECandidate packet) { + send(new IPacket03ICECandidate(client.id, packet.candidate)); + } + + public void handleClientDescription(EaglerSPClient client, IPacket04Description packet) { + send(new IPacket04Description(client.id, packet.description)); + } + + public void handleClientSuccess(EaglerSPClient client, IPacket05ClientSuccess packet) { + send(new IPacket05ClientSuccess(client.id)); + } + + public void handleClientFailure(EaglerSPClient client, IPacket06ClientFailure packet) { + send(new IPacket06ClientFailure(client.id)); + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/LoginState.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/LoginState.java new file mode 100644 index 0000000..c2ef5e0 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/LoginState.java @@ -0,0 +1,24 @@ +package net.lax1dude.eaglercraft.sp.relay; + +import net.lax1dude.eaglercraft.sp.relay.pkt.IPacketFEDisconnectClient; + +/** + * SENT = Client has sent something to the server
+ * RECIEVED = Server has sent something to the client + */ +public enum LoginState { + + INIT, SENT_ICE_CANDIDATE, RECIEVED_ICE_CANIDATE, SENT_DESCRIPTION, RECIEVED_DESCRIPTION, FINISHED; + + public static boolean assertEquals(EaglerSPClient client, LoginState state) { + if(client.state != state) { + String msg = "client is in state " + client.state.name() + " when it was supposed to be " + state.name(); + client.disconnect(IPacketFEDisconnectClient.TYPE_INVALID_OPERATION, msg); + EaglerSPRelay.logger.debug("[{}][Relay -> Client] PKT 0xFE: TYPE_INVALID_OPERATION: {}", client.socket.getRemoteSocketAddress(), msg); + return false; + }else { + return true; + } + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/Util.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/Util.java new file mode 100644 index 0000000..29db474 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/Util.java @@ -0,0 +1,18 @@ +package net.lax1dude.eaglercraft.sp.relay; + +import java.net.InetSocketAddress; + +public class Util { + + public static void sleep(long millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + } + } + + public static String sock2String(InetSocketAddress sock) { + return sock.getAddress().getHostAddress() + sock.getPort(); + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket.java new file mode 100644 index 0000000..562e612 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket.java @@ -0,0 +1,146 @@ +package net.lax1dude.eaglercraft.sp.relay.pkt; + +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; + +import net.lax1dude.eaglercraft.sp.relay.EaglerSPRelay; + +public class IPacket { + + private static final Map> definedPacketClasses = new HashMap(); + private static final Map,Integer> definedPacketIds = new HashMap(); + + private static void register(int id, Class clazz) { + definedPacketClasses.put(id, clazz); + definedPacketIds.put(clazz, id); + } + + static { + register(0x00, IPacket00Handshake.class); + register(0x01, IPacket01ICEServers.class); + register(0x02, IPacket02NewClient.class); + register(0x03, IPacket03ICECandidate.class); + register(0x04, IPacket04Description.class); + register(0x05, IPacket05ClientSuccess.class); + register(0x06, IPacket06ClientFailure.class); + register(0xFE, IPacketFEDisconnectClient.class); + register(0xFF, IPacketFFErrorCode.class); + } + + public static IPacket readPacket(DataInputStream input) throws IOException { + int i = input.read(); + try { + Class clazz = definedPacketClasses.get(i); + if(clazz == null) { + throw new IOException("Unknown packet type: " + i); + } + IPacket pkt = clazz.newInstance(); + pkt.read(input); + return pkt; + } catch (InstantiationException | IllegalAccessException e) { + EaglerSPRelay.logger.error("Could not instanciate packet {}", i); + EaglerSPRelay.logger.error(e); + throw new IOException("Unknown packet type: " + i); + } + } + + public static byte[] writePacket(IPacket packet) throws IOException { + Integer i = definedPacketIds.get(packet.getClass()); + if(i != null) { + int len = packet.packetLength(); + ByteArrayOutputStream bao = len == -1 ? new ByteArrayOutputStream() : + new ByteArrayOutputStream(len + 1); + bao.write(i); + packet.write(new DataOutputStream(bao)); + byte[] ret = bao.toByteArray(); + if(len != -1 && ret.length != len + 1) { + EaglerSPRelay.logger.debug("writePacket buffer for packet {} {} by {} bytes", + packet.getClass().getSimpleName(), len + 1 < ret.length ? "overflowed" : + "underflowed", len + 1 < ret.length ? ret.length - len - 1 : len + 1 - ret.length); + } + return ret; + }else { + throw new IOException("Unknown packet type: " + packet.getClass().getSimpleName()); + } + } + + public void read(DataInputStream input) throws IOException { + } + + public void write(DataOutputStream output) throws IOException { + } + + public int packetLength() { + return -1; + } + + public static String readASCII(InputStream is, int len) throws IOException { + char[] ret = new char[len]; + for(int i = 0; i < len; ++i) { + int j = is.read(); + if(j < 0) { + return null; + } + ret[i] = (char)is.read(); + } + return new String(ret); + } + + public static void writeASCII(OutputStream is, String txt) throws IOException { + for(int i = 0, l = txt.length(); i < l; ++i) { + is.write((int)txt.charAt(i)); + } + } + + public static String readASCII8(InputStream is) throws IOException { + int i = is.read(); + if(i < 0) { + return null; + }else { + return readASCII(is, i); + } + } + + public static void writeASCII8(OutputStream is, String txt) throws IOException { + if(txt == null) { + is.write(0); + }else { + int l = txt.length(); + is.write(l); + for(int i = 0; i < l; ++i) { + is.write((int)txt.charAt(i)); + } + } + } + + public static String readASCII16(InputStream is) throws IOException { + int hi = is.read(); + int lo = is.read(); + if(hi < 0 || lo < 0) { + return null; + }else { + return readASCII(is, (hi << 8) | lo); + } + } + + public static void writeASCII16(OutputStream is, String txt) throws IOException { + if(txt == null) { + is.write(0); + is.write(0); + }else { + int l = txt.length(); + is.write((l >> 8) & 0xFF); + is.write(l & 0xFF); + for(int i = 0; i < l; ++i) { + is.write((int)txt.charAt(i)); + } + } + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket00Handshake.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket00Handshake.java new file mode 100644 index 0000000..3702881 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket00Handshake.java @@ -0,0 +1,41 @@ +package net.lax1dude.eaglercraft.sp.relay.pkt; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class IPacket00Handshake extends IPacket { + + public int connectionType = 0; + public int connectionVersion = 1; + public String connectionCode = null; + + public IPacket00Handshake() { + } + + public IPacket00Handshake(int connectionType, int connectionVersion, + String connectionCode) { + this.connectionType = connectionType; + this.connectionVersion = connectionVersion; + this.connectionCode = connectionCode; + } + + @Override + public void read(DataInputStream input) throws IOException { + connectionType = input.read(); + connectionVersion = input.read(); + connectionCode = IPacket.readASCII8(input); + } + + @Override + public void write(DataOutputStream output) throws IOException { + output.write(connectionType); + IPacket.writeASCII8(output, connectionCode); + } + + @Override + public int packetLength() { + return 1 + 1 + (connectionCode != null ? 1 + connectionCode.length() : 0); + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket01ICEServers.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket01ICEServers.java new file mode 100644 index 0000000..1f29b86 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket01ICEServers.java @@ -0,0 +1,39 @@ +package net.lax1dude.eaglercraft.sp.relay.pkt; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.Collection; +import java.util.Iterator; + +import net.lax1dude.eaglercraft.sp.relay.EaglerSPRelayConfigRelayList.RelayServer; +import net.lax1dude.eaglercraft.sp.relay.EaglerSPRelayConfigRelayList.RelayType; + +public class IPacket01ICEServers extends IPacket { + + public final Collection servers; + + public IPacket01ICEServers(Collection servers) { + this.servers = servers; + } + + public void write(DataOutputStream output) throws IOException { + int l = servers.size(); + output.writeShort(l); + Iterator itr = servers.iterator(); + while(itr.hasNext()) { + RelayServer srv = itr.next(); + if(srv.type == RelayType.STUN) { + output.write('S'); + writeASCII16(output, srv.address); + }else if(srv.type == RelayType.TURN) { + output.write('T'); + writeASCII16(output, srv.address); + writeASCII8(output, srv.username); + writeASCII8(output, srv.password); + }else { + throw new IOException("Unknown/Unsupported Relay Type: " + srv.type.name()); + } + } + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket02NewClient.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket02NewClient.java new file mode 100644 index 0000000..d875cb6 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket02NewClient.java @@ -0,0 +1,22 @@ +package net.lax1dude.eaglercraft.sp.relay.pkt; + +import java.io.DataOutputStream; +import java.io.IOException; + +public class IPacket02NewClient extends IPacket { + + public String clientId; + + public IPacket02NewClient(String clientId) { + this.clientId = clientId; + } + + public void write(DataOutputStream output) throws IOException { + writeASCII8(output, clientId); + } + + public int packetLength() { + return 1 + clientId.length(); + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket03ICECandidate.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket03ICECandidate.java new file mode 100644 index 0000000..239a27f --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket03ICECandidate.java @@ -0,0 +1,34 @@ +package net.lax1dude.eaglercraft.sp.relay.pkt; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class IPacket03ICECandidate extends IPacket { + + public String peerId; + public String candidate; + + public IPacket03ICECandidate(String peerId, String desc) { + this.peerId = peerId; + this.candidate = desc; + } + + public IPacket03ICECandidate() { + } + + public void read(DataInputStream input) throws IOException { + peerId = readASCII8(input); + candidate = readASCII16(input); + } + + public void write(DataOutputStream output) throws IOException { + writeASCII8(output, peerId); + writeASCII16(output, candidate); + } + + public int packetLength() { + return 1 + peerId.length() + 2 + candidate.length(); + } + +} \ No newline at end of file diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket04Description.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket04Description.java new file mode 100644 index 0000000..8693c7b --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket04Description.java @@ -0,0 +1,34 @@ +package net.lax1dude.eaglercraft.sp.relay.pkt; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class IPacket04Description extends IPacket { + + public String peerId; + public String description; + + public IPacket04Description(String peerId, String desc) { + this.peerId = peerId; + this.description = desc; + } + + public IPacket04Description() { + } + + public void read(DataInputStream input) throws IOException { + peerId = readASCII8(input); + description = readASCII16(input); + } + + public void write(DataOutputStream output) throws IOException { + writeASCII8(output, peerId); + writeASCII16(output, description); + } + + public int packetLength() { + return 1 + peerId.length() + 2 + description.length(); + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket05ClientSuccess.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket05ClientSuccess.java new file mode 100644 index 0000000..a215a1a --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket05ClientSuccess.java @@ -0,0 +1,30 @@ +package net.lax1dude.eaglercraft.sp.relay.pkt; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class IPacket05ClientSuccess extends IPacket { + + public String clientId; + + public IPacket05ClientSuccess() { + } + + public IPacket05ClientSuccess(String clientId) { + this.clientId = clientId; + } + + public void read(DataInputStream input) throws IOException { + clientId = readASCII8(input); + } + + public void write(DataOutputStream output) throws IOException { + writeASCII8(output, clientId); + } + + public int packetLength() { + return 1 + clientId.length(); + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket06ClientFailure.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket06ClientFailure.java new file mode 100644 index 0000000..fceae93 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacket06ClientFailure.java @@ -0,0 +1,30 @@ +package net.lax1dude.eaglercraft.sp.relay.pkt; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class IPacket06ClientFailure extends IPacket { + + public String clientId; + + public IPacket06ClientFailure() { + } + + public IPacket06ClientFailure(String clientId) { + this.clientId = clientId; + } + + public void read(DataInputStream input) throws IOException { + clientId = readASCII8(input); + } + + public void write(DataOutputStream output) throws IOException { + writeASCII8(output, clientId); + } + + public int packetLength() { + return 1 + clientId.length(); + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacketFEDisconnectClient.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacketFEDisconnectClient.java new file mode 100644 index 0000000..b39288d --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacketFEDisconnectClient.java @@ -0,0 +1,45 @@ +package net.lax1dude.eaglercraft.sp.relay.pkt; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class IPacketFEDisconnectClient extends IPacket { + + public static final int TYPE_FINISHED_SUCCESS = 0x00; + public static final int TYPE_FINISHED_FAILED = 0x01; + public static final int TYPE_TIMEOUT = 0x02; + public static final int TYPE_INVALID_OPERATION = 0x03; + public static final int TYPE_INTERNAL_ERROR = 0x04; + public static final int TYPE_UNKNOWN = 0xFF; + + public String clientId; + public int code; + public String reason; + + public IPacketFEDisconnectClient() { + } + + public IPacketFEDisconnectClient(String clientId, int code, String reason) { + this.clientId = clientId; + this.code = code; + this.reason = reason; + } + + public void read(DataInputStream input) throws IOException { + clientId = readASCII8(input); + code = input.read(); + reason = readASCII16(input); + } + + public void write(DataOutputStream output) throws IOException { + writeASCII8(output, clientId); + output.write(code); + writeASCII16(output, reason); + } + + public int packetLength() { + return -1; + } + +} diff --git a/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacketFFErrorCode.java b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacketFFErrorCode.java new file mode 100644 index 0000000..8effe08 --- /dev/null +++ b/sp-relay/src/main/java/net/lax1dude/eaglercraft/sp/relay/pkt/IPacketFFErrorCode.java @@ -0,0 +1,46 @@ +package net.lax1dude.eaglercraft.sp.relay.pkt; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class IPacketFFErrorCode extends IPacket { + + public static final int TYPE_INTERNAL_ERROR = 0x00; + public static final int TYPE_PROTOCOL_VERSION = 0x01; + public static final int TYPE_INVALID_PACKET = 0x02; + public static final int TYPE_ILLEGAL_OPERATION = 0x03; + public static final int TYPE_CODE_LENGTH = 0x04; + public static final int TYPE_INCORRECT_CODE = 0x05; + public static final int TYPE_SERVER_DISCONNECTED = 0x06; + public static final int TYPE_UNKNOWN_CLIENT = 0x07; + + public int code; + public String desc; + + public IPacketFFErrorCode() { + } + + public IPacketFFErrorCode(int code, String desc) { + this.code = code; + this.desc = desc; + } + + @Override + public void read(DataInputStream input) throws IOException { + code = input.read(); + desc = readASCII16(input); + } + + @Override + public void write(DataOutputStream input) throws IOException { + input.write(code); + writeASCII16(input, desc); + } + + @Override + public int packetLength() { + return 1 + 2 + desc.length(); + } + +} diff --git a/sp-relay/src/main/resources/relays.txt b/sp-relay/src/main/resources/relays.txt new file mode 100644 index 0000000..d6fe04d --- /dev/null +++ b/sp-relay/src/main/resources/relays.txt @@ -0,0 +1,13 @@ + +[STUN] +url=stun:openrelay.metered.ca:80 + +[TURN] +url=turn:openrelay.metered.ca:443 +username=openrelayproject +password=openrelayproject + +[TURN] +url=turn:openrelay.metered.ca:443?transport=tcp +username=openrelayproject +password=openrelayproject