From 8aa376fc2708db8cb9c21df325174d74b9c7bdb9 Mon Sep 17 00:00:00 2001 From: sk89q Date: Sat, 16 Apr 2011 03:08:13 -0700 Subject: [PATCH] Added pre-login event for catching logins right after name verification has completed. This happens in a different thread from the server (and thus can also block). --- .../net/minecraft/server/NetLoginHandler.java | 8 ++- .../net/minecraft/server/NetworkManager.java | 2 +- .../minecraft/server/ThreadLoginVerifier.java | 51 +++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/minecraft/server/ThreadLoginVerifier.java diff --git a/src/main/java/net/minecraft/server/NetLoginHandler.java b/src/main/java/net/minecraft/server/NetLoginHandler.java index a980b479b5..f155254a57 100644 --- a/src/main/java/net/minecraft/server/NetLoginHandler.java +++ b/src/main/java/net/minecraft/server/NetLoginHandler.java @@ -21,6 +21,12 @@ public class NetLoginHandler extends NetHandler { this.b = new NetworkManager(socket, s, this); this.b.d = 0; } + + // CraftBukkit start + public Socket getSocket() { + return b.f; + } + // CraftBukkit end public void a() { if (this.h != null) { @@ -67,7 +73,7 @@ public class NetLoginHandler extends NetHandler { if (!this.e.l) { this.b(packet1login); } else { - (new ThreadLoginVerifier(this, packet1login)).start(); + (new ThreadLoginVerifier(this, packet1login, e.server)).start(); } } } diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java index df04dc7fd8..649de1d9e8 100644 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ b/src/main/java/net/minecraft/server/NetworkManager.java @@ -18,7 +18,7 @@ public class NetworkManager { public static int b; public static int c; private Object e = new Object(); - private Socket f; + public Socket f; // CraftBukkit private->public private final SocketAddress g; private DataInputStream h; private DataOutputStream i; diff --git a/src/main/java/net/minecraft/server/ThreadLoginVerifier.java b/src/main/java/net/minecraft/server/ThreadLoginVerifier.java new file mode 100644 index 0000000000..dd6850b714 --- /dev/null +++ b/src/main/java/net/minecraft/server/ThreadLoginVerifier.java @@ -0,0 +1,51 @@ +package net.minecraft.server; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLEncoder; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.event.player.PlayerPreLoginEvent; + +class ThreadLoginVerifier extends Thread { + + final Packet1Login a; + + final NetLoginHandler b; + + // CraftBukkit start + CraftServer server; + + ThreadLoginVerifier(NetLoginHandler netloginhandler, Packet1Login packet1login, CraftServer server) { + this.server = server; + // CraftBukkit end + this.b = netloginhandler; + this.a = packet1login; + } + + public void run() { + try { + String s = NetLoginHandler.a(this.b); + URL url = new URL("http://www.minecraft.net/game/checkserver.jsp?user=" + URLEncoder.encode(this.a.b, "UTF-8") + "&serverId=" + URLEncoder.encode(s, "UTF-8")); + BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(url.openStream())); + String s1 = bufferedreader.readLine(); + + bufferedreader.close(); + if (s1.equals("YES")) { + PlayerPreLoginEvent event = new PlayerPreLoginEvent(this.a.b, b.getSocket().getInetAddress()); + server.getPluginManager().callEvent(event); + + if (event.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { + this.b.a(event.getKickMessage()); + return; + } + + NetLoginHandler.a(this.b, this.a); + } else { + this.b.a("Failed to verify username!"); + } + } catch (Exception exception) { + exception.printStackTrace(); + } + } +}