From 2215b0f53f838c77685d76bbab308444c83a8fe6 Mon Sep 17 00:00:00 2001 From: KHobbits Date: Sat, 7 Jun 2014 18:08:25 +0100 Subject: Don't allow old UUID's to accidentally overwrite current UUID for user mapping. Add some extra logging and uuid debug. --- .../com/earth2me/essentials/EssentialsUpgrade.java | 2 +- .../src/com/earth2me/essentials/UserData.java | 2 +- .../src/com/earth2me/essentials/UserMap.java | 70 +++++++++++++--------- .../src/com/earth2me/essentials/api/Economy.java | 2 +- .../essentials/commands/Commandessentials.java | 14 ++++- 5 files changed, 59 insertions(+), 31 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java b/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java index fb6f0e520..a90641d4c 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java @@ -646,7 +646,7 @@ public class EssentialsUpgrade conf.forceSave(); config = new EssentialsUserConf(name, uuid, new File(userdir, uuid + ".yml")); config.convertLegacyFile(); - ess.getUserMap().trackUUID(uuid, name); + ess.getUserMap().trackUUID(uuid, name, false); continue; } countFails++; diff --git a/Essentials/src/com/earth2me/essentials/UserData.java b/Essentials/src/com/earth2me/essentials/UserData.java index 863edd049..3de18092a 100644 --- a/Essentials/src/com/earth2me/essentials/UserData.java +++ b/Essentials/src/com/earth2me/essentials/UserData.java @@ -841,7 +841,7 @@ public abstract class UserData extends PlayerExtension implements IConf this.lastAccountName = lastAccountName; config.setProperty("lastAccountName", lastAccountName); config.save(); - ess.getUserMap().trackUUID(getConfigUUID(), lastAccountName); + ess.getUserMap().trackUUID(getConfigUUID(), lastAccountName, true); } public void setNPC(boolean set) diff --git a/Essentials/src/com/earth2me/essentials/UserMap.java b/Essentials/src/com/earth2me/essentials/UserMap.java index 5719ee2b8..e15b9e385 100644 --- a/Essentials/src/com/earth2me/essentials/UserMap.java +++ b/Essentials/src/com/earth2me/essentials/UserMap.java @@ -29,7 +29,7 @@ public class UserMap extends CacheLoader implements IConf private final transient ConcurrentSkipListMap names = new ConcurrentSkipListMap(); private final transient ConcurrentSkipListMap> history = new ConcurrentSkipListMap>(); private UUIDMap uuidMap; - + public UserMap(final IEssentials ess) { super(); @@ -39,7 +39,7 @@ public class UserMap extends CacheLoader implements IConf //users = CacheBuilder.newBuilder().maximumSize(ess.getSettings().getMaxUserCacheCount()).softValues().removalListener(remListener).build(this); users = CacheBuilder.newBuilder().maximumSize(ess.getSettings().getMaxUserCacheCount()).softValues().build(this); } - + private void loadAllUsersAsync(final IEssentials ess) { ess.runTaskAsynchronously(new Runnable() @@ -77,12 +77,12 @@ public class UserMap extends CacheLoader implements IConf } }); } - + public boolean userExists(final UUID uuid) { return keys.contains(uuid); } - + public User getUser(final String name) { try @@ -93,13 +93,13 @@ public class UserMap extends CacheLoader implements IConf final UUID uuid = names.get(sanitizedName); return getUser(uuid); } - + final File userFile = getUserFileFromString(sanitizedName); if (userFile.exists()) { ess.getLogger().info("Importing user " + name + " to usermap."); User user = new User(new OfflinePlayer(sanitizedName, ess.getServer()), ess); - trackUUID(user.getBase().getUniqueId(), user.getName()); + trackUUID(user.getBase().getUniqueId(), user.getName(), true); return user; } return null; @@ -109,7 +109,7 @@ public class UserMap extends CacheLoader implements IConf return null; } } - + public User getUser(final UUID uuid) { try @@ -125,8 +125,8 @@ public class UserMap extends CacheLoader implements IConf return null; } } - - public void trackUUID(final UUID uuid, final String name) + + public void trackUUID(final UUID uuid, final String name, boolean replace) { if (uuid != null) { @@ -134,15 +134,31 @@ public class UserMap extends CacheLoader implements IConf if (name != null && name.length() > 0) { final String keyName = StringUtil.safeString(name); - if (!names.containsKey(keyName) || !names.get(keyName).equals(uuid)) + if (!names.containsKey(keyName)) { names.put(keyName, uuid); uuidMap.writeUUIDMap(); } + else if (!names.get(keyName).equals(uuid)) + { + if (replace) + { + ess.getLogger().info("Found new UUID for " + name + ". Replacing " + names.get(keyName).toString() + " with " + uuid.toString()); + names.put(keyName, uuid); + uuidMap.writeUUIDMap(); + } + else + { + if (ess.getSettings().isDebug()) + { + ess.getLogger().info("Found old UUID for " + name + ". Not adding to usermap."); + } + } + } } } } - + @Override public User load(final String stringUUID) throws Exception { @@ -151,36 +167,36 @@ public class UserMap extends CacheLoader implements IConf if (player != null) { final User user = new User(player, ess); - trackUUID(uuid, user.getName()); + trackUUID(uuid, user.getName(), true); return user; } - + final File userFile = getUserFileFromID(uuid); - + if (userFile.exists()) { player = new OfflinePlayer(uuid, ess.getServer()); final User user = new User(player, ess); ((OfflinePlayer)player).setName(user.getLastAccountName()); - trackUUID(uuid, user.getName()); + trackUUID(uuid, user.getName(), false); return user; } - + throw new Exception("User not found!"); } - + @Override public void reloadConfig() { getUUIDMap().forceWriteUUIDMap(); loadAllUsersAsync(ess); } - + public void invalidateAll() { users.invalidateAll(); } - + public void removeUser(final String name) { if (names == null) @@ -197,43 +213,43 @@ public class UserMap extends CacheLoader implements IConf names.remove(name); names.remove(StringUtil.safeString(name)); } - + public Set getAllUniqueUsers() { return Collections.unmodifiableSet(keys.clone()); } - + public int getUniqueUsers() { return keys.size(); } - + protected ConcurrentSkipListMap getNames() { return names; } - + protected ConcurrentSkipListMap> getHistory() { return history; } - + public List getUserHistory(final UUID uuid) { return history.get(uuid); } - + public UUIDMap getUUIDMap() { return uuidMap; } - + private File getUserFileFromID(final UUID uuid) { final File userFolder = new File(ess.getDataFolder(), "userdata"); return new File(userFolder, uuid.toString() + ".yml"); } - + public File getUserFileFromString(final String name) { final File userFolder = new File(ess.getDataFolder(), "userdata"); diff --git a/Essentials/src/com/earth2me/essentials/api/Economy.java b/Essentials/src/com/earth2me/essentials/api/Economy.java index ff6601f80..c694d63fd 100644 --- a/Essentials/src/com/earth2me/essentials/api/Economy.java +++ b/Essentials/src/com/earth2me/essentials/api/Economy.java @@ -64,7 +64,7 @@ public class Economy npcConfig.setProperty("lastAccountName", name); npcConfig.setProperty("money", ess.getSettings().getStartingBalance()); npcConfig.forceSave(); - ess.getUserMap().trackUUID(npcUUID, name); + ess.getUserMap().trackUUID(npcUUID, name, true); } private static void deleteNPC(String name) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java index 0eedb61ca..44c632356 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java @@ -355,15 +355,27 @@ public class Commandessentials extends EssentialsCommand { if (player.getName().equalsIgnoreCase(name)) { - sender.sendMessage("Online player: " + player.getUniqueId().toString()); onlineUUID = player.getUniqueId(); + break; } } + UUID essUUID = ess.getUserMap().getUser(name).getConfigUUID(); + org.bukkit.OfflinePlayer player = ess.getServer().getOfflinePlayer(name); UUID bukkituuid = player.getUniqueId(); sender.sendMessage("Bukkit Lookup: " + bukkituuid.toString()); + if (onlineUUID != null && onlineUUID != bukkituuid) + { + sender.sendMessage("Online player: " + onlineUUID.toString()); + } + + if (essUUID != null && essUUID != bukkituuid) + { + sender.sendMessage("Essentials config: " + essUUID.toString()); + } + UUID npcuuid = UUID.nameUUIDFromBytes(("NPC:" + name).getBytes(Charsets.UTF_8)); sender.sendMessage("NPC UUID: " + npcuuid.toString()); -- cgit v1.2.3