From b9bddaad29db0b9b417df1c85de2e7d32525b9cc Mon Sep 17 00:00:00 2001 From: Steven Van Ingelgem Date: Wed, 12 Mar 2025 20:12:44 +0100 Subject: [PATCH 1/2] Fix NPE when banning/unbanning person that isn't known in the minecraft universe --- .../bukkit/listener/InternalListener.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/bukkit/src/main/java/me/leoko/advancedban/bukkit/listener/InternalListener.java b/bukkit/src/main/java/me/leoko/advancedban/bukkit/listener/InternalListener.java index 20722c50..f9aebfad 100644 --- a/bukkit/src/main/java/me/leoko/advancedban/bukkit/listener/InternalListener.java +++ b/bukkit/src/main/java/me/leoko/advancedban/bukkit/listener/InternalListener.java @@ -15,28 +15,44 @@ * @author Beelzebu */ public class InternalListener implements Listener { - + + private void ban(BanList banlist, PunishmentEvent e) { + try { + banlist.addBan(e.getPunishment().getName(), e.getPunishment().getReason(), new Date(e.getPunishment().getEnd()), e.getPunishment().getOperator()); + } catch (NullPointerException ex) { + Bukkit.getLogger().severe("No player is known by the name '" + e.getPunishment().getName() + "'"); + } + } + @EventHandler public void onPunish(PunishmentEvent e) { BanList banlist; if (e.getPunishment().getType().equals(PunishmentType.BAN) || e.getPunishment().getType().equals(PunishmentType.TEMP_BAN)) { banlist = Bukkit.getBanList(BanList.Type.NAME); - banlist.addBan(e.getPunishment().getName(), e.getPunishment().getReason(), new Date(e.getPunishment().getEnd()), e.getPunishment().getOperator()); + ban(banlist, e); } else if (e.getPunishment().getType().equals(PunishmentType.IP_BAN) || e.getPunishment().getType().equals(PunishmentType.TEMP_IP_BAN)) { banlist = Bukkit.getBanList(BanList.Type.IP); - banlist.addBan(e.getPunishment().getName(), e.getPunishment().getReason(), new Date(e.getPunishment().getEnd()), e.getPunishment().getOperator()); + ban(banlist, e); } } - + + private void pardon(BanList banlist, RevokePunishmentEvent e) { + try { + banlist.pardon(e.getPunishment().getName()); + } catch (NullPointerException ex) { + Bukkit.getLogger().severe("No player is known by the name '" + e.getPunishment().getName() + "'"); + } + } + @EventHandler public void onRevokePunishment(RevokePunishmentEvent e) { BanList banlist; if (e.getPunishment().getType().equals(PunishmentType.BAN) || e.getPunishment().getType().equals(PunishmentType.TEMP_BAN)) { banlist = Bukkit.getBanList(BanList.Type.NAME); - banlist.pardon(e.getPunishment().getName()); + pardon(banlist, e); } else if (e.getPunishment().getType().equals(PunishmentType.IP_BAN) || e.getPunishment().getType().equals(PunishmentType.TEMP_IP_BAN)) { banlist = Bukkit.getBanList(BanList.Type.IP); - banlist.pardon(e.getPunishment().getName()); + pardon(banlist, e); } } } \ No newline at end of file From e58d0bc2fdb58f4413268641603af5ba476fb989 Mon Sep 17 00:00:00 2001 From: Steven Van Ingelgem Date: Wed, 30 Apr 2025 12:20:58 +0200 Subject: [PATCH 2/2] First checking if a user by that name exists. --- .../bukkit/listener/InternalListener.java | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/bukkit/src/main/java/me/leoko/advancedban/bukkit/listener/InternalListener.java b/bukkit/src/main/java/me/leoko/advancedban/bukkit/listener/InternalListener.java index f9aebfad..613a8e7b 100644 --- a/bukkit/src/main/java/me/leoko/advancedban/bukkit/listener/InternalListener.java +++ b/bukkit/src/main/java/me/leoko/advancedban/bukkit/listener/InternalListener.java @@ -5,6 +5,7 @@ import me.leoko.advancedban.utils.PunishmentType; import org.bukkit.BanList; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -16,12 +17,27 @@ */ public class InternalListener implements Listener { + private boolean canSafelyBan(String playerName) { + boolean userKnown = false; + if (playerName != null) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerName); + userKnown = offlinePlayer.hasPlayedBefore() || offlinePlayer.isOnline(); + } + + if (!userKnown) { + Bukkit.getLogger().warning("Cannot ban " + playerName + ": player has never joined and GameProfile may be null"); + } + + return userKnown; + } + private void ban(BanList banlist, PunishmentEvent e) { - try { - banlist.addBan(e.getPunishment().getName(), e.getPunishment().getReason(), new Date(e.getPunishment().getEnd()), e.getPunishment().getOperator()); - } catch (NullPointerException ex) { - Bukkit.getLogger().severe("No player is known by the name '" + e.getPunishment().getName() + "'"); + String playerName = e.getPunishment().getName(); + if ( !canSafelyBan(playerName)) { + return; } + + banlist.addBan(playerName, e.getPunishment().getReason(), new Date(e.getPunishment().getEnd()), e.getPunishment().getOperator()); } @EventHandler @@ -37,11 +53,12 @@ public void onPunish(PunishmentEvent e) { } private void pardon(BanList banlist, RevokePunishmentEvent e) { - try { - banlist.pardon(e.getPunishment().getName()); - } catch (NullPointerException ex) { - Bukkit.getLogger().severe("No player is known by the name '" + e.getPunishment().getName() + "'"); + String playerName = e.getPunishment().getName(); + if ( !canSafelyBan(playerName)) { + return; } + + banlist.pardon(playerName); } @EventHandler