From 71fbe173b006a96aea11fe58b63e091283179ef0 Mon Sep 17 00:00:00 2001 From: rtm516 Date: Fri, 28 Apr 2023 09:13:43 +0100 Subject: [PATCH] Add vhost support back --- .github/workflows/build.yml | 3 +- .github/workflows/pullrequest.yml | 3 +- build.gradle | 2 +- .../connect/extension/PacketHandler.java | 83 ++++++++++--------- .../connect/extension/ui/UIHandler.java | 32 +------ .../extension/utils/ServerManager.java | 1 + .../connect/extension/utils/Utils.java | 31 +++++++ 7 files changed, 82 insertions(+), 73 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e42123d..47d1f7d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,7 @@ name: Build Pull Request -on: +on: + workflow_dispatch: push: paths-ignore: - '.idea/copyright/*.xml' diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index f17c350..8e42fdd 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -1,6 +1,7 @@ name: Build Pull Request -on: +on: + workflow_dispatch: pull_request: paths-ignore: - '.idea/copyright/*.xml' diff --git a/build.gradle b/build.gradle index 3a033bc..8e599d5 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ group 'org.geysermc.connect.extension' version '1.0.0' repositories { - mavenLocal() +// mavenLocal() mavenCentral() maven { url 'https://repo.opencollab.dev/main' diff --git a/src/main/java/org/geysermc/connect/extension/PacketHandler.java b/src/main/java/org/geysermc/connect/extension/PacketHandler.java index 93892ed..6e0927c 100644 --- a/src/main/java/org/geysermc/connect/extension/PacketHandler.java +++ b/src/main/java/org/geysermc/connect/extension/PacketHandler.java @@ -31,7 +31,9 @@ import org.cloudburstmc.protocol.bedrock.packet.NetworkStackLatencyPacket; import org.cloudburstmc.protocol.bedrock.packet.SetLocalPlayerAsInitializedPacket; import org.cloudburstmc.protocol.bedrock.packet.UpdateAttributesPacket; import org.cloudburstmc.protocol.common.PacketSignal; +import org.geysermc.connect.extension.config.VirtualHostSection; import org.geysermc.connect.extension.ui.UIHandler; +import org.geysermc.connect.extension.utils.Server; import org.geysermc.connect.extension.utils.ServerManager; import org.geysermc.connect.extension.utils.Utils; import org.geysermc.geyser.entity.attribute.GeyserAttributeType; @@ -71,6 +73,47 @@ public class PacketHandler extends UpstreamPacketHandler { @Override public PacketSignal handle(SetLocalPlayerAsInitializedPacket packet) { + geyserConnect.logger().debug("Player initialized: " + Utils.displayName(session)); + + // Handle the virtual host if specified + VirtualHostSection vhost = GeyserConnect.instance().config().vhost(); + if (vhost.enabled()) { + String domain = session.getClientData().getServerAddress().split(":")[0]; + if (!domain.equals(vhost.baseDomain()) && domain.endsWith("." + vhost.baseDomain())) { + String address = ""; + int port = 25565; + boolean online = true; + + // Parse the address used + String[] domainParts = domain.replaceFirst("\\." + vhost.baseDomain() + "$", "").split("\\._"); + for (int i = 0; i < domainParts.length; i++) { + String part = domainParts[i]; + if (i == 0) { + address = part; + } else if (part.startsWith("p")) { + port = Integer.parseInt(part.substring(1)); + } else if (part.startsWith("o")) { + online = false; + } + } + + // They didn't specify an address so disconnect them + if (address.startsWith("_")) { + session.disconnect("disconnectionScreen.invalidIP"); + return PacketSignal.HANDLED; + } + + // Log the virtual host usage + GeyserConnect.instance().logger().info(Utils.displayName(session) + " is using virtualhost: " + address + ":" + port + (!online ? " (offline)" : "")); + + // Send the player to the wanted server + Utils.sendToServer(session, originalPacketHandler, new Server(address, port, online, false, null, null, null)); + + return PacketSignal.HANDLED; + } + } + + // Handle normal connections if (session.getPlayerEntity().getGeyserId() == packet.getRuntimeEntityId()) { if (!session.getUpstream().isInitialized()) { session.getUpstream().setInitialized(true); @@ -78,51 +121,11 @@ public class PacketHandler extends UpstreamPacketHandler { // Load the players servers ServerManager.loadServers(session); - geyserConnect.logger().debug("Player initialized: " + Utils.displayName(session)); - UIHandler uiHandler = new UIHandler(session, originalPacketHandler); uiHandler.initialiseSession(); } } - // Handle the virtual host if specified -// GeyserConnectConfig.VirtualHostSection vhost = MasterServer.getInstance().getGeyserConnectConfig().getVhost(); -// if (vhost.isEnabled()) { -// String domain = player.getClientData().getServerAddress().split(":")[0]; -// if (!domain.equals(vhost.getBaseDomain()) && domain.endsWith("." + vhost.getBaseDomain())) { -// String address = ""; -// int port = 25565; -// boolean online = true; -// -// // Parse the address used -// String[] domainParts = domain.replaceFirst("\\." + vhost.getBaseDomain() + "$", "").split("\\._"); -// for (int i = 0; i < domainParts.length; i++) { -// String part = domainParts[i]; -// if (i == 0) { -// address = part; -// } else if (part.startsWith("p")) { -// port = Integer.parseInt(part.substring(1)); -// } else if (part.startsWith("o")) { -// online = false; -// } -// } -// -// // They didn't specify an address so disconnect them -// if (address.startsWith("_")) { -// session.disconnect("disconnectionScreen.invalidIP"); -// return false; -// } -// -// // Log the virtual host usage -// masterServer.getLogger().info(player.getAuthData().name() + " is using virtualhost: " + address + ":" + port + (!online ? " (offline)" : "")); -// -// // Send the player to the wanted server -// player.sendToServer(new Server(address, port, online, false)); -// -// return false; -// } -// } - return PacketSignal.HANDLED; } diff --git a/src/main/java/org/geysermc/connect/extension/ui/UIHandler.java b/src/main/java/org/geysermc/connect/extension/ui/UIHandler.java index f264aec..b34dee8 100644 --- a/src/main/java/org/geysermc/connect/extension/ui/UIHandler.java +++ b/src/main/java/org/geysermc/connect/extension/ui/UIHandler.java @@ -53,34 +53,6 @@ public class UIHandler { this.originalPacketHandler = originalPacketHandler; } - private void sendToServer(Server server) { - GeyserConnect.instance().logger().info("Sending " + Utils.displayName(session) + " to " + server.title()); - GeyserConnect.instance().logger().debug(server.toString()); - - if (server.bedrock()) { - // Send them to the bedrock server - TransferPacket transferPacket = new TransferPacket(); - transferPacket.setAddress(server.address()); - transferPacket.setPort(server.port()); - session.sendUpstreamPacket(transferPacket); - } else { - // Save the players servers since we are changing packet handlers - ServerManager.unloadServers(session); - - // Restore the original packet handler - session.getUpstream().getSession().setPacketHandler(originalPacketHandler); - - // Set the remote server and un-initialize the session - session.remoteServer(server); - session.getUpstream().setInitialized(false); - - // Hand back to core geyser - SetLocalPlayerAsInitializedPacket initializedPacket = new SetLocalPlayerAsInitializedPacket(); - initializedPacket.setRuntimeEntityId(session.getPlayerEntity().getGeyserId()); - originalPacketHandler.handle(initializedPacket); - } - } - public void initialiseSession() { String message = ""; try { @@ -189,7 +161,7 @@ public class UIHandler { } Server server = servers.get(response.clickedButtonId()); - sendToServer(server); + Utils.sendToServer(session, originalPacketHandler, server); }); session.sendForm(serversMenu); @@ -332,7 +304,7 @@ public class UIHandler { boolean geyserServer = response.asToggle(3); Server server = new Server(ip, port, onlineMode, geyserServer, null, null, ServerCategory.CUSTOM); - sendToServer(server); + Utils.sendToServer(session, originalPacketHandler, server); })); } } diff --git a/src/main/java/org/geysermc/connect/extension/utils/ServerManager.java b/src/main/java/org/geysermc/connect/extension/utils/ServerManager.java index 33eddb9..07ff058 100644 --- a/src/main/java/org/geysermc/connect/extension/utils/ServerManager.java +++ b/src/main/java/org/geysermc/connect/extension/utils/ServerManager.java @@ -41,6 +41,7 @@ public class ServerManager { } public static void unloadServers(GeyserSession session) { + if (getServers(session) == null) return; GeyserConnect.instance().logger().debug("Saving and unloading servers for " + Utils.displayName(session)); GeyserConnect.instance().storageManager().saveServers(session); servers.remove(session.xuid()); diff --git a/src/main/java/org/geysermc/connect/extension/utils/Utils.java b/src/main/java/org/geysermc/connect/extension/utils/Utils.java index 9048d59..ec31769 100644 --- a/src/main/java/org/geysermc/connect/extension/utils/Utils.java +++ b/src/main/java/org/geysermc/connect/extension/utils/Utils.java @@ -27,6 +27,9 @@ package org.geysermc.connect.extension.utils; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import org.cloudburstmc.protocol.bedrock.packet.BedrockPacketHandler; +import org.cloudburstmc.protocol.bedrock.packet.SetLocalPlayerAsInitializedPacket; +import org.cloudburstmc.protocol.bedrock.packet.TransferPacket; import org.geysermc.connect.extension.GeyserConnect; import org.geysermc.geyser.session.GeyserSession; @@ -74,4 +77,32 @@ public class Utils { public static String displayName(GeyserSession session) { return session.bedrockUsername() + " (" + session.xuid() + ")"; } + + public static void sendToServer(GeyserSession session, BedrockPacketHandler originalPacketHandler, Server server) { + GeyserConnect.instance().logger().info("Sending " + Utils.displayName(session) + " to " + server.title()); + GeyserConnect.instance().logger().debug(server.toString()); + + if (server.bedrock()) { + // Send them to the bedrock server + TransferPacket transferPacket = new TransferPacket(); + transferPacket.setAddress(server.address()); + transferPacket.setPort(server.port()); + session.sendUpstreamPacket(transferPacket); + } else { + // Save the players servers since we are changing packet handlers + ServerManager.unloadServers(session); + + // Restore the original packet handler + session.getUpstream().getSession().setPacketHandler(originalPacketHandler); + + // Set the remote server and un-initialize the session + session.remoteServer(server); + session.getUpstream().setInitialized(false); + + // Hand back to core geyser + SetLocalPlayerAsInitializedPacket initializedPacket = new SetLocalPlayerAsInitializedPacket(); + initializedPacket.setRuntimeEntityId(session.getPlayerEntity().getGeyserId()); + originalPacketHandler.handle(initializedPacket); + } + } }