Skip to content

Commit

Permalink
bungee: smarter packet-in string handling
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Dec 2, 2021
1 parent 4f6fd38 commit 38d839b
Show file tree
Hide file tree
Showing 13 changed files with 49 additions and 109 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,13 @@ public class BungeeClientHandler extends ChannelInboundHandlerAdapter {

public ByteBuf packetBuffer;

public boolean hasClosed = false;

public void fail(String reason) {
if (hasClosed) {
return;
}
hasClosed = true;
Debug.echoError("Depenizen-Bungee connection failed: " + reason);
channel.close();
BungeeBridge.instance.connected = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,18 @@ public abstract class PacketIn {

public abstract void process(ByteBuf data);

public String readString(ByteBuf buf, int length) {
byte[] strBytes = new byte[length];
buf.readBytes(strBytes, 0, length);
public String readString(ByteBuf buf, String label) {
if (buf.readableBytes() < 4) {
BungeeBridge.instance.handler.fail("Invalid " + getName() + " Packet " + label + " length bytes (needed 4)");
return null;
}
int len = buf.readInt();
if (buf.readableBytes() < len || len < 0) {
BungeeBridge.instance.handler.fail("Invalid " + getName() + " Packet " + label + " (bytes requested: " + len + ", bytes available: " + buf.readableBytes() + ")");
return null;
}
byte[] strBytes = new byte[len];
buf.readBytes(strBytes, 0, len);
return new String(strBytes, Charsets.UTF_8);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,10 @@ public String getName() {

@Override
public void process(ByteBuf data) {
if (data.readableBytes() < 4) {
BungeeBridge.instance.handler.fail("Invalid AddServerPacket (bytes available: " + data.readableBytes() + ")");
String serverName = readString(data, "serverName");
if (serverName == null) {
return;
}
int yourNameLength = data.readInt();
if (data.readableBytes() < yourNameLength || yourNameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid AddServerPacket (name bytes requested: " + yourNameLength + ")");
return;
}
String serverName = readString(data, yourNameLength);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> {
BungeeBridge.instance.knownServers.add(serverName);
BungeeServerConnectScriptEvent.instance.serverName = serverName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,10 @@ public void process(ByteBuf data) {
long mostSigBits = data.readLong();
long leastSigBits = data.readLong();
UUID uuid = new UUID(mostSigBits, leastSigBits);
int nameLength = data.readInt();
if (data.readableBytes() < nameLength || nameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid PlayerQuitPacket (name bytes requested: " + nameLength + ")");
String name = readString(data, "name");
if (name == null) {
return;
}
String name = readString(data, nameLength);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> {
BungeePlayerQuitsScriptEvent.instance.name = name;
BungeePlayerQuitsScriptEvent.instance.uuid = uuid;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,11 @@ public void process(ByteBuf data) {
long mostSigBits = data.readLong();
long leastSigBits = data.readLong();
UUID uuid = new UUID(mostSigBits, leastSigBits);
int nameLength = data.readInt();
if (data.readableBytes() < nameLength || nameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid PlayerSwitchServerPacket (name bytes requested: " + nameLength + ")");
String name = readString(data, "name");
String serverName = readString(data, "serverName");
if (name == null || serverName == null) {
return;
}
String name = readString(data, nameLength);
int serverNameLength = data.readInt();
if (data.readableBytes() < serverNameLength || serverNameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid PlayerSwitchServerPacket (name bytes requested: " + serverNameLength + ")");
return;
}
String serverName = readString(data, serverNameLength);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> {
BungeePlayerServerSwitchScriptEvent.instance.name = name;
BungeePlayerServerSwitchScriptEvent.instance.uuid = uuid;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,12 @@ public void process(ByteBuf data) {
return;
}
long id = data.readLong();
int senderLength = data.readInt();
if (data.readableBytes() < senderLength || senderLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ProxyCommandPacket (sender bytes requested: " + senderLength + ")");
String sender = readString(data, "sender");
String command = readString(data, "command");
String senderIdText = readString(data, "senderID");
if (sender == null || command == null || senderIdText == null) {
return;
}
String sender = readString(data, senderLength);
int commandLength = data.readInt();
if (data.readableBytes() < commandLength || commandLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ProxyCommandPacket (command bytes requested: " + commandLength + ")");
return;
}
String command = readString(data, commandLength);
int senderIdLength = data.readInt();
if (data.readableBytes() < senderIdLength || senderIdLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ProxyCommandPacket (senderId bytes requested: " + senderIdLength + ")");
return;
}
String senderIdText = readString(data, senderIdLength);
UUID senderId = senderIdText.isEmpty() ? null : UUID.fromString(senderIdText);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> {
BungeeProxyServerCommandScriptEvent.instance.sender = sender;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,27 +22,15 @@ public void process(ByteBuf data) {
return;
}
long id = data.readLong();
int addressLength = data.readInt();
if (data.readableBytes() < addressLength || addressLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ProxyPingPacket (address bytes requested: " + addressLength + ")");
return;
}
String address = readString(data, addressLength);
String address = readString(data, "address");
int currentPlayers = data.readInt();
int maxPlayers = data.readInt();
int motdLength = data.readInt();
if (data.readableBytes() < motdLength || motdLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ProxyPingPacket (motd bytes requested: " + motdLength + ")");
return;
}
String motd = readString(data, motdLength);
String motd = readString(data, "motd");
int protocol = data.readInt();
int versionLength = data.readInt();
if (data.readableBytes() < versionLength || versionLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ProxyPingPacket (version bytes requested: " + versionLength + ")");
String version = readString(data, "version");
if (address == null || motd == null || version == null) {
return;
}
String version = readString(data, versionLength);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> {
BungeeProxyServerListPingScriptEvent.PingData ping = new BungeeProxyServerListPingScriptEvent.PingData();
ping.address = address;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,24 +30,12 @@ public void process(ByteBuf data) {
BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (bytes available: " + data.readableBytes() + ")");
return;
}
int nameLength = data.readInt();
if (data.readableBytes() < nameLength || nameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (name bytes requested: " + nameLength + ")");
String responseServer = readString(data, "serverName");
String tag = readString(data, "tag");
String defs = readString(data, "defs");
if (tag == null || defs == null) {
return;
}
String responseServer = readString(data, nameLength);
int tagLength = data.readInt();
if (data.readableBytes() < tagLength || tagLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (tag bytes requested: " + tagLength + ")");
return;
}
String tag = readString(data, tagLength);
int defLength = data.readInt();
if (data.readableBytes() < defLength || defLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (def bytes requested: " + defLength + ")");
return;
}
String defs = readString(data, defLength);
long uuidMost = data.readLong();
long uuidLeast = data.readLong();
int responseId = data.readInt();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,10 @@ public void process(ByteBuf data) {
BungeeBridge.instance.handler.fail("Invalid RemoveServerPacket (bytes available: " + data.readableBytes() + ")");
return;
}
int serverNameLength = data.readInt();
if (data.readableBytes() < serverNameLength || serverNameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RemoveServerPacket (name bytes requested: " + serverNameLength + ")");
String serverName = readString(data, "serverName");
if (serverName == null) {
return;
}
String serverName = readString(data, serverNameLength);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> {
BungeeBridge.instance.knownServers.remove(serverName);
BungeeServerDisconnectScriptEvent.instance.serverName = serverName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,11 @@ public void process(ByteBuf data) {
BungeeBridge.instance.handler.fail("Invalid RunCommandsPacket (bytes available: " + data.readableBytes() + ")");
return;
}
int commamndsLength = data.readInt();
if (data.readableBytes() < commamndsLength || commamndsLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RunCommandsPacket (command bytes requested: " + commamndsLength + ")");
String commands = readString(data, "commands");
String defs = readString(data, "defs");
if (commands == null || defs == null) {
return;
}
String commands = readString(data, commamndsLength);
int defsLength = data.readInt();
if (data.readableBytes() < defsLength || defsLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RunCommandsPacket (def bytes requested: " + defsLength + ")");
return;
}
String defs = readString(data, defsLength);
boolean shouldDebug = data.readByte() != 0;
long uuidMost = data.readLong();
long uuidLeast = data.readLong();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,11 @@ public void process(ByteBuf data) {
BungeeBridge.instance.handler.fail("Invalid RunScriptPacket (bytes available: " + data.readableBytes() + ")");
return;
}
int nameLength = data.readInt();
if (data.readableBytes() < nameLength || nameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RunScriptPacket (name bytes requested: " + nameLength + ")");
String scriptName = readString(data, "scriptName");
String defs = readString(data, "defs");
if (scriptName == null || defs == null) {
return;
}
String scriptName = readString(data, nameLength);
int defsLength = data.readInt();
if (data.readableBytes() < defsLength || defsLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RunScriptPacket (def bytes requested: " + defsLength + ")");
return;
}
String defs = readString(data, defsLength);
long uuidMost = data.readLong();
long uuidLeast = data.readLong();
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,10 @@ public void process(ByteBuf data) {
BungeeBridge.instance.handler.fail("Invalid TagResponsePacket (bytes available: " + data.readableBytes() + ")");
return;
}
int resLength = data.readInt();
if (data.readableBytes() < resLength || resLength < 0) {
BungeeBridge.instance.handler.fail("Invalid TagResponsePacket (result bytes requested: " + resLength + ")");
String result = readString(data, "result");
if (result == null) {
return;
}
String result = readString(data, resLength);
int id = data.readInt();
BungeeTagCommand.handleResult(id, result);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,10 @@ public String getName() {

@Override
public void process(ByteBuf data) {
if (data.readableBytes() < 4) {
BungeeBridge.instance.handler.fail("Invalid YourInfoPacket (bytes available: " + data.readableBytes() + ")");
String serverName = readString(data, "serverName");
if (serverName == null) {
return;
}
int yourNameLength = data.readInt();
if (data.readableBytes() < yourNameLength || yourNameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid YourInfoPacket (name bytes requested: " + yourNameLength + ")");
return;
}
String serverName = readString(data, yourNameLength);
BungeeBridge.instance.serverName = serverName;
}
}

0 comments on commit 38d839b

Please sign in to comment.