diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java index bcc27e8..c15be3a 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java @@ -71,7 +71,8 @@ public class BukkitListener extends VPNExecutor implements Listener { @EventHandler public void onListener(final PlayerLoginEvent event) { //If they're exempt, don't check. - if(AntiVPN.getInstance().getExecutor().isWhitelisted(event.getPlayer().getUniqueId())) return; + if(AntiVPN.getInstance().getExecutor().isWhitelisted(event.getPlayer().getUniqueId()) + || AntiVPN.getInstance().getExecutor().isWhitelisted(event.getAddress().getHostAddress())) return; checkIp(event.getAddress().getHostAddress(), AntiVPN.getInstance().getConfig().cachedResults(), result -> { if(result.isSuccess() && result.isProxy()) { new BukkitRunnable() { diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java index d8b4c14..b0da53a 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java @@ -38,7 +38,7 @@ public class BukkitPlugin extends JavaPlugin { saveDefaultConfig(); Bukkit.getLogger().info("Starting AntiVPN services..."); - AntiVPN.start(new BukkitConfig(), new BukkitListener(), new BukkitPlayerExecutor()); + AntiVPN.start(new BukkitConfig(), new BukkitListener(), new BukkitPlayerExecutor(), getDataFolder()); if(AntiVPN.getInstance().getConfig().metrics()) { Bukkit.getLogger().info("Starting bStats metrics..."); diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java index fd55260..2c23438 100644 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java @@ -50,6 +50,8 @@ public class BungeeListener extends VPNExecutor implements Listener { if(event.getPlayer().hasPermission("antivpn.bypass") //Has bypass permission || AntiVPN.getInstance().getExecutor().isWhitelisted(event.getPlayer().getUniqueId()) //Is exempt //Or has a name that starts with a certain prefix. This is for Bedrock exempting. + || AntiVPN.getInstance().getExecutor().isWhitelisted(event.getPlayer().getAddress().getAddress() + .getHostAddress()) || AntiVPN.getInstance().getConfig().getPrefixWhitelists().stream() .anyMatch(prefix -> event.getPlayer().getName().startsWith(prefix))) return; diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java index 2fa9535..9ed49ea 100644 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java @@ -42,7 +42,7 @@ public class BungeePlugin extends Plugin { //Loading plugin BungeeCord.getInstance().getLogger().info("Starting AntiVPN services..."); - AntiVPN.start(new BungeeConfig(), new BungeeListener(), new BungeePlayerExecutor()); + AntiVPN.start(new BungeeConfig(), new BungeeListener(), new BungeePlayerExecutor(), getDataFolder()); if(AntiVPN.getInstance().getConfig().metrics()) { BungeeCord.getInstance().getLogger().info("Starting bStats metrics..."); diff --git a/Common/pom.xml b/Common/pom.xml index e8e56c5..a2d9ac1 100644 --- a/Common/pom.xml +++ b/Common/pom.xml @@ -37,4 +37,20 @@ + + + funkemunky-releases + https://nexus.funkemunky.cc/content/repositories/releases/ + + + + + + mysql + mysql-connector-java + 8.0.22 + provided + + + \ No newline at end of file diff --git a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java b/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java index 26f33c9..876b7e1 100644 --- a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java @@ -16,6 +16,7 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -32,12 +33,14 @@ public class AntiVPN { private MessageHandler messageHandler; private List commands = new ArrayList<>(); public int detections, checked; + private File pluginFolder; - public static void start(VPNConfig config, VPNExecutor executor, PlayerExecutor playerExecutor) { + public static void start(VPNConfig config, VPNExecutor executor, PlayerExecutor playerExecutor, File pluginFolder) { //Initializing INSTANCE = new AntiVPN(); + INSTANCE.pluginFolder = pluginFolder; INSTANCE.config = config; INSTANCE.executor = executor; INSTANCE.playerExecutor = playerExecutor; diff --git a/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java b/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java index 341ff47..01da20f 100644 --- a/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java +++ b/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java @@ -18,6 +18,8 @@ public abstract class VPNExecutor { private static final Map responseCache = new HashMap<>(); @Getter private final Set whitelisted = Collections.synchronizedSet(new HashSet<>()); + @Getter + private final Set whitelistedIps = Collections.synchronizedSet(new HashSet<>()); public abstract void registerListeners(); @@ -35,6 +37,10 @@ public abstract class VPNExecutor { return whitelisted.contains(uuid); } + public boolean isWhitelisted(String ip) { + return whitelistedIps.contains(ip); + } + public void checkIp(String ip, boolean cachedResults, Consumer result) { threadExecutor.execute(() -> result.accept(responseCache.compute(ip, (key, val) -> { if(val == null) { diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java b/Common/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java index 3d202ab..efe07c1 100644 --- a/Common/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java +++ b/Common/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java @@ -4,6 +4,7 @@ import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.api.APIPlayer; import dev.brighten.antivpn.command.Command; import dev.brighten.antivpn.command.CommandExecutor; +import dev.brighten.antivpn.utils.MiscUtils; import java.util.*; import java.util.stream.Collectors; @@ -34,7 +35,7 @@ public class AllowlistCommand extends Command { @Override public String usage() { - return " "; + return " "; } @Override @@ -50,7 +51,7 @@ public class AllowlistCommand extends Command { @Override public String execute(CommandExecutor executor, String[] args) { if(args.length == 0 || Arrays.stream(secondArgs).noneMatch(arg -> arg.equalsIgnoreCase(args[0]))) { - return "&cUsage: /antivpn allowlist "; + return "&cUsage: /antivpn allowlist " + usage(); } if(args.length == 1) @@ -61,34 +62,82 @@ public class AllowlistCommand extends Command { if(!databaseEnabled) executor.sendMessage("&cThe database is currently not setup, " + "so any changes here will disappear after a restart."); - UUID uuid = null; - try { - uuid = UUID.fromString(args[1]); - } catch(IllegalArgumentException e) { - Optional player = AntiVPN.getInstance().getPlayerExecutor().getPlayer(args[1]); - - if(!player.isPresent()) { - return "&cThe player \"" + args[1] + "\" is not online, so please provide a UUID."; - } - - uuid = player.get().getUuid(); - } - - if(!databaseEnabled) { - if(args[0].equalsIgnoreCase("add")) { - AntiVPN.getInstance().getExecutor().getWhitelisted().add(uuid); - return String.format("&aAdded &6%s &auuid to the exemption allowlist.", uuid.toString()); + if(MiscUtils.isIpv4(args[1])) { + if(!databaseEnabled) { + switch(args[0].toLowerCase()) { + case "add": { + AntiVPN.getInstance().getExecutor().getWhitelistedIps().add(args[1]); + return String.format("&aAdded &6%s &ato the exemption allowlist.", args[1]); + } + case "remove": + case "delete": { + AntiVPN.getInstance().getExecutor().getWhitelistedIps().remove(args[1]); + return String.format("&cRemoved &6%s &cfrom the exemption allowlist.", args[1]); + } + default: { + return "&c\"" + args[0] + "\" is not a valid argument"; + } + } } else { - AntiVPN.getInstance().getExecutor().getWhitelisted().remove(uuid); - return String.format("&cRemoved &6%s &cuuid from the exemption allowlist.", uuid.toString()); + switch(args[0].toLowerCase()) { + case "add": { + AntiVPN.getInstance().getDatabase().setWhitelisted(args[1], true); + return String.format("&aAdded &6%s &a to the exemption allowlist.", args[1]); + } + case "remove": + case "delete": { + AntiVPN.getInstance().getDatabase().setWhitelisted(args[1], false); + return String.format("&cRemoved &6%s &c from the exemption allowlist.", args[1]); + } + default: { + return "&c\"" + args[0] + "\" is not a valid argument"; + } + } } } else { - if(args[0].equalsIgnoreCase("add")) { - AntiVPN.getInstance().getDatabase().setWhitelisted(uuid, true); - return String.format("&aAdded &6%s &auuid to the exemption allowlist.", uuid.toString()); + UUID uuid = null; + try { + uuid = UUID.fromString(args[1]); + } catch(IllegalArgumentException e) { + Optional player = AntiVPN.getInstance().getPlayerExecutor().getPlayer(args[1]); + + if(!player.isPresent()) { + return "&cThe player \"" + args[1] + "\" is not online, so please provide a UUID."; + } + + uuid = player.get().getUuid(); + } + + if(!databaseEnabled) { + switch(args[0].toLowerCase()) { + case "add": { + AntiVPN.getInstance().getExecutor().getWhitelisted().add(uuid); + return String.format("&aAdded &6%s &auuid to the exemption allowlist.", uuid.toString()); + } + case "remove": + case "delete": { + AntiVPN.getInstance().getExecutor().getWhitelisted().remove(uuid); + return String.format("&cRemoved &6%s &cuuid from the exemption allowlist.", uuid.toString()); + } + default: { + return "&c\"" + args[0] + "\" is not a valid argument"; + } + } } else { - AntiVPN.getInstance().getDatabase().setWhitelisted(uuid, false); - return String.format("&cRemoved &6%s &cuuid from the exemption allowlist.", uuid.toString()); + switch(args[0].toLowerCase()) { + case "add": { + AntiVPN.getInstance().getDatabase().setWhitelisted(uuid, true); + return String.format("&aAdded &6%s &auuid to the exemption allowlist.", uuid.toString()); + } + case "remove": + case "delete": { + AntiVPN.getInstance().getDatabase().setWhitelisted(uuid, false); + return String.format("&cRemoved &6%s &cuuid from the exemption allowlist.", uuid.toString()); + } + default: { + return "&c\"" + args[0] + "\" is not a valid argument"; + } + } } } } diff --git a/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java b/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java index ad6036a..15bb052 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java @@ -14,14 +14,22 @@ public interface VPNDatabase { boolean isWhitelisted(UUID uuid); + boolean isWhitelisted(String ip); + void setWhitelisted(UUID uuid, boolean whitelisted); + void setWhitelisted(String ip, boolean whitelisted); + List getAllWhitelisted(); + List getAllWhitelistedIps(); + void getStoredResponseAsync(String ip, Consumer> result); void isWhitelistedAsync(UUID uuid, Consumer result); + void isWhitelistedAsync(String ip, Consumer result); + void alertsState(UUID uuid, Consumer result); void updateAlertsState(UUID uuid, boolean state); diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java b/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java index 12b7f4c..43f4378 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java @@ -20,7 +20,7 @@ public class MySqlVPN implements VPNDatabase { public MySqlVPN() { whitelistedThread = new Thread(() -> { try { - Thread.sleep(TimeUnit.SECONDS.toMillis(8)); + Thread.sleep(TimeUnit.SECONDS.toMillis(2)); } catch (InterruptedException e) { e.printStackTrace(); } @@ -30,6 +30,9 @@ public class MySqlVPN implements VPNDatabase { AntiVPN.getInstance().getExecutor().getWhitelisted().clear(); AntiVPN.getInstance().getExecutor().getWhitelisted() .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelisted()); + AntiVPN.getInstance().getExecutor().getWhitelistedIps().clear(); + AntiVPN.getInstance().getExecutor().getWhitelistedIps() + .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelistedIps()); } try { Thread.sleep(TimeUnit.SECONDS.toMillis(4)); @@ -95,15 +98,28 @@ public class MySqlVPN implements VPNDatabase { public boolean isWhitelisted(UUID uuid) { if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) return false; - ResultSet set = Query.prepare("select uuid from `whitelisted` where `uuid` = ? limit 1").append(uuid.toString()) - .executeQuery(); + ResultSet set = Query.prepare("select uuid from `whitelisted` where `uuid` = ? limit 1") + .append(uuid.toString()).executeQuery(); return set != null && set.next() && set.getString("uuid") != null; } + @SneakyThrows + @Override + public boolean isWhitelisted(String ip) { + if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) + return false; + ResultSet set = Query.prepare("select `ip` from `whitelisted-ips` where `ip` = ? limit 1") + .append(ip).executeQuery(); + + + return set != null && set.next() && set.getString("ip") != null; + } + @Override public void setWhitelisted(UUID uuid, boolean whitelisted) { - if(MySQL.isClosed()) return; + if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) + return; if (whitelisted) { if (!isWhitelisted(uuid)) { @@ -116,24 +132,42 @@ public class MySqlVPN implements VPNDatabase { } } + @Override + public void setWhitelisted(String ip, boolean whitelisted) { + if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) + return; + + if(whitelisted) { + if(!isWhitelisted(ip)) { + Query.prepare("insert into `whitelisted-ips` (`ip`) values (?)").append(ip).execute(); + } + AntiVPN.getInstance().getExecutor().getWhitelistedIps().add(ip); + } else { + Query.prepare("delete from `whitelisted-ips` where `ip` = ?").append(ip).execute(); + AntiVPN.getInstance().getExecutor().getWhitelistedIps().remove(ip); + } + } + @Override public List getAllWhitelisted() { List uuids = new ArrayList<>(); - if(MySQL.isClosed()) return uuids; + if(!MySQL.isClosed()) Query.prepare("select uuid from `whitelisted`") + .execute(set -> uuids.add(UUID.fromString(set.getString("uuid")))); - ResultSet set = Query.prepare("select uuid from `whitelisted`").executeQuery(); - - try { - while (set.next()) { - uuids.add(UUID.fromString(set.getString("uuid"))); - } - } catch (SQLException e) { - e.printStackTrace(); - } return uuids; } + @Override + public List getAllWhitelistedIps() { + List ips = new ArrayList<>(); + + if(!MySQL.isClosed()) Query.prepare("select `ip` from `whitelisted-ips`") + .execute(set -> ips.add(set.getString("ip"))); + + return ips; + } + @Override public void getStoredResponseAsync(String ip, Consumer> result) { if(MySQL.isClosed()) return; @@ -148,6 +182,13 @@ public class MySqlVPN implements VPNDatabase { VPNExecutor.threadExecutor.execute(() -> result.accept(isWhitelisted(uuid))); } + @Override + public void isWhitelistedAsync(String ip, Consumer result) { + if(MySQL.isClosed()) return; + + VPNExecutor.threadExecutor.execute(() -> result.accept(isWhitelisted(ip))); + } + @Override public void alertsState(UUID uuid, Consumer result) { if(MySQL.isClosed()) return; @@ -208,6 +249,7 @@ public class MySqlVPN implements VPNDatabase { } Query.prepare("create table if not exists `whitelisted` (`uuid` varchar(36) not null)").execute(); + Query.prepare("create table if not exists `whitelisted-ips` (`ip` varchar(45) not null)").execute(); Query.prepare("create table if not exists `responses` (`ip` varchar(45) not null, `asn` varchar(12)," + "`countryName` text, `countryCode` varchar(10), `city` text, `timeZone` varchar(64), " + "`method` varchar(32), `isp` text, `proxy` boolean, `cached` boolean, `inserted` timestamp," @@ -218,41 +260,62 @@ public class MySqlVPN implements VPNDatabase { try { // Ref: // https://dba.stackexchange.com/questions/24531/mysql-create-index-if-not-exists - String query = "SELECT COUNT(1) IndexExists FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema=DATABASE() AND table_name='whitelisted' AND index_name='uuid_1';"; + + String query = "SELECT COUNT(1) IndexExists FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema=DATABASE()" + + " AND table_name='whitelisted' AND index_name='uuid_1';"; ResultSet rs = Query.prepare(query).executeQuery(); int id = 0; - while (rs.next()) { - id = rs.getInt("IndexExists"); + whitelistedIndex: { + while (rs.next()) { + id = rs.getInt("IndexExists"); + } + if (id == 0) { + Query.prepare("create index `uuid_1` on `whitelisted` (`uuid`)").execute(); + } + id = 0; } - if (id == 0) { - Query.prepare("create index `uuid_1` on `whitelisted` (`uuid`)").execute(); + responsesIndex: { + query = "SELECT COUNT(1) IndexExists FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema=DATABASE() " + + "AND table_name='responses' AND index_name='ip_1';"; + rs = Query.prepare(query).executeQuery(); + while (rs.next()) { + id = rs.getInt("IndexExists"); + } + if (id == 0) { + Query.prepare("create index `ip_1` on `responses` (`ip`)").execute(); + } + id = 0; + query = "SELECT COUNT(1) IndexExists FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema=DATABASE() " + + "AND table_name='responses' AND index_name='proxy_1';"; + rs = Query.prepare(query).executeQuery(); + while (rs.next()) { + id = rs.getInt("IndexExists"); + } + if (id == 0) { + Query.prepare("create index `proxy_1` on `responses` (`proxy`)").execute(); + } + id = 0; + query = "SELECT COUNT(1) IndexExists FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema=DATABASE()" + + " AND table_name='responses' AND index_name='inserted_1';"; + rs = Query.prepare(query).executeQuery(); + while (rs.next()) { + id = rs.getInt("IndexExists"); + } + if (id == 0) { + Query.prepare("create index `inserted_1` on `responses` (`inserted`)").execute(); + } + id = 0; } - id = 0; - query = "SELECT COUNT(1) IndexExists FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema=DATABASE() AND table_name='responses' AND index_name='ip_1';"; - rs = Query.prepare(query).executeQuery(); - while (rs.next()) { - id = rs.getInt("IndexExists"); - } - if (id == 0) { - Query.prepare("create index `ip_1` on `responses` (`ip`)").execute(); - } - id = 0; - query = "SELECT COUNT(1) IndexExists FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema=DATABASE() AND table_name='responses' AND index_name='proxy_1';"; - rs = Query.prepare(query).executeQuery(); - while (rs.next()) { - id = rs.getInt("IndexExists"); - } - if (id == 0) { - Query.prepare("create index `proxy_1` on `responses` (`proxy`)").execute(); - } - id = 0; - query = "SELECT COUNT(1) IndexExists FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema=DATABASE() AND table_name='responses' AND index_name='inserted_1';"; - rs = Query.prepare(query).executeQuery(); - while (rs.next()) { - id = rs.getInt("IndexExists"); - } - if (id == 0) { - Query.prepare("create index `inserted_1` on `responses` (`inserted`)").execute(); + whitelistedIpsIndex: { + query = "SELECT COUNT(1) IndexExists FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema=DATABASE()" + + " AND table_name='whitelisted-ips' AND index_name='ip_1';"; + rs = Query.prepare(query).executeQuery(); + while (rs.next()) { + id = rs.getInt("IndexExists"); + } + if (id == 0) { + Query.prepare("create index `ip_1` on `whitelisted-ips` (`ip`)").execute(); + } } } catch (Exception e) { System.err.println("MySQL Excepton created" + e.getMessage()); diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java b/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java index 93c6a60..a156271 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java @@ -1,7 +1,9 @@ package dev.brighten.antivpn.database.sql.utils; import dev.brighten.antivpn.AntiVPN; +import dev.brighten.antivpn.utils.MiscUtils; +import java.io.File; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @@ -12,6 +14,15 @@ public class MySQL { public static void init() { try { if (conn == null || conn.isClosed()) { + File mysqlLib = new File(AntiVPN.getInstance().getPluginFolder(), "mysqllib.jar"); + + if(!mysqlLib.exists()) { + AntiVPN.getInstance().getExecutor().log("Downloading mysqllib.jar..."); + MiscUtils.download(mysqlLib, "https://nexus.funkemunky.cc/content/repositories/releases" + + "/mysql/mysql-connector-java/8.0.22/mysql-connector-java-8.0.22.jar"); + } + MiscUtils.injectURL(mysqlLib.toURI().toURL()); + Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://" + AntiVPN.getInstance().getConfig().getIp() + ":" + AntiVPN.getInstance().getConfig().getPort() + "/?useSSL=true&autoReconnect=true", diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/MiscUtils.java b/Common/src/main/java/dev/brighten/antivpn/utils/MiscUtils.java index fc93710..1837b7d 100644 --- a/Common/src/main/java/dev/brighten/antivpn/utils/MiscUtils.java +++ b/Common/src/main/java/dev/brighten/antivpn/utils/MiscUtils.java @@ -1,6 +1,16 @@ package dev.brighten.antivpn.utils; import java.io.Closeable; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; public class MiscUtils { @@ -20,4 +30,44 @@ public class MiscUtils { } } + public static boolean isIpv4(String ip) + { + + try { + InetAddress address = InetAddress.getByName(ip); + + return address instanceof Inet4Address; + } catch(Exception e) { + return false; + } + } + + /* Borrowed from FireFlyx ngxdev */ + public static void download(File file, String from) throws Exception { + URL url = new URL(from); + InputStream stream = url.openStream(); + ReadableByteChannel channel = Channels.newChannel(stream); + FileOutputStream out = new FileOutputStream(file); + out.getChannel().transferFrom(channel, 0L, Long.MAX_VALUE); + } + + /* Borrowed from FireFlyx ngxdev */ + public static ClassLoader injectorClassLoader = MiscUtils.class.getClassLoader(); + + /* Borrowed from FireFlyx ngxdev */ + public static void injectURL(URL url) { + try { + URLClassLoader systemClassLoader = (URLClassLoader) injectorClassLoader; + Class classLoaderClass = URLClassLoader.class; + + try { + Method method = classLoaderClass.getDeclaredMethod("addURL", URL.class); + method.setAccessible(true); + method.invoke(systemClassLoader, url); + } catch (Throwable t) { + t.printStackTrace(); + } + } catch (Exception e) { + } + } } diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java index 3ac309d..1f81baa 100644 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java +++ b/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java @@ -26,6 +26,8 @@ public class VelocityListener extends VPNExecutor { if(event.getPlayer().hasPermission("antivpn.bypass") //Has bypass permission || AntiVPN.getInstance().getExecutor().isWhitelisted(event.getPlayer().getUniqueId()) //Is exempt //Or has a name that starts with a certain prefix. This is for Bedrock exempting. + || AntiVPN.getInstance().getExecutor().isWhitelisted(event.getPlayer().getRemoteAddress() + .getAddress().getHostAddress()) || AntiVPN.getInstance().getConfig().getPrefixWhitelists().stream() .anyMatch(prefix -> event.getPlayer().getUsername().startsWith(prefix))) return; diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java index 98c2356..d227492 100644 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java +++ b/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java @@ -54,7 +54,7 @@ public class VelocityPlugin { //Loading plugin logger.info("Starting AntiVPN services..."); - AntiVPN.start(new VelocityConfig(), new VelocityListener(), new VelocityPlayerExecutor()); + AntiVPN.start(new VelocityConfig(), new VelocityListener(), new VelocityPlayerExecutor(), configDir.toFile()); if(AntiVPN.getInstance().getConfig().metrics()) { logger.info("Starting metrics...");