Skip to content
Open
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: 3 additions & 3 deletions bungeeguard-spigot/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib</artifactId>
<version>5.0.0-SNAPSHOT</version>
<groupId>com.github.retrooper</groupId>
<artifactId>packetevents-spigot</artifactId>
<version>2.7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,11 @@

package me.lucko.bungeeguard.spigot;

import com.github.retrooper.packetevents.PacketEvents;
import me.lucko.bungeeguard.backend.BungeeGuardBackend;
import me.lucko.bungeeguard.backend.TokenStore;
import me.lucko.bungeeguard.spigot.listener.PacketEventsHandshakeListener;
import me.lucko.bungeeguard.spigot.listener.PaperHandshakeListener;
import me.lucko.bungeeguard.spigot.listener.ProtocolHandshakeListener;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
Expand All @@ -46,10 +47,19 @@
*/
public class BungeeGuardBackendPlugin extends JavaPlugin implements BungeeGuardBackend {

private static BungeeGuardBackendPlugin instance;

private TokenStore tokenStore;

@Override
public void onLoad() {
PacketEvents.getAPI().load();
}

@Override
public void onEnable() {
instance = this;

saveDefaultConfig();
this.tokenStore = new TokenStore(this);
this.tokenStore.load();
Expand All @@ -71,11 +81,13 @@ public void onEnable() {
PaperHandshakeListener listener = new PaperHandshakeListener(this, this.tokenStore);
getServer().getPluginManager().registerEvents(listener, this);

} else if (hasProtocolLib()) {
getLogger().info("Using ProtocolLib to listen for connections.");
} else if (hasPacketEvents()) {
getLogger().info("Using PacketEvents to listen for connections.");

PacketEvents.getAPI().init();

ProtocolHandshakeListener listener = new ProtocolHandshakeListener(this, this.tokenStore);
listener.registerAdapter(this);
PacketEventsHandshakeListener listener = new PacketEventsHandshakeListener(this, this.tokenStore);
listener.registerListener();

} else {
getLogger().severe("------------------------------------------------------------");
Expand All @@ -92,6 +104,10 @@ public void onEnable() {
}
}

public static BungeeGuardBackendPlugin getInstance() {
return instance;
}

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof ConsoleCommandSender)) {
Expand All @@ -110,6 +126,11 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return true;
}

@Override
public void onDisable() {
PacketEvents.getAPI().terminate();
}

@Override
public String getMessage(String key) {
return ChatColor.translateAlternateColorCodes('&', getConfig().getString(key));
Expand All @@ -128,8 +149,8 @@ private static boolean isPaperServer() {
return classExists("com.destroystokyo.paper.PaperConfig");
}

private boolean hasProtocolLib() {
return getServer().getPluginManager().getPlugin("ProtocolLib") != null;
private boolean hasPacketEvents() {
return getServer().getPluginManager().getPlugin("packetevents") != null;
}

private static boolean classExists(String className) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package me.lucko.bungeeguard.spigot.listener;

import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketListener;
import com.github.retrooper.packetevents.event.PacketListenerPriority;
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
import com.github.retrooper.packetevents.wrapper.handshaking.client.WrapperHandshakingClientHandshake;
import me.lucko.bungeeguard.backend.BungeeGuardBackend;
import me.lucko.bungeeguard.backend.TokenStore;
import me.lucko.bungeeguard.backend.listener.AbstractHandshakeListener;
import me.lucko.bungeeguard.spigot.BungeeCordHandshake;
import me.lucko.bungeeguard.spigot.BungeeGuardBackendPlugin;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;

import java.net.InetSocketAddress;
import java.util.logging.Level;

/**
* A handshake listener using PacketEvents.
*/
public class PacketEventsHandshakeListener extends AbstractHandshakeListener {

private static final int HANDSHAKE_PACKET_ID = 0x00; // ID for Handshake packets

public PacketEventsHandshakeListener(BungeeGuardBackend plugin, TokenStore tokenStore) {
super(plugin, tokenStore);
}

public void registerListener() {
PacketEvents.getAPI().getEventManager().registerListener(new HandshakeListener(), PacketListenerPriority.HIGHEST);
}

private final class HandshakeListener implements PacketListener {

@Override
public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketId() != HANDSHAKE_PACKET_ID) {
return;
}

Player player = event.getPlayer();

WrapperHandshakingClientHandshake wrapperHandshakingClientHandshake = new WrapperHandshakingClientHandshake(event);
if (!wrapperHandshakingClientHandshake.getIntention().equals(WrapperHandshakingClientHandshake.ConnectionIntention.LOGIN)) {
return;
}

String handshake = wrapperHandshakingClientHandshake.readString(0);
BungeeCordHandshake decoded = BungeeCordHandshake.decodeAndVerify(handshake, PacketEventsHandshakeListener.this.tokenStore);

if (decoded instanceof BungeeCordHandshake.Fail) {
String ip = "null";
InetSocketAddress address = player.getAddress();
if (address != null) {
ip = address.getHostString();
if (ip.length() > 15) {
ip = BungeeCordHandshake.encodeBase64(ip);
}
}
BungeeCordHandshake.Fail fail = (BungeeCordHandshake.Fail) decoded;
BungeeGuardBackendPlugin.getInstance().getLogger().warning("Denying connection from " + ip + " - " + fail.describeConnection() + " - reason: " + fail.reason().name());

String kickMessage;
if (fail.reason() == BungeeCordHandshake.Fail.Reason.INVALID_HANDSHAKE) {
kickMessage = PacketEventsHandshakeListener.this.noDataKickMessage;
} else {
kickMessage = PacketEventsHandshakeListener.this.invalidTokenKickMessage;
}

try {
closeConnection(player, kickMessage);
} catch (Exception e) {
BungeeGuardBackendPlugin.getInstance().getLogger().log(Level.SEVERE, "An error occurred while closing connection for " + player, e);
}

// Prevent further processing by modifying the packet
wrapperHandshakingClientHandshake.writeString("null");
return;
}

// Successfully decoded and verified the handshake
BungeeCordHandshake.Success data = (BungeeCordHandshake.Success) decoded;
wrapperHandshakingClientHandshake.writeString(data.encode());
}
}

private static void closeConnection(Player player, String kickMessage) {
player.kickPlayer(kickMessage);
}
}

This file was deleted.

2 changes: 1 addition & 1 deletion bungeeguard-spigot/src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ author: Luck
load: STARTUP

main: me.lucko.bungeeguard.spigot.BungeeGuardBackendPlugin
softdepend: [ProtocolLib]
softdepend: [packetevents]
api-version: 1.13
folia-supported: true

Expand Down
8 changes: 6 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,12 @@
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
<repository>
<id>luck-repo</id>
<url>https://repo.lucko.me/</url>
<id>codemc-releases</id>
<url>https://repo.codemc.io/repository/maven-releases/</url>
</repository>
<repository>
<id>codemc-snapshots</id>
<url>https://repo.codemc.io/repository/maven-snapshots/</url>
</repository>
</repositories>

Expand Down