From 9a12e3d8a8d54190a6f7bc106dc4ae23093dd70c Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Mon, 28 Feb 2022 10:27:59 -0500 Subject: [PATCH] Bump to 2.0.2-SNAPSHOT and pending Microsoft auth integration --- pom.xml | 8 +---- .../org/geysermc/connect/MasterServer.java | 4 +-- .../org/geysermc/connect/PacketHandler.java | 26 +++++++++++++- .../connect/proxy/GeyserProxySession.java | 21 +++++++++-- .../org/geysermc/connect/utils/Player.java | 35 +++++++++++-------- 5 files changed, 67 insertions(+), 27 deletions(-) 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