From f1d5f3df28471702180d6e16e5ebdb704a08fa93 Mon Sep 17 00:00:00 2001 From: ljacqu Date: Sat, 2 Jul 2016 15:18:13 +0200 Subject: [PATCH] Merge conversion classes to one class per conversion type - Fix issues in #736 using service getters --- .../executable/authme/ConverterCommand.java | 7 +- .../authme/converter/vAuthConverter.java | 67 +++++++-- .../authme/converter/vAuthFileReader.java | 83 ----------- .../authme/converter/xAuthConverter.java | 132 ++++++++++++++++- .../xephi/authme/converter/xAuthToFlat.java | 136 ------------------ 5 files changed, 189 insertions(+), 236 deletions(-) delete mode 100644 src/main/java/fr/xephi/authme/converter/vAuthFileReader.java delete mode 100644 src/main/java/fr/xephi/authme/converter/xAuthToFlat.java diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/ConverterCommand.java b/src/main/java/fr/xephi/authme/command/executable/authme/ConverterCommand.java index e18c9dc4e..fef7cfb38 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/ConverterCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/ConverterCommand.java @@ -1,6 +1,7 @@ package fr.xephi.authme.command.executable.authme; import com.google.common.annotations.VisibleForTesting; +import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.command.CommandService; import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.converter.Converter; @@ -51,7 +52,11 @@ public class ConverterCommand implements ExecutableCommand { bukkitService.runTaskAsynchronously(new Runnable() { @Override public void run() { - converter.execute(sender); + try { + converter.execute(sender); + } catch (Exception e) { + ConsoleLogger.logException("Error during conversion:", e); + } } }); diff --git a/src/main/java/fr/xephi/authme/converter/vAuthConverter.java b/src/main/java/fr/xephi/authme/converter/vAuthConverter.java index 7c6f3ea5d..9c116f02c 100644 --- a/src/main/java/fr/xephi/authme/converter/vAuthConverter.java +++ b/src/main/java/fr/xephi/authme/converter/vAuthConverter.java @@ -1,28 +1,77 @@ package fr.xephi.authme.converter; -import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.cache.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.DataFolder; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import javax.inject.Inject; +import java.io.File; +import java.io.IOException; +import java.util.Scanner; +import java.util.UUID; + +import static fr.xephi.authme.util.StringUtils.makePath; public class vAuthConverter implements Converter { - private final AuthMe plugin; + private final DataSource dataSource; + private final File vAuthPasswordsFile; @Inject - vAuthConverter(AuthMe plugin) { - this.plugin = plugin; + vAuthConverter(@DataFolder File dataFolder, DataSource dataSource) { + vAuthPasswordsFile = new File(dataFolder.getParent(), makePath("vAuth", "passwords.yml")); + this.dataSource = dataSource; } @Override public void execute(CommandSender sender) { - try { - new vAuthFileReader(plugin).convert(); - } catch (Exception e) { - sender.sendMessage(e.getMessage()); - ConsoleLogger.showError(e.getMessage()); + try (Scanner scanner = new Scanner(vAuthPasswordsFile)) { + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + String name = line.split(": ")[0]; + String password = line.split(": ")[1]; + PlayerAuth auth; + if (isUuidInstance(password)) { + String pname; + try { + pname = Bukkit.getOfflinePlayer(UUID.fromString(name)).getName(); + } catch (Exception | NoSuchMethodError e) { + pname = getName(UUID.fromString(name)); + } + if (pname == null) + continue; + auth = PlayerAuth.builder() + .name(pname.toLowerCase()) + .realName(pname) + .password(password, null).build(); + } else { + auth = PlayerAuth.builder() + .name(name.toLowerCase()) + .realName(name) + .password(password, null).build(); + } + dataSource.saveAuth(auth); + } + } catch (IOException e) { + ConsoleLogger.logException("Error while trying to import some vAuth data", e); } } + private static boolean isUuidInstance(String s) { + return s.length() > 8 && s.charAt(8) == '-'; + } + + private String getName(UUID uuid) { + for (OfflinePlayer op : Bukkit.getOfflinePlayers()) { + if (op.getUniqueId().compareTo(uuid) == 0) { + return op.getName(); + } + } + return null; + } + } diff --git a/src/main/java/fr/xephi/authme/converter/vAuthFileReader.java b/src/main/java/fr/xephi/authme/converter/vAuthFileReader.java deleted file mode 100644 index 4c5b3b4f2..000000000 --- a/src/main/java/fr/xephi/authme/converter/vAuthFileReader.java +++ /dev/null @@ -1,83 +0,0 @@ -package fr.xephi.authme.converter; - -import fr.xephi.authme.AuthMe; -import fr.xephi.authme.ConsoleLogger; -import fr.xephi.authme.cache.auth.PlayerAuth; -import fr.xephi.authme.datasource.DataSource; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; - -import java.io.File; -import java.io.IOException; -import java.util.Scanner; -import java.util.UUID; - -import static fr.xephi.authme.util.StringUtils.makePath; - -class vAuthFileReader { - - private final AuthMe plugin; - private final DataSource database; - - /** - * Constructor for vAuthFileReader. - * - * @param plugin AuthMe - */ - public vAuthFileReader(AuthMe plugin) { - this.plugin = plugin; - this.database = plugin.getDataSource(); - } - - public void convert() { - final File file = new File(plugin.getDataFolder().getParent(), makePath("vAuth", "passwords.yml")); - Scanner scanner; - try { - scanner = new Scanner(file); - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - String name = line.split(": ")[0]; - String password = line.split(": ")[1]; - PlayerAuth auth; - if (isUuidInstance(password)) { - String pname; - try { - pname = Bukkit.getOfflinePlayer(UUID.fromString(name)).getName(); - } catch (Exception | NoSuchMethodError e) { - pname = getName(UUID.fromString(name)); - } - if (pname == null) - continue; - auth = PlayerAuth.builder() - .name(pname.toLowerCase()) - .realName(pname) - .password(password, null).build(); - } else { - auth = PlayerAuth.builder() - .name(name.toLowerCase()) - .realName(name) - .password(password, null).build(); - } - database.saveAuth(auth); - } - scanner.close(); - } catch (IOException e) { - ConsoleLogger.logException("Error while trying to import some vAuth data", e); - } - - } - - private static boolean isUuidInstance(String s) { - return s.length() > 8 && s.charAt(8) == '-'; - } - - private String getName(UUID uuid) { - for (OfflinePlayer op : Bukkit.getOfflinePlayers()) { - if (op.getUniqueId().compareTo(uuid) == 0) { - return op.getName(); - } - } - return null; - } - -} diff --git a/src/main/java/fr/xephi/authme/converter/xAuthConverter.java b/src/main/java/fr/xephi/authme/converter/xAuthConverter.java index 6fdddbf78..37dfc9fe1 100644 --- a/src/main/java/fr/xephi/authme/converter/xAuthConverter.java +++ b/src/main/java/fr/xephi/authme/converter/xAuthConverter.java @@ -1,28 +1,146 @@ package fr.xephi.authme.converter; -import fr.xephi.authme.AuthMe; +import de.luricos.bukkit.xAuth.database.DatabaseTables; +import de.luricos.bukkit.xAuth.utils.xAuthLog; +import de.luricos.bukkit.xAuth.xAuth; +import fr.xephi.authme.cache.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.initialization.DataFolder; +import fr.xephi.authme.util.CollectionUtils; import org.bukkit.command.CommandSender; +import org.bukkit.plugin.PluginManager; import javax.inject.Inject; +import java.io.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import static fr.xephi.authme.util.StringUtils.makePath; public class xAuthConverter implements Converter { - private final AuthMe plugin; - @Inject - xAuthConverter(AuthMe plugin) { - this.plugin = plugin; + @DataFolder + private File dataFolder; + @Inject + private DataSource database; + @Inject + private PluginManager pluginManager; + + xAuthConverter() { } @Override public void execute(CommandSender sender) { try { Class.forName("de.luricos.bukkit.xAuth.xAuth"); - xAuthToFlat converter = new xAuthToFlat(plugin, sender); - converter.convert(); + convert(sender); } catch (ClassNotFoundException ce) { sender.sendMessage("xAuth has not been found, please put xAuth.jar in your plugin folder and restart!"); } } + private void convert(CommandSender sender) { + if (pluginManager.getPlugin("xAuth") == null) { + sender.sendMessage("[AuthMe] xAuth plugin not found"); + return; + } + // TODO ljacqu 20160702: xAuthDb is not used except for the existence check -- is this intended? + File xAuthDb = new File(dataFolder.getParent(), makePath("xAuth", "xAuth.h2.db")); + if (!xAuthDb.exists()) { + sender.sendMessage("[AuthMe] xAuth H2 database not found, checking for MySQL or SQLite data..."); + } + List players = getXAuthPlayers(); + if (CollectionUtils.isEmpty(players)) { + sender.sendMessage("[AuthMe] Error while importing xAuthPlayers: did not find any players"); + return; + } + sender.sendMessage("[AuthMe] Starting import..."); + + for (int id : players) { + String pl = getIdPlayer(id); + String psw = getPassword(id); + if (psw != null && !psw.isEmpty() && pl != null) { + PlayerAuth auth = PlayerAuth.builder() + .name(pl.toLowerCase()) + .realName(pl) + .password(psw, null).build(); + database.saveAuth(auth); + } + } + sender.sendMessage("[AuthMe] Successfully converted from xAuth database"); + } + + private String getIdPlayer(int id) { + String realPass = ""; + Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = String.format("SELECT `playername` FROM `%s` WHERE `id` = ?", + xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); + ps = conn.prepareStatement(sql); + ps.setInt(1, id); + rs = ps.executeQuery(); + if (!rs.next()) + return null; + realPass = rs.getString("playername").toLowerCase(); + } catch (SQLException e) { + xAuthLog.severe("Failed to retrieve name for account: " + id, e); + return null; + } finally { + xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); + } + return realPass; + } + + private List getXAuthPlayers() { + List xP = new ArrayList<>(); + Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = String.format("SELECT * FROM `%s`", + xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + while (rs.next()) { + xP.add(rs.getInt("id")); + } + } catch (SQLException e) { + xAuthLog.severe("Cannot import xAuthPlayers", e); + return new ArrayList<>(); + } finally { + xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); + } + return xP; + } + + private String getPassword(int accountId) { + String realPass = ""; + Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = String.format("SELECT `password`, `pwtype` FROM `%s` WHERE `id` = ?", + xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); + ps = conn.prepareStatement(sql); + ps.setInt(1, accountId); + rs = ps.executeQuery(); + if (!rs.next()) + return null; + realPass = rs.getString("password"); + } catch (SQLException e) { + xAuthLog.severe("Failed to retrieve password hash for account: " + accountId, e); + return null; + } finally { + xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); + } + return realPass; + } + } diff --git a/src/main/java/fr/xephi/authme/converter/xAuthToFlat.java b/src/main/java/fr/xephi/authme/converter/xAuthToFlat.java deleted file mode 100644 index 34ec2a5ee..000000000 --- a/src/main/java/fr/xephi/authme/converter/xAuthToFlat.java +++ /dev/null @@ -1,136 +0,0 @@ -package fr.xephi.authme.converter; - -import de.luricos.bukkit.xAuth.database.DatabaseTables; -import de.luricos.bukkit.xAuth.utils.xAuthLog; -import de.luricos.bukkit.xAuth.xAuth; -import fr.xephi.authme.AuthMe; -import fr.xephi.authme.ConsoleLogger; -import fr.xephi.authme.cache.auth.PlayerAuth; -import fr.xephi.authme.datasource.DataSource; -import fr.xephi.authme.util.CollectionUtils; -import org.bukkit.command.CommandSender; - -import java.io.File; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -class xAuthToFlat { - - private final AuthMe instance; - private final DataSource database; - private final CommandSender sender; - - public xAuthToFlat(AuthMe instance, CommandSender sender) { - this.instance = instance; - this.database = instance.getDataSource(); - this.sender = sender; - } - - public boolean convert() { - if (instance.getServer().getPluginManager().getPlugin("xAuth") == null) { - sender.sendMessage("[AuthMe] xAuth plugin not found"); - return false; - } - File xAuthDb = new File(instance.getDataFolder().getParent(), "xAuth" + File.separator + "xAuth.h2.db"); - if (!xAuthDb.exists()) { - sender.sendMessage("[AuthMe] xAuth H2 database not found, checking for MySQL or SQLite data..."); - } - List players = getXAuthPlayers(); - if (CollectionUtils.isEmpty(players)) { - sender.sendMessage("[AuthMe] Error while importing xAuthPlayers: did not find any players"); - return false; - } - sender.sendMessage("[AuthMe] Starting import..."); - try { - for (int id : players) { - String pl = getIdPlayer(id); - String psw = getPassword(id); - if (psw != null && !psw.isEmpty() && pl != null) { - PlayerAuth auth = PlayerAuth.builder() - .name(pl.toLowerCase()) - .realName(pl) - .password(psw, null).build(); - database.saveAuth(auth); - } - } - sender.sendMessage("[AuthMe] Successfully converted from xAuth database"); - } catch (Exception e) { - sender.sendMessage("[AuthMe] An error has occurred while importing the xAuth database." - + " The import may have succeeded partially."); - ConsoleLogger.logException("Error during xAuth database import", e); - } - return true; - } - - private String getIdPlayer(int id) { - String realPass = ""; - Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); - PreparedStatement ps = null; - ResultSet rs = null; - try { - String sql = String.format("SELECT `playername` FROM `%s` WHERE `id` = ?", - xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); - ps = conn.prepareStatement(sql); - ps.setInt(1, id); - rs = ps.executeQuery(); - if (!rs.next()) - return null; - realPass = rs.getString("playername").toLowerCase(); - } catch (SQLException e) { - xAuthLog.severe("Failed to retrieve name for account: " + id, e); - return null; - } finally { - xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); - } - return realPass; - } - - private List getXAuthPlayers() { - List xP = new ArrayList<>(); - Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); - PreparedStatement ps = null; - ResultSet rs = null; - try { - String sql = String.format("SELECT * FROM `%s`", - xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); - ps = conn.prepareStatement(sql); - rs = ps.executeQuery(); - while (rs.next()) { - xP.add(rs.getInt("id")); - } - } catch (SQLException e) { - xAuthLog.severe("Cannot import xAuthPlayers", e); - return new ArrayList<>(); - } finally { - xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); - } - return xP; - } - - private String getPassword(int accountId) { - String realPass = ""; - Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); - PreparedStatement ps = null; - ResultSet rs = null; - try { - String sql = String.format("SELECT `password`, `pwtype` FROM `%s` WHERE `id` = ?", - xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); - ps = conn.prepareStatement(sql); - ps.setInt(1, accountId); - rs = ps.executeQuery(); - if (!rs.next()) - return null; - realPass = rs.getString("password"); - } catch (SQLException e) { - xAuthLog.severe("Failed to retrieve password hash for account: " + accountId, e); - return null; - } finally { - xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); - } - return realPass; - } -}