Skip to content

Commit 59bfd77

Browse files
authored
Ensure sessions are removed when a transfer packet is sent or they exit without the form (#86)
* Remove session usage in storage and server managers * Don't allow GC to start when Geyser auth-type is offline * Fix sessions still being held by Geyser when they are TransferPacket'ed to a bedrock server
1 parent 5d8ce6f commit 59bfd77

8 files changed

Lines changed: 45 additions & 43 deletions

File tree

src/main/java/org/geysermc/extension/connect/GeyserConnect.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,11 @@ public void onPostInitialize(GeyserPostInitializeEvent event) {
109109
this.logger().warning("Either `passthrough-motd` or `passthrough-player-counts` is enabled in the config, this will likely produce errors");
110110
}
111111

112-
// If we are using floodgate then disable the extension
113-
if (geyserInstance.getConfig().getRemote().authType() == AuthType.FLOODGATE) {
114-
this.logger().error("auth-type set to floodgate in the config, this will break GeyserConnect. Disabling!");
112+
// If we are using floodgate then disable the extension.
113+
// GeyserConnect also doesn't support the connection sequence that occurs when the default RemoteServer
114+
// auth-type is offline (and there is no reason to change it when GeyserConnect is in use).
115+
if (geyserInstance.getConfig().getRemote().authType() != AuthType.ONLINE) {
116+
this.logger().error("auth-type is not set to 'online' in the Geyser config, this will break GeyserConnect. Disabling!");
115117
this.disable();
116118
}
117119
}

src/main/java/org/geysermc/extension/connect/PacketHandler.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.geysermc.extension.connect.utils.ServerManager;
4040
import org.geysermc.extension.connect.utils.Utils;
4141
import org.geysermc.geyser.entity.attribute.GeyserAttributeType;
42-
import org.geysermc.geyser.level.JavaDimension;
4342
import org.geysermc.geyser.network.UpstreamPacketHandler;
4443
import org.geysermc.geyser.session.GeyserSession;
4544
import org.geysermc.geyser.util.DimensionUtils;
@@ -69,10 +68,10 @@ public PacketHandler(GeyserConnect geyserConnect, GeyserSession session, Bedrock
6968

7069
@Override
7170
public void onDisconnect(String reason) {
72-
if (session.getAuthData() != null) {
73-
geyserConnect.logger().info(Utils.displayName(session) + " has disconnected (" + reason + ")");
74-
ServerManager.unloadServers(session);
75-
}
71+
// The user has disconnected without having connected to an actual server. If they have connected to
72+
// a server (transfer packet or geyser proxy), then the original packet handler has been restored.
73+
ServerManager.unloadServers(session);
74+
originalPacketHandler.onDisconnect(reason);
7675
}
7776

7877
@Override
@@ -156,12 +155,12 @@ public PacketSignal handle(NetworkStackLatencyPacket packet) {
156155

157156
@Override
158157
public PacketSignal handle(ResourcePackClientResponsePacket packet) {
159-
return originalPacketHandler.handle(packet);
158+
return originalPacketHandler.handle(packet); // relies on state in the original handler
160159
}
161160

162161
@Override
163162
public PacketSignal handle(ResourcePackChunkRequestPacket packet) {
164-
return originalPacketHandler.handle(packet);
163+
return originalPacketHandler.handle(packet); // relies on state in the original handler
165164
}
166165
}
167166

src/main/java/org/geysermc/extension/connect/storage/AbstractSQLStorageManager.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.geysermc.extension.connect.utils.Server;
3131
import org.geysermc.extension.connect.utils.ServerManager;
3232
import org.geysermc.extension.connect.utils.Utils;
33-
import org.geysermc.geyser.session.GeyserSession;
3433

3534
import java.io.IOException;
3635
import java.sql.Connection;
@@ -69,23 +68,23 @@ public void closeStorage() {
6968
}
7069

7170
@Override
72-
public void saveServers(GeyserSession session) {
71+
public void saveServers(org.geysermc.api.connection.Connection session) {
7372
// replace into works on MySQL and SQLite
7473
try (PreparedStatement updatePlayersServers = connection.prepareStatement("REPLACE INTO players(xuid, servers) VALUES(?, ?)")) {
75-
updatePlayersServers.setString(1, session.getAuthData().xuid());
74+
updatePlayersServers.setString(1, session.xuid());
7675
updatePlayersServers.setString(2, Utils.OBJECT_MAPPER.writeValueAsString(ServerManager.getServers(session)));
7776
updatePlayersServers.executeUpdate();
7877
} catch (IOException | SQLException exception) {
79-
GeyserConnect.instance().logger().error("Couldn't save servers for " + session.getAuthData().name(), exception);
78+
GeyserConnect.instance().logger().error("Couldn't save servers for " + session.bedrockUsername(), exception);
8079
}
8180
}
8281

8382
@Override
84-
public List<Server> loadServers(GeyserSession session) {
83+
public List<Server> loadServers(org.geysermc.api.connection.Connection session) {
8584
List<Server> servers = new ArrayList<>();
8685

8786
try (PreparedStatement getPlayersServers = connection.prepareStatement("SELECT servers FROM players WHERE xuid=?")) {
88-
getPlayersServers.setString(1, session.getAuthData().xuid());
87+
getPlayersServers.setString(1, session.xuid());
8988
ResultSet rs = getPlayersServers.executeQuery();
9089

9190
while (rs.next()) {
@@ -96,7 +95,7 @@ public List<Server> loadServers(GeyserSession session) {
9695
}
9796
}
9897
} catch (IOException | SQLException exception) {
99-
GeyserConnect.instance().logger().error("Couldn't load servers for " + session.getAuthData().name(), exception);
98+
GeyserConnect.instance().logger().error("Couldn't load servers for " + session.bedrockUsername(), exception);
10099
}
101100

102101
return servers;

src/main/java/org/geysermc/extension/connect/storage/AbstractStorageManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
package org.geysermc.extension.connect.storage;
2727

2828
import com.fasterxml.jackson.annotation.JsonValue;
29+
import org.geysermc.api.connection.Connection;
2930
import org.geysermc.extension.connect.utils.Server;
30-
import org.geysermc.geyser.session.GeyserSession;
3131

3232
import java.util.ArrayList;
3333
import java.util.List;
@@ -40,10 +40,10 @@ public void setupStorage() {
4040
public void closeStorage() {
4141
}
4242

43-
public void saveServers(GeyserSession session) {
43+
public void saveServers(Connection session) {
4444
}
4545

46-
public List<Server> loadServers(GeyserSession session) {
46+
public List<Server> loadServers(Connection session) {
4747
return new ArrayList<>();
4848
}
4949

src/main/java/org/geysermc/extension/connect/storage/DisabledStorageManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525

2626
package org.geysermc.extension.connect.storage;
2727

28+
import org.geysermc.api.connection.Connection;
2829
import org.geysermc.extension.connect.utils.Server;
29-
import org.geysermc.geyser.session.GeyserSession;
3030

3131
import java.util.ArrayList;
3232
import java.util.List;
@@ -38,12 +38,12 @@ public void setupStorage() {
3838
}
3939

4040
@Override
41-
public void saveServers(GeyserSession session) {
41+
public void saveServers(Connection session) {
4242

4343
}
4444

4545
@Override
46-
public List<Server> loadServers(GeyserSession session) {
46+
public List<Server> loadServers(Connection session) {
4747
return new ArrayList<>();
4848
}
4949
}

src/main/java/org/geysermc/extension/connect/storage/JsonStorageManager.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
package org.geysermc.extension.connect.storage;
2727

2828
import com.fasterxml.jackson.core.type.TypeReference;
29+
import org.geysermc.api.connection.Connection;
2930
import org.geysermc.extension.connect.GeyserConnect;
3031
import org.geysermc.extension.connect.utils.Server;
3132
import org.geysermc.extension.connect.utils.ServerManager;
3233
import org.geysermc.extension.connect.utils.Utils;
33-
import org.geysermc.geyser.session.GeyserSession;
3434

3535
import java.io.IOException;
3636
import java.nio.file.Path;
@@ -49,19 +49,19 @@ public void setupStorage() {
4949
}
5050

5151
@Override
52-
public void saveServers(GeyserSession session) {
52+
public void saveServers(Connection session) {
5353
try {
54-
Utils.OBJECT_MAPPER.writeValue(dataFolder.resolve(session.getAuthData().xuid() + ".json").toFile(), ServerManager.getServers(session));
54+
Utils.OBJECT_MAPPER.writeValue(dataFolder.resolve(session.xuid() + ".json").toFile(), ServerManager.getServers(session));
5555
} catch (IOException ignored) {
5656
}
5757
}
5858

5959
@Override
60-
public List<Server> loadServers(GeyserSession session) {
60+
public List<Server> loadServers(Connection session) {
6161
List<Server> servers = new ArrayList<>();
6262

6363
try {
64-
List<Server> loadedServers = Utils.OBJECT_MAPPER.readValue(dataFolder.resolve(session.getAuthData().xuid() + ".json").toFile(), new TypeReference<>() {
64+
List<Server> loadedServers = Utils.OBJECT_MAPPER.readValue(dataFolder.resolve(session.xuid() + ".json").toFile(), new TypeReference<>() {
6565
});
6666
if (loadedServers != null) {
6767
servers.addAll(loadedServers);

src/main/java/org/geysermc/extension/connect/utils/ServerManager.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525

2626
package org.geysermc.extension.connect.utils;
2727

28+
import org.geysermc.api.connection.Connection;
2829
import org.geysermc.extension.connect.GeyserConnect;
29-
import org.geysermc.geyser.session.GeyserSession;
3030

3131
import java.util.HashMap;
3232
import java.util.List;
@@ -35,35 +35,35 @@
3535
public class ServerManager {
3636
private static final Map<String, List<Server>> servers = new HashMap<>();
3737

38-
public static void loadServers(GeyserSession session) {
38+
public static void loadServers(Connection session) {
3939
GeyserConnect.instance().logger().debug("Loading servers for " + Utils.displayName(session));
4040
servers.put(session.xuid(), GeyserConnect.instance().storageManager().loadServers(session));
4141
}
4242

43-
public static void unloadServers(GeyserSession session) {
43+
public static void unloadServers(Connection session) {
4444
if (getServers(session) == null) return;
4545
GeyserConnect.instance().logger().debug("Saving and unloading servers for " + Utils.displayName(session));
4646
GeyserConnect.instance().storageManager().saveServers(session);
4747
servers.remove(session.xuid());
4848
}
4949

50-
public static List<Server> getServers(GeyserSession session) {
50+
public static List<Server> getServers(Connection session) {
5151
return servers.get(session.xuid());
5252
}
5353

54-
public static void addServer(GeyserSession session, Server server) {
54+
public static void addServer(Connection session, Server server) {
5555
servers.get(session.xuid()).add(server);
5656
}
5757

58-
public static void removeServer(GeyserSession session, Server server) {
58+
public static void removeServer(Connection session, Server server) {
5959
getServers(session).remove(server);
6060
}
6161

62-
public static int getServerIndex(GeyserSession session, Server server) {
62+
public static int getServerIndex(Connection session, Server server) {
6363
return getServers(session).indexOf(server);
6464
}
6565

66-
public static void updateServer(GeyserSession session, int serverIndex, Server server) {
66+
public static void updateServer(Connection session, int serverIndex, Server server) {
6767
getServers(session).set(serverIndex, server);
6868
}
6969
}

src/main/java/org/geysermc/extension/connect/utils/Utils.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacketHandler;
3131
import org.cloudburstmc.protocol.bedrock.packet.SetLocalPlayerAsInitializedPacket;
3232
import org.cloudburstmc.protocol.bedrock.packet.TransferPacket;
33+
import org.geysermc.api.connection.Connection;
3334
import org.geysermc.extension.connect.GeyserConnect;
3435
import org.geysermc.geyser.session.GeyserSession;
3536

@@ -75,27 +76,28 @@ public static File fileOrCopiedFromResource(String fileName, String name) throws
7576
return file;
7677
}
7778

78-
public static String displayName(GeyserSession session) {
79+
public static String displayName(Connection session) {
7980
return session.bedrockUsername() + " (" + session.xuid() + ")";
8081
}
8182

8283
public static void sendToServer(GeyserSession session, BedrockPacketHandler originalPacketHandler, Server server) {
8384
GeyserConnect.instance().logger().info("Sending " + Utils.displayName(session) + " to " + server.title());
8485
GeyserConnect.instance().logger().debug(server.toString());
8586

87+
// Save the player's servers since we are changing packet handlers
88+
// (and they are going to disconnect if it is a bedrock server)
89+
ServerManager.unloadServers(session);
90+
91+
// Restore the original packet handler
92+
session.getUpstream().getSession().setPacketHandler(originalPacketHandler);
93+
8694
if (server.bedrock()) {
8795
// Send them to the bedrock server
8896
TransferPacket transferPacket = new TransferPacket();
8997
transferPacket.setAddress(server.address());
9098
transferPacket.setPort(server.port());
9199
session.sendUpstreamPacket(transferPacket);
92100
} else {
93-
// Save the players servers since we are changing packet handlers
94-
ServerManager.unloadServers(session);
95-
96-
// Restore the original packet handler
97-
session.getUpstream().getSession().setPacketHandler(originalPacketHandler);
98-
99101
// Set the remote server and un-initialize the session
100102
session.remoteServer(server);
101103
session.getUpstream().setInitialized(false);

0 commit comments

Comments
 (0)