From 6240ab1bd948a8462b44a216c76218bbfbc2486c Mon Sep 17 00:00:00 2001 From: md_5 Date: Wed, 18 Dec 2013 13:32:10 +1100 Subject: [PATCH] Fire PreLogin Events in Offline Mode diff --git a/src/main/java/net/minecraft/server/LoginListener.java b/src/main/java/net/minecraft/server/LoginListener.java index acc2f0b60..0cf9d4bde 100644 --- a/src/main/java/net/minecraft/server/LoginListener.java +++ b/src/main/java/net/minecraft/server/LoginListener.java @@ -93,10 +93,23 @@ public class LoginListener implements PacketLoginInListener, ITickable { } + // Spigot start + public void initUUID() + { + UUID uuid = EntityHuman.getOfflineUUID( this.i.getName() ); + + this.i = new GameProfile( uuid, this.i.getName() ); + } + // Spigot end + public void b() { + // Spigot start - Moved to initUUID + /* if (!this.i.isComplete()) { this.i = this.a(this.i); } + */ + // Spigot end // CraftBukkit start - fire PlayerLoginEvent EntityPlayer s = this.server.getPlayerList().attemptLogin(this, this.i, hostname); @@ -140,7 +153,22 @@ public class LoginListener implements PacketLoginInListener, ITickable { this.g = LoginListener.EnumProtocolState.KEY; this.networkManager.sendPacket(new PacketLoginOutEncryptionBegin("", this.server.G().getPublic(), this.e)); } else { - this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; + // Spigot start + new Thread("User Authenticator #" + LoginListener.b.incrementAndGet()) { + + @Override + public void run() { + try { + initUUID(); + new LoginHandler().fireEvents(); + LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; + } catch (Exception ex) { + disconnect("Failed to verify username!"); + server.server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + i.getName(), ex); + } + } + }.start(); + // Spigot end } } @@ -169,40 +197,7 @@ public class LoginListener implements PacketLoginInListener, ITickable { return; } - String playerName = i.getName(); - java.net.InetAddress address = ((java.net.InetSocketAddress) networkManager.getSocketAddress()).getAddress(); - java.util.UUID uniqueId = i.getId(); - final org.bukkit.craftbukkit.CraftServer server = LoginListener.this.server.server; - - AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); - server.getPluginManager().callEvent(asyncEvent); - - if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { - final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); - if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { - event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); - } - Waitable waitable = new Waitable() { - @Override - protected PlayerPreLoginEvent.Result evaluate() { - server.getPluginManager().callEvent(event); - return event.getResult(); - }}; - - LoginListener.this.server.processQueue.add(waitable); - if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { - disconnect(event.getKickMessage()); - return; - } - } else { - if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { - disconnect(asyncEvent.getKickMessage()); - return; - } - } - // CraftBukkit end - LoginListener.c.info("UUID of player {} is {}", LoginListener.this.i.getName(), LoginListener.this.i.getId()); - LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; + new LoginHandler().fireEvents(); } else if (LoginListener.this.server.J()) { LoginListener.c.warn("Failed to verify username but will let them in anyway!"); LoginListener.this.i = LoginListener.this.a(gameprofile); @@ -242,6 +237,48 @@ public class LoginListener implements PacketLoginInListener, ITickable { } } + // Spigot start + public class LoginHandler { + + public void fireEvents() throws Exception { + String playerName = i.getName(); + java.net.InetAddress address = ((java.net.InetSocketAddress) networkManager.getSocketAddress()).getAddress(); + java.util.UUID uniqueId = i.getId(); + final org.bukkit.craftbukkit.CraftServer server = LoginListener.this.server.server; + + AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); + server.getPluginManager().callEvent(asyncEvent); + + if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { + final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); + if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { + event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); + } + Waitable waitable = new Waitable() { + @Override + protected PlayerPreLoginEvent.Result evaluate() { + server.getPluginManager().callEvent(event); + return event.getResult(); + }}; + + LoginListener.this.server.processQueue.add(waitable); + if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { + disconnect(event.getKickMessage()); + return; + } + } else { + if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { + disconnect(asyncEvent.getKickMessage()); + return; + } + } + // CraftBukkit end + LoginListener.c.info("UUID of player {} is {}", LoginListener.this.i.getName(), LoginListener.this.i.getId()); + LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; + } + } + // Spigot end + public void a(PacketLoginInCustomPayload packetloginincustompayload) { this.disconnect(new ChatMessage("multiplayer.disconnect.unexpected_query_response", new Object[0])); } -- 2.17.1