diff --git a/pom.xml b/pom.xml
index d90f928..ed4f712 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,13 +68,7 @@
org.geysermc
core
- 2.0.1-SNAPSHOT
-
-
- com.nukkitx.network
- raknet
- 1.6.26-20210217.205834-2
- compile
+ 2.0.2-SNAPSHOT
net.minecrell
diff --git a/src/main/java/org/geysermc/connect/MasterServer.java b/src/main/java/org/geysermc/connect/MasterServer.java
index 65e0707..374ae96 100644
--- a/src/main/java/org/geysermc/connect/MasterServer.java
+++ b/src/main/java/org/geysermc/connect/MasterServer.java
@@ -39,14 +39,11 @@ import org.geysermc.geyser.network.MinecraftProtocol;
import org.geysermc.geyser.util.FileUtils;
import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.net.InetSocketAddress;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
-import java.util.function.Function;
import java.util.stream.Collectors;
public class MasterServer {
@@ -195,6 +192,7 @@ public class MasterServer {
this.geyserProxy = new GeyserProxyBootstrap();
geyserProxy.onEnable();
+ GeyserImpl.getInstance().getPendingMicrosoftAuthentication().setStoreServerInformation();
}
}
diff --git a/src/main/java/org/geysermc/connect/PacketHandler.java b/src/main/java/org/geysermc/connect/PacketHandler.java
index 45d9a85..597e381 100644
--- a/src/main/java/org/geysermc/connect/PacketHandler.java
+++ b/src/main/java/org/geysermc/connect/PacketHandler.java
@@ -43,6 +43,7 @@ import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler;
import com.nukkitx.protocol.bedrock.packet.*;
import com.nukkitx.protocol.bedrock.util.EncryptionUtils;
import com.nukkitx.protocol.bedrock.v471.Bedrock_v471;
+import org.geysermc.connect.proxy.GeyserProxySession;
import org.geysermc.connect.ui.FormID;
import org.geysermc.connect.ui.UIHandler;
import org.geysermc.connect.utils.GeyserConnectFileUtils;
@@ -52,10 +53,13 @@ import org.geysermc.cumulus.Form;
import org.geysermc.cumulus.response.CustomFormResponse;
import org.geysermc.cumulus.response.FormResponse;
import org.geysermc.cumulus.response.SimpleFormResponse;
+import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.entity.attribute.GeyserAttributeType;
import org.geysermc.geyser.network.MinecraftProtocol;
import org.geysermc.geyser.registry.Registries;
+import org.geysermc.geyser.session.PendingMicrosoftAuthentication.*;
import org.geysermc.geyser.session.auth.AuthData;
+import org.geysermc.geyser.session.auth.AuthType;
import org.geysermc.geyser.session.auth.BedrockClientData;
import org.geysermc.geyser.util.FileUtils;
@@ -210,7 +214,22 @@ public class PacketHandler implements BedrockPacketHandler {
switch (packet.getStatus()) {
case COMPLETED:
masterServer.getLogger().info("Logged in " + player.getAuthData().name() + " (" + player.getAuthData().xuid() + ", " + player.getAuthData().uuid() + ")");
- player.sendStartGame();
+
+ ProxyAuthenticationTask task = (ProxyAuthenticationTask) GeyserImpl.getInstance()
+ .getPendingMicrosoftAuthentication().getTask(player.getAuthData().xuid());
+ if (task != null && task.getAuthentication().isDone()) {
+ String address = task.getServer();
+ int port = task.getPort();
+ player.setCurrentServer(new Server(address, port, true, false));
+ GeyserProxySession session = player.createGeyserSession(false);
+ session.setRemoteAddress(address);
+ session.setRemotePort(port);
+ session.setRemoteAuthType(AuthType.ONLINE);
+
+ session.onMicrosoftLoginComplete(task);
+ } else {
+ player.sendStartGame();
+ }
break;
case HAVE_ALL_PACKS:
ResourcePackStackPacket stack = new ResourcePackStackPacket();
@@ -242,6 +261,11 @@ public class PacketHandler implements BedrockPacketHandler {
public boolean handle(SetLocalPlayerAsInitializedPacket packet) {
masterServer.getLogger().debug("Player initialized: " + player.getAuthData().name());
+ if (player.getCurrentServer() != null) {
+ // Player is already logged in via delayed Microsoft authentication
+ return false;
+ }
+
// Handle the virtual host if specified
GeyserConnectConfig.VirtualHostSection vhost = MasterServer.getInstance().getGeyserConnectConfig().getVhost();
if (vhost.isEnabled()) {
diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java
index b842023..192128d 100644
--- a/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java
+++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java
@@ -27,17 +27,34 @@ package org.geysermc.connect.proxy;
import com.nukkitx.protocol.bedrock.BedrockServerSession;
import io.netty.channel.EventLoop;
+import org.geysermc.connect.utils.Player;
+import org.geysermc.connect.utils.Server;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.session.GeyserSession;
+import org.geysermc.geyser.session.PendingMicrosoftAuthentication.*;
public class GeyserProxySession extends GeyserSession {
- public GeyserProxySession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop eventLoop) {
+ private final Player player;
+
+ public GeyserProxySession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop eventLoop, Player player, boolean initialized) {
super(geyser, bedrockServerSession, eventLoop);
- sentSpawnPacket = true;
+ sentSpawnPacket = initialized;
+ this.player = player;
}
@Override
protected void disableSrvResolving() {
// Do nothing
}
+
+ @Override
+ public void disconnect(String reason) {
+ ProxyAuthenticationTask task = (ProxyAuthenticationTask) getGeyser().getPendingMicrosoftAuthentication().getTask(this.xuid());
+ if (task != null) {
+ Server server = player.getCurrentServer();
+ task.setServer(server.getAddress());
+ task.setPort(server.getPort());
+ }
+ super.disconnect(reason);
+ }
}
diff --git a/src/main/java/org/geysermc/connect/utils/Player.java b/src/main/java/org/geysermc/connect/utils/Player.java
index af4e394..5b82e71 100644
--- a/src/main/java/org/geysermc/connect/utils/Player.java
+++ b/src/main/java/org/geysermc/connect/utils/Player.java
@@ -233,20 +233,7 @@ public class Player {
transferPacket.setPort(currentServer.getPort());
session.sendPacket(transferPacket);
} else {
- GeyserProxySession geyserSession = new GeyserProxySession(GeyserImpl.getInstance(), session, MasterServer.getInstance().getEventLoopGroup().next());
- session.setPacketHandler(new UpstreamPacketHandler(GeyserImpl.getInstance(), geyserSession));
- // The player will be tracked from Geyser from here
- MasterServer.getInstance().getPlayers().remove(this);
- GeyserImpl.getInstance().getSessionManager().addPendingSession(geyserSession);
-
- geyserSession.getUpstream().getSession().setPacketCodec(session.getPacketCodec());
-
- // Set the block translation based off of version
- geyserSession.setBlockMappings(BlockRegistries.BLOCKS.forVersion(session.getPacketCodec().getProtocolVersion()));
- geyserSession.setItemMappings(Registries.ITEMS.forVersion(session.getPacketCodec().getProtocolVersion()));
-
- geyserSession.setAuthData(authData);
- geyserSession.setClientData(clientData);
+ GeyserProxySession geyserSession = createGeyserSession(true);
geyserSession.setDimension(DimensionUtils.THE_END);
@@ -265,6 +252,26 @@ public class Player {
}
}
+ public GeyserProxySession createGeyserSession(boolean initialized) {
+ GeyserProxySession geyserSession = new GeyserProxySession(GeyserImpl.getInstance(), session,
+ MasterServer.getInstance().getEventLoopGroup().next(), this, initialized);
+ session.setPacketHandler(new UpstreamPacketHandler(GeyserImpl.getInstance(), geyserSession));
+ // The player will be tracked from Geyser from here
+ MasterServer.getInstance().getPlayers().remove(this);
+ GeyserImpl.getInstance().getSessionManager().addPendingSession(geyserSession);
+
+ geyserSession.getUpstream().getSession().setPacketCodec(session.getPacketCodec());
+
+ // Set the block translation based off of version
+ geyserSession.setBlockMappings(BlockRegistries.BLOCKS.forVersion(session.getPacketCodec().getProtocolVersion()));
+ geyserSession.setItemMappings(Registries.ITEMS.forVersion(session.getPacketCodec().getProtocolVersion()));
+
+ geyserSession.setAuthData(authData);
+ geyserSession.setClientData(clientData);
+
+ return geyserSession;
+ }
+
public void sendToServer(Server server) {
// Tell the user we are connecting them
// This wont show up in a lot of cases as the client connects quite quickly