mirror of
https://github.com/GeyserMC/GeyserConnect.git
synced 2025-06-26 14:15:22 +02:00
Bump to 2.0.2-SNAPSHOT and pending Microsoft auth integration
This commit is contained in:
parent
a185c05b44
commit
9a12e3d8a8
5 changed files with 67 additions and 27 deletions
8
pom.xml
8
pom.xml
|
@ -68,13 +68,7 @@
|
|||
<dependency>
|
||||
<groupId>org.geysermc</groupId>
|
||||
<artifactId>core</artifactId>
|
||||
<version>2.0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.nukkitx.network</groupId>
|
||||
<artifactId>raknet</artifactId>
|
||||
<version>1.6.26-20210217.205834-2</version>
|
||||
<scope>compile</scope>
|
||||
<version>2.0.2-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.minecrell</groupId>
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue