package net.minecraft.server; import com.destroystokyo.paper.exception.ServerInternalException; import com.google.common.base.Charsets; import com.google.common.base.Predicate; import com.google.common.collect.Iterators; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.io.Files; import com.koloboke.collect.map.hash.HashObjObjMaps; import com.mojang.authlib.Agent; import com.mojang.authlib.GameProfile; import com.mojang.authlib.ProfileLookupCallback; import com.mojang.authlib.yggdrasil.ProfileNotFoundException; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.UUID; import javax.annotation.Nullable; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import static org.torch.server.TorchServer.logger; public class NameReferencingFileConverter { private static final Logger e = logger; public static final File a = new File("banned-ips.txt"); public static final File b = new File("banned-players.txt"); public static final File c = new File("ops.txt"); public static final File d = new File("white-list.txt"); static List<String> a(File file, Map<String, String[]> map) throws IOException { List list = Files.readLines(file, Charsets.UTF_8); Iterator iterator = list.iterator(); while (iterator.hasNext()) { String s = (String) iterator.next(); s = s.trim(); if (!s.startsWith("#") && s.length() >= 1) { String[] astring = s.split("\\|"); map.put(astring[0].toLowerCase(Locale.ROOT), astring); } } return list; } private static void a(MinecraftServer minecraftserver, Collection<String> collection, ProfileLookupCallback profilelookupcallback) { String[] astring = Iterators.toArray(Iterators.filter(collection.iterator(), new Predicate() { public boolean a(@Nullable String s) { return !UtilColor.b(s); } @Override public boolean apply(@Nullable Object object) { return this.a((String) object); } }), String.class); if (minecraftserver.getOnlineMode() || (org.spigotmc.SpigotConfig.bungee && com.destroystokyo.paper.PaperConfig.bungeeOnlineMode)) { // Spigot: bungee = online mode, for now. // Paper - Handle via setting minecraftserver.getGameProfileRepository().findProfilesByNames(astring, Agent.MINECRAFT, profilelookupcallback); } else { String[] astring1 = astring; int i = astring.length; for (int j = 0; j < i; ++j) { String s = astring1[j]; UUID uuid = EntityHuman.a(new GameProfile((UUID) null, s)); GameProfile gameprofile = new GameProfile(uuid, s); profilelookupcallback.onProfileLookupSucceeded(gameprofile); } } } public static boolean a(final MinecraftServer minecraftserver) { final GameProfileBanList gameprofilebanlist = new GameProfileBanList(PlayerList.a); if (NameReferencingFileConverter.b.exists() && NameReferencingFileConverter.b.isFile()) { if (gameprofilebanlist.c().exists()) { try { gameprofilebanlist.load(); // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace } catch (IOException filenotfoundexception) { logger.warn("Could not load existing file {}", new Object[] { gameprofilebanlist.c().getName()}); } } try { final Map hashmap = HashObjObjMaps.newMutableMap(); a(NameReferencingFileConverter.b, hashmap); ProfileLookupCallback profilelookupcallback = new ProfileLookupCallback() { @Override public void onProfileLookupSucceeded(GameProfile gameprofile) { minecraftserver.getUserCache().getReactor().offerCache(gameprofile); String[] astring = (String[]) hashmap.get(gameprofile.getName().toLowerCase(Locale.ROOT)); if (astring == null) { logger.warn("Could not convert user banlist entry for {}", new Object[] { gameprofile.getName()}); throw new NameReferencingFileConverter.FileConversionException("Profile not in the conversionlist", null); } else { Date date = astring.length > 1 ? NameReferencingFileConverter.b(astring[1], (Date) null) : null; String s = astring.length > 2 ? astring[2] : null; Date date1 = astring.length > 3 ? NameReferencingFileConverter.b(astring[3], (Date) null) : null; String s1 = astring.length > 4 ? astring[4] : null; gameprofilebanlist.add(new GameProfileBanEntry(gameprofile, date, s, date1, s1)); } } @Override public void onProfileLookupFailed(GameProfile gameprofile, Exception exception) { logger.warn("Could not lookup user banlist entry for {}", new Object[] { gameprofile.getName(), exception}); if (!(exception instanceof ProfileNotFoundException)) { throw new NameReferencingFileConverter.FileConversionException("Could not request user " + gameprofile.getName() + " from backend systems", exception, null); } } }; a(minecraftserver, hashmap.keySet(), profilelookupcallback); gameprofilebanlist.save(); c(NameReferencingFileConverter.b); return true; } catch (IOException ioexception) { logger.warn("Could not read old user banlist to convert it!", ioexception); return false; } catch (NameReferencingFileConverter.FileConversionException namereferencingfileconverter_fileconversionexception) { logger.error("Conversion failed, please try again later", namereferencingfileconverter_fileconversionexception); return false; } } else { return true; } } public static boolean b(MinecraftServer minecraftserver) { IpBanList ipbanlist = new IpBanList(PlayerList.b); if (NameReferencingFileConverter.a.exists() && NameReferencingFileConverter.a.isFile()) { if (ipbanlist.c().exists()) { try { ipbanlist.load(); // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace } catch (IOException filenotfoundexception) { logger.warn("Could not load existing file {}", new Object[] { ipbanlist.c().getName()}); } } try { Map hashmap = HashObjObjMaps.newMutableMap(); a(NameReferencingFileConverter.a, hashmap); Iterator iterator = hashmap.keySet().iterator(); while (iterator.hasNext()) { String s = (String) iterator.next(); String[] astring = (String[]) hashmap.get(s); Date date = astring.length > 1 ? b(astring[1], (Date) null) : null; String s1 = astring.length > 2 ? astring[2] : null; Date date1 = astring.length > 3 ? b(astring[3], (Date) null) : null; String s2 = astring.length > 4 ? astring[4] : null; ipbanlist.add(new IpBanEntry(s, date, s1, date1, s2)); } ipbanlist.save(); c(NameReferencingFileConverter.a); return true; } catch (IOException ioexception) { logger.warn("Could not parse old ip banlist to convert it!", ioexception); return false; } } else { return true; } } public static boolean c(final MinecraftServer minecraftserver) { final OpList oplist = new OpList(PlayerList.c); if (NameReferencingFileConverter.c.exists() && NameReferencingFileConverter.c.isFile()) { if (oplist.c().exists()) { try { oplist.load(); // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace } catch (IOException filenotfoundexception) { logger.warn("Could not load existing file {}", new Object[] { oplist.c().getName()}); } } try { List list = Files.readLines(NameReferencingFileConverter.c, Charsets.UTF_8); ProfileLookupCallback profilelookupcallback = new ProfileLookupCallback() { @Override public void onProfileLookupSucceeded(GameProfile gameprofile) { minecraftserver.getUserCache().getReactor().offerCache(gameprofile); oplist.add(new OpListEntry(gameprofile, minecraftserver.q(), false)); } @Override public void onProfileLookupFailed(GameProfile gameprofile, Exception exception) { logger.warn("Could not lookup oplist entry for {}", new Object[] { gameprofile.getName(), exception}); if (!(exception instanceof ProfileNotFoundException)) { throw new NameReferencingFileConverter.FileConversionException("Could not request user " + gameprofile.getName() + " from backend systems", exception, null); } } }; a(minecraftserver, list, profilelookupcallback); oplist.save(); c(NameReferencingFileConverter.c); return true; } catch (IOException ioexception) { logger.warn("Could not read old oplist to convert it!", ioexception); return false; } catch (NameReferencingFileConverter.FileConversionException namereferencingfileconverter_fileconversionexception) { logger.error("Conversion failed, please try again later", namereferencingfileconverter_fileconversionexception); return false; } } else { return true; } } public static boolean d(final MinecraftServer minecraftserver) { final WhiteList whitelist = new WhiteList(PlayerList.d); if (NameReferencingFileConverter.d.exists() && NameReferencingFileConverter.d.isFile()) { if (whitelist.c().exists()) { try { whitelist.load(); // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace } catch (IOException filenotfoundexception) { logger.warn("Could not load existing file {}", new Object[] { whitelist.c().getName()}); } } try { List list = Files.readLines(NameReferencingFileConverter.d, Charsets.UTF_8); ProfileLookupCallback profilelookupcallback = new ProfileLookupCallback() { @Override public void onProfileLookupSucceeded(GameProfile gameprofile) { minecraftserver.getUserCache().getReactor().offerCache(gameprofile); whitelist.add(new WhiteListEntry(gameprofile)); } @Override public void onProfileLookupFailed(GameProfile gameprofile, Exception exception) { logger.warn("Could not lookup user whitelist entry for {}", new Object[] { gameprofile.getName(), exception}); if (!(exception instanceof ProfileNotFoundException)) { throw new NameReferencingFileConverter.FileConversionException("Could not request user " + gameprofile.getName() + " from backend systems", exception, null); } } }; a(minecraftserver, list, profilelookupcallback); whitelist.save(); c(NameReferencingFileConverter.d); return true; } catch (IOException ioexception) { logger.warn("Could not read old whitelist to convert it!", ioexception); return false; } catch (NameReferencingFileConverter.FileConversionException namereferencingfileconverter_fileconversionexception) { logger.error("Conversion failed, please try again later", namereferencingfileconverter_fileconversionexception); return false; } } else { return true; } } public static String a(final MinecraftServer minecraftserver, String s) { if (!UtilColor.b(s) && s.length() <= 16) { GameProfile gameprofile = minecraftserver.getUserCache().getReactor().requestProfile(s); if (gameprofile != null && gameprofile.getId() != null) { return gameprofile.getId().toString(); } else if (!minecraftserver.R() && minecraftserver.getOnlineMode()) { final ArrayList arraylist = Lists.newArrayList(); ProfileLookupCallback profilelookupcallback = new ProfileLookupCallback() { @Override public void onProfileLookupSucceeded(GameProfile gameprofile) { minecraftserver.getUserCache().getReactor().offerCache(gameprofile); arraylist.add(gameprofile); } @Override public void onProfileLookupFailed(GameProfile gameprofile, Exception exception) { logger.warn("Could not lookup user whitelist entry for {}", new Object[] { gameprofile.getName(), exception}); } }; a(minecraftserver, Lists.newArrayList(new String[] { s}), profilelookupcallback); return !arraylist.isEmpty() && ((GameProfile) arraylist.get(0)).getId() != null ? ((GameProfile) arraylist.get(0)).getId().toString() : ""; } else { return EntityHuman.a(new GameProfile((UUID) null, s)).toString(); } } else { return s; } } public static boolean a(final DedicatedServer dedicatedserver, PropertyManager propertymanager) { final File file = d(propertymanager); final File file1 = new File(file.getParentFile(), "playerdata"); final File file2 = new File(file.getParentFile(), "unknownplayers"); if (file.exists() && file.isDirectory()) { File[] afile = file.listFiles(); ArrayList arraylist = Lists.newArrayList(); File[] afile1 = afile; int i = afile.length; for (int j = 0; j < i; ++j) { File file3 = afile1[j]; String s = file3.getName(); if (s.toLowerCase(Locale.ROOT).endsWith(".dat")) { String s1 = s.substring(0, s.length() - ".dat".length()); if (!s1.isEmpty()) { arraylist.add(s1); } } } try { final String[] astring = (String[]) arraylist.toArray(new String[arraylist.size()]); ProfileLookupCallback profilelookupcallback = new ProfileLookupCallback() { @Override public void onProfileLookupSucceeded(GameProfile gameprofile) { dedicatedserver.getUserCache().getReactor().offerCache(gameprofile); UUID uuid = gameprofile.getId(); if (uuid == null) { throw new NameReferencingFileConverter.FileConversionException("Missing UUID for user profile " + gameprofile.getName(), null); } else { this.a(file, this.a(gameprofile), uuid.toString()); } } @Override public void onProfileLookupFailed(GameProfile gameprofile, Exception exception) { logger.warn("Could not lookup user uuid for {}", new Object[] { gameprofile.getName(), exception}); if (exception instanceof ProfileNotFoundException) { String s = this.a(gameprofile); this.a(file, s, s); } else { throw new NameReferencingFileConverter.FileConversionException("Could not request user " + gameprofile.getName() + " from backend systems", exception, null); } } private void a(File file, String s, String s1) { File file1 = new File(file2, s + ".dat"); File file3 = new File(file, s1 + ".dat"); // CraftBukkit start - Use old file name to seed lastKnownName NBTTagCompound root = null; try { root = NBTCompressedStreamTools.a(new java.io.FileInputStream(file1)); } catch (Exception exception) { exception.printStackTrace(); ServerInternalException.reportInternalException(exception); // Paper } if (root != null) { if (!root.hasKey("bukkit")) { root.set("bukkit", new NBTTagCompound()); } NBTTagCompound data = root.getCompound("bukkit"); data.setString("lastKnownName", s); try { NBTCompressedStreamTools.a(root, new java.io.FileOutputStream(file2)); } catch (Exception exception) { exception.printStackTrace(); ServerInternalException.reportInternalException(exception); // Paper } } // CraftBukkit end NameReferencingFileConverter.b(file); if (!file1.renameTo(file3)) { throw new NameReferencingFileConverter.FileConversionException("Could not convert file for " + s, null); } } private String a(GameProfile gameprofile) { String s = null; // String[] astring = astring1; // CraftBukkit - decompile error int i = astring.length; for (int j = 0; j < i; ++j) { String s1 = astring[j]; if (s1 != null && s1.equalsIgnoreCase(gameprofile.getName())) { s = s1; break; } } if (s == null) { throw new NameReferencingFileConverter.FileConversionException("Could not find the filename for " + gameprofile.getName() + " anymore", null); } else { return s; } } }; a(dedicatedserver, Lists.newArrayList(astring), profilelookupcallback); return true; } catch (NameReferencingFileConverter.FileConversionException namereferencingfileconverter_fileconversionexception) { logger.error("Conversion failed, please try again later", namereferencingfileconverter_fileconversionexception); return false; } } else { return true; } } private static void b(File file) { if (file.exists()) { if (!file.isDirectory()) { throw new NameReferencingFileConverter.FileConversionException("Can\'t create directory " + file.getName() + " in world save directory.", null); } } else if (!file.mkdirs()) { throw new NameReferencingFileConverter.FileConversionException("Can\'t create directory " + file.getName() + " in world save directory.", null); } } public static boolean a(PropertyManager propertymanager) { boolean flag = b(propertymanager); flag = flag && c(propertymanager); return flag; } private static boolean b(PropertyManager propertymanager) { boolean flag = false; if (NameReferencingFileConverter.b.exists() && NameReferencingFileConverter.b.isFile()) { flag = true; } boolean flag1 = false; if (NameReferencingFileConverter.a.exists() && NameReferencingFileConverter.a.isFile()) { flag1 = true; } boolean flag2 = false; if (NameReferencingFileConverter.c.exists() && NameReferencingFileConverter.c.isFile()) { flag2 = true; } boolean flag3 = false; if (NameReferencingFileConverter.d.exists() && NameReferencingFileConverter.d.isFile()) { flag3 = true; } if (!flag && !flag1 && !flag2 && !flag3) { return true; } else { logger.warn("**** FAILED TO START THE SERVER AFTER ACCOUNT CONVERSION!"); logger.warn("** please remove the following files and restart the server:"); if (flag) { logger.warn("* {}", new Object[] { NameReferencingFileConverter.b.getName()}); } if (flag1) { logger.warn("* {}", new Object[] { NameReferencingFileConverter.a.getName()}); } if (flag2) { logger.warn("* {}", new Object[] { NameReferencingFileConverter.c.getName()}); } if (flag3) { logger.warn("* {}", new Object[] { NameReferencingFileConverter.d.getName()}); } return false; } } private static boolean c(PropertyManager propertymanager) { File file = d(propertymanager); if (file.exists() && file.isDirectory() && (file.list().length > 0 || !file.delete())) { logger.warn("**** DETECTED OLD PLAYER DIRECTORY IN THE WORLD SAVE"); logger.warn("**** THIS USUALLY HAPPENS WHEN THE AUTOMATIC CONVERSION FAILED IN SOME WAY"); logger.warn("** please restart the server and if the problem persists, remove the directory \'{}\'", new Object[] { file.getPath()}); return false; } else { return true; } } private static File d(PropertyManager propertymanager) { String s = propertymanager.getString("level-name", "world"); File file = new File(MinecraftServer.getServer().server.getWorldContainer(), s); // CraftBukkit - Respect container setting return new File(file, "players"); } private static void c(File file) { File file1 = new File(file.getName() + ".converted"); file.renameTo(file1); } private static Date b(String s, Date date) { Date date1; try { date1 = ExpirableListEntry.a.parse(s); } catch (ParseException parseexception) { date1 = date; } return date1; } static class FileConversionException extends RuntimeException { private FileConversionException(String s, Throwable throwable) { super(s, throwable); } private FileConversionException(String s) { super(s); } FileConversionException(String s, Object object) { this(s); } FileConversionException(String s, Throwable throwable, Object object) { this(s, throwable); } } }