<1.0.2> Fixed various handshake issues with EaglerXVelocity
This commit is contained in:
parent
b5fd4cc2aa
commit
79d0e232f6
Binary file not shown.
|
@ -23,7 +23,7 @@ public class EaglerXVelocityVersion {
|
||||||
public static final String PLUGIN_ID = "eaglerxvelocity";
|
public static final String PLUGIN_ID = "eaglerxvelocity";
|
||||||
public static final String NAME = "EaglercraftXVelocity";
|
public static final String NAME = "EaglercraftXVelocity";
|
||||||
public static final String DESCRIPTION = "Plugin to allow EaglercraftX 1.8 players to join your network, or allow EaglercraftX 1.8 players to use your network as a proxy to join other networks";
|
public static final String DESCRIPTION = "Plugin to allow EaglercraftX 1.8 players to join your network, or allow EaglercraftX 1.8 players to use your network as a proxy to join other networks";
|
||||||
public static final String VERSION = "1.0.1";
|
public static final String VERSION = "1.0.2";
|
||||||
public static final String[] AUTHORS = new String[] { "lax1dude", "ayunami2000" };
|
public static final String[] AUTHORS = new String[] { "lax1dude", "ayunami2000" };
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,7 @@ import io.netty.handler.timeout.WriteTimeoutHandler;
|
||||||
import io.netty.util.ReferenceCountUtil;
|
import io.netty.util.ReferenceCountUtil;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
import net.kyori.adventure.text.serializer.json.JSONComponentSerializer;
|
||||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||||
import net.kyori.adventure.translation.GlobalTranslator;
|
import net.kyori.adventure.translation.GlobalTranslator;
|
||||||
import net.lax1dude.eaglercraft.v1_8.plugin.gateway_velocity.EaglerXVelocity;
|
import net.lax1dude.eaglercraft.v1_8.plugin.gateway_velocity.EaglerXVelocity;
|
||||||
|
@ -101,6 +102,8 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
private static final Constructor<InitialInboundConnection> stupidConstructor;
|
private static final Constructor<InitialInboundConnection> stupidConstructor;
|
||||||
private static final Field remoteAddressField;
|
private static final Field remoteAddressField;
|
||||||
|
private static final Field stateField;
|
||||||
|
private static final Field protocolVersionField;
|
||||||
private static final Constructor<LoginInboundConnection> stupid2Constructor;
|
private static final Constructor<LoginInboundConnection> stupid2Constructor;
|
||||||
private static final Method loginEventFiredMethod;
|
private static final Method loginEventFiredMethod;
|
||||||
private static final Constructor<ConnectedPlayer> stupid3Constructor;
|
private static final Constructor<ConnectedPlayer> stupid3Constructor;
|
||||||
|
@ -113,6 +116,10 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
stupidConstructor.setAccessible(true);
|
stupidConstructor.setAccessible(true);
|
||||||
remoteAddressField = MinecraftConnection.class.getDeclaredField("remoteAddress");
|
remoteAddressField = MinecraftConnection.class.getDeclaredField("remoteAddress");
|
||||||
remoteAddressField.setAccessible(true);
|
remoteAddressField.setAccessible(true);
|
||||||
|
stateField = MinecraftConnection.class.getDeclaredField("state");
|
||||||
|
stateField.setAccessible(true);
|
||||||
|
protocolVersionField = MinecraftConnection.class.getDeclaredField("protocolVersion");
|
||||||
|
protocolVersionField.setAccessible(true);
|
||||||
stupid2Constructor = LoginInboundConnection.class.getDeclaredConstructor(InitialInboundConnection.class);
|
stupid2Constructor = LoginInboundConnection.class.getDeclaredConstructor(InitialInboundConnection.class);
|
||||||
stupid2Constructor.setAccessible(true);
|
stupid2Constructor.setAccessible(true);
|
||||||
loginEventFiredMethod = LoginInboundConnection.class.getDeclaredMethod("loginEventFired", Runnable.class);
|
loginEventFiredMethod = LoginInboundConnection.class.getDeclaredMethod("loginEventFired", Runnable.class);
|
||||||
|
@ -212,7 +219,6 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
if (i >= conf.getMaxPlayer()) {
|
if (i >= conf.getMaxPlayer()) {
|
||||||
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE, "Proxy is full")
|
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE, "Proxy is full")
|
||||||
.addListener(ChannelFutureListener.CLOSE);
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
connectionClosed = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -240,8 +246,8 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(loginRateLimit == RateLimitStatus.LOCKED_OUT) {
|
if(loginRateLimit == RateLimitStatus.LOCKED_OUT) {
|
||||||
ctx.close();
|
|
||||||
connectionClosed = true;
|
connectionClosed = true;
|
||||||
|
ctx.close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,7 +257,6 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
? HandshakePacketTypes.SERVER_ERROR_RATELIMIT_LOCKED
|
? HandshakePacketTypes.SERVER_ERROR_RATELIMIT_LOCKED
|
||||||
: HandshakePacketTypes.SERVER_ERROR_RATELIMIT_BLOCKED,
|
: HandshakePacketTypes.SERVER_ERROR_RATELIMIT_BLOCKED,
|
||||||
"Too many logins!").addListener(ChannelFutureListener.CLOSE);
|
"Too many logins!").addListener(ChannelFutureListener.CLOSE);
|
||||||
connectionClosed = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,6 +297,7 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
return;
|
return;
|
||||||
}else if(buffer.readUnsignedByte() != minecraftProtocolVersion) {
|
}else if(buffer.readUnsignedByte() != minecraftProtocolVersion) {
|
||||||
clientLoginState = HandshakePacketTypes.STATE_CLIENT_COMPLETE;
|
clientLoginState = HandshakePacketTypes.STATE_CLIENT_COMPLETE;
|
||||||
|
connectionClosed = true;
|
||||||
ByteBuf buf = Unpooled.buffer();
|
ByteBuf buf = Unpooled.buffer();
|
||||||
buf.writeByte(HandshakePacketTypes.PROTOCOL_VERSION_MISMATCH);
|
buf.writeByte(HandshakePacketTypes.PROTOCOL_VERSION_MISMATCH);
|
||||||
buf.writeByte(1);
|
buf.writeByte(1);
|
||||||
|
@ -365,6 +371,7 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
if(versMisMatch) {
|
if(versMisMatch) {
|
||||||
clientLoginState = HandshakePacketTypes.STATE_CLIENT_COMPLETE;
|
clientLoginState = HandshakePacketTypes.STATE_CLIENT_COMPLETE;
|
||||||
|
connectionClosed = true;
|
||||||
ByteBuf buf = Unpooled.buffer();
|
ByteBuf buf = Unpooled.buffer();
|
||||||
buf.writeByte(HandshakePacketTypes.PROTOCOL_VERSION_MISMATCH);
|
buf.writeByte(HandshakePacketTypes.PROTOCOL_VERSION_MISMATCH);
|
||||||
|
|
||||||
|
@ -610,7 +617,7 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
final VelocityServer bungee = EaglerXVelocity.proxy();
|
final VelocityServer bungee = EaglerXVelocity.proxy();
|
||||||
String usernameStr = clientUsername.toString();
|
String usernameStr = clientUsername.toString();
|
||||||
if (bungee.getPlayer(usernameStr).isPresent()) {
|
if (bungee.getPlayer(usernameStr).isPresent()) {
|
||||||
sendLoginDenied(ctx, LegacyComponentSerializer.legacySection().serialize(GlobalTranslator.render(Component.translatable("velocity.error.already-connected-proxy", NamedTextColor.RED), Locale.getDefault())))
|
sendLoginDenied(ctx, LegacyComponentSerializer.legacySection().serialize(GlobalTranslator.render(Component.translatable("velocity.error.already-connected-proxy"), Locale.getDefault())))
|
||||||
.addListener(ChannelFutureListener.CLOSE);
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -777,7 +784,7 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
final String usernameStr = clientUsername.toString();
|
final String usernameStr = clientUsername.toString();
|
||||||
if (bungee.getPlayer(usernameStr).isPresent()) {
|
if (bungee.getPlayer(usernameStr).isPresent()) {
|
||||||
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE,
|
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE,
|
||||||
LegacyComponentSerializer.legacySection().serialize(GlobalTranslator.render(Component.translatable("velocity.error.already-connected-proxy", NamedTextColor.RED), Locale.getDefault())))
|
LegacyComponentSerializer.legacySection().serialize(GlobalTranslator.render(Component.translatable("velocity.error.already-connected-proxy"), Locale.getDefault())))
|
||||||
.addListener(ChannelFutureListener.CLOSE);
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -790,9 +797,8 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
ProtocolVersion protocolVers = ProtocolVersion.getProtocolVersion(gameProtocolVersion);
|
ProtocolVersion protocolVers = ProtocolVersion.getProtocolVersion(gameProtocolVersion);
|
||||||
if(!protocolVers.isSupported()) {
|
if(!protocolVers.isSupported()) {
|
||||||
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE,
|
//TODO: localize somehow
|
||||||
"outdated_client")
|
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE, "Outdated Client!").addListener(ChannelFutureListener.CLOSE);
|
||||||
.addListener(ChannelFutureListener.CLOSE);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -804,29 +810,12 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
fakeHandshake.setServerAddress(hostName);
|
fakeHandshake.setServerAddress(hostName);
|
||||||
fakeHandshake.setPort(localAddress.getPort());
|
fakeHandshake.setPort(localAddress.getPort());
|
||||||
|
|
||||||
ChannelPipeline pp = ctx.channel().pipeline();
|
final MinecraftConnection con = new MinecraftConnection(ctx.channel(), bungee);
|
||||||
|
|
||||||
pp.remove(HttpWebSocketHandler.this);
|
|
||||||
|
|
||||||
pp
|
|
||||||
.addLast("EaglerMinecraftByteBufDecoder", new EaglerMinecraftDecoder())
|
|
||||||
.addLast(LEGACY_PING_DECODER, new LegacyPingDecoder())
|
|
||||||
.addLast(READ_TIMEOUT,
|
|
||||||
new ReadTimeoutHandler(bungee.getConfiguration().getReadTimeout(),
|
|
||||||
TimeUnit.MILLISECONDS))
|
|
||||||
.addLast("EaglerMinecraftByteBufEncoder", new EaglerMinecraftEncoder())
|
|
||||||
.addLast(LEGACY_PING_ENCODER, LegacyPingEncoder.INSTANCE)
|
|
||||||
.addLast(MINECRAFT_DECODER, new MinecraftDecoder(ProtocolUtils.Direction.SERVERBOUND))
|
|
||||||
.addLast(MINECRAFT_ENCODER, new MinecraftEncoder(ProtocolUtils.Direction.CLIENTBOUND));
|
|
||||||
|
|
||||||
MinecraftConnection con = new MinecraftConnection(ctx.channel(), bungee);
|
|
||||||
|
|
||||||
pp.addLast(Connections.HANDLER, con);
|
|
||||||
|
|
||||||
con.setProtocolVersion(protocolVers);
|
|
||||||
con.setState(StateRegistry.LOGIN);
|
|
||||||
try {
|
try {
|
||||||
remoteAddressField.set(con, baseAddress);
|
remoteAddressField.set(con, baseAddress);
|
||||||
|
stateField.set(con, StateRegistry.LOGIN);
|
||||||
|
protocolVersionField.set(con, protocolVers);
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
@ -835,13 +824,14 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
EaglerUpdateConfig updateconf = eaglerConf.getUpdateConfig();
|
EaglerUpdateConfig updateconf = eaglerConf.getUpdateConfig();
|
||||||
boolean blockUpdate = updateconf.isBlockAllClientUpdates();
|
boolean blockUpdate = updateconf.isBlockAllClientUpdates();
|
||||||
EaglerPlayerData.ClientCertificateHolder cert = null;
|
EaglerPlayerData.ClientCertificateHolder mycert = null;
|
||||||
if(!blockUpdate && !updateconf.isDiscardLoginPacketCerts()) {
|
if(!blockUpdate && !updateconf.isDiscardLoginPacketCerts()) {
|
||||||
byte[] b = profileData.get("update_cert_v1");
|
byte[] b = profileData.get("update_cert_v1");
|
||||||
if(b != null && b.length < 32759) {
|
if(b != null && b.length < 32759) {
|
||||||
EaglerUpdateSvc.sendCertificateToPlayers(EaglerUpdateSvc.tryMakeHolder(b));
|
EaglerUpdateSvc.sendCertificateToPlayers(mycert = EaglerUpdateSvc.tryMakeHolder(b));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final EaglerPlayerData.ClientCertificateHolder cert = mycert;
|
||||||
|
|
||||||
InitialInboundConnection inboundCon;
|
InitialInboundConnection inboundCon;
|
||||||
try {
|
try {
|
||||||
|
@ -851,18 +841,17 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bungee.getIpAttemptLimiter().attempt(baseAddress.getAddress())) {
|
if (!bungee.getIpAttemptLimiter().attempt(baseAddress.getAddress())) {
|
||||||
con.setState(StateRegistry.LOGIN);
|
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE,
|
||||||
inboundCon.disconnectQuietly(Component.translatable("velocity.error.logging-in-too-fast"));
|
LegacyComponentSerializer.legacySection().serialize(GlobalTranslator.render(Component.translatable("velocity.error.logging-in-too-fast", NamedTextColor.RED), Locale.getDefault())))
|
||||||
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
con.setState(StateRegistry.LOGIN);
|
|
||||||
|
|
||||||
if (bungee.getConfiguration().getPlayerInfoForwardingMode() == PlayerInfoForwarding.MODERN
|
if (bungee.getConfiguration().getPlayerInfoForwardingMode() == PlayerInfoForwarding.MODERN
|
||||||
&& protocolVers.lessThan(ProtocolVersion.MINECRAFT_1_13)) {
|
&& protocolVers.lessThan(ProtocolVersion.MINECRAFT_1_13)) {
|
||||||
con.setState(StateRegistry.LOGIN);
|
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE,
|
||||||
inboundCon.disconnectQuietly(
|
LegacyComponentSerializer.legacySection().serialize(GlobalTranslator.render(Component.translatable("velocity.error.modern-forwarding-needs-new-client", NamedTextColor.RED), Locale.getDefault())))
|
||||||
Component.translatable("velocity.error.modern-forwarding-needs-new-client"));
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -883,7 +872,9 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
PreLoginEvent.PreLoginComponentResult result = event1.getResult();
|
PreLoginEvent.PreLoginComponentResult result = event1.getResult();
|
||||||
Optional<Component> disconnectReason = result.getReasonComponent();
|
Optional<Component> disconnectReason = result.getReasonComponent();
|
||||||
if (disconnectReason.isPresent()) {
|
if (disconnectReason.isPresent()) {
|
||||||
lic.disconnect(disconnectReason.get());
|
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE,
|
||||||
|
JSONComponentSerializer.json().serialize(GlobalTranslator.render(disconnectReason.get(), Locale.getDefault())))
|
||||||
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -907,7 +898,25 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
return CompletableFuture.completedFuture(null);
|
return CompletableFuture.completedFuture(null);
|
||||||
} else {
|
} else {
|
||||||
GameProfile gp = profileEvent.getGameProfile();
|
GameProfile gp = profileEvent.getGameProfile();
|
||||||
|
if(eaglerConf.getEnableIsEaglerPlayerProperty()) {
|
||||||
|
gp = gp.addProperty(EaglerVelocityConfig.isEaglerProperty);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConnectedPlayer player;
|
||||||
|
try {
|
||||||
|
player = stupid3Constructor.newInstance(bungee, gp, con, lic.getVirtualHost().orElse(null), false, lic.getIdentifiedKey());
|
||||||
|
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
con.setAssociation(player);
|
||||||
|
|
||||||
|
if (!bungee.canRegisterConnection(player)) {
|
||||||
|
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE,
|
||||||
|
LegacyComponentSerializer.legacySection().serialize(GlobalTranslator.render(Component.translatable("velocity.error.already-connected-proxy"), Locale.getDefault())))
|
||||||
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
|
return CompletableFuture.completedFuture(null);
|
||||||
|
} else {
|
||||||
boolean doRegisterSkins = true;
|
boolean doRegisterSkins = true;
|
||||||
|
|
||||||
EaglercraftRegisterSkinEvent registerSkinEvent = bungee.getEventManager().fire(new EaglercraftRegisterSkinEvent(usernameStr, clientUUID)).join();
|
EaglercraftRegisterSkinEvent registerSkinEvent = bungee.getEventManager().fire(new EaglercraftRegisterSkinEvent(usernameStr, clientUUID)).join();
|
||||||
|
@ -1005,24 +1014,25 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
CapePackets.registerEaglerPlayerFallback(clientUUID, EaglerXVelocity.getEagler().getCapeService());
|
CapePackets.registerEaglerPlayerFallback(clientUUID, EaglerXVelocity.getEagler().getCapeService());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(eaglerConf.getEnableIsEaglerPlayerProperty()) {
|
|
||||||
gp = gp.addProperty(EaglerVelocityConfig.isEaglerProperty);
|
|
||||||
}
|
|
||||||
|
|
||||||
ConnectedPlayer player;
|
|
||||||
try {
|
|
||||||
player = stupid3Constructor.newInstance(bungee, gp, con, lic.getVirtualHost().orElse(null), false, lic.getIdentifiedKey());
|
|
||||||
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
if (!bungee.canRegisterConnection(player)) {
|
|
||||||
player.disconnect0(Component.translatable("velocity.error.already-connected-proxy", NamedTextColor.RED), true);
|
|
||||||
return CompletableFuture.completedFuture(null);
|
|
||||||
} else {
|
|
||||||
EaglerXVelocity.logger().info("{} has connected", player);
|
EaglerXVelocity.logger().info("{} has connected", player);
|
||||||
if(conf.getEnableVoiceChat()) {
|
if(conf.getEnableVoiceChat()) {
|
||||||
EaglerXVelocity.getEagler().getVoiceService().handlePlayerLoggedIn(player);
|
EaglerXVelocity.getEagler().getVoiceService().handlePlayerLoggedIn(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EaglerPlayerData epd = ctx.channel().attr(EaglerPipeline.CONNECTION_INSTANCE).get().eaglerData = new EaglerPlayerData(conf, ctx.channel().attr(EaglerPipeline.ORIGIN).get(), cert);
|
||||||
|
if(!blockUpdate) {
|
||||||
|
List<EaglerPlayerData.ClientCertificateHolder> set = EaglerUpdateSvc.getCertList();
|
||||||
|
synchronized(set) {
|
||||||
|
epd.certificatesToSend.addAll(set);
|
||||||
|
}
|
||||||
|
for (Player p : bungee.getAllPlayers()) {
|
||||||
|
EaglerPlayerData ppp = EaglerPipeline.getEaglerHandle(p);
|
||||||
|
if(ppp != null && ppp.clientCertificate != null && ppp.clientCertificate != cert) {
|
||||||
|
epd.certificatesToSend.add(ppp.clientCertificate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PermissionProvider prov;
|
PermissionProvider prov;
|
||||||
try {
|
try {
|
||||||
prov = (PermissionProvider) defaultPermissionsField.get(null);
|
prov = (PermissionProvider) defaultPermissionsField.get(null);
|
||||||
|
@ -1041,43 +1051,53 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
con.setAssociation(player);
|
|
||||||
EaglerPlayerData epd = ctx.channel().attr(EaglerPipeline.CONNECTION_INSTANCE).get().eaglerData = new EaglerPlayerData(conf, ctx.channel().attr(EaglerPipeline.ORIGIN).get(), cert);
|
|
||||||
if(!blockUpdate) {
|
|
||||||
List<EaglerPlayerData.ClientCertificateHolder> set = EaglerUpdateSvc.getCertList();
|
|
||||||
synchronized(set) {
|
|
||||||
epd.certificatesToSend.addAll(set);
|
|
||||||
}
|
|
||||||
for (Player p : bungee.getAllPlayers()) {
|
|
||||||
EaglerPlayerData ppp = EaglerPipeline.getEaglerHandle(p);
|
|
||||||
if(ppp != null && ppp.clientCertificate != null && ppp.clientCertificate != cert) {
|
|
||||||
epd.certificatesToSend.add(ppp.clientCertificate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bungee.getEventManager().fire(new LoginEvent(player)).thenAcceptAsync(event3 -> {
|
bungee.getEventManager().fire(new LoginEvent(player)).thenAcceptAsync(event3 -> {
|
||||||
if (con.isClosed()) {
|
if (con.isClosed()) {
|
||||||
// The player was disconnected
|
// The player was disconnected
|
||||||
bungee.getEventManager().fireAndForget(new DisconnectEvent(player,
|
bungee.getEventManager().fireAndForget(new DisconnectEvent(player, DisconnectEvent.LoginStatus.CANCELLED_BY_USER_BEFORE_COMPLETE));
|
||||||
DisconnectEvent.LoginStatus.CANCELLED_BY_USER_BEFORE_COMPLETE));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<Component> reason = event3.getResult().getReasonComponent();
|
Optional<Component> reason = event3.getResult().getReasonComponent();
|
||||||
if (reason.isPresent()) {
|
if (reason.isPresent()) {
|
||||||
player.disconnect0(reason.get(), true);
|
bungee.getEventManager().fireAndForget(new DisconnectEvent(player, DisconnectEvent.LoginStatus.CANCELLED_BY_PROXY));
|
||||||
|
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE,
|
||||||
|
JSONComponentSerializer.json().serialize(GlobalTranslator.render(reason.get(), Locale.getDefault())))
|
||||||
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
if (!bungee.registerConnection(player)) {
|
if (!bungee.registerConnection(player)) {
|
||||||
player.disconnect0(Component.translatable("velocity.error.already-connected-proxy"),
|
bungee.getEventManager().fireAndForget(new DisconnectEvent(player, DisconnectEvent.LoginStatus.CONFLICTING_LOGIN));
|
||||||
true);
|
sendErrorCode(ctx, HandshakePacketTypes.SERVER_ERROR_CUSTOM_MESSAGE,
|
||||||
|
LegacyComponentSerializer.legacySection().serialize(GlobalTranslator.render(Component.translatable("velocity.error.already-connected-proxy"), Locale.getDefault())))
|
||||||
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteBuf buf = Unpooled.buffer();
|
ByteBuf buf = Unpooled.buffer();
|
||||||
buf.writeByte(HandshakePacketTypes.PROTOCOL_SERVER_FINISH_LOGIN);
|
buf.writeByte(HandshakePacketTypes.PROTOCOL_SERVER_FINISH_LOGIN);
|
||||||
ctx.channel().writeAndFlush(buf).addListener(future -> {
|
ctx.channel().writeAndFlush(new BinaryWebSocketFrame(buf)).addListener(future -> {
|
||||||
|
ChannelPipeline pp = ctx.channel().pipeline();
|
||||||
|
|
||||||
|
pp.remove(HttpWebSocketHandler.this);
|
||||||
|
|
||||||
|
pp
|
||||||
|
.addLast("EaglerMinecraftByteBufDecoder", new EaglerMinecraftDecoder())
|
||||||
|
.addLast(LEGACY_PING_DECODER, new LegacyPingDecoder())
|
||||||
|
.addLast(READ_TIMEOUT,
|
||||||
|
new ReadTimeoutHandler(bungee.getConfiguration().getReadTimeout(),
|
||||||
|
TimeUnit.MILLISECONDS))
|
||||||
|
.addLast("EaglerMinecraftByteBufEncoder", new EaglerMinecraftEncoder())
|
||||||
|
.addLast(LEGACY_PING_ENCODER, LegacyPingEncoder.INSTANCE)
|
||||||
|
.addLast(MINECRAFT_DECODER, new MinecraftDecoder(ProtocolUtils.Direction.SERVERBOUND))
|
||||||
|
.addLast(MINECRAFT_ENCODER, new MinecraftEncoder(ProtocolUtils.Direction.CLIENTBOUND));
|
||||||
|
|
||||||
|
pp.addLast(Connections.HANDLER, con);
|
||||||
|
|
||||||
|
con.setProtocolVersion(protocolVers);
|
||||||
|
con.setState(StateRegistry.PLAY);
|
||||||
con.setActiveSessionHandler(StateRegistry.PLAY, stupid4Constructor.newInstance(player, bungee));
|
con.setActiveSessionHandler(StateRegistry.PLAY, stupid4Constructor.newInstance(player, bungee));
|
||||||
|
|
||||||
bungee.getEventManager().fire(new PostLoginEvent(player)).thenCompose((ignored) -> {
|
bungee.getEventManager().fire(new PostLoginEvent(player)).thenCompose((ignored) -> {
|
||||||
ctx.channel().attr(EaglerPipeline.CONNECTION_INSTANCE).get().hasBeenForwarded = true;
|
ctx.channel().attr(EaglerPipeline.CONNECTION_INSTANCE).get().hasBeenForwarded = true;
|
||||||
Optional<RegisteredServer> initialFromConfig = player.getNextServerToTry();
|
Optional<RegisteredServer> initialFromConfig = player.getNextServerToTry();
|
||||||
|
@ -1151,9 +1171,9 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
hasBinaryConnection = false;
|
hasBinaryConnection = false;
|
||||||
|
|
||||||
if(CommandConfirmCode.confirmHash != null && str.equalsIgnoreCase(CommandConfirmCode.confirmHash)) {
|
if(CommandConfirmCode.confirmHash != null && str.equalsIgnoreCase(CommandConfirmCode.confirmHash)) {
|
||||||
|
connectionClosed = true;
|
||||||
ctx.writeAndFlush(new TextWebSocketFrame("OK")).addListener(ChannelFutureListener.CLOSE);
|
ctx.writeAndFlush(new TextWebSocketFrame("OK")).addListener(ChannelFutureListener.CLOSE);
|
||||||
CommandConfirmCode.confirmHash = null;
|
CommandConfirmCode.confirmHash = null;
|
||||||
connectionClosed = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1178,17 +1198,17 @@ public class HttpWebSocketHandler extends ChannelInboundHandlerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(queryRateLimit == RateLimitStatus.LOCKED_OUT) {
|
if(queryRateLimit == RateLimitStatus.LOCKED_OUT) {
|
||||||
ctx.close();
|
|
||||||
connectionClosed = true;
|
connectionClosed = true;
|
||||||
|
ctx.close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(queryRateLimit != RateLimitStatus.OK) {
|
if(queryRateLimit != RateLimitStatus.OK) {
|
||||||
|
connectionClosed = true;
|
||||||
final RateLimitStatus rateLimitTypeFinal = queryRateLimit;
|
final RateLimitStatus rateLimitTypeFinal = queryRateLimit;
|
||||||
ctx.writeAndFlush(new TextWebSocketFrame(
|
ctx.writeAndFlush(new TextWebSocketFrame(
|
||||||
rateLimitTypeFinal == RateLimitStatus.LIMITED_NOW_LOCKED_OUT ? "{\"type\":\"locked\"}" : "{\"type\":\"blocked\"}"))
|
rateLimitTypeFinal == RateLimitStatus.LIMITED_NOW_LOCKED_OUT ? "{\"type\":\"locked\"}" : "{\"type\":\"blocked\"}"))
|
||||||
.addListener(ChannelFutureListener.CLOSE);
|
.addListener(ChannelFutureListener.CLOSE);
|
||||||
connectionClosed = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
{"id":"eaglerxvelocity","name":"EaglercraftXVelocity","version":"1.0.1","description":"Plugin to allow EaglercraftX 1.8 players to join your network, or allow EaglercraftX 1.8 players to use your network as a proxy to join other networks","authors":["lax1dude", "ayunami2000"],"dependencies":[],"main":"net.lax1dude.eaglercraft.v1_8.plugin.gateway_velocity.EaglerXVelocity"}
|
{"id":"eaglerxvelocity","name":"EaglercraftXVelocity","version":"1.0.2","description":"Plugin to allow EaglercraftX 1.8 players to join your network, or allow EaglercraftX 1.8 players to use your network as a proxy to join other networks","authors":["lax1dude", "ayunami2000"],"dependencies":[],"main":"net.lax1dude.eaglercraft.v1_8.plugin.gateway_velocity.EaglerXVelocity"}
|
|
@ -1 +1 @@
|
||||||
1.0.1
|
1.0.2
|
Loading…
Reference in New Issue
Block a user