Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
at develop 241 lines 11 kB view raw
1package net.minecraft.server; 2 3import com.projectposeidon.ConnectionType; 4import com.legacyminecraft.poseidon.PoseidonConfig; 5import com.legacyminecraft.poseidon.util.CrackedAllowlist; 6import com.projectposeidon.johnymuffin.LoginProcessHandler; 7 8import uk.betacraft.uberbukkit.Uberbukkit; 9import uk.betacraft.uberbukkit.protocol.Protocol; 10 11import org.bukkit.Bukkit; 12import org.bukkit.ChatColor; 13import org.bukkit.craftbukkit.CraftServer; 14 15import java.net.InetSocketAddress; 16import java.net.Socket; 17import java.util.Random; 18import java.util.logging.Logger; 19 20import static com.legacyminecraft.poseidon.util.Release2Beta.deserializeAddress; 21 22public class NetLoginHandler extends NetHandler { 23 24 public static Logger a = Logger.getLogger("Minecraft"); 25 private static Random d = new Random(); 26 public NetworkManager networkManager; 27 public boolean c = false; 28 private MinecraftServer server; 29 private int f = 0; 30 private String g = null; 31 private Packet1Login h = null; 32 private String serverId = ""; 33 private ConnectionType connectionType; 34 private boolean usingReleaseToBeta = false; //Poseidon -> Release2Beta support 35 private boolean receivedLoginPacket = false; 36 private int rawConnectionType; 37 private boolean receivedKeepAlive = false; 38 39 private final String msgKickShutdown; 40 41 public NetLoginHandler(MinecraftServer minecraftserver, Socket socket, String s) { 42 this.server = minecraftserver; 43 this.networkManager = new NetworkManager(socket, s, this); 44 this.networkManager.f = 0; 45 46 this.msgKickShutdown = PoseidonConfig.getInstance().getConfigString("message.kick.shutdown"); 47 } 48 49 // CraftBukkit start 50 public Socket getSocket() { 51 return this.networkManager.socket; 52 } 53 // CraftBukkit end 54 55 public void a() { 56 if (this.h != null) { 57 this.b(this.h); 58 this.h = null; 59 } 60 61 if (this.f++ == 600) { 62 this.disconnect("Took too long to log in"); 63 } else { 64 this.networkManager.b(); 65 } 66 } 67 68 public void disconnect(String s) { 69 try { 70 a.info("Disconnecting " + this.b() + ": " + s); 71 this.networkManager.queue(new Packet255KickDisconnect(s)); 72 this.networkManager.d(); 73 this.c = true; 74 } catch (Exception exception) { 75 exception.printStackTrace(); 76 } 77 } 78 79 public void a(Packet2Handshake packet2handshake) { 80 if (this.server.onlineMode && !CrackedAllowlist.get().contains(packet2handshake.a)) { 81 this.serverId = Long.toHexString(d.nextLong()); 82 this.networkManager.queue(new Packet2Handshake(this.serverId, packet2handshake.pvn11)); 83 } else { 84 this.networkManager.queue(new Packet2Handshake("-", packet2handshake.pvn11)); 85 } 86 } 87 88 public void a(Packet0KeepAlive packet0KeepAlive) { 89 receivedKeepAlive = true; 90 } 91 92 public void a(Packet1Login packet1login) { 93 if (receivedLoginPacket) { 94 this.disconnect("Multiple login packets received."); 95 return; 96 } 97 receivedLoginPacket = true; 98 this.g = packet1login.name; 99 100 this.networkManager.pvn = packet1login.pvn; // uberbukkit 101 102 // uberbukkit - account for b1.1_02's protocol version. assume b1.1_02 103 if (Uberbukkit.getTargetPVN() == 7 && this.networkManager.pvn == 8) this.networkManager.pvn = 7; 104 105 this.networkManager.protocol = Protocol.getProtocolClass(this.networkManager.pvn); 106 107 if (!Uberbukkit.getAllowedPVNs().contains(this.networkManager.pvn)) { 108 this.disconnect("Client version not allowed!"); 109 } else { 110 //Project Poseidon - Start (Release2Beta) 111 if (packet1login.d == (byte) -999 || packet1login.d == (byte) 25) { 112 connectionType = ConnectionType.RELEASE2BETA_OFFLINE_MODE_IP_FORWARDING; 113 } else if (packet1login.d == (byte) 26) { 114 connectionType = ConnectionType.RELEASE2BETA_ONLINE_MODE_IP_FORWARDING; 115 } else if (packet1login.d == (byte) 1) { 116 connectionType = ConnectionType.RELEASE2BETA; 117 } else if (packet1login.d == (byte) 2) { 118 connectionType = ConnectionType.BUNGEECORD_OFFLINE_MODE_IP_FORWARDING; 119 } else { 120 connectionType = ConnectionType.NORMAL; 121 } 122 rawConnectionType = packet1login.d; 123 //TODO: We need to find a better and cleaner way to support these different Beta proxies, Maybe a handler class??? 124 if ((Boolean) PoseidonConfig.getInstance().getConfigOption("settings.bungeecord.bungee-mode.enable") && !connectionType.equals(ConnectionType.BUNGEECORD_OFFLINE_MODE_IP_FORWARDING) && !connectionType.equals(ConnectionType.BUNGEECORD_ONLINE_MODE_IP_FORWARDING)) { 125 a.info(packet1login.name + " is not using BungeeCord, kicking the player."); 126 this.disconnect((String) PoseidonConfig.getInstance().getConfigOption("settings.bungeecord.bungee-mode.kick-message")); 127 return; 128 } 129 130 if (connectionType.equals(ConnectionType.RELEASE2BETA_OFFLINE_MODE_IP_FORWARDING) || connectionType.equals(ConnectionType.RELEASE2BETA_ONLINE_MODE_IP_FORWARDING) || connectionType.equals(ConnectionType.BUNGEECORD_OFFLINE_MODE_IP_FORWARDING) || connectionType.equals(ConnectionType.BUNGEECORD_ONLINE_MODE_IP_FORWARDING)) { 131 //Proxy has IP Forwarding enabled 132 if ((Boolean) PoseidonConfig.getInstance().getConfigOption("settings.release2beta.enable-ip-pass-through")) { 133 //IP Forwarding is enabled server side 134 if (this.getSocket().getInetAddress().getHostAddress().equalsIgnoreCase(String.valueOf(PoseidonConfig.getInstance().getConfigOption("settings.release2beta.proxy-ip", "127.0.0.1")))) { 135 //Release2Beta server is authorized - Override IP address 136 InetSocketAddress address = deserializeAddress(packet1login.c); 137 a.info(packet1login.name + " has been detected using Release2Beta, using the IP passed through: " + address.getAddress().getHostAddress()); 138 this.networkManager.setSocketAddress(address); 139 this.usingReleaseToBeta = true; 140 } else { 141 //Release2Beta server isn't authorized 142 a.info(packet1login.name + " is attempting to use a unauthorized Release2Beta server, kicking the player."); 143 this.disconnect(ChatColor.RED + "The Release2Beta server you are connecting through is unauthorized."); 144 return; 145 } 146 } else { 147 //Poseidon doesn't support IP Forwarding 148 a.info(packet1login.name + " is trying to connect through R2B with IP Forwarding enabled, however, it is disabled in Poseidon. Kicking player!"); 149 this.disconnect(ChatColor.RED + "IP Forwarding is disabled in Poseidon. Please disable in Release2Beta."); 150 return; 151 } 152 } 153 //Project Poseidon - End (Release2Beta 154 155 if (((CraftServer) Bukkit.getServer()).isShuttingdown()) { 156 this.disconnect(this.msgKickShutdown); 157 return; 158 } 159 160 161 new LoginProcessHandler(this, packet1login, this.server.server, this.server.onlineMode); 162 // (new ThreadLoginVerifier(this, packet1login, this.server.server)).start(); // CraftBukkit 163 // } 164 } 165 } 166 167 public void b(Packet1Login packet1login) { 168 EntityPlayer entityplayer = this.server.serverConfigurationManager.a(this, packet1login.name); 169 170 if (entityplayer != null) { 171 this.server.serverConfigurationManager.b(entityplayer); 172 // entityplayer.a((World) this.server.a(entityplayer.dimension)); // CraftBukkit - set by Entity 173 // CraftBukkit - add world and location to 'logged in' message. 174 a.info(this.b() + " logged in with entity id " + entityplayer.id + " at ([" + entityplayer.world.worldData.name + "] " + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); 175 WorldServer worldserver = (WorldServer) entityplayer.world; // CraftBukkit 176 ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); 177 NetServerHandler netserverhandler = new NetServerHandler(this.server, this.networkManager, entityplayer); 178 //Poseidon Start 179 netserverhandler.setUsingReleaseToBeta(usingReleaseToBeta); 180 netserverhandler.setConnectionType(connectionType); 181 netserverhandler.setRawConnectionType(rawConnectionType); 182 netserverhandler.setReceivedKeepAlive(receivedKeepAlive); 183 //Poseidon End 184 // uberbukkit 185 byte dim = (byte) worldserver.worldProvider.dimension; 186 if (this.networkManager.pvn < 12) { 187 dim = 0; 188 } 189 190 netserverhandler.sendPacket(new Packet1Login("", entityplayer.id, worldserver.getSeed(), dim)); 191 netserverhandler.sendPacket(new Packet6SpawnPosition(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z)); 192 this.server.serverConfigurationManager.a(entityplayer, worldserver); 193 // this.server.serverConfigurationManager.sendAll(new Packet3Chat("\u00A7e" + entityplayer.name + " joined the game.")); // CraftBukkit - message moved to join event 194 this.server.serverConfigurationManager.c(entityplayer); 195 netserverhandler.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); 196 this.server.networkListenThread.a(netserverhandler); 197 netserverhandler.sendPacket(new Packet4UpdateTime(entityplayer.getPlayerTime())); // CraftBukkit - add support for player specific time 198 entityplayer.syncInventory(); 199 } 200 201 this.c = true; 202 } 203 204 public void a(String s, Object[] aobject) { 205 a.info(this.b() + " lost connection"); 206 this.c = true; 207 } 208 209 public void a(Packet packet) { 210 this.disconnect("Protocol error"); 211 } 212 213 public String b() { 214 return this.g != null ? this.g + " [" + this.networkManager.getSocketAddress().toString() + "]" : this.networkManager.getSocketAddress().toString(); 215 } 216 217 //This can and will return null for multiple packets. 218 public String getUsername() { 219 return this.g; 220 } 221 222 public boolean c() { 223 return true; 224 } 225 226 /** 227 * @author moderator_man 228 * @returns the session id for this player 229 */ 230 public String getServerID() { 231 return serverId; 232 } 233 234 static String a(NetLoginHandler netloginhandler) { 235 return netloginhandler.serverId; 236 } 237 238 public static Packet1Login a(NetLoginHandler netloginhandler, Packet1Login packet1login) { 239 return netloginhandler.h = packet1login; 240 } 241}