From f50bef3eb2f99ccfb6969e291c822a572d317ba7 Mon Sep 17 00:00:00 2001 From: games647 Date: Sat, 14 Aug 2021 21:01:56 +0200 Subject: [PATCH] Fix TCPShield compat by using raw address for sessions TCPShield overwrites the IP address during connection. ProtocolLib doesn't notice this change, because it uses the end-to-end connection which is the proxy IP. This causes getAddress calls during Spigot play state and ProtocolLib auth state not match and then have conflicting session ids. A solution is also to hold onto the temporary player object. However since we don't get a notification for a disconnect, holding it will prevent to get GCed until the timeout occurs (1 minute). Fixes #595 --- .../games647/fastlogin/bukkit/FastLoginBukkit.java | 12 ++++++++++++ .../games647/fastlogin/bukkit/hook/AuthMeHook.java | 2 +- .../fastlogin/bukkit/listener/BungeeListener.java | 2 +- .../bukkit/listener/ConnectionListener.java | 4 ++-- .../protocolsupport/ProtocolLoginSource.java | 2 +- .../protocolsupport/ProtocolSupportListener.java | 7 ++++--- 6 files changed, 21 insertions(+), 8 deletions(-) diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java index b2bc397c..b010b180 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java @@ -26,6 +26,7 @@ package com.github.games647.fastlogin.bukkit; import com.comphenix.protocol.ProtocolLibrary; +import com.destroystokyo.paper.event.player.PlayerHandshakeEvent; import com.github.games647.fastlogin.bukkit.command.CrackedCommand; import com.github.games647.fastlogin.bukkit.command.PremiumCommand; import com.github.games647.fastlogin.bukkit.listener.ConnectionListener; @@ -56,6 +57,8 @@ import java.util.concurrent.ConcurrentMap; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import org.geysermc.floodgate.api.FloodgateApi; @@ -105,6 +108,15 @@ public class FastLoginBukkit extends JavaPlugin implements PlatformPlugin, Listener { public void onSessionRestore(RestoreSessionEvent restoreSessionEvent) { Player player = restoreSessionEvent.getPlayer(); - BukkitLoginSession session = plugin.getSession(player.getAddress()); + BukkitLoginSession session = plugin.getSession(player.spigot().getRawAddress()); if (session != null && session.isVerified()) { restoreSessionEvent.setCancelled(true); } diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BungeeListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BungeeListener.java index 4b72ff8f..9de359f0 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BungeeListener.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BungeeListener.java @@ -127,7 +127,7 @@ public class BungeeListener implements PluginMessageListener { private void startLoginTaskIfReady(Player player, BukkitLoginSession session) { session.setVerified(true); - plugin.putSession(player.getAddress(), session); + plugin.putSession(player.spigot().getRawAddress(), session); // only start a new login task if the join event fired earlier. This event then didn't boolean result = plugin.getBungeeManager().didJoinEventFired(player); diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/ConnectionListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/ConnectionListener.java index a9a70f89..ed6499c6 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/ConnectionListener.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/ConnectionListener.java @@ -80,7 +80,7 @@ public class ConnectionListener implements Listener { // session exists so the player is ready for force login // cases: Paper (firing BungeeCord message before PlayerJoinEvent) or not running BungeeCord and already // having the login session from the login process - BukkitLoginSession session = plugin.getSession(player.getAddress()); + BukkitLoginSession session = plugin.getSession(player.spigot().getRawAddress()); if (session == null) { // Floodgate players usually don't have a session at this point @@ -95,7 +95,7 @@ public class ConnectionListener implements Listener { } } - String sessionId = plugin.getSessionId(player.getAddress()); + String sessionId = plugin.getSessionId(player.spigot().getRawAddress()); plugin.getLog().info("No on-going login session for player: {} with ID {}. ", player, sessionId); plugin.getLog().info("Setups using Minecraft proxies will start delayed " + "when the command from the proxy is received"); diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolLoginSource.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolLoginSource.java index 1b6f4d52..7a3b0832 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolLoginSource.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolLoginSource.java @@ -51,7 +51,7 @@ public class ProtocolLoginSource implements LoginSource { @Override public InetSocketAddress getAddress() { - return loginStartEvent.getAddress(); + return loginStartEvent.getConnection().getRawAddress(); } public PlayerLoginStartEvent getLoginStartEvent() { diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolSupportListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolSupportListener.java index 5af579f2..3cb489eb 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolSupportListener.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocolsupport/ProtocolSupportListener.java @@ -66,7 +66,7 @@ public class ProtocolSupportListener extends JoinManagement