From c8a64cc9cbe879d05a8d8870c6748a01433ff914 Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Mon, 4 Apr 2022 15:18:20 -0500 Subject: [PATCH 1/4] Fix NPE in unban command --- src/main/java/dev/plex/Plex.java | 12 +-- src/main/java/dev/plex/admin/AdminList.java | 52 +++++++++---- .../java/dev/plex/command/impl/UnbanCMD.java | 2 +- .../dev/plex/listener/impl/TabListener.java | 15 +++- src/main/java/dev/plex/module/PlexModule.java | 55 +++++++++----- .../plex/module/loader/CustomClassLoader.java | 34 ++++++--- .../dev/plex/module/loader/LibraryLoader.java | 76 +++++++++++++------ .../plex/punishment/PunishmentManager.java | 1 - 8 files changed, 159 insertions(+), 88 deletions(-) diff --git a/src/main/java/dev/plex/Plex.java b/src/main/java/dev/plex/Plex.java index f89f7e1..4dfb1f3 100644 --- a/src/main/java/dev/plex/Plex.java +++ b/src/main/java/dev/plex/Plex.java @@ -37,36 +37,26 @@ import org.bukkit.plugin.java.JavaPlugin; @Setter public class Plex extends JavaPlugin { + public static final BuildProperties build = new BuildProperties(); private static Plex plugin; public Config config; public Config messages; public Config indefBans; - public File modulesFolder; - private StorageType storageType = StorageType.SQLITE; - private SQLConnection sqlConnection; private MongoConnection mongoConnection; private RedisConnection redisConnection; - private MongoPlayerData mongoPlayerData; private SQLPlayerData sqlPlayerData; - private ModuleManager moduleManager; private RankManager rankManager; private ServiceManager serviceManager; - private PunishmentManager punishmentManager; - private AdminList adminList; - private UpdateChecker updateChecker; - private String system; - public static final BuildProperties build = new BuildProperties(); - public static Plex get() { return plugin; diff --git a/src/main/java/dev/plex/admin/AdminList.java b/src/main/java/dev/plex/admin/AdminList.java index a359b7c..71203ce 100644 --- a/src/main/java/dev/plex/admin/AdminList.java +++ b/src/main/java/dev/plex/admin/AdminList.java @@ -25,7 +25,8 @@ import java.util.stream.Collectors; * @see Admin */ -public class AdminList extends PlexBase { +public class AdminList extends PlexBase +{ /** * Key/Value storage, where the key is the unique ID of the admin */ @@ -36,7 +37,8 @@ public class AdminList extends PlexBase { * * @param admin The admin object */ - public void addToCache(Admin admin) { + public void addToCache(Admin admin) + { admins.put(admin.getUuid(), admin); } @@ -46,7 +48,8 @@ public class AdminList extends PlexBase { * @param uuid The unique ID of the admin * @see UUID */ - public void removeFromCache(UUID uuid) { + public void removeFromCache(UUID uuid) + { admins.remove(uuid); } @@ -55,24 +58,32 @@ public class AdminList extends PlexBase { * * @return An array list of the names of every admin */ - public List getAllAdmins() { + public List getAllAdmins() + { List admins = Lists.newArrayList(); - if (plugin.getStorageType() == StorageType.MONGODB) { + if (plugin.getStorageType() == StorageType.MONGODB) + { Datastore store = plugin.getMongoConnection().getDatastore(); Query query = store.find(PlexPlayer.class); admins.addAll(query.stream().filter(plexPlayer -> plexPlayer.getRankFromString().isAtLeast(Rank.ADMIN)).map(PlexPlayer::getName).collect(Collectors.toList())); - } else { - try (Connection con = plugin.getSqlConnection().getCon()) { + } + else + { + try (Connection con = plugin.getSqlConnection().getCon()) + { PreparedStatement statement = con.prepareStatement("SELECT * FROM `players` WHERE rank IN(?, ?, ?)"); statement.setString(1, Rank.ADMIN.name().toLowerCase()); statement.setString(2, Rank.SENIOR_ADMIN.name().toLowerCase()); statement.setString(3, Rank.EXECUTIVE.name().toLowerCase()); ResultSet set = statement.executeQuery(); - while (set.next()) { + while (set.next()) + { admins.add(set.getString("name")); } - } catch (SQLException throwables) { + } + catch (SQLException throwables) + { throwables.printStackTrace(); } } @@ -84,21 +95,27 @@ public class AdminList extends PlexBase { * * @return An array list of the names of every admin */ - public List getAllAdminPlayers() { + public List getAllAdminPlayers() + { List plexPlayers = Lists.newArrayList(); - if (plugin.getStorageType() == StorageType.MONGODB) { + if (plugin.getStorageType() == StorageType.MONGODB) + { Datastore store = plugin.getMongoConnection().getDatastore(); Query query = store.find(PlexPlayer.class); return query.stream().toList().stream().filter(player -> plugin.getRankManager().isAdmin(player)).collect(Collectors.toList()); - } else { - try (Connection con = plugin.getSqlConnection().getCon()) { + } + else + { + try (Connection con = plugin.getSqlConnection().getCon()) + { PreparedStatement statement = con.prepareStatement("SELECT * FROM `players` WHERE rank IN(?, ?, ?)"); statement.setString(1, Rank.ADMIN.name().toLowerCase()); statement.setString(2, Rank.SENIOR_ADMIN.name().toLowerCase()); statement.setString(3, Rank.EXECUTIVE.name().toLowerCase()); ResultSet set = statement.executeQuery(); - while (set.next()) { + while (set.next()) + { String uuid = set.getString("uuid"); String name = set.getString("name"); String loginMSG = set.getString("login_msg"); @@ -107,7 +124,8 @@ public class AdminList extends PlexBase { long coins = set.getLong("coins"); boolean vanished = set.getBoolean("vanished"); boolean commandspy = set.getBoolean("commandspy"); - List ips = new Gson().fromJson(set.getString("ips"), new TypeToken>() { + List ips = new Gson().fromJson(set.getString("ips"), new TypeToken>() + { }.getType()); PlexPlayer plexPlayer = new PlexPlayer(UUID.fromString(uuid)); @@ -121,7 +139,9 @@ public class AdminList extends PlexBase { plexPlayer.setCommandSpy(commandspy); plexPlayers.add(plexPlayer); } - } catch (SQLException throwables) { + } + catch (SQLException throwables) + { throwables.printStackTrace(); } } diff --git a/src/main/java/dev/plex/command/impl/UnbanCMD.java b/src/main/java/dev/plex/command/impl/UnbanCMD.java index ccd5b37..d698a61 100644 --- a/src/main/java/dev/plex/command/impl/UnbanCMD.java +++ b/src/main/java/dev/plex/command/impl/UnbanCMD.java @@ -37,7 +37,7 @@ public class UnbanCMD extends PlexCommand UUID targetUUID = PlexUtils.getFromName(args[0]); PlexPlayer plexPlayer = getOfflinePlexPlayer(targetUUID); - if (!DataUtils.hasPlayedBefore(targetUUID)) + if (targetUUID == null || !DataUtils.hasPlayedBefore(targetUUID)) { throw new PlayerNotFoundException(); } diff --git a/src/main/java/dev/plex/listener/impl/TabListener.java b/src/main/java/dev/plex/listener/impl/TabListener.java index 83f70b1..e116c81 100644 --- a/src/main/java/dev/plex/listener/impl/TabListener.java +++ b/src/main/java/dev/plex/listener/impl/TabListener.java @@ -27,7 +27,10 @@ public class TabListener extends PlexListener { PlexPlayer plexPlayer = event.getPlexPlayer(); Player player = event.getPlexPlayer().getPlayer(); - if (player == null) return; + if (player == null) + { + return; + } player.playerListName(Component.text(player.getName()).color(plugin.getRankManager().getColor(plexPlayer))); } @@ -36,7 +39,10 @@ public class TabListener extends PlexListener { PlexPlayer plexPlayer = event.getPlexPlayer(); Player player = event.getPlexPlayer().getPlayer(); - if (player == null) return; + if (player == null) + { + return; + } player.playerListName(Component.text(player.getName()).color(plugin.getRankManager().getColor(plexPlayer))); } @@ -45,7 +51,10 @@ public class TabListener extends PlexListener { PlexPlayer plexPlayer = event.getPlexPlayer(); Player player = event.getPlexPlayer().getPlayer(); - if (player == null) return; + if (player == null) + { + return; + } player.playerListName(Component.text(player.getName()).color(plugin.getRankManager().getColor(plexPlayer))); } } diff --git a/src/main/java/dev/plex/module/PlexModule.java b/src/main/java/dev/plex/module/PlexModule.java index 29b6237..d6b7ce8 100644 --- a/src/main/java/dev/plex/module/PlexModule.java +++ b/src/main/java/dev/plex/module/PlexModule.java @@ -4,6 +4,13 @@ import com.google.common.collect.Lists; import dev.plex.Plex; import dev.plex.command.PlexCommand; import dev.plex.listener.PlexListener; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.List; +import java.util.Locale; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; @@ -12,17 +19,10 @@ import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.List; -import java.util.Locale; - @Getter @Setter(AccessLevel.MODULE) -public abstract class PlexModule { +public abstract class PlexModule +{ @Getter(AccessLevel.MODULE) private final List commands = Lists.newArrayList(); @@ -34,48 +34,61 @@ public abstract class PlexModule { private File dataFolder; private Logger logger; - public void load() { + public void load() + { } - public void enable() { + public void enable() + { } - public void disable() { + public void disable() + { } - public void registerListener(PlexListener listener) { + public void registerListener(PlexListener listener) + { listeners.add(listener); } - public void unregisterListener(PlexListener listener) { + public void unregisterListener(PlexListener listener) + { listeners.remove(listener); HandlerList.unregisterAll(listener); } - public void registerCommand(PlexCommand command) { + public void registerCommand(PlexCommand command) + { commands.add(command); } - public void unregisterCommand(PlexCommand command) { + public void unregisterCommand(PlexCommand command) + { commands.remove(command); } - public PlexCommand getCommand(String name) { + public PlexCommand getCommand(String name) + { return commands.stream().filter(plexCommand -> plexCommand.getName().equalsIgnoreCase(name) || plexCommand.getAliases().stream().map(String::toLowerCase).toList().contains(name.toLowerCase(Locale.ROOT))).findFirst().orElse(null); } @Nullable - public InputStream getResource(@NotNull String filename) { - try { + public InputStream getResource(@NotNull String filename) + { + try + { URL url = this.getClass().getClassLoader().getResource(filename); - if (url == null) { + if (url == null) + { return null; } URLConnection connection = url.openConnection(); connection.setUseCaches(false); return connection.getInputStream(); - } catch (IOException ex) { + } + catch (IOException ex) + { return null; } } diff --git a/src/main/java/dev/plex/module/loader/CustomClassLoader.java b/src/main/java/dev/plex/module/loader/CustomClassLoader.java index 1fc2029..740e8fd 100644 --- a/src/main/java/dev/plex/module/loader/CustomClassLoader.java +++ b/src/main/java/dev/plex/module/loader/CustomClassLoader.java @@ -9,7 +9,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; -public class CustomClassLoader extends URLClassLoader { +public class CustomClassLoader extends URLClassLoader +{ /*public CustomClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent); for (URL url : urls) { @@ -17,25 +18,30 @@ public class CustomClassLoader extends URLClassLoader { } }*/ - public CustomClassLoader(URL jarInJar, ClassLoader parent) { + public CustomClassLoader(URL jarInJar, ClassLoader parent) + { super(new URL[]{extractJar(jarInJar)}, parent); addURL(jarInJar); } - - static URL extractJar(URL jarInJar) throws RuntimeException { + static URL extractJar(URL jarInJar) throws RuntimeException + { // get the jar-in-jar resource - if (jarInJar == null) { + if (jarInJar == null) + { throw new RuntimeException("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 { + try + { path = Files.createTempFile("plex-jarinjar", ".jar.tmp"); - } catch (IOException e) { + } + catch (IOException e) + { throw new RuntimeException("Unable to create a temporary file", e); } @@ -43,15 +49,21 @@ public class CustomClassLoader extends URLClassLoader { path.toFile().deleteOnExit(); // copy the jar-in-jar to the temporary file path - try (InputStream in = jarInJar.openStream()) { + try (InputStream in = jarInJar.openStream()) + { Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { + } + catch (IOException e) + { throw new RuntimeException("Unable to copy jar-in-jar to temporary path", e); } - try { + try + { return path.toUri().toURL(); - } catch (MalformedURLException e) { + } + catch (MalformedURLException e) + { throw new RuntimeException("Unable to get URL from path", e); } } diff --git a/src/main/java/dev/plex/module/loader/LibraryLoader.java b/src/main/java/dev/plex/module/loader/LibraryLoader.java index eb4e878..1e2066c 100644 --- a/src/main/java/dev/plex/module/loader/LibraryLoader.java +++ b/src/main/java/dev/plex/module/loader/LibraryLoader.java @@ -45,14 +45,16 @@ import org.jetbrains.annotations.Nullable; //TODO: doesn't work -public class LibraryLoader { +public class LibraryLoader +{ private final Logger logger; private final RepositorySystem repository; private final DefaultRepositorySystemSession session; private final List repositories; - public LibraryLoader(@NotNull Logger logger) { + public LibraryLoader(@NotNull Logger logger) + { this.logger = logger; DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); @@ -64,9 +66,11 @@ public class LibraryLoader { session.setChecksumPolicy(RepositoryPolicy.CHECKSUM_POLICY_FAIL); session.setLocalRepositoryManager(repository.newLocalRepositoryManager(session, new LocalRepository("libraries"))); - session.setTransferListener(new AbstractTransferListener() { + session.setTransferListener(new AbstractTransferListener() + { @Override - public void transferStarted(@NotNull TransferEvent event) throws TransferCancelledException { + public void transferStarted(@NotNull TransferEvent event) throws TransferCancelledException + { logger.log(Level.INFO, "Downloading {0}", event.getResource().getRepositoryUrl() + event.getResource().getResourceName()); } }); @@ -76,8 +80,10 @@ public class LibraryLoader { } @Nullable - public ClassLoader createLoader(@NotNull PlexModule module, @NotNull PlexModuleFile moduleFile) { - if (moduleFile.getLibraries().isEmpty()) { + public ClassLoader createLoader(@NotNull PlexModule module, @NotNull PlexModuleFile moduleFile) + { + if (moduleFile.getLibraries().isEmpty()) + { return null; } logger.log(Level.INFO, "Loading libraries for {0}", new Object[]{moduleFile.getName()}); @@ -89,7 +95,8 @@ public class LibraryLoader { List dependencies = new ArrayList<>(); List> classes = Lists.newArrayList(); List files = Lists.newArrayList(); - for (String library : moduleFile.getLibraries()) { + for (String library : moduleFile.getLibraries()) + { Artifact artifact = new DefaultArtifact(library); Dependency dependency = new Dependency(artifact, null); @@ -97,20 +104,27 @@ public class LibraryLoader { } DependencyResult result; - try { - result = repository.resolveDependencies(session, new DependencyRequest(new CollectRequest((Dependency) null, dependencies, repositories), null)); - } catch (DependencyResolutionException ex) { + try + { + result = repository.resolveDependencies(session, new DependencyRequest(new CollectRequest((Dependency)null, dependencies, repositories), null)); + } + catch (DependencyResolutionException ex) + { throw new RuntimeException("Error resolving libraries", ex); } List jarFiles = new ArrayList<>(); - for (ArtifactResult artifact : result.getArtifactResults()) { + for (ArtifactResult artifact : result.getArtifactResults()) + { File file = artifact.getArtifact().getFile(); files.add(file); URL url; - try { + try + { url = file.toURI().toURL(); - } catch (MalformedURLException ex) { + } + catch (MalformedURLException ex) + { throw new AssertionError(ex); } @@ -167,21 +181,29 @@ public class LibraryLoader { }); classes.forEach(clazz -> logger.log(Level.INFO, "Loading class {0}", new Object[]{clazz.getName()}));*/ - jarFiles.forEach(url -> { + jarFiles.forEach(url -> + { JarURLConnection connection; - try { + try + { URL url2 = new URL("jar:" + url.toString() + "!/"); /* connection = (JarURLConnection) url2.openConnection(); logger.log(Level.INFO, "Jar File: " + connection.getJarFileURL().toString());*/ - } catch (IOException e) { + } + catch (IOException e) + { e.printStackTrace(); } }); - return new URLClassLoader(files.stream().map(File::toURI).map(uri -> { - try { + return new URLClassLoader(files.stream().map(File::toURI).map(uri -> + { + try + { return uri.toURL(); - } catch (MalformedURLException e) { + } + catch (MalformedURLException e) + { e.printStackTrace(); return null; } @@ -216,21 +238,27 @@ public class LibraryLoader { }*/ - private ArrayList getClassNamesFromJar(JarFile file) throws Exception { + private ArrayList getClassNamesFromJar(JarFile file) throws Exception + { ArrayList classNames = new ArrayList<>(); - try { + try + { //Iterate through the contents of the jar file Enumeration entries = file.entries(); - while (entries.hasMoreElements()) { + while (entries.hasMoreElements()) + { JarEntry entry = entries.nextElement(); //Pick file that has the extension of .class - if ((entry.getName().endsWith(".class"))) { + if ((entry.getName().endsWith(".class"))) + { String className = entry.getName().replaceAll("/", "\\."); String myClass = className.substring(0, className.lastIndexOf('.')); classNames.add(myClass); } } - } catch (Exception e) { + } + catch (Exception e) + { throw new Exception("Error while getting class names from jar", e); } return classNames; diff --git a/src/main/java/dev/plex/punishment/PunishmentManager.java b/src/main/java/dev/plex/punishment/PunishmentManager.java index d3ffab8..a1646e9 100644 --- a/src/main/java/dev/plex/punishment/PunishmentManager.java +++ b/src/main/java/dev/plex/punishment/PunishmentManager.java @@ -12,7 +12,6 @@ import dev.plex.util.PlexLog; import dev.plex.util.PlexUtils; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.nio.charset.StandardCharsets; From 8a0c354682d5a64cd7bec26dcd07af06041ffd2a Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Mon, 4 Apr 2022 15:22:04 -0500 Subject: [PATCH 2/4] actually fix it this time --- src/main/java/dev/plex/command/impl/UnbanCMD.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/plex/command/impl/UnbanCMD.java b/src/main/java/dev/plex/command/impl/UnbanCMD.java index d698a61..ff9981c 100644 --- a/src/main/java/dev/plex/command/impl/UnbanCMD.java +++ b/src/main/java/dev/plex/command/impl/UnbanCMD.java @@ -35,7 +35,6 @@ public class UnbanCMD extends PlexCommand if (args.length == 1) { UUID targetUUID = PlexUtils.getFromName(args[0]); - PlexPlayer plexPlayer = getOfflinePlexPlayer(targetUUID); if (targetUUID == null || !DataUtils.hasPlayedBefore(targetUUID)) { @@ -47,6 +46,7 @@ public class UnbanCMD extends PlexCommand throw new PlayerNotBannedException(); } + PlexPlayer plexPlayer = getOfflinePlexPlayer(targetUUID); plugin.getPunishmentManager().unban(targetUUID); PlexUtils.broadcast(messageComponent("unbanningPlayer", sender.getName(), plexPlayer.getName())); } From 3c4eea4c3c71e0eebbb6c28bc4d809a7716116d5 Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Mon, 4 Apr 2022 18:45:09 -0500 Subject: [PATCH 3/4] Lets try something --- .github/workflows/gradle.yml | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .github/workflows/gradle.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml deleted file mode 100644 index 5cfe089..0000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Gradle - -on: [ push ] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 17 - uses: actions/setup-java@v2 - with: - distribution: temurin - java-version: 17 - cache: gradle - - name: Build with Gradle - run: chmod a+x gradlew && ./gradlew build --no-daemon \ No newline at end of file From 56db357743a40fc30b9c0ea4358c1cf46ef08255 Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Mon, 4 Apr 2022 18:48:21 -0500 Subject: [PATCH 4/4] Revert "Lets try something" This reverts commit 3c4eea4c3c71e0eebbb6c28bc4d809a7716116d5. --- .github/workflows/gradle.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/gradle.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000..5cfe089 --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,18 @@ +name: Gradle + +on: [ push ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 17 + uses: actions/setup-java@v2 + with: + distribution: temurin + java-version: 17 + cache: gradle + - name: Build with Gradle + run: chmod a+x gradlew && ./gradlew build --no-daemon \ No newline at end of file