+ * Copyright (c) contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package dev.brighten.antivpn.loader;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Arrays;
+
+/**
+ * Classloader that can load a jar from within another jar file.
+ *
+ * The "loader" jar contains the loading code & public API classes
+ * and is class-loaded by the platform.
+ *
+ * The inner "plugin" jar contains the plugin itself and is class-loaded
+ * by the loading code & this classloader.
+ */
+public class JarInJarClassLoader extends URLClassLoader {
+ static {
+ ClassLoader.registerAsParallelCapable();
+ }
+
+ /**
+ * Creates a new jar-in-jar class loader.
+ *
+ * @param loaderClassLoader the loader plugin's classloader (setup and created by the platform)
+ * @param jarResourcePath the path to the jar-in-jar resource within the loader jar
+ * @throws LoadingException if something unexpectedly bad happens
+ */
+ public JarInJarClassLoader(ClassLoader loaderClassLoader, String... jarResourcePath) throws LoadingException {
+ super(Arrays.stream(jarResourcePath)
+ .map(path -> extractJar(loaderClassLoader, path))
+ .toArray(URL[]::new), loaderClassLoader);
+ }
+
+ public void addJarToClasspath(URL url) {
+ addURL(url);
+ }
+
+ public void deleteJarResource() {
+ URL[] urls = getURLs();
+ if (urls.length == 0) {
+ return;
+ }
+
+ try {
+ Path path = Paths.get(urls[0].toURI());
+ Files.deleteIfExists(path);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+
+ /**
+ * Creates a new plugin instance.
+ *
+ * @param bootstrapClass the name of the bootstrap plugin class
+ * @param loaderPluginType the type of the loader plugin, the only parameter of the bootstrap
+ * plugin constructor
+ * @param loaderPlugin the loader plugin instance
+ * @param the type of the loader plugin
+ * @return the instantiated bootstrap plugin
+ */
+ public LoaderBootstrap instantiatePlugin(String bootstrapClass, Class loaderPluginType, T loaderPlugin) throws LoadingException {
+ Class extends LoaderBootstrap> plugin;
+ try {
+ plugin = loadClass(bootstrapClass).asSubclass(LoaderBootstrap.class);
+ } catch (ReflectiveOperationException e) {
+ throw new LoadingException("Unable to load bootstrap class", e);
+ }
+
+ Constructor extends LoaderBootstrap> constructor;
+ try {
+ constructor = plugin.getConstructor(loaderPluginType);
+ } catch (ReflectiveOperationException e) {
+ throw new LoadingException("Unable to get bootstrap constructor", e);
+ }
+
+ try {
+ return constructor.newInstance(loaderPlugin);
+ } catch (ReflectiveOperationException e) {
+ throw new LoadingException("Unable to create bootstrap plugin instance", e);
+ }
+ }
+
+ /**
+ * Extracts the "jar-in-jar" from the loader plugin into a temporary file,
+ * then returns a URL that can be used by the {@link JarInJarClassLoader}.
+ *
+ * @param loaderClassLoader the classloader for the "host" loader plugin
+ * @param jarResourcePath the inner jar resource path
+ * @return a URL to the extracted file
+ */
+ private static URL extractJar(ClassLoader loaderClassLoader, String jarResourcePath) throws LoadingException {
+ // get the jar-in-jar resource
+ URL jarInJar = loaderClassLoader.getResource(jarResourcePath);
+ if (jarInJar == null) {
+ throw new LoadingException("Could not locate jar-in-jar");
+ }
+
+ // create a temporary file
+ // on posix systems; by default, this is only read/writable by the process owner
+ Path path;
+ try {
+ path = Files.createTempFile(jarResourcePath, ".jar.tmp");
+ } catch (IOException e) {
+ throw new LoadingException("Unable to create a temporary file", e);
+ }
+
+ // mark that the file should be deleted on exit
+ path.toFile().deleteOnExit();
+
+ // copy the jar-in-jar to the temporary file path
+ try (InputStream in = jarInJar.openStream()) {
+ Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
+ } catch (IOException e) {
+ throw new LoadingException("Unable to copy jar-in-jar to temporary path", e);
+ }
+
+ try {
+ return path.toUri().toURL();
+ } catch (MalformedURLException e) {
+ throw new LoadingException("Unable to get URL from path", e);
+ }
+ }
+
+}
diff --git a/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoaderBootstrap.java b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoaderBootstrap.java
new file mode 100644
index 0000000..38cbb29
--- /dev/null
+++ b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoaderBootstrap.java
@@ -0,0 +1,41 @@
+/*
+ * This file is part of LuckPerms, licensed under the MIT License.
+ *
+ * Copyright (c) lucko (Luck)
+ * Copyright (c) contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package dev.brighten.antivpn.loader;
+
+import java.io.File;
+
+/**
+ * Minimal bootstrap plugin, called by the loader plugin.
+ */
+public interface LoaderBootstrap {
+
+ void onLoad(File dataFolder);
+
+ default void onEnable() {}
+
+ default void onDisable() {}
+
+}
diff --git a/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoadingException.java b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoadingException.java
new file mode 100644
index 0000000..191ae03
--- /dev/null
+++ b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoadingException.java
@@ -0,0 +1,41 @@
+/*
+ * This file is part of LuckPerms, licensed under the MIT License.
+ *
+ * Copyright (c) lucko (Luck)
+ * Copyright (c) contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package dev.brighten.antivpn.loader;
+
+/**
+ * Runtime exception used if there is a problem during loading
+ */
+public class LoadingException extends RuntimeException {
+
+ public LoadingException(String message) {
+ super(message);
+ }
+
+ public LoadingException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/Common/pom.xml b/Common/pom.xml
index cca88e4..dff27de 100644
--- a/Common/pom.xml
+++ b/Common/pom.xml
@@ -5,8 +5,13 @@
AntiVPN
dev.brighten.antivpn
- 2.0.0-SNAPSHOT
+ 1.9.4
+ pom
+
+ loader-utils
+ Source
+
4.0.0
Common
@@ -16,156 +21,4 @@
17
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.13.0
-
- 17
- 17
- -XDignore.symbol.file
-
-
- org.projectlombok
- lombok
- 1.18.30
-
-
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- 3.6.0
-
-
- package
-
- shade
-
-
- true
-
-
- org.yaml.snakeyaml
- dev.brighten.antivpn.shaded.org.yaml.snakeyaml
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
- com.github.benmanes.caffeine
- dev.brighten.antivpn.shaded.com.github.benmanes.caffeine
-
-
- org.h2
- dev.brighten.antivpn.shaded.org.h2
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
- org.bson
- dev.brighten.antivpn.shaded.org.bson
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
- com.mongodb.client
- dev.brighten.antivpn.shaded.com.mongodb.client
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
- org.postgresql
- dev.brighten.antivpn.shaded.org.postgresql
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
-
-
-
-
-
-
-
- src/main/resources
- true
-
-
-
-
-
-
- funkemunky-releases
- https://nexus.funkemunky.cc/content/repositories/releases/
-
-
-
-
-
- org.xerial
- sqlite-jdbc
- 3.48.0.0
- provided
-
-
- org.ow2.asm
- asm
- 9.8
- compile
-
-
- org.ow2.asm
- asm-commons
- 9.8
- compile
-
-
- org.yaml
- snakeyaml
- 2.2
- compile
-
-
- com.github.ben-manes.caffeine
- caffeine
- 3.1.8
- provided
-
-
- org.jetbrains
- annotations
- 24.0.1
-
-
- org.mongodb
- mongodb-driver-sync
- 5.5.0
- provided
-
-
- org.postgresql
- postgresql
- 42.7.6
- provided
-
-
-
\ No newline at end of file
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/Database.java b/Common/src/main/java/dev/brighten/antivpn/database/Database.java
deleted file mode 100644
index 3d5514a..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/database/Database.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package dev.brighten.antivpn.database;
-
-import dev.brighten.antivpn.web.objects.VPNResponse;
-
-import java.util.Optional;
-import java.util.UUID;
-
-@SuppressWarnings({"unused"})
-public interface Database {
- Optional getStoredResponse(String ip);
-
- void cacheResponse(VPNResponse toCache);
-
- void deleteResponse(String ip);
-
- void clearResponses();
-
- void clearOutdatedResponses();
-
- boolean isWhitelisted(UUID uuid);
-
- boolean isWhitelisted(String ip);
-
- void addWhitelist(UUID uuid);
-
- void addWhitelist(String cidr);
-
- void removeWhitelist(UUID uuid);
-
- void removeWhitelist(String cidr);
-
- boolean getAlertsState(UUID uuid);
-
- void updateAlertsState(UUID uuid, boolean state);
-
- void init();
-
- void shutdown();
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/mongodb/MongoDatabase.java b/Common/src/main/java/dev/brighten/antivpn/database/mongodb/MongoDatabase.java
deleted file mode 100644
index 0cdf156..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/database/mongodb/MongoDatabase.java
+++ /dev/null
@@ -1,229 +0,0 @@
-package dev.brighten.antivpn.database.mongodb;
-
-import com.mongodb.client.MongoClient;
-import com.mongodb.client.MongoClients;
-import com.mongodb.client.MongoCollection;
-import com.mongodb.client.model.Filters;
-import com.mongodb.client.model.UpdateOptions;
-import dev.brighten.antivpn.AntiVPN;
-import dev.brighten.antivpn.database.Database;
-import dev.brighten.antivpn.database.mongodb.records.AlertsUser;
-import dev.brighten.antivpn.database.mongodb.records.CidrWhitelist;
-import dev.brighten.antivpn.database.mongodb.records.UserIpResponse;
-import dev.brighten.antivpn.database.mongodb.records.UserWhitelist;
-import dev.brighten.antivpn.utils.CIDRUtils;
-import dev.brighten.antivpn.utils.IpUtils;
-import dev.brighten.antivpn.utils.json.JSONException;
-import dev.brighten.antivpn.web.objects.VPNResponse;
-import org.bson.Document;
-
-import java.math.BigDecimal;
-import java.net.UnknownHostException;
-import java.util.Date;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-
-public class MongoDatabase implements Database {
-
- private MongoCollection alertsCollection;
- private MongoCollection cidrWhitelistCollection;
- private MongoCollection userWhitelistCollection;
- private MongoCollection vpnResponseCollection;
-
- @Override
- public Optional getStoredResponse(String ip) {
- UserIpResponse response = vpnResponseCollection.find(Filters.eq("ip", ip)).first();
-
- if(response == null) {
- return Optional.empty();
- }
-
- try {
- return Optional.of(response.getVpnResponse());
- } catch (JSONException e) {
- AntiVPN.getInstance().getExecutor().logException("Could not convert vpn response from JSON String to DTO " +
- "for address: " + ip, e);
- return Optional.empty();
- }
- }
-
- @Override
- public void cacheResponse(VPNResponse toCache) {
- try {
- UserIpResponse response = new UserIpResponse(toCache.getIp(), new Date(), toCache.toJson().toString());
-
- vpnResponseCollection.updateOne(Filters.eq("ip", toCache.getIp()),
- new Document("$set", response),
- new UpdateOptions().upsert(true));
- } catch (JSONException e) {
- AntiVPN.getInstance().getExecutor().log(Level.SEVERE, "An error occurred while caching response", e);
- }
- }
-
- @Override
- public void deleteResponse(String ip) {
- vpnResponseCollection.deleteOne(Filters.eq("ip", ip));
- }
-
- @Override
- public void clearResponses() {
- //Clears all documents within the collection
- var result = vpnResponseCollection.deleteMany(new Document());
-
- AntiVPN.getInstance().getExecutor().log(Level.INFO, "VPN responses have been cleared (count=%s)", result.getDeletedCount());
- }
-
- @Override
- public void clearOutdatedResponses() {
- var result = vpnResponseCollection.deleteMany(Filters.lte("date",
- new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMicros(7))));
-
- AntiVPN.getInstance().getExecutor().log(Level.INFO, "Cleared outdated responses (count=%s)",
- result.getDeletedCount());
- }
-
- @Override
- public boolean isWhitelisted(UUID uuid) {
- UserWhitelist whitelist = userWhitelistCollection.find(Filters.eq("uuid", uuid)).first();
-
- return whitelist != null;
- }
-
- @Override
- public boolean isWhitelisted(String ip) {
- Optional ipDec = IpUtils.getIpDecimal(ip);
-
- if(ipDec.isEmpty()) {
- AntiVPN.getInstance().getExecutor().log(Level.WARNING, "Could not check for whitelist on IP %s since" +
- " it cannot be converted to decimal!", ip);
- return false;
- }
-
- BigDecimal decimal = ipDec.get();
-
- CidrWhitelist whitelist = cidrWhitelistCollection.find(Filters.and(
- Filters.lte("start", decimal),
- Filters.gte("end", decimal)
-
- )).first();
-
- return whitelist != null;
- }
-
- @Override
- public void addWhitelist(UUID uuid) {
- UserWhitelist whitelist = new UserWhitelist(uuid);
-
- userWhitelistCollection.insertOne(whitelist);
- }
-
- @Override
- public void addWhitelist(String cidr) {
- try {
- var cidrObj = new CIDRUtils(cidr);
-
- Optional start = IpUtils.getIpDecimal(cidrObj.getStartAddress().getHostAddress()),
- end = IpUtils.getIpDecimal(cidrObj.getEndAddress().getHostAddress());
-
- if(start.isEmpty() || end.isEmpty()) {
- AntiVPN.getInstance().getExecutor().log(Level.WARNING, "Could not whitelist cidr %s since " +
- "it is missing either a start or end address", cidr);
- return;
- }
-
- CidrWhitelist whitelist = new CidrWhitelist(start.get(), end.get());
-
- cidrWhitelistCollection.insertOne(whitelist);
- } catch (UnknownHostException e) {
- AntiVPN.getInstance().getExecutor().logException("Could not whitelist cidr: " + cidr, e);
- }
- }
-
- @Override
- public void removeWhitelist(UUID uuid) {
- var result = userWhitelistCollection.deleteMany(Filters.eq("uuid", uuid.toString()));
-
- AntiVPN.getInstance().getExecutor().log(Level.INFO, "Removed whitelist for uuid %s (count=%s)",
- uuid, result.getDeletedCount());
- }
-
- @Override
- public void removeWhitelist(String cidr) {
- try {
- var cidrObj = new CIDRUtils(cidr);
-
- Optional start = IpUtils.getIpDecimal(cidrObj.getStartAddress().getHostAddress());
- Optional end = IpUtils.getIpDecimal(cidrObj.getEndAddress().getHostAddress());
-
- if(start.isEmpty() || end.isEmpty()) {
- AntiVPN.getInstance().getExecutor().log(Level.WARNING, "Could not remove cidr %s from whitelist" +
- " since it is missing either a start or end address.", cidr);
- return;
- }
-
- var result = cidrWhitelistCollection.deleteMany(Filters.and(Filters.eq("start", start.get()),
- Filters.eq("end", end.get())));
-
- AntiVPN.getInstance().getExecutor().log(Level.INFO, "Removed cidr %s from whitelist (count=%s).",
- cidr, result.getDeletedCount());
- } catch (UnknownHostException e) {
- AntiVPN.getInstance().getExecutor().logException("Could not remove whitelist for CIDR: " + cidr, e);
- }
- }
-
- @Override
- public boolean getAlertsState(UUID uuid) {
- AlertsUser alertsUser = alertsCollection.find(Filters.eq("uuid", uuid)).first();
-
- if(alertsUser == null) {
- return false;
- }
-
- return alertsUser.state();
- }
-
- @Override
- public void updateAlertsState(UUID uuid, boolean state) {
- alertsCollection.updateOne(Filters.eq("uuid", uuid),
- new Document("$set", new AlertsUser(uuid, state)),
- new UpdateOptions().upsert(true));
- }
-
- @Override
- public void init() {
- String connectionUrl;
- if(AntiVPN.getInstance().getVpnConfig().getMongoURL().isEmpty()) {
- String databaseName = AntiVPN.getInstance().getVpnConfig().getDatabaseName();
- String username = AntiVPN.getInstance().getVpnConfig().getUsername();
- String password = AntiVPN.getInstance().getVpnConfig().getPassword();
- String ip = AntiVPN.getInstance().getVpnConfig().getIp();
- int port = AntiVPN.getInstance().getVpnConfig().getPort();
-
- connectionUrl = String.format("mongodb+srv://" +
- "%s:%s>@%s:%s/%s?connectTimeoutMS=2000",
- username, password, ip, port, databaseName);
- } else {
- connectionUrl = AntiVPN.getInstance()
- .getVpnConfig().getMongoURL();
- }
-
- try(MongoClient mongoClient = MongoClients.create(connectionUrl)) {
- var database = mongoClient.getDatabase(AntiVPN.getInstance().getVpnConfig().getDatabaseName());
-
- userWhitelistCollection = database.getCollection("whitelist", UserWhitelist.class);
- cidrWhitelistCollection = database.getCollection("cidrWhitelist", CidrWhitelist.class);
- alertsCollection = database.getCollection("alerts", AlertsUser.class);
- vpnResponseCollection = database.getCollection("responses", UserIpResponse.class);
- }
- }
-
- @Override
- public void shutdown() {
- userWhitelistCollection = null;
- cidrWhitelistCollection = null;
- alertsCollection = null;
- vpnResponseCollection = null;
- }
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/AlertsUser.java b/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/AlertsUser.java
deleted file mode 100644
index 7fe29f8..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/AlertsUser.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package dev.brighten.antivpn.database.mongodb.records;
-
-import java.util.UUID;
-
-public record AlertsUser(UUID uuid, boolean state) {
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/CidrWhitelist.java b/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/CidrWhitelist.java
deleted file mode 100644
index eb24bb5..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/CidrWhitelist.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package dev.brighten.antivpn.database.mongodb.records;
-
-import java.math.BigDecimal;
-
-public record CidrWhitelist(BigDecimal start, BigDecimal end) {
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/UserIpResponse.java b/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/UserIpResponse.java
deleted file mode 100644
index cc81709..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/UserIpResponse.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package dev.brighten.antivpn.database.mongodb.records;
-
-import dev.brighten.antivpn.utils.json.JSONException;
-import dev.brighten.antivpn.web.objects.VPNResponse;
-
-import java.util.Date;
-
-public record UserIpResponse(String ip, Date queried, String response) {
-
- public VPNResponse getVpnResponse() throws JSONException {
- return VPNResponse.fromJson(response);
- }
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/UserWhitelist.java b/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/UserWhitelist.java
deleted file mode 100644
index e2e01c4..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/database/mongodb/records/UserWhitelist.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package dev.brighten.antivpn.database.mongodb.records;
-
-import java.util.UUID;
-
-public record UserWhitelist(UUID uuid) {
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/postgres/PostgresDatabase.java b/Common/src/main/java/dev/brighten/antivpn/database/postgres/PostgresDatabase.java
deleted file mode 100644
index e21a3e0..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/database/postgres/PostgresDatabase.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package dev.brighten.antivpn.database.postgres;
-
-import dev.brighten.antivpn.AntiVPN;
-import dev.brighten.antivpn.database.sqllite.LiteDatabase;
-
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.util.Properties;
-
-public class PostgresDatabase extends LiteDatabase {
-
- @Override
- public void init() {
-
- try {
- Class.forName("org.postgresql.Driver");
- } catch (ClassNotFoundException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- return;
- }
- String databaseName = AntiVPN.getInstance().getVpnConfig().getDatabaseName();
- String ipAddress = AntiVPN.getInstance().getVpnConfig().getIp();
- int port = AntiVPN.getInstance().getVpnConfig().getPort();
- String username = AntiVPN.getInstance().getVpnConfig().getUsername();
- String password = AntiVPN.getInstance().getVpnConfig().getPassword();
-
- String url = String.format("jdbc:postgresql://%s:%s/%s", ipAddress, port, databaseName);
-
- Properties properties = new Properties();
-
- properties.setProperty("user", username);
- properties.setProperty("password", password);
- properties.setProperty("ssl", "true");
-
- try {
- connection = DriverManager.getConnection(url, properties);
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
-
- }
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sqllite/LiteDatabase.java b/Common/src/main/java/dev/brighten/antivpn/database/sqllite/LiteDatabase.java
deleted file mode 100644
index da2e8e7..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/database/sqllite/LiteDatabase.java
+++ /dev/null
@@ -1,261 +0,0 @@
-package dev.brighten.antivpn.database.sqllite;
-
-import dev.brighten.antivpn.AntiVPN;
-import dev.brighten.antivpn.database.sqllite.version.Version;
-import dev.brighten.antivpn.utils.CIDRUtils;
-import dev.brighten.antivpn.utils.IpUtils;
-import dev.brighten.antivpn.utils.StringUtil;
-import dev.brighten.antivpn.utils.json.JSONException;
-import dev.brighten.antivpn.web.objects.VPNResponse;
-import org.intellij.lang.annotations.Language;
-
-import java.math.BigDecimal;
-import java.net.UnknownHostException;
-import java.sql.*;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-
-@SuppressWarnings("SqlSourceToSinkFlow")
-public class LiteDatabase implements dev.brighten.antivpn.database.Database {
-
- protected Connection connection;
-
- @Override
- public Optional getStoredResponse(String ip) {
- return Optional.empty();
- }
-
- @Override
- public void cacheResponse(VPNResponse toCache) {
- String jsonResponse;
- try {
- jsonResponse = toCache.toJson().toString();
- } catch (JSONException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- return;
- }
-
- String hashedIp = StringUtil.getHash(toCache.getIp());
-
- try {
- statement("INSERT INTO vpn_responses (ip, date, response) VALUES (?, ?, ?)", hashedIp, System.currentTimeMillis(), jsonResponse);
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
-
- @Override
- public void deleteResponse(String ip) {
- String hashedIp = StringUtil.getHash(ip);
-
- try {
- statement("DELETE FROM vpn_responses WHERE ip = ?", hashedIp);
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
-
- @SuppressWarnings("SqlWithoutWhere")
- @Override
- public void clearResponses() {
- try {
- statement("DELETE FROM vpn_responses");
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
-
- @Override
- public void clearOutdatedResponses() {
- long cutoffTime = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7);
-
- try {
- statement("DELETE FROM vpn_responses WHERE date < ?", cutoffTime);
- } catch (SQLException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public boolean isWhitelisted(UUID uuid) {
- try(ResultSet result = query("SELECT * FROM whitelist WHERE uuid = ?", uuid.toString())) {
- return result.next();
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- return false;
- }
-
- @Override
- public boolean isWhitelisted(String ip) {
- CIDRUtils cidr;
- BigDecimal start, end;
- try {
- cidr = new CIDRUtils(ip);
-
- start = IpUtils.getIpDecimal(cidr.getStartAddress().getHostAddress()).orElseThrow();
- end = IpUtils.getIpDecimal(cidr.getEndAddress().getHostAddress()).orElseThrow();
- } catch (UnknownHostException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- return false;
- }
-
- try(ResultSet result = query("SELECT * FROM whitelist " +
- "WHERE minimum >= ? AND maximum <= ?", start, end)) {
- return result.next();
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- return false;
- }
-
- @Override
- public void addWhitelist(UUID uuid) {
- try {
- statement("INSERT INTO whitelist (uuid) VALUES (?)", uuid.toString());
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
-
- @Override
- public void addWhitelist(String cidr) {
- CIDRUtils cidrUtils;
- BigDecimal start, end;
- try {
- cidrUtils = new CIDRUtils(cidr);
-
- start = IpUtils.getIpDecimal(cidrUtils.getStartAddress().getHostAddress()).orElseThrow();
- end = IpUtils.getIpDecimal(cidrUtils.getEndAddress().getHostAddress()).orElseThrow();
- } catch (UnknownHostException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- return;
- }
-
- try {
- statement("INSERT INTO whitelist (minimum, maximum) VALUES (?, ?)", start, end);
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
-
- @Override
- public void removeWhitelist(UUID uuid) {
- try {
- statement("DELETE FROM whitelist WHERE uuid = ?", uuid.toString());
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
-
- @Override
- public void removeWhitelist(String cidr) {
- CIDRUtils cidrUtils;
- BigDecimal start, end;
- try {
- cidrUtils = new CIDRUtils(cidr);
-
- start = IpUtils.getIpDecimal(cidrUtils.getStartAddress().getHostAddress()).orElseThrow();
- end = IpUtils.getIpDecimal(cidrUtils.getEndAddress().getHostAddress()).orElseThrow();
- } catch (UnknownHostException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- return;
- }
-
- try {
- statement("DELETE FROM whitelist WHERE minimum = ? AND maximum = ?", start, end);
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
-
- @Override
- public boolean getAlertsState(UUID uuid) {
- try(ResultSet result = query("SELECT * FROM alerts WHERE uuid = ?", uuid.toString())) {
- return result.next();
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- return false;
- }
-
- @Override
- public void updateAlertsState(UUID uuid, boolean state) {
- try {
- statement("DELETE FROM alerts WHERE uuid = ?", uuid.toString());
- if(state) {
- statement("INSERT INTO alerts (uuid) VALUES (?)",
- uuid.toString());
- }
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
-
- @Override
- public void init() {
- String url = "jdbc:sqlite:" + AntiVPN.getInstance().getPluginFolder().toPath() + "/database.db";
-
- try {
- Class.forName("org.sqlite.JDBC");
-
- this.connection = DriverManager.getConnection(url);
-
- setupTable();
- } catch (SQLException | ClassNotFoundException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
-
- public void setupTable() throws SQLException {
- // Run through updates
- for (Version version : Version.versions) {
- try(ResultSet result = query("SELECT * FROM version WHERE version = ?",
- version.versionNumber())) {
- if(!result.next()) {
- version.update(this);
- statement("INSERT INTO version (version, updated) VALUES (?, ?)",
- version.versionNumber(), true);
- }
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
- }
-
- protected ResultSet query(@Language("SQL") String query, Object... args) throws SQLException {
- try(Connection connection = connection()) {
- PreparedStatement pstmt = connection.prepareStatement(query);
- for (int i = 0; i < args.length; i++) {
- pstmt.setObject(i + 1, args[i]);
- }
-
- return pstmt.executeQuery();
- }
- }
-
- protected void statement(@Language("SQL") String query, Object... args) throws SQLException {
- try(Connection connection = connection()) {
- PreparedStatement pstmt = connection.prepareStatement(query);
- for (int i = 0; i < args.length; i++) {
- pstmt.setObject(i + 1, args[i]);
- }
-
- pstmt.execute();
- }
- }
-
- public Connection connection() {
- return connection;
- }
-
- @Override
- public void shutdown() {
- try {
- connection.close();
- } catch (SQLException e) {
- AntiVPN.getInstance().getExecutor().logException(e);
- }
- }
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sqllite/version/Version.java b/Common/src/main/java/dev/brighten/antivpn/database/sqllite/version/Version.java
deleted file mode 100644
index eb0b561..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/database/sqllite/version/Version.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package dev.brighten.antivpn.database.sqllite.version;
-
-import dev.brighten.antivpn.database.sqllite.LiteDatabase;
-import dev.brighten.antivpn.database.sqllite.version.impl.First;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-public interface Version {
- void update(LiteDatabase database) throws SQLException;
- int versionNumber();
-
- List versions = new ArrayList<>();
-
- static void register() {
- versions.add(new First());
- }
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sqllite/version/impl/First.java b/Common/src/main/java/dev/brighten/antivpn/database/sqllite/version/impl/First.java
deleted file mode 100644
index 508ad62..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/database/sqllite/version/impl/First.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package dev.brighten.antivpn.database.sqllite.version.impl;
-
-import dev.brighten.antivpn.database.sqllite.LiteDatabase;
-import dev.brighten.antivpn.database.sqllite.version.Version;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-public class First implements Version {
-
- @Override
- public void update(LiteDatabase database) {
- try(Connection connection = database.connection()) {
- Statement statement = connection.createStatement();
- statement.execute("CREATE TABLE IF NOT EXISTS vpn_responses (ip TEXT, date INTEGER, response TEXT)");
- statement.execute("CREATE TABLE IF NOT EXISTS whitelist (uuid TEXT, minimum NUMERIC, maximum NUMERIC)");
- statement.execute("CREATE TABLE IF NOT EXISTS alerts (uuid TEXT)");
- statement.execute("CREATE TABLE IF NOT EXISTS version (version INTEGER PRIMARY KEY, updated BOOLEAN)");
- } catch (SQLException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public int versionNumber() {
- return 1;
- }
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/CIDRUtils.java b/Common/src/main/java/dev/brighten/antivpn/utils/CIDRUtils.java
deleted file mode 100644
index 26b3ca9..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/utils/CIDRUtils.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
-* The MIT License
-*
-* Copyright (c) 2013 Edin Dazdarevic (edin.dazdarevic@gmail.com)
-
-* Permission is hereby granted, free of charge, to any person obtaining a copy
-* of this software and associated documentation files (the "Software"), to deal
-* in the Software without restriction, including without limitation the rights
-* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the Software is
-* furnished to do so, subject to the following conditions:
-
-* The above copyright notice and this permission notice shall be included in
-* all copies or substantial portions of the Software.
-
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-* THE SOFTWARE.
-*
-* */
-
-package dev.brighten.antivpn.utils;
-
-import lombok.Getter;
-
-import java.math.BigInteger;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A class that enables to get an IP range from CIDR specification. It supports
- * both IPv4 and IPv6.
- */
-@Getter
-public class CIDRUtils {
- private final String cidr;
-
- private final InetAddress inetAddress;
-
- private InetAddress startAddress;
- private InetAddress endAddress;
- private final int prefixLength;
-
-
- public CIDRUtils(String cidr) throws UnknownHostException {
-
- this.cidr = cidr;
-
- /* split CIDR to address and prefix part */
- if (this.cidr.contains("/")) {
- int index = this.cidr.indexOf("/");
- String addressPart = this.cidr.substring(0, index);
- String networkPart = this.cidr.substring(index + 1);
-
- inetAddress = InetAddress.getByName(addressPart);
- prefixLength = Integer.parseInt(networkPart);
-
- calculate();
- } else {
- throw new IllegalArgumentException("not an valid CIDR format!");
- }
- }
-
-
- private void calculate() throws UnknownHostException {
-
- ByteBuffer maskBuffer;
- int targetSize;
- if (inetAddress.getAddress().length == 4) {
- maskBuffer =
- ByteBuffer
- .allocate(4)
- .putInt(-1);
- targetSize = 4;
- } else {
- maskBuffer = ByteBuffer.allocate(16)
- .putLong(-1L)
- .putLong(-1L);
- targetSize = 16;
- }
-
- BigInteger mask = (new BigInteger(1, maskBuffer.array())).not().shiftRight(prefixLength);
-
- ByteBuffer buffer = ByteBuffer.wrap(inetAddress.getAddress());
- BigInteger ipVal = new BigInteger(1, buffer.array());
-
- BigInteger startIp = ipVal.and(mask);
- BigInteger endIp = startIp.add(mask.not());
-
- byte[] startIpArr = toBytes(startIp.toByteArray(), targetSize);
- byte[] endIpArr = toBytes(endIp.toByteArray(), targetSize);
-
- this.startAddress = InetAddress.getByAddress(startIpArr);
- this.endAddress = InetAddress.getByAddress(endIpArr);
-
- }
-
- private byte[] toBytes(byte[] array, int targetSize) {
- int counter = 0;
- List newArr = new ArrayList();
- while (counter < targetSize && (array.length - 1 - counter >= 0)) {
- newArr.add(0, array[array.length - 1 - counter]);
- counter++;
- }
-
- int size = newArr.size();
- for (int i = 0; i < (targetSize - size); i++) {
-
- newArr.add(0, (byte) 0);
- }
-
- byte[] ret = new byte[newArr.size()];
- for (int i = 0; i < newArr.size(); i++) {
- ret[i] = newArr.get(i);
- }
- return ret;
- }
-
- public String getNetworkAddress() {
-
- return this.startAddress.getHostAddress();
- }
-
- public String getBroadcastAddress() {
- return this.endAddress.getHostAddress();
- }
-
- public boolean isInRange(String ipAddress) throws UnknownHostException {
- InetAddress address = InetAddress.getByName(ipAddress);
- BigInteger start = new BigInteger(1, this.startAddress.getAddress());
- BigInteger end = new BigInteger(1, this.endAddress.getAddress());
- BigInteger target = new BigInteger(1, address.getAddress());
-
- int st = start.compareTo(target);
- int te = target.compareTo(end);
-
- return (st == -1 || st == 0) && (te == -1 || te == 0);
- }
-}
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/IpUtils.java b/Common/src/main/java/dev/brighten/antivpn/utils/IpUtils.java
deleted file mode 100644
index 2ead854..0000000
--- a/Common/src/main/java/dev/brighten/antivpn/utils/IpUtils.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package dev.brighten.antivpn.utils;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Optional;
-
-public class IpUtils {
- public static Optional getIpDecimal(String address) {
- try {
- InetAddress inet = InetAddress.getByName(address);
-
- if(inet instanceof Inet4Address) {
- return Optional.of(BigDecimal.valueOf(ipv4ToLong(address)));
- } return Optional.of(new BigDecimal(ipv6ToDecimalFormat(address)));
- } catch(Exception e) {
- return Optional.empty();
- }
- }
-
- public static long ipv4ToLong(String address) {
- String[] addrArray = address.split("\\.");
-
- long ipDecimal = 0;
-
- for (int i = 0; i < addrArray.length; i++) {
-
- int power = 3 - i;
- ipDecimal += ((Integer.parseInt(addrArray[i]) % 256 * Math.pow(256, power)));
- }
-
- return ipDecimal;
- }
-
- public static String getIpv4(long ip) {
- StringBuilder sb = new StringBuilder(15);
-
- for (int i = 0; i < 4; i++) {
- sb.insert(0, ip & 0xff);
-
- if (i < 3) {
- sb.insert(0, '.');
- }
-
- ip >>= 8;
- }
-
- return sb.toString();
- }
-
- public static boolean isIpv4(BigDecimal ip) {
- return ip.compareTo(BigDecimal.valueOf(4294967295L)) <= 0;
- }
-
- public static boolean isIpv6(BigDecimal ip) {
- return ip.compareTo(BigDecimal.valueOf(4294967295L)) > 0;
- }
- public static boolean isIpv4(String ip) {
- return ip.matches("^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}$");
- }
-
- public static boolean isNotIp(String ip) {
- return !isIpv4(ip) && !isIpv6(ip);
- }
-
- public static boolean isIpv6(String ip) {
- return ip.matches("^([0-9a-fA-F]{1,4}:){7}([0-9a-fA-F]{1,4}|:)$|^(([0-9a-fA-F]{1,4}:){0,6}([0-9a-fA-F]{1,4}|:))?(::([0-9a-fA-F]{1,4}:){0,5}([0-9a-fA-F]{1,4}|:))?$");
- }
-
- public static String getIpv4(BigDecimal ip) {
- try {
- return Inet4Address.getByAddress(ip.toBigInteger().toByteArray()).getHostAddress();
- } catch (UnknownHostException e) {
- return "Error";
- }
- }
-
- public static String getIpv6(BigDecimal ip) {
- try {
- return Inet6Address.getByAddress(ip.toBigInteger().toByteArray()).getHostAddress();
- } catch (UnknownHostException e) {
- return "Error";
- }
- }
-
- public static BigInteger ipv6ToDecimalFormat(String ipAddress) throws UnknownHostException {
- return new BigInteger(1, Inet6Address.getByName(ipAddress).getAddress());
- }
-
-}
diff --git a/Sponge/pom.xml b/Sponge/pom.xml
index 3b89136..c9ce89b 100644
--- a/Sponge/pom.xml
+++ b/Sponge/pom.xml
@@ -5,7 +5,7 @@
AntiVPN
dev.brighten.antivpn
- 2.0.0-SNAPSHOT
+ 1.9.4
4.0.0
@@ -31,8 +31,8 @@
dev.brighten.antivpn
- Common
- 2.0.0-SNAPSHOT
+ Source
+ 1.9.4
compile
@@ -42,22 +42,29 @@
compile
- org.xerial
- sqlite-jdbc
- 3.48.0.0
+ org.mongodb
+ mongo-java-driver
+ 3.12.14
compile
- org.postgresql
- postgresql
- 42.7.6
+ com.mysql
+ mysql-connector-j
+ 9.1.0
+ jar
+ compile
+
+
+ com.h2database
+ h2
+ 2.2.220
compile
- 21
- 21
+ 17
+ 17
@@ -67,8 +74,8 @@
maven-compiler-plugin
3.13.0
- 21
- 21
+ 17
+ 17
-XDignore.symbol.file
@@ -127,8 +134,26 @@
- org.postgresql
- dev.brighten.antivpn.shaded.org.postgresql
+ com.mongodb
+ dev.brighten.antivpn.shaded.com.mongodb
+
+
+ dev.brighten.antivpn.depends.Relocate
+ dev.brighten.antivpn.depends.MavenLibraries
+
+
+
+ com.mysql.cj
+ dev.brighten.antivpn.shaded.com.mysql.cj
+
+
+ dev.brighten.antivpn.depends.Relocate
+ dev.brighten.antivpn.depends.MavenLibraries
+
+
+
+ com.mysql.jdbc
+ dev.brighten.antivpn.shaded.com.mysql.jdbc
dev.brighten.antivpn.depends.Relocate
diff --git a/Universal/pom.xml b/Universal/pom.xml
index 66e21c3..44ff3b2 100644
--- a/Universal/pom.xml
+++ b/Universal/pom.xml
@@ -6,7 +6,7 @@
dev.brighten.antivpn
AntiVPN
- 2.0.0-SNAPSHOT
+ 1.9.4
Universal
@@ -14,30 +14,25 @@
17
17
+ UTF-8
- dev.brighten.antivpn
- Common
+ dev.brighten.antivpn.bukkit
+ Loader
${project.version}
compile
dev.brighten.antivpn
- Bukkit
+ VelocityLoader
${project.version}
compile
- dev.brighten.antivpn
- Bungee
- ${project.version}
- compile
-
-
- dev.brighten.antivpn
- Velocity
+ dev.brighten.antivpn.bungee
+ BungeeLoader
${project.version}
compile
@@ -60,6 +55,10 @@
false
+
+ antivpn-source.jarinjar
+ ${project.parent.basedir}/Common/Source/target/Source-${project.version}.jar
+
diff --git a/Velocity/VelocityLoader/pom.xml b/Velocity/VelocityLoader/pom.xml
new file mode 100644
index 0000000..1a52d54
--- /dev/null
+++ b/Velocity/VelocityLoader/pom.xml
@@ -0,0 +1,109 @@
+
+
+ 4.0.0
+
+ dev.brighten.antivpn
+ Velocity
+ 1.9.4
+ ../pom.xml
+
+
+ VelocityLoader
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+ velocity
+ https://nexus.funkemunky.cc/repository/papermc-public/
+
+
+
+
+
+ com.velocitypowered
+ velocity-api
+ 3.4.0-SNAPSHOT
+ provided
+
+
+ org.bstats
+ bstats-velocity
+ 2.2.1
+ compile
+
+
+ dev.brighten.antivpn
+ loader-utils
+ 1.9.4
+ compile
+
+
+ dev.brighten.antivpn
+ VelocityPlugin
+ 1.9.4
+ provided
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.13.0
+
+ 17
+ 17
+ -XDignore.symbol.file
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.6.0
+
+
+ package
+
+ shade
+
+
+ false
+
+
+ antivpn-velocity.jarinjar
+ ${project.parent.basedir}/VelocityPlugin/target/VelocityPlugin-${project.version}.jar
+
+
+
+
+ org.bstats
+
+ dev.brighten.antivpn.velocity.org.bstats
+
+
+ org.yaml.snakeyaml
+ dev.brighten.antivpn.shaded.org.yaml.snakeyaml
+
+
+
+
+
+
+
+
+
+ src/main/resources
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/Velocity/VelocityLoader/src/main/java/dev/brighten/antivpn/velocity/VelocityPluginLoader.java b/Velocity/VelocityLoader/src/main/java/dev/brighten/antivpn/velocity/VelocityPluginLoader.java
new file mode 100644
index 0000000..9c7add0
--- /dev/null
+++ b/Velocity/VelocityLoader/src/main/java/dev/brighten/antivpn/velocity/VelocityPluginLoader.java
@@ -0,0 +1,51 @@
+package dev.brighten.antivpn.velocity;
+
+import com.google.inject.Inject;
+import com.velocitypowered.api.event.Subscribe;
+import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
+import com.velocitypowered.api.event.proxy.ProxyShutdownEvent;
+import com.velocitypowered.api.plugin.Plugin;
+import com.velocitypowered.api.plugin.annotation.DataDirectory;
+import com.velocitypowered.api.proxy.ProxyServer;
+import dev.brighten.antivpn.loader.JarInJarClassLoader;
+import dev.brighten.antivpn.loader.LoaderBootstrap;
+import org.bstats.velocity.Metrics;
+
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+@Plugin(id = "kaurivpn", name = "KauriVPN", version = "1.7.1", authors = {"funkemunky"})
+public class VelocityPluginLoader {
+
+ private static final String JAR_NAME = "antivpn-velocity.jarinjar";
+ private static final String SOURCE_NAME = "antivpn-source.jarinjar";
+ private static final String BOOTSTRAP_CLASS = "dev.brighten.antivpn.velocity.VelocityPlugin";
+
+ private final LoaderBootstrap plugin;
+
+ @Inject
+ public VelocityPluginLoader(ProxyServer server, Logger logger, @DataDirectory Path path, Metrics.Factory metricsFactory) {
+ Map, Object> instances = new HashMap<>();
+ instances.put(ProxyServer.class, server);
+ instances.put(Logger.class, logger);
+ instances.put(Path.class, path);
+ instances.put(String.class, metricsFactory);
+ instances.put(LoaderBootstrap.class, this);
+ JarInJarClassLoader loader = new JarInJarClassLoader(getClass().getClassLoader(), JAR_NAME, SOURCE_NAME);
+ this.plugin = loader.instantiatePlugin(BOOTSTRAP_CLASS, Map.class, instances);
+ plugin.onLoad(path.toFile());
+ }
+
+ @Subscribe
+ public void onInit(ProxyInitializeEvent event) {
+ plugin.onEnable();
+ }
+
+ @Subscribe
+ public void onDisable(ProxyShutdownEvent event) {
+ plugin.onDisable();
+ }
+
+}
diff --git a/Velocity/src/main/resources/velocity-plugin.json b/Velocity/VelocityLoader/src/main/resources/velocity-plugin.json
similarity index 75%
rename from Velocity/src/main/resources/velocity-plugin.json
rename to Velocity/VelocityLoader/src/main/resources/velocity-plugin.json
index 1c547a3..d23d87a 100644
--- a/Velocity/src/main/resources/velocity-plugin.json
+++ b/Velocity/VelocityLoader/src/main/resources/velocity-plugin.json
@@ -1 +1 @@
-{"id":"kaurivpn","name":"KauriVPN","version":"${project.version}","authors":["funkemunky"],"dependencies":[],"main":"dev.brighten.antivpn.velocity.VelocityPlugin"}
+{"id":"kaurivpn","name":"KauriVPN","version":"${project.version}","authors":["funkemunky"],"dependencies":[],"main":"dev.brighten.antivpn.velocity.VelocityPluginLoader"}
diff --git a/Velocity/VelocityPlugin/pom.xml b/Velocity/VelocityPlugin/pom.xml
new file mode 100644
index 0000000..d475480
--- /dev/null
+++ b/Velocity/VelocityPlugin/pom.xml
@@ -0,0 +1,102 @@
+
+
+ 4.0.0
+
+ dev.brighten.antivpn
+ AntiVPN
+ 1.9.4
+ ../../pom.xml
+
+
+ VelocityPlugin
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+ velocity
+ https://nexus.funkemunky.cc/repository/papermc-public/
+
+
+
+
+
+ com.velocitypowered
+ velocity-api
+ 3.4.0-SNAPSHOT
+ provided
+
+
+ dev.brighten.antivpn
+ Source
+ 1.9.4
+ provided
+
+
+ org.bstats
+ bstats-velocity
+ 2.2.1
+ compile
+
+
+ dev.brighten.antivpn
+ loader-utils
+ 1.9.4
+ provided
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.13.0
+
+ 17
+ 17
+ -XDignore.symbol.file
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.6.0
+
+
+
+ org.bstats
+
+ dev.brighten.antivpn.velocity.org.bstats
+
+
+ org.yaml.snakeyaml
+ dev.brighten.antivpn.shaded.org.yaml.snakeyaml
+
+
+
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
+ src/main/resources
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java b/Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java
similarity index 77%
rename from Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java
rename to Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java
index d88f731..242379b 100644
--- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java
+++ b/Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java
@@ -20,14 +20,14 @@ public class VelocityListener extends VPNExecutor {
@Override
public void registerListeners() {
VelocityPlugin.INSTANCE.getServer().getEventManager()
- .register(VelocityPlugin.INSTANCE, this);
+ .register(VelocityPlugin.INSTANCE.getPluginInstance(), this);
- VelocityPlugin.INSTANCE.getServer().getEventManager().register(VelocityPlugin.INSTANCE, DisconnectEvent.class,
+ VelocityPlugin.INSTANCE.getServer().getEventManager().register(VelocityPlugin.INSTANCE.getPluginInstance(), DisconnectEvent.class,
event -> AntiVPN.getInstance()
.getPlayerExecutor()
.unloadPlayer(event.getPlayer().getUniqueId()));
- VelocityPlugin.INSTANCE.getServer().getEventManager().register(VelocityPlugin.INSTANCE, LoginEvent.class,
+ VelocityPlugin.INSTANCE.getServer().getEventManager().register(VelocityPlugin.INSTANCE.getPluginInstance(), LoginEvent.class,
event -> {
APIPlayer player = AntiVPN.getInstance().getPlayerExecutor().getPlayer(event.getPlayer().getUniqueId())
.orElse(new OfflinePlayer(
@@ -49,7 +49,7 @@ public class VelocityListener extends VPNExecutor {
LegacyComponentSerializer.builder()
.character('&')
.build().deserialize(AntiVPN.getInstance().getVpnConfig()
- .getCountryVanillaKickReason()
+ .countryVanillaKickReason()
.replace("%player%", event.getPlayer().getUsername())
.replace("%country%", instantResult.response().getCountryName())
.replace("%code%", instantResult.response().getCountryCode()))));
@@ -59,7 +59,7 @@ public class VelocityListener extends VPNExecutor {
event.setResult(ResultedEvent.ComponentResult.denied(LegacyComponentSerializer.builder()
.character('&')
.build().deserialize(AntiVPN.getInstance().getVpnConfig()
- .getKickMessage()
+ .getKickString()
.replace("%player%", event.getPlayer().getUsername())
.replace("%country%", instantResult.response().getCountryName())
.replace("%code%", instantResult.response().getCountryCode()))));
@@ -77,12 +77,12 @@ public class VelocityListener extends VPNExecutor {
private void handleDeniedTasks(LoginEvent event, CheckResult checkResult, boolean deniedOnLogin) {
VPNResponse result = checkResult.response();
//Ensuring the user wishes to alert to staff
- if (AntiVPN.getInstance().getVpnConfig().isAlertToStaff())
+ if (AntiVPN.getInstance().getVpnConfig().alertToStaff())
AntiVPN.getInstance().getPlayerExecutor().getOnlinePlayers().stream()
.filter(APIPlayer::isAlertsEnabled)
.forEach(pl ->
pl.sendMessage(dev.brighten.antivpn.AntiVPN.getInstance().getVpnConfig()
- .getAlertMsg()
+ .alertMessage()
.replace("%player%",
event.getPlayer().getUsername())
.replace("%reason%",
@@ -92,41 +92,41 @@ public class VelocityListener extends VPNExecutor {
.replace("%city%",
result.getCity())));
- if (deniedOnLogin) return;
+ if(deniedOnLogin) return;
//In case the user wants to run their own commands instead of using the
// built in kicking
- if (AntiVPN.getInstance().getVpnConfig().isKickPlayers()) {
+ if(AntiVPN.getInstance().getVpnConfig().kickPlayersOnDetect()) {
switch (checkResult.resultType()) {
case DENIED_PROXY -> VelocityPlugin.INSTANCE.getServer().getScheduler()
- .buildTask(VelocityPlugin.INSTANCE, () ->
- event.getPlayer().disconnect(LegacyComponentSerializer.builder()
- .character('&')
- .build().deserialize(AntiVPN.getInstance().getVpnConfig()
- .getKickMessage()
- .replace("%player%", event.getPlayer().getUsername())
- .replace("%country%", result.getCountryName())
- .replace("%code%", result.getCountryCode()))))
- .delay(1, TimeUnit.SECONDS).schedule();
+ .buildTask(VelocityPlugin.INSTANCE.getPluginInstance(), () ->
+ event.getPlayer().disconnect(LegacyComponentSerializer.builder()
+ .character('&')
+ .build().deserialize(AntiVPN.getInstance().getVpnConfig()
+ .getKickString()
+ .replace("%player%", event.getPlayer().getUsername())
+ .replace("%country%", result.getCountryName())
+ .replace("%code%", result.getCountryCode()))))
+ .delay(1, TimeUnit.SECONDS).schedule();
case DENIED_COUNTRY -> VelocityPlugin.INSTANCE.getServer().getScheduler()
- .buildTask(VelocityPlugin.INSTANCE, () ->
- event.getPlayer().disconnect(LegacyComponentSerializer.builder()
- .character('&')
- .build().deserialize(AntiVPN.getInstance().getVpnConfig()
- .getCountryVanillaKickReason()
- .replace("%player%", event.getPlayer().getUsername())
- .replace("%country%", result.getCountryName())
- .replace("%code%", result.getCountryCode()))))
- .delay(1, TimeUnit.SECONDS).schedule();
+ .buildTask(VelocityPlugin.INSTANCE.getPluginInstance(), () ->
+ event.getPlayer().disconnect(LegacyComponentSerializer.builder()
+ .character('&')
+ .build().deserialize(AntiVPN.getInstance().getVpnConfig()
+ .countryVanillaKickReason()
+ .replace("%player%", event.getPlayer().getUsername())
+ .replace("%country%", result.getCountryName())
+ .replace("%code%", result.getCountryCode()))))
+ .delay(1, TimeUnit.SECONDS).schedule();
}
}
- if (!AntiVPN.getInstance().getVpnConfig().isCommandsEnabled()) return;
+ if(!AntiVPN.getInstance().getVpnConfig().runCommands()) return;
switch (checkResult.resultType()) {
case DENIED_PROXY -> {
- for (String command : AntiVPN.getInstance().getVpnConfig().getCommands()) {
+ for (String command : AntiVPN.getInstance().getVpnConfig().commands()) {
VelocityPlugin.INSTANCE.getServer().getCommandManager()
.executeAsync(VelocityPlugin.INSTANCE.getServer()
.getConsoleCommandSource(),
@@ -144,7 +144,7 @@ public class VelocityListener extends VPNExecutor {
}
}
case DENIED_COUNTRY -> {
- for (String cmd : AntiVPN.getInstance().getVpnConfig().getCountryKickCommands()) {
+ for (String cmd : AntiVPN.getInstance().getVpnConfig().countryKickCommands()) {
final String formattedCommand = StringUtil
.translateAlternateColorCodes('&',
StringUtil.varReplace(
@@ -162,12 +162,7 @@ public class VelocityListener extends VPNExecutor {
}
}
}
- }
- @Override
- public void shutdown() {
- VelocityPlugin.INSTANCE.getServer().getEventManager().unregisterListener(VelocityPlugin.INSTANCE, this);
- super.shutdown();
}
@Override
@@ -196,7 +191,7 @@ public class VelocityListener extends VPNExecutor {
@Override
public void disablePlugin() {
- VelocityPlugin.INSTANCE.getServer().getEventManager().unregisterListener(VelocityPlugin.INSTANCE, this);
+ VelocityPlugin.INSTANCE.getServer().getEventManager().unregisterListener(VelocityPlugin.INSTANCE.getPluginInstance(), this);
VelocityPlugin.INSTANCE.getServer().getCommandManager().unregister("antivpn");
}
}
diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlayer.java b/Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/VelocityPlayer.java
similarity index 100%
rename from Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlayer.java
rename to Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/VelocityPlayer.java
diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlayerExecutor.java b/Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/VelocityPlayerExecutor.java
similarity index 100%
rename from Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlayerExecutor.java
rename to Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/VelocityPlayerExecutor.java
diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java b/Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java
similarity index 53%
rename from Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java
rename to Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java
index 926b35d..29d3dc4 100644
--- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java
+++ b/Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java
@@ -1,28 +1,26 @@
package dev.brighten.antivpn.velocity;
-import com.google.inject.Inject;
-import com.velocitypowered.api.event.Subscribe;
-import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
-import com.velocitypowered.api.event.proxy.ProxyShutdownEvent;
-import com.velocitypowered.api.plugin.Plugin;
-import com.velocitypowered.api.plugin.annotation.DataDirectory;
import com.velocitypowered.api.proxy.ProxyServer;
import dev.brighten.antivpn.AntiVPN;
import dev.brighten.antivpn.command.Command;
-import dev.brighten.antivpn.database.Database;
-import dev.brighten.antivpn.database.sqllite.LiteDatabase;
+import dev.brighten.antivpn.database.VPNDatabase;
+import dev.brighten.antivpn.database.local.H2VPN;
+import dev.brighten.antivpn.database.mongo.MongoVPN;
+import dev.brighten.antivpn.database.sql.MySqlVPN;
+import dev.brighten.antivpn.loader.LoaderBootstrap;
import dev.brighten.antivpn.velocity.command.VelocityCommand;
import lombok.Getter;
import org.bstats.charts.SimplePie;
import org.bstats.velocity.Metrics;
import javax.annotation.Nullable;
+import java.io.File;
import java.nio.file.Path;
+import java.util.Map;
import java.util.logging.Logger;
@Getter
-@Plugin(id = "kaurivpn", name = "KauriVPN", version = "1.7.1", authors = {"funkemunky"})
-public class VelocityPlugin {
+public class VelocityPlugin implements LoaderBootstrap {
private final ProxyServer server;
private final Logger logger;
@@ -35,16 +33,37 @@ public class VelocityPlugin {
public static VelocityPlugin INSTANCE;
- @Inject
- public VelocityPlugin(ProxyServer server, Logger logger, @DataDirectory Path path, Metrics.Factory metricsFactory) {
- this.server = server;
- this.logger = logger;
- this.configDir = path;
- this.metricsFactory = metricsFactory;
+ private final Object pluginInstance;
+
+ public VelocityPlugin(Map, Object> objectsMap) {
+ this.server = (ProxyServer) objectsMap.get(ProxyServer.class);
+ this.logger = (Logger) objectsMap.get(Logger.class);
+ this.configDir = (Path) objectsMap.get(Path.class);
+ this.metricsFactory = (Metrics.Factory) objectsMap.get(String.class);
+ this.pluginInstance = objectsMap.get(LoaderBootstrap.class);
}
- @Subscribe
- public void onInit(ProxyInitializeEvent event) {
+ private String getDatabaseType() {
+ VPNDatabase database = AntiVPN.getInstance().getDatabase();
+
+ if(database instanceof H2VPN) {
+ return "H2";
+ } else if(database instanceof MySqlVPN) {
+ return "MySQL";
+ } else if(database instanceof MongoVPN) {
+ return "MongoDB";
+ } else {
+ return "No-Database";
+ }
+ }
+
+ @Override
+ public void onLoad(File dataFolder) {
+
+ }
+
+ @Override
+ public void onEnable() {
INSTANCE = this;
logger.info("Loading config...");
@@ -52,9 +71,10 @@ public class VelocityPlugin {
logger.info("Starting AntiVPN services...");
AntiVPN.start(new VelocityListener(), new VelocityPlayerExecutor(), configDir.toFile());
- if(AntiVPN.getInstance().getVpnConfig().isMetrics()) {
+
+ if(AntiVPN.getInstance().getVpnConfig().metrics()) {
logger.info("Starting metrics...");
- metrics = metricsFactory.make(this, 12791);
+ metrics = metricsFactory.make(pluginInstance, 12791);
metrics.addCustomChart(new SimplePie("database_used", this::getDatabaseType));
}
@@ -62,12 +82,12 @@ public class VelocityPlugin {
logger.info("Registering commands...");
for (Command command : AntiVPN.getInstance().getCommands()) {
server.getCommandManager().register(server.getCommandManager().metaBuilder(command.name())
- .aliases(command.aliases()).build(), new VelocityCommand(command));
+ .aliases(command.aliases()).build(), new VelocityCommand(command));
}
}
- @Subscribe
- public void onDisable(ProxyShutdownEvent event) {
+ @Override
+ public void onDisable() {
logger.info("Disabling AntiVPN...");
AntiVPN.getInstance().getExecutor().log("Disabling AntiVPN...");
@@ -82,12 +102,4 @@ public class VelocityPlugin {
INSTANCE = null;
logger.info("Disabled AntiVPN.");
}
-
- private String getDatabaseType() {
- Database database = AntiVPN.getInstance().getDatabase();
-
- if(database instanceof LiteDatabase) {
- return "SQLLite";
- } return "No-Database";
- }
}
diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/command/VelocityCommand.java b/Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/command/VelocityCommand.java
similarity index 100%
rename from Velocity/src/main/java/dev/brighten/antivpn/velocity/command/VelocityCommand.java
rename to Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/command/VelocityCommand.java
diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/command/VelocityCommandExecutor.java b/Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/command/VelocityCommandExecutor.java
similarity index 100%
rename from Velocity/src/main/java/dev/brighten/antivpn/velocity/command/VelocityCommandExecutor.java
rename to Velocity/VelocityPlugin/src/main/java/dev/brighten/antivpn/velocity/command/VelocityCommandExecutor.java
diff --git a/Velocity/pom.xml b/Velocity/pom.xml
index 98026cc..a88309c 100644
--- a/Velocity/pom.xml
+++ b/Velocity/pom.xml
@@ -5,8 +5,9 @@
AntiVPN
dev.brighten.antivpn
- 2.0.0-SNAPSHOT
+ 1.9.4
+ pom
4.0.0
Velocity
@@ -15,80 +16,4 @@
17
17
-
-
-
- velocity
- https://nexus.velocitypowered.com/repository/maven-public/
-
-
-
-
-
- com.velocitypowered
- velocity-api
- 3.4.0-SNAPSHOT
- provided
-
-
- dev.brighten.antivpn
- Common
- 2.0.0-SNAPSHOT
- provided
-
-
- org.bstats
- bstats-velocity
- 2.2.1
- compile
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.13.0
-
- 17
- 17
- -XDignore.symbol.file
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- 3.6.0
-
-
-
- org.bstats
-
- dev.brighten.antivpn.velocity.org.bstats
-
-
- org.yaml.snakeyaml
- dev.brighten.antivpn.shaded.org.yaml.snakeyaml
-
-
-
-
-
- package
-
- shade
-
-
-
-
-
-
-
- src/main/resources
- true
-
-
-
-
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 267fed9..f895638 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
dev.brighten.antivpn
AntiVPN
pom
- 2.0.0-SNAPSHOT
+ 1.9.4
Common
@@ -16,6 +16,10 @@
Velocity
Sponge
Universal
+ Velocity/VelocityLoader
+ Velocity/VelocityPlugin
+ Bungee/BungeeLoader
+ Bungee/BungeePlugin