Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
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}