mirror of https://github.com/PaperMC/Paper.git
126 lines
6.8 KiB
Diff
126 lines
6.8 KiB
Diff
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
|
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
|
@@ -39,6 +40,10 @@
|
|
import net.minecraft.world.entity.player.Player;
|
|
import org.apache.commons.lang3.Validate;
|
|
import org.slf4j.Logger;
|
|
+import org.bukkit.craftbukkit.util.Waitable;
|
|
+import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
|
|
+import org.bukkit.event.player.PlayerPreLoginEvent;
|
|
+// CraftBukkit end
|
|
|
|
public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, TickablePacketListener {
|
|
|
|
@@ -56,6 +61,7 @@
|
|
@Nullable
|
|
private GameProfile authenticatedProfile;
|
|
private final String serverId;
|
|
+ private ServerPlayer player; // CraftBukkit
|
|
|
|
public ServerLoginPacketListenerImpl(MinecraftServer minecraftserver, Connection connection) {
|
|
this.state = ServerLoginPacketListenerImpl.State.HELLO;
|
|
@@ -82,6 +87,13 @@
|
|
|
|
}
|
|
|
|
+ // CraftBukkit start
|
|
+ @Deprecated
|
|
+ public void disconnect(String s) {
|
|
+ disconnect(Component.literal(s));
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+
|
|
@Override
|
|
@Override
|
|
public boolean isAcceptingMessages() {
|
|
@@ -143,10 +152,12 @@
|
|
|
|
private void verifyLoginAndFinishConnectionSetup(GameProfile gameprofile) {
|
|
PlayerList playerlist = this.server.getPlayerList();
|
|
- Component component = playerlist.canPlayerLogin(this.connection.getRemoteAddress(), gameprofile);
|
|
+ // CraftBukkit start - fire PlayerLoginEvent
|
|
+ this.player = playerlist.canPlayerLogin(this, gameprofile); // CraftBukkit
|
|
|
|
- if (component != null) {
|
|
- this.disconnect(component);
|
|
+ if (this.player == null) {
|
|
+ // this.disconnect(ichatbasecomponent);
|
|
+ // CraftBukkit end
|
|
} else {
|
|
if (this.server.getCompressionThreshold() >= 0 && !this.connection.isMemoryConnection()) {
|
|
this.connection.send(new ClientboundLoginCompressionPacket(this.server.getCompressionThreshold()), PacketSendListener.thenRun(() -> {
|
|
@@ -154,7 +165,7 @@
|
|
}));
|
|
}
|
|
|
|
- boolean flag = playerlist.disconnectAllPlayersWithProfile(gameprofile);
|
|
+ boolean flag = playerlist.disconnectAllPlayersWithProfile(gameprofile, this.player); // CraftBukkit - add player reference
|
|
|
|
if (flag) {
|
|
this.state = ServerLoginPacketListenerImpl.State.WAITING_FOR_DUPE_DISCONNECT;
|
|
@@ -206,6 +215,43 @@
|
|
if (profileresult != null) {
|
|
GameProfile gameprofile = profileresult.profile();
|
|
|
|
+ // CraftBukkit start - fire PlayerPreLoginEvent
|
|
+ if (!connection.isConnected()) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ String playerName = gameprofile.getName();
|
|
+ java.net.InetAddress address = ((java.net.InetSocketAddress) connection.getRemoteAddress()).getAddress();
|
|
+ java.util.UUID uniqueId = gameprofile.getId();
|
|
+ final org.bukkit.craftbukkit.CraftServer server = ServerLoginPacketListenerImpl.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<PlayerPreLoginEvent.Result> waitable = new Waitable<PlayerPreLoginEvent.Result>() {
|
|
+ @Override
|
|
+ protected PlayerPreLoginEvent.Result evaluate() {
|
|
+ server.getPluginManager().callEvent(event);
|
|
+ return event.getResult();
|
|
+ }};
|
|
+
|
|
+ ServerLoginPacketListenerImpl.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
|
|
ServerLoginPacketListenerImpl.LOGGER.info("UUID of player {} is {}", gameprofile.getName(), gameprofile.getId());
|
|
ServerLoginPacketListenerImpl.this.startClientVerification(gameprofile);
|
|
} else if (ServerLoginPacketListenerImpl.this.server.isSingleplayer()) {
|
|
@@ -223,6 +269,11 @@
|
|
ServerLoginPacketListenerImpl.this.disconnect(Component.translatable("multiplayer.disconnect.authservers_down"));
|
|
ServerLoginPacketListenerImpl.LOGGER.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 " + s1, exception);
|
|
+ // CraftBukkit end
|
|
}
|
|
|
|
}
|
|
@@ -250,7 +299,7 @@
|
|
public void handleLoginAcknowledgement(ServerboundLoginAcknowledgedPacket serverboundloginacknowledgedpacket) {
|
|
Validate.validState(this.state == ServerLoginPacketListenerImpl.State.PROTOCOL_SWITCHING, "Unexpected login acknowledgement packet", new Object[0]);
|
|
CommonListenerCookie commonlistenercookie = CommonListenerCookie.createInitial((GameProfile) Objects.requireNonNull(this.authenticatedProfile));
|
|
- ServerConfigurationPacketListenerImpl serverconfigurationpacketlistenerimpl = new ServerConfigurationPacketListenerImpl(this.server, this.connection, commonlistenercookie);
|
|
+ ServerConfigurationPacketListenerImpl serverconfigurationpacketlistenerimpl = new ServerConfigurationPacketListenerImpl(this.server, this.connection, commonlistenercookie, this.player); // CraftBukkit
|
|
|
|
this.connection.setListener(serverconfigurationpacketlistenerimpl);
|
|
serverconfigurationpacketlistenerimpl.startConfiguration();
|