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:
parent
79a2b22541
commit
55539fb80e
2 changed files with 57 additions and 84 deletions
core/src/main/java/org/geysermc/geyser
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue