diff --git a/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java b/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java index da86f7d0..e2d1f904 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/LoginProcess.java @@ -3,7 +3,10 @@ package me.totalfreedom.totalfreedommod; import io.papermc.lib.PaperLib; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import java.util.regex.Pattern; + +import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.PlayerData; @@ -58,13 +61,13 @@ public class LoginProcess extends FreedomService @EventHandler(priority = EventPriority.NORMAL) public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event) { - final String ip = event.getAddress().getHostAddress().trim(); - final boolean isAdmin = plugin.al.getEntryByIp(ip) != null; + final Admin entry = plugin.al.getEntryByUuid(event.getUniqueId()); + final boolean isAdmin = entry != null && entry.isActive(); // Check if the player is already online for (Player onlinePlayer : server.getOnlinePlayers()) { - if (!onlinePlayer.getName().equalsIgnoreCase(event.getName())) + if (!onlinePlayer.getUniqueId().equals(event.getUniqueId())) { continue; } @@ -86,7 +89,7 @@ public class LoginProcess extends FreedomService { final Player player = event.getPlayer(); final String username = player.getName(); - final String ip = event.getAddress().getHostAddress().trim(); + final UUID uuid = player.getUniqueId(); // Check username length if (username.length() < MIN_USERNAME_LENGTH || username.length() > MAX_USERNAME_LENGTH) @@ -120,7 +123,8 @@ public class LoginProcess extends FreedomService } // Validation below this point - if (plugin.al.getEntryByIp(ip) != null) // Check if player is admin + final Admin entry = plugin.al.getEntryByUuid(uuid); + if (entry != null && entry.isActive()) // Check if player is admin { // Force-allow log in event.allow(); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java b/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java index 17920853..79f699bb 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java @@ -2,11 +2,8 @@ package me.totalfreedom.totalfreedommod.admin; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; + import me.totalfreedom.totalfreedommod.LogViewer.LogsRegistrationMode; import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.rank.Rank; @@ -18,10 +15,8 @@ import org.bukkit.entity.Player; public class Admin { - - private final List ips = new ArrayList<>(); - private String name; + private UUID uuid; private boolean active = true; private Rank rank = Rank.ADMIN; private Date lastLogin = new Date(); @@ -32,7 +27,7 @@ public class Admin public Admin(Player player) { - this.name = player.getName(); + uuid = player.getUniqueId(); this.ips.add(FUtil.getIp(player)); } @@ -40,7 +35,7 @@ public class Admin { try { - this.name = resultSet.getString("username"); + this.uuid = UUID.fromString(resultSet.getString("uuid")); this.active = resultSet.getBoolean("active"); this.rank = Rank.findRank(resultSet.getString("rank")); this.ips.clear(); @@ -62,7 +57,7 @@ public class Admin { final StringBuilder output = new StringBuilder(); - output.append("Admin: ").append(name).append("\n") + output.append("Admin: ").append(getName()).append("\n") .append("- IPs: ").append(StringUtils.join(ips, ", ")).append("\n") .append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n") .append("- Rank: ").append(rank.getName()).append("\n") @@ -78,7 +73,7 @@ public class Admin { Map map = new HashMap() {{ - put("username", name); + put("uuid", uuid.toString()); put("active", active); put("rank", rank.toString()); put("ips", FUtil.listToString(ips)); @@ -120,20 +115,20 @@ public class Admin public boolean isValid() { - return name != null + return uuid != null && rank != null && !ips.isEmpty() && lastLogin != null; } - public String getName() + public UUID getUuid() { - return name; + return uuid; } - public void setName(String name) + public String getName() { - this.name = name; + return Bukkit.getOfflinePlayer(uuid).getName(); } public boolean isActive() diff --git a/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java b/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java index 8cbb49b8..ec983ffe 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java @@ -4,11 +4,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.TimeUnit; import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.config.ConfigEntry; @@ -26,6 +22,7 @@ public class AdminList extends FreedomService private final Set allAdmins = Sets.newHashSet(); // Includes disabled admins // Only active admins below private final Set activeAdmins = Sets.newHashSet(); + private final Map uuidTable = Maps.newHashMap(); private final Map nameTable = Maps.newHashMap(); private final Map ipTable = Maps.newHashMap(); @@ -66,7 +63,7 @@ public class AdminList extends FreedomService } updateTables(); - FLog.info("Loaded " + allAdmins.size() + " admins (" + nameTable.size() + " active, " + ipTable.size() + " IPs)"); + FLog.info("Loaded " + allAdmins.size() + " admins (" + uuidTable.size() + " active, " + ipTable.size() + " IPs)"); } public void messageAllAdmins(String message) @@ -154,40 +151,20 @@ public class AdminList extends FreedomService public Admin getAdmin(Player player) { - // Find admin - String ip = FUtil.getIp(player); - Admin admin = getEntryByName(player.getName()); + final String ip = FUtil.getIp(player); + final Admin entry = getEntryByUuid(player.getUniqueId()); - // Admin by name - if (admin != null) + if (entry != null && !entry.getIps().contains(ip)) { - // Check if we're in online mode, - // Or the players IP is in the admin entry - if (Bukkit.getOnlineMode() || admin.getIps().contains(ip)) - { - if (!admin.getIps().contains(ip)) - { - // Add the new IP if we have to - admin.addIp(ip); - save(admin); - updateTables(); - } - return admin; - } + entry.addIp(ip); } - // Admin by ip - admin = getEntryByIp(ip); - if (admin != null) - { - // Set the new username - String oldName = admin.getName(); - admin.setName(player.getName()); - plugin.sql.updateAdminName(oldName, admin.getName()); - updateTables(); - } + return entry; + } - return null; + public Admin getEntryByUuid(UUID uuid) + { + return uuidTable.get(uuid); } public Admin getEntryByName(String name) @@ -200,25 +177,6 @@ public class AdminList extends FreedomService return ipTable.get(ip); } - public Admin getEntryByIpFuzzy(String needleIp) - { - final Admin directAdmin = getEntryByIp(needleIp); - if (directAdmin != null) - { - return directAdmin; - } - - for (String ip : ipTable.keySet()) - { - if (FUtil.fuzzyIpMatch(needleIp, ip, 3)) - { - return ipTable.get(ip); - } - } - - return null; - } - public void updateLastLogin(Player player) { final Admin admin = getAdmin(player); @@ -228,13 +186,12 @@ public class AdminList extends FreedomService } admin.setLastLogin(new Date()); - admin.setName(player.getName()); save(admin); } public boolean isAdminImpostor(Player player) { - return getEntryByName(player.getName()) != null && !isAdmin(player) && !isVerifiedAdmin(player); + return getEntryByUuid(player.getUniqueId()) != null && !isAdmin(player) && !isVerifiedAdmin(player); } public boolean isVerifiedAdmin(Player player) @@ -297,6 +254,7 @@ public class AdminList extends FreedomService public void updateTables() { activeAdmins.clear(); + uuidTable.clear(); nameTable.clear(); ipTable.clear(); @@ -308,13 +266,13 @@ public class AdminList extends FreedomService } activeAdmins.add(admin); + uuidTable.put(admin.getUuid(), admin); nameTable.put(admin.getName().toLowerCase(), admin); for (String ip : admin.getIps()) { ipTable.put(ip, admin); } - } } @@ -332,11 +290,10 @@ public class AdminList extends FreedomService { try { - ResultSet currentSave = plugin.sql.getAdminByName(admin.getName()); + ResultSet currentSave = plugin.sql.getAdminByUuid(admin.getUuid()); for (Map.Entry entry : admin.toSQLStorable().entrySet()) { - Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue()); - if (storedValue != null && !storedValue.equals(entry.getValue()) || storedValue == null && entry.getValue() != null || entry.getValue() == null) + Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue()); if (storedValue != null && !storedValue.equals(entry.getValue()) || storedValue == null && entry.getValue() != null || entry.getValue() == null) { plugin.sql.setAdminValue(admin, entry.getKey(), entry.getValue()); } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/bridge/BukkitTelnetBridge.java b/src/main/java/me/totalfreedom/totalfreedommod/bridge/BukkitTelnetBridge.java index 479a30e1..d9e75846 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/bridge/BukkitTelnetBridge.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/bridge/BukkitTelnetBridge.java @@ -42,7 +42,7 @@ public class BukkitTelnetBridge extends FreedomService return; } - final Admin admin = plugin.al.getEntryByIpFuzzy(ip); + final Admin admin = plugin.al.getEntryByIp(ip); if (admin == null || !admin.isActive() || !admin.getRank().hasConsoleVariant()) { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java index 0a1c06dc..dace14ae 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java @@ -205,15 +205,7 @@ public class Command_saconfig extends FreedomCommand else // Existing admin { FUtil.adminAction(sender.getName(), "Re-adding " + player.getName() + " to the admin list", true); - - String oldName = admin.getName(); - if (!oldName.equals(player.getName())) - { - admin.setName(player.getName()); - plugin.sql.updateAdminName(oldName, admin.getName()); - } admin.addIp(FUtil.getIp(player)); - admin.setActive(true); admin.setLastLogin(new Date()); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/discord/PrivateMessageListener.java b/src/main/java/me/totalfreedom/totalfreedommod/discord/PrivateMessageListener.java index aee47a51..a1ffb72f 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/discord/PrivateMessageListener.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/discord/PrivateMessageListener.java @@ -24,7 +24,7 @@ public class PrivateMessageListener extends ListenerAdapter player.setDiscordID(event.getMessage().getAuthor().getId()); player.setVerification(true); - Admin admin = TotalFreedomMod.getPlugin().al.getEntryByName(name); + Admin admin = TotalFreedomMod.getPlugin().al.getEntryByUuid(player.getUuid()); if (admin != null) { Discord.syncRoles(admin, player.getDiscordID()); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java b/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java index fb710c98..eeab3f5e 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java @@ -100,7 +100,7 @@ public class PlayerList extends FreedomService public boolean isTelnetMasterBuilder(PlayerData playerData) { - Admin admin = plugin.al.getEntryByName(playerData.getName()); + Admin admin = plugin.al.getEntryByUuid(playerData.getUuid()); return admin != null && admin.getRank().isAtLeast(Rank.ADMIN) && playerData.isMasterBuilder(); } @@ -165,7 +165,7 @@ public class PlayerList extends FreedomService if (plugin.al.isAdminImpostor(player)) { - Admin admin = plugin.al.getEntryByName(player.getName()); + Admin admin = plugin.al.getEntryByUuid(player.getUniqueId()); admin.setLastLogin(new Date()); admin.addIp(FUtil.getIp(player)); plugin.al.updateTables(); @@ -185,7 +185,7 @@ public class PlayerList extends FreedomService public void syncIps(PlayerData playerData) { - Admin admin = plugin.al.getEntryByName(playerData.getName()); + Admin admin = plugin.al.getEntryByUuid(playerData.getUuid()); if (admin != null && admin.isActive()) { diff --git a/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java b/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java index 8b2fb9fb..2c61896a 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java @@ -84,7 +84,7 @@ public class SQLite extends FreedomService { try { - connection.createStatement().execute("CREATE TABLE `admins` (`username` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR, `ptero_id` VARCHAR);"); + connection.createStatement().execute("CREATE TABLE `admins` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR, `ptero_id` VARCHAR);"); } catch (SQLException e) { @@ -135,8 +135,8 @@ public class SQLite extends FreedomService { try { - Object[] data = {key, admin.getName()}; - PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET {0}=? WHERE username=''{1}''", data)); + Object[] data = {key, admin.getUuid()}; + PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET {0}=? WHERE uuid=''{1}''", data)); statement = setUnknownType(statement, 1, value); statement.executeUpdate(); @@ -164,21 +164,6 @@ public class SQLite extends FreedomService } } - public void updateAdminName(String oldName, String newName) - { - try - { - PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET username=? WHERE username=''{0}''", oldName)); - statement = setUnknownType(statement, 1, newName); - statement.executeUpdate(); - - } - catch (SQLException e) - { - FLog.severe("Failed to update admin name: " + e.getMessage()); - } - } - public PreparedStatement setUnknownType(PreparedStatement statement, int index, Object value) throws SQLException { if (value == null) @@ -235,7 +220,7 @@ public class SQLite extends FreedomService try { PreparedStatement statement = connection.prepareStatement("INSERT INTO admins VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); - statement.setString(1, admin.getName()); + statement.setString(1, admin.getUuid().toString()); statement.setString(2, FUtil.listToString(admin.getIps())); statement.setString(3, admin.getRank().toString()); statement.setBoolean(4, admin.isActive()); @@ -282,11 +267,11 @@ public class SQLite extends FreedomService } } - public ResultSet getAdminByName(String name) + public ResultSet getAdminByUuid(UUID uuid) { try { - ResultSet resultSet = connection.createStatement().executeQuery(MessageFormat.format("SELECT * FROM admins WHERE username=''{0}''", name)); + ResultSet resultSet = connection.createStatement().executeQuery(MessageFormat.format("SELECT * FROM admins WHERE uuid=''{0}''", uuid.toString())); if (resultSet.next()) { return resultSet;