From 45a2a63795a1ae965721090670fe95dc3a887332 Mon Sep 17 00:00:00 2001 From: Rhys B Date: Tue, 30 Sep 2025 11:11:37 +1000 Subject: [PATCH 1/2] Switch authentication storage to UUIDs --- .../java/uk/org/whoami/authme/AuthMe.java | 14 ++- .../whoami/authme/cache/auth/PlayerAuth.java | 30 +++-- .../whoami/authme/cache/auth/PlayerCache.java | 18 +-- .../whoami/authme/cache/limbo/LimboCache.java | 15 +-- .../authme/cache/limbo/LimboPlayer.java | 8 +- .../whoami/authme/commands/AdminCommand.java | 26 ++-- .../commands/ChangePasswordCommand.java | 8 +- .../whoami/authme/commands/LoginCommand.java | 20 ++-- .../whoami/authme/commands/LogoutCommand.java | 20 ++-- .../authme/commands/RegisterCommand.java | 11 +- .../authme/commands/UnregisterCommand.java | 15 +-- .../authme/datasource/CacheDataSource.java | 41 ++++--- .../whoami/authme/datasource/DataSource.java | 6 +- .../authme/datasource/FileDataSource.java | 111 ++++++++++++------ .../authme/datasource/MySQLDataSource.java | 76 ++++++++---- .../authme/listener/AuthMeBlockListener.java | 12 +- .../whoami/authme/listener/AuthMeChat.java | 2 +- .../authme/listener/AuthMeCustomListener.java | 20 ++-- .../authme/listener/AuthMeEntityListener.java | 12 +- .../authme/listener/AuthMePlayerListener.java | 86 ++++++++------ .../org/whoami/authme/settings/Settings.java | 22 +++- .../org/whoami/authme/task/MessageTask.java | 16 +-- .../org/whoami/authme/task/TimeoutTask.java | 24 ++-- 23 files changed, 375 insertions(+), 238 deletions(-) diff --git a/src/main/java/uk/org/whoami/authme/AuthMe.java b/src/main/java/uk/org/whoami/authme/AuthMe.java index 5089dff..832bd93 100644 --- a/src/main/java/uk/org/whoami/authme/AuthMe.java +++ b/src/main/java/uk/org/whoami/authme/AuthMe.java @@ -193,15 +193,17 @@ public DataSource getAuthDatabase() { private void onReload(Player[] players) { for (Player player : players) { + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); String ip = player.getAddress().getAddress().getHostAddress(); - boolean authAvail = database.isAuthAvailable(name); + boolean authAvail = database.isAuthAvailable(uuid); if (authAvail) { if (settings.isSessionsEnabled()) { - PlayerAuth auth = database.getAuth(name); - if (auth.getNickname().equals(name) && auth.getIp().equals(ip)) { + PlayerAuth auth = database.getAuth(uuid); + if (auth != null && auth.getUuid().equals(uuid) && auth.getIp().equals(ip)) { + auth.setUsername(name); PlayerCache.getInstance().addPlayer(auth); player.sendMessage(m._("valid_session")); break; @@ -227,10 +229,10 @@ private void onReload(Player[] players) { int msgInterval = settings.getWarnMessageInterval(); BukkitScheduler sched = this.getServer().getScheduler(); if (time != 0) { - int id = sched.scheduleSyncDelayedTask(this, new TimeoutTask(this, name), time); - LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id); + int id = sched.scheduleSyncDelayedTask(this, new TimeoutTask(this, uuid), time); + LimboCache.getInstance().getLimboPlayer(uuid).setTimeoutTaskId(id); } - sched.scheduleSyncDelayedTask(this, new MessageTask(this, name, msg, msgInterval)); + sched.scheduleSyncDelayedTask(this, new MessageTask(this, uuid, msg, msgInterval)); } } diff --git a/src/main/java/uk/org/whoami/authme/cache/auth/PlayerAuth.java b/src/main/java/uk/org/whoami/authme/cache/auth/PlayerAuth.java index 9e29411..b2f7b80 100644 --- a/src/main/java/uk/org/whoami/authme/cache/auth/PlayerAuth.java +++ b/src/main/java/uk/org/whoami/authme/cache/auth/PlayerAuth.java @@ -18,24 +18,34 @@ public class PlayerAuth { - private String nickname; + private final String uuid; + private String username; private String hash; private String ip; private long lastLogin; - public PlayerAuth(String nickname, String hash, String ip, long lastLogin) { - this.nickname = nickname; + public PlayerAuth(String uuid, String username, String hash, String ip, long lastLogin) { + this.uuid = uuid; + this.username = username; this.hash = hash; this.ip = ip; this.lastLogin = lastLogin; } - public String getIp() { - return ip; + public String getUuid() { + return uuid; } - public String getNickname() { - return nickname; + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getIp() { + return ip; } public String getHash() { @@ -64,14 +74,14 @@ public boolean equals(Object obj) { return false; } PlayerAuth other = (PlayerAuth) obj; - - return other.getIp().equals(this.ip) && other.getNickname().equals(this.nickname); + + return other.getIp().equals(this.ip) && other.getUuid().equals(this.uuid); } @Override public int hashCode() { int hashCode = 7; - hashCode = 71 * hashCode + (this.nickname != null ? this.nickname.hashCode() : 0); + hashCode = 71 * hashCode + (this.uuid != null ? this.uuid.hashCode() : 0); hashCode = 71 * hashCode + (this.ip != null ? this.ip.hashCode() : 0); return hashCode; } diff --git a/src/main/java/uk/org/whoami/authme/cache/auth/PlayerCache.java b/src/main/java/uk/org/whoami/authme/cache/auth/PlayerCache.java index 505fdad..6ba9786 100644 --- a/src/main/java/uk/org/whoami/authme/cache/auth/PlayerCache.java +++ b/src/main/java/uk/org/whoami/authme/cache/auth/PlayerCache.java @@ -28,24 +28,24 @@ private PlayerCache() { } public void addPlayer(PlayerAuth auth) { - cache.put(auth.getNickname(), auth); + cache.put(auth.getUuid(), auth); } public void updatePlayer(PlayerAuth auth) { - cache.remove(auth.getNickname()); - cache.put(auth.getNickname(), auth); + cache.remove(auth.getUuid()); + cache.put(auth.getUuid(), auth); } - public void removePlayer(String user) { - cache.remove(user); + public void removePlayer(String uuid) { + cache.remove(uuid); } - public boolean isAuthenticated(String user) { - return cache.containsKey(user); + public boolean isAuthenticated(String uuid) { + return cache.containsKey(uuid); } - public PlayerAuth getAuth(String user) { - return cache.get(user); + public PlayerAuth getAuth(String uuid) { + return cache.get(uuid); } public static PlayerCache getInstance() { diff --git a/src/main/java/uk/org/whoami/authme/cache/limbo/LimboCache.java b/src/main/java/uk/org/whoami/authme/cache/limbo/LimboCache.java index 0de4c61..c8f8388 100644 --- a/src/main/java/uk/org/whoami/authme/cache/limbo/LimboCache.java +++ b/src/main/java/uk/org/whoami/authme/cache/limbo/LimboCache.java @@ -32,25 +32,26 @@ private LimboCache() { } public void addLimboPlayer(Player player) { + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); Location loc = player.getLocation(); ItemStack[] inv = player.getInventory().getContents(); ItemStack[] arm = player.getInventory().getArmorContents(); //int gameMode = player.getGameMode().getValue(); - cache.put(player.getName().toLowerCase(), new LimboPlayer(name, loc, inv, arm)); + cache.put(uuid, new LimboPlayer(uuid, name, loc, inv, arm)); } - public void deleteLimboPlayer(String name) { - cache.remove(name); + public void deleteLimboPlayer(String uuid) { + cache.remove(uuid); } - public LimboPlayer getLimboPlayer(String name) { - return cache.get(name); + public LimboPlayer getLimboPlayer(String uuid) { + return cache.get(uuid); } - public boolean hasLimboPlayer(String name) { - return cache.containsKey(name); + public boolean hasLimboPlayer(String uuid) { + return cache.containsKey(uuid); } public static LimboCache getInstance() { diff --git a/src/main/java/uk/org/whoami/authme/cache/limbo/LimboPlayer.java b/src/main/java/uk/org/whoami/authme/cache/limbo/LimboPlayer.java index 13df5c4..8f6fdc2 100644 --- a/src/main/java/uk/org/whoami/authme/cache/limbo/LimboPlayer.java +++ b/src/main/java/uk/org/whoami/authme/cache/limbo/LimboPlayer.java @@ -21,6 +21,7 @@ public class LimboPlayer { + private final String uuid; private String name; private ItemStack[] inventory; private ItemStack[] armour; @@ -28,7 +29,8 @@ public class LimboPlayer { private int timeoutTaskId = -1; private int gameMode = 0; - public LimboPlayer(String name, Location loc, ItemStack[] inventory, ItemStack[] armour) { + public LimboPlayer(String uuid, String name, Location loc, ItemStack[] inventory, ItemStack[] armour) { + this.uuid = uuid; this.name = name; this.loc = loc; this.inventory = inventory; @@ -36,6 +38,10 @@ public LimboPlayer(String name, Location loc, ItemStack[] inventory, ItemStack[] this.gameMode = gameMode; } + public String getUuid() { + return uuid; + } + public String getName() { return name; } diff --git a/src/main/java/uk/org/whoami/authme/commands/AdminCommand.java b/src/main/java/uk/org/whoami/authme/commands/AdminCommand.java index 6377af6..d9dd4a4 100644 --- a/src/main/java/uk/org/whoami/authme/commands/AdminCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/AdminCommand.java @@ -16,8 +16,10 @@ package uk.org.whoami.authme.commands; +import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.util.Date; +import java.util.UUID; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -93,14 +95,15 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin try { String name = args[1].toLowerCase(); + String uuid = getOfflineUuid(args[1]); String hash = PasswordSecurity.getHash(settings.getPasswordHash(), args[2]); - if (database.isAuthAvailable(name)) { + if (database.isAuthAvailable(uuid)) { sender.sendMessage(m._("user_regged")); return true; } - PlayerAuth auth = new PlayerAuth(name, hash, "198.18.0.1", 0); + PlayerAuth auth = new PlayerAuth(uuid, name, hash, "198.18.0.1", 0); if (!database.saveAuth(auth)) { sender.sendMessage(m._("error")); return true; @@ -119,18 +122,20 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin try { String name = args[1].toLowerCase(); + String uuid = getOfflineUuid(args[1]); String hash = PasswordSecurity.getHash(settings.getPasswordHash(), args[2]); PlayerAuth auth = null; - if (PlayerCache.getInstance().isAuthenticated(name)) { - auth = PlayerCache.getInstance().getAuth(name); - } else if (database.isAuthAvailable(name)) { - auth = database.getAuth(name); + if (PlayerCache.getInstance().isAuthenticated(uuid)) { + auth = PlayerCache.getInstance().getAuth(uuid); + } else if (database.isAuthAvailable(uuid)) { + auth = database.getAuth(uuid); } else { sender.sendMessage(m._("unknown_user")); return true; } auth.setHash(hash); + auth.setUsername(name); if (!database.updatePassword(auth)) { sender.sendMessage(m._("error")); @@ -150,13 +155,14 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin } String name = args[1].toLowerCase(); + String uuid = getOfflineUuid(args[1]); - if (!database.removeAuth(name)) { + if (!database.removeAuth(uuid)) { sender.sendMessage(m._("error")); return true; } - PlayerCache.getInstance().removePlayer(name); + PlayerCache.getInstance().removePlayer(uuid); sender.sendMessage("unregistered"); ConsoleLogger.info(args[1] + " unregistered"); @@ -164,5 +170,9 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin sender.sendMessage("Usage: /authme reload|register playername password|changepassword playername password|unregister playername"); } return true; +} + + private String getOfflineUuid(String playerName) { + return UUID.nameUUIDFromBytes(("OfflinePlayer:" + playerName).getBytes(StandardCharsets.UTF_8)).toString(); } } diff --git a/src/main/java/uk/org/whoami/authme/commands/ChangePasswordCommand.java b/src/main/java/uk/org/whoami/authme/commands/ChangePasswordCommand.java index 935ef36..a967509 100644 --- a/src/main/java/uk/org/whoami/authme/commands/ChangePasswordCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/ChangePasswordCommand.java @@ -53,10 +53,11 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin } Player player = (Player) sender; + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); String ip = player.getAddress().getAddress().getHostAddress(); - if (!PlayerCache.getInstance().isAuthenticated(name)) { + if (!PlayerCache.getInstance().isAuthenticated(uuid)) { player.sendMessage(m._("not_logged_in")); return true; } @@ -69,9 +70,10 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin try { String hashnew = PasswordSecurity.getHash(settings.getPasswordHash(), args[1]); - if (PasswordSecurity.comparePasswordWithHash(args[0], PlayerCache.getInstance().getAuth(name).getHash())) { - PlayerAuth auth = PlayerCache.getInstance().getAuth(name); + if (PasswordSecurity.comparePasswordWithHash(args[0], PlayerCache.getInstance().getAuth(uuid).getHash())) { + PlayerAuth auth = PlayerCache.getInstance().getAuth(uuid); auth.setHash(hashnew); + auth.setUsername(name); if (!database.updatePassword(auth)) { player.sendMessage(m._("error")); return true; diff --git a/src/main/java/uk/org/whoami/authme/commands/LoginCommand.java b/src/main/java/uk/org/whoami/authme/commands/LoginCommand.java index f1b509a..6086a83 100644 --- a/src/main/java/uk/org/whoami/authme/commands/LoginCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/LoginCommand.java @@ -62,6 +62,7 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin } Player player = (Player) sender; + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); String ip = player.getAddress().getAddress().getHostAddress(); @@ -76,7 +77,7 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin } - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { player.sendMessage(m._("logged_in")); return true; } @@ -86,12 +87,17 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin return true; } - if (!database.isAuthAvailable(player.getName().toLowerCase())) { + if (!database.isAuthAvailable(uuid)) { player.sendMessage(m._("user_unknown")); return true; } - - String hash = database.getAuth(name).getHash(); + + PlayerAuth authData = database.getAuth(uuid); + if (authData == null) { + player.sendMessage(m._("user_unknown")); + return true; + } + String hash = authData.getHash(); try { if (PasswordSecurity.comparePasswordWithHash(args[0], hash)) { @@ -102,10 +108,10 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin return true; } //Login Event End - PlayerAuth auth = new PlayerAuth(name, hash, ip, new Date().getTime()); + PlayerAuth auth = new PlayerAuth(uuid, name, hash, ip, new Date().getTime()); database.updateSession(auth); PlayerCache.getInstance().addPlayer(auth); - LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); + LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(uuid); if (limbo != null) { player.getInventory().setContents(limbo.getInventory()); player.getInventory().setArmorContents(limbo.getArmour()); @@ -113,7 +119,7 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin player.teleport(limbo.getLoc()); } sender.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId()); - LimboCache.getInstance().deleteLimboPlayer(name); + LimboCache.getInstance().deleteLimboPlayer(uuid); } player.sendMessage(m._("login")); ConsoleLogger.info(player.getDisplayName() + " logged in!"); diff --git a/src/main/java/uk/org/whoami/authme/commands/LogoutCommand.java b/src/main/java/uk/org/whoami/authme/commands/LogoutCommand.java index 9bf9a9b..9eec404 100644 --- a/src/main/java/uk/org/whoami/authme/commands/LogoutCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/LogoutCommand.java @@ -58,19 +58,23 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin } Player player = (Player) sender; + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); - if (!PlayerCache.getInstance().isAuthenticated(name)) { + if (!PlayerCache.getInstance().isAuthenticated(uuid)) { player.sendMessage(m._("not_logged_in")); return true; } //clear session - PlayerAuth auth = PlayerCache.getInstance().getAuth(name); - auth.setIp("198.18.0.1"); - database.updateSession(auth); + PlayerAuth auth = PlayerCache.getInstance().getAuth(uuid); + if (auth != null) { + auth.setUsername(name); + auth.setIp("198.18.0.1"); + database.updateSession(auth); + } - PlayerCache.getInstance().removePlayer(name); + PlayerCache.getInstance().removePlayer(uuid); LimboCache.getInstance().addLimboPlayer(player); player.getInventory().setArmorContents(new ItemStack[0]); @@ -83,10 +87,10 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin int interval = settings.getWarnMessageInterval(); BukkitScheduler sched = sender.getServer().getScheduler(); if (delay != 0) { - int id = sched.scheduleSyncDelayedTask(plugin, new TimeoutTask(plugin, name), delay); - LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id); + int id = sched.scheduleSyncDelayedTask(plugin, new TimeoutTask(plugin, uuid), delay); + LimboCache.getInstance().getLimboPlayer(uuid).setTimeoutTaskId(id); } - sched.scheduleSyncDelayedTask(plugin, new MessageTask(plugin, name, m._("login_msg"), interval)); + sched.scheduleSyncDelayedTask(plugin, new MessageTask(plugin, uuid, m._("login_msg"), interval)); player.sendMessage(m._("logout")); ConsoleLogger.info(player.getDisplayName() + " logged out"); diff --git a/src/main/java/uk/org/whoami/authme/commands/RegisterCommand.java b/src/main/java/uk/org/whoami/authme/commands/RegisterCommand.java index cd90f98..ec091b6 100644 --- a/src/main/java/uk/org/whoami/authme/commands/RegisterCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/RegisterCommand.java @@ -61,10 +61,11 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin } Player player = (Player) sender; + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); String ip = player.getAddress().getAddress().getHostAddress(); - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { player.sendMessage(m._("logged_in")); return true; } @@ -79,7 +80,7 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin return true; } - if (database.isAuthAvailable(player.getName().toLowerCase())) { + if (database.isAuthAvailable(uuid)) { player.sendMessage(m._("user_regged")); return true; } @@ -95,14 +96,14 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin try { String hash = PasswordSecurity.getHash(settings.getPasswordHash(), args[0]); - PlayerAuth auth = new PlayerAuth(name, hash, ip, new Date().getTime()); + PlayerAuth auth = new PlayerAuth(uuid, name, hash, ip, new Date().getTime()); if (!database.saveAuth(auth)) { player.sendMessage(m._("error")); return true; } PlayerCache.getInstance().addPlayer(auth); - LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); + LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(uuid); if (limbo != null) { player.getInventory().setContents(limbo.getInventory()); player.getInventory().setArmorContents(limbo.getArmour()); @@ -111,7 +112,7 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin } sender.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId()); - LimboCache.getInstance().deleteLimboPlayer(name); + LimboCache.getInstance().deleteLimboPlayer(uuid); } player.sendMessage(m._("registered")); diff --git a/src/main/java/uk/org/whoami/authme/commands/UnregisterCommand.java b/src/main/java/uk/org/whoami/authme/commands/UnregisterCommand.java index bcc49cf..0de8bb3 100644 --- a/src/main/java/uk/org/whoami/authme/commands/UnregisterCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/UnregisterCommand.java @@ -60,9 +60,10 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin } Player player = (Player) sender; + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); - if (!PlayerCache.getInstance().isAuthenticated(name)) { + if (!PlayerCache.getInstance().isAuthenticated(uuid)) { player.sendMessage(m._("not_logged_in")); return true; } @@ -76,7 +77,7 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin //Check if their password is correct try { //If password is incorrect prevent change - if (!PasswordSecurity.comparePasswordWithHash(args[0], PlayerCache.getInstance().getAuth(name).getHash())) { + if (!PasswordSecurity.comparePasswordWithHash(args[0], PlayerCache.getInstance().getAuth(uuid).getHash())) { player.sendMessage(m._("wrong_pwd")); return true; } @@ -90,11 +91,11 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin ConsoleLogger.info(player.getName() + " Has authenticated an unregister using Beta Evolutions"); } - if (!database.removeAuth(name)) { + if (!database.removeAuth(uuid)) { player.sendMessage("error"); return true; } - PlayerCache.getInstance().removePlayer(player.getName().toLowerCase()); + PlayerCache.getInstance().removePlayer(uuid); LimboCache.getInstance().addLimboPlayer(player); player.getInventory().setArmorContents(new ItemStack[0]); player.getInventory().setContents(new ItemStack[36]); @@ -103,10 +104,10 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin int interval = settings.getWarnMessageInterval(); BukkitScheduler sched = sender.getServer().getScheduler(); if (delay != 0) { - int id = sched.scheduleSyncDelayedTask(plugin, new TimeoutTask(plugin, name), delay); - LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id); + int id = sched.scheduleSyncDelayedTask(plugin, new TimeoutTask(plugin, uuid), delay); + LimboCache.getInstance().getLimboPlayer(uuid).setTimeoutTaskId(id); } - sched.scheduleSyncDelayedTask(plugin, new MessageTask(plugin, name, m._("reg_msg"), interval)); + sched.scheduleSyncDelayedTask(plugin, new MessageTask(plugin, uuid, m._("reg_msg"), interval)); player.sendMessage("unregistered"); ConsoleLogger.info(player.getDisplayName() + " unregistered himself"); diff --git a/src/main/java/uk/org/whoami/authme/datasource/CacheDataSource.java b/src/main/java/uk/org/whoami/authme/datasource/CacheDataSource.java index add1166..dbc043d 100644 --- a/src/main/java/uk/org/whoami/authme/datasource/CacheDataSource.java +++ b/src/main/java/uk/org/whoami/authme/datasource/CacheDataSource.java @@ -30,17 +30,19 @@ public CacheDataSource(DataSource source) { } @Override - public synchronized boolean isAuthAvailable(String user) { - return cache.containsKey(user) ? true : source.isAuthAvailable(user); + public synchronized boolean isAuthAvailable(String uuid) { + return cache.containsKey(uuid) ? true : source.isAuthAvailable(uuid); } @Override - public synchronized PlayerAuth getAuth(String user) { - if(cache.containsKey(user)) { - return cache.get(user); + public synchronized PlayerAuth getAuth(String uuid) { + if (cache.containsKey(uuid)) { + return cache.get(uuid); } else { - PlayerAuth auth = source.getAuth(user); - cache.put(user, auth); + PlayerAuth auth = source.getAuth(uuid); + if (auth != null) { + cache.put(uuid, auth); + } return auth; } } @@ -48,7 +50,7 @@ public synchronized PlayerAuth getAuth(String user) { @Override public synchronized boolean saveAuth(PlayerAuth auth) { if (source.saveAuth(auth)) { - cache.put(auth.getNickname(), auth); + cache.put(auth.getUuid(), auth); return true; } return false; @@ -57,7 +59,7 @@ public synchronized boolean saveAuth(PlayerAuth auth) { @Override public synchronized boolean updatePassword(PlayerAuth auth) { if (source.updatePassword(auth)) { - cache.get(auth.getNickname()).setHash(auth.getHash()); + cache.get(auth.getUuid()).setHash(auth.getHash()); return true; } return false; @@ -66,8 +68,12 @@ public synchronized boolean updatePassword(PlayerAuth auth) { @Override public boolean updateSession(PlayerAuth auth) { if (source.updateSession(auth)) { - cache.get(auth.getNickname()).setIp(auth.getIp()); - cache.get(auth.getNickname()).setLastLogin(auth.getLastLogin()); + PlayerAuth cached = cache.get(auth.getUuid()); + if (cached != null) { + cached.setUsername(auth.getUsername()); + cached.setIp(auth.getIp()); + cached.setLastLogin(auth.getLastLogin()); + } return true; } return false; @@ -78,9 +84,10 @@ public int purgeDatabase(long until) { int cleared = source.purgeDatabase(until); if (cleared > 0) { - for (PlayerAuth auth : cache.values()) { - if(auth.getLastLogin() < until) { - cache.remove(auth.getNickname()); + HashMap copy = new HashMap(cache); + for (PlayerAuth auth : copy.values()) { + if (auth.getLastLogin() < until) { + cache.remove(auth.getUuid()); } } } @@ -88,9 +95,9 @@ public int purgeDatabase(long until) { } @Override - public synchronized boolean removeAuth(String user) { - if (source.removeAuth(user)) { - cache.remove(user); + public synchronized boolean removeAuth(String uuid) { + if (source.removeAuth(uuid)) { + cache.remove(uuid); return true; } return false; diff --git a/src/main/java/uk/org/whoami/authme/datasource/DataSource.java b/src/main/java/uk/org/whoami/authme/datasource/DataSource.java index 8717bea..02f3a4a 100644 --- a/src/main/java/uk/org/whoami/authme/datasource/DataSource.java +++ b/src/main/java/uk/org/whoami/authme/datasource/DataSource.java @@ -25,9 +25,9 @@ public enum DataSourceType { MYSQL, FILE } - boolean isAuthAvailable(String user); + boolean isAuthAvailable(String uuid); - PlayerAuth getAuth(String user); + PlayerAuth getAuth(String uuid); boolean saveAuth(PlayerAuth auth); @@ -37,7 +37,7 @@ public enum DataSourceType { int purgeDatabase(long until); - boolean removeAuth(String user); + boolean removeAuth(String uuid); void close(); diff --git a/src/main/java/uk/org/whoami/authme/datasource/FileDataSource.java b/src/main/java/uk/org/whoami/authme/datasource/FileDataSource.java index 4308671..53fef18 100644 --- a/src/main/java/uk/org/whoami/authme/datasource/FileDataSource.java +++ b/src/main/java/uk/org/whoami/authme/datasource/FileDataSource.java @@ -33,11 +33,7 @@ public class FileDataSource implements DataSource { /* file layout: * - * PLAYERNAME:HASHSUM:IP:LOGININMILLIESECONDS - * - * Old but compatible: - * PLAYERNAME:HASHSUM:IP - * PLAYERNAME:HASHSUM + * UUID:USERNAME:HASHSUM:IP:LOGININMILLIESECONDS * */ private File source; @@ -48,14 +44,14 @@ public FileDataSource() throws IOException { } @Override - public synchronized boolean isAuthAvailable(String user) { + public synchronized boolean isAuthAvailable(String uuid) { BufferedReader br = null; try { br = new BufferedReader(new FileReader(source)); String line; while ((line = br.readLine()) != null) { String[] args = line.split(":"); - if (args.length > 1 && args[0].equals(user)) { + if (args.length > 0 && args[0].equals(uuid)) { return true; } } @@ -78,14 +74,14 @@ public synchronized boolean isAuthAvailable(String user) { @Override public synchronized boolean saveAuth(PlayerAuth auth) { - if (isAuthAvailable(auth.getNickname())) { + if (isAuthAvailable(auth.getUuid())) { return false; } BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(source, true)); - bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + "\n"); + bw.write(formatAuth(auth) + "\n"); } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return false; @@ -102,11 +98,11 @@ public synchronized boolean saveAuth(PlayerAuth auth) { @Override public synchronized boolean updatePassword(PlayerAuth auth) { - if (!isAuthAvailable(auth.getNickname())) { + if (!isAuthAvailable(auth.getUuid())) { return false; } - PlayerAuth newAuth = null; + PlayerAuth currentAuth = null; BufferedReader br = null; try { @@ -114,8 +110,8 @@ public synchronized boolean updatePassword(PlayerAuth auth) { String line = ""; while ((line = br.readLine()) != null) { String[] args = line.split(":"); - if (args[0].equals(auth.getNickname())) { - newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3])); + if (args.length > 0 && args[0].equals(auth.getUuid())) { + currentAuth = parseAuth(args); break; } } @@ -133,18 +129,24 @@ public synchronized boolean updatePassword(PlayerAuth auth) { } } } - removeAuth(auth.getNickname()); - saveAuth(newAuth); + + if (currentAuth == null) { + return false; + } + + PlayerAuth updated = new PlayerAuth(currentAuth.getUuid(), currentAuth.getUsername(), auth.getHash(), currentAuth.getIp(), currentAuth.getLastLogin()); + removeAuth(auth.getUuid()); + saveAuth(updated); return true; } @Override public boolean updateSession(PlayerAuth auth) { - if (!isAuthAvailable(auth.getNickname())) { + if (!isAuthAvailable(auth.getUuid())) { return false; } - PlayerAuth newAuth = null; + PlayerAuth currentAuth = null; BufferedReader br = null; try { @@ -152,8 +154,8 @@ public boolean updateSession(PlayerAuth auth) { String line = ""; while ((line = br.readLine()) != null) { String[] args = line.split(":"); - if (args[0].equals(auth.getNickname())) { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin()); + if (args.length > 0 && args[0].equals(auth.getUuid())) { + currentAuth = parseAuth(args); break; } } @@ -171,8 +173,14 @@ public boolean updateSession(PlayerAuth auth) { } } } - removeAuth(auth.getNickname()); - saveAuth(newAuth); + + if (currentAuth == null) { + return false; + } + + PlayerAuth updated = new PlayerAuth(currentAuth.getUuid(), auth.getUsername(), currentAuth.getHash(), auth.getIp(), auth.getLastLogin()); + removeAuth(auth.getUuid()); + saveAuth(updated); return true; } @@ -188,11 +196,10 @@ public int purgeDatabase(long until) { String line; while ((line = br.readLine()) != null) { String[] args = line.split(":"); - if (args.length == 4) { - if (Long.parseLong(args[3]) >= until) { - lines.add(line); - continue; - } + PlayerAuth auth = parseAuth(args); + if (auth != null && auth.getLastLogin() >= until) { + lines.add(formatAuth(auth)); + continue; } cleared++; } @@ -225,8 +232,8 @@ public int purgeDatabase(long until) { } @Override - public synchronized boolean removeAuth(String user) { - if (!isAuthAvailable(user)) { + public synchronized boolean removeAuth(String uuid) { + if (!isAuthAvailable(uuid)) { return false; } @@ -238,8 +245,9 @@ public synchronized boolean removeAuth(String user) { String line; while ((line = br.readLine()) != null) { String[] args = line.split(":"); - if (args.length > 1 && !args[0].equals(user)) { - lines.add(line); + PlayerAuth auth = parseAuth(args); + if (auth != null && !auth.getUuid().equals(uuid)) { + lines.add(formatAuth(auth)); } } @@ -271,21 +279,17 @@ public synchronized boolean removeAuth(String user) { } @Override - public synchronized PlayerAuth getAuth(String user) { + public synchronized PlayerAuth getAuth(String uuid) { BufferedReader br = null; try { br = new BufferedReader(new FileReader(source)); String line; while ((line = br.readLine()) != null) { String[] args = line.split(":"); - if (args[0].equals(user)) { - switch (args.length) { - case 2: - return new PlayerAuth(args[0], args[1], "198.18.0.1", 0); - case 3: - return new PlayerAuth(args[0], args[1], args[2], 0); - case 4: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3])); + if (args.length > 0 && args[0].equals(uuid)) { + PlayerAuth auth = parseAuth(args); + if (auth != null) { + return auth; } } } @@ -313,4 +317,33 @@ public synchronized void close() { @Override public void reload() { } + + private PlayerAuth parseAuth(String[] args) { + if (args.length < 3) { + return null; + } + + String uuid = args[0]; + String username = args[1]; + String hash = args[2]; + String ip = "198.18.0.1"; + if (args.length > 3 && !args[3].isEmpty()) { + ip = args[3]; + } + + long lastLogin = 0; + if (args.length > 4) { + try { + lastLogin = Long.parseLong(args[4]); + } catch (NumberFormatException ex) { + lastLogin = 0; + } + } + + return new PlayerAuth(uuid, username, hash, ip, lastLogin); + } + + private String formatAuth(PlayerAuth auth) { + return auth.getUuid() + ":" + auth.getUsername() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin(); + } } diff --git a/src/main/java/uk/org/whoami/authme/datasource/MySQLDataSource.java b/src/main/java/uk/org/whoami/authme/datasource/MySQLDataSource.java index d7eb306..e7760ef 100644 --- a/src/main/java/uk/org/whoami/authme/datasource/MySQLDataSource.java +++ b/src/main/java/uk/org/whoami/authme/datasource/MySQLDataSource.java @@ -37,7 +37,8 @@ public class MySQLDataSource implements DataSource { private String password; private String database; private String tableName; - private String columnName; + private String columnUuid; + private String columnUsername; private String columnPassword; private String columnIp; private String columnLastLogin; @@ -52,7 +53,8 @@ public MySQLDataSource() throws ClassNotFoundException, SQLException { this.database = s.getMySQLDatabase(); this.tableName = s.getMySQLTablename(); - this.columnName = s.getMySQLColumnName(); + this.columnUuid = s.getMySQLColumnUuid(); + this.columnUsername = s.getMySQLColumnUsername(); this.columnPassword = s.getMySQLColumnPassword(); this.columnIp = s.getMySQLColumnIp(); this.columnLastLogin = s.getMySQLColumnLastLogin(); @@ -84,11 +86,27 @@ private synchronized void setup() throws SQLException { st = con.createStatement(); st.executeUpdate("CREATE TABLE IF NOT EXISTS " + tableName + " (" + "id INTEGER AUTO_INCREMENT," - + columnName + " VARCHAR(255) NOT NULL," + + columnUuid + " VARCHAR(36) NOT NULL," + + columnUsername + " VARCHAR(255) NOT NULL," + columnPassword + " VARCHAR(255) NOT NULL," + columnIp + " VARCHAR(40) NOT NULL," + columnLastLogin + " BIGINT," - + "CONSTRAINT table_const_prim PRIMARY KEY (id));"); + + "CONSTRAINT table_const_prim PRIMARY KEY (id)," + + "UNIQUE (" + columnUuid + "));"); + + rs = con.getMetaData().getColumns(null, null, tableName, columnUuid); + if (!rs.next()) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + columnUuid + " VARCHAR(36) NOT NULL;"); + } + close(rs); + + rs = con.getMetaData().getColumns(null, null, tableName, columnUsername); + if (!rs.next()) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + + columnUsername + " VARCHAR(255) NOT NULL;"); + } + close(rs); rs = con.getMetaData().getColumns(null, null, tableName, columnIp); if (!rs.next()) { @@ -101,6 +119,10 @@ private synchronized void setup() throws SQLException { st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + columnLastLogin + " BIGINT;"); } + try { + st.executeUpdate("ALTER TABLE " + tableName + " ADD UNIQUE (" + columnUuid + ");"); + } catch (SQLException ignore) { + } } finally { close(rs); close(st); @@ -110,15 +132,15 @@ private synchronized void setup() throws SQLException { } @Override - public synchronized boolean isAuthAvailable(String user) { + public synchronized boolean isAuthAvailable(String uuid) { Connection con = null; PreparedStatement pst = null; ResultSet rs = null; try { con = conPool.getValidConnection(); pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " - + columnName + "=?;"); - pst.setString(1, user); + + columnUuid + "=?;"); + pst.setString(1, uuid); rs = pst.executeQuery(); return rs.next(); } catch (SQLException ex) { @@ -135,21 +157,21 @@ public synchronized boolean isAuthAvailable(String user) { } @Override - public synchronized PlayerAuth getAuth(String user) { + public synchronized PlayerAuth getAuth(String uuid) { Connection con = null; PreparedStatement pst = null; ResultSet rs = null; try { con = conPool.getValidConnection(); pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " - + columnName + "=?;"); - pst.setString(1, user); + + columnUuid + "=?;"); + pst.setString(1, uuid); rs = pst.executeQuery(); if (rs.next()) { if (rs.getString(columnIp).isEmpty()) { - return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "198.18.0.1", rs.getLong(columnLastLogin)); + return new PlayerAuth(rs.getString(columnUuid), rs.getString(columnUsername), rs.getString(columnPassword), "198.18.0.1", rs.getLong(columnLastLogin)); } else { - return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin)); + return new PlayerAuth(rs.getString(columnUuid), rs.getString(columnUsername), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin)); } } else { return null; @@ -173,11 +195,12 @@ public synchronized boolean saveAuth(PlayerAuth auth) { PreparedStatement pst = null; try { con = conPool.getValidConnection(); - pst = con.prepareStatement("INSERT INTO " + tableName + "(" + columnName + "," + columnPassword + "," + columnIp + "," + columnLastLogin + ") VALUES (?,?,?,?);"); - pst.setString(1, auth.getNickname()); - pst.setString(2, auth.getHash()); - pst.setString(3, auth.getIp()); - pst.setLong(4, auth.getLastLogin()); + pst = con.prepareStatement("INSERT INTO " + tableName + "(" + columnUuid + "," + columnUsername + "," + columnPassword + "," + columnIp + "," + columnLastLogin + ") VALUES (?,?,?,?,?);"); + pst.setString(1, auth.getUuid()); + pst.setString(2, auth.getUsername()); + pst.setString(3, auth.getHash()); + pst.setString(4, auth.getIp()); + pst.setLong(5, auth.getLastLogin()); pst.executeUpdate(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); @@ -198,9 +221,9 @@ public synchronized boolean updatePassword(PlayerAuth auth) { PreparedStatement pst = null; try { con = conPool.getValidConnection(); - pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnPassword + "=? WHERE " + columnName + "=?;"); + pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnPassword + "=? WHERE " + columnUuid + "=?;"); pst.setString(1, auth.getHash()); - pst.setString(2, auth.getNickname()); + pst.setString(2, auth.getUuid()); pst.executeUpdate(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); @@ -221,10 +244,11 @@ public boolean updateSession(PlayerAuth auth) { PreparedStatement pst = null; try { con = conPool.getValidConnection(); - pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnIp + "=?, " + columnLastLogin + "=? WHERE " + columnName + "=?;"); - pst.setString(1, auth.getIp()); - pst.setLong(2, auth.getLastLogin()); - pst.setString(3, auth.getNickname()); + pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnUsername + "=?, " + columnIp + "=?, " + columnLastLogin + "=? WHERE " + columnUuid + "=?;"); + pst.setString(1, auth.getUsername()); + pst.setString(2, auth.getIp()); + pst.setLong(3, auth.getLastLogin()); + pst.setString(4, auth.getUuid()); pst.executeUpdate(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); @@ -261,13 +285,13 @@ public int purgeDatabase(long until) { } @Override - public synchronized boolean removeAuth(String user) { + public synchronized boolean removeAuth(String uuid) { Connection con = null; PreparedStatement pst = null; try { con = conPool.getValidConnection(); - pst = con.prepareStatement("DELETE FROM " + tableName + " WHERE " + columnName + "=?;"); - pst.setString(1, user); + pst = con.prepareStatement("DELETE FROM " + tableName + " WHERE " + columnUuid + "=?;"); + pst.setString(1, uuid); pst.executeUpdate(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); diff --git a/src/main/java/uk/org/whoami/authme/listener/AuthMeBlockListener.java b/src/main/java/uk/org/whoami/authme/listener/AuthMeBlockListener.java index 35461ec..e2779c9 100644 --- a/src/main/java/uk/org/whoami/authme/listener/AuthMeBlockListener.java +++ b/src/main/java/uk/org/whoami/authme/listener/AuthMeBlockListener.java @@ -42,17 +42,17 @@ public void onBlockPlace(BlockPlaceEvent event) { } Player player = event.getPlayer(); - String name = player.getName().toLowerCase(); + String uuid = player.getUniqueId().toString(); if(CitizensCommunicator.isNPC(player)) { return; } - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { if (!settings.isForcedRegistrationEnabled()) { return; } @@ -68,17 +68,17 @@ public void onBlockBreak(BlockBreakEvent event) { } Player player = event.getPlayer(); - String name = player.getName().toLowerCase(); + String uuid = player.getUniqueId().toString(); if(CitizensCommunicator.isNPC(player)) { return; } - if (PlayerCache.getInstance().isAuthenticated(player.getName().toLowerCase())) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { if (!settings.isForcedRegistrationEnabled()) { return; } diff --git a/src/main/java/uk/org/whoami/authme/listener/AuthMeChat.java b/src/main/java/uk/org/whoami/authme/listener/AuthMeChat.java index eb6abd3..d0a74a2 100644 --- a/src/main/java/uk/org/whoami/authme/listener/AuthMeChat.java +++ b/src/main/java/uk/org/whoami/authme/listener/AuthMeChat.java @@ -12,7 +12,7 @@ public void onPlayerChat(PlayerChatEvent event) { return; } //HOTFIX - Start - if (PlayerCache.getInstance().isAuthenticated(event.getPlayer().getName().toLowerCase())) { + if (PlayerCache.getInstance().isAuthenticated(event.getPlayer().getUniqueId().toString())) { return; } event.setCancelled(true); diff --git a/src/main/java/uk/org/whoami/authme/listener/AuthMeCustomListener.java b/src/main/java/uk/org/whoami/authme/listener/AuthMeCustomListener.java index 59cc940..88b534d 100644 --- a/src/main/java/uk/org/whoami/authme/listener/AuthMeCustomListener.java +++ b/src/main/java/uk/org/whoami/authme/listener/AuthMeCustomListener.java @@ -74,16 +74,17 @@ public void onCustomEvent(Event event) { } String playerName = player.getName().toLowerCase(); + String uuid = player.getUniqueId().toString(); String ip = player.getAddress().getAddress().getHostAddress(); if (((PlayerEvolutionAuthEvent) event).isPlayerAuthenticated()) { //Player is authenticated - if (PlayerCache.getInstance().isAuthenticated(playerName)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { //Player is already authenticated with Authme return; } //Check if user is brand new - if (!plugin.getAuthDatabase().isAuthAvailable(playerName)) { + if (!plugin.getAuthDatabase().isAuthAvailable(uuid)) { //Generate random password to register user if (settings.isAutoRegisterAuthenticatedEnabled()) { @@ -93,7 +94,7 @@ public void onCustomEvent(Event event) { try { //Save a random password for user String hash = PasswordSecurity.getHash(settings.getPasswordHash(), password); - PlayerAuth auth = new PlayerAuth(playerName, hash, ip, new Date().getTime()); + PlayerAuth auth = new PlayerAuth(uuid, playerName, hash, ip, new Date().getTime()); if (!plugin.getAuthDatabase().saveAuth(auth)) { ConsoleLogger.showError("Failed to save Auth to database for " + playerName); return; @@ -124,9 +125,12 @@ public void onCustomEvent(Event event) { //Lets authenticate the user - PlayerAuth auth = plugin.getAuthDatabase().getAuth(playerName); - PlayerCache.getInstance().addPlayer(auth); - LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(playerName); + PlayerAuth auth = plugin.getAuthDatabase().getAuth(uuid); + if (auth != null) { + auth.setUsername(playerName); + PlayerCache.getInstance().addPlayer(auth); + } + LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(uuid); //Remove from limbo if player is in Limbo if (limbo != null) { player.getInventory().setContents(limbo.getInventory()); @@ -135,7 +139,7 @@ public void onCustomEvent(Event event) { player.teleport(limbo.getLoc()); } plugin.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId()); - LimboCache.getInstance().deleteLimboPlayer(playerName); + LimboCache.getInstance().deleteLimboPlayer(uuid); } @@ -161,7 +165,7 @@ public void onCustomEvent(Event event) { if (!plugin.isRunningPoseidon()) { if (settings.isKickNonAuthenticatedEnabled()) { - if (settings.isAllowRegisteredNonAuthenticatedBypassEnabled() && plugin.getAuthDatabase().isAuthAvailable(playerName)) { + if (settings.isAllowRegisteredNonAuthenticatedBypassEnabled() && plugin.getAuthDatabase().isAuthAvailable(uuid)) { ConsoleLogger.info(player.getName() + " Has been allowed to join as they are registered, and the registered bypass for BetaEVO is activated."); } else { //Kick non authenticated users diff --git a/src/main/java/uk/org/whoami/authme/listener/AuthMeEntityListener.java b/src/main/java/uk/org/whoami/authme/listener/AuthMeEntityListener.java index 36aa03d..6dab178 100644 --- a/src/main/java/uk/org/whoami/authme/listener/AuthMeEntityListener.java +++ b/src/main/java/uk/org/whoami/authme/listener/AuthMeEntityListener.java @@ -51,13 +51,13 @@ public void onEntityDamage(EntityDamageEvent event) { } Player player = (Player) entity; - String name = player.getName().toLowerCase(); + String uuid = player.getUniqueId().toString(); - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { if (!settings.isForcedRegistrationEnabled()) { return; } @@ -78,13 +78,13 @@ public void onEntityTarget(EntityTargetEvent event) { } Player player = (Player) entity; - String name = player.getName().toLowerCase(); + String uuid = player.getUniqueId().toString(); - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { if (!settings.isForcedRegistrationEnabled()) { return; } diff --git a/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java b/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java index 38cc5cd..a6153ce 100644 --- a/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java +++ b/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java @@ -79,17 +79,18 @@ public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { } Player player = event.getPlayer(); + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); if (CitizensCommunicator.isNPC(player)) { return; } - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { if (!settings.isForcedRegistrationEnabled()) { return; } @@ -117,10 +118,11 @@ public void onPlayerChat(PlayerChatEvent event) { } Player player = event.getPlayer(); + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); //HOTFIX - Start - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } @@ -133,11 +135,11 @@ public void onPlayerChat(PlayerChatEvent event) { return; } - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (data.isAuthAvailable(name)) { + if (data.isAuthAvailable(uuid)) { player.sendMessage(m._("login_msg")); } else { if (!settings.isForcedRegistrationEnabled()) { @@ -158,17 +160,18 @@ public void onPlayerMove(PlayerMoveEvent event) { } Player player = event.getPlayer(); + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); if (CitizensCommunicator.isNPC(player)) { return; } - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (data.isAuthAvailable(name)) { + if (data.isAuthAvailable(uuid)) { event.setTo(event.getFrom()); return; } @@ -204,6 +207,7 @@ public void onPlayerLogin(PlayerLoginEvent event) { } Player player = event.getPlayer(); + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); @@ -222,7 +226,7 @@ public void onPlayerLogin(PlayerLoginEvent event) { } if (settings.isKickNonAuthenticatedEnabled() && !EvolutionAPI.isUserAuthenticatedInCache(event.getPlayer().getName(), event.getAddress().getHostAddress())) { //PLayers without BetaEVO should be kicked - if (settings.isAllowRegisteredNonAuthenticatedBypassEnabled() && plugin.getAuthDatabase().isAuthAvailable(name)) { + if (settings.isAllowRegisteredNonAuthenticatedBypassEnabled() && plugin.getAuthDatabase().isAuthAvailable(uuid)) { ConsoleLogger.info(player.getName() + " Has been allowed to join as they are registered, and the registered bypass for BetaEVO is activated."); } else { event.setKickMessage(Messages.getInstance()._("unauthenticatedKick")); @@ -262,7 +266,7 @@ public void onPlayerLogin(PlayerLoginEvent event) { } if (settings.isKickNonRegisteredEnabled()) { - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { event.disallow(Result.KICK_OTHER, m._("reg_only")); return; } @@ -276,6 +280,7 @@ public void onPlayerJoin(PlayerJoinEvent event) { } Player player = event.getPlayer(); + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); String ip = player.getAddress().getAddress().getHostAddress(); @@ -283,24 +288,28 @@ public void onPlayerJoin(PlayerJoinEvent event) { return; } - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (data.isAuthAvailable(name)) { + if (data.isAuthAvailable(uuid)) { if (settings.isSessionsEnabled()) { - PlayerAuth auth = data.getAuth(name); + PlayerAuth auth = data.getAuth(uuid); + if (auth == null) { + return; + } long timeout = settings.getSessionTimeout() * 60000; long lastLogin = auth.getLastLogin(); long cur = new Date().getTime(); - if (auth.getNickname().equals(name) && auth.getIp().equals(ip) && (cur - lastLogin < timeout || timeout == 0)) { + if (auth.getUuid().equals(uuid) && auth.getIp().equals(ip) && (cur - lastLogin < timeout || timeout == 0)) { //Login Event Start final AuthLoginEvent loginEvent = new AuthLoginEvent(callLogin.Reason.AuthemeLogin, player); Bukkit.getServer().getPluginManager().callEvent(loginEvent); //Login Event End if (!loginEvent.isCancelled()) { + auth.setUsername(name); PlayerCache.getInstance().addPlayer(auth); player.sendMessage(m._("valid_session")); callLogin(player, callLogin.Reason.AuthmeSession); // Run Event @@ -322,15 +331,15 @@ public void onPlayerJoin(PlayerJoinEvent event) { player.teleport(player.getWorld().getSpawnLocation()); } - String msg = data.isAuthAvailable(name) ? m._("login_msg") : m._("reg_msg"); + String msg = data.isAuthAvailable(uuid) ? m._("login_msg") : m._("reg_msg"); int time = settings.getRegistrationTimeout() * 20; int msgInterval = settings.getWarnMessageInterval(); BukkitScheduler sched = plugin.getServer().getScheduler(); if (time != 0) { - int id = sched.scheduleSyncDelayedTask(plugin, new TimeoutTask(plugin, name), time); - LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id); + int id = sched.scheduleSyncDelayedTask(plugin, new TimeoutTask(plugin, uuid), time); + LimboCache.getInstance().getLimboPlayer(uuid).setTimeoutTaskId(id); } - sched.scheduleSyncDelayedTask(plugin, new MessageTask(plugin, name, msg, msgInterval), 15); //Wait 0.75 seconds before starting AuthMe Login Message Task + sched.scheduleSyncDelayedTask(plugin, new MessageTask(plugin, uuid, msg, msgInterval), 15); //Wait 0.75 seconds before starting AuthMe Login Message Task } @Override @@ -345,16 +354,17 @@ public void onPlayerQuit(PlayerQuitEvent event) { return; } + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); - if (LimboCache.getInstance().hasLimboPlayer(name)) { - LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); + if (LimboCache.getInstance().hasLimboPlayer(uuid)) { + LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(uuid); player.getInventory().setArmorContents(limbo.getArmour()); player.getInventory().setContents(limbo.getInventory()); player.teleport(limbo.getLoc()); plugin.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId()); - LimboCache.getInstance().deleteLimboPlayer(name); + LimboCache.getInstance().deleteLimboPlayer(uuid); } - PlayerCache.getInstance().removePlayer(name); + PlayerCache.getInstance().removePlayer(uuid); } @Override @@ -369,16 +379,17 @@ public void onPlayerKick(PlayerKickEvent event) { return; } + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); - if (LimboCache.getInstance().hasLimboPlayer(name)) { - LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); + if (LimboCache.getInstance().hasLimboPlayer(uuid)) { + LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(uuid); player.getInventory().setArmorContents(limbo.getArmour()); player.getInventory().setContents(limbo.getInventory()); player.teleport(limbo.getLoc()); plugin.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId()); - LimboCache.getInstance().deleteLimboPlayer(name); + LimboCache.getInstance().deleteLimboPlayer(uuid); } - PlayerCache.getInstance().removePlayer(name); + PlayerCache.getInstance().removePlayer(uuid); } @Override @@ -388,17 +399,18 @@ public void onPlayerPickupItem(PlayerPickupItemEvent event) { } Player player = event.getPlayer(); + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); if (CitizensCommunicator.isNPC(player)) { return; } - if (PlayerCache.getInstance().isAuthenticated(player.getName().toLowerCase())) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { if (!settings.isForcedRegistrationEnabled()) { return; } @@ -414,17 +426,18 @@ public void onPlayerInteract(PlayerInteractEvent event) { } Player player = event.getPlayer(); + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); if (CitizensCommunicator.isNPC(player)) { return; } - if (PlayerCache.getInstance().isAuthenticated(player.getName().toLowerCase())) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { if (!settings.isForcedRegistrationEnabled()) { return; } @@ -440,17 +453,18 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { } Player player = event.getPlayer(); + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); if (CitizensCommunicator.isNPC(player)) { return; } - if (PlayerCache.getInstance().isAuthenticated(player.getName().toLowerCase())) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { if (!settings.isForcedRegistrationEnabled()) { return; } @@ -464,17 +478,18 @@ public void onPlayerDropItem(PlayerDropItemEvent event) { return; } Player player = event.getPlayer(); + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); if (CitizensCommunicator.isNPC(player)) { return; } - if (PlayerCache.getInstance().isAuthenticated(player.getName().toLowerCase())) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { if (!settings.isForcedRegistrationEnabled()) { return; } @@ -488,17 +503,18 @@ public void onPlayerBedEnter(PlayerBedEnterEvent event) { return; } Player player = event.getPlayer(); + String uuid = player.getUniqueId().toString(); String name = player.getName().toLowerCase(); if (CitizensCommunicator.isNPC(player)) { return; } - if (PlayerCache.getInstance().isAuthenticated(player.getName().toLowerCase())) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } - if (!data.isAuthAvailable(name)) { + if (!data.isAuthAvailable(uuid)) { if (!settings.isForcedRegistrationEnabled()) { return; } diff --git a/src/main/java/uk/org/whoami/authme/settings/Settings.java b/src/main/java/uk/org/whoami/authme/settings/Settings.java index 0100ef6..1dffb0d 100644 --- a/src/main/java/uk/org/whoami/authme/settings/Settings.java +++ b/src/main/java/uk/org/whoami/authme/settings/Settings.java @@ -29,7 +29,7 @@ public final class Settings extends Configuration { public static final String PLUGIN_FOLDER = "./plugins/AuthMe"; public static final String CACHE_FOLDER = Settings.PLUGIN_FOLDER + "/cache"; - public static final String AUTH_FILE = Settings.PLUGIN_FOLDER + "/auths.db"; + public static final String AUTH_FILE = Settings.PLUGIN_FOLDER + "/auths-uuid.db"; public static final String MESSAGE_FILE = Settings.PLUGIN_FOLDER + "/messages.yml"; public static final String SETTINGS_FILE = Settings.PLUGIN_FOLDER + "/config.yml"; private static Settings singleton; @@ -68,7 +68,8 @@ private void write() { getMySQLPassword(); getMySQLDatabase(); getMySQLTablename(); - getMySQLColumnName(); + getMySQLColumnUuid(); + getMySQLColumnUsername(); getMySQLColumnPassword(); getMySQLColumnIp(); getMySQLColumnLastLogin(); @@ -290,8 +291,21 @@ public String getMySQLTablename() { return getString(key); } - public String getMySQLColumnName() { - String key = "DataSource.mySQLColumnName"; + public String getMySQLColumnUuid() { + String key = "DataSource.mySQLColumnUuid"; + if (getString(key) == null) { + String legacyKey = "DataSource.mySQLColumnName"; + if (getString(legacyKey) != null) { + setProperty(key, getString(legacyKey)); + } else { + setProperty(key, "uuid"); + } + } + return getString(key); + } + + public String getMySQLColumnUsername() { + String key = "DataSource.mySQLColumnUsername"; if (getString(key) == null) { setProperty(key, "username"); } diff --git a/src/main/java/uk/org/whoami/authme/task/MessageTask.java b/src/main/java/uk/org/whoami/authme/task/MessageTask.java index e2bcece..f9d9184 100644 --- a/src/main/java/uk/org/whoami/authme/task/MessageTask.java +++ b/src/main/java/uk/org/whoami/authme/task/MessageTask.java @@ -24,26 +24,26 @@ public class MessageTask implements Runnable { - private JavaPlugin plugin; - private String name; - private String msg; - private int interval; + private final JavaPlugin plugin; + private final String uuid; + private final String msg; + private final int interval; - public MessageTask(JavaPlugin plugin, String name, String msg, int interval) { + public MessageTask(JavaPlugin plugin, String uuid, String msg, int interval) { this.plugin = plugin; - this.name = name; + this.uuid = uuid; this.msg = msg; this.interval = interval; } @Override public void run() { - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } for (Player player : plugin.getServer().getOnlinePlayers()) { - if (player.getName().toLowerCase().equals(name)) { + if (player.getUniqueId().toString().equals(uuid)) { player.sendMessage(msg); BukkitScheduler sched = plugin.getServer().getScheduler(); diff --git a/src/main/java/uk/org/whoami/authme/task/TimeoutTask.java b/src/main/java/uk/org/whoami/authme/task/TimeoutTask.java index 5a22e4f..6142cbf 100644 --- a/src/main/java/uk/org/whoami/authme/task/TimeoutTask.java +++ b/src/main/java/uk/org/whoami/authme/task/TimeoutTask.java @@ -26,33 +26,29 @@ public class TimeoutTask implements Runnable { - private JavaPlugin plugin; - private String name; - private Messages m = Messages.getInstance(); + private final JavaPlugin plugin; + private final String uuid; + private final Messages m = Messages.getInstance(); - public TimeoutTask(JavaPlugin plugin, String name) { + public TimeoutTask(JavaPlugin plugin, String uuid) { this.plugin = plugin; - this.name = name; - } - - public String getName() { - return name; + this.uuid = uuid; } @Override public void run() { - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(uuid)) { return; } for (Player player : plugin.getServer().getOnlinePlayers()) { - if (player.getName().toLowerCase().equals(name)) { - if (LimboCache.getInstance().hasLimboPlayer(name)) { - LimboPlayer inv = LimboCache.getInstance().getLimboPlayer(name); + if (player.getUniqueId().toString().equals(uuid)) { + if (LimboCache.getInstance().hasLimboPlayer(uuid)) { + LimboPlayer inv = LimboCache.getInstance().getLimboPlayer(uuid); player.getInventory().setArmorContents(inv.getArmour()); player.getInventory().setContents(inv.getInventory()); player.teleport(inv.getLoc()); - LimboCache.getInstance().deleteLimboPlayer(name); + LimboCache.getInstance().deleteLimboPlayer(uuid); } player.kickPlayer(m._("timeout")); break; From 04407f214e2b4537b0127f73c9e48d01b8767ed2 Mon Sep 17 00:00:00 2001 From: Rhys B Date: Tue, 30 Sep 2025 11:23:32 +1000 Subject: [PATCH 2/2] Add legacy auth database conversion command --- .../java/uk/org/whoami/authme/AuthMe.java | 2 +- .../whoami/authme/commands/AdminCommand.java | 140 +++++++++++++++++- 2 files changed, 137 insertions(+), 5 deletions(-) diff --git a/src/main/java/uk/org/whoami/authme/AuthMe.java b/src/main/java/uk/org/whoami/authme/AuthMe.java index 832bd93..5e4d23a 100644 --- a/src/main/java/uk/org/whoami/authme/AuthMe.java +++ b/src/main/java/uk/org/whoami/authme/AuthMe.java @@ -158,7 +158,7 @@ public void onEnable() { pm.registerEvent(Event.Type.ENTITY_TARGET, entityListener, Priority.Lowest, this); - this.getCommand("authme").setExecutor(new AdminCommand(database)); + this.getCommand("authme").setExecutor(new AdminCommand(this, database)); this.getCommand("register").setExecutor(new RegisterCommand(this, database)); this.getCommand("login").setExecutor(new LoginCommand(database)); this.getCommand("changepassword").setExecutor(new ChangePasswordCommand(database)); diff --git a/src/main/java/uk/org/whoami/authme/commands/AdminCommand.java b/src/main/java/uk/org/whoami/authme/commands/AdminCommand.java index d9dd4a4..1cf5144 100644 --- a/src/main/java/uk/org/whoami/authme/commands/AdminCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/AdminCommand.java @@ -16,6 +16,12 @@ package uk.org.whoami.authme.commands; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.util.Date; @@ -25,7 +31,11 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import com.projectposeidon.api.PoseidonUUID; +import com.projectposeidon.api.UUIDType; + import uk.org.whoami.authme.ConsoleLogger; +import uk.org.whoami.authme.AuthMe; import uk.org.whoami.authme.cache.auth.PlayerAuth; import uk.org.whoami.authme.cache.auth.PlayerCache; import uk.org.whoami.authme.datasource.DataSource; @@ -35,18 +45,22 @@ public class AdminCommand implements CommandExecutor { + private static final String LEGACY_AUTH_FILE = Settings.PLUGIN_FOLDER + "/auths.db"; + private Messages m = Messages.getInstance(); private Settings settings = Settings.getInstance(); private DataSource database; + private final AuthMe plugin; - public AdminCommand(DataSource database) { + public AdminCommand(AuthMe plugin, DataSource database) { + this.plugin = plugin; this.database = database; } @Override public boolean onCommand(CommandSender sender, Command cmnd, String label, String[] args) { if (args.length == 0) { - sender.sendMessage("Usage: /authme reload|register playername password|changepassword playername password|unregister playername|purge|betaevo"); + sender.sendMessage("Usage: /authme reload|register playername password|changepassword playername password|unregister playername|purge|betaevo|convertuuid"); return true; } @@ -87,6 +101,8 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin sender.sendMessage("BetaEVO mode enabled"); } ConsoleLogger.info("BetaEVO mode " + (betaEVO ? "disabled" : "enabled") + " by " + sender.getName()); + } else if (args[0].equalsIgnoreCase("convertuuid")) { + convertLegacyDatabase(sender); } else if (args[0].equalsIgnoreCase("register")) { if (args.length != 3) { sender.sendMessage("Usage: /authme register playername password"); @@ -167,10 +183,126 @@ public boolean onCommand(CommandSender sender, Command cmnd, String label, Strin ConsoleLogger.info(args[1] + " unregistered"); } else { - sender.sendMessage("Usage: /authme reload|register playername password|changepassword playername password|unregister playername"); + sender.sendMessage("Usage: /authme reload|register playername password|changepassword playername password|unregister playername|purge|betaevo|convertuuid"); } return true; -} + } + + private void convertLegacyDatabase(CommandSender sender) { + File legacyFile = new File(LEGACY_AUTH_FILE); + if (!legacyFile.exists() || !legacyFile.isFile()) { + sender.sendMessage("Legacy auths.db not found. No conversion performed."); + return; + } + + File targetFile = new File(Settings.AUTH_FILE); + File parent = targetFile.getParentFile(); + if (parent != null && !parent.exists() && !parent.mkdirs()) { + sender.sendMessage("Unable to create AuthMe data directory for conversion."); + return; + } + + File backupFile = parent != null + ? new File(parent, targetFile.getName() + ".bak") + : new File(targetFile.getName() + ".bak"); + boolean backedUp = false; + if (targetFile.exists() && targetFile.length() > 0) { + if (backupFile.exists() && !backupFile.delete()) { + sender.sendMessage("Unable to remove existing auths-uuid.db.bak backup. Aborting."); + return; + } + if (!targetFile.renameTo(backupFile)) { + sender.sendMessage("Unable to back up existing auths-uuid.db. Aborting."); + return; + } + backedUp = true; + } + + int converted = 0; + int skipped = 0; + + try (BufferedReader reader = new BufferedReader(new FileReader(legacyFile)); + BufferedWriter writer = new BufferedWriter(new FileWriter(targetFile, false))) { + String line; + while ((line = reader.readLine()) != null) { + if (line.trim().isEmpty()) { + continue; + } + + String[] values = line.split(":"); + if (values.length < 2) { + skipped++; + continue; + } + + String originalName = values[0].trim(); + if (originalName.isEmpty()) { + skipped++; + continue; + } + + String username = originalName.toLowerCase(); + String hash = values[1].trim(); + String ip = "198.18.0.1"; + if (values.length > 2 && !values[2].isEmpty()) { + ip = values[2].trim(); + } + + long lastLogin = 0; + if (values.length > 3 && !values[3].isEmpty()) { + try { + lastLogin = Long.parseLong(values[3].trim()); + } catch (NumberFormatException ex) { + lastLogin = 0; + } + } + + UUID uuid = resolveUuid(originalName); + if (uuid == null) { + ConsoleLogger.info("Skipping legacy record for '" + originalName + "' because no UUID could be resolved."); + skipped++; + continue; + } + + writer.write(uuid.toString() + ":" + username + ":" + hash + ":" + ip + ":" + lastLogin); + writer.newLine(); + converted++; + } + } catch (IOException ex) { + ConsoleLogger.showError("Failed to convert legacy database: " + ex.getMessage()); + sender.sendMessage(m._("error")); + return; + } + + if (backedUp) { + sender.sendMessage("Existing auths-uuid.db backed up to " + backupFile.getName()); + } + + sender.sendMessage("Converted " + converted + " accounts to auths-uuid.db" + (skipped > 0 ? " (" + skipped + " skipped)" : "")); + if (skipped > 0) { + sender.sendMessage("Check console for players that were skipped due to missing UUIDs."); + } + } + + private UUID resolveUuid(String username) { + if (plugin != null && plugin.isRunningPoseidon()) { + try { + UUIDType uuidType = PoseidonUUID.getPlayerUUIDCacheStatus(username); + if (uuidType == UUIDType.UNKNOWN) { + return null; + } else if (uuidType == UUIDType.OFFLINE) { + return PoseidonUUID.getPlayerOfflineUUID(username); + } else { + return PoseidonUUID.getPlayerMojangUUID(username); + } + } catch (Exception ex) { + ConsoleLogger.showError("Unable to resolve UUID for '" + username + "': " + ex.getMessage()); + return null; + } + } + + return UUID.nameUUIDFromBytes(("OfflinePlayer:" + username).getBytes(StandardCharsets.UTF_8)); + } private String getOfflineUuid(String playerName) { return UUID.nameUUIDFromBytes(("OfflinePlayer:" + playerName).getBytes(StandardCharsets.UTF_8)).toString();