From 375f19d5b86d8c2498918195a67c992259ffa5f6 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 3cca9ff..71d24b2 100644 --- a/src/main/java/net/minecraft/server/LoginListener.java +++ b/src/main/java/net/minecraft/server/LoginListener.java @@ -13,6 +13,7 @@ import java.util.Arrays; import java.util.Random; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; import javax.crypto.SecretKey; import org.apache.commons.lang3.Validate; import org.apache.logging.log4j.LogManager; @@ -80,10 +81,23 @@ public class LoginListener implements PacketLoginInListener, ITickable { } + // Spigot start + public void initUUID() + { + UUID uuid = UUID.nameUUIDFromBytes( ( "OfflinePlayer:" + this.i.getName() ).getBytes( Charsets.UTF_8 ) ); + + 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); @@ -133,7 +147,22 @@ public class LoginListener implements PacketLoginInListener, ITickable { this.g = LoginListener.EnumProtocolState.KEY; this.networkManager.sendPacket(new PacketLoginOutEncryptionBegin(this.j, this.server.O().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 } } @@ -162,6 +191,39 @@ public class LoginListener implements PacketLoginInListener, ITickable { return; } + new LoginHandler().fireEvents(); + } else if (LoginListener.this.server.R()) { + LoginListener.c.warn("Failed to verify username but will let them in anyway!"); + LoginListener.this.i = LoginListener.this.a(gameprofile); + LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; + } else { + LoginListener.this.disconnect("Failed to verify username!"); + LoginListener.c.error("Username \'" + gameprofile.getName() + "\' tried to join with an invalid session"); // CraftBukkit - fix null pointer + } + } catch (AuthenticationUnavailableException authenticationunavailableexception) { + if (LoginListener.this.server.R()) { + LoginListener.c.warn("Authentication servers are down but will let them in anyway!"); + LoginListener.this.i = LoginListener.this.a(gameprofile); + LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; + } else { + LoginListener.this.disconnect("Authentication servers are down. Please try again later, sorry!"); + LoginListener.c.error("Couldn\'t verify username because servers are unavailable"); + } + // CraftBukkit start - catch all exceptions + } catch (Exception exception) { + disconnect("Failed to verify username!"); + server.server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + gameprofile.getName(), exception); + // CraftBukkit end + } + } + }).start(); + } + } + + // 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(); @@ -196,34 +258,9 @@ public class LoginListener implements PacketLoginInListener, ITickable { // CraftBukkit end LoginListener.c.info("UUID of player " + LoginListener.this.i.getName() + " is " + LoginListener.this.i.getId()); LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; - } else if (LoginListener.this.server.R()) { - LoginListener.c.warn("Failed to verify username but will let them in anyway!"); - LoginListener.this.i = LoginListener.this.a(gameprofile); - LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; - } else { - LoginListener.this.disconnect("Failed to verify username!"); - LoginListener.c.error("Username \'" + gameprofile.getName() + "\' tried to join with an invalid session"); // CraftBukkit - fix null pointer - } - } catch (AuthenticationUnavailableException authenticationunavailableexception) { - if (LoginListener.this.server.R()) { - LoginListener.c.warn("Authentication servers are down but will let them in anyway!"); - LoginListener.this.i = LoginListener.this.a(gameprofile); - LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; - } else { - LoginListener.this.disconnect("Authentication servers are down. Please try again later, sorry!"); - LoginListener.c.error("Couldn\'t verify username because servers are unavailable"); - } - // CraftBukkit start - catch all exceptions - } catch (Exception exception) { - disconnect("Failed to verify username!"); - server.server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + gameprofile.getName(), exception); - // CraftBukkit end - } - } - }).start(); } - } + // Spigot end protected GameProfile a(GameProfile gameprofile) { UUID uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + gameprofile.getName()).getBytes(Charsets.UTF_8)); -- 2.5.0