From f7e86e696bb13473fde86467302c3c5771ed5d9c Mon Sep 17 00:00:00 2001 From: mathiascode Date: Sat, 14 Dec 2019 20:47:26 +0200 Subject: [PATCH] Refactor command checker --- .../modules/entity/EntityExplosion.java | 7 +- .../extras/modules/entity/EntitySpawn.java | 22 +- .../extras/modules/player/PlayerCommand.java | 106 +------- .../modules/player/PlayerConnection.java | 4 +- .../extras/modules/server/ServerCommand.java | 237 +++++++++++------- 5 files changed, 178 insertions(+), 198 deletions(-) diff --git a/src/main/java/pw/kaboom/extras/modules/entity/EntityExplosion.java b/src/main/java/pw/kaboom/extras/modules/entity/EntityExplosion.java index 598ad6e..2787f14 100644 --- a/src/main/java/pw/kaboom/extras/modules/entity/EntityExplosion.java +++ b/src/main/java/pw/kaboom/extras/modules/entity/EntityExplosion.java @@ -14,10 +14,9 @@ class EntityExplosion implements Listener { event.setRadius(20); } - if (event.getEntity().getWorld().getEntitiesByClass(Fireball.class).size() > 40) { - if (event.getRadius() > 1) { - event.setRadius(1); - } + if (event.getEntity().getWorld().getEntitiesByClass(Fireball.class).size() > 30 && + event.getRadius() > 1) { + event.setRadius(1); } } } diff --git a/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java b/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java index e2d8739..0a4ccb1 100644 --- a/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java +++ b/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java @@ -67,7 +67,7 @@ class EntitySpawn implements Listener { if (entity instanceof LivingEntity) { final LivingEntity mob = (LivingEntity) entity; - checkIllegalEquipment(mob); + //checkIllegalEquipment(mob); limitFollowAttribute(mob); } @@ -102,7 +102,7 @@ class EntitySpawn implements Listener { return false; } - private void checkIllegalEquipment(LivingEntity mob) { + /*private void checkIllegalEquipment(LivingEntity mob) { try { for (ItemStack item : mob.getEquipment().getArmorContents()) { if (isIllegalItem(item)) { @@ -136,7 +136,7 @@ class EntitySpawn implements Listener { } catch (Exception exception) { mob.getEquipment().setItemInOffHand(null); } - } + }*/ private boolean checkShouldRemoveEntities(World world) { final int worldEntityCount = world.getEntities().size(); @@ -169,7 +169,7 @@ class EntitySpawn implements Listener { return false; } - public static boolean isIllegalItem(ItemStack item) { + /*public static boolean isIllegalItem(ItemStack item) { try { if (item != null && item.hasItemMeta()) { @@ -188,7 +188,7 @@ class EntitySpawn implements Listener { return true; } return false; - } + }*/ private void limitAreaEffectCloudRadius(AreaEffectCloud cloud) { if (cloud.getRadius() > 40) { @@ -244,7 +244,7 @@ class EntitySpawn implements Listener { limitAreaEffectCloudRadius(event.getEntity()); } - @EventHandler + /*@EventHandler void onBlockDispense(BlockDispenseEvent event) { try { event.getBlock().getState(); @@ -252,7 +252,7 @@ class EntitySpawn implements Listener { } catch (Exception exception) { event.setCancelled(true); } - } + }*/ @EventHandler void onEntityAddToWorld(EntityAddToWorldEvent event) { @@ -293,16 +293,16 @@ class EntitySpawn implements Listener { applyEntityChanges(entity); } - @EventHandler + /*@EventHandler void onItemSpawn(ItemSpawnEvent event) { final ItemStack item = event.getEntity().getItemStack(); if (isIllegalItem(item)) { event.setCancelled(true); } - } + }*/ - @EventHandler + /*@EventHandler void onPlayerDropItem(PlayerDropItemEvent event) { final Inventory inventory = event.getPlayer().getInventory(); @@ -311,7 +311,7 @@ class EntitySpawn implements Listener { inventory.clear(); } } - } + }*/ @EventHandler void onPreCreatureSpawn(PreCreatureSpawnEvent event) { diff --git a/src/main/java/pw/kaboom/extras/modules/player/PlayerCommand.java b/src/main/java/pw/kaboom/extras/modules/player/PlayerCommand.java index 98f943f..9c71ecb 100644 --- a/src/main/java/pw/kaboom/extras/modules/player/PlayerCommand.java +++ b/src/main/java/pw/kaboom/extras/modules/player/PlayerCommand.java @@ -7,6 +7,7 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -19,11 +20,9 @@ import org.bukkit.plugin.java.JavaPlugin; class PlayerCommand implements Listener { static HashMap commandMillisList = new HashMap<>(); - + @EventHandler void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { - final String[] arr = event.getMessage().split(" "); - final String command = event.getMessage(); final UUID playerUuid = event.getPlayer().getUniqueId(); if (commandMillisList.get(playerUuid) != null) { @@ -39,99 +38,16 @@ class PlayerCommand implements Listener { if (event.isCancelled()) { return; } - - if (("/minecraft:execute".equals(arr[0].toLowerCase()) || - "/execute".equals(arr[0].toLowerCase())) && - arr.length >= 2) { - int asAtCount = 0; - - for (int i = 1; i < arr.length; i++) { - if ("run".equalsIgnoreCase(arr[i])) { - if (i+1 < arr.length) { - if ("execute".equalsIgnoreCase(arr[i+1]) || - "particle".equalsIgnoreCase(arr[i+1]) || - "save-off".equalsIgnoreCase(arr[i+1]) || - "stop".equalsIgnoreCase(arr[i+1])) { - Command.broadcastCommandMessage(event.getPlayer(), "Forbidden execute command detected"); - event.setCancelled(true); - return; - } else if (i+3 < arr.length && - "gamerule".equalsIgnoreCase(arr[i+1])) { - if ("randomTickSpeed".equalsIgnoreCase(arr[i+2]) && - Double.parseDouble(arr[i+3]) > 6) { - event.setMessage(command.replaceFirst("(?i)" + "randomTickSpeed " + arr[i+3], "randomTickSpeed 6")); - return; - } else if ("spawnRadius".equalsIgnoreCase(arr[i+2]) && - Double.parseDouble(arr[i+3]) > 100) { - event.setMessage(command.replaceFirst("(?i)" + "spawnRadius " + arr[i+3], "spawnRadius 100")); - } - } - } - break; - } - - if ("as".equalsIgnoreCase(arr[i]) || - "at".equalsIgnoreCase(arr[i])) { - asAtCount++; - } - } - - if (asAtCount >= 2) { - Command.broadcastCommandMessage(event.getPlayer(), "Forbidden execute pattern detected"); - event.setCancelled(true); - } - } else if (("/minecraft:gamerule".equalsIgnoreCase(arr[0]) || - "/gamerule".equalsIgnoreCase(arr[0])) && - arr.length >= 3) { - if ("randomTickSpeed".equalsIgnoreCase(arr[1]) && - Double.parseDouble(arr[2]) > 6) { - event.setMessage(command.replaceFirst(arr[2], "6")); - } else if ("spawnRadius".equalsIgnoreCase(arr[1]) && - Double.parseDouble(arr[2]) > 100) { - event.setMessage(command.replaceFirst(arr[2], "100")); - } - } else if (("/minecraft:particle".equalsIgnoreCase(arr[0]) || - "/particle".equalsIgnoreCase(arr[0])) && - arr.length >= 10) { - if (Double.parseDouble(arr[9]) > 10) { - final StringBuilder stringBuilder = new StringBuilder(); - - for (int i = 0; i < 9; i++) { - stringBuilder.append(arr[i]).append(" "); - } - stringBuilder.append("10 "); - for (int i = 10; i < arr.length; i++) { - stringBuilder.append(arr[i]).append(" "); - } - - event.setMessage(stringBuilder.toString()); - } - } else if (("/bukkit:reload".equalsIgnoreCase(arr[0]) || - "/bukkit:rl".equalsIgnoreCase(arr[0]) || - "/reload".equalsIgnoreCase(arr[0]) || - "/rl".equalsIgnoreCase(arr[0])) && - event.getPlayer().hasPermission("bukkit.command.reload")) { - if (arr.length >= 2 && - "confirm".equalsIgnoreCase(arr[1])) { - event.setCancelled(true); - Command.broadcastCommandMessage(event.getPlayer(), ChatColor.RED + "Please note that this command is not supported and may cause issues when using some plugins."); - Command.broadcastCommandMessage(event.getPlayer(), ChatColor.RED + "If you encounter any issues please use the /stop command to restart your server."); - Command.broadcastCommandMessage(event.getPlayer(), ChatColor.GREEN + "Reload complete."); - } - } else if (("/restart".equalsIgnoreCase(arr[0]) || - "/spigot:restart".equalsIgnoreCase(arr[0])) && - event.getPlayer().hasPermission("bukkit.command.restart")) { + + final CommandSender sender = event.getPlayer(); + final String command = event.getMessage(); + final boolean isConsoleCommand = false; + final String checkedCommand = ServerCommand.checkCommand(sender, command, isConsoleCommand); + + if (checkedCommand != null) { + event.setMessage(checkedCommand); + } else { event.setCancelled(true); - } else if (("/minecraft:save-off".equalsIgnoreCase(arr[0]) || - "/save-off".equalsIgnoreCase(arr[0])) && - event.getPlayer().hasPermission("minecraft.command.save.disable")) { - event.setCancelled(true); - Command.broadcastCommandMessage(event.getPlayer(), "Automatic saving is now disabled"); - } else if (("/minecraft:stop".equalsIgnoreCase(arr[0]) || - "/stop".equalsIgnoreCase(arr[0])) && - event.getPlayer().hasPermission("minecraft.command.stop")) { - event.setCancelled(true); - Command.broadcastCommandMessage(event.getPlayer(), "Stopping the server"); } } } diff --git a/src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java b/src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java index 99ec0c7..5f78490 100644 --- a/src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java +++ b/src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java @@ -40,14 +40,14 @@ class PlayerConnection implements Listener { } } - @EventHandler + /*@EventHandler void onInventoryClose(InventoryCloseEvent event) { for (ItemStack item : event.getInventory().getContents()) { if (EntitySpawn.isIllegalItem(item)) { event.getInventory().clear(); } } - } + }*/ @EventHandler void onPlayerJoin(PlayerJoinEvent event) { diff --git a/src/main/java/pw/kaboom/extras/modules/server/ServerCommand.java b/src/main/java/pw/kaboom/extras/modules/server/ServerCommand.java index 122a2c1..009d7e1 100644 --- a/src/main/java/pw/kaboom/extras/modules/server/ServerCommand.java +++ b/src/main/java/pw/kaboom/extras/modules/server/ServerCommand.java @@ -4,6 +4,7 @@ import org.bukkit.ChatColor; import org.bukkit.command.BlockCommandSender; import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; import org.bukkit.block.Block; import org.bukkit.block.CommandBlock; @@ -15,102 +16,166 @@ import org.bukkit.event.server.RemoteServerCommandEvent; import org.bukkit.event.server.ServerCommandEvent; class ServerCommand implements Listener { + public static String checkCommand(CommandSender sender, String command, boolean isConsoleCommand) { + final String[] arr = command.split(" "); + String commandName = arr[0].toLowerCase(); + + if (isConsoleCommand) { + commandName = "/" + arr[0].toLowerCase(); + } + + switch (commandName) { + case "/minecraft:execute": + case "/execute": + if (arr.length >= 2) { + int asAtCount = 0; + + for (int i = 1; i < arr.length; i++) { + if ("run".equalsIgnoreCase(arr[i])) { + if (i+1 < arr.length) { + if ("execute".equalsIgnoreCase(arr[i+1]) || + "particle".equalsIgnoreCase(arr[i+1]) || + "save-off".equalsIgnoreCase(arr[i+1]) || + "stop".equalsIgnoreCase(arr[i+1])) { + Command.broadcastCommandMessage(sender, "Forbidden execute command detected"); + } else if (i+3 < arr.length && + "gamerule".equalsIgnoreCase(arr[i+1])) { + if ("randomTickSpeed".equalsIgnoreCase(arr[i+2]) && + Double.parseDouble(arr[i+3]) > 6) { + return command.replaceFirst("(?i)" + "randomTickSpeed " + arr[i+3], "randomTickSpeed 6"); + } else if ("spawnRadius".equalsIgnoreCase(arr[i+2]) && + Double.parseDouble(arr[i+3]) > 100) { + return command.replaceFirst("(?i)" + "spawnRadius " + arr[i+3], "spawnRadius 100"); + } + } else if (i+5 < arr.length && + "spreadplayers".equalsIgnoreCase(arr[i+1])) { + if (Double.parseDouble(arr[i+5]) > 75) { + final StringBuilder stringBuilder = new StringBuilder(); + + for (int i2 = 0; i2 < i+5; i2++) { + stringBuilder.append(arr[i2]).append(" "); + } + stringBuilder.append("75 "); + for (int i2 = i+6; i2 < arr.length; i2++) { + stringBuilder.append(arr[i2]).append(" "); + } + + return stringBuilder.toString(); + } + } + } + break; + } + + if ("as".equalsIgnoreCase(arr[i]) || + "at".equalsIgnoreCase(arr[i])) { + asAtCount++; + } + } + + if (asAtCount >= 2) { + Command.broadcastCommandMessage(sender, "Forbidden execute pattern detected"); + } + } + break; + case "/minecraft:gamerule": + case "/gamerule": + if (arr.length >= 3) { + if ("randomTickSpeed".equalsIgnoreCase(arr[1]) && + Double.parseDouble(arr[2]) > 6) { + return command.replaceFirst(arr[2], "6"); + } else if ("spawnRadius".equalsIgnoreCase(arr[1]) && + Double.parseDouble(arr[2]) > 100) { + return command.replaceFirst(arr[2], "100"); + } + } + break; + case "/minecraft:particle": + case "/particle": + if (arr.length >= 10) { + if (Double.parseDouble(arr[9]) > 10) { + final StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < 9; i++) { + stringBuilder.append(arr[i]).append(" "); + } + stringBuilder.append("10 "); + for (int i = 10; i < arr.length; i++) { + stringBuilder.append(arr[i]).append(" "); + } + + return stringBuilder.toString(); + } + } + break; + case "/bukkit:reload": + case "/bukkit:rl": + case "/reload": + case "/rl": + if (sender.hasPermission("bukkit.command.reload") && + arr.length >= 2 && + "confirm".equalsIgnoreCase(arr[1])) { + Command.broadcastCommandMessage(sender, ChatColor.RED + "Please note that this command is not supported and may cause issues when using some plugins."); + Command.broadcastCommandMessage(sender, ChatColor.RED + "If you encounter any issues please use the /stop command to restart your server."); + Command.broadcastCommandMessage(sender, ChatColor.GREEN + "Reload complete."); + } + break; + case "/spigot:restart": + case "/restart": + if (sender.hasPermission("bukkit.command.restart")) { + } + break; + case "/minecraft:save-off": + case "/save-off": + if (sender.hasPermission("minecraft.command.save.disable")) { + Command.broadcastCommandMessage(sender, "Automatic saving is now disabled"); + } + break; + case "/minecraft:spreadplayers": + case "/spreadplayers": + if (arr.length >= 5 && + Double.parseDouble(arr[4]) > 75) { + final StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < 4; i++) { + stringBuilder.append(arr[i]).append(" "); + } + stringBuilder.append("75 "); + for (int i = 5; i < arr.length; i++) { + stringBuilder.append(arr[i]).append(" "); + } + + return stringBuilder.toString(); + } + break; + case "/minecraft:stop": + case "/stop": + if (sender.hasPermission("minecraft.command.stop")) { + Command.broadcastCommandMessage(sender, "Stopping the server"); + } + } + return null; + } + @EventHandler void onServerCommand(ServerCommandEvent event) { + final CommandSender sender = event.getSender(); final String[] arr = event.getCommand().split(" "); - final String command = event.getCommand(); - if (event.getSender() instanceof BlockCommandSender) { + if (sender instanceof BlockCommandSender) { if (Main.consoleCommandBlacklist.contains(arr[0].toLowerCase())) { event.setCancelled(true); } } + + final String command = event.getCommand(); + final boolean isConsoleCommand = true; + final String checkedCommand = checkCommand(sender, command, isConsoleCommand); - if (("minecraft:execute".equals(arr[0].toLowerCase()) || - "execute".equals(arr[0].toLowerCase())) && - arr.length >= 2) { - for (int i = 1; i < arr.length; i++) { - if ("as".equalsIgnoreCase(arr[i]) || - "at".equalsIgnoreCase(arr[i])) { - for (int i2 = i+1; i2 < arr.length; i2++) { - if ("at".equalsIgnoreCase(arr[i2]) || - "as".equalsIgnoreCase(arr[i2])) { - Command.broadcastCommandMessage(event.getSender(), "Forbidden execute pattern detected"); - event.setCancelled(true); - break; - } - } - } else if (i+1 < arr.length && - "run".equalsIgnoreCase(arr[i])) { - if ("execute".equalsIgnoreCase(arr[i+1]) || - "particle".equalsIgnoreCase(arr[i+1]) || - "save-off".equalsIgnoreCase(arr[i+1]) || - "stop".equalsIgnoreCase(arr[i+1])) { - Command.broadcastCommandMessage(event.getSender(), "Forbidden execute command detected"); - event.setCancelled(true); - break; - } else if (i+3 < arr.length && - "gamerule".equalsIgnoreCase(arr[i+1])) { - if ("randomTickSpeed".equalsIgnoreCase(arr[i+2]) && - Double.parseDouble(arr[i+3]) > 6) { - event.setCommand(command.replaceFirst("(?i)" + "randomTickSpeed " + arr[i+3], "randomTickSpeed 6")); - break; - } else if ("spawnRadius".equalsIgnoreCase(arr[i+2]) && - Double.parseDouble(arr[i+3]) > 100) { - event.setCommand(command.replaceFirst("(?i)" + "spawnRadius " + arr[i+3], "spawnRadius 100")); - } - } - } - } - } else if (("minecraft:gamerule".equalsIgnoreCase(arr[0]) || - "gamerule".equalsIgnoreCase(arr[0])) && - arr.length >= 3) { - if ("randomTickSpeed".equalsIgnoreCase(arr[1]) && - Double.parseDouble(arr[2]) > 6) { - event.setCommand(command.replaceFirst(arr[2], "6")); - } else if ("spawnRadius".equalsIgnoreCase(arr[1]) && - Double.parseDouble(arr[2]) > 100) { - event.setCommand(command.replaceFirst(arr[2], "100")); - } - } else if (("minecraft:particle".equalsIgnoreCase(arr[0]) || - "particle".equalsIgnoreCase(arr[0])) && - arr.length >= 10) { - if (Double.parseDouble(arr[9]) > 10) { - final StringBuilder stringBuilder = new StringBuilder(); - - for (int i = 0; i < 9; i++) { - stringBuilder.append(arr[i]).append(" "); - } - stringBuilder.append("10 "); - for (int i = 10; i < arr.length; i++) { - stringBuilder.append(arr[i]).append(" "); - } - - event.setCommand(stringBuilder.toString()); - } - } else if ("bukkit:reload".equalsIgnoreCase(arr[0]) || - "bukkit:rl".equalsIgnoreCase(arr[0]) || - "reload".equalsIgnoreCase(arr[0]) || - "rl".equalsIgnoreCase(arr[0])) { - if (arr.length >= 2 && - "confirm".equalsIgnoreCase(arr[1])) { - event.setCancelled(true); - Command.broadcastCommandMessage(event.getSender(), ChatColor.RED + "Please note that this command is not supported and may cause issues when using some plugins."); - Command.broadcastCommandMessage(event.getSender(), ChatColor.RED + "If you encounter any issues please use the /stop command to restart your server."); - Command.broadcastCommandMessage(event.getSender(), ChatColor.GREEN + "Reload complete."); - } - } else if ("restart".equalsIgnoreCase(arr[0]) || - "spigot:restart".equalsIgnoreCase(arr[0])) { + if (checkedCommand != null) { + event.setCommand(checkedCommand); + } else { event.setCancelled(true); - } else if ("minecraft:save-off".equalsIgnoreCase(arr[0]) || - "save-off".equalsIgnoreCase(arr[0])) { - event.setCancelled(true); - Command.broadcastCommandMessage(event.getSender(), "Automatic saving is now disabled"); - } else if (("minecraft:stop".equalsIgnoreCase(arr[0]) || - "stop".equalsIgnoreCase(arr[0])) && - !(event.getSender() instanceof BlockCommandSender)) { - event.setCancelled(true); - Command.broadcastCommandMessage(event.getSender(), "Stopping the server"); } } }