Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
133cef037e | ||
|
|
bb7511d37f | ||
|
|
78666de764 | ||
|
|
0534b8eae8 | ||
|
|
1af7f1efde |
No files matched your search
+2
-2
@@ -26,7 +26,7 @@ plugins {
|
||||
// --
|
||||
// Variables
|
||||
// --
|
||||
version = '2.5.6'
|
||||
version = '2.7.0'
|
||||
group = 'net.tcpshield.tcpshield'
|
||||
archivesBaseName = 'TCPShield'
|
||||
|
||||
@@ -95,7 +95,7 @@ repositories {
|
||||
dependencies {
|
||||
// Bukkit
|
||||
compileOnly group: 'org.spigotmc', name: 'spigot-api', version: '1.11-R0.1-SNAPSHOT'
|
||||
compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.4.0'
|
||||
compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '5.1.0'
|
||||
|
||||
// Paper
|
||||
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.15.2-R0.1-SNAPSHOT'
|
||||
|
||||
@@ -14,6 +14,7 @@ import net.tcpshield.tcpshield.util.validation.timestamp.TimestampValidator;
|
||||
import net.tcpshield.tcpshield.util.validation.timestamp.impl.HTPDateTimestampValidator;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
@@ -66,12 +66,13 @@ public class BukkitConfig extends ConfigProvider {
|
||||
try {
|
||||
loadedConfiguration = YamlConfiguration.loadConfiguration(configFile);
|
||||
|
||||
checkNodes("only-allow-proxy-connections", "timestamp-validation", "debug-mode");
|
||||
checkNodes("only-allow-proxy-connections", "timestamp-validation", "debug-mode", "enable-geyser-support", "prefer-protocollib");
|
||||
|
||||
this.onlyProxy = loadedConfiguration.getBoolean("only-allow-proxy-connections");
|
||||
this.timestampValidationMode = loadedConfiguration.getString("timestamp-validation");
|
||||
this.doDebug = loadedConfiguration.getBoolean("debug-mode");
|
||||
this.geyser = loadedConfiguration.getBoolean("enable-geyser-support");
|
||||
this.preferProtocolLib = loadedConfiguration.getBoolean("prefer-protocollib");
|
||||
} catch (Exception e) {
|
||||
throw new ConfigLoadException(e);
|
||||
}
|
||||
|
||||
@@ -29,15 +29,16 @@ public class TCPShieldBukkit extends JavaPlugin implements TCPShieldPlugin {
|
||||
debugger = Debugger.createDebugger(this);
|
||||
packetHandler = new TCPShieldPacketHandler(this);
|
||||
|
||||
if (BukkitImplProvider.hasPaperEvent())
|
||||
bukkitImpl = new BukkitPaper(this);
|
||||
else {
|
||||
if (getServer().getPluginManager().getPlugin("ProtocolLib") == null) {
|
||||
getLogger().severe("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib.");
|
||||
return;
|
||||
}
|
||||
|
||||
// check force plib option -> paper -> plib -> error
|
||||
if (this.configProvider.preferProtocolLib() && getServer().getPluginManager().getPlugin("ProtocolLib") != null) {
|
||||
bukkitImpl = new BukkitProtocolLib(this);
|
||||
} else if (BukkitImplProvider.hasPaperEvent()) {
|
||||
bukkitImpl = new BukkitPaper(this);
|
||||
} else if (getServer().getPluginManager().getPlugin("ProtocolLib") != null) {
|
||||
bukkitImpl = new BukkitProtocolLib(this);
|
||||
} else {
|
||||
getLogger().severe("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib.");
|
||||
return;
|
||||
}
|
||||
|
||||
bukkitImpl.load();
|
||||
@@ -48,6 +49,7 @@ public class TCPShieldBukkit extends JavaPlugin implements TCPShieldPlugin {
|
||||
} catch (Exception e) {
|
||||
throw new InitializationException(e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ public class BukkitPaper extends BukkitImplProvider {
|
||||
super(bukkitPlugin);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
PaperHandshakeHandler packetHandler = new PaperHandshakeHandler(this);
|
||||
|
||||
+2
-1
@@ -19,7 +19,6 @@ public class PaperHandshakeHandler implements Listener {
|
||||
this.bukkitProvider = bukkitProvider;
|
||||
}
|
||||
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onHandshake(PlayerHandshakeEvent e) {
|
||||
PaperPacket packet = new PaperPacket(e);
|
||||
@@ -36,6 +35,8 @@ public class PaperHandshakeHandler implements Listener {
|
||||
public void onServerPing(PaperServerListPingEvent e) {
|
||||
if (e.getClient().isLegacy())
|
||||
e.setCancelled(true);
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,7 +15,6 @@ public class PaperPacket implements PacketProvider {
|
||||
this.handshakeEvent = handshakeEvent;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getPayloadString() {
|
||||
return handshakeEvent.getOriginalHandshake();
|
||||
|
||||
@@ -18,7 +18,6 @@ public class PaperPlayer implements PlayerProvider {
|
||||
this.handshakeEvent = handshakeEvent;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Trys to grab the UUID of the handshake
|
||||
* @return If found, the corrosponding uuid, if not, unknown
|
||||
@@ -58,7 +57,7 @@ public class PaperPlayer implements PlayerProvider {
|
||||
@Override
|
||||
public void disconnect() {
|
||||
handshakeEvent.setCancelled(false); // Caused issues with newer versions of Paper (Thanks https://github.com/realDragonium)
|
||||
handshakeEvent.setFailMessage("Connection failed. Please try again or contract an administrator.");
|
||||
handshakeEvent.setFailMessage("Connection failed. Please try again or contact an administrator.");
|
||||
handshakeEvent.setFailed(true);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ public class BukkitProtocolLib extends BukkitImplProvider {
|
||||
super(bukkitPlugin);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
ProtocolLibHandshakeHandler packetHandler = new ProtocolLibHandshakeHandler(this);
|
||||
|
||||
-1
@@ -19,7 +19,6 @@ public class ProtocolLibHandshakeHandler extends PacketAdapter {
|
||||
this.bukkitProvider = bukkitProvider;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPacketReceiving(PacketEvent e) {
|
||||
ProtocolLibPacket packet = new ProtocolLibPacket(e.getPacket());
|
||||
|
||||
-1
@@ -17,7 +17,6 @@ public class ProtocolLibPacket implements PacketProvider {
|
||||
this.rawPayload = packetContainer.getStrings().read(0);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getPayloadString() {
|
||||
return rawPayload;
|
||||
|
||||
+4
-5
@@ -1,7 +1,7 @@
|
||||
package net.tcpshield.tcpshield.bukkit.protocollib.handler;
|
||||
|
||||
import com.comphenix.protocol.injector.server.SocketInjector;
|
||||
import com.comphenix.protocol.injector.server.TemporaryPlayerFactory;
|
||||
import com.comphenix.protocol.injector.temporary.MinimalInjector;
|
||||
import com.comphenix.protocol.injector.temporary.TemporaryPlayerFactory;
|
||||
import net.tcpshield.tcpshield.provider.PlayerProvider;
|
||||
import net.tcpshield.tcpshield.util.ReflectionUtil;
|
||||
import net.tcpshield.tcpshield.util.exception.manipulate.PlayerManipulationException;
|
||||
@@ -34,7 +34,6 @@ public class ProtocolLibPlayer implements PlayerProvider {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private final Player player;
|
||||
private String ip;
|
||||
|
||||
@@ -72,13 +71,13 @@ public class ProtocolLibPlayer implements PlayerProvider {
|
||||
try {
|
||||
this.ip = ip.getAddress().getHostAddress();
|
||||
|
||||
SocketInjector ignored = TemporaryPlayerFactory.getInjectorFromPlayer(player);
|
||||
MinimalInjector ignored = TemporaryPlayerFactory.getInjectorFromPlayer(player);
|
||||
Object injector = ReflectionUtil.getObjectInPrivateField(ignored, "injector");
|
||||
Object networkManager = ReflectionUtil.getObjectInPrivateField(injector, "networkManager");
|
||||
|
||||
ReflectionUtil.setFinalField(networkManager, ReflectionUtil.searchFieldByClass(networkManager.getClass(), SocketAddress.class), ip);
|
||||
|
||||
Object channel = ReflectionUtil.getObjectInPrivateField(injector, "originalChannel");
|
||||
Object channel = ReflectionUtil.getObjectInPrivateField(injector, "wrappedChannel");
|
||||
ReflectionUtil.setFinalField(channel, ReflectionUtil.getDeclaredField(abstractChannelClass, "remoteAddress"), ip);
|
||||
} catch (Exception e) {
|
||||
throw new PlayerManipulationException(e);
|
||||
|
||||
@@ -19,16 +19,24 @@ public abstract class ConfigProvider {
|
||||
protected String timestampValidationMode = "htpdate";
|
||||
protected boolean doDebug = true; // Fail-safe default set to true
|
||||
protected boolean geyser = false;
|
||||
protected boolean velocityHandlePreLoginEvent = true;
|
||||
|
||||
// spigot/paper only option
|
||||
protected boolean preferProtocolLib;
|
||||
|
||||
protected File dataFolder;
|
||||
protected File configFile;
|
||||
|
||||
public boolean isOnlyProxy() {
|
||||
return onlyProxy;
|
||||
return this.onlyProxy;
|
||||
}
|
||||
|
||||
public boolean isGeyser() {
|
||||
return geyser;
|
||||
return this.geyser;
|
||||
}
|
||||
|
||||
public boolean handlePreLoginEvent() {
|
||||
return this.velocityHandlePreLoginEvent;
|
||||
}
|
||||
|
||||
public String getTimestampValidationMode() {
|
||||
@@ -36,7 +44,11 @@ public abstract class ConfigProvider {
|
||||
}
|
||||
|
||||
public boolean doDebug() {
|
||||
return doDebug;
|
||||
return this.doDebug;
|
||||
}
|
||||
|
||||
public boolean preferProtocolLib() {
|
||||
return this.preferProtocolLib;
|
||||
}
|
||||
|
||||
public File getDataFolder() {
|
||||
|
||||
@@ -65,12 +65,13 @@ public class VelocityConfig extends ConfigProvider {
|
||||
try {
|
||||
loadedToml = new Toml().read(configFile);
|
||||
|
||||
checkNodes("only-allow-proxy-connections", "timestamp-validation", "debug-mode");
|
||||
checkNodes("only-allow-proxy-connections", "timestamp-validation", "debug-mode", "enable-geyser-support", "pre-login-event");
|
||||
|
||||
this.onlyProxy = loadedToml.getBoolean("only-allow-proxy-connections");
|
||||
this.timestampValidationMode = loadedToml.getString("timestamp-validation");
|
||||
this.doDebug = loadedToml.getBoolean("debug-mode");
|
||||
this.geyser = loadedToml.getBoolean("enable-geyser-support");
|
||||
this.velocityHandlePreLoginEvent = loadedToml.getBoolean("pre-login-event");
|
||||
} catch (Exception e) {
|
||||
throw new ConfigLoadException(e);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,17 @@ public class VelocityHandshakeHandler {
|
||||
|
||||
private final TCPShieldPlugin plugin;
|
||||
|
||||
|
||||
private static Class<?> CONNECTED_PLAYER_CONNECTION_CLASS;
|
||||
|
||||
static {
|
||||
try {
|
||||
CONNECTED_PLAYER_CONNECTION_CLASS = Class.forName("com.velocitypowered.proxy.connection.client.ConnectedPlayer");
|
||||
} catch (Exception e) {
|
||||
// ignore for old velocity versions
|
||||
}
|
||||
}
|
||||
|
||||
public VelocityHandshakeHandler(TCPShieldPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
@@ -25,6 +36,10 @@ public class VelocityHandshakeHandler {
|
||||
// issues with the verification process.
|
||||
@Subscribe(order = PostOrder.FIRST)
|
||||
public void onPreLogin(PreLoginEvent e) {
|
||||
if (!this.plugin.getConfigProvider().handlePreLoginEvent()) {
|
||||
return;
|
||||
}
|
||||
|
||||
InboundConnection connection = e.getConnection();
|
||||
handleEvent(connection, "onPreLogin");
|
||||
}
|
||||
@@ -38,6 +53,12 @@ public class VelocityHandshakeHandler {
|
||||
@Subscribe(order = PostOrder.FIRST)
|
||||
public void onProxyPing(ProxyPingEvent e) {
|
||||
InboundConnection connection = e.getConnection();
|
||||
|
||||
if (connection.getClass() == CONNECTED_PLAYER_CONNECTION_CLASS) {
|
||||
// new ServerData (0x42) packet on connect, we don't care about it
|
||||
return;
|
||||
}
|
||||
|
||||
handleEvent(connection, "onProxyPing");
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,15 @@ public class VelocityPacket implements PacketProvider {
|
||||
Class<?> inboundConnection = Class.forName("com.velocitypowered.proxy.connection.client.InitialInboundConnection");
|
||||
|
||||
HANDSHAKE_FIELD = ReflectionUtil.getPrivateField(inboundConnection, "handshake");
|
||||
HOSTNAME_FIELD = ReflectionUtil.getPrivateField(Class.forName("com.velocitypowered.proxy.protocol.packet.Handshake"), "serverAddress");
|
||||
|
||||
Field hostnameField;
|
||||
try {
|
||||
hostnameField = ReflectionUtil.getPrivateField(Class.forName("com.velocitypowered.proxy.protocol.packet.HandshakePacket"), "serverAddress");
|
||||
} catch (Exception e) {
|
||||
hostnameField = ReflectionUtil.getPrivateField(Class.forName("com.velocitypowered.proxy.protocol.packet.Handshake"), "serverAddress");
|
||||
}
|
||||
HOSTNAME_FIELD = hostnameField;
|
||||
|
||||
CLEANED_ADDRESS_FIELD = ReflectionUtil.getPrivateField(inboundConnection, "cleanedAddress");
|
||||
} catch (Exception e) {
|
||||
throw new InitializationException(new ReflectionException(e));
|
||||
|
||||
@@ -4,7 +4,6 @@ import com.velocitypowered.api.proxy.InboundConnection;
|
||||
import net.tcpshield.tcpshield.provider.PlayerProvider;
|
||||
import net.tcpshield.tcpshield.util.ReflectionUtil;
|
||||
import net.tcpshield.tcpshield.util.exception.manipulate.PlayerManipulationException;
|
||||
import net.tcpshield.tcpshield.util.exception.phase.HandshakeException;
|
||||
import net.tcpshield.tcpshield.util.exception.phase.InitializationException;
|
||||
import net.tcpshield.tcpshield.util.exception.phase.ReflectionException;
|
||||
|
||||
@@ -27,6 +26,7 @@ public class VelocityPlayer implements PlayerProvider {
|
||||
private static final Method CLOSE_CHANNEL_METHOD;
|
||||
|
||||
// new velocity support
|
||||
|
||||
private static Class<?> LOGIN_INBOUND_CONNECTION_CLASS;
|
||||
private static Field LOGIN_INBOUND_CONNECTION_DELEGATE_FIELD;
|
||||
|
||||
@@ -149,7 +149,7 @@ public class VelocityPlayer implements PlayerProvider {
|
||||
}
|
||||
|
||||
enum ConnectionType {
|
||||
LOGIN_INBOUND, INITIAL_INBOUND, LEGACY;
|
||||
LOGIN_INBOUND, INITIAL_INBOUND, LEGACY
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
name: TCPShield
|
||||
version: 2.5.6
|
||||
version: 2.7.0
|
||||
main: net.tcpshield.tcpshield.bungee.TCPShieldBungee
|
||||
author: https://tcpshield.com
|
||||
softdepends:
|
||||
|
||||
@@ -9,3 +9,6 @@ debug-mode = false
|
||||
|
||||
# Toggle to enable support for Geyser/Floodgate v2
|
||||
enable-geyser-support = false
|
||||
|
||||
# enable handling handshake on PreLoginEvent
|
||||
pre-login-event = true
|
||||
@@ -9,3 +9,6 @@ debug-mode: false
|
||||
|
||||
# Toggle to enable support for Geyser/Floodgate v2
|
||||
enable-geyser-support: false
|
||||
|
||||
# Spigot/Paper option only, does not affect bungeecord
|
||||
prefer-protocollib: true
|
||||
@@ -1,5 +1,5 @@
|
||||
name: TCPShield
|
||||
version: 2.5.6
|
||||
version: 2.7.0
|
||||
main: net.tcpshield.tcpshield.bukkit.TCPShieldBukkit
|
||||
softdepend:
|
||||
- ProtocolLib
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "tcpshield",
|
||||
"name": "TCPShield",
|
||||
"version": "2.5.6",
|
||||
"version": "2.7.0",
|
||||
"description": "TCPShield IP parsing capabilities for Velocity",
|
||||
"authors": [
|
||||
"TCPShield"
|
||||
|
||||
Reference in new issue
Block a user