Skip to content

Commit

Permalink
Don't allow old UUID's to accidentally overwrite current UUID for use…
Browse files Browse the repository at this point in the history
…r mapping.

Add some extra logging and uuid debug.
  • Loading branch information
khobbits committed Jun 7, 2014
1 parent 3887fdd commit 2215b0f
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -646,7 +646,7 @@ public static void uuidFileConvert(IEssentials ess, Boolean ignoreUFCache)
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++;
Expand Down
2 changes: 1 addition & 1 deletion Essentials/src/com/earth2me/essentials/UserData.java
Original file line number Diff line number Diff line change
Expand Up @@ -841,7 +841,7 @@ public void setLastAccountName(String lastAccountName)
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)
Expand Down
70 changes: 43 additions & 27 deletions Essentials/src/com/earth2me/essentials/UserMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public class UserMap extends CacheLoader<String, User> implements IConf
private final transient ConcurrentSkipListMap<String, UUID> names = new ConcurrentSkipListMap<String, UUID>();
private final transient ConcurrentSkipListMap<UUID, ArrayList<String>> history = new ConcurrentSkipListMap<UUID, ArrayList<String>>();
private UUIDMap uuidMap;

public UserMap(final IEssentials ess)
{
super();
Expand All @@ -39,7 +39,7 @@ public UserMap(final IEssentials ess)
//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()
Expand Down Expand Up @@ -77,12 +77,12 @@ public void run()
}
});
}

public boolean userExists(final UUID uuid)
{
return keys.contains(uuid);
}

public User getUser(final String name)
{
try
Expand All @@ -93,13 +93,13 @@ public User getUser(final String name)
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;
Expand All @@ -109,7 +109,7 @@ public User getUser(final String name)
return null;
}
}

public User getUser(final UUID uuid)
{
try
Expand All @@ -125,24 +125,40 @@ public User getUser(final UUID uuid)
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)
{
keys.add(uuid);
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
{
Expand All @@ -151,36 +167,36 @@ public User load(final String stringUUID) throws Exception
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)
Expand All @@ -197,43 +213,43 @@ public void removeUser(final String name)
names.remove(name);
names.remove(StringUtil.safeString(name));
}

public Set<UUID> getAllUniqueUsers()
{
return Collections.unmodifiableSet(keys.clone());
}

public int getUniqueUsers()
{
return keys.size();
}

protected ConcurrentSkipListMap<String, UUID> getNames()
{
return names;
}

protected ConcurrentSkipListMap<UUID, ArrayList<String>> getHistory()
{
return history;
}

public List<String> 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");
Expand Down
2 changes: 1 addition & 1 deletion Essentials/src/com/earth2me/essentials/api/Economy.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ private static void createNPCFile(String name)
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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -355,15 +355,27 @@ private void run_uuidtest(final Server server, final CommandSource sender, final
{
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());

Expand Down

0 comments on commit 2215b0f

Please sign in to comment.