#2420: Disable forge support by default

This commit is contained in:
md_5 2018-05-12 08:24:06 +10:00
parent fde2c3fadf
commit e93323ddbc
4 changed files with 61 additions and 48 deletions

View File

@ -268,9 +268,14 @@ public class BungeeCord extends ProxyServer
pluginManager.loadPlugins(); pluginManager.loadPlugins();
config.load(); config.load();
registerChannel( ForgeConstants.FML_TAG ); if ( config.isForgeSupport() )
registerChannel( ForgeConstants.FML_HANDSHAKE_TAG ); {
registerChannel( ForgeConstants.FORGE_REGISTER ); registerChannel( ForgeConstants.FML_TAG );
registerChannel( ForgeConstants.FML_HANDSHAKE_TAG );
registerChannel( ForgeConstants.FORGE_REGISTER );
getLogger().warning( "MinecraftForge support is currently unmaintained and may have unresolved issues. Please use at your own risk." );
}
isRunning = true; isRunning = true;

View File

@ -311,47 +311,49 @@ public class ServerConnector extends PacketHandler
@Override @Override
public void handle(PluginMessage pluginMessage) throws Exception public void handle(PluginMessage pluginMessage) throws Exception
{ {
if ( pluginMessage.getTag().equals( ForgeConstants.FML_REGISTER ) ) if ( BungeeCord.getInstance().config.isForgeSupport() )
{ {
Set<String> channels = ForgeUtils.readRegisteredChannels( pluginMessage ); if ( pluginMessage.getTag().equals( ForgeConstants.FML_REGISTER ) )
boolean isForgeServer = false;
for ( String channel : channels )
{ {
if ( channel.equals( ForgeConstants.FML_HANDSHAKE_TAG ) ) Set<String> channels = ForgeUtils.readRegisteredChannels( pluginMessage );
boolean isForgeServer = false;
for ( String channel : channels )
{ {
// If we have a completed handshake and we have been asked to register a FML|HS if ( channel.equals( ForgeConstants.FML_HANDSHAKE_TAG ) )
// packet, let's send the reset packet now. Then, we can continue the message sending.
// The handshake will not be complete if we reset this earlier.
if ( user.getServer() != null && user.getForgeClientHandler().isHandshakeComplete() )
{ {
user.getForgeClientHandler().resetHandshake(); // If we have a completed handshake and we have been asked to register a FML|HS
} // packet, let's send the reset packet now. Then, we can continue the message sending.
// The handshake will not be complete if we reset this earlier.
if ( user.getServer() != null && user.getForgeClientHandler().isHandshakeComplete() )
{
user.getForgeClientHandler().resetHandshake();
}
isForgeServer = true; isForgeServer = true;
break; break;
}
}
if ( isForgeServer && !this.handshakeHandler.isServerForge() )
{
// We now set the server-side handshake handler for the client to this.
handshakeHandler.setServerAsForgeServer();
user.setForgeServerHandler( handshakeHandler );
} }
} }
if ( isForgeServer && !this.handshakeHandler.isServerForge() ) if ( pluginMessage.getTag().equals( ForgeConstants.FML_HANDSHAKE_TAG ) || pluginMessage.getTag().equals( ForgeConstants.FORGE_REGISTER ) )
{ {
// We now set the server-side handshake handler for the client to this. this.handshakeHandler.handle( pluginMessage );
handshakeHandler.setServerAsForgeServer();
user.setForgeServerHandler( handshakeHandler ); // We send the message as part of the handler, so don't send it here.
throw CancelSendSignal.INSTANCE;
} }
} }
if ( pluginMessage.getTag().equals( ForgeConstants.FML_HANDSHAKE_TAG ) || pluginMessage.getTag().equals( ForgeConstants.FORGE_REGISTER ) ) // We have to forward these to the user, especially with Forge as stuff might break
{ // This includes any REGISTER messages we intercepted earlier.
this.handshakeHandler.handle( pluginMessage ); user.unsafe().sendPacket( pluginMessage );
// We send the message as part of the handler, so don't send it here.
throw CancelSendSignal.INSTANCE;
} else
{
// We have to forward these to the user, especially with Forge as stuff might break
// This includes any REGISTER messages we intercepted earlier.
user.unsafe().sendPacket( pluginMessage );
}
} }
@Override @Override

View File

@ -58,6 +58,7 @@ public class Configuration implements ProxyConfig
private Favicon favicon; private Favicon favicon;
private int compressionThreshold = 256; private int compressionThreshold = 256;
private boolean preventProxyConnections; private boolean preventProxyConnections;
private boolean forgeSupport;
public void load() public void load()
{ {
@ -86,6 +87,7 @@ public class Configuration implements ProxyConfig
ipForward = adapter.getBoolean( "ip_forward", ipForward ); ipForward = adapter.getBoolean( "ip_forward", ipForward );
compressionThreshold = adapter.getInt( "network_compression_threshold", compressionThreshold ); compressionThreshold = adapter.getInt( "network_compression_threshold", compressionThreshold );
preventProxyConnections = adapter.getBoolean( "prevent_proxy_connections", preventProxyConnections ); preventProxyConnections = adapter.getBoolean( "prevent_proxy_connections", preventProxyConnections );
forgeSupport = adapter.getBoolean( "forge_support", forgeSupport );
disabledCommands = new CaseInsensitiveSet( (Collection<String>) adapter.getList( "disabled_commands", Arrays.asList( "disabledcommandhere" ) ) ); disabledCommands = new CaseInsensitiveSet( (Collection<String>) adapter.getList( "disabled_commands", Arrays.asList( "disabledcommandhere" ) ) );

View File

@ -188,25 +188,29 @@ public class UpstreamBridge extends PacketHandler
{ {
throw CancelSendSignal.INSTANCE; throw CancelSendSignal.INSTANCE;
} }
// Hack around Forge race conditions
if ( pluginMessage.getTag().equals( "FML" ) && pluginMessage.getStream().readUnsignedByte() == 1 )
{
throw CancelSendSignal.INSTANCE;
}
// We handle forge handshake messages if forge support is enabled. if ( BungeeCord.getInstance().config.isForgeSupport() )
if ( pluginMessage.getTag().equals( ForgeConstants.FML_HANDSHAKE_TAG ) )
{ {
// Let our forge client handler deal with this packet. // Hack around Forge race conditions
con.getForgeClientHandler().handle( pluginMessage ); if ( pluginMessage.getTag().equals( "FML" ) && pluginMessage.getStream().readUnsignedByte() == 1 )
throw CancelSendSignal.INSTANCE; {
} throw CancelSendSignal.INSTANCE;
}
if ( con.getServer() != null && !con.getServer().isForgeServer() && pluginMessage.getData().length > Short.MAX_VALUE ) // We handle forge handshake messages if forge support is enabled.
{ if ( pluginMessage.getTag().equals( ForgeConstants.FML_HANDSHAKE_TAG ) )
// Drop the packet if the server is not a Forge server and the message was > 32kiB (as suggested by @jk-5) {
// Do this AFTER the mod list, so we get that even if the intial server isn't modded. // Let our forge client handler deal with this packet.
throw CancelSendSignal.INSTANCE; con.getForgeClientHandler().handle( pluginMessage );
throw CancelSendSignal.INSTANCE;
}
if ( con.getServer() != null && !con.getServer().isForgeServer() && pluginMessage.getData().length > Short.MAX_VALUE )
{
// Drop the packet if the server is not a Forge server and the message was > 32kiB (as suggested by @jk-5)
// Do this AFTER the mod list, so we get that even if the intial server isn't modded.
throw CancelSendSignal.INSTANCE;
}
} }
PluginMessageEvent event = new PluginMessageEvent( con, con.getServer(), pluginMessage.getTag(), pluginMessage.getData().clone() ); PluginMessageEvent event = new PluginMessageEvent( con, con.getServer(), pluginMessage.getTag(), pluginMessage.getData().clone() );