From 527b5e6f99323b5520379ad6dd6c40f69119a9f8 Mon Sep 17 00:00:00 2001 From: Myles Date: Sat, 1 Sep 2018 07:53:36 +0100 Subject: [PATCH 1/4] Allow disabling of auto-complete in 1.13 via disable-1_13-auto-complete in config #891 --- .../ViaVersion/bukkit/platform/BukkitConfigAPI.java | 5 +++++ .../ViaVersion/bungee/platform/BungeeConfigAPI.java | 5 +++++ .../us/myles/ViaVersion/api/ViaVersionConfig.java | 11 +++++++++-- .../protocol1_13to1_12_2/Protocol1_13To1_12_2.java | 4 ++++ .../src/main/resources/assets/viaversion/config.yml | 2 ++ .../ViaVersion/sponge/platform/SpongeConfigAPI.java | 5 +++++ 6 files changed, 30 insertions(+), 2 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java index c46b0e21d..9df2c3112 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitConfigAPI.java @@ -209,4 +209,9 @@ public class BukkitConfigAPI extends Config implements ViaVersionConfig { public boolean isSuppress1_13ConversionErrors() { return getBoolean("suppress-1_13-conversion-errors", false); } + + @Override + public boolean isDisable1_13AutoComplete() { + return getBoolean("disable-1_13-auto-complete", false); + } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java index 768dd7887..b2f71c6e4 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeConfigAPI.java @@ -262,4 +262,9 @@ public class BungeeConfigAPI extends Config implements ViaVersionConfig { public boolean isSuppress1_13ConversionErrors() { return getBoolean("suppress-1_13-conversion-errors", false); } + + @Override + public boolean isDisable1_13AutoComplete() { + return getBoolean("disable-1_13-auto-complete", false); + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java index cfba9fc1c..7ea5febe0 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java +++ b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java @@ -216,14 +216,14 @@ public interface ViaVersionConfig { * @return True if enabled */ boolean is1_13TeamColourFix(); - + /** * Should we fix shift quick move action for 1.12 clients * * @return True if enabled */ boolean is1_12QuickMoveActionFix(); - + /** * Get the blocked protocols * @@ -252,4 +252,11 @@ public interface ViaVersionConfig { * @return True if enabled */ boolean isSuppress1_13ConversionErrors(); + + /** + * Should we disable the 1.13 auto-complete feature to stop spam kicks? (for any server lower than 1.13) + * + * @return True if enabled + */ + boolean isDisable1_13AutoComplete(); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java index e41bdb500..381513d4c 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java @@ -536,6 +536,10 @@ public class Protocol1_13To1_12_2 extends Protocol { handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { + // Disable auto-complete if configured + if (Via.getConfig().isDisable1_13AutoComplete()) { + wrapper.cancel(); + } int tid = wrapper.read(Type.VAR_INT); // Save transaction id wrapper.user().get(TabCompleteTracker.class).setTransactionId(tid); diff --git a/common/src/main/resources/assets/viaversion/config.yml b/common/src/main/resources/assets/viaversion/config.yml index 22df7ea89..b657e1b53 100644 --- a/common/src/main/resources/assets/viaversion/config.yml +++ b/common/src/main/resources/assets/viaversion/config.yml @@ -90,6 +90,8 @@ quick-move-action-fix: false team-colour-fix: true # We warn when there's a error converting from pre-1.13 to 1.13, should we suppress these? (Only suggested if spamming) suppress-1_13-conversion-errors: false +# 1.13 introduced new auto complete which can trigger "Kicked for spamming" for servers older than 1.13, the following option will disable it completely. +disable-1_13-auto-complete: false # #----------------------------------------------------------# # 1.9 & 1.10 CLIENTS ON 1.8 SERVERS OPTIONS # diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java index 0acbc44b2..e22900614 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeConfigAPI.java @@ -215,4 +215,9 @@ public class SpongeConfigAPI extends Config implements ViaVersionConfig { public boolean isSuppress1_13ConversionErrors() { return getBoolean("suppress-1_13-conversion-errors", false); } + + @Override + public boolean isDisable1_13AutoComplete() { + return getBoolean("disable-1_13-auto-complete", false); + } } From 76296d8d4189354e970d6d8531b2fb284227c84f Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Mon, 10 Sep 2018 21:27:34 +0200 Subject: [PATCH 2/4] Part 1/2 generate PS Packet Listener --- .../bukkit/classgenerator/ClassGenerator.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java index 941989220..6069ef2e2 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java @@ -3,8 +3,18 @@ package us.myles.ViaVersion.bukkit.classgenerator; import javassist.*; import javassist.expr.ConstructorCall; import javassist.expr.ExprEditor; + +import java.lang.reflect.Method; +import java.util.Arrays; + import org.bukkit.Bukkit; +import org.bukkit.event.Event; +import org.bukkit.event.EventException; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.plugin.EventExecutor; import org.bukkit.plugin.Plugin; +import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.bukkit.handlers.BukkitDecodeHandler; import us.myles.ViaVersion.bukkit.handlers.BukkitEncodeHandler; @@ -13,6 +23,7 @@ import us.myles.ViaVersion.bukkit.util.NMSUtil; public class ClassGenerator { private static HandlerConstructor constructor = new BasicHandlerConstructor(); private static String psPackage = null; + private static Class psConnectListener; public static HandlerConstructor getConstructor() { return constructor; @@ -27,16 +38,20 @@ public class ClassGenerator { } if (ViaVersion.getInstance().isCompatSpigotBuild()) { + Bukkit.broadcastMessage("COMPAT SPIGOT"); Class decodeSuper = NMSUtil.nms("PacketDecoder"); Class encodeSuper = NMSUtil.nms("PacketEncoder"); // Generate the classes addSpigotCompatibility(pool, BukkitDecodeHandler.class, decodeSuper); addSpigotCompatibility(pool, BukkitEncodeHandler.class, encodeSuper); } else { + Bukkit.broadcastMessage("COMPAT PROTOCOLSUPPORT"); // ProtocolSupport compatibility Class encodeSuper; Class decodeSuper; if (isMultiplatformPS()) { + Bukkit.broadcastMessage("NEW PROTOCOLSUPPORT!"); + psConnectListener = makePSConnectListener(pool); return; } else { String psPackage = getOldPSPackage(); @@ -166,6 +181,82 @@ public class ClassGenerator { return null; } + private static Class makePSConnectListener(ClassPool pool) { + try { + // Reference classes + CtClass toExtend = pool.get("protocolsupport.api.Connection$PacketListener"); + CtClass connectListenerClazz = pool.makeClass("us.myles.ViaVersion.classgenerator.generated.ProtocolSupportConnectListener"); + connectListenerClazz.setSuperclass(toExtend); + // Import packages + pool.importPackage("java.util.Arrays"); + pool.importPackage("org.bukkit.Bukkit"); + pool.importPackage("us.myles.ViaVersion.api.protocol.ProtocolRegistry"); + pool.importPackage("protocolsupport.api.ProtocolVersion"); + pool.importPackage("protocolsupport.api.ProtocolType"); + pool.importPackage("protocolsupport.api.Connection"); + pool.importPackage("protocolsupport.api.Connection.PacketListener"); + pool.importPackage("protocolsupport.api.Connection.PacketListener.PacketEvent"); + pool.importPackage("protocolsupport.protocol.ConnectionImpl"); + pool.importPackage(NMSUtil.nms("PacketHandshakingInSetProtocol").getName()); + // Add connection reference field + connectListenerClazz.addField(CtField.make("private ConnectionImpl connection;", connectListenerClazz)); + // Bake constructor + connectListenerClazz.addConstructor(CtNewConstructor.make( + "public ProtocolSupportConnectListener (ConnectionImpl connection) {\n" + + " this.connection = connection;\n" + + "}", connectListenerClazz)); + // Add the listening method + connectListenerClazz.addMethod(CtNewMethod.make( + // On packet receive + "public void onPacketReceiving(protocolsupport.api.Connection.PacketListener.PacketEvent event) {\n" + // Check if we are getting handshake packet. + + " if (event.getPacket() instanceof PacketHandshakingInSetProtocol) {\n" + // Get protocol version. + + " int protoVersion = ((PacketHandshakingInSetProtocol) event.getPacket()).getProtocolVersion();\n" + // ViaVersion has at this point already spoofed the connectionversion. (Since it is higher up the pipeline) + // If via has put the protoVersion to the server we can spoof ProtocolSupport's version. + + " if (protoVersion == us.myles.ViaVersion.api.protocol.ProtocolRegistry.SERVER_PROTOCOL) {\n" + + " connection.setVersion(ProtocolVersion.getLatest(ProtocolType.PC));\n" + + " }\n" + + " }\n" + // Id version is not serverversion viaversion will not spoof. ProtocolSupport will handle the rest. + // In any case, remove the packet listener and wrap up. + + " connection.removePacketListener(this);\n" + + "}", connectListenerClazz)); + return connectListenerClazz.toClass(HandlerConstructor.class.getClassLoader()); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static void registerPSConnectListener(ViaVersionPlugin plugin) { + if (getPSConnectListener() != null) { + try { + Class connectionOpenEvent = (Class) Class.forName("protocolsupport.api.events.ConnectionOpenEvent"); + Bukkit.getPluginManager().registerEvent(connectionOpenEvent, new Listener() { }, EventPriority.HIGH, new EventExecutor() { + @Override + public void execute(Listener listener, Event event) throws EventException { + try { + Object connection = event.getClass().getMethod("getConnection").invoke(event); + Object connectListener = getPSConnectListener().getConstructor(connection.getClass()).newInstance(connection); + Method addConnectListener = connection.getClass().getMethod("addPacketListener", Class.forName("protocolsupport.api.Connection$PacketListener")); + addConnectListener.invoke(connection, connectListener); + } catch (Exception e) { + e.printStackTrace(); + } + } + }, plugin); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public static Class getPSConnectListener() { + return psConnectListener; + } + public static String getOldPSPackage() { if (psPackage == null) { try { From f6ae076731ee8d3b5161cad614de494b41ff944b Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Mon, 10 Sep 2018 21:29:27 +0200 Subject: [PATCH 3/4] Part 2/2 Import & register listener. --- .../myles/ViaVersion/bukkit/platform/BukkitViaLoader.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java index 26b82b6ab..1ab52ede5 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java @@ -18,6 +18,7 @@ import us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8.*; import us.myles.ViaVersion.bukkit.providers.BukkitInventoryQuickMoveProvider; import us.myles.ViaVersion.bukkit.providers.BukkitViaBulkChunkTranslator; import us.myles.ViaVersion.bukkit.providers.BukkitViaMovementTransmitter; +import us.myles.ViaVersion.bukkit.classgenerator.ClassGenerator; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InventoryQuickMoveProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; @@ -57,6 +58,9 @@ public class BukkitViaLoader implements ViaPlatformLoader { /* Base Protocol */ final ViaVersionPlugin plugin = (ViaVersionPlugin) Bukkit.getPluginManager().getPlugin("ViaVersion"); + // Add ProtocolSupport ConnectListener if necessary. + ClassGenerator.registerPSConnectListener(plugin); + registerListener(new Listener() { @EventHandler public void onPlayerQuit(PlayerQuitEvent e) { @@ -128,4 +132,4 @@ public class BukkitViaLoader implements ViaPlatformLoader { } tasks.clear(); } -} \ No newline at end of file +} From 0a8fc31be11e3f6404f87d00659f10d0e24c90b1 Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Mon, 10 Sep 2018 21:45:26 +0200 Subject: [PATCH 4/4] 3/2 Hopefully fix all the space thingies. --- .../bukkit/classgenerator/ClassGenerator.java | 64 +++++++++---------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java index 6069ef2e2..3fa4f3766 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/classgenerator/ClassGenerator.java @@ -38,20 +38,17 @@ public class ClassGenerator { } if (ViaVersion.getInstance().isCompatSpigotBuild()) { - Bukkit.broadcastMessage("COMPAT SPIGOT"); Class decodeSuper = NMSUtil.nms("PacketDecoder"); Class encodeSuper = NMSUtil.nms("PacketEncoder"); // Generate the classes addSpigotCompatibility(pool, BukkitDecodeHandler.class, decodeSuper); addSpigotCompatibility(pool, BukkitEncodeHandler.class, encodeSuper); } else { - Bukkit.broadcastMessage("COMPAT PROTOCOLSUPPORT"); // ProtocolSupport compatibility Class encodeSuper; Class decodeSuper; if (isMultiplatformPS()) { - Bukkit.broadcastMessage("NEW PROTOCOLSUPPORT!"); - psConnectListener = makePSConnectListener(pool); + psConnectListener = makePSConnectListener(pool); return; } else { String psPackage = getOldPSPackage(); @@ -182,14 +179,13 @@ public class ClassGenerator { } private static Class makePSConnectListener(ClassPool pool) { - try { - // Reference classes - CtClass toExtend = pool.get("protocolsupport.api.Connection$PacketListener"); + try { + // Reference classes + CtClass toExtend = pool.get("protocolsupport.api.Connection$PacketListener"); CtClass connectListenerClazz = pool.makeClass("us.myles.ViaVersion.classgenerator.generated.ProtocolSupportConnectListener"); connectListenerClazz.setSuperclass(toExtend); // Import packages pool.importPackage("java.util.Arrays"); - pool.importPackage("org.bukkit.Bukkit"); pool.importPackage("us.myles.ViaVersion.api.protocol.ProtocolRegistry"); pool.importPackage("protocolsupport.api.ProtocolVersion"); pool.importPackage("protocolsupport.api.ProtocolType"); @@ -202,38 +198,38 @@ public class ClassGenerator { connectListenerClazz.addField(CtField.make("private ConnectionImpl connection;", connectListenerClazz)); // Bake constructor connectListenerClazz.addConstructor(CtNewConstructor.make( - "public ProtocolSupportConnectListener (ConnectionImpl connection) {\n" - + " this.connection = connection;\n" - + "}", connectListenerClazz)); + "public ProtocolSupportConnectListener (ConnectionImpl connection) {\n" + + " this.connection = connection;\n" + + "}", connectListenerClazz)); // Add the listening method connectListenerClazz.addMethod(CtNewMethod.make( - // On packet receive - "public void onPacketReceiving(protocolsupport.api.Connection.PacketListener.PacketEvent event) {\n" - // Check if we are getting handshake packet. - + " if (event.getPacket() instanceof PacketHandshakingInSetProtocol) {\n" - // Get protocol version. - + " int protoVersion = ((PacketHandshakingInSetProtocol) event.getPacket()).getProtocolVersion();\n" - // ViaVersion has at this point already spoofed the connectionversion. (Since it is higher up the pipeline) - // If via has put the protoVersion to the server we can spoof ProtocolSupport's version. - + " if (protoVersion == us.myles.ViaVersion.api.protocol.ProtocolRegistry.SERVER_PROTOCOL) {\n" - + " connection.setVersion(ProtocolVersion.getLatest(ProtocolType.PC));\n" - + " }\n" - + " }\n" - // Id version is not serverversion viaversion will not spoof. ProtocolSupport will handle the rest. - // In any case, remove the packet listener and wrap up. - + " connection.removePacketListener(this);\n" - + "}", connectListenerClazz)); + // On packet receive + "public void onPacketReceiving(protocolsupport.api.Connection.PacketListener.PacketEvent event) {\n" + // Check if we are getting handshake packet. + + " if (event.getPacket() instanceof PacketHandshakingInSetProtocol) {\n" + // Get protocol version. + + " int protoVersion = ((PacketHandshakingInSetProtocol) event.getPacket()).getProtocolVersion();\n" + // ViaVersion has at this point already spoofed the connectionversion. (Since it is higher up the pipeline) + // If via has put the protoVersion to the server we can spoof ProtocolSupport's version. + + " if (protoVersion == us.myles.ViaVersion.api.protocol.ProtocolRegistry.SERVER_PROTOCOL) {\n" + + " connection.setVersion(ProtocolVersion.getLatest(ProtocolType.PC));\n" + + " }\n" + + " }\n" + // Id version is not serverversion viaversion will not spoof. ProtocolSupport will handle the rest. + // In any case, remove the packet listener and wrap up. + + " connection.removePacketListener(this);\n" + + "}", connectListenerClazz)); return connectListenerClazz.toClass(HandlerConstructor.class.getClassLoader()); - } catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } - return null; + return null; } public static void registerPSConnectListener(ViaVersionPlugin plugin) { if (getPSConnectListener() != null) { - try { - Class connectionOpenEvent = (Class) Class.forName("protocolsupport.api.events.ConnectionOpenEvent"); + try { + Class connectionOpenEvent = (Class) Class.forName("protocolsupport.api.events.ConnectionOpenEvent"); Bukkit.getPluginManager().registerEvent(connectionOpenEvent, new Listener() { }, EventPriority.HIGH, new EventExecutor() { @Override public void execute(Listener listener, Event event) throws EventException { @@ -243,18 +239,18 @@ public class ClassGenerator { Method addConnectListener = connection.getClass().getMethod("addPacketListener", Class.forName("protocolsupport.api.Connection$PacketListener")); addConnectListener.invoke(connection, connectListener); } catch (Exception e) { - e.printStackTrace(); + e.printStackTrace(); } } }, plugin); - } catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } } } public static Class getPSConnectListener() { - return psConnectListener; + return psConnectListener; } public static String getOldPSPackage() {