From 9ac35a8ca119389e4b8acb1c64ec17a9c631317d Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 1 Dec 2013 18:18:41 +1100 Subject: [PATCH] BungeeCord Support Provides support for IP forwarding via BungeeCord. diff --git a/src/main/java/net/minecraft/network/NetworkManager.java b/src/main/java/net/minecraft/network/NetworkManager.java index 7326aacaf..a5a81082f 100644 --- a/src/main/java/net/minecraft/network/NetworkManager.java +++ b/src/main/java/net/minecraft/network/NetworkManager.java @@ -74,6 +74,10 @@ public class NetworkManager extends SimpleChannelInboundHandler> { private final Queue queue = Queues.newConcurrentLinkedQueue(); public Channel channel; public SocketAddress address; + // Spigot Start + public java.util.UUID spoofedUUID; + public com.mojang.authlib.properties.Property[] spoofedProfile; + // Spigot End private PacketListener packetListener; private IChatBaseComponent disconnectedReason; private boolean encrypted; @@ -436,4 +440,11 @@ public class NetworkManager extends SimpleChannelInboundHandler> { this.listener = packetsendlistener; } } + + // Spigot Start + public SocketAddress getRawAddress() + { + return this.channel.remoteAddress(); + } + // Spigot End } diff --git a/src/main/java/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.java b/src/main/java/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.java index e992a972d..786314a9b 100644 --- a/src/main/java/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.java +++ b/src/main/java/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.java @@ -23,7 +23,7 @@ public class PacketHandshakingInSetProtocol implements Packet throttleTracker = new HashMap(); private static int throttleCounter = 0; @@ -82,6 +87,31 @@ public class HandshakeListener implements PacketHandshakingInListener { this.connection.disconnect(ichatmutablecomponent); } else { this.connection.setListener(new LoginListener(this.server, this.connection)); + // Spigot Start + String[] split = packethandshakinginsetprotocol.hostName.split("\00"); + if (org.spigotmc.SpigotConfig.bungee) { + if ( ( split.length == 3 || split.length == 4 ) && ( HOST_PATTERN.matcher( split[1] ).matches() ) ) { + packethandshakinginsetprotocol.hostName = split[0]; + connection.address = new java.net.InetSocketAddress(split[1], ((java.net.InetSocketAddress) connection.getRemoteAddress()).getPort()); + connection.spoofedUUID = com.mojang.util.UUIDTypeAdapter.fromString( split[2] ); + } else + { + IChatBaseComponent chatmessage = IChatBaseComponent.literal("If you wish to use IP forwarding, please enable it in your BungeeCord config as well!"); + this.connection.send(new PacketLoginOutDisconnect(chatmessage)); + this.connection.disconnect(chatmessage); + return; + } + if ( split.length == 4 ) + { + connection.spoofedProfile = gson.fromJson(split[3], com.mojang.authlib.properties.Property[].class); + } + } else if ( ( split.length == 3 || split.length == 4 ) && ( HOST_PATTERN.matcher( split[1] ).matches() ) ) { + IChatBaseComponent chatmessage = IChatBaseComponent.literal("Unknown data in login hostname, did you forget to enable BungeeCord in spigot.yml?"); + this.connection.send(new PacketLoginOutDisconnect(chatmessage)); + this.connection.disconnect(chatmessage); + return; + } + // Spigot End ((LoginListener) this.connection.getPacketListener()).hostname = packethandshakinginsetprotocol.hostName + ":" + packethandshakinginsetprotocol.port; // CraftBukkit - set hostname } break; diff --git a/src/main/java/net/minecraft/server/network/LoginListener.java b/src/main/java/net/minecraft/server/network/LoginListener.java index e5b0edcf1..f2e256d89 100644 --- a/src/main/java/net/minecraft/server/network/LoginListener.java +++ b/src/main/java/net/minecraft/server/network/LoginListener.java @@ -121,7 +121,25 @@ public class LoginListener implements TickablePacketListener, PacketLoginInListe // Spigot start public void initUUID() { - this.gameProfile = this.createFakeProfile(this.gameProfile); + UUID uuid; + if ( connection.spoofedUUID != null ) + { + uuid = connection.spoofedUUID; + } else + { + uuid = UUIDUtil.createOfflinePlayerUUID( this.gameProfile.getName() ); + } + + this.gameProfile = new GameProfile( uuid, this.gameProfile.getName() ); + + if (connection.spoofedProfile != null) + { + for ( com.mojang.authlib.properties.Property property : connection.spoofedProfile ) + { + if ( !HandshakeListener.PROP_PATTERN.matcher( property.getName() ).matches() ) continue; + this.gameProfile.getProperties().put( property.getName(), property ); + } + } } public void handleAcceptedLogin() { diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java index e04c32a69..4472066f9 100644 --- a/src/main/java/net/minecraft/server/network/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java @@ -2044,10 +2044,10 @@ public class PlayerConnection implements ServerPlayerConnection, TickablePacketL String message = String.format(queueEvent.getFormat(), queueEvent.getPlayer().getDisplayName(), queueEvent.getMessage()); if (((LazyPlayerSet) queueEvent.getRecipients()).isLazy()) { - if (originalFormat.equals(queueEvent.getFormat()) && originalMessage.equals(queueEvent.getMessage()) && queueEvent.getPlayer().getName().equalsIgnoreCase(queueEvent.getPlayer().getDisplayName())) { + if (!org.spigotmc.SpigotConfig.bungee && originalFormat.equals(queueEvent.getFormat()) && originalMessage.equals(queueEvent.getMessage()) && queueEvent.getPlayer().getName().equalsIgnoreCase(queueEvent.getPlayer().getDisplayName())) { // Spigot PlayerConnection.this.server.getPlayerList().broadcastChatMessage(original, PlayerConnection.this.player, ChatMessageType.bind(ChatMessageType.CHAT, (Entity) PlayerConnection.this.player)); return null; - } else if (CraftChatMessage.fromComponent(original.serverContent()).equals(message)) { + } else if (!org.spigotmc.SpigotConfig.bungee && CraftChatMessage.fromComponent(original.serverContent()).equals(message)) { // Spigot PlayerConnection.this.server.getPlayerList().broadcastChatMessage(original, PlayerConnection.this.player, ChatMessageType.bind(ChatMessageType.RAW, (Entity) PlayerConnection.this.player)); return null; } @@ -2089,10 +2089,10 @@ public class PlayerConnection implements ServerPlayerConnection, TickablePacketL s = String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()); if (((LazyPlayerSet) event.getRecipients()).isLazy()) { - if (originalFormat.equals(event.getFormat()) && originalMessage.equals(event.getMessage()) && event.getPlayer().getName().equalsIgnoreCase(event.getPlayer().getDisplayName())) { + if (!org.spigotmc.SpigotConfig.bungee && originalFormat.equals(event.getFormat()) && originalMessage.equals(event.getMessage()) && event.getPlayer().getName().equalsIgnoreCase(event.getPlayer().getDisplayName())) { // Spigot PlayerConnection.this.server.getPlayerList().broadcastChatMessage(original, PlayerConnection.this.player, ChatMessageType.bind(ChatMessageType.CHAT, (Entity) PlayerConnection.this.player)); return; - } else if (CraftChatMessage.fromComponent(original.serverContent()).equals(s)) { + } else if (!org.spigotmc.SpigotConfig.bungee && CraftChatMessage.fromComponent(original.serverContent()).equals(s)) { // Spigot PlayerConnection.this.server.getPlayerList().broadcastChatMessage(original, PlayerConnection.this.player, ChatMessageType.bind(ChatMessageType.RAW, (Entity) PlayerConnection.this.player)); return; } diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java index 81da9f01f..ab0d3d629 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -571,7 +571,7 @@ public abstract class PlayerList { EntityPlayer entity = new EntityPlayer(this.server, this.server.getLevel(World.OVERWORLD), gameprofile, profilepublickey); Player player = entity.getBukkitEntity(); - PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((java.net.InetSocketAddress) socketaddress).getAddress()); + PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((java.net.InetSocketAddress) socketaddress).getAddress(), ((java.net.InetSocketAddress) loginlistener.connection.getRawAddress()).getAddress()); if (getBans().isBanned(gameprofile) && !getBans().get(gameprofile).hasExpired()) { GameProfileBanEntry gameprofilebanentry = (GameProfileBanEntry) this.bans.get(gameprofile); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index c6402dcea..226209c78 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -713,7 +713,13 @@ public final class CraftServer implements Server { @Override public long getConnectionThrottle() { - return this.configuration.getInt("settings.connection-throttle"); + // Spigot Start - Automatically set connection throttle for bungee configurations + if (org.spigotmc.SpigotConfig.bungee) { + return -1; + } else { + return this.configuration.getInt("settings.connection-throttle"); + } + // Spigot End } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index db02d6c94..ef985d648 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1907,6 +1907,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { private final Player.Spigot spigot = new Player.Spigot() { + @Override + public InetSocketAddress getRawAddress() + { + return (InetSocketAddress) getHandle().connection.connection.getRawAddress(); + } + @Override public boolean getCollidesWithEntities() { return CraftPlayer.this.isCollidable(); diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java index 130016282..3bb51f452 100644 --- a/src/main/java/org/spigotmc/SpigotConfig.java +++ b/src/main/java/org/spigotmc/SpigotConfig.java @@ -214,4 +214,14 @@ public class SpigotConfig commands.put( "restart", new RestartCommand( "restart" ) ); WatchdogThread.doStart( timeoutTime, restartOnCrash ); } + + public static boolean bungee; + private static void bungee() { + if ( version < 4 ) + { + set( "settings.bungeecord", false ); + System.out.println( "Oudated config, disabling BungeeCord support!" ); + } + bungee = getBoolean( "settings.bungeecord", false ); + } } -- 2.34.1