From 6218b873ca0f8f60b77219e173ac96bddb835d19 Mon Sep 17 00:00:00 2001 From: ME1312 Date: Thu, 10 Jan 2019 15:52:38 -0500 Subject: [PATCH] Expand on the API for restricted servers --- .../SubServers/Bungee/Host/Executable.java | 2 +- .../ME1312/SubServers/Bungee/Host/Server.java | 52 +++++++++++++++++ .../Bungee/Host/ServerContainer.java | 58 ++++++++++++++++++- .../Bungee/Library/Compatibility/JNA.java | 46 ++++++++------- .../Packet/PacketOutExUpdateWhitelist.java | 44 ++++++++++++++ .../Bungee/Network/SubDataServer.java | 5 +- .../Client/Bukkit/Network/API/Server.java | 30 ++++++++++ .../Client/Sponge/Network/API/Server.java | 30 ++++++++++ .../Host/Executable/Executable.java | 2 +- .../Host/Library/Compatibility/JNA.java | 46 ++++++++------- .../SubServers/Host/Network/API/Server.java | 19 ++++++ .../SubServers/Sync/Network/API/Server.java | 30 ++++++++++ .../Packet/PacketInExUpdateWhitelist.java | 34 +++++++++++ .../Sync/Network/SubDataClient.java | 1 + .../Sync/Server/ServerContainer.java | 44 ++++++++++++-- .../Sync/Server/SubServerContainer.java | 6 +- .../net/ME1312/SubServers/Sync/SubPlugin.java | 8 +-- 17 files changed, 395 insertions(+), 62 deletions(-) create mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExUpdateWhitelist.java create mode 100644 SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExUpdateWhitelist.java diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Executable.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Executable.java index e4385100..cb753f39 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Executable.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Executable.java @@ -6,7 +6,7 @@ import java.lang.reflect.Field; /** - * Executable String Handler Class + * Executable Handler Class */ public class Executable { private Executable() {} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java index 34aeebb2..7713d692 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java @@ -4,6 +4,7 @@ import net.ME1312.SubServers.Bungee.Library.NamedContainer; import net.ME1312.SubServers.Bungee.Network.ClientHandler; import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; import java.util.Collection; import java.util.List; @@ -98,6 +99,57 @@ public interface Server extends ServerInfo, ClientHandler, ExtraDataHandler { */ void setRestricted(boolean value); + /** + * Get a copy of the current whitelist + * + * @return Player Whitelist + */ + Collection getWhitelist(); + + /** + * See if a player is whitelisted + * + * @param player Player to check + * @return Whitelisted Status + */ + boolean isWhitelisted(ProxiedPlayer player); + + /** + * See if a player is whitelisted + * + * @param player Player to check + * @return Whitelisted Status + */ + boolean isWhitelisted(UUID player); + + /** + * Add a player to the whitelist (for use with restricted servers) + * + * @param player Player to add + */ + void whitelist(ProxiedPlayer player); + + /** + * Add a player to the whitelist (for use with restricted servers) + * + * @param player Player to add + */ + void whitelist(UUID player); + + /** + * Remove a player to the whitelist + * + * @param player Player to remove + */ + void unwhitelist(ProxiedPlayer player); + + /** + * Remove a player to the whitelist + * + * @param player Player to remove + */ + void unwhitelist(UUID player); + /** * Get the Signature of this Object * diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java index 9e44d7ff..8dbf671e 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java @@ -9,11 +9,13 @@ import net.ME1312.SubServers.Bungee.Library.NamedContainer; import net.ME1312.SubServers.Bungee.Library.Util; import net.ME1312.SubServers.Bungee.Network.Client; +import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutExUpdateWhitelist; import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutRunEvent; import net.ME1312.SubServers.Bungee.Network.SubDataServer; import net.ME1312.SubServers.Bungee.SubAPI; import net.ME1312.SubServers.Bungee.SubPlugin; import net.md_5.bungee.BungeeServerInfo; +import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.lang.reflect.Field; @@ -25,11 +27,12 @@ */ public class ServerContainer extends BungeeServerInfo implements Server { private YAMLSection extra = new YAMLSection(); - private final String signature; private Client client = null; - private List groups = new ArrayList(); private String nick = null; + private List groups = new ArrayList(); + private List whitelist = new ArrayList(); private boolean hidden; + private final String signature; public ServerContainer(String name, InetSocketAddress address, String motd, boolean hidden, boolean restricted) throws InvalidServerException { super(name, address, motd, restricted); @@ -153,6 +156,56 @@ public void setRestricted(boolean value) { } } + @Override + public Collection getWhitelist() { + return new ArrayList(whitelist); + } + + /** + * See if a player can access this server + * + * @param player Player + * @return Whitelisted Status + */ + @Override + public boolean canAccess(CommandSender player) { + return (player instanceof ProxiedPlayer && whitelist.contains(((ProxiedPlayer) player).getUniqueId())) || super.canAccess(player); + } + + @Override + public boolean isWhitelisted(ProxiedPlayer player) { + return isWhitelisted(player.getUniqueId()); + } + + @Override + public boolean isWhitelisted(UUID player) { + return whitelist.contains(player); + } + + @Override + public void whitelist(ProxiedPlayer player) { + whitelist(player.getUniqueId()); + } + + @Override + public void whitelist(UUID player) { + if (Util.isNull(player)) throw new NullPointerException(); + whitelist.add(player); + for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData() != null) proxy.getSubData().sendPacket(new PacketOutExUpdateWhitelist(getName(), true, player)); + } + + @Override + public void unwhitelist(ProxiedPlayer player) { + unwhitelist(player.getUniqueId()); + } + + @Override + public void unwhitelist(UUID player) { + if (Util.isNull(player)) throw new NullPointerException(); + whitelist.remove(player); + for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData() != null) proxy.getSubData().sendPacket(new PacketOutExUpdateWhitelist(getName(), false, player)); + } + @Override public final String getSignature() { return signature; @@ -196,6 +249,7 @@ public String toString() { info.set("group", getGroups()); info.set("address", getAddress().getAddress().getHostAddress() + ':' + getAddress().getPort()); info.set("motd", getMotd()); + info.set("whitelist", whitelist); info.set("restricted", isRestricted()); info.set("hidden", isHidden()); if (getSubData() != null) info.set("subdata", getSubData().getAddress().toString()); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/JNA.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/JNA.java index b46717e0..302da50b 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/JNA.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/JNA.java @@ -9,48 +9,50 @@ import java.net.URLClassLoader; /** - * Load JNA Library + * JNA Library Loader Class */ public class JNA { + private JNA() {} private static ClassLoader JNA = null; private static final String JNA_VERSION = "5.2.0"; private static final String JNA_DOWNLOAD = "https://oss.sonatype.org/service/local/repositories/releases/content/net/java/dev/jna/$1/" + JNA_VERSION + "/$1-" + JNA_VERSION + ".jar"; + /** + * Get/Load JNA Library + * + * @return JNA ClassLoader + */ @SuppressWarnings("deprecation") public static ClassLoader get() { if (JNA == null) { boolean announced = false; UniversalFile library = new UniversalFile(SubAPI.getInstance().getInternals().dir, "SubServers:Cache:Libraries"); - library.mkdirs(); UniversalFile jna = new UniversalFile(library, "jna-" + JNA_VERSION + ".jar"); + jna.getParentFile().mkdirs(); if (!jna.exists()) { - jna.getParentFile().mkdirs(); - if (!jna.exists()) { - System.out.println(">> Downloading JNA Library v" + JNA_VERSION); - try (FileOutputStream fin = new FileOutputStream(jna)) { - Resources.copy(new URL(JNA_DOWNLOAD.replace("$1", "jna")), fin); - } catch (Throwable e) { - jna.delete(); - e.printStackTrace(); - } - announced = true; + announced = true; + System.out.println(">> Downloading JNA Library v" + JNA_VERSION); + try (FileOutputStream fin = new FileOutputStream(jna)) { + Resources.copy(new URL(JNA_DOWNLOAD.replace("$1", "jna")), fin); + } catch (Throwable e) { + jna.delete(); + e.printStackTrace(); } } UniversalFile platform = new UniversalFile(library, "jna-platform-" + JNA_VERSION + ".jar"); + platform.getParentFile().mkdirs(); if (!platform.exists()) { - platform.getParentFile().mkdirs(); - if (!platform.exists()) { - if (!announced) System.out.println(">> Downloading JNA Library v" + JNA_VERSION); - try (FileOutputStream fin = new FileOutputStream(platform)) { - Resources.copy(new URL(JNA_DOWNLOAD.replace("$1", "jna-platform")), fin); - } catch (Throwable e) { - platform.delete(); - e.printStackTrace(); - } + if (!announced) System.out.println(">> Downloading JNA Library v" + JNA_VERSION); + announced = true; + try (FileOutputStream fin = new FileOutputStream(platform)) { + Resources.copy(new URL(JNA_DOWNLOAD.replace("$1", "jna-platform")), fin); + } catch (Throwable e) { + platform.delete(); + e.printStackTrace(); } } if (jna.exists()) { - System.out.println(">> Loading JNA Library"); + if (announced) System.out.println(">> Loading JNA Library"); try { JNA = new URLClassLoader(new URL[]{jna.toURI().toURL(), platform.toURI().toURL()}); } catch (Throwable e) { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExUpdateWhitelist.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExUpdateWhitelist.java new file mode 100644 index 00000000..5f709079 --- /dev/null +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExUpdateWhitelist.java @@ -0,0 +1,44 @@ +package net.ME1312.SubServers.Bungee.Network.Packet; + +import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection; +import net.ME1312.SubServers.Bungee.Library.Util; +import net.ME1312.SubServers.Bungee.Library.Version.Version; +import net.ME1312.SubServers.Bungee.Network.PacketOut; + +import java.util.UUID; + +/** + * Update External Whitelist Packet + */ +public class PacketOutExUpdateWhitelist implements PacketOut { + private String name; + private boolean mode; + private UUID value; + + /** + * New PacketOutExUpdateWhitelist + * + * @param name Server Name + * @param mode Update Mode (true for add, false for remove) + * @param value Whitelist Value + */ + public PacketOutExUpdateWhitelist(String name, boolean mode, UUID value) { + if (Util.isNull(name, mode, value)) throw new NullPointerException(); + this.name = name; + this.mode = mode; + this.value = value; + } + + @Override + public YAMLSection generate() { + YAMLSection data = new YAMLSection(); + data.set("server", name); + data.set("mode", mode); + data.set("value", value); + return data; + } + @Override + public Version getVersion() { + return new Version("2.13.2c"); + } +} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java index 152bf833..23e3bb6f 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java @@ -1,7 +1,6 @@ package net.ME1312.SubServers.Bungee.Network; import com.dosse.upnp.UPnP; -import com.google.gson.Gson; import net.ME1312.SubServers.Bungee.Event.SubNetworkConnectEvent; import net.ME1312.SubServers.Bungee.Event.SubNetworkDisconnectEvent; import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection; @@ -12,14 +11,11 @@ import net.ME1312.SubServers.Bungee.Network.Encryption.AES; import net.ME1312.SubServers.Bungee.Network.Packet.*; import net.ME1312.SubServers.Bungee.SubPlugin; -import org.msgpack.core.MessagePack; import org.msgpack.value.Value; -import org.msgpack.value.ValueFactory; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.net.*; -import java.nio.charset.StandardCharsets; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -130,6 +126,7 @@ public YAMLSection decrypt(String key, Value data) { registerPacket(PacketExDeleteServer.class, "SubServers", "ExDeleteServer"); registerPacket(PacketExRemoveServer.class, "SubServers", "ExRemoveServer"); registerPacket(PacketExUpdateServer.class, "SubServers", "ExUpdateServer"); + registerPacket(PacketOutExUpdateWhitelist.class, "SubServers", "ExUpdateWhitelist"); registerPacket(PacketLinkExHost.class, "SubServers", "LinkExHost"); registerPacket(PacketLinkProxy.class, "SubServers", "LinkProxy"); registerPacket(PacketLinkServer.class, "SubServers", "LinkServer"); diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java index c6c866e1..6695074e 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java @@ -4,6 +4,7 @@ import net.ME1312.SubServers.Client.Bukkit.Library.NamedContainer; import net.ME1312.SubServers.Client.Bukkit.Network.Packet.PacketDownloadServerInfo; import net.ME1312.SubServers.Client.Bukkit.SubAPI; +import org.bukkit.OfflinePlayer; import java.net.InetSocketAddress; import java.util.*; @@ -123,6 +124,35 @@ public boolean isRestricted() { return raw.getBoolean("restricted"); } + /** + * Get a copy of the current whitelist + * + * @return Player Whitelist + */ + public Collection getWhitelist() { + return raw.getUUIDList("whitelist"); + } + + /** + * See if a player is whitelisted + * + * @param player Player to check + * @return Whitelisted Status + */ + public boolean isWhitelisted(OfflinePlayer player) { + return isWhitelisted(player.getUniqueId()); + } + + /** + * See if a player is whitelisted + * + * @param player Player to check + * @return Whitelisted Status + */ + public boolean isWhitelisted(UUID player) { + return getWhitelist().contains(player); + } + /** * Get the Signature of this Object * diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Server.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Server.java index 1bed358d..b3115d01 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Server.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Server.java @@ -4,6 +4,7 @@ import net.ME1312.SubServers.Client.Sponge.Library.NamedContainer; import net.ME1312.SubServers.Client.Sponge.Network.Packet.PacketDownloadServerInfo; import net.ME1312.SubServers.Client.Sponge.SubAPI; +import org.spongepowered.api.entity.living.player.User; import java.net.InetSocketAddress; import java.util.*; @@ -123,6 +124,35 @@ public boolean isRestricted() { return raw.getBoolean("restricted"); } + /** + * Get a copy of the current whitelist + * + * @return Player Whitelist + */ + public Collection getWhitelist() { + return raw.getUUIDList("whitelist"); + } + + /** + * See if a player is whitelisted + * + * @param player Player to check + * @return Whitelisted Status + */ + public boolean isWhitelisted(User player) { + return isWhitelisted(player.getUniqueId()); + } + + /** + * See if a player is whitelisted + * + * @param player Player to check + * @return Whitelisted Status + */ + public boolean isWhitelisted(UUID player) { + return getWhitelist().contains(player); + } + /** * Get the Signature of this Object * diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/Executable.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/Executable.java index 03d1ec87..47bd9565 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/Executable.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/Executable.java @@ -6,7 +6,7 @@ import java.lang.reflect.Field; /** - * Executable String Handler Class + * Executable Handler Class */ public class Executable { private Executable() {} diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Library/Compatibility/JNA.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Library/Compatibility/JNA.java index cd266564..ce7cc14e 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Library/Compatibility/JNA.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Library/Compatibility/JNA.java @@ -11,49 +11,51 @@ import java.nio.file.StandardCopyOption; /** - * Load JNA Library + * JNA Library Loader Class */ public class JNA { + private JNA() {} private static ClassLoader JNA = null; private static final String JNA_VERSION = "5.2.0"; private static final String JNA_DOWNLOAD = "https://oss.sonatype.org/service/local/repositories/releases/content/net/java/dev/jna/$1/" + JNA_VERSION + "/$1-" + JNA_VERSION + ".jar"; + /** + * Get/Load JNA Library + * + * @return JNA ClassLoader + */ @SuppressWarnings("deprecation") public static ClassLoader get() { if (JNA == null) { boolean announced = false; Logger log = new Logger("JNA"); UniversalFile library = new UniversalFile(Galaxi.getInstance().getRuntimeDirectory(), "Cache:Libraries"); - library.mkdirs(); UniversalFile jna = new UniversalFile(library, "jna-" + JNA_VERSION + ".jar"); + jna.getParentFile().mkdirs(); if (!jna.exists()) { - jna.getParentFile().mkdirs(); - if (!jna.exists()) { - announced = true; - log.info.println("Downloading JNA Library v" + JNA_VERSION); - try (InputStream in = new URL(JNA_DOWNLOAD.replace("$1", "jna")).openStream()) { - Files.copy(in, jna.toPath(), StandardCopyOption.REPLACE_EXISTING); - } catch (Throwable e) { - jna.delete(); - log.error.println(e); - } + log.info.println("Downloading JNA Library v" + JNA_VERSION); + announced = true; + try (InputStream in = new URL(JNA_DOWNLOAD.replace("$1", "jna")).openStream()) { + Files.copy(in, jna.toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (Throwable e) { + jna.delete(); + log.error.println(e); } } UniversalFile platform = new UniversalFile(library, "jna-platform-" + JNA_VERSION + ".jar"); + platform.getParentFile().mkdirs(); if (!platform.exists()) { - platform.getParentFile().mkdirs(); - if (!platform.exists()) { - if (!announced) log.info.println("Downloading JNA Library v" + JNA_VERSION); - try (InputStream in = new URL(JNA_DOWNLOAD.replace("$1", "jna-platform")).openStream()) { - Files.copy(in, platform.toPath(), StandardCopyOption.REPLACE_EXISTING); - } catch (Throwable e) { - platform.delete(); - log.error.println(e); - } + if (!announced) log.info.println("Downloading JNA Library v" + JNA_VERSION); + announced = true; + try (InputStream in = new URL(JNA_DOWNLOAD.replace("$1", "jna-platform")).openStream()) { + Files.copy(in, platform.toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (Throwable e) { + platform.delete(); + log.error.println(e); } } if (jna.exists()) { - log.info.println("Loading JNA Library"); + if (announced) log.info.println("Loading JNA Library"); try { JNA = new URLClassLoader(new URL[]{jna.toURI().toURL(), platform.toURI().toURL()}); } catch (Throwable e) { diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/Server.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/Server.java index bca2f62c..dbd74835 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/Server.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/Server.java @@ -123,6 +123,25 @@ public boolean isRestricted() { return raw.getBoolean("restricted"); } + /** + * Get a copy of the current whitelist + * + * @return Player Whitelist + */ + public Collection getWhitelist() { + return raw.getUUIDList("whitelist"); + } + + /** + * See if a player is whitelisted + * + * @param player Player to check + * @return Whitelisted Status + */ + public boolean isWhitelisted(UUID player) { + return getWhitelist().contains(player); + } + /** * Get the Signature of this Object * diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/Server.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/Server.java index bb34f50b..736671b7 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/Server.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/Server.java @@ -4,6 +4,7 @@ import net.ME1312.SubServers.Sync.Library.NamedContainer; import net.ME1312.SubServers.Sync.Network.Packet.PacketDownloadServerInfo; import net.ME1312.SubServers.Sync.SubAPI; +import net.md_5.bungee.api.connection.ProxiedPlayer; import java.net.InetSocketAddress; import java.util.*; @@ -123,6 +124,35 @@ public boolean isRestricted() { return raw.getBoolean("restricted"); } + /** + * Get a copy of the current whitelist + * + * @return Player Whitelist + */ + public Collection getWhitelist() { + return raw.getUUIDList("whitelist"); + } + + /** + * See if a player is whitelisted + * + * @param player Player to check + * @return Whitelisted Status + */ + public boolean isWhitelisted(ProxiedPlayer player) { + return isWhitelisted(player.getUniqueId()); + } + + /** + * See if a player is whitelisted + * + * @param player Player to check + * @return Whitelisted Status + */ + public boolean isWhitelisted(UUID player) { + return getWhitelist().contains(player); + } + /** * Get the Signature of this Object * diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExUpdateWhitelist.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExUpdateWhitelist.java new file mode 100644 index 00000000..8034cc83 --- /dev/null +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketInExUpdateWhitelist.java @@ -0,0 +1,34 @@ +package net.ME1312.SubServers.Sync.Network.Packet; + +import net.ME1312.SubServers.Sync.Library.Config.YAMLSection; +import net.ME1312.SubServers.Sync.Library.Version.Version; +import net.ME1312.SubServers.Sync.Network.PacketIn; +import net.ME1312.SubServers.Sync.SubPlugin; + +/** + * Update External Whitelist Packet + */ +public class PacketInExUpdateWhitelist implements PacketIn { + private SubPlugin plugin; + + /** + * New PacketInExUpdateWhitelist + */ + public PacketInExUpdateWhitelist(SubPlugin plugin) { + this.plugin = plugin; + } + + @Override + public void execute(YAMLSection data) throws Throwable { + if (data.getBoolean("mode")) { + plugin.servers.get(data.getRawString("name")).whitelist(data.getUUID("value")); + } else { + plugin.servers.get(data.getRawString("name")).unwhitelist(data.getUUID("value")); + } + } + + @Override + public Version getVersion() { + return new Version("2.13.2c"); + } +} diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java index 876814c3..95b90143 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java @@ -146,6 +146,7 @@ private void updateField(Field field, Object instance, Object value) throws Ille registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList"); registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo"); registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo"); + registerPacket(new PacketInExUpdateWhitelist(plugin), "SubServers", "ExUpdateWhitelist"); registerPacket(new PacketInRunEvent(plugin), "SubServers", "RunEvent"); registerPacket(new PacketInReset(), "SubServers", "Reset"); registerPacket(new PacketLinkProxy(plugin), "SubServers", "LinkProxy"); diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/ServerContainer.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/ServerContainer.java index 29ae89d1..b5b2976d 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/ServerContainer.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/ServerContainer.java @@ -2,25 +2,32 @@ import net.ME1312.SubServers.Sync.Library.Util; import net.md_5.bungee.BungeeServerInfo; -import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.connection.ProxiedPlayer; import java.lang.reflect.Field; import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.UUID; /** * Server Class */ public class ServerContainer extends BungeeServerInfo { - private final String signature; - private String nick = null; private String subdata; + private List whitelist = new ArrayList(); + private String nick = null; private boolean hidden; + private final String signature; - public ServerContainer(String signature, String name, String display, InetSocketAddress address, String subdata, String motd, boolean hidden, boolean restricted) { + public ServerContainer(String signature, String name, String display, InetSocketAddress address, String subdata, String motd, boolean hidden, boolean restricted, Collection whitelist) { super(name, address, motd, restricted); if (Util.isNull(name, address, motd, hidden, restricted)) throw new NullPointerException(); this.signature = signature; this.subdata = subdata; + this.whitelist.addAll(whitelist); this.hidden = hidden; setDisplayName(display); } @@ -65,6 +72,35 @@ public void setDisplayName(String value) { } } + /** + * See if a player is whitelisted + * + * @param player Player + * @return Whitelisted Status + */ + public boolean canAccess(CommandSender player) { + return (player instanceof ProxiedPlayer && whitelist.contains(((ProxiedPlayer) player).getUniqueId())) || super.canAccess(player); + } + + /** + * Add a player to the whitelist (for use with restricted servers) + * + * @param player Player to add + */ + public void whitelist(UUID player) { + if (Util.isNull(player)) throw new NullPointerException(); + whitelist.add(player); + } + + /** + * Remove a player to the whitelist + * + * @param player Player to remove + */ + public void unwhitelist(UUID player) { + whitelist.remove(player); + } + /** * If the server is hidden from players * diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/SubServerContainer.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/SubServerContainer.java index 14318aea..fd9e45ee 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/SubServerContainer.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/SubServerContainer.java @@ -1,6 +1,8 @@ package net.ME1312.SubServers.Sync.Server; import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.UUID; /** * SubServer Class @@ -8,8 +10,8 @@ public class SubServerContainer extends ServerContainer { private boolean running; - public SubServerContainer(String signature, String name, String display, InetSocketAddress address, String subdata, String motd, boolean hidden, boolean restricted, boolean running) { - super(signature, name, display, address, subdata, motd, hidden, restricted); + public SubServerContainer(String signature, String name, String display, InetSocketAddress address, String subdata, String motd, boolean hidden, boolean restricted, Collection whitelist, boolean running) { + super(signature, name, display, address, subdata, motd, hidden, restricted, whitelist); this.running = running; } diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java index 54e81731..52d646a8 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java @@ -298,11 +298,11 @@ public void add(SubAddServerEvent e) { if (server != null) { if (server instanceof net.ME1312.SubServers.Sync.Network.API.SubServer) { servers.put(server.getName().toLowerCase(), new SubServerContainer(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(), - server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted(), ((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning())); + server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted(), server.getWhitelist(), ((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning())); System.out.println("SubServers > Added SubServer: " + e.getServer()); } else { servers.put(server.getName().toLowerCase(), new ServerContainer(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(), - server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted())); + server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted(), server.getWhitelist())); System.out.println("SubServers > Added Server: " + e.getServer()); } } else System.out.println("PacketDownloadServerInfo(" + e.getServer() + ") returned with an invalid response"); @@ -315,10 +315,10 @@ public Boolean merge(net.ME1312.SubServers.Sync.Network.API.Server server) { if (current == null || !current.getSignature().equals(server.getSignature())) { if (server instanceof net.ME1312.SubServers.Sync.Network.API.SubServer) { servers.put(server.getName().toLowerCase(), new SubServerContainer(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(), - server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted(), ((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning())); + server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted(), server.getWhitelist(), ((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning())); } else { servers.put(server.getName().toLowerCase(), new ServerContainer(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(), - server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted())); + server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted(), server.getWhitelist())); } System.out.println("SubServers > Added "+((server instanceof net.ME1312.SubServers.Sync.Network.API.SubServer)?"Sub":"")+"Server: " + server.getName());