diff --git a/pom.xml b/pom.xml index 8718454..b72c7f2 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ eu.endermite CommandWhitelist - 1.6.0 + 1.7.0 jar CommandWhitelist diff --git a/src/main/java/eu/endermite/commandwhitelist/spigot/CommandWhitelist.java b/src/main/java/eu/endermite/commandwhitelist/spigot/CommandWhitelist.java index dd54f92..6e84897 100644 --- a/src/main/java/eu/endermite/commandwhitelist/spigot/CommandWhitelist.java +++ b/src/main/java/eu/endermite/commandwhitelist/spigot/CommandWhitelist.java @@ -2,15 +2,13 @@ package eu.endermite.commandwhitelist.spigot; import eu.endermite.commandwhitelist.spigot.command.MainCommand; import eu.endermite.commandwhitelist.spigot.config.ConfigCache; -import eu.endermite.commandwhitelist.spigot.listeners.LegacyPlayerTabChatCompleteListener; -import eu.endermite.commandwhitelist.spigot.listeners.PlayerCommandPreProcessListener; -import eu.endermite.commandwhitelist.spigot.listeners.PlayerCommandSendListener; -import eu.endermite.commandwhitelist.spigot.listeners.TabCompleteBlockerListener; +import eu.endermite.commandwhitelist.spigot.listeners.*; import eu.endermite.commandwhitelist.spigot.metrics.BukkitMetrics; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; public class CommandWhitelist extends JavaPlugin { @@ -28,12 +26,20 @@ public class CommandWhitelist extends JavaPlugin { reloadPluginConfig(); - getServer().getPluginManager().registerEvents(new PlayerCommandPreProcessListener(), this); + Plugin protocollib = getServer().getPluginManager().getPlugin("ProtocolLib"); + + getServer().getPluginManager().registerEvents(new PlayerCommandSendListener(), this); if (!isLegacy) { - getServer().getPluginManager().registerEvents(new PlayerCommandSendListener(), this); + if (!getConfigCache().isUseProtocolLib() || protocollib == null || !protocollib.isEnabled()) { + getServer().getPluginManager().registerEvents(new PlayerCommandPreProcessListener(), this); + } else { + PacketCommandSendListener.protocol(this); + getLogger().info(ChatColor.AQUA+"Using ProtocolLib for command filter!"); + } + } else { getLogger().info(ChatColor.AQUA+"Running in legacy mode..."); - if (getServer().getPluginManager().getPlugin("ProtocolLib") != null) { + if (protocollib != null) { LegacyPlayerTabChatCompleteListener.protocol(this); } else { getLogger().info(ChatColor.YELLOW+"ProtocolLib is required for tab completion blocking!"); diff --git a/src/main/java/eu/endermite/commandwhitelist/spigot/config/ConfigCache.java b/src/main/java/eu/endermite/commandwhitelist/spigot/config/ConfigCache.java index 6210f4c..adde974 100644 --- a/src/main/java/eu/endermite/commandwhitelist/spigot/config/ConfigCache.java +++ b/src/main/java/eu/endermite/commandwhitelist/spigot/config/ConfigCache.java @@ -17,6 +17,7 @@ public class ConfigCache { private final String prefix, commandDenied, noPermission, noSubCommand, configReloaded, whitelistedCommand, removedWhitelistedCommand, noSuchGroup, subCommandDenied; private final List commandDeniedList; + private boolean useProtocolLib; public ConfigCache(FileConfiguration config) { @@ -33,6 +34,8 @@ public class ConfigCache { removedWhitelistedCommand = config.getString("messages.removed-from-whitelist", "&eRemoved command &6%s &efrom permission &6%s"); noSuchGroup = config.getString("messages.group-doesnt-exist", "&cGroup %s doesn't exist"); + useProtocolLib = config.getBoolean("use-protocollib-to-detect-commands", false); + Set perms = config.getConfigurationSection("commands").getKeys(false); for (String s : perms) { this.permList.put(s, config.getStringList("commands."+s)); @@ -99,4 +102,7 @@ public class ConfigCache { public String getSubCommandDenied() { return subCommandDenied; } + public boolean isUseProtocolLib() { + return useProtocolLib; + } } \ No newline at end of file diff --git a/src/main/java/eu/endermite/commandwhitelist/spigot/listeners/PacketCommandSendListener.java b/src/main/java/eu/endermite/commandwhitelist/spigot/listeners/PacketCommandSendListener.java new file mode 100644 index 0000000..5cc03b3 --- /dev/null +++ b/src/main/java/eu/endermite/commandwhitelist/spigot/listeners/PacketCommandSendListener.java @@ -0,0 +1,68 @@ +package eu.endermite.commandwhitelist.spigot.listeners; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.ListenerPriority; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import eu.endermite.commandwhitelist.api.CommandsList; +import eu.endermite.commandwhitelist.api.RandomStuff; +import eu.endermite.commandwhitelist.spigot.CommandWhitelist; +import eu.endermite.commandwhitelist.spigot.config.ConfigCache; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import java.util.List; +import java.util.Map; + +public class PacketCommandSendListener { + + public static void protocol(CommandWhitelist plugin) { + ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + commandExecListener(protocolManager, plugin); + } + + public static void commandExecListener(ProtocolManager protocolManager, Plugin plugin) { + protocolManager.addPacketListener(new PacketAdapter(plugin, ListenerPriority.HIGHEST, PacketType.Play.Client.CHAT) { + @Override + public void onPacketReceiving(PacketEvent event) { + PacketContainer packet = event.getPacket(); + String string = packet.getStrings().read(0); + if (!string.startsWith("/")) + return; + Player player = event.getPlayer(); + if (player.hasPermission("commandwhitelist.bypass")) + return; + String cmd = string.replace("/", ""); + String[] split = cmd.split("\\s+"); + String command = split[0].toLowerCase(); + for (Map.Entry> s : CommandWhitelist.getConfigCache().getPermList().entrySet()) { + if (!player.hasPermission("commandwhitelist.commands." + s.getKey())) + continue; + for (String comm : s.getValue()) { + comm = comm.toLowerCase(); + if (command.equalsIgnoreCase(comm) || command.startsWith(comm + " ")) { + List bannedSubCommands = CommandsList.getSuggestions(player); + for (String bannedSubCommand : bannedSubCommands) { + if (cmd.startsWith(bannedSubCommand)) { + event.setCancelled(true); + ConfigCache config = CommandWhitelist.getConfigCache(); + player.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getPrefix() + RandomStuff.getMessage(config.getCommandDeniedList(), config.getSubCommandDenied()))); + return; + } + } + return; + } + } + } + + event.setCancelled(true); + ConfigCache config = CommandWhitelist.getConfigCache(); + player.sendMessage(ChatColor.translateAlternateColorCodes('&', config.getPrefix() + RandomStuff.getMessage(config.getCommandDeniedList(), config.getCommandDenied()))); + + } + }); + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index cc3db0c..5830e94 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -9,6 +9,11 @@ messages: removed-from-whitelist: "&eRemoved command &6%s &efrom permission &6%s" group-doesnt-exist: "&cGroup doesn't exist or error occured" +# To cover the 1% of plugins that don't register their commands and/or aliases properly. +# Do not enable if you don't have issues with aliased commands. +# This requires server restart to take effect. +use-protocollib-to-detect-commands: false + commands: # Permissions that control what commands players can use # you can add unlimited amount of whitelists