Bump to 2.0.2-SNAPSHOT and pending Microsoft auth integration

This commit is contained in:
Camotoy 2022-02-28 10:27:59 -05:00
parent a185c05b44
commit 9a12e3d8a8
No known key found for this signature in database
GPG key ID: 7EEFB66FE798081F
5 changed files with 67 additions and 27 deletions

View file

@ -68,13 +68,7 @@
<dependency> <dependency>
<groupId>org.geysermc</groupId> <groupId>org.geysermc</groupId>
<artifactId>core</artifactId> <artifactId>core</artifactId>
<version>2.0.1-SNAPSHOT</version> <version>2.0.2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.nukkitx.network</groupId>
<artifactId>raknet</artifactId>
<version>1.6.26-20210217.205834-2</version>
<scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.minecrell</groupId> <groupId>net.minecrell</groupId>

View file

@ -39,14 +39,11 @@ import org.geysermc.geyser.network.MinecraftProtocol;
import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.FileUtils;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.*; import java.util.*;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class MasterServer { public class MasterServer {
@ -195,6 +192,7 @@ public class MasterServer {
this.geyserProxy = new GeyserProxyBootstrap(); this.geyserProxy = new GeyserProxyBootstrap();
geyserProxy.onEnable(); geyserProxy.onEnable();
GeyserImpl.getInstance().getPendingMicrosoftAuthentication().setStoreServerInformation();
} }
} }

View file

@ -43,6 +43,7 @@ import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler;
import com.nukkitx.protocol.bedrock.packet.*; import com.nukkitx.protocol.bedrock.packet.*;
import com.nukkitx.protocol.bedrock.util.EncryptionUtils; import com.nukkitx.protocol.bedrock.util.EncryptionUtils;
import com.nukkitx.protocol.bedrock.v471.Bedrock_v471; 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.FormID;
import org.geysermc.connect.ui.UIHandler; import org.geysermc.connect.ui.UIHandler;
import org.geysermc.connect.utils.GeyserConnectFileUtils; 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.CustomFormResponse;
import org.geysermc.cumulus.response.FormResponse; import org.geysermc.cumulus.response.FormResponse;
import org.geysermc.cumulus.response.SimpleFormResponse; import org.geysermc.cumulus.response.SimpleFormResponse;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.entity.attribute.GeyserAttributeType; import org.geysermc.geyser.entity.attribute.GeyserAttributeType;
import org.geysermc.geyser.network.MinecraftProtocol; import org.geysermc.geyser.network.MinecraftProtocol;
import org.geysermc.geyser.registry.Registries; 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.AuthData;
import org.geysermc.geyser.session.auth.AuthType;
import org.geysermc.geyser.session.auth.BedrockClientData; import org.geysermc.geyser.session.auth.BedrockClientData;
import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.FileUtils;
@ -210,7 +214,22 @@ public class PacketHandler implements BedrockPacketHandler {
switch (packet.getStatus()) { switch (packet.getStatus()) {
case COMPLETED: case COMPLETED:
masterServer.getLogger().info("Logged in " + player.getAuthData().name() + " (" + player.getAuthData().xuid() + ", " + player.getAuthData().uuid() + ")"); 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; break;
case HAVE_ALL_PACKS: case HAVE_ALL_PACKS:
ResourcePackStackPacket stack = new ResourcePackStackPacket(); ResourcePackStackPacket stack = new ResourcePackStackPacket();
@ -242,6 +261,11 @@ public class PacketHandler implements BedrockPacketHandler {
public boolean handle(SetLocalPlayerAsInitializedPacket packet) { public boolean handle(SetLocalPlayerAsInitializedPacket packet) {
masterServer.getLogger().debug("Player initialized: " + player.getAuthData().name()); 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 // Handle the virtual host if specified
GeyserConnectConfig.VirtualHostSection vhost = MasterServer.getInstance().getGeyserConnectConfig().getVhost(); GeyserConnectConfig.VirtualHostSection vhost = MasterServer.getInstance().getGeyserConnectConfig().getVhost();
if (vhost.isEnabled()) { if (vhost.isEnabled()) {

View file

@ -27,17 +27,34 @@ package org.geysermc.connect.proxy;
import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.BedrockServerSession;
import io.netty.channel.EventLoop; 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.GeyserImpl;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.PendingMicrosoftAuthentication.*;
public class GeyserProxySession extends GeyserSession { 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); super(geyser, bedrockServerSession, eventLoop);
sentSpawnPacket = true; sentSpawnPacket = initialized;
this.player = player;
} }
@Override @Override
protected void disableSrvResolving() { protected void disableSrvResolving() {
// Do nothing // 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);
}
} }

View file

@ -233,20 +233,7 @@ public class Player {
transferPacket.setPort(currentServer.getPort()); transferPacket.setPort(currentServer.getPort());
session.sendPacket(transferPacket); session.sendPacket(transferPacket);
} else { } else {
GeyserProxySession geyserSession = new GeyserProxySession(GeyserImpl.getInstance(), session, MasterServer.getInstance().getEventLoopGroup().next()); GeyserProxySession geyserSession = createGeyserSession(true);
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);
geyserSession.setDimension(DimensionUtils.THE_END); 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) { public void sendToServer(Server server) {
// Tell the user we are connecting them // Tell the user we are connecting them
// This wont show up in a lot of cases as the client connects quite quickly // This wont show up in a lot of cases as the client connects quite quickly