Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,12 +6,13 @@ It also parses passed IP addresses so the server is aware of the real player IP

### Compatibility

TCPShield is compatible with Spigot / CraftBukkit, BungeeCordand Velocity.
TCPShield is compatible with Spigot / CraftBukkit, BungeeCord, Velocity and Fabric.

When using Spigot / CraftBukkit, [ProtocolLib](https://github.com/aadnk/ProtocolLib) needs to be installed.
This does not apply when using Paper 1.16 build #503 or higher.

### Setup
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/onboarding/tcpshield-plugin) guidelines.
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/config/tcpshield-plugin) guidelines.

### Compiling
In order to compile TCPShield, [install Gradle](https://docs.gradle.org/current/userguide/installation.html) and run the following command in the project folder:
Expand All@@ -29,4 +30,5 @@ See [Contact](https://docs.tcpshield.com/about-us)
These wonderful contributors have helped TCPShield make this plugin better!

* [Paul Zhang](https://github.com/paulzhng)
* [Draylar](https://github.com/Draylar)
* [RyanDeLap](https://github.com/RyanDeLap)
26 changes: 21 additions & 5 deletions build.gradle
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import org.yaml.snakeyaml.DumperOptions
Expand All@@ -18,6 +19,7 @@ buildscript {
plugins {
id 'java'
id 'idea'
id 'fabric-loom' version '0.6-SNAPSHOT'
}

repositories {
Expand All@@ -39,6 +41,12 @@ repositories {
maven {
url = 'https://repo.velocitypowered.com/snapshots/'
}
maven {
url = 'https://maven.fabricmc.net/'
}
flatDir {
dirs '/libs'
}
}

dependencies {
Expand All@@ -47,17 +55,24 @@ dependencies {
compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.4.0'

// Paper
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.15.2-R0.1-SNAPSHOT'
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.16.5-R0.1-20210227.144841-85'

// BungeeCord
compileOnly group: 'net.md-5', name: 'bungeecord-api', version: '1.14-SNAPSHOT'

// Velocity
compileOnly group: 'com.velocitypowered', name: 'velocity-api', version: '1.0.0-SNAPSHOT'

// Fabric
minecraft "com.mojang:minecraft:1.16.5"
mappings "net.fabricmc:yarn:1.16.5+build.5:v2"
modImplementation group: 'net.fabricmc', name: 'fabric-loader', version: '0.11.2'

// Testing
testImplementation group: 'org.junit.jupiter', name:'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version:'5.7.0-M1'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.7.0-M1'

compileOnly 'org.geyser:floodgate-spigot:2.0'
}

test {
Expand All@@ -68,7 +83,7 @@ configurations {
testImplementation.extendsFrom compileOnly
}

version = '2.4'
version = '2.5'
group = 'net.tcpshield.tcpshield'
archivesBaseName = 'TCPShield'

Expand DownExpand Up@@ -133,6 +148,7 @@ void updateYaml() {
}

void updateJson() {
def gson = new GsonBuilder().setPrettyPrinting().create();
def velocityJson = new File('src/main/resources/velocity-plugin.json')

def files = [velocityJson]
Expand All@@ -143,7 +159,7 @@ void updateJson() {
object.addProperty("version", version.toString())

new FileWriter(file).withCloseable { writer ->
writer.write(object.toString())
writer.write(gson.toJson(object))
}
}
}
Expand Down
Binary file addedlibs/floodgate-spigot.jar
Binary file not shown.
10 changes: 10 additions & 0 deletions settings.gradle
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
gradlePluginPortal()
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,8 +35,8 @@ public void onHandshake(IPacket packet, IPlayer player) {
InetAddress inetAddress = InetAddress.getByName(player.getIP());
if (!ipValidation.validateIP(inetAddress)) throw new InvalidIPException();

if (rawPayload == null)
return; // raw payload is passed when it's not available -> e.g. Paper server list ping events
// raw payload is passed when it's not available -> e.g. Paper server list ping events
if (rawPayload == null) return;

String extraData = null;

Expand DownExpand Up@@ -69,7 +69,7 @@ public void onHandshake(IPacket packet, IPlayer player) {
} catch (InvalidIPException e) {
handleInvalidIPException(player, rawPayload);
} catch (IPModificationFailureException e) {
this.logger.warning(String.format("%s[%s/%s]'s IP failed to be modified. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s's IP failed to be modified. Raw payload = \"%s\"", player.getIP(), rawPayload));
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
Expand All@@ -78,11 +78,16 @@ public void onHandshake(IPacket packet, IPlayer player) {

private void handleInvalidIPException(IPlayer player, String rawPayload) {
if (config.isDebug()) {
this.logger.warning(String.format("%s[%s/%s] was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getIP(), rawPayload));
}

if (config.isOnlyProxy()) {
player.disconnect();
}
}

public TCPShieldConfig getConfig() {
return config;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,10 +6,6 @@

public interface IPlayer {

String getUUID();

String getName();

String getIP();

void setIP(InetSocketAddress ip) throws IPModificationFailureException;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@ public abstract class TCPShieldConfig {
protected boolean onlyProxy;
protected File ipWhitelistFolder;
protected boolean debug;
protected boolean geyser;

public boolean isOnlyProxy() {
return this.onlyProxy;
Expand All@@ -20,4 +21,8 @@ public boolean isDebug() {
return this.debug;
}

public boolean isGeyser() {
return this.geyser;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,21 +13,25 @@ public void onEnable() {
new TCPShieldPaper(this).load();
} else {
if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) {
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib.");
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper (1.16 build #503 or higher) to enable native compatibility or install ProtocolLib.");
return;
}

new TCPShieldProtocolLib(this).load();
}
}

/**
* Checks if the server version supports native Paper support (Paper 1.16.5 build #503 or higher)
*
* @return if the server version supports native Paper support
*/
private boolean isPaper() {
if (1 == 1) return false;

try {
Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
Class<?> handshakeEvent = Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
handshakeEvent.getMethod("getOriginalSocketAddressHostname");
return true;
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException | NoSuchMethodException e) {
return false;
}
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ public BukkitConfigImpl(JavaPlugin javaPlugin) {

this.onlyProxy = config.getBoolean("only-allow-proxy-connections");
this.ipWhitelistFolder = new File(javaPlugin.getDataFolder(), "ip-whitelist");
this.geyser = config.getBoolean("enable-geyser-compatibility");
this.debug = config.getBoolean("debug-mode");
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ public class PaperHandshakePacketHandler implements Listener {

private final HandshakePacketHandler handshakePacketHandler;

public PaperHandshakePacketHandler(JavaPlugin plugin) {
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
public PaperHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) {
this.handshakePacketHandler = handshakePacketHandler;
}

@EventHandler(priority = EventPriority.LOWEST)
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
package net.tcpshield.tcpshield.bukkit.paper;

import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserHandshakePacketHandler;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import net.tcpshield.tcpshield.velocity.VelocityHandshakePacketHandler;
import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

Expand All@@ -12,7 +18,11 @@ public TCPShieldPaper(JavaPlugin plugin) {
}

public void load() {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(plugin);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));

GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(handshakePacketHandler);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
});
}
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
package net.tcpshield.tcpshield.bukkit.paper.impl;

import com.destroystokyo.paper.event.player.PlayerHandshakeEvent;
import net.kyori.adventure.text.Component;
import net.tcpshield.tcpshield.abstraction.IPlayer;

import java.net.InetSocketAddress;
import java.util.UUID;

public class PaperPlayerImpl implements IPlayer {

Expand All@@ -14,22 +14,9 @@ public PaperPlayerImpl(PlayerHandshakeEvent handshakeEvent) {
this.handshakeEvent = handshakeEvent;
}

@Override
public String getUUID() {
UUID uuid = handshakeEvent.getUniqueId();
if (uuid == null) return "unknown";

return uuid.toString();
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return handshakeEvent.getSocketAddressHostname();
return handshakeEvent.getOriginalSocketAddressHostname();
}

@Override
Expand All@@ -40,7 +27,7 @@ public void setIP(InetSocketAddress ip) {
@Override
public void disconnect() {
handshakeEvent.setCancelled(false);
handshakeEvent.setFailMessage("Connection failed. Please try again or contact an administrator.");
handshakeEvent.failMessage(Component.text("Connection failed. Please try again or contact an administrator."));
handshakeEvent.setFailed(true);
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,16 +13,6 @@ public PaperServerListPingPlayerImpl(PaperServerListPingEvent pingEvent) {
this.pingEvent = pingEvent;
}

@Override
public String getUUID() {
return "unknown";
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return pingEvent.getAddress().getHostAddress();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.abstraction.IPacket;
import net.tcpshield.tcpshield.abstraction.IPlayer;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPacketImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPlayerImpl;
import org.bukkit.plugin.java.JavaPlugin;
Expand All@@ -16,9 +15,9 @@ public class ProtocolLibHandshakePacketHandler extends PacketAdapter {

private final HandshakePacketHandler handshakePacketHandler;

public ProtocolLibHandshakePacketHandler(JavaPlugin plugin) {
public ProtocolLibHandshakePacketHandler(JavaPlugin plugin, HandshakePacketHandler handshakePacketHandler) {
super(plugin, ListenerPriority.LOWEST, PacketType.Handshake.Client.SET_PROTOCOL);
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
this.handshakePacketHandler = handshakePacketHandler;
}

@Override
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
package net.tcpshield.tcpshield.bukkit.protocollib;

import com.comphenix.protocol.ProtocolLibrary;
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import org.bukkit.plugin.java.JavaPlugin;

public class TCPShieldProtocolLib {
Expand All@@ -11,7 +15,10 @@ public TCPShieldProtocolLib(JavaPlugin plugin) {
}

public void load() {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin);
com.comphenix.protocol.ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin, handshakePacketHandler);
ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
});
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,16 +34,6 @@ public ProtocolLibPlayerImpl(Player player) {
this.ip = player.getAddress().getAddress().getHostAddress();
}

@Override
public String getUUID() {
return "unknown"; // not supported with temporary players
}

@Override
public String getName() {
return "unknown"; // not supported with temporary players
}

@Override
public String getIP() {
return ip;
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,12 +6,13 @@ It also parses passed IP addresses so the server is aware of the real player IP

### Compatibility

TCPShield is compatible with Spigot / CraftBukkit, BungeeCordand Velocity.
TCPShield is compatible with Spigot / CraftBukkit, BungeeCord, Velocity and Fabric.

When using Spigot / CraftBukkit, [ProtocolLib](https://github.com/aadnk/ProtocolLib) needs to be installed.
This does not apply when using Paper 1.16 build #503 or higher.

### Setup
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/onboarding/tcpshield-plugin) guidelines.
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/config/tcpshield-plugin) guidelines.

### Compiling
In order to compile TCPShield, [install Gradle](https://docs.gradle.org/current/userguide/installation.html) and run the following command in the project folder:
Expand All@@ -29,4 +30,5 @@ See [Contact](https://docs.tcpshield.com/about-us)
These wonderful contributors have helped TCPShield make this plugin better!

* [Paul Zhang](https://github.com/paulzhng)
* [Draylar](https://github.com/Draylar)
* [RyanDeLap](https://github.com/RyanDeLap)
26 changes: 21 additions & 5 deletions build.gradle
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import org.yaml.snakeyaml.DumperOptions
Expand All@@ -18,6 +19,7 @@ buildscript {
plugins {
id 'java'
id 'idea'
id 'fabric-loom' version '0.6-SNAPSHOT'
}

repositories {
Expand All@@ -39,6 +41,12 @@ repositories {
maven {
url = 'https://repo.velocitypowered.com/snapshots/'
}
maven {
url = 'https://maven.fabricmc.net/'
}
flatDir {
dirs '/libs'
}
}

dependencies {
Expand All@@ -47,17 +55,24 @@ dependencies {
compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.4.0'

// Paper
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.15.2-R0.1-SNAPSHOT'
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.16.5-R0.1-20210227.144841-85'

// BungeeCord
compileOnly group: 'net.md-5', name: 'bungeecord-api', version: '1.14-SNAPSHOT'

// Velocity
compileOnly group: 'com.velocitypowered', name: 'velocity-api', version: '1.0.0-SNAPSHOT'

// Fabric
minecraft "com.mojang:minecraft:1.16.5"
mappings "net.fabricmc:yarn:1.16.5+build.5:v2"
modImplementation group: 'net.fabricmc', name: 'fabric-loader', version: '0.11.2'

// Testing
testImplementation group: 'org.junit.jupiter', name:'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version:'5.7.0-M1'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.7.0-M1'

compileOnly 'org.geyser:floodgate-spigot:2.0'
}

test {
Expand All@@ -68,7 +83,7 @@ configurations {
testImplementation.extendsFrom compileOnly
}

version = '2.4'
version = '2.5'
group = 'net.tcpshield.tcpshield'
archivesBaseName = 'TCPShield'

Expand DownExpand Up@@ -133,6 +148,7 @@ void updateYaml() {
}

void updateJson() {
def gson = new GsonBuilder().setPrettyPrinting().create();
def velocityJson = new File('src/main/resources/velocity-plugin.json')

def files = [velocityJson]
Expand All@@ -143,7 +159,7 @@ void updateJson() {
object.addProperty("version", version.toString())

new FileWriter(file).withCloseable { writer ->
writer.write(object.toString())
writer.write(gson.toJson(object))
}
}
}
Expand Down
Binary file addedlibs/floodgate-spigot.jar
Binary file not shown.
10 changes: 10 additions & 0 deletions settings.gradle
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
gradlePluginPortal()
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,8 +35,8 @@ public void onHandshake(IPacket packet, IPlayer player) {
InetAddress inetAddress = InetAddress.getByName(player.getIP());
if (!ipValidation.validateIP(inetAddress)) throw new InvalidIPException();

if (rawPayload == null)
return; // raw payload is passed when it's not available -> e.g. Paper server list ping events
// raw payload is passed when it's not available -> e.g. Paper server list ping events
if (rawPayload == null) return;

String extraData = null;

Expand DownExpand Up@@ -69,7 +69,7 @@ public void onHandshake(IPacket packet, IPlayer player) {
} catch (InvalidIPException e) {
handleInvalidIPException(player, rawPayload);
} catch (IPModificationFailureException e) {
this.logger.warning(String.format("%s[%s/%s]'s IP failed to be modified. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s's IP failed to be modified. Raw payload = \"%s\"", player.getIP(), rawPayload));
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
Expand All@@ -78,11 +78,16 @@ public void onHandshake(IPacket packet, IPlayer player) {

private void handleInvalidIPException(IPlayer player, String rawPayload) {
if (config.isDebug()) {
this.logger.warning(String.format("%s[%s/%s] was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getIP(), rawPayload));
}

if (config.isOnlyProxy()) {
player.disconnect();
}
}

public TCPShieldConfig getConfig() {
return config;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,10 +6,6 @@

public interface IPlayer {

String getUUID();

String getName();

String getIP();

void setIP(InetSocketAddress ip) throws IPModificationFailureException;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@ public abstract class TCPShieldConfig {
protected boolean onlyProxy;
protected File ipWhitelistFolder;
protected boolean debug;
protected boolean geyser;

public boolean isOnlyProxy() {
return this.onlyProxy;
Expand All@@ -20,4 +21,8 @@ public boolean isDebug() {
return this.debug;
}

public boolean isGeyser() {
return this.geyser;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,21 +13,25 @@ public void onEnable() {
new TCPShieldPaper(this).load();
} else {
if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) {
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib.");
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper (1.16 build #503 or higher) to enable native compatibility or install ProtocolLib.");
return;
}

new TCPShieldProtocolLib(this).load();
}
}

/**
* Checks if the server version supports native Paper support (Paper 1.16.5 build #503 or higher)
*
* @return if the server version supports native Paper support
*/
private boolean isPaper() {
if (1 == 1) return false;

try {
Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
Class<?> handshakeEvent = Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
handshakeEvent.getMethod("getOriginalSocketAddressHostname");
return true;
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException | NoSuchMethodException e) {
return false;
}
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ public BukkitConfigImpl(JavaPlugin javaPlugin) {

this.onlyProxy = config.getBoolean("only-allow-proxy-connections");
this.ipWhitelistFolder = new File(javaPlugin.getDataFolder(), "ip-whitelist");
this.geyser = config.getBoolean("enable-geyser-compatibility");
this.debug = config.getBoolean("debug-mode");
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ public class PaperHandshakePacketHandler implements Listener {

private final HandshakePacketHandler handshakePacketHandler;

public PaperHandshakePacketHandler(JavaPlugin plugin) {
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
public PaperHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) {
this.handshakePacketHandler = handshakePacketHandler;
}

@EventHandler(priority = EventPriority.LOWEST)
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
package net.tcpshield.tcpshield.bukkit.paper;

import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserHandshakePacketHandler;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import net.tcpshield.tcpshield.velocity.VelocityHandshakePacketHandler;
import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

Expand All@@ -12,7 +18,11 @@ public TCPShieldPaper(JavaPlugin plugin) {
}

public void load() {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(plugin);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));

GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(handshakePacketHandler);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
});
}
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
package net.tcpshield.tcpshield.bukkit.paper.impl;

import com.destroystokyo.paper.event.player.PlayerHandshakeEvent;
import net.kyori.adventure.text.Component;
import net.tcpshield.tcpshield.abstraction.IPlayer;

import java.net.InetSocketAddress;
import java.util.UUID;

public class PaperPlayerImpl implements IPlayer {

Expand All@@ -14,22 +14,9 @@ public PaperPlayerImpl(PlayerHandshakeEvent handshakeEvent) {
this.handshakeEvent = handshakeEvent;
}

@Override
public String getUUID() {
UUID uuid = handshakeEvent.getUniqueId();
if (uuid == null) return "unknown";

return uuid.toString();
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return handshakeEvent.getSocketAddressHostname();
return handshakeEvent.getOriginalSocketAddressHostname();
}

@Override
Expand All@@ -40,7 +27,7 @@ public void setIP(InetSocketAddress ip) {
@Override
public void disconnect() {
handshakeEvent.setCancelled(false);
handshakeEvent.setFailMessage("Connection failed. Please try again or contact an administrator.");
handshakeEvent.failMessage(Component.text("Connection failed. Please try again or contact an administrator."));
handshakeEvent.setFailed(true);
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,16 +13,6 @@ public PaperServerListPingPlayerImpl(PaperServerListPingEvent pingEvent) {
this.pingEvent = pingEvent;
}

@Override
public String getUUID() {
return "unknown";
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return pingEvent.getAddress().getHostAddress();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.abstraction.IPacket;
import net.tcpshield.tcpshield.abstraction.IPlayer;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPacketImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPlayerImpl;
import org.bukkit.plugin.java.JavaPlugin;
Expand All@@ -16,9 +15,9 @@ public class ProtocolLibHandshakePacketHandler extends PacketAdapter {

private final HandshakePacketHandler handshakePacketHandler;

public ProtocolLibHandshakePacketHandler(JavaPlugin plugin) {
public ProtocolLibHandshakePacketHandler(JavaPlugin plugin, HandshakePacketHandler handshakePacketHandler) {
super(plugin, ListenerPriority.LOWEST, PacketType.Handshake.Client.SET_PROTOCOL);
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
this.handshakePacketHandler = handshakePacketHandler;
}

@Override
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
package net.tcpshield.tcpshield.bukkit.protocollib;

import com.comphenix.protocol.ProtocolLibrary;
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import org.bukkit.plugin.java.JavaPlugin;

public class TCPShieldProtocolLib {
Expand All@@ -11,7 +15,10 @@ public TCPShieldProtocolLib(JavaPlugin plugin) {
}

public void load() {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin);
com.comphenix.protocol.ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin, handshakePacketHandler);
ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
});
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,16 +34,6 @@ public ProtocolLibPlayerImpl(Player player) {
this.ip = player.getAddress().getAddress().getHostAddress();
}

@Override
public String getUUID() {
return "unknown"; // not supported with temporary players
}

@Override
public String getName() {
return "unknown"; // not supported with temporary players
}

@Override
public String getIP() {
return ip;
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,12 +6,13 @@ It also parses passed IP addresses so the server is aware of the real player IP

### Compatibility

TCPShield is compatible with Spigot / CraftBukkit, BungeeCordand Velocity.
TCPShield is compatible with Spigot / CraftBukkit, BungeeCord, Velocity and Fabric.

When using Spigot / CraftBukkit, [ProtocolLib](https://github.com/aadnk/ProtocolLib) needs to be installed.
This does not apply when using Paper 1.16 build #503 or higher.

### Setup
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/onboarding/tcpshield-plugin) guidelines.
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/config/tcpshield-plugin) guidelines.

### Compiling
In order to compile TCPShield, [install Gradle](https://docs.gradle.org/current/userguide/installation.html) and run the following command in the project folder:
Expand All@@ -29,4 +30,5 @@ See [Contact](https://docs.tcpshield.com/about-us)
These wonderful contributors have helped TCPShield make this plugin better!

* [Paul Zhang](https://github.com/paulzhng)
* [Draylar](https://github.com/Draylar)
* [RyanDeLap](https://github.com/RyanDeLap)
26 changes: 21 additions & 5 deletions build.gradle
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import org.yaml.snakeyaml.DumperOptions
Expand All@@ -18,6 +19,7 @@ buildscript {
plugins {
id 'java'
id 'idea'
id 'fabric-loom' version '0.6-SNAPSHOT'
}

repositories {
Expand All@@ -39,6 +41,12 @@ repositories {
maven {
url = 'https://repo.velocitypowered.com/snapshots/'
}
maven {
url = 'https://maven.fabricmc.net/'
}
flatDir {
dirs '/libs'
}
}

dependencies {
Expand All@@ -47,17 +55,24 @@ dependencies {
compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.4.0'

// Paper
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.15.2-R0.1-SNAPSHOT'
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.16.5-R0.1-20210227.144841-85'

// BungeeCord
compileOnly group: 'net.md-5', name: 'bungeecord-api', version: '1.14-SNAPSHOT'

// Velocity
compileOnly group: 'com.velocitypowered', name: 'velocity-api', version: '1.0.0-SNAPSHOT'

// Fabric
minecraft "com.mojang:minecraft:1.16.5"
mappings "net.fabricmc:yarn:1.16.5+build.5:v2"
modImplementation group: 'net.fabricmc', name: 'fabric-loader', version: '0.11.2'

// Testing
testImplementation group: 'org.junit.jupiter', name:'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version:'5.7.0-M1'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.7.0-M1'

compileOnly 'org.geyser:floodgate-spigot:2.0'
}

test {
Expand All@@ -68,7 +83,7 @@ configurations {
testImplementation.extendsFrom compileOnly
}

version = '2.4'
version = '2.5'
group = 'net.tcpshield.tcpshield'
archivesBaseName = 'TCPShield'

Expand DownExpand Up@@ -133,6 +148,7 @@ void updateYaml() {
}

void updateJson() {
def gson = new GsonBuilder().setPrettyPrinting().create();
def velocityJson = new File('src/main/resources/velocity-plugin.json')

def files = [velocityJson]
Expand All@@ -143,7 +159,7 @@ void updateJson() {
object.addProperty("version", version.toString())

new FileWriter(file).withCloseable { writer ->
writer.write(object.toString())
writer.write(gson.toJson(object))
}
}
}
Expand Down
Binary file addedlibs/floodgate-spigot.jar
Binary file not shown.
10 changes: 10 additions & 0 deletions settings.gradle
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
gradlePluginPortal()
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,8 +35,8 @@ public void onHandshake(IPacket packet, IPlayer player) {
InetAddress inetAddress = InetAddress.getByName(player.getIP());
if (!ipValidation.validateIP(inetAddress)) throw new InvalidIPException();

if (rawPayload == null)
return; // raw payload is passed when it's not available -> e.g. Paper server list ping events
// raw payload is passed when it's not available -> e.g. Paper server list ping events
if (rawPayload == null) return;

String extraData = null;

Expand DownExpand Up@@ -69,7 +69,7 @@ public void onHandshake(IPacket packet, IPlayer player) {
} catch (InvalidIPException e) {
handleInvalidIPException(player, rawPayload);
} catch (IPModificationFailureException e) {
this.logger.warning(String.format("%s[%s/%s]'s IP failed to be modified. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s's IP failed to be modified. Raw payload = \"%s\"", player.getIP(), rawPayload));
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
Expand All@@ -78,11 +78,16 @@ public void onHandshake(IPacket packet, IPlayer player) {

private void handleInvalidIPException(IPlayer player, String rawPayload) {
if (config.isDebug()) {
this.logger.warning(String.format("%s[%s/%s] was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getIP(), rawPayload));
}

if (config.isOnlyProxy()) {
player.disconnect();
}
}

public TCPShieldConfig getConfig() {
return config;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,10 +6,6 @@

public interface IPlayer {

String getUUID();

String getName();

String getIP();

void setIP(InetSocketAddress ip) throws IPModificationFailureException;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@ public abstract class TCPShieldConfig {
protected boolean onlyProxy;
protected File ipWhitelistFolder;
protected boolean debug;
protected boolean geyser;

public boolean isOnlyProxy() {
return this.onlyProxy;
Expand All@@ -20,4 +21,8 @@ public boolean isDebug() {
return this.debug;
}

public boolean isGeyser() {
return this.geyser;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,21 +13,25 @@ public void onEnable() {
new TCPShieldPaper(this).load();
} else {
if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) {
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib.");
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper (1.16 build #503 or higher) to enable native compatibility or install ProtocolLib.");
return;
}

new TCPShieldProtocolLib(this).load();
}
}

/**
* Checks if the server version supports native Paper support (Paper 1.16.5 build #503 or higher)
*
* @return if the server version supports native Paper support
*/
private boolean isPaper() {
if (1 == 1) return false;

try {
Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
Class<?> handshakeEvent = Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
handshakeEvent.getMethod("getOriginalSocketAddressHostname");
return true;
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException | NoSuchMethodException e) {
return false;
}
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ public BukkitConfigImpl(JavaPlugin javaPlugin) {

this.onlyProxy = config.getBoolean("only-allow-proxy-connections");
this.ipWhitelistFolder = new File(javaPlugin.getDataFolder(), "ip-whitelist");
this.geyser = config.getBoolean("enable-geyser-compatibility");
this.debug = config.getBoolean("debug-mode");
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ public class PaperHandshakePacketHandler implements Listener {

private final HandshakePacketHandler handshakePacketHandler;

public PaperHandshakePacketHandler(JavaPlugin plugin) {
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
public PaperHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) {
this.handshakePacketHandler = handshakePacketHandler;
}

@EventHandler(priority = EventPriority.LOWEST)
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
package net.tcpshield.tcpshield.bukkit.paper;

import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserHandshakePacketHandler;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import net.tcpshield.tcpshield.velocity.VelocityHandshakePacketHandler;
import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

Expand All@@ -12,7 +18,11 @@ public TCPShieldPaper(JavaPlugin plugin) {
}

public void load() {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(plugin);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));

GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(handshakePacketHandler);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
});
}
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
package net.tcpshield.tcpshield.bukkit.paper.impl;

import com.destroystokyo.paper.event.player.PlayerHandshakeEvent;
import net.kyori.adventure.text.Component;
import net.tcpshield.tcpshield.abstraction.IPlayer;

import java.net.InetSocketAddress;
import java.util.UUID;

public class PaperPlayerImpl implements IPlayer {

Expand All@@ -14,22 +14,9 @@ public PaperPlayerImpl(PlayerHandshakeEvent handshakeEvent) {
this.handshakeEvent = handshakeEvent;
}

@Override
public String getUUID() {
UUID uuid = handshakeEvent.getUniqueId();
if (uuid == null) return "unknown";

return uuid.toString();
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return handshakeEvent.getSocketAddressHostname();
return handshakeEvent.getOriginalSocketAddressHostname();
}

@Override
Expand All@@ -40,7 +27,7 @@ public void setIP(InetSocketAddress ip) {
@Override
public void disconnect() {
handshakeEvent.setCancelled(false);
handshakeEvent.setFailMessage("Connection failed. Please try again or contact an administrator.");
handshakeEvent.failMessage(Component.text("Connection failed. Please try again or contact an administrator."));
handshakeEvent.setFailed(true);
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,16 +13,6 @@ public PaperServerListPingPlayerImpl(PaperServerListPingEvent pingEvent) {
this.pingEvent = pingEvent;
}

@Override
public String getUUID() {
return "unknown";
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return pingEvent.getAddress().getHostAddress();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.abstraction.IPacket;
import net.tcpshield.tcpshield.abstraction.IPlayer;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPacketImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPlayerImpl;
import org.bukkit.plugin.java.JavaPlugin;
Expand All@@ -16,9 +15,9 @@ public class ProtocolLibHandshakePacketHandler extends PacketAdapter {

private final HandshakePacketHandler handshakePacketHandler;

public ProtocolLibHandshakePacketHandler(JavaPlugin plugin) {
public ProtocolLibHandshakePacketHandler(JavaPlugin plugin, HandshakePacketHandler handshakePacketHandler) {
super(plugin, ListenerPriority.LOWEST, PacketType.Handshake.Client.SET_PROTOCOL);
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
this.handshakePacketHandler = handshakePacketHandler;
}

@Override
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
package net.tcpshield.tcpshield.bukkit.protocollib;

import com.comphenix.protocol.ProtocolLibrary;
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import org.bukkit.plugin.java.JavaPlugin;

public class TCPShieldProtocolLib {
Expand All@@ -11,7 +15,10 @@ public TCPShieldProtocolLib(JavaPlugin plugin) {
}

public void load() {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin);
com.comphenix.protocol.ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin, handshakePacketHandler);
ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
});
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,16 +34,6 @@ public ProtocolLibPlayerImpl(Player player) {
this.ip = player.getAddress().getAddress().getHostAddress();
}

@Override
public String getUUID() {
return "unknown"; // not supported with temporary players
}

@Override
public String getName() {
return "unknown"; // not supported with temporary players
}

@Override
public String getIP() {
return ip;
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,12 +6,13 @@ It also parses passed IP addresses so the server is aware of the real player IP

### Compatibility

TCPShield is compatible with Spigot / CraftBukkit, BungeeCordand Velocity.
TCPShield is compatible with Spigot / CraftBukkit, BungeeCord, Velocity and Fabric.

When using Spigot / CraftBukkit, [ProtocolLib](https://github.com/aadnk/ProtocolLib) needs to be installed.
This does not apply when using Paper 1.16 build #503 or higher.

### Setup
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/onboarding/tcpshield-plugin) guidelines.
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/config/tcpshield-plugin) guidelines.

### Compiling
In order to compile TCPShield, [install Gradle](https://docs.gradle.org/current/userguide/installation.html) and run the following command in the project folder:
Expand All@@ -29,4 +30,5 @@ See [Contact](https://docs.tcpshield.com/about-us)
These wonderful contributors have helped TCPShield make this plugin better!

* [Paul Zhang](https://github.com/paulzhng)
* [Draylar](https://github.com/Draylar)
* [RyanDeLap](https://github.com/RyanDeLap)
26 changes: 21 additions & 5 deletions build.gradle
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import org.yaml.snakeyaml.DumperOptions
Expand All@@ -18,6 +19,7 @@ buildscript {
plugins {
id 'java'
id 'idea'
id 'fabric-loom' version '0.6-SNAPSHOT'
}

repositories {
Expand All@@ -39,6 +41,12 @@ repositories {
maven {
url = 'https://repo.velocitypowered.com/snapshots/'
}
maven {
url = 'https://maven.fabricmc.net/'
}
flatDir {
dirs '/libs'
}
}

dependencies {
Expand All@@ -47,17 +55,24 @@ dependencies {
compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.4.0'

// Paper
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.15.2-R0.1-SNAPSHOT'
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.16.5-R0.1-20210227.144841-85'

// BungeeCord
compileOnly group: 'net.md-5', name: 'bungeecord-api', version: '1.14-SNAPSHOT'

// Velocity
compileOnly group: 'com.velocitypowered', name: 'velocity-api', version: '1.0.0-SNAPSHOT'

// Fabric
minecraft "com.mojang:minecraft:1.16.5"
mappings "net.fabricmc:yarn:1.16.5+build.5:v2"
modImplementation group: 'net.fabricmc', name: 'fabric-loader', version: '0.11.2'

// Testing
testImplementation group: 'org.junit.jupiter', name:'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version:'5.7.0-M1'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.7.0-M1'

compileOnly 'org.geyser:floodgate-spigot:2.0'
}

test {
Expand All@@ -68,7 +83,7 @@ configurations {
testImplementation.extendsFrom compileOnly
}

version = '2.4'
version = '2.5'
group = 'net.tcpshield.tcpshield'
archivesBaseName = 'TCPShield'

Expand DownExpand Up@@ -133,6 +148,7 @@ void updateYaml() {
}

void updateJson() {
def gson = new GsonBuilder().setPrettyPrinting().create();
def velocityJson = new File('src/main/resources/velocity-plugin.json')

def files = [velocityJson]
Expand All@@ -143,7 +159,7 @@ void updateJson() {
object.addProperty("version", version.toString())

new FileWriter(file).withCloseable { writer ->
writer.write(object.toString())
writer.write(gson.toJson(object))
}
}
}
Expand Down
Binary file addedlibs/floodgate-spigot.jar
Binary file not shown.
10 changes: 10 additions & 0 deletions settings.gradle
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
gradlePluginPortal()
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,8 +35,8 @@ public void onHandshake(IPacket packet, IPlayer player) {
InetAddress inetAddress = InetAddress.getByName(player.getIP());
if (!ipValidation.validateIP(inetAddress)) throw new InvalidIPException();

if (rawPayload == null)
return; // raw payload is passed when it's not available -> e.g. Paper server list ping events
// raw payload is passed when it's not available -> e.g. Paper server list ping events
if (rawPayload == null) return;

String extraData = null;

Expand DownExpand Up@@ -69,7 +69,7 @@ public void onHandshake(IPacket packet, IPlayer player) {
} catch (InvalidIPException e) {
handleInvalidIPException(player, rawPayload);
} catch (IPModificationFailureException e) {
this.logger.warning(String.format("%s[%s/%s]'s IP failed to be modified. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s's IP failed to be modified. Raw payload = \"%s\"", player.getIP(), rawPayload));
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
Expand All@@ -78,11 +78,16 @@ public void onHandshake(IPacket packet, IPlayer player) {

private void handleInvalidIPException(IPlayer player, String rawPayload) {
if (config.isDebug()) {
this.logger.warning(String.format("%s[%s/%s] was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getIP(), rawPayload));
}

if (config.isOnlyProxy()) {
player.disconnect();
}
}

public TCPShieldConfig getConfig() {
return config;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,10 +6,6 @@

public interface IPlayer {

String getUUID();

String getName();

String getIP();

void setIP(InetSocketAddress ip) throws IPModificationFailureException;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@ public abstract class TCPShieldConfig {
protected boolean onlyProxy;
protected File ipWhitelistFolder;
protected boolean debug;
protected boolean geyser;

public boolean isOnlyProxy() {
return this.onlyProxy;
Expand All@@ -20,4 +21,8 @@ public boolean isDebug() {
return this.debug;
}

public boolean isGeyser() {
return this.geyser;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,21 +13,25 @@ public void onEnable() {
new TCPShieldPaper(this).load();
} else {
if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) {
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib.");
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper (1.16 build #503 or higher) to enable native compatibility or install ProtocolLib.");
return;
}

new TCPShieldProtocolLib(this).load();
}
}

/**
* Checks if the server version supports native Paper support (Paper 1.16.5 build #503 or higher)
*
* @return if the server version supports native Paper support
*/
private boolean isPaper() {
if (1 == 1) return false;

try {
Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
Class<?> handshakeEvent = Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
handshakeEvent.getMethod("getOriginalSocketAddressHostname");
return true;
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException | NoSuchMethodException e) {
return false;
}
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ public BukkitConfigImpl(JavaPlugin javaPlugin) {

this.onlyProxy = config.getBoolean("only-allow-proxy-connections");
this.ipWhitelistFolder = new File(javaPlugin.getDataFolder(), "ip-whitelist");
this.geyser = config.getBoolean("enable-geyser-compatibility");
this.debug = config.getBoolean("debug-mode");
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ public class PaperHandshakePacketHandler implements Listener {

private final HandshakePacketHandler handshakePacketHandler;

public PaperHandshakePacketHandler(JavaPlugin plugin) {
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
public PaperHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) {
this.handshakePacketHandler = handshakePacketHandler;
}

@EventHandler(priority = EventPriority.LOWEST)
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
package net.tcpshield.tcpshield.bukkit.paper;

import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserHandshakePacketHandler;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import net.tcpshield.tcpshield.velocity.VelocityHandshakePacketHandler;
import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

Expand All@@ -12,7 +18,11 @@ public TCPShieldPaper(JavaPlugin plugin) {
}

public void load() {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(plugin);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));

GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(handshakePacketHandler);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
});
}
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
package net.tcpshield.tcpshield.bukkit.paper.impl;

import com.destroystokyo.paper.event.player.PlayerHandshakeEvent;
import net.kyori.adventure.text.Component;
import net.tcpshield.tcpshield.abstraction.IPlayer;

import java.net.InetSocketAddress;
import java.util.UUID;

public class PaperPlayerImpl implements IPlayer {

Expand All@@ -14,22 +14,9 @@ public PaperPlayerImpl(PlayerHandshakeEvent handshakeEvent) {
this.handshakeEvent = handshakeEvent;
}

@Override
public String getUUID() {
UUID uuid = handshakeEvent.getUniqueId();
if (uuid == null) return "unknown";

return uuid.toString();
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return handshakeEvent.getSocketAddressHostname();
return handshakeEvent.getOriginalSocketAddressHostname();
}

@Override
Expand All@@ -40,7 +27,7 @@ public void setIP(InetSocketAddress ip) {
@Override
public void disconnect() {
handshakeEvent.setCancelled(false);
handshakeEvent.setFailMessage("Connection failed. Please try again or contact an administrator.");
handshakeEvent.failMessage(Component.text("Connection failed. Please try again or contact an administrator."));
handshakeEvent.setFailed(true);
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,16 +13,6 @@ public PaperServerListPingPlayerImpl(PaperServerListPingEvent pingEvent) {
this.pingEvent = pingEvent;
}

@Override
public String getUUID() {
return "unknown";
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return pingEvent.getAddress().getHostAddress();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.abstraction.IPacket;
import net.tcpshield.tcpshield.abstraction.IPlayer;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPacketImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPlayerImpl;
import org.bukkit.plugin.java.JavaPlugin;
Expand All@@ -16,9 +15,9 @@ public class ProtocolLibHandshakePacketHandler extends PacketAdapter {

private final HandshakePacketHandler handshakePacketHandler;

public ProtocolLibHandshakePacketHandler(JavaPlugin plugin) {
public ProtocolLibHandshakePacketHandler(JavaPlugin plugin, HandshakePacketHandler handshakePacketHandler) {
super(plugin, ListenerPriority.LOWEST, PacketType.Handshake.Client.SET_PROTOCOL);
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
this.handshakePacketHandler = handshakePacketHandler;
}

@Override
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
package net.tcpshield.tcpshield.bukkit.protocollib;

import com.comphenix.protocol.ProtocolLibrary;
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import org.bukkit.plugin.java.JavaPlugin;

public class TCPShieldProtocolLib {
Expand All@@ -11,7 +15,10 @@ public TCPShieldProtocolLib(JavaPlugin plugin) {
}

public void load() {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin);
com.comphenix.protocol.ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin, handshakePacketHandler);
ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
});
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,16 +34,6 @@ public ProtocolLibPlayerImpl(Player player) {
this.ip = player.getAddress().getAddress().getHostAddress();
}

@Override
public String getUUID() {
return "unknown"; // not supported with temporary players
}

@Override
public String getName() {
return "unknown"; // not supported with temporary players
}

@Override
public String getIP() {
return ip;
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,12 +6,13 @@ It also parses passed IP addresses so the server is aware of the real player IP

### Compatibility

TCPShield is compatible with Spigot / CraftBukkit, BungeeCordand Velocity.
TCPShield is compatible with Spigot / CraftBukkit, BungeeCord, Velocity and Fabric.

When using Spigot / CraftBukkit, [ProtocolLib](https://github.com/aadnk/ProtocolLib) needs to be installed.
This does not apply when using Paper 1.16 build #503 or higher.

### Setup
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/onboarding/tcpshield-plugin) guidelines.
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/config/tcpshield-plugin) guidelines.

### Compiling
In order to compile TCPShield, [install Gradle](https://docs.gradle.org/current/userguide/installation.html) and run the following command in the project folder:
Expand All@@ -29,4 +30,5 @@ See [Contact](https://docs.tcpshield.com/about-us)
These wonderful contributors have helped TCPShield make this plugin better!

* [Paul Zhang](https://github.com/paulzhng)
* [Draylar](https://github.com/Draylar)
* [RyanDeLap](https://github.com/RyanDeLap)
26 changes: 21 additions & 5 deletions build.gradle
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import org.yaml.snakeyaml.DumperOptions
Expand All@@ -18,6 +19,7 @@ buildscript {
plugins {
id 'java'
id 'idea'
id 'fabric-loom' version '0.6-SNAPSHOT'
}

repositories {
Expand All@@ -39,6 +41,12 @@ repositories {
maven {
url = 'https://repo.velocitypowered.com/snapshots/'
}
maven {
url = 'https://maven.fabricmc.net/'
}
flatDir {
dirs '/libs'
}
}

dependencies {
Expand All@@ -47,17 +55,24 @@ dependencies {
compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.4.0'

// Paper
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.15.2-R0.1-SNAPSHOT'
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.16.5-R0.1-20210227.144841-85'

// BungeeCord
compileOnly group: 'net.md-5', name: 'bungeecord-api', version: '1.14-SNAPSHOT'

// Velocity
compileOnly group: 'com.velocitypowered', name: 'velocity-api', version: '1.0.0-SNAPSHOT'

// Fabric
minecraft "com.mojang:minecraft:1.16.5"
mappings "net.fabricmc:yarn:1.16.5+build.5:v2"
modImplementation group: 'net.fabricmc', name: 'fabric-loader', version: '0.11.2'

// Testing
testImplementation group: 'org.junit.jupiter', name:'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version:'5.7.0-M1'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.7.0-M1'

compileOnly 'org.geyser:floodgate-spigot:2.0'
}

test {
Expand All@@ -68,7 +83,7 @@ configurations {
testImplementation.extendsFrom compileOnly
}

version = '2.4'
version = '2.5'
group = 'net.tcpshield.tcpshield'
archivesBaseName = 'TCPShield'

Expand DownExpand Up@@ -133,6 +148,7 @@ void updateYaml() {
}

void updateJson() {
def gson = new GsonBuilder().setPrettyPrinting().create();
def velocityJson = new File('src/main/resources/velocity-plugin.json')

def files = [velocityJson]
Expand All@@ -143,7 +159,7 @@ void updateJson() {
object.addProperty("version", version.toString())

new FileWriter(file).withCloseable { writer ->
writer.write(object.toString())
writer.write(gson.toJson(object))
}
}
}
Expand Down
Binary file addedlibs/floodgate-spigot.jar
Binary file not shown.
10 changes: 10 additions & 0 deletions settings.gradle
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
gradlePluginPortal()
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,8 +35,8 @@ public void onHandshake(IPacket packet, IPlayer player) {
InetAddress inetAddress = InetAddress.getByName(player.getIP());
if (!ipValidation.validateIP(inetAddress)) throw new InvalidIPException();

if (rawPayload == null)
return; // raw payload is passed when it's not available -> e.g. Paper server list ping events
// raw payload is passed when it's not available -> e.g. Paper server list ping events
if (rawPayload == null) return;

String extraData = null;

Expand DownExpand Up@@ -69,7 +69,7 @@ public void onHandshake(IPacket packet, IPlayer player) {
} catch (InvalidIPException e) {
handleInvalidIPException(player, rawPayload);
} catch (IPModificationFailureException e) {
this.logger.warning(String.format("%s[%s/%s]'s IP failed to be modified. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s's IP failed to be modified. Raw payload = \"%s\"", player.getIP(), rawPayload));
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
Expand All@@ -78,11 +78,16 @@ public void onHandshake(IPacket packet, IPlayer player) {

private void handleInvalidIPException(IPlayer player, String rawPayload) {
if (config.isDebug()) {
this.logger.warning(String.format("%s[%s/%s] was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getIP(), rawPayload));
}

if (config.isOnlyProxy()) {
player.disconnect();
}
}

public TCPShieldConfig getConfig() {
return config;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,10 +6,6 @@

public interface IPlayer {

String getUUID();

String getName();

String getIP();

void setIP(InetSocketAddress ip) throws IPModificationFailureException;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@ public abstract class TCPShieldConfig {
protected boolean onlyProxy;
protected File ipWhitelistFolder;
protected boolean debug;
protected boolean geyser;

public boolean isOnlyProxy() {
return this.onlyProxy;
Expand All@@ -20,4 +21,8 @@ public boolean isDebug() {
return this.debug;
}

public boolean isGeyser() {
return this.geyser;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,21 +13,25 @@ public void onEnable() {
new TCPShieldPaper(this).load();
} else {
if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) {
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib.");
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper (1.16 build #503 or higher) to enable native compatibility or install ProtocolLib.");
return;
}

new TCPShieldProtocolLib(this).load();
}
}

/**
* Checks if the server version supports native Paper support (Paper 1.16.5 build #503 or higher)
*
* @return if the server version supports native Paper support
*/
private boolean isPaper() {
if (1 == 1) return false;

try {
Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
Class<?> handshakeEvent = Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
handshakeEvent.getMethod("getOriginalSocketAddressHostname");
return true;
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException | NoSuchMethodException e) {
return false;
}
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ public BukkitConfigImpl(JavaPlugin javaPlugin) {

this.onlyProxy = config.getBoolean("only-allow-proxy-connections");
this.ipWhitelistFolder = new File(javaPlugin.getDataFolder(), "ip-whitelist");
this.geyser = config.getBoolean("enable-geyser-compatibility");
this.debug = config.getBoolean("debug-mode");
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ public class PaperHandshakePacketHandler implements Listener {

private final HandshakePacketHandler handshakePacketHandler;

public PaperHandshakePacketHandler(JavaPlugin plugin) {
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
public PaperHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) {
this.handshakePacketHandler = handshakePacketHandler;
}

@EventHandler(priority = EventPriority.LOWEST)
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
package net.tcpshield.tcpshield.bukkit.paper;

import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserHandshakePacketHandler;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import net.tcpshield.tcpshield.velocity.VelocityHandshakePacketHandler;
import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

Expand All@@ -12,7 +18,11 @@ public TCPShieldPaper(JavaPlugin plugin) {
}

public void load() {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(plugin);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));

GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(handshakePacketHandler);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
});
}
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
package net.tcpshield.tcpshield.bukkit.paper.impl;

import com.destroystokyo.paper.event.player.PlayerHandshakeEvent;
import net.kyori.adventure.text.Component;
import net.tcpshield.tcpshield.abstraction.IPlayer;

import java.net.InetSocketAddress;
import java.util.UUID;

public class PaperPlayerImpl implements IPlayer {

Expand All@@ -14,22 +14,9 @@ public PaperPlayerImpl(PlayerHandshakeEvent handshakeEvent) {
this.handshakeEvent = handshakeEvent;
}

@Override
public String getUUID() {
UUID uuid = handshakeEvent.getUniqueId();
if (uuid == null) return "unknown";

return uuid.toString();
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return handshakeEvent.getSocketAddressHostname();
return handshakeEvent.getOriginalSocketAddressHostname();
}

@Override
Expand All@@ -40,7 +27,7 @@ public void setIP(InetSocketAddress ip) {
@Override
public void disconnect() {
handshakeEvent.setCancelled(false);
handshakeEvent.setFailMessage("Connection failed. Please try again or contact an administrator.");
handshakeEvent.failMessage(Component.text("Connection failed. Please try again or contact an administrator."));
handshakeEvent.setFailed(true);
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,16 +13,6 @@ public PaperServerListPingPlayerImpl(PaperServerListPingEvent pingEvent) {
this.pingEvent = pingEvent;
}

@Override
public String getUUID() {
return "unknown";
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return pingEvent.getAddress().getHostAddress();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.abstraction.IPacket;
import net.tcpshield.tcpshield.abstraction.IPlayer;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPacketImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPlayerImpl;
import org.bukkit.plugin.java.JavaPlugin;
Expand All@@ -16,9 +15,9 @@ public class ProtocolLibHandshakePacketHandler extends PacketAdapter {

private final HandshakePacketHandler handshakePacketHandler;

public ProtocolLibHandshakePacketHandler(JavaPlugin plugin) {
public ProtocolLibHandshakePacketHandler(JavaPlugin plugin, HandshakePacketHandler handshakePacketHandler) {
super(plugin, ListenerPriority.LOWEST, PacketType.Handshake.Client.SET_PROTOCOL);
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
this.handshakePacketHandler = handshakePacketHandler;
}

@Override
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
package net.tcpshield.tcpshield.bukkit.protocollib;

import com.comphenix.protocol.ProtocolLibrary;
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import org.bukkit.plugin.java.JavaPlugin;

public class TCPShieldProtocolLib {
Expand All@@ -11,7 +15,10 @@ public TCPShieldProtocolLib(JavaPlugin plugin) {
}

public void load() {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin);
com.comphenix.protocol.ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin, handshakePacketHandler);
ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
});
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,16 +34,6 @@ public ProtocolLibPlayerImpl(Player player) {
this.ip = player.getAddress().getAddress().getHostAddress();
}

@Override
public String getUUID() {
return "unknown"; // not supported with temporary players
}

@Override
public String getName() {
return "unknown"; // not supported with temporary players
}

@Override
public String getIP() {
return ip;
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,12 +6,13 @@ It also parses passed IP addresses so the server is aware of the real player IP

### Compatibility

TCPShield is compatible with Spigot / CraftBukkit, BungeeCordand Velocity.
TCPShield is compatible with Spigot / CraftBukkit, BungeeCord, Velocity and Fabric.

When using Spigot / CraftBukkit, [ProtocolLib](https://github.com/aadnk/ProtocolLib) needs to be installed.
This does not apply when using Paper 1.16 build #503 or higher.

### Setup
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/onboarding/tcpshield-plugin) guidelines.
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/config/tcpshield-plugin) guidelines.

### Compiling
In order to compile TCPShield, [install Gradle](https://docs.gradle.org/current/userguide/installation.html) and run the following command in the project folder:
Expand All@@ -29,4 +30,5 @@ See [Contact](https://docs.tcpshield.com/about-us)
These wonderful contributors have helped TCPShield make this plugin better!

* [Paul Zhang](https://github.com/paulzhng)
* [Draylar](https://github.com/Draylar)
* [RyanDeLap](https://github.com/RyanDeLap)
26 changes: 21 additions & 5 deletions build.gradle
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import org.yaml.snakeyaml.DumperOptions
Expand All@@ -18,6 +19,7 @@ buildscript {
plugins {
id 'java'
id 'idea'
id 'fabric-loom' version '0.6-SNAPSHOT'
}

repositories {
Expand All@@ -39,6 +41,12 @@ repositories {
maven {
url = 'https://repo.velocitypowered.com/snapshots/'
}
maven {
url = 'https://maven.fabricmc.net/'
}
flatDir {
dirs '/libs'
}
}

dependencies {
Expand All@@ -47,17 +55,24 @@ dependencies {
compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.4.0'

// Paper
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.15.2-R0.1-SNAPSHOT'
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.16.5-R0.1-20210227.144841-85'

// BungeeCord
compileOnly group: 'net.md-5', name: 'bungeecord-api', version: '1.14-SNAPSHOT'

// Velocity
compileOnly group: 'com.velocitypowered', name: 'velocity-api', version: '1.0.0-SNAPSHOT'

// Fabric
minecraft "com.mojang:minecraft:1.16.5"
mappings "net.fabricmc:yarn:1.16.5+build.5:v2"
modImplementation group: 'net.fabricmc', name: 'fabric-loader', version: '0.11.2'

// Testing
testImplementation group: 'org.junit.jupiter', name:'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version:'5.7.0-M1'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.7.0-M1'

compileOnly 'org.geyser:floodgate-spigot:2.0'
}

test {
Expand All@@ -68,7 +83,7 @@ configurations {
testImplementation.extendsFrom compileOnly
}

version = '2.4'
version = '2.5'
group = 'net.tcpshield.tcpshield'
archivesBaseName = 'TCPShield'

Expand DownExpand Up@@ -133,6 +148,7 @@ void updateYaml() {
}

void updateJson() {
def gson = new GsonBuilder().setPrettyPrinting().create();
def velocityJson = new File('src/main/resources/velocity-plugin.json')

def files = [velocityJson]
Expand All@@ -143,7 +159,7 @@ void updateJson() {
object.addProperty("version", version.toString())

new FileWriter(file).withCloseable { writer ->
writer.write(object.toString())
writer.write(gson.toJson(object))
}
}
}
Expand Down
Binary file addedlibs/floodgate-spigot.jar
Binary file not shown.
10 changes: 10 additions & 0 deletions settings.gradle
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
gradlePluginPortal()
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,8 +35,8 @@ public void onHandshake(IPacket packet, IPlayer player) {
InetAddress inetAddress = InetAddress.getByName(player.getIP());
if (!ipValidation.validateIP(inetAddress)) throw new InvalidIPException();

if (rawPayload == null)
return; // raw payload is passed when it's not available -> e.g. Paper server list ping events
// raw payload is passed when it's not available -> e.g. Paper server list ping events
if (rawPayload == null) return;

String extraData = null;

Expand DownExpand Up@@ -69,7 +69,7 @@ public void onHandshake(IPacket packet, IPlayer player) {
} catch (InvalidIPException e) {
handleInvalidIPException(player, rawPayload);
} catch (IPModificationFailureException e) {
this.logger.warning(String.format("%s[%s/%s]'s IP failed to be modified. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s's IP failed to be modified. Raw payload = \"%s\"", player.getIP(), rawPayload));
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
Expand All@@ -78,11 +78,16 @@ public void onHandshake(IPacket packet, IPlayer player) {

private void handleInvalidIPException(IPlayer player, String rawPayload) {
if (config.isDebug()) {
this.logger.warning(String.format("%s[%s/%s] was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getIP(), rawPayload));
}

if (config.isOnlyProxy()) {
player.disconnect();
}
}

public TCPShieldConfig getConfig() {
return config;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,10 +6,6 @@

public interface IPlayer {

String getUUID();

String getName();

String getIP();

void setIP(InetSocketAddress ip) throws IPModificationFailureException;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@ public abstract class TCPShieldConfig {
protected boolean onlyProxy;
protected File ipWhitelistFolder;
protected boolean debug;
protected boolean geyser;

public boolean isOnlyProxy() {
return this.onlyProxy;
Expand All@@ -20,4 +21,8 @@ public boolean isDebug() {
return this.debug;
}

public boolean isGeyser() {
return this.geyser;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,21 +13,25 @@ public void onEnable() {
new TCPShieldPaper(this).load();
} else {
if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) {
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib.");
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper (1.16 build #503 or higher) to enable native compatibility or install ProtocolLib.");
return;
}

new TCPShieldProtocolLib(this).load();
}
}

/**
* Checks if the server version supports native Paper support (Paper 1.16.5 build #503 or higher)
*
* @return if the server version supports native Paper support
*/
private boolean isPaper() {
if (1 == 1) return false;

try {
Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
Class<?> handshakeEvent = Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
handshakeEvent.getMethod("getOriginalSocketAddressHostname");
return true;
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException | NoSuchMethodException e) {
return false;
}
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ public BukkitConfigImpl(JavaPlugin javaPlugin) {

this.onlyProxy = config.getBoolean("only-allow-proxy-connections");
this.ipWhitelistFolder = new File(javaPlugin.getDataFolder(), "ip-whitelist");
this.geyser = config.getBoolean("enable-geyser-compatibility");
this.debug = config.getBoolean("debug-mode");
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ public class PaperHandshakePacketHandler implements Listener {

private final HandshakePacketHandler handshakePacketHandler;

public PaperHandshakePacketHandler(JavaPlugin plugin) {
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
public PaperHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) {
this.handshakePacketHandler = handshakePacketHandler;
}

@EventHandler(priority = EventPriority.LOWEST)
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
package net.tcpshield.tcpshield.bukkit.paper;

import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserHandshakePacketHandler;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import net.tcpshield.tcpshield.velocity.VelocityHandshakePacketHandler;
import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

Expand All@@ -12,7 +18,11 @@ public TCPShieldPaper(JavaPlugin plugin) {
}

public void load() {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(plugin);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));

GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(handshakePacketHandler);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
});
}
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
package net.tcpshield.tcpshield.bukkit.paper.impl;

import com.destroystokyo.paper.event.player.PlayerHandshakeEvent;
import net.kyori.adventure.text.Component;
import net.tcpshield.tcpshield.abstraction.IPlayer;

import java.net.InetSocketAddress;
import java.util.UUID;

public class PaperPlayerImpl implements IPlayer {

Expand All@@ -14,22 +14,9 @@ public PaperPlayerImpl(PlayerHandshakeEvent handshakeEvent) {
this.handshakeEvent = handshakeEvent;
}

@Override
public String getUUID() {
UUID uuid = handshakeEvent.getUniqueId();
if (uuid == null) return "unknown";

return uuid.toString();
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return handshakeEvent.getSocketAddressHostname();
return handshakeEvent.getOriginalSocketAddressHostname();
}

@Override
Expand All@@ -40,7 +27,7 @@ public void setIP(InetSocketAddress ip) {
@Override
public void disconnect() {
handshakeEvent.setCancelled(false);
handshakeEvent.setFailMessage("Connection failed. Please try again or contact an administrator.");
handshakeEvent.failMessage(Component.text("Connection failed. Please try again or contact an administrator."));
handshakeEvent.setFailed(true);
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,16 +13,6 @@ public PaperServerListPingPlayerImpl(PaperServerListPingEvent pingEvent) {
this.pingEvent = pingEvent;
}

@Override
public String getUUID() {
return "unknown";
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return pingEvent.getAddress().getHostAddress();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.abstraction.IPacket;
import net.tcpshield.tcpshield.abstraction.IPlayer;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPacketImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPlayerImpl;
import org.bukkit.plugin.java.JavaPlugin;
Expand All@@ -16,9 +15,9 @@ public class ProtocolLibHandshakePacketHandler extends PacketAdapter {

private final HandshakePacketHandler handshakePacketHandler;

public ProtocolLibHandshakePacketHandler(JavaPlugin plugin) {
public ProtocolLibHandshakePacketHandler(JavaPlugin plugin, HandshakePacketHandler handshakePacketHandler) {
super(plugin, ListenerPriority.LOWEST, PacketType.Handshake.Client.SET_PROTOCOL);
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
this.handshakePacketHandler = handshakePacketHandler;
}

@Override
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
package net.tcpshield.tcpshield.bukkit.protocollib;

import com.comphenix.protocol.ProtocolLibrary;
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import org.bukkit.plugin.java.JavaPlugin;

public class TCPShieldProtocolLib {
Expand All@@ -11,7 +15,10 @@ public TCPShieldProtocolLib(JavaPlugin plugin) {
}

public void load() {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin);
com.comphenix.protocol.ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin, handshakePacketHandler);
ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
});
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,16 +34,6 @@ public ProtocolLibPlayerImpl(Player player) {
this.ip = player.getAddress().getAddress().getHostAddress();
}

@Override
public String getUUID() {
return "unknown"; // not supported with temporary players
}

@Override
public String getName() {
return "unknown"; // not supported with temporary players
}

@Override
public String getIP() {
return ip;
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,12 +6,13 @@ It also parses passed IP addresses so the server is aware of the real player IP

### Compatibility

TCPShield is compatible with Spigot / CraftBukkit, BungeeCordand Velocity.
TCPShield is compatible with Spigot / CraftBukkit, BungeeCord, Velocity and Fabric.

When using Spigot / CraftBukkit, [ProtocolLib](https://github.com/aadnk/ProtocolLib) needs to be installed.
This does not apply when using Paper 1.16 build #503 or higher.

### Setup
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/onboarding/tcpshield-plugin) guidelines.
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/config/tcpshield-plugin) guidelines.

### Compiling
In order to compile TCPShield, [install Gradle](https://docs.gradle.org/current/userguide/installation.html) and run the following command in the project folder:
Expand All@@ -29,4 +30,5 @@ See [Contact](https://docs.tcpshield.com/about-us)
These wonderful contributors have helped TCPShield make this plugin better!

* [Paul Zhang](https://github.com/paulzhng)
* [Draylar](https://github.com/Draylar)
* [RyanDeLap](https://github.com/RyanDeLap)
26 changes: 21 additions & 5 deletions build.gradle
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import org.yaml.snakeyaml.DumperOptions
Expand All@@ -18,6 +19,7 @@ buildscript {
plugins {
id 'java'
id 'idea'
id 'fabric-loom' version '0.6-SNAPSHOT'
}

repositories {
Expand All@@ -39,6 +41,12 @@ repositories {
maven {
url = 'https://repo.velocitypowered.com/snapshots/'
}
maven {
url = 'https://maven.fabricmc.net/'
}
flatDir {
dirs '/libs'
}
}

dependencies {
Expand All@@ -47,17 +55,24 @@ dependencies {
compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.4.0'

// Paper
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.15.2-R0.1-SNAPSHOT'
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.16.5-R0.1-20210227.144841-85'

// BungeeCord
compileOnly group: 'net.md-5', name: 'bungeecord-api', version: '1.14-SNAPSHOT'

// Velocity
compileOnly group: 'com.velocitypowered', name: 'velocity-api', version: '1.0.0-SNAPSHOT'

// Fabric
minecraft "com.mojang:minecraft:1.16.5"
mappings "net.fabricmc:yarn:1.16.5+build.5:v2"
modImplementation group: 'net.fabricmc', name: 'fabric-loader', version: '0.11.2'

// Testing
testImplementation group: 'org.junit.jupiter', name:'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version:'5.7.0-M1'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.7.0-M1'

compileOnly 'org.geyser:floodgate-spigot:2.0'
}

test {
Expand All@@ -68,7 +83,7 @@ configurations {
testImplementation.extendsFrom compileOnly
}

version = '2.4'
version = '2.5'
group = 'net.tcpshield.tcpshield'
archivesBaseName = 'TCPShield'

Expand DownExpand Up@@ -133,6 +148,7 @@ void updateYaml() {
}

void updateJson() {
def gson = new GsonBuilder().setPrettyPrinting().create();
def velocityJson = new File('src/main/resources/velocity-plugin.json')

def files = [velocityJson]
Expand All@@ -143,7 +159,7 @@ void updateJson() {
object.addProperty("version", version.toString())

new FileWriter(file).withCloseable { writer ->
writer.write(object.toString())
writer.write(gson.toJson(object))
}
}
}
Expand Down
Binary file addedlibs/floodgate-spigot.jar
Binary file not shown.
10 changes: 10 additions & 0 deletions settings.gradle
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
gradlePluginPortal()
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,8 +35,8 @@ public void onHandshake(IPacket packet, IPlayer player) {
InetAddress inetAddress = InetAddress.getByName(player.getIP());
if (!ipValidation.validateIP(inetAddress)) throw new InvalidIPException();

if (rawPayload == null)
return; // raw payload is passed when it's not available -> e.g. Paper server list ping events
// raw payload is passed when it's not available -> e.g. Paper server list ping events
if (rawPayload == null) return;

String extraData = null;

Expand DownExpand Up@@ -69,7 +69,7 @@ public void onHandshake(IPacket packet, IPlayer player) {
} catch (InvalidIPException e) {
handleInvalidIPException(player, rawPayload);
} catch (IPModificationFailureException e) {
this.logger.warning(String.format("%s[%s/%s]'s IP failed to be modified. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s's IP failed to be modified. Raw payload = \"%s\"", player.getIP(), rawPayload));
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
Expand All@@ -78,11 +78,16 @@ public void onHandshake(IPacket packet, IPlayer player) {

private void handleInvalidIPException(IPlayer player, String rawPayload) {
if (config.isDebug()) {
this.logger.warning(String.format("%s[%s/%s] was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getIP(), rawPayload));
}

if (config.isOnlyProxy()) {
player.disconnect();
}
}

public TCPShieldConfig getConfig() {
return config;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,10 +6,6 @@

public interface IPlayer {

String getUUID();

String getName();

String getIP();

void setIP(InetSocketAddress ip) throws IPModificationFailureException;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@ public abstract class TCPShieldConfig {
protected boolean onlyProxy;
protected File ipWhitelistFolder;
protected boolean debug;
protected boolean geyser;

public boolean isOnlyProxy() {
return this.onlyProxy;
Expand All@@ -20,4 +21,8 @@ public boolean isDebug() {
return this.debug;
}

public boolean isGeyser() {
return this.geyser;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,21 +13,25 @@ public void onEnable() {
new TCPShieldPaper(this).load();
} else {
if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) {
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib.");
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper (1.16 build #503 or higher) to enable native compatibility or install ProtocolLib.");
return;
}

new TCPShieldProtocolLib(this).load();
}
}

/**
* Checks if the server version supports native Paper support (Paper 1.16.5 build #503 or higher)
*
* @return if the server version supports native Paper support
*/
private boolean isPaper() {
if (1 == 1) return false;

try {
Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
Class<?> handshakeEvent = Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
handshakeEvent.getMethod("getOriginalSocketAddressHostname");
return true;
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException | NoSuchMethodException e) {
return false;
}
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ public BukkitConfigImpl(JavaPlugin javaPlugin) {

this.onlyProxy = config.getBoolean("only-allow-proxy-connections");
this.ipWhitelistFolder = new File(javaPlugin.getDataFolder(), "ip-whitelist");
this.geyser = config.getBoolean("enable-geyser-compatibility");
this.debug = config.getBoolean("debug-mode");
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ public class PaperHandshakePacketHandler implements Listener {

private final HandshakePacketHandler handshakePacketHandler;

public PaperHandshakePacketHandler(JavaPlugin plugin) {
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
public PaperHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) {
this.handshakePacketHandler = handshakePacketHandler;
}

@EventHandler(priority = EventPriority.LOWEST)
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
package net.tcpshield.tcpshield.bukkit.paper;

import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserHandshakePacketHandler;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import net.tcpshield.tcpshield.velocity.VelocityHandshakePacketHandler;
import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

Expand All@@ -12,7 +18,11 @@ public TCPShieldPaper(JavaPlugin plugin) {
}

public void load() {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(plugin);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));

GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(handshakePacketHandler);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
});
}
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
package net.tcpshield.tcpshield.bukkit.paper.impl;

import com.destroystokyo.paper.event.player.PlayerHandshakeEvent;
import net.kyori.adventure.text.Component;
import net.tcpshield.tcpshield.abstraction.IPlayer;

import java.net.InetSocketAddress;
import java.util.UUID;

public class PaperPlayerImpl implements IPlayer {

Expand All@@ -14,22 +14,9 @@ public PaperPlayerImpl(PlayerHandshakeEvent handshakeEvent) {
this.handshakeEvent = handshakeEvent;
}

@Override
public String getUUID() {
UUID uuid = handshakeEvent.getUniqueId();
if (uuid == null) return "unknown";

return uuid.toString();
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return handshakeEvent.getSocketAddressHostname();
return handshakeEvent.getOriginalSocketAddressHostname();
}

@Override
Expand All@@ -40,7 +27,7 @@ public void setIP(InetSocketAddress ip) {
@Override
public void disconnect() {
handshakeEvent.setCancelled(false);
handshakeEvent.setFailMessage("Connection failed. Please try again or contact an administrator.");
handshakeEvent.failMessage(Component.text("Connection failed. Please try again or contact an administrator."));
handshakeEvent.setFailed(true);
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,16 +13,6 @@ public PaperServerListPingPlayerImpl(PaperServerListPingEvent pingEvent) {
this.pingEvent = pingEvent;
}

@Override
public String getUUID() {
return "unknown";
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return pingEvent.getAddress().getHostAddress();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.abstraction.IPacket;
import net.tcpshield.tcpshield.abstraction.IPlayer;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPacketImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPlayerImpl;
import org.bukkit.plugin.java.JavaPlugin;
Expand All@@ -16,9 +15,9 @@ public class ProtocolLibHandshakePacketHandler extends PacketAdapter {

private final HandshakePacketHandler handshakePacketHandler;

public ProtocolLibHandshakePacketHandler(JavaPlugin plugin) {
public ProtocolLibHandshakePacketHandler(JavaPlugin plugin, HandshakePacketHandler handshakePacketHandler) {
super(plugin, ListenerPriority.LOWEST, PacketType.Handshake.Client.SET_PROTOCOL);
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
this.handshakePacketHandler = handshakePacketHandler;
}

@Override
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
package net.tcpshield.tcpshield.bukkit.protocollib;

import com.comphenix.protocol.ProtocolLibrary;
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import org.bukkit.plugin.java.JavaPlugin;

public class TCPShieldProtocolLib {
Expand All@@ -11,7 +15,10 @@ public TCPShieldProtocolLib(JavaPlugin plugin) {
}

public void load() {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin);
com.comphenix.protocol.ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin, handshakePacketHandler);
ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
});
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,16 +34,6 @@ public ProtocolLibPlayerImpl(Player player) {
this.ip = player.getAddress().getAddress().getHostAddress();
}

@Override
public String getUUID() {
return "unknown"; // not supported with temporary players
}

@Override
public String getName() {
return "unknown"; // not supported with temporary players
}

@Override
public String getIP() {
return ip;
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,12 +6,13 @@ It also parses passed IP addresses so the server is aware of the real player IP

### Compatibility

TCPShield is compatible with Spigot / CraftBukkit, BungeeCordand Velocity.
TCPShield is compatible with Spigot / CraftBukkit, BungeeCord, Velocity and Fabric.

When using Spigot / CraftBukkit, [ProtocolLib](https://github.com/aadnk/ProtocolLib) needs to be installed.
This does not apply when using Paper 1.16 build #503 or higher.

### Setup
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/onboarding/tcpshield-plugin) guidelines.
Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/config/tcpshield-plugin) guidelines.

### Compiling
In order to compile TCPShield, [install Gradle](https://docs.gradle.org/current/userguide/installation.html) and run the following command in the project folder:
Expand All@@ -29,4 +30,5 @@ See [Contact](https://docs.tcpshield.com/about-us)
These wonderful contributors have helped TCPShield make this plugin better!

* [Paul Zhang](https://github.com/paulzhng)
* [Draylar](https://github.com/Draylar)
* [RyanDeLap](https://github.com/RyanDeLap)
26 changes: 21 additions & 5 deletions build.gradle
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import org.yaml.snakeyaml.DumperOptions
Expand All@@ -18,6 +19,7 @@ buildscript {
plugins {
id 'java'
id 'idea'
id 'fabric-loom' version '0.6-SNAPSHOT'
}

repositories {
Expand All@@ -39,6 +41,12 @@ repositories {
maven {
url = 'https://repo.velocitypowered.com/snapshots/'
}
maven {
url = 'https://maven.fabricmc.net/'
}
flatDir {
dirs '/libs'
}
}

dependencies {
Expand All@@ -47,17 +55,24 @@ dependencies {
compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.4.0'

// Paper
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.15.2-R0.1-SNAPSHOT'
compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.16.5-R0.1-20210227.144841-85'

// BungeeCord
compileOnly group: 'net.md-5', name: 'bungeecord-api', version: '1.14-SNAPSHOT'

// Velocity
compileOnly group: 'com.velocitypowered', name: 'velocity-api', version: '1.0.0-SNAPSHOT'

// Fabric
minecraft "com.mojang:minecraft:1.16.5"
mappings "net.fabricmc:yarn:1.16.5+build.5:v2"
modImplementation group: 'net.fabricmc', name: 'fabric-loader', version: '0.11.2'

// Testing
testImplementation group: 'org.junit.jupiter', name:'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version:'5.7.0-M1'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.0-M1'
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.7.0-M1'

compileOnly 'org.geyser:floodgate-spigot:2.0'
}

test {
Expand All@@ -68,7 +83,7 @@ configurations {
testImplementation.extendsFrom compileOnly
}

version = '2.4'
version = '2.5'
group = 'net.tcpshield.tcpshield'
archivesBaseName = 'TCPShield'

Expand DownExpand Up@@ -133,6 +148,7 @@ void updateYaml() {
}

void updateJson() {
def gson = new GsonBuilder().setPrettyPrinting().create();
def velocityJson = new File('src/main/resources/velocity-plugin.json')

def files = [velocityJson]
Expand All@@ -143,7 +159,7 @@ void updateJson() {
object.addProperty("version", version.toString())

new FileWriter(file).withCloseable { writer ->
writer.write(object.toString())
writer.write(gson.toJson(object))
}
}
}
Expand Down
Binary file addedlibs/floodgate-spigot.jar
Binary file not shown.
10 changes: 10 additions & 0 deletions settings.gradle
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
gradlePluginPortal()
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,8 +35,8 @@ public void onHandshake(IPacket packet, IPlayer player) {
InetAddress inetAddress = InetAddress.getByName(player.getIP());
if (!ipValidation.validateIP(inetAddress)) throw new InvalidIPException();

if (rawPayload == null)
return; // raw payload is passed when it's not available -> e.g. Paper server list ping events
// raw payload is passed when it's not available -> e.g. Paper server list ping events
if (rawPayload == null) return;

String extraData = null;

Expand DownExpand Up@@ -69,7 +69,7 @@ public void onHandshake(IPacket packet, IPlayer player) {
} catch (InvalidIPException e) {
handleInvalidIPException(player, rawPayload);
} catch (IPModificationFailureException e) {
this.logger.warning(String.format("%s[%s/%s]'s IP failed to be modified. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s's IP failed to be modified. Raw payload = \"%s\"", player.getIP(), rawPayload));
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
Expand All@@ -78,11 +78,16 @@ public void onHandshake(IPacket packet, IPlayer player) {

private void handleInvalidIPException(IPlayer player, String rawPayload) {
if (config.isDebug()) {
this.logger.warning(String.format("%s[%s/%s] was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload));
this.logger.warning(String.format("%s was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getIP(), rawPayload));
}

if (config.isOnlyProxy()) {
player.disconnect();
}
}

public TCPShieldConfig getConfig() {
return config;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,10 +6,6 @@

public interface IPlayer {

String getUUID();

String getName();

String getIP();

void setIP(InetSocketAddress ip) throws IPModificationFailureException;
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,6 +7,7 @@ public abstract class TCPShieldConfig {
protected boolean onlyProxy;
protected File ipWhitelistFolder;
protected boolean debug;
protected boolean geyser;

public boolean isOnlyProxy() {
return this.onlyProxy;
Expand All@@ -20,4 +21,8 @@ public boolean isDebug() {
return this.debug;
}

public boolean isGeyser() {
return this.geyser;
}

}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,21 +13,25 @@ public void onEnable() {
new TCPShieldPaper(this).load();
} else {
if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) {
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib.");
this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper (1.16 build #503 or higher) to enable native compatibility or install ProtocolLib.");
return;
}

new TCPShieldProtocolLib(this).load();
}
}

/**
* Checks if the server version supports native Paper support (Paper 1.16.5 build #503 or higher)
*
* @return if the server version supports native Paper support
*/
private boolean isPaper() {
if (1 == 1) return false;

try {
Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
Class<?> handshakeEvent = Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent");
handshakeEvent.getMethod("getOriginalSocketAddressHostname");
return true;
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException | NoSuchMethodException e) {
return false;
}
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ public BukkitConfigImpl(JavaPlugin javaPlugin) {

this.onlyProxy = config.getBoolean("only-allow-proxy-connections");
this.ipWhitelistFolder = new File(javaPlugin.getDataFolder(), "ip-whitelist");
this.geyser = config.getBoolean("enable-geyser-compatibility");
this.debug = config.getBoolean("debug-mode");
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,8 +19,8 @@ public class PaperHandshakePacketHandler implements Listener {

private final HandshakePacketHandler handshakePacketHandler;

public PaperHandshakePacketHandler(JavaPlugin plugin) {
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
public PaperHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) {
this.handshakePacketHandler = handshakePacketHandler;
}

@EventHandler(priority = EventPriority.LOWEST)
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
package net.tcpshield.tcpshield.bukkit.paper;

import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserHandshakePacketHandler;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import net.tcpshield.tcpshield.velocity.VelocityHandshakePacketHandler;
import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

Expand All@@ -12,7 +18,11 @@ public TCPShieldPaper(JavaPlugin plugin) {
}

public void load() {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(plugin);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));

GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(handshakePacketHandler);
Bukkit.getPluginManager().registerEvents(packetHandler, plugin);
});
}
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
package net.tcpshield.tcpshield.bukkit.paper.impl;

import com.destroystokyo.paper.event.player.PlayerHandshakeEvent;
import net.kyori.adventure.text.Component;
import net.tcpshield.tcpshield.abstraction.IPlayer;

import java.net.InetSocketAddress;
import java.util.UUID;

public class PaperPlayerImpl implements IPlayer {

Expand All@@ -14,22 +14,9 @@ public PaperPlayerImpl(PlayerHandshakeEvent handshakeEvent) {
this.handshakeEvent = handshakeEvent;
}

@Override
public String getUUID() {
UUID uuid = handshakeEvent.getUniqueId();
if (uuid == null) return "unknown";

return uuid.toString();
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return handshakeEvent.getSocketAddressHostname();
return handshakeEvent.getOriginalSocketAddressHostname();
}

@Override
Expand All@@ -40,7 +27,7 @@ public void setIP(InetSocketAddress ip) {
@Override
public void disconnect() {
handshakeEvent.setCancelled(false);
handshakeEvent.setFailMessage("Connection failed. Please try again or contact an administrator.");
handshakeEvent.failMessage(Component.text("Connection failed. Please try again or contact an administrator."));
handshakeEvent.setFailed(true);
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,16 +13,6 @@ public PaperServerListPingPlayerImpl(PaperServerListPingEvent pingEvent) {
this.pingEvent = pingEvent;
}

@Override
public String getUUID() {
return "unknown";
}

@Override
public String getName() {
return "unknown";
}

@Override
public String getIP() {
return pingEvent.getAddress().getHostAddress();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.abstraction.IPacket;
import net.tcpshield.tcpshield.abstraction.IPlayer;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPacketImpl;
import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPlayerImpl;
import org.bukkit.plugin.java.JavaPlugin;
Expand All@@ -16,9 +15,9 @@ public class ProtocolLibHandshakePacketHandler extends PacketAdapter {

private final HandshakePacketHandler handshakePacketHandler;

public ProtocolLibHandshakePacketHandler(JavaPlugin plugin) {
public ProtocolLibHandshakePacketHandler(JavaPlugin plugin, HandshakePacketHandler handshakePacketHandler) {
super(plugin, ListenerPriority.LOWEST, PacketType.Handshake.Client.SET_PROTOCOL);
this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
this.handshakePacketHandler = handshakePacketHandler;
}

@Override
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
package net.tcpshield.tcpshield.bukkit.protocollib;

import com.comphenix.protocol.ProtocolLibrary;
import net.tcpshield.tcpshield.HandshakePacketHandler;
import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl;
import net.tcpshield.tcpshield.geyser.GeyserUtils;
import org.bukkit.plugin.java.JavaPlugin;

public class TCPShieldProtocolLib {
Expand All@@ -11,7 +15,10 @@ public TCPShieldProtocolLib(JavaPlugin plugin) {
}

public void load() {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin);
com.comphenix.protocol.ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin));
GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> {
ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin, handshakePacketHandler);
ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler);
});
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,16 +34,6 @@ public ProtocolLibPlayerImpl(Player player) {
this.ip = player.getAddress().getAddress().getHostAddress();
}

@Override
public String getUUID() {
return "unknown"; // not supported with temporary players
}

@Override
public String getName() {
return "unknown"; // not supported with temporary players
}

@Override
public String getIP() {
return ip;
Expand Down
Loading