From f16084fc2e0e85fb8629f661c2d1fd3e08718ba7 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Thu, 25 Apr 2024 19:42:35 +0200 Subject: [PATCH 1/3] Feat: Make connection data exposed in api less prone to throw errors --- .../connection/ConnectionRequestEvent.java | 26 +++++++++++++++++-- .../network/GeyserServerInitializer.java | 5 ---- .../geyser/session/GeyserSession.java | 14 +++++----- .../geyser/util/LoginEncryptionUtils.java | 4 +++ 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/api/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionRequestEvent.java b/api/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionRequestEvent.java index 5c1f4ef51e8..842f6199e88 100644 --- a/api/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionRequestEvent.java +++ b/api/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionRequestEvent.java @@ -50,8 +50,9 @@ public ConnectionRequestEvent(@NonNull InetSocketAddress ip, @Nullable InetSocke * The IP address of the client attempting to connect * * @return the IP address of the client attempting to connect + * @deprecated Use {@link #inetSocketAddress()} instead */ - @NonNull + @NonNull @Deprecated public InetSocketAddress getInetSocketAddress() { return ip; } @@ -60,12 +61,33 @@ public InetSocketAddress getInetSocketAddress() { * The IP address of the proxy handling the connection. It will return null if there is no proxy. * * @return the IP address of the proxy handling the connection + * @deprecated Use {@link #proxyIp()} instead */ - @Nullable + @Nullable @Deprecated public InetSocketAddress getProxyIp() { return proxyIp; } + /** + * The IP address of the client attempting to connect + * + * @return the IP address of the client attempting to connect + */ + @NonNull + public InetSocketAddress inetSocketAddress() { + return ip; + } + + /** + * The IP address of the proxy handling the connection. It will return null if there is no proxy. + * + * @return the IP address of the proxy handling the connection + */ + @Nullable + public InetSocketAddress proxyIp() { + return proxyIp; + } + /** * The cancel status of this event. If this event is cancelled, the connection will be rejected. * diff --git a/core/src/main/java/org/geysermc/geyser/network/GeyserServerInitializer.java b/core/src/main/java/org/geysermc/geyser/network/GeyserServerInitializer.java index 662e2f4c79c..5c83702ae0a 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GeyserServerInitializer.java +++ b/core/src/main/java/org/geysermc/geyser/network/GeyserServerInitializer.java @@ -25,11 +25,8 @@ package org.geysermc.geyser.network; -import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; import io.netty.channel.DefaultEventLoopGroup; -import io.netty.channel.SimpleChannelInboundHandler; import io.netty.util.concurrent.DefaultThreadFactory; import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.protocol.bedrock.BedrockPeer; @@ -37,7 +34,6 @@ import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec; import org.cloudburstmc.protocol.bedrock.netty.initializer.BedrockServerInitializer; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.api.event.bedrock.SessionInitializeEvent; import org.geysermc.geyser.session.GeyserSession; import java.net.InetSocketAddress; @@ -72,7 +68,6 @@ public void initSession(@NonNull BedrockServerSession bedrockServerSession) { channel.pipeline().addAfter(BedrockPacketCodec.NAME, InvalidPacketHandler.NAME, new InvalidPacketHandler(session)); bedrockServerSession.setPacketHandler(new UpstreamPacketHandler(this.geyser, session)); - this.geyser.eventBus().fire(new SessionInitializeEvent(session)); } catch (Throwable e) { // Error must be caught or it will be swallowed this.geyser.getLogger().error("Error occurred while initializing player!", e); diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 63022636c36..d23019faf9e 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -65,8 +65,6 @@ import io.netty.channel.EventLoop; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; @@ -1100,9 +1098,11 @@ public void disconnect(String reason) { if (!closed) { loggedIn = false; - // Fire SessionDisconnectEvent SessionDisconnectEvent disconnectEvent = new SessionDisconnectEvent(this, reason); - geyser.getEventBus().fire(disconnectEvent); + if (authData != null && clientData != null) { + // Fire SessionDisconnectEvent + geyser.getEventBus().fire(disconnectEvent); + } // Disconnect downstream if necessary if (downstream != null) { @@ -1427,7 +1427,7 @@ public void requestOffhandSwap() { @Override public String name() { - return null; + return this.isLoggedIn() ? this.javaUsername() : this.bedrockUsername(); } @Override @@ -1953,12 +1953,12 @@ public float getEyeHeight() { @Override public @MonotonicNonNull String javaUsername() { - return playerEntity.getUsername(); + return playerEntity != null ? playerEntity.getUsername() : null; } @Override public UUID javaUuid() { - return playerEntity.getUuid(); + return playerEntity != null ? playerEntity.getUuid() : null ; } @Override diff --git a/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java b/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java index 478a6ef962c..d7b851079fa 100644 --- a/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java @@ -40,6 +40,7 @@ import org.geysermc.cumulus.response.result.FormResponseResult; import org.geysermc.cumulus.response.result.ValidFormResponseResult; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.api.event.bedrock.SessionInitializeEvent; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.auth.AuthData; import org.geysermc.geyser.session.auth.BedrockClientData; @@ -100,6 +101,9 @@ private static void encryptConnectionWithCert(GeyserSession session, String clie sendEncryptionFailedMessage(geyser); } + + // Fire SessionInitializeEvent here as we now know the client data etc + geyser.eventBus().fire(new SessionInitializeEvent(session)); } catch (Exception ex) { session.disconnect("disconnectionScreen.internalError.cantConnect"); throw new RuntimeException("Unable to complete login", ex); From f229227cbcb66fec8e5d14cba0510f7494f49268 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Fri, 10 May 2024 15:00:23 +0200 Subject: [PATCH 2/3] address reviews --- .../geyser/api/event/connection/ConnectionRequestEvent.java | 4 ++-- .../org/geysermc/geyser/network/UpstreamPacketHandler.java | 4 ++++ .../main/java/org/geysermc/geyser/session/GeyserSession.java | 2 +- .../java/org/geysermc/geyser/util/LoginEncryptionUtils.java | 4 ---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionRequestEvent.java b/api/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionRequestEvent.java index 842f6199e88..b36ee8bfb27 100644 --- a/api/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionRequestEvent.java +++ b/api/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionRequestEvent.java @@ -52,7 +52,7 @@ public ConnectionRequestEvent(@NonNull InetSocketAddress ip, @Nullable InetSocke * @return the IP address of the client attempting to connect * @deprecated Use {@link #inetSocketAddress()} instead */ - @NonNull @Deprecated + @NonNull @Deprecated(forRemoval = true) public InetSocketAddress getInetSocketAddress() { return ip; } @@ -63,7 +63,7 @@ public InetSocketAddress getInetSocketAddress() { * @return the IP address of the proxy handling the connection * @deprecated Use {@link #proxyIp()} instead */ - @Nullable @Deprecated + @Nullable @Deprecated(forRemoval = true) public InetSocketAddress getProxyIp() { return proxyIp; } diff --git a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java index 59485b2cdd6..23ab1697f0c 100644 --- a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java @@ -54,6 +54,7 @@ import org.cloudburstmc.protocol.common.util.Zlib; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.api.event.bedrock.SessionInitializeEvent; import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.api.pack.PackCodec; import org.geysermc.geyser.api.pack.ResourcePack; @@ -188,6 +189,9 @@ public PacketSignal handle(LoginPacket loginPacket) { return PacketSignal.HANDLED; } + // Fire SessionInitializeEvent here as we now know the client data + geyser.eventBus().fire(new SessionInitializeEvent(session)); + PlayStatusPacket playStatus = new PlayStatusPacket(); playStatus.setStatus(PlayStatusPacket.Status.LOGIN_SUCCESS); session.sendUpstreamPacket(playStatus); diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index d23019faf9e..c5090e0418e 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -1427,7 +1427,7 @@ public void requestOffhandSwap() { @Override public String name() { - return this.isLoggedIn() ? this.javaUsername() : this.bedrockUsername(); + return this.playerEntity != null ? this.javaUsername() : this.bedrockUsername(); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java b/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java index d7b851079fa..478a6ef962c 100644 --- a/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/LoginEncryptionUtils.java @@ -40,7 +40,6 @@ import org.geysermc.cumulus.response.result.FormResponseResult; import org.geysermc.cumulus.response.result.ValidFormResponseResult; import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.api.event.bedrock.SessionInitializeEvent; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.auth.AuthData; import org.geysermc.geyser.session.auth.BedrockClientData; @@ -101,9 +100,6 @@ private static void encryptConnectionWithCert(GeyserSession session, String clie sendEncryptionFailedMessage(geyser); } - - // Fire SessionInitializeEvent here as we now know the client data etc - geyser.eventBus().fire(new SessionInitializeEvent(session)); } catch (Exception ex) { session.disconnect("disconnectionScreen.internalError.cantConnect"); throw new RuntimeException("Unable to complete login", ex); From a503816bf151e0d5f97b629f1096f54b9c9bf959 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Fri, 10 May 2024 23:53:05 +0200 Subject: [PATCH 3/3] review --- .../main/java/org/geysermc/geyser/session/GeyserSession.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index c5090e0418e..498112c4dc4 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -1099,7 +1099,7 @@ public void disconnect(String reason) { loggedIn = false; SessionDisconnectEvent disconnectEvent = new SessionDisconnectEvent(this, reason); - if (authData != null && clientData != null) { + if (authData != null && clientData != null) { // can occur if player disconnects before Bedrock auth finishes // Fire SessionDisconnectEvent geyser.getEventBus().fire(disconnectEvent); } @@ -1427,7 +1427,7 @@ public void requestOffhandSwap() { @Override public String name() { - return this.playerEntity != null ? this.javaUsername() : this.bedrockUsername(); + return playerEntity != null ? javaUsername() : bedrockUsername(); } @Override