Validate tab completion requests before exposing command suggestions (#113)

* validate the requested command before exposing argument completions

* fix waterfall tab completion filtering

* some formatting

basic idea formatting wont be bad
This commit is contained in:
OverwriteMC
2026-08-26 15:06:07 +03:00
committed by GitHub
parent 6e38130675
commit 55b9647890
4 changed files with 36 additions and 14 deletions
@@ -20,7 +20,10 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
public class CommandWhitelistBukkit extends JavaPlugin {
@@ -85,7 +88,8 @@ public class CommandWhitelistBukkit extends JavaPlugin {
for (Player p : Bukkit.getOnlinePlayers()) {
p.updateCommands();
}
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
audiences.sender(sender).sendMessage(CWCommand.miniMessage.deserialize(configCache.prefix + configCache.config_reloaded));
});
}
@@ -13,12 +13,13 @@ public class AsyncTabCompleteBlockerListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST)
public void onCommandTabComplete(AsyncTabCompleteEvent event) {
if (!(event.getSender() instanceof Player)) return;
Player player = (Player) event.getSender();
if (!(event.getSender() instanceof Player player)) return;
if (player.hasPermission(CWPermission.BYPASS.permission())) return;
String buffer = event.getBuffer();
if ((buffer.split(" ").length == 1 && !buffer.endsWith(" ")) || !buffer.startsWith("/")) {
CommandWhitelistBukkit.getConfigCache().debug("Actively prevented "+event.getSender().getName()+"'s tab completion (sus packet)");
int commandEnd = buffer.indexOf(' ');
if (commandEnd < 0 || buffer.charAt(0) != '/' || !CommandWhitelistBukkit.getCommands(player)
.contains(buffer.substring(1, commandEnd).toLowerCase())) {
CommandWhitelistBukkit.getConfigCache().debug("Actively prevented " + event.getSender().getName() + "'s tab completion (sus packet)");
event.setCancelled(true);
return;
}
@@ -13,12 +13,13 @@ public class TabCompleteBlockerListener implements Listener {
@EventHandler(priority = EventPriority.NORMAL)
public void onCommandTabComplete(TabCompleteEvent event) {
if (!(event.getSender() instanceof Player)) return;
Player player = (Player) event.getSender();
if (!(event.getSender() instanceof Player player)) return;
if (player.hasPermission(CWPermission.BYPASS.permission())) return;
String buffer = event.getBuffer();
if ((buffer.split(" ").length == 1 && !buffer.endsWith(" ")) || !buffer.startsWith("/")) {
CommandWhitelistBukkit.getConfigCache().debug("Actively prevented "+event.getSender().getName()+"'s tab completion (sus packet)");
int commandEnd = buffer.indexOf(' ');
if (commandEnd < 0 || buffer.charAt(0) != '/' || !CommandWhitelistBukkit.getCommands(player)
.contains(buffer.substring(1, commandEnd).toLowerCase())) {
CommandWhitelistBukkit.getConfigCache().debug("Actively prevented " + event.getSender().getName() + "'s tab completion (sus packet)");
event.setCancelled(true);
return;
}