1
0
Fork 0
mirror of https://github.com/GeyserMC/Geyser.git synced 2025-03-23 23:39:29 +01:00

Commit what I had left

This commit is contained in:
Tim203 2025-03-18 19:43:04 +01:00
parent 79a2b22541
commit 55539fb80e
No known key found for this signature in database
2 changed files with 57 additions and 84 deletions
core/src/main/java/org/geysermc/geyser

View file

@ -33,6 +33,7 @@ import io.netty.channel.epoll.Epoll;
import io.netty.util.NettyRuntime;
import io.netty.util.concurrent.DefaultThreadFactory;
import io.netty.util.internal.SystemPropertyUtil;
import jakarta.validation.constraints.NotNull;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
@ -151,7 +152,7 @@ public class GeyserImpl implements GeyserApi, EventRegistrar {
private final SessionManager sessionManager = new SessionManager();
private final FloodgateProvider floodgateProvider;
private final @NotNull FloodgateProvider floodgateProvider;
private BedrockSkinUploader skinUploader;
private UnixSocketClientListener erosionUnixListener;

View file

@ -25,16 +25,13 @@
package org.geysermc.geyser.session;
import org.geysermc.floodgate.crypto.FloodgateCipher;
import org.geysermc.floodgate.util.BedrockData;
import org.geysermc.geyser.Constants;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.network.AuthType;
import org.geysermc.geyser.api.util.PlatformType;
import org.geysermc.geyser.floodgate.FloodgateProvider;
import org.geysermc.geyser.network.netty.LocalSession;
import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.session.auth.BedrockClientData;
import org.geysermc.geyser.skin.FloodgateSkinUploader;
import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.text.MinecraftLocale;
import org.geysermc.geyser.translator.text.MessageTranslator;
@ -55,107 +52,82 @@ import java.util.UUID;
public class GeyserSessionAdapter extends SessionAdapter {
private final GeyserImpl geyser;
private final GeyserSession geyserSession;
private final boolean floodgate;
private final GeyserSession session;
private final String locale;
public GeyserSessionAdapter(GeyserSession session) {
this.geyserSession = session;
this.floodgate = session.remoteServer().authType() == AuthType.FLOODGATE;
this.session = session;
this.geyser = GeyserImpl.getInstance();
this.locale = session.locale();
}
@Override
public void packetSending(PacketSendingEvent event) {
if (event.getPacket() instanceof ClientIntentionPacket) {
BedrockClientData clientData = geyserSession.getClientData();
String addressSuffix;
if (floodgate) {
byte[] encryptedData;
try {
FloodgateSkinUploader skinUploader = geyser.getSkinUploader();
FloodgateCipher cipher = geyser.getCipher();
String bedrockAddress = geyserSession.getUpstream().getAddress().getAddress().getHostAddress();
// both BungeeCord and Velocity remove the IPv6 scope (if there is one) for Spigot
int ipv6ScopeIndex = bedrockAddress.indexOf('%');
if (ipv6ScopeIndex != -1) {
bedrockAddress = bedrockAddress.substring(0, ipv6ScopeIndex);
}
encryptedData = cipher.encryptFromString(BedrockData.of(
clientData.getGameVersion(),
geyserSession.bedrockUsername(),
geyserSession.xuid(),
clientData.getDeviceOs().ordinal(),
clientData.getLanguageCode(),
clientData.getUiProfile().ordinal(),
clientData.getCurrentInputMode().ordinal(),
bedrockAddress,
skinUploader.getId(),
skinUploader.getVerifyCode()
).toString());
} catch (Exception e) {
geyser.getLogger().error(GeyserLocale.getLocaleStringLog("geyser.auth.floodgate.encrypt_fail"), e);
geyserSession.disconnect(GeyserLocale.getPlayerLocaleString("geyser.auth.floodgate.encrypt_fail", locale));
return;
}
addressSuffix = '\0' + new String(encryptedData, StandardCharsets.UTF_8);
} else {
addressSuffix = "";
}
ClientIntentionPacket intentionPacket = event.getPacket();
String address;
if (geyser.getConfig().getRemote().isForwardHost()) {
address = clientData.getServerAddress().split(":")[0];
} else {
address = intentionPacket.getHostname();
}
event.setPacket(intentionPacket.withHostname(address + addressSuffix));
if (!(event.getPacket() instanceof ClientIntentionPacket intention)) {
return;
}
String addedData;
// The provider is always present, also when Floodgate is not used
FloodgateProvider provider = geyser.getFloodgateProvider();
try {
addedData = provider.onClientIntention(session);
} catch (Exception exception) {
geyser.getLogger().error(GeyserLocale.getLocaleStringLog("geyser.auth.floodgate.encrypt_fail"), exception);
session.disconnect(GeyserLocale.getPlayerLocaleString("geyser.auth.floodgate.encryption_fail", locale));
return;
}
if (addedData != null) {
addedData = '\0' + addedData;
} else {
addedData = "";
}
String address;
if (geyser.getConfig().getRemote().isForwardHost()) {
address = session.getClientData().getServerAddress().split(":")[0];
} else {
address = intention.getHostname();
}
event.setPacket(intention.withHostname(address + addedData));
}
@Override
public void connected(ConnectedEvent event) {
geyserSession.loggingIn = false;
geyserSession.loggedIn = true;
session.loggingIn = false;
session.loggedIn = true;
if (geyserSession.getDownstream().getSession() instanceof LocalSession) {
if (session.getDownstream().getSession() instanceof LocalSession) {
// Connected directly to the server
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.remote.connect_internal",
geyserSession.bedrockUsername(), geyserSession.getProtocol().getProfile().getName()));
session.bedrockUsername(), session.getProtocol().getProfile().getName()));
} else {
// Connected to an IP address
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.remote.connect",
geyserSession.bedrockUsername(), geyserSession.getProtocol().getProfile().getName(), geyserSession.remoteServer().address()));
session.bedrockUsername(), session.getProtocol().getProfile().getName(), session.remoteServer().address()));
}
UUID uuid = geyserSession.getProtocol().getProfile().getId();
UUID uuid = session.getProtocol().getProfile().getId();
if (uuid == null) {
// Set what our UUID *probably* is going to be
if (geyserSession.remoteServer().authType() == AuthType.FLOODGATE) {
uuid = new UUID(0, Long.parseLong(geyserSession.xuid()));
if (session.remoteServer().authType() == AuthType.FLOODGATE) {
uuid = new UUID(0, Long.parseLong(session.xuid()));
} else {
uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + geyserSession.getProtocol().getProfile().getName()).getBytes(StandardCharsets.UTF_8));
uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + session.getProtocol().getProfile().getName()).getBytes(StandardCharsets.UTF_8));
}
}
geyserSession.getPlayerEntity().setUuid(uuid);
geyserSession.getPlayerEntity().setUsername(geyserSession.getProtocol().getProfile().getName());
session.getPlayerEntity().setUuid(uuid);
session.getPlayerEntity().setUsername(session.getProtocol().getProfile().getName());
String locale = geyserSession.getClientData().getLanguageCode();
String locale = session.getClientData().getLanguageCode();
// Let the user know there locale may take some time to download
// as it has to be extracted from a JAR
if (locale.equalsIgnoreCase("en_us") && !MinecraftLocale.LOCALE_MAPPINGS.containsKey("en_us")) {
// This should probably be left hardcoded as it will only show for en_us clients
geyserSession.sendMessage("Loading your locale (en_us); if this isn't already downloaded, this may take some time");
session.sendMessage("Loading your locale (en_us); if this isn't already downloaded, this may take some time");
}
// Download and load the language for the player
@ -164,12 +136,12 @@ public class GeyserSessionAdapter extends SessionAdapter {
@Override
public void disconnected(DisconnectedEvent event) {
geyserSession.loggingIn = false;
session.loggingIn = false;
String disconnectMessage, customDisconnectMessage = null;
Throwable cause = event.getCause();
if (cause instanceof UnexpectedEncryptionException) {
if (geyserSession.remoteServer().authType() != AuthType.FLOODGATE) {
if (session.remoteServer().authType() != AuthType.FLOODGATE) {
// Server expects online mode
customDisconnectMessage = GeyserLocale.getPlayerLocaleString("geyser.network.remote.authentication_type_mismatch", locale);
// Explain that they may be looking for Floodgate.
@ -192,12 +164,12 @@ public class GeyserSessionAdapter extends SessionAdapter {
}
// Use our helpful disconnect message whenever possible
disconnectMessage = customDisconnectMessage != null ? customDisconnectMessage : MessageTranslator.convertMessage(event.getReason());;
disconnectMessage = customDisconnectMessage != null ? customDisconnectMessage : MessageTranslator.convertMessage(event.getReason());
if (geyserSession.getDownstream().getSession() instanceof LocalSession) {
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.remote.disconnect_internal", geyserSession.bedrockUsername(), disconnectMessage));
if (session.getDownstream().getSession() instanceof LocalSession) {
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.remote.disconnect_internal", session.bedrockUsername(), disconnectMessage));
} else {
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.remote.disconnect", geyserSession.bedrockUsername(), geyserSession.remoteServer().address(), disconnectMessage));
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.remote.disconnect", session.bedrockUsername(), session.remoteServer().address(), disconnectMessage));
}
if (cause != null) {
if (cause.getMessage() != null) {
@ -209,24 +181,24 @@ public class GeyserSessionAdapter extends SessionAdapter {
cause.printStackTrace();
}
}
if ((!geyserSession.isClosed() && geyserSession.loggedIn) || cause != null) {
if ((!session.isClosed() && session.loggedIn) || cause != null) {
// GeyserSession is disconnected via session.disconnect() called indirectly be the server
// This needs to be "initiated" here when there is an exception, but also when the Netty connection
// is closed without a disconnect packet - in this case, closed will still be false, but loggedIn
// will also be true as GeyserSession#disconnect will not have been called.
if (customDisconnectMessage != null) {
geyserSession.disconnect(customDisconnectMessage);
session.disconnect(customDisconnectMessage);
} else {
geyserSession.disconnect(event.getReason());
session.disconnect(event.getReason());
}
}
geyserSession.loggedIn = false;
session.loggedIn = false;
}
@Override
public void packetReceived(Session session, Packet packet) {
Registries.JAVA_PACKET_TRANSLATORS.translate(packet.getClass(), packet, geyserSession, true);
Registries.JAVA_PACKET_TRANSLATORS.translate(packet.getClass(), packet, this.session, true);
}
@Override