From 86b081ddfd35a2e2f33fb8017639c6050624e6d5 Mon Sep 17 00:00:00 2001 From: md_5 Date: Mon, 15 Oct 2012 14:14:08 +1100 Subject: [PATCH] Add command ip and permissions. --- src/main/java/net/md_5/bungee/BungeeCord.java | 4 ++- .../java/net/md_5/bungee/Configuration.java | 26 ++++++++++++++++++ src/main/java/net/md_5/bungee/Permission.java | 17 ++++++++++++ .../java/net/md_5/bungee/UserConnection.java | 11 ++++++++ .../java/net/md_5/bungee/command/Command.java | 7 +++++ .../net/md_5/bungee/command/CommandEnd.java | 8 +++--- .../net/md_5/bungee/command/CommandIP.java | 27 +++++++++++++++++++ .../net/md_5/bungee/command/CommandList.java | 9 +++++++ .../md_5/bungee/command/CommandSender.java | 7 +++++ .../bungee/command/ConsoleCommandSender.java | 5 ++++ 10 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 src/main/java/net/md_5/bungee/Permission.java create mode 100644 src/main/java/net/md_5/bungee/command/CommandIP.java diff --git a/src/main/java/net/md_5/bungee/BungeeCord.java b/src/main/java/net/md_5/bungee/BungeeCord.java index ed8dd895..a57891da 100644 --- a/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/src/main/java/net/md_5/bungee/BungeeCord.java @@ -15,6 +15,7 @@ import java.util.logging.Level; import static net.md_5.bungee.Logger.$; import net.md_5.bungee.command.Command; import net.md_5.bungee.command.CommandEnd; +import net.md_5.bungee.command.CommandIP; import net.md_5.bungee.command.CommandList; import net.md_5.bungee.command.CommandSender; import net.md_5.bungee.command.CommandServer; @@ -71,6 +72,7 @@ public class BungeeCord { commandMap.put("end", new CommandEnd()); commandMap.put("glist", new CommandList()); commandMap.put("server", new CommandServer()); + commandMap.put("ip", new CommandIP()); } /** @@ -107,7 +109,7 @@ public class BungeeCord { String[] split = commandLine.trim().split(" "); String commandName = split[0].toLowerCase(); Command command = commandMap.get(commandName); - if (command != null) { + if (command != null && !config.disabledCommands.contains(commandName)) { String[] args = Arrays.copyOfRange(split, 1, split.length); try { command.execute(sender, args); diff --git a/src/main/java/net/md_5/bungee/Configuration.java b/src/main/java/net/md_5/bungee/Configuration.java index d290b7cd..4b483f58 100644 --- a/src/main/java/net/md_5/bungee/Configuration.java +++ b/src/main/java/net/md_5/bungee/Configuration.java @@ -14,6 +14,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import static net.md_5.bungee.Logger.$; +import net.md_5.bungee.command.CommandSender; +import net.md_5.bungee.command.ConsoleCommandSender; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; @@ -95,6 +97,14 @@ public class Configuration { add("mbaxter"); } }; + /** + * Commands which will be blocked completely. + */ + public List disabledCommands = new ArrayList() { + { + add("glist"); + } + }; /** * Maximum number of lines to log before old ones are removed. */ @@ -225,4 +235,20 @@ public class Configuration { save(reconnect, reconnectLocations); $().info("Saved reconnect locations to " + reconnect); } + + /** + * Get the highest permission a player has. + * + * @param sender to get permissions of + * @return their permission + */ + public Permission getPermission(CommandSender sender) { + Permission permission = Permission.DEFAULT; + if (admins.contains(sender.getName()) || sender instanceof ConsoleCommandSender) { + permission = Permission.ADMIN; + } else if (moderators.contains(sender.getName())) { + permission = Permission.MODERATOR; + } + return permission; + } } diff --git a/src/main/java/net/md_5/bungee/Permission.java b/src/main/java/net/md_5/bungee/Permission.java new file mode 100644 index 00000000..2d3fbb70 --- /dev/null +++ b/src/main/java/net/md_5/bungee/Permission.java @@ -0,0 +1,17 @@ +package net.md_5.bungee; + +public enum Permission { + + /** + * Can access all commands. + */ + ADMIN, + /** + * Can access commands which do not affect everyone. + */ + MODERATOR, + /** + * Can access other commands. + */ + DEFAULT; +} diff --git a/src/main/java/net/md_5/bungee/UserConnection.java b/src/main/java/net/md_5/bungee/UserConnection.java index 88e757b4..08a0360b 100644 --- a/src/main/java/net/md_5/bungee/UserConnection.java +++ b/src/main/java/net/md_5/bungee/UserConnection.java @@ -2,8 +2,10 @@ package net.md_5.bungee; import java.io.IOException; import java.io.OutputStream; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; +import java.net.SocketAddress; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import net.md_5.bungee.command.CommandSender; @@ -86,6 +88,10 @@ public class UserConnection extends GenericConnection implements CommandSender { } } + public SocketAddress getAddress() { + return socket.getRemoteSocketAddress(); + } + private void destroySelf(String reason) { if (BungeeCord.instance.isRunning) { BungeeCord.instance.connections.remove(username); @@ -102,6 +108,11 @@ public class UserConnection extends GenericConnection implements CommandSender { packetQueue.add(new Packet3Chat(message)); } + @Override + public String getName() { + return username; + } + private class UpstreamBridge extends Thread { public UpstreamBridge() { diff --git a/src/main/java/net/md_5/bungee/command/Command.java b/src/main/java/net/md_5/bungee/command/Command.java index 58e97c0a..6346bcd4 100644 --- a/src/main/java/net/md_5/bungee/command/Command.java +++ b/src/main/java/net/md_5/bungee/command/Command.java @@ -1,5 +1,8 @@ package net.md_5.bungee.command; +import net.md_5.bungee.BungeeCord; +import net.md_5.bungee.Permission; + /** * Class which represents a proxy command. The {@link #execute(net.md_5.bungee.command.CommandSender, java.lang.String[]) * } method will be called to dispatch the command. @@ -14,4 +17,8 @@ public abstract class Command { * the original command. */ public abstract void execute(CommandSender sender, String[] args); + + public Permission getPermission(CommandSender sender) { + return BungeeCord.instance.config.getPermission(sender); + } } diff --git a/src/main/java/net/md_5/bungee/command/CommandEnd.java b/src/main/java/net/md_5/bungee/command/CommandEnd.java index 3fb783be..31dee08c 100644 --- a/src/main/java/net/md_5/bungee/command/CommandEnd.java +++ b/src/main/java/net/md_5/bungee/command/CommandEnd.java @@ -2,6 +2,7 @@ package net.md_5.bungee.command; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.ChatColor; +import net.md_5.bungee.Permission; /** * Command to terminate the proxy instance. May only be used by the console. @@ -10,9 +11,10 @@ public class CommandEnd extends Command { @Override public void execute(CommandSender sender, String[] args) { - if (!(sender instanceof ConsoleCommandSender)) { - sender.sendMessage(ChatColor.RED + "Only the console can use this command"); + if (getPermission(sender) != Permission.ADMIN) { + sender.sendMessage(ChatColor.RED + "You do not have permission to use this command"); + } else { + BungeeCord.instance.stop(); } - BungeeCord.instance.stop(); } } diff --git a/src/main/java/net/md_5/bungee/command/CommandIP.java b/src/main/java/net/md_5/bungee/command/CommandIP.java new file mode 100644 index 00000000..7f0d3d65 --- /dev/null +++ b/src/main/java/net/md_5/bungee/command/CommandIP.java @@ -0,0 +1,27 @@ +package net.md_5.bungee.command; + +import net.md_5.bungee.BungeeCord; +import net.md_5.bungee.ChatColor; +import net.md_5.bungee.Permission; +import net.md_5.bungee.UserConnection; + +public class CommandIP extends Command { + + @Override + public void execute(CommandSender sender, String[] args) { + if (getPermission(sender) != Permission.ADMIN) { + sender.sendMessage(ChatColor.RED + "You do not have permission to use this command"); + return; + } + if (args.length < 1) { + sender.sendMessage(ChatColor.RED + "Please follow this command by a user name"); + return; + } + UserConnection user = BungeeCord.instance.connections.get(args[0]); + if (user == null) { + sender.sendMessage(ChatColor.RED + "That user is not online"); + } else { + sender.sendMessage(ChatColor.BLUE + "IP of " + args[0] + " is " + user.getAddress()); + } + } +} diff --git a/src/main/java/net/md_5/bungee/command/CommandList.java b/src/main/java/net/md_5/bungee/command/CommandList.java index 62795e43..8113be9f 100644 --- a/src/main/java/net/md_5/bungee/command/CommandList.java +++ b/src/main/java/net/md_5/bungee/command/CommandList.java @@ -16,8 +16,17 @@ public class CommandList extends Command { Collection connections = BungeeCord.instance.connections.values(); for (UserConnection con : connections) { + switch (getPermission(con)) { + case ADMIN: + users.append(ChatColor.RED); + break; + case MODERATOR: + users.append(ChatColor.GREEN); + break; + } users.append(con.username); users.append(", "); + users.append(ChatColor.RESET); } users.setLength(users.length() - 2); diff --git a/src/main/java/net/md_5/bungee/command/CommandSender.java b/src/main/java/net/md_5/bungee/command/CommandSender.java index f89c3148..3b9e3187 100644 --- a/src/main/java/net/md_5/bungee/command/CommandSender.java +++ b/src/main/java/net/md_5/bungee/command/CommandSender.java @@ -8,4 +8,11 @@ public interface CommandSender { * @param message the message to send */ public abstract void sendMessage(String message); + + /** + * Get the senders name or CONSOLE for console. + * + * @return the friendly name of the player. + */ + public abstract String getName(); } diff --git a/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java b/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java index 0a165be5..e66045a4 100644 --- a/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java +++ b/src/main/java/net/md_5/bungee/command/ConsoleCommandSender.java @@ -13,4 +13,9 @@ public class ConsoleCommandSender implements CommandSender { public void sendMessage(String message) { System.out.println(ChatColor.stripColor(message)); } + + @Override + public String getName() { + return "CONSOLE"; + } }