diff --git a/docs/translations.md b/docs/translations.md index c4288f152..42170005f 100644 --- a/docs/translations.md +++ b/docs/translations.md @@ -1,5 +1,5 @@ - + # AuthMe Translations The following translations are available in AuthMe. Set `messagesLanguage` to the language code @@ -9,7 +9,7 @@ Code | Language | Translated |   ---- | -------- | ---------: | ------ [en](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_en.yml) | English | 100% | bar [bg](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_bg.yml) | Bulgarian | 71% | bar -[br](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_br.yml) | Brazilian | 97% | bar +[br](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_br.yml) | Brazilian | 100% | bar [cz](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_cz.yml) | Czech | 88% | bar [de](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_de.yml) | German | 95% | bar [es](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_es.yml) | Spanish | 97% | bar @@ -17,15 +17,15 @@ Code | Language | Translated |   [fi](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_fi.yml) | Finnish | 68% | bar [fr](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_fr.yml) | French | 95% | bar [gl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_gl.yml) | Galician | 72% | bar -[hu](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_hu.yml) | Hungarian | 97% | bar +[hu](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_hu.yml) | Hungarian | 100% | bar [id](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_id.yml) | Indonesian | 72% | bar [it](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_it.yml) | Italian | 100% | bar [ko](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ko.yml) | Korean | 74% | bar [lt](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_lt.yml) | Latvian | 55% | bar [nl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_nl.yml) | Dutch | 78% | bar -[pl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_pl.yml) | Polish | 92% | bar +[pl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_pl.yml) | Polish | 99% | bar [pt](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_pt.yml) | Portuguese | 88% | bar -[ru](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ru.yml) | Russian | 95% | bar +[ru](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ru.yml) | Russian | 100% | bar [sk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_sk.yml) | Slovakian | 49% | bar [tr](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_tr.yml) | Turkish | 83% | bar [uk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_uk.yml) | Ukrainian | 95% | bar @@ -34,6 +34,7 @@ Code | Language | Translated |   [zhhk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhhk.yml) | Chinese (Hong Kong) | 83% | bar [zhtw](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhtw.yml) | Chinese (Taiwan) | 83% | bar + --- -This page was automatically generated on the [AuthMe/AuthMeReloaded repository](https://github.com/AuthMe/AuthMeReloaded/tree/master/docs/) on Sun Oct 23 18:25:14 CEST 2016 +This page was automatically generated on the [AuthMe/AuthMeReloaded repository](https://github.com/AuthMe/AuthMeReloaded/tree/master/docs/) on Sat Nov 19 11:44:25 CET 2016 diff --git a/pom.xml b/pom.xml index edf73b76a..44196e876 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ Xephi, sgdc3, DNx5, timvisee, games647, ljacqu, Gnat008 - 1.10.2-R0.1-SNAPSHOT + 1.11-R0.1-SNAPSHOT diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java index 786203073..74a986543 100644 --- a/src/main/java/fr/xephi/authme/AuthMe.java +++ b/src/main/java/fr/xephi/authme/AuthMe.java @@ -17,6 +17,7 @@ import fr.xephi.authme.initialization.TaskCloser; import fr.xephi.authme.listener.BlockListener; import fr.xephi.authme.listener.EntityListener; import fr.xephi.authme.listener.PlayerListener; +import fr.xephi.authme.listener.PlayerListener111; import fr.xephi.authme.listener.PlayerListener16; import fr.xephi.authme.listener.PlayerListener18; import fr.xephi.authme.listener.PlayerListener19; @@ -40,9 +41,9 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.PluginDescriptionFile; -import org.bukkit.plugin.PluginLoader; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.java.JavaPluginLoader; import org.bukkit.scheduler.BukkitScheduler; import java.io.File; @@ -60,7 +61,7 @@ public class AuthMe extends JavaPlugin { private static final String LOG_FILENAME = "authme.log"; private static final int CLEANUP_INTERVAL = 5 * TICKS_PER_MINUTE; - // Default version and build number values; + // Default version and build number values private static String pluginVersion = "N/D"; private static String pluginBuildNumber = "Unknown"; @@ -85,9 +86,8 @@ public class AuthMe extends JavaPlugin { */ @VisibleForTesting @SuppressWarnings("deprecation") // the super constructor is deprecated to mark it for unit testing only - protected AuthMe(final PluginLoader loader, final Server server, final PluginDescriptionFile description, - final File dataFolder, final File file) { - super(loader, server, description, dataFolder, file); + protected AuthMe(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { + super(loader, description, dataFolder, file); } /** @@ -132,7 +132,7 @@ public class AuthMe extends JavaPlugin { @Override public void onEnable() { // Load the plugin version data from the plugin description file - loadPluginInfo(); + loadPluginInfo(getDescription().getVersion()); // Initialize the plugin try { @@ -175,9 +175,10 @@ public class AuthMe extends JavaPlugin { /** * Load the version and build number of the plugin from the description file. + * + * @param versionRaw the version as given by the plugin description file */ - private void loadPluginInfo() { - String versionRaw = this.getDescription().getVersion(); + private static void loadPluginInfo(String versionRaw) { int index = versionRaw.lastIndexOf("-"); if (index != -1) { pluginVersion = versionRaw.substring(0, index); @@ -190,10 +191,8 @@ public class AuthMe extends JavaPlugin { /** * Initialize the plugin and all the services. - * - * @throws Exception if the initialization fails */ - private void initialize() throws Exception { + private void initialize() { // Set the Logger instance and log file path ConsoleLogger.setLogger(getLogger()); ConsoleLogger.setLogFile(new File(getDataFolder(), LOG_FILENAME)); @@ -224,7 +223,7 @@ public class AuthMe extends JavaPlugin { // TODO: does this still make sense? -sgdc3 // If the server is empty (fresh start) just set all the players as unlogged - if (bukkitService.getOnlinePlayers().size() == 0) { + if (bukkitService.getOnlinePlayers().isEmpty()) { database.purgeLogged(); } @@ -302,6 +301,11 @@ public class AuthMe extends JavaPlugin { if (isClassLoaded("org.bukkit.event.player.PlayerSwapHandItemsEvent")) { pluginManager.registerEvents(injector.getSingleton(PlayerListener19.class), this); } + + // Register listener for 1.11 events if available + if (isClassLoaded("org.bukkit.event.entity.EntityAirChangeEvent")) { + pluginManager.registerEvents(injector.getSingleton(PlayerListener111.class), this); + } } /** diff --git a/src/main/java/fr/xephi/authme/api/API.java b/src/main/java/fr/xephi/authme/api/API.java index 7fa027882..d05fbe6b9 100644 --- a/src/main/java/fr/xephi/authme/api/API.java +++ b/src/main/java/fr/xephi/authme/api/API.java @@ -19,12 +19,13 @@ import javax.inject.Inject; /** * Deprecated API of AuthMe. Please use {@link NewAPI} instead. + * + * @deprecated Use {@link NewAPI} */ @Deprecated public class API { - public static final String newline = System.getProperty("line.separator"); - public static AuthMe instance; + private static AuthMe instance; private static DataSource dataSource; private static PasswordSecurity passwordSecurity; private static Management management; @@ -83,28 +84,17 @@ public class API { } public static Location getLastLocation(Player player) { - try { - PlayerAuth auth = PlayerCache.getInstance().getAuth(player.getName().toLowerCase()); + PlayerAuth auth = PlayerCache.getInstance().getAuth(player.getName().toLowerCase()); - if (auth != null) { - Location loc = new Location(Bukkit.getWorld(auth.getWorld()), auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ()); - return loc; - } else { - return null; - } - - } catch (NullPointerException ex) { - return null; + if (auth != null) { + return new Location(Bukkit.getWorld(auth.getWorld()), auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ()); } + return null; } - public static void setPlayerInventory(Player player, ItemStack[] content, - ItemStack[] armor) { - try { - player.getInventory().setContents(content); - player.getInventory().setArmorContents(armor); - } catch (NullPointerException ignored) { - } + public static void setPlayerInventory(Player player, ItemStack[] content, ItemStack[] armor) { + player.getInventory().setContents(content); + player.getInventory().setArmorContents(armor); } /** diff --git a/src/main/java/fr/xephi/authme/api/NewAPI.java b/src/main/java/fr/xephi/authme/api/NewAPI.java index 5805e4afd..82a2483bc 100644 --- a/src/main/java/fr/xephi/authme/api/NewAPI.java +++ b/src/main/java/fr/xephi/authme/api/NewAPI.java @@ -25,8 +25,8 @@ import java.util.List; */ public class NewAPI { - public static NewAPI singleton; - public final AuthMe plugin; + private static NewAPI singleton; + private final AuthMe plugin; private final PluginHookService pluginHookService; private final DataSource dataSource; private final PasswordSecurity passwordSecurity; diff --git a/src/main/java/fr/xephi/authme/command/CommandMapper.java b/src/main/java/fr/xephi/authme/command/CommandMapper.java index e36664929..8e2b1bdc1 100644 --- a/src/main/java/fr/xephi/authme/command/CommandMapper.java +++ b/src/main/java/fr/xephi/authme/command/CommandMapper.java @@ -87,10 +87,10 @@ public class CommandMapper { return classes; } - private FoundCommandResult getCommandWithSmallestDifference(CommandDescription base, List parts) { + private static FoundCommandResult getCommandWithSmallestDifference(CommandDescription base, List parts) { // Return the base command with incorrect arg count error if we only have one part if (parts.size() <= 1) { - return new FoundCommandResult(base, parts, new ArrayList(), 0.0, INCORRECT_ARGUMENTS); + return new FoundCommandResult(base, parts, new ArrayList<>(), 0.0, INCORRECT_ARGUMENTS); } final String childLabel = parts.get(1); @@ -115,7 +115,7 @@ public class CommandMapper { final int partsSize = parts.size(); List labels = parts.subList(0, Math.min(closestCommand.getLabelCount(), partsSize)); List arguments = (labels.size() == partsSize) - ? new ArrayList() + ? new ArrayList<>() : parts.subList(labels.size(), partsSize); return new FoundCommandResult(closestCommand, labels, arguments, minDifference, status); @@ -141,7 +141,7 @@ public class CommandMapper { * * @return A command if there was a complete match (including proper argument count), null otherwise */ - private CommandDescription getSuitableChild(CommandDescription baseCommand, List parts) { + private static CommandDescription getSuitableChild(CommandDescription baseCommand, List parts) { if (CollectionUtils.isEmpty(parts)) { return null; } diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/ChangePasswordAdminCommand.java b/src/main/java/fr/xephi/authme/command/executable/authme/ChangePasswordAdminCommand.java index 9842b9f89..8f3a2b0a3 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/ChangePasswordAdminCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/ChangePasswordAdminCommand.java @@ -54,33 +54,40 @@ public class ChangePasswordAdminCommand implements ExecutableCommand { } // Set the password - final String playerNameLowerCase = playerName.toLowerCase(); - bukkitService.runTaskOptionallyAsync(new Runnable() { + bukkitService.runTaskOptionallyAsync(() -> changePassword(playerName.toLowerCase(), playerPass, sender)); + } - @Override - public void run() { - PlayerAuth auth = null; - if (playerCache.isAuthenticated(playerNameLowerCase)) { - auth = playerCache.getAuth(playerNameLowerCase); - } else if (dataSource.isAuthAvailable(playerNameLowerCase)) { - auth = dataSource.getAuth(playerNameLowerCase); - } - if (auth == null) { - commandService.send(sender, MessageKey.UNKNOWN_USER); - return; - } + /** + * Changes the password of the given player to the given password. + * + * @param nameLowercase the name of the player + * @param password the password to set + * @param sender the sender initiating the password change + */ + private void changePassword(String nameLowercase, String password, CommandSender sender) { + PlayerAuth auth = getAuth(nameLowercase); + if (auth == null) { + commandService.send(sender, MessageKey.UNKNOWN_USER); + return; + } - HashedPassword hashedPassword = passwordSecurity.computeHash(playerPass, playerNameLowerCase); - auth.setPassword(hashedPassword); + HashedPassword hashedPassword = passwordSecurity.computeHash(password, nameLowercase); + auth.setPassword(hashedPassword); - if (dataSource.updatePassword(auth)) { - commandService.send(sender, MessageKey.PASSWORD_CHANGED_SUCCESS); - ConsoleLogger.info(sender.getName() + " changed password of " + playerNameLowerCase); - } else { - commandService.send(sender, MessageKey.ERROR); - } - } + if (dataSource.updatePassword(auth)) { + commandService.send(sender, MessageKey.PASSWORD_CHANGED_SUCCESS); + ConsoleLogger.info(sender.getName() + " changed password of " + nameLowercase); + } else { + commandService.send(sender, MessageKey.ERROR); + } + } - }); + private PlayerAuth getAuth(String nameLowercase) { + if (playerCache.isAuthenticated(nameLowercase)) { + return playerCache.getAuth(nameLowercase); + } else if (dataSource.isAuthAvailable(nameLowercase)) { + return dataSource.getAuth(nameLowercase); + } + return null; } } diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/LastLoginCommand.java b/src/main/java/fr/xephi/authme/command/executable/authme/LastLoginCommand.java index 3c2b8cd5d..67fb25916 100644 --- a/src/main/java/fr/xephi/authme/command/executable/authme/LastLoginCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/authme/LastLoginCommand.java @@ -25,7 +25,7 @@ public class LastLoginCommand implements ExecutableCommand { @Override public void executeCommand(CommandSender sender, List arguments) { // Get the player - String playerName = (arguments.size() >= 1) ? arguments.get(0) : sender.getName(); + String playerName = arguments.isEmpty() ? sender.getName() : arguments.get(0); PlayerAuth auth = dataSource.getAuth(playerName); if (auth == null) { diff --git a/src/main/java/fr/xephi/authme/command/executable/email/ShowEmailCommand.java b/src/main/java/fr/xephi/authme/command/executable/email/ShowEmailCommand.java index ae55c628a..68bc06dd0 100644 --- a/src/main/java/fr/xephi/authme/command/executable/email/ShowEmailCommand.java +++ b/src/main/java/fr/xephi/authme/command/executable/email/ShowEmailCommand.java @@ -23,7 +23,7 @@ public class ShowEmailCommand extends PlayerCommand { @Override public void runCommand(Player player, List arguments) { PlayerAuth auth = playerCache.getAuth(player.getName()); - if (auth.getEmail() != null && !auth.getEmail().equalsIgnoreCase("your@email.com")) { + if (auth.getEmail() != null && !"your@email.com".equalsIgnoreCase(auth.getEmail())) { commandService.send(player, MessageKey.EMAIL_SHOW, auth.getEmail()); } else { commandService.send(player, MessageKey.SHOW_NO_EMAIL); diff --git a/src/main/java/fr/xephi/authme/data/auth/PlayerAuth.java b/src/main/java/fr/xephi/authme/data/auth/PlayerAuth.java index e4fd9230f..f6ef65a7a 100644 --- a/src/main/java/fr/xephi/authme/data/auth/PlayerAuth.java +++ b/src/main/java/fr/xephi/authme/data/auth/PlayerAuth.java @@ -189,7 +189,7 @@ public class PlayerAuth { * @return String */ public String serialize() { - StringBuffer str = new StringBuffer(); + StringBuilder str = new StringBuilder(); char d = ';'; str.append(this.nickname).append(d); str.append(this.realName).append(d); diff --git a/src/main/java/fr/xephi/authme/datasource/FlatFile.java b/src/main/java/fr/xephi/authme/datasource/FlatFile.java index 49b5442d1..8c1ecf4b5 100644 --- a/src/main/java/fr/xephi/authme/datasource/FlatFile.java +++ b/src/main/java/fr/xephi/authme/datasource/FlatFile.java @@ -9,7 +9,6 @@ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Closeable; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; @@ -295,19 +294,11 @@ public class FlatFile implements DataSource { break; } } - } catch (FileNotFoundException ex) { - ConsoleLogger.warning(ex.getMessage()); - return false; } catch (IOException ex) { ConsoleLogger.warning(ex.getMessage()); return false; } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } + silentClose(br); } if (newAuth != null) { removeAuth(auth.getNickname()); @@ -330,19 +321,11 @@ public class FlatFile implements DataSource { } } return countIp; - } catch (FileNotFoundException ex) { - ConsoleLogger.warning(ex.getMessage()); - return new ArrayList<>(); } catch (IOException ex) { ConsoleLogger.warning(ex.getMessage()); return new ArrayList<>(); } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } + silentClose(br); } } @@ -363,12 +346,7 @@ public class FlatFile implements DataSource { } catch (IOException ex) { ConsoleLogger.warning(ex.getMessage()); } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } + silentClose(br); } return 0; } diff --git a/src/main/java/fr/xephi/authme/datasource/MySQL.java b/src/main/java/fr/xephi/authme/datasource/MySQL.java index a099ff44d..20ffa6d53 100644 --- a/src/main/java/fr/xephi/authme/datasource/MySQL.java +++ b/src/main/java/fr/xephi/authme/datasource/MySQL.java @@ -47,7 +47,7 @@ public class MySQL implements DataSource { private int phpBbGroup; private String wordpressPrefix; - public MySQL(Settings settings) throws ClassNotFoundException, SQLException, PoolInitializationException { + public MySQL(Settings settings) throws ClassNotFoundException, SQLException { setParameters(settings); // Set the connection arguments (and check if connection is ok) @@ -102,12 +102,12 @@ public class MySQL implements DataSource { } } - private void setConnectionArguments() throws RuntimeException { + private void setConnectionArguments() { ds = new HikariDataSource(); ds.setPoolName("AuthMeMYSQLPool"); // Pool size - ds.setMaximumPoolSize(poolSize); + ds.setMaximumPoolSize(poolSize); // Database URL ds.setJdbcUrl("jdbc:mysql://" + this.host + ":" + this.port + "/" + this.database); @@ -134,7 +134,7 @@ public class MySQL implements DataSource { } @Override - public void reload() throws RuntimeException { + public void reload() { if (ds != null) { ds.close(); } diff --git a/src/main/java/fr/xephi/authme/datasource/SQLite.java b/src/main/java/fr/xephi/authme/datasource/SQLite.java index d19c4aa22..fdb9c9197 100644 --- a/src/main/java/fr/xephi/authme/datasource/SQLite.java +++ b/src/main/java/fr/xephi/authme/datasource/SQLite.java @@ -3,9 +3,6 @@ package fr.xephi.authme.datasource; import com.google.common.annotations.VisibleForTesting; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.data.auth.PlayerAuth; -import fr.xephi.authme.datasource.Columns; -import fr.xephi.authme.datasource.DataSource; -import fr.xephi.authme.datasource.DataSourceType; import fr.xephi.authme.security.crypts.HashedPassword; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.DatabaseSettings; @@ -397,7 +394,7 @@ public class SQLite implements DataSource { } } - private void close(Statement st) { + private static void close(Statement st) { if (st != null) { try { st.close(); @@ -407,7 +404,7 @@ public class SQLite implements DataSource { } } - private void close(Connection con) { + private static void close(Connection con) { if (con != null) { try { con.close(); @@ -417,7 +414,7 @@ public class SQLite implements DataSource { } } - private void close(ResultSet rs) { + private static void close(ResultSet rs) { if (rs != null) { try { rs.close(); @@ -479,7 +476,7 @@ public class SQLite implements DataSource { pst.setString(1, user); rs = pst.executeQuery(); if (rs.next()) - return (rs.getInt(col.IS_LOGGED) == 1); + return rs.getInt(col.IS_LOGGED) == 1; } catch (SQLException ex) { logSqlException(ex); } finally { diff --git a/src/main/java/fr/xephi/authme/datasource/converter/CrazyLoginConverter.java b/src/main/java/fr/xephi/authme/datasource/converter/CrazyLoginConverter.java index 535c0ebab..13266a891 100644 --- a/src/main/java/fr/xephi/authme/datasource/converter/CrazyLoginConverter.java +++ b/src/main/java/fr/xephi/authme/datasource/converter/CrazyLoginConverter.java @@ -43,20 +43,7 @@ public class CrazyLoginConverter implements Converter { try (BufferedReader users = new BufferedReader(new FileReader(source))) { while ((line = users.readLine()) != null) { if (line.contains("|")) { - String[] args = line.split("\\|"); - if (args.length < 2 || "name".equalsIgnoreCase(args[0])) { - continue; - } - String playerName = args[0]; - String password = args[1]; - if (password != null) { - PlayerAuth auth = PlayerAuth.builder() - .name(playerName.toLowerCase()) - .realName(playerName) - .password(password, null) - .build(); - database.saveAuth(auth); - } + migrateAccount(line); } } ConsoleLogger.info("CrazyLogin database has been imported correctly"); @@ -66,4 +53,26 @@ public class CrazyLoginConverter implements Converter { } } + /** + * Moves an account from CrazyLogin to the AuthMe database. + * + * @param line line read from the CrazyLogin file (one account) + */ + private void migrateAccount(String line) { + String[] args = line.split("\\|"); + if (args.length < 2 || "name".equalsIgnoreCase(args[0])) { + return; + } + String playerName = args[0]; + String password = args[1]; + if (password != null) { + PlayerAuth auth = PlayerAuth.builder() + .name(playerName.toLowerCase()) + .realName(playerName) + .password(password, null) + .build(); + database.saveAuth(auth); + } + } + } diff --git a/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java b/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java index 6141e47ef..1e7862443 100644 --- a/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java +++ b/src/main/java/fr/xephi/authme/initialization/OnShutdownPlayerSaver.java @@ -76,10 +76,8 @@ public class OnShutdownPlayerSaver { dataSource.updateQuitLoc(auth); } if (settings.getProperty(RestrictionSettings.TELEPORT_UNAUTHED_TO_SPAWN) - && !settings.getProperty(RestrictionSettings.NO_TELEPORT)) { - if (!limboPlayerStorage.hasData(player)) { - limboPlayerStorage.saveData(player); - } + && !settings.getProperty(RestrictionSettings.NO_TELEPORT) && !limboPlayerStorage.hasData(player)) { + limboPlayerStorage.saveData(player); } } } diff --git a/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java b/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java index 7e68aae42..e3ff4ec5b 100644 --- a/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java +++ b/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java @@ -170,10 +170,9 @@ class OnJoinVerifier implements Reloadable { public void checkPlayerCountry(boolean isAuthAvailable, String playerIp) throws FailedVerificationException { if ((!isAuthAvailable || settings.getProperty(ProtectionSettings.ENABLE_PROTECTION_REGISTERED)) - && settings.getProperty(ProtectionSettings.ENABLE_PROTECTION)) { - if (!validationService.isCountryAdmitted(playerIp)) { + && settings.getProperty(ProtectionSettings.ENABLE_PROTECTION) + && !validationService.isCountryAdmitted(playerIp)) { throw new FailedVerificationException(MessageKey.COUNTRY_BANNED_ERROR); - } } } diff --git a/src/main/java/fr/xephi/authme/listener/PlayerListener.java b/src/main/java/fr/xephi/authme/listener/PlayerListener.java index 92cf6a841..9b3eda8e9 100644 --- a/src/main/java/fr/xephi/authme/listener/PlayerListener.java +++ b/src/main/java/fr/xephi/authme/listener/PlayerListener.java @@ -42,6 +42,7 @@ import org.bukkit.event.player.PlayerShearEntityEvent; import javax.inject.Inject; import java.util.Iterator; +import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -53,7 +54,7 @@ import static fr.xephi.authme.settings.properties.RestrictionSettings.ALLOW_UNAU */ public class PlayerListener implements Listener { - public static final ConcurrentHashMap joinMessage = new ConcurrentHashMap<>(); + public static final Map joinMessage = new ConcurrentHashMap<>(); @Inject private Settings settings; @@ -81,7 +82,7 @@ public class PlayerListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { String cmd = event.getMessage().split(" ")[0].toLowerCase(); - if (settings.getProperty(HooksSettings.USE_ESSENTIALS_MOTD) && cmd.equals("/motd")) { + if (settings.getProperty(HooksSettings.USE_ESSENTIALS_MOTD) && "/motd".equals(cmd)) { return; } if (settings.getProperty(RestrictionSettings.ALLOW_COMMANDS).contains(cmd)) { @@ -113,7 +114,7 @@ public class PlayerListener implements Listener { iter.remove(); } } - if (recipients.size() == 0) { + if (recipients.isEmpty()) { event.setCancelled(true); } } @@ -224,7 +225,7 @@ public class PlayerListener implements Listener { // Get the auth later as this may cause the single session check to fail // Slow stuff final PlayerAuth auth = dataSource.getAuth(name); - final boolean isAuthAvailable = (auth != null); + final boolean isAuthAvailable = auth != null; onJoinVerifier.checkKickNonRegistered(isAuthAvailable); onJoinVerifier.checkAntibot(player, isAuthAvailable); onJoinVerifier.checkNameCasing(player, auth); diff --git a/src/main/java/fr/xephi/authme/listener/PlayerListener111.java b/src/main/java/fr/xephi/authme/listener/PlayerListener111.java new file mode 100644 index 000000000..43b4ca339 --- /dev/null +++ b/src/main/java/fr/xephi/authme/listener/PlayerListener111.java @@ -0,0 +1,24 @@ +package fr.xephi.authme.listener; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityAirChangeEvent; + +import javax.inject.Inject; + +/** + * Listener of player events for events introduced in Minecraft 1.11. + */ +public class PlayerListener111 implements Listener { + + @Inject + private ListenerService listenerService; + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerAirChange(EntityAirChangeEvent event) { + if (listenerService.shouldCancelEvent(event)) { + event.setCancelled(true); + } + } +} diff --git a/src/main/java/fr/xephi/authme/output/Log4JFilter.java b/src/main/java/fr/xephi/authme/output/Log4JFilter.java index 90b9f0fb6..1d044e184 100644 --- a/src/main/java/fr/xephi/authme/output/Log4JFilter.java +++ b/src/main/java/fr/xephi/authme/output/Log4JFilter.java @@ -12,14 +12,9 @@ import org.apache.logging.log4j.message.Message; * * @author Xephi59 */ -@SuppressWarnings("serial") public class Log4JFilter extends AbstractFilter { - /** - * Constructor. - */ - public Log4JFilter() { - } + private static final long serialVersionUID = -5594073755007974254L; /** * Validates a Message instance and returns the {@link Result} value diff --git a/src/main/java/fr/xephi/authme/permission/AuthGroupHandler.java b/src/main/java/fr/xephi/authme/permission/AuthGroupHandler.java index fb4bff486..492c69115 100644 --- a/src/main/java/fr/xephi/authme/permission/AuthGroupHandler.java +++ b/src/main/java/fr/xephi/authme/permission/AuthGroupHandler.java @@ -31,7 +31,8 @@ public class AuthGroupHandler implements Reloadable { private String unregisteredGroup; private String registeredGroup; - AuthGroupHandler() { } + AuthGroupHandler() { + } /** * Set the group of a player, by its AuthMe group type. diff --git a/src/main/java/fr/xephi/authme/permission/PermissionsManager.java b/src/main/java/fr/xephi/authme/permission/PermissionsManager.java index c0c6981aa..29406be6c 100644 --- a/src/main/java/fr/xephi/authme/permission/PermissionsManager.java +++ b/src/main/java/fr/xephi/authme/permission/PermissionsManager.java @@ -78,12 +78,12 @@ public class PermissionsManager implements Reloadable { if (handler != null) { // Show a success message and return this.handler = handler; - ConsoleLogger.info("Hooked into " + type.getName() + "!"); + ConsoleLogger.info("Hooked into " + type.getDisplayName() + "!"); return; } } catch (Exception ex) { // An error occurred, show a warning message - ConsoleLogger.logException("Error while hooking into " + type.getName(), ex); + ConsoleLogger.logException("Error while hooking into " + type.getDisplayName(), ex); } } @@ -101,7 +101,7 @@ public class PermissionsManager implements Reloadable { // Make sure the plugin is enabled before hooking if (!plugin.isEnabled()) { - ConsoleLogger.info("Not hooking into " + type.getName() + " because it's disabled!"); + ConsoleLogger.info("Not hooking into " + type.getDisplayName() + " because it's disabled!"); return null; } @@ -414,7 +414,7 @@ public class PermissionsManager implements Reloadable { */ public boolean setGroups(Player player, List groupNames) { // If no permissions system is used or if there's no group supplied, return false - if (!isEnabled() || groupNames.size() <= 0) + if (!isEnabled() || groupNames.isEmpty()) return false; // Set the main group diff --git a/src/main/java/fr/xephi/authme/permission/PermissionsSystemType.java b/src/main/java/fr/xephi/authme/permission/PermissionsSystemType.java index 1410bc668..72a0753cb 100644 --- a/src/main/java/fr/xephi/authme/permission/PermissionsSystemType.java +++ b/src/main/java/fr/xephi/authme/permission/PermissionsSystemType.java @@ -33,21 +33,21 @@ public enum PermissionsSystemType { /** * The display name of the permissions system. */ - public String name; + private String displayName; /** * The name of the permissions system plugin. */ - public String pluginName; + private String pluginName; /** * Constructor for PermissionsSystemType. * - * @param name Display name of the permissions system. + * @param displayName Display name of the permissions system. * @param pluginName Name of the plugin. */ - PermissionsSystemType(String name, String pluginName) { - this.name = name; + PermissionsSystemType(String displayName, String pluginName) { + this.displayName = displayName; this.pluginName = pluginName; } @@ -56,8 +56,8 @@ public enum PermissionsSystemType { * * @return Display name. */ - public String getName() { - return this.name; + public String getDisplayName() { + return this.displayName; } /** @@ -76,7 +76,7 @@ public enum PermissionsSystemType { */ @Override public String toString() { - return getName(); + return getDisplayName(); } /** diff --git a/src/main/java/fr/xephi/authme/permission/handlers/BPermissionsHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/BPermissionsHandler.java index 983e42e27..9f52214b9 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/BPermissionsHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/BPermissionsHandler.java @@ -55,7 +55,7 @@ public class BPermissionsHandler implements PermissionHandler { List groups = getGroups(player); // Make sure there is any group available, or return null - if (groups.size() == 0) + if (groups.isEmpty()) return null; // Return the first group diff --git a/src/main/java/fr/xephi/authme/permission/handlers/PermissionsBukkitHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/PermissionsBukkitHandler.java index 344e0aec5..e8e8a21e5 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/PermissionsBukkitHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/PermissionsBukkitHandler.java @@ -54,7 +54,7 @@ public class PermissionsBukkitHandler implements PermissionHandler { List groups = getGroups(player); // Make sure there is any group available, or return null - if (groups.size() == 0) + if (groups.isEmpty()) return null; // Return the first group diff --git a/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java index e3e03ee32..b11d00003 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/PermissionsExHandler.java @@ -77,7 +77,7 @@ public class PermissionsExHandler implements PermissionHandler { PermissionUser user = permissionManager.getUser(player); List groups = user.getParentIdentifiers(null); - if (groups.size() == 0) + if (groups.isEmpty()) return null; return groups.get(0); diff --git a/src/main/java/fr/xephi/authme/process/changepassword/AsyncChangePassword.java b/src/main/java/fr/xephi/authme/process/changepassword/AsyncChangePassword.java index 12471b0ea..80d304dd1 100644 --- a/src/main/java/fr/xephi/authme/process/changepassword/AsyncChangePassword.java +++ b/src/main/java/fr/xephi/authme/process/changepassword/AsyncChangePassword.java @@ -27,7 +27,8 @@ public class AsyncChangePassword implements AsynchronousProcess { @Inject private PlayerCache playerCache; - AsyncChangePassword() { } + AsyncChangePassword() { + } public void changePassword(final Player player, String oldPassword, String newPassword) { diff --git a/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java b/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java index 9c73725e4..f92637590 100644 --- a/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java +++ b/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java @@ -15,6 +15,7 @@ import fr.xephi.authme.settings.commandconfig.CommandManager; import fr.xephi.authme.settings.properties.RegistrationSettings; import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.service.TeleportationService; +import fr.xephi.authme.util.StringUtils; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.PluginManager; @@ -84,16 +85,13 @@ public class ProcessSyncPlayerLogin implements SynchronousProcess { teleportationService.teleportOnLogin(player, auth, limbo); // We can now display the join message (if delayed) - String jm = PlayerListener.joinMessage.get(name); - if (jm != null) { - if (!jm.isEmpty()) { - for (Player p : bukkitService.getOnlinePlayers()) { - if (p.isOnline()) { - p.sendMessage(jm); - } + String joinMessage = PlayerListener.joinMessage.remove(name); + if (!StringUtils.isEmpty(joinMessage)) { + for (Player p : bukkitService.getOnlinePlayers()) { + if (p.isOnline()) { + p.sendMessage(joinMessage); } } - PlayerListener.joinMessage.remove(name); } if (service.getProperty(RegistrationSettings.APPLY_BLIND_EFFECT)) { diff --git a/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java b/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java index de77a17d0..3347b382f 100644 --- a/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java +++ b/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java @@ -21,8 +21,8 @@ public class ProcessSyncEmailRegister implements SynchronousProcess { @Inject private LimboPlayerTaskManager limboPlayerTaskManager; - ProcessSyncEmailRegister() { } - + ProcessSyncEmailRegister() { + } public void processEmailRegister(Player player) { final String name = player.getName().toLowerCase(); diff --git a/src/main/java/fr/xephi/authme/security/PasswordSecurity.java b/src/main/java/fr/xephi/authme/security/PasswordSecurity.java index 8549b388b..246070586 100644 --- a/src/main/java/fr/xephi/authme/security/PasswordSecurity.java +++ b/src/main/java/fr/xephi/authme/security/PasswordSecurity.java @@ -6,6 +6,7 @@ import fr.xephi.authme.events.PasswordEncryptionEvent; import fr.xephi.authme.initialization.Reloadable; import fr.xephi.authme.security.crypts.EncryptionMethod; import fr.xephi.authme.security.crypts.HashedPassword; +import fr.xephi.authme.settings.EnumSetProperty; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.SecuritySettings; import org.bukkit.plugin.PluginManager; @@ -41,7 +42,8 @@ public class PasswordSecurity implements Reloadable { @Override public void reload() { this.algorithm = settings.getProperty(SecuritySettings.PASSWORD_HASH); - this.legacyAlgorithms = settings.getProperty(SecuritySettings.LEGACY_HASHES); + // TODO #1014: Need to cast to specific type because ConfigMe ignores fields of child Property types + this.legacyAlgorithms = ((EnumSetProperty) SecuritySettings.LEGACY_HASHES).asEnumSet(settings); } /** diff --git a/src/main/java/fr/xephi/authme/security/crypts/PLAINTEXT.java b/src/main/java/fr/xephi/authme/security/crypts/PLAINTEXT.java index dc2cb3b40..a294ca917 100644 --- a/src/main/java/fr/xephi/authme/security/crypts/PLAINTEXT.java +++ b/src/main/java/fr/xephi/authme/security/crypts/PLAINTEXT.java @@ -1,5 +1,10 @@ package fr.xephi.authme.security.crypts; +/** + * Plaintext password storage. + * + * @deprecated Using this is no longer supported. AuthMe will migrate to SHA256 on startup. + */ @Deprecated public class PLAINTEXT extends UnsaltedMethod { diff --git a/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java b/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java index 186128744..f2ebf1976 100644 --- a/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java +++ b/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java @@ -18,14 +18,14 @@ public class XAUTH extends HexSaltedMethod { @Override public String computeHash(String password, String salt, String name) { String hash = getWhirlpool(salt + password).toLowerCase(); - int saltPos = (password.length() >= hash.length() ? hash.length() - 1 : password.length()); + int saltPos = password.length() >= hash.length() ? hash.length() - 1 : password.length(); return hash.substring(0, saltPos) + salt + hash.substring(saltPos); } @Override public boolean comparePassword(String password, HashedPassword hashedPassword, String playerName) { String hash = hashedPassword.getHash(); - int saltPos = (password.length() >= hash.length() ? hash.length() - 1 : password.length()); + int saltPos = password.length() >= hash.length() ? hash.length() - 1 : password.length(); if (saltPos + 12 > hash.length()) { return false; } diff --git a/src/main/java/fr/xephi/authme/service/BackupService.java b/src/main/java/fr/xephi/authme/service/BackupService.java index b5dfa06d3..846e34415 100644 --- a/src/main/java/fr/xephi/authme/service/BackupService.java +++ b/src/main/java/fr/xephi/authme/service/BackupService.java @@ -104,36 +104,22 @@ public class BackupService { dirBackup.mkdir(); } String backupWindowsPath = settings.getProperty(BackupSettings.MYSQL_WINDOWS_PATH); - if (checkWindows(backupWindowsPath)) { - String executeCmd = backupWindowsPath + "\\bin\\mysqldump.exe -u " + dbUserName + " -p" + dbPassword + " " + dbName + " --tables " + tblname + " -r " + path + ".sql"; - Process runtimeProcess; - try { - runtimeProcess = Runtime.getRuntime().exec(executeCmd); - int processComplete = runtimeProcess.waitFor(); - if (processComplete == 0) { - ConsoleLogger.info("Backup created successfully."); - return true; - } else { - ConsoleLogger.warning("Could not create the backup! (Windows)"); - } - } catch (IOException | InterruptedException e) { - ConsoleLogger.logException("Error during Windows backup:", e); - } - } else { - String executeCmd = "mysqldump -u " + dbUserName + " -p" + dbPassword + " " + dbName + " --tables " + tblname + " -r " + path + ".sql"; - Process runtimeProcess; - try { - runtimeProcess = Runtime.getRuntime().exec(executeCmd); - int processComplete = runtimeProcess.waitFor(); - if (processComplete == 0) { - ConsoleLogger.info("Backup created successfully."); - return true; - } else { - ConsoleLogger.warning("Could not create the backup!"); - } - } catch (IOException | InterruptedException e) { - ConsoleLogger.logException("Error during backup:", e); + boolean isUsingWindows = checkWindows(backupWindowsPath); + String backupCommand = isUsingWindows + ? backupWindowsPath + "\\bin\\mysqldump.exe" + buildMysqlDumpArguments() + : "mysqldump" + buildMysqlDumpArguments(); + + try { + Process runtimeProcess = Runtime.getRuntime().exec(backupCommand); + int processComplete = runtimeProcess.waitFor(); + if (processComplete == 0) { + ConsoleLogger.info("Backup created successfully. (Using Windows = " + isUsingWindows + ")"); + return true; + } else { + ConsoleLogger.warning("Could not create the backup! (Using Windows = " + isUsingWindows + ")"); } + } catch (IOException | InterruptedException e) { + ConsoleLogger.logException("Error during backup (using Windows = " + isUsingWindows + "):", e); } return false; } @@ -173,6 +159,16 @@ public class BackupService { return false; } + /** + * Builds the command line arguments to pass along when running the {@code mysqldump} command. + * + * @return the mysqldump command line arguments + */ + private String buildMysqlDumpArguments() { + return " -u " + dbUserName + " -p" + dbPassword + " " + dbName + + " --tables " + tblname + " -r " + path + ".sql"; + } + private static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst); diff --git a/src/main/java/fr/xephi/authme/service/ValidationService.java b/src/main/java/fr/xephi/authme/service/ValidationService.java index e3a69fc94..c6cdd99a1 100644 --- a/src/main/java/fr/xephi/authme/service/ValidationService.java +++ b/src/main/java/fr/xephi/authme/service/ValidationService.java @@ -40,7 +40,8 @@ public class ValidationService implements Reloadable { private Pattern passwordRegex; private Set unrestrictedNames; - ValidationService() { } + ValidationService() { + } @PostConstruct @Override diff --git a/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java b/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java index 4ca284d72..8b1fa7893 100644 --- a/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java +++ b/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java @@ -1,35 +1,38 @@ package fr.xephi.authme.settings; -import com.github.authme.configme.properties.Property; -import com.github.authme.configme.resource.PropertyResource; +import com.github.authme.configme.SettingsManager; +import com.github.authme.configme.properties.StringListProperty; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; /** * Property whose value is a set of entries of a given enum. */ -// TODO https://github.com/AuthMe/ConfigMe/issues/27: Should be a Property of Set type -public class EnumSetProperty> extends Property> { +// TODO #1014: This property type currently extends StringListProperty with a dedicated method to convert the values +// into a Set of the selected enum due to multiple issues on ConfigMe's side. +public class EnumSetProperty> extends StringListProperty { private final Class enumClass; - public EnumSetProperty(Class enumClass, String path, List defaultValue) { - super(path, defaultValue); + public EnumSetProperty(Class enumClass, String path, String... values) { + super(path, values); this.enumClass = enumClass; } - @Override - protected List getFromResource(PropertyResource resource) { - List elements = resource.getList(getPath()); - if (elements != null) { - return elements.stream() - .map(val -> toEnum(String.valueOf(val))) - .filter(e -> e != null) - .distinct() - .collect(Collectors.toList()); - } - return null; + /** + * Returns the value as a set of enum entries. + * + * @param settings the settings manager to look up the raw value with + * @return the property's value as mapped enum entries + */ + public Set asEnumSet(SettingsManager settings) { + List entries = settings.getProperty(this); + return entries.stream() + .map(str -> toEnum(str)) + .filter(e -> e != null) + .collect(Collectors.toSet()); } private E toEnum(String str) { diff --git a/src/main/java/fr/xephi/authme/settings/SpawnLoader.java b/src/main/java/fr/xephi/authme/settings/SpawnLoader.java index b3a06f5eb..ac1742fa6 100644 --- a/src/main/java/fr/xephi/authme/settings/SpawnLoader.java +++ b/src/main/java/fr/xephi/authme/settings/SpawnLoader.java @@ -48,10 +48,10 @@ public class SpawnLoader implements Reloadable { @Inject SpawnLoader(@DataFolder File pluginFolder, Settings settings, PluginHookService pluginHookService, DataSource dataSource) { - File spawnFile = new File(pluginFolder, "spawn.yml"); // TODO ljacqu 20160312: Check if resource could be copied and handle the case if not + File spawnFile = new File(pluginFolder, "spawn.yml"); FileUtils.copyFileFromResource(spawnFile, "spawn.yml"); - this.authMeConfigurationFile = new File(pluginFolder, "spawn.yml"); + this.authMeConfigurationFile = spawnFile; this.settings = settings; this.pluginHookService = pluginHookService; reload(); diff --git a/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java b/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java index e8035491b..3711715d0 100644 --- a/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java +++ b/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java @@ -6,7 +6,6 @@ import com.github.authme.configme.properties.Property; import fr.xephi.authme.security.HashAlgorithm; import fr.xephi.authme.settings.EnumSetProperty; -import java.util.Collections; import java.util.List; import static com.github.authme.configme.properties.PropertyInitializer.newLowercaseListProperty; @@ -83,8 +82,8 @@ public class SecuritySettings implements SettingsHolder { "legacyHashes:", "- 'SHA1'" }) - public static final Property> LEGACY_HASHES = - new EnumSetProperty<>(HashAlgorithm.class, "settings.security.legacyHashes", Collections.emptyList()); + public static final Property> LEGACY_HASHES = + new EnumSetProperty<>(HashAlgorithm.class, "settings.security.legacyHashes"); @Comment({"Prevent unsafe passwords from being used; put them in lowercase!", "You should always set 'help' as unsafePassword due to possible conflicts.", diff --git a/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java b/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java index 712f81a32..92391af90 100644 --- a/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java +++ b/src/main/java/fr/xephi/authme/task/purge/PurgeTask.java @@ -72,7 +72,7 @@ class PurgeTask extends BukkitRunnable { } OfflinePlayer offlinePlayer = offlinePlayers[nextPosition]; - if (toPurge.remove(offlinePlayer.getName().toLowerCase())) { + if (offlinePlayer.getName() != null && toPurge.remove(offlinePlayer.getName().toLowerCase())) { if (!permissionsManager.hasPermissionOffline(offlinePlayer, PlayerStatePermission.BYPASS_PURGE)) { playerPortion.add(offlinePlayer); namePortion.add(offlinePlayer.getName()); diff --git a/src/main/java/fr/xephi/authme/util/Utils.java b/src/main/java/fr/xephi/authme/util/Utils.java index 5fef8a957..39419689e 100644 --- a/src/main/java/fr/xephi/authme/util/Utils.java +++ b/src/main/java/fr/xephi/authme/util/Utils.java @@ -54,7 +54,7 @@ public final class Utils { * * @return the core count */ - public static int getCoreCount() { - return Runtime.getRuntime().availableProcessors(); - } + public static int getCoreCount() { + return Runtime.getRuntime().availableProcessors(); + } } diff --git a/src/main/resources/messages/help_pl.yml b/src/main/resources/messages/help_pl.yml new file mode 100644 index 000000000..a5f59a2ea --- /dev/null +++ b/src/main/resources/messages/help_pl.yml @@ -0,0 +1,45 @@ +# Tlumaczenie configu dla AuthMe pomoc, kiedy wpiszesz /authme help lub /authme help register podana wiadomosc zostanie wyslana + +# ------------------------------------------------------- +# Lista tekstu uzyta w pomocy. +common: + header: '==========[ AuthMeReloaded - Pomoc ]==========' + optional: 'Opcjonalnie' + hasPermission: 'Nie posidasz permisji' + noPermission: 'Brak permisji' + default: 'Domyslnie' + result: 'Wynik' + defaultPermissions: + notAllowed: 'Nie posiadasz permisji' + opOnly: 'Tylko OP' + allowed: 'Dozwolone dla wszyskich' + +# ------------------------------------------------------- +# Tytuly z inwidualnych stref w pomoc. +# Zostaw tlumaczenie puste aby wylaczyc dana komende. Np.: +# alternatives: '' +section: + command: 'Komenda' + description: 'Krotki opis' + detailedDescription: 'Dlugi opis' + arguments: 'Argumenty' + permissions: 'Permisje' + alternatives: 'Alternatywy' + children: 'Komendy' + +# ------------------------------------------------------- +# Mozesz przetlumaczyc wszystkie komendy uzywajac tego wzoru. +# Na przyklad jesli chcesz przetlumaczyc /authme reload, utworz selekcje "authme.reload", lub "login" dla /login +# Jesli komenda posiada argumenty, mozesz uzyc arg1 aby przetlumaczyc pierwszy argument, i nastepne +# Tlumaczenia nie musza byc kompletne; kazde braki beda uzupelniane domyslnymi wiadomosciami z pluginu. +# Uwaga: Postaw glowna klase (np. "authme") przed ich dziecmi (np. "authme.reload") +commands: + authme.register: + description: 'Rejestracja gracza' + detailedDescription: 'Rerejestracja gracza z okreslonym haslem' + arg1: + label: 'player' + description: 'Nazwa gracza' + arg2: + label: 'password' + description: 'Haslo' diff --git a/src/main/resources/messages/messages_es.yml b/src/main/resources/messages/messages_es.yml index 8e0014789..bc5bcb0f2 100644 --- a/src/main/resources/messages/messages_es.yml +++ b/src/main/resources/messages/messages_es.yml @@ -74,5 +74,5 @@ accounts_owned_other: 'El jugador %name tiene %count cuentas:' incomplete_email_settings: 'Error: no todos los ajustes necesario se han configurado para enviar correos. Por favor, contacta con un administrador.' recovery_code_sent: 'El código de recuperación para recuperar tu contraseña se ha enviado a tu correo.' invalid_name_case: 'Solo puedes unirte mediante el nombre de usuario %valid, no %invalid.' -# TODO email_show: '&2Your current email address is: &f%email' -# TODO show_no_email: '&2You currently don''t have email address associated with this account.' \ No newline at end of file +email_show: '&2Tu dirección de E-Mail actual es: &f%email' +show_no_email: '&2No tienes ningun E-Mail asociado en esta cuenta.' diff --git a/src/main/resources/messages/messages_pl.yml b/src/main/resources/messages/messages_pl.yml index 777ced5ff..cd3c55ac0 100644 --- a/src/main/resources/messages/messages_pl.yml +++ b/src/main/resources/messages/messages_pl.yml @@ -69,9 +69,9 @@ antibot_auto_enabled: '&4[AntiBotService] AntyBot wlaczony z powodu duzej liczby accounts_owned_self: 'Posiadasz %count kont:' two_factor_create: '&2Twoj sekretny kod to %code. Mozesz zeskanowac go tutaj %url' not_owner_error: 'Nie jestes wlascicielem tego konta, wybierz inny nick!' -# TODO email_show: '&2Your current email address is: &f%email' -# TODO show_no_email: '&2You currently don''t have email address associated with this account.' -# TODO kicked_admin_registered: 'An admin just registered you; please log in again' -# TODO incomplete_email_settings: 'Error: not all required settings are set for sending emails. Please contact an admin.' -# TODO recovery_code_sent: 'A recovery code to reset your password has been sent to your email.' -# TODO recovery_code_incorrect: 'The recovery code is not correct! Use /email recovery [email] to generate a new one' \ No newline at end of file +email_show: '&2Twoj aktualny adres email to: &f%email' +show_no_email: '&2Nie posiadasz adresu email przypisanego do tego konta.' +kicked_admin_registered: 'Administrator zarejestrowal Ciebie, mozesz sie zalogowac.' +incomplete_email_settings: 'Error: Nie wszystkie opcje odpowiedzialne za wysylanie emaili zostaly ustawione. Skontaktuj sie z administracja.' +recovery_code_sent: 'Kod odzyskiwania hasla zostal wyslany na adres email przypisany do konta.' +recovery_code_incorrect: 'Kod odzyskiwania hasla jest bledny! Uzyj /email recovery [email] aby wygenerowac nowy.' diff --git a/src/test/java/fr/xephi/authme/AuthMeInitializationTest.java b/src/test/java/fr/xephi/authme/AuthMeInitializationTest.java index a41dc588c..9e4ffd4ea 100644 --- a/src/test/java/fr/xephi/authme/AuthMeInitializationTest.java +++ b/src/test/java/fr/xephi/authme/AuthMeInitializationTest.java @@ -19,8 +19,8 @@ import fr.xephi.authme.task.purge.PurgeService; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.plugin.PluginDescriptionFile; -import org.bukkit.plugin.PluginLoader; import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPluginLoader; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; @@ -34,7 +34,6 @@ import java.io.File; import java.io.IOException; import java.util.logging.Logger; -import static fr.xephi.authme.settings.TestSettingsMigrationServices.alwaysFulfilled; import static fr.xephi.authme.settings.properties.AuthMeSettingsRetriever.buildConfigurationData; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; @@ -49,9 +48,6 @@ import static org.mockito.Mockito.mock; @RunWith(MockitoJUnitRunner.class) public class AuthMeInitializationTest { - @Mock - private PluginLoader pluginLoader; - @Mock private Server server; @@ -60,7 +56,6 @@ public class AuthMeInitializationTest { private AuthMe authMe; private File dataFolder; - private File settingsFile; @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @@ -73,7 +68,8 @@ public class AuthMeInitializationTest { @Before public void initAuthMe() throws IOException { dataFolder = temporaryFolder.newFolder(); - settingsFile = new File(dataFolder, "config.yml"); + File settingsFile = new File(dataFolder, "config.yml"); + JavaPluginLoader pluginLoader = new JavaPluginLoader(server); Files.copy(TestHelper.getJarFile(TestHelper.PROJECT_ROOT + "config.test.yml"), settingsFile); // Mock / wire various Bukkit components @@ -86,14 +82,14 @@ public class AuthMeInitializationTest { "AuthMe", "N/A", AuthMe.class.getCanonicalName()); // Initialize AuthMe - authMe = new AuthMe(pluginLoader, server, descriptionFile, dataFolder, null); + authMe = new AuthMe(pluginLoader, descriptionFile, dataFolder, null); } @Test public void shouldInitializeAllServices() { // given Settings settings = - new Settings(dataFolder, mock(PropertyResource.class), alwaysFulfilled(), buildConfigurationData()); + new Settings(dataFolder, mock(PropertyResource.class), null, buildConfigurationData()); Injector injector = new InjectorBuilder().addDefaultHandlers("fr.xephi.authme").create(); injector.provide(DataFolder.class, dataFolder); diff --git a/src/test/java/fr/xephi/authme/listener/PlayerListener111Test.java b/src/test/java/fr/xephi/authme/listener/PlayerListener111Test.java new file mode 100644 index 000000000..8f479a71b --- /dev/null +++ b/src/test/java/fr/xephi/authme/listener/PlayerListener111Test.java @@ -0,0 +1,30 @@ +package fr.xephi.authme.listener; + +import org.bukkit.event.entity.EntityAirChangeEvent; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import static fr.xephi.authme.listener.EventCancelVerifier.withServiceMock; + +/** + * Test for {@link PlayerListener111}. + */ +@RunWith(MockitoJUnitRunner.class) +public class PlayerListener111Test { + + @InjectMocks + private PlayerListener111 listener; + + @Mock + private ListenerService listenerService; + + @Test + public void shouldCancelEvent() { + withServiceMock(listenerService) + .check(listener::onPlayerAirChange, EntityAirChangeEvent.class); + } + +} diff --git a/src/test/java/fr/xephi/authme/permission/PermissionsSystemTypeTest.java b/src/test/java/fr/xephi/authme/permission/PermissionsSystemTypeTest.java index 809014ada..ec63c5889 100644 --- a/src/test/java/fr/xephi/authme/permission/PermissionsSystemTypeTest.java +++ b/src/test/java/fr/xephi/authme/permission/PermissionsSystemTypeTest.java @@ -23,15 +23,15 @@ public class PermissionsSystemTypeTest { List pluginNames = new ArrayList<>(PermissionsSystemType.values().length); for (PermissionsSystemType system : PermissionsSystemType.values()) { - assertThat("Name for enum entry '" + system + "' is not null", - system.getName(), not(nullValue())); + assertThat("Display name for enum entry '" + system + "' is not null", + system.getDisplayName(), not(nullValue())); assertThat("Plugin name for enum entry '" + system + "' is not null", system.getPluginName(), not(nullValue())); - assertThat("Only one enum entry has name '" + system.getName() + "'", - names, not(hasItem(system.getName()))); + assertThat("Only one enum entry has display name '" + system.getDisplayName() + "'", + names, not(hasItem(system.getDisplayName()))); assertThat("Only one enum entry has plugin name '" + system.getPluginName() + "'", pluginNames, not(hasItem(system.getPluginName()))); - names.add(system.getName()); + names.add(system.getDisplayName()); pluginNames.add(system.getPluginName()); } } diff --git a/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java b/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java index ec206c869..e1c30f43b 100644 --- a/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java +++ b/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java @@ -26,8 +26,10 @@ import org.mockito.stubbing.Answer; import java.util.Collections; import java.util.List; +import java.util.Set; import static com.google.common.collect.Lists.newArrayList; +import static com.google.common.collect.Sets.newHashSet; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalToIgnoringCase; import static org.junit.Assert.assertThat; @@ -173,7 +175,7 @@ public class PasswordSecurityTest { given(method.comparePassword(clearTextPass, password, playerLowerCase)).willReturn(false); given(method.computeHash(clearTextPass, playerLowerCase)).willReturn(newPassword); initSettings(HashAlgorithm.MD5); - given(settings.getProperty(SecuritySettings.LEGACY_HASHES)).willReturn(newArrayList(HashAlgorithm.BCRYPT)); + given(settings.getProperty(SecuritySettings.LEGACY_HASHES)).willReturn(newArrayList(HashAlgorithm.BCRYPT.name())); PasswordSecurity security = newPasswordSecurity(); // when @@ -258,7 +260,7 @@ public class PasswordSecurityTest { initSettings(HashAlgorithm.BCRYPT); PasswordSecurity passwordSecurity = newPasswordSecurity(); given(settings.getProperty(SecuritySettings.PASSWORD_HASH)).willReturn(HashAlgorithm.MD5); - List legacyHashes = newArrayList(HashAlgorithm.CUSTOM, HashAlgorithm.BCRYPT); + List legacyHashes = newArrayList(HashAlgorithm.CUSTOM.name(), HashAlgorithm.BCRYPT.name()); given(settings.getProperty(SecuritySettings.LEGACY_HASHES)).willReturn(legacyHashes); // when @@ -267,8 +269,9 @@ public class PasswordSecurityTest { // then assertThat(ReflectionTestUtils.getFieldValue(PasswordSecurity.class, passwordSecurity, "algorithm"), equalTo(HashAlgorithm.MD5)); + Set legacyHashesSet = newHashSet(HashAlgorithm.CUSTOM, HashAlgorithm.BCRYPT); assertThat(ReflectionTestUtils.getFieldValue(PasswordSecurity.class, passwordSecurity, "legacyAlgorithms"), - equalTo(legacyHashes)); + equalTo(legacyHashesSet)); } private PasswordSecurity newPasswordSecurity() { diff --git a/src/test/java/fr/xephi/authme/settings/SettingsIntegrationTest.java b/src/test/java/fr/xephi/authme/settings/SettingsIntegrationTest.java index 9a6441979..d0d2c36a8 100644 --- a/src/test/java/fr/xephi/authme/settings/SettingsIntegrationTest.java +++ b/src/test/java/fr/xephi/authme/settings/SettingsIntegrationTest.java @@ -121,8 +121,7 @@ public class SettingsIntegrationTest { // given File configFile = temporaryFolder.newFile(); PropertyResource resource = new YamlFileResource(configFile); - Settings settings = new Settings(testPluginFolder, resource, - TestSettingsMigrationServices.alwaysFulfilled(), CONFIG_DATA); + Settings settings = new Settings(testPluginFolder, resource, null, CONFIG_DATA); // when assertThat(settings.getProperty(TestConfiguration.RATIO_ORDER), equalTo(TestEnum.SECOND)); // default value diff --git a/src/test/java/fr/xephi/authme/settings/SettingsTest.java b/src/test/java/fr/xephi/authme/settings/SettingsTest.java index e839bb39f..137d5a562 100644 --- a/src/test/java/fr/xephi/authme/settings/SettingsTest.java +++ b/src/test/java/fr/xephi/authme/settings/SettingsTest.java @@ -55,8 +55,7 @@ public class SettingsTest { PropertyResource resource = mock(PropertyResource.class); given(resource.getBoolean(RegistrationSettings.USE_WELCOME_MESSAGE.getPath())).willReturn(true); - Settings settings = new Settings(testPluginFolder, resource, - TestSettingsMigrationServices.alwaysFulfilled(), CONFIG_DATA); + Settings settings = new Settings(testPluginFolder, resource, null, CONFIG_DATA); // when String[] result = settings.getWelcomeMessage(); @@ -75,8 +74,7 @@ public class SettingsTest { Files.write(emailFile.toPath(), emailMessage.getBytes()); PropertyResource resource = mock(PropertyResource.class); - Settings settings = new Settings(testPluginFolder, resource, - TestSettingsMigrationServices.alwaysFulfilled(), CONFIG_DATA); + Settings settings = new Settings(testPluginFolder, resource, null, CONFIG_DATA); // when String result = settings.getPasswordEmailMessage(); diff --git a/src/test/java/fr/xephi/authme/settings/TestSettingsMigrationServices.java b/src/test/java/fr/xephi/authme/settings/TestSettingsMigrationServices.java deleted file mode 100644 index f14a47831..000000000 --- a/src/test/java/fr/xephi/authme/settings/TestSettingsMigrationServices.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.xephi.authme.settings; - -import com.github.authme.configme.migration.MigrationService; - -/** - * Provides {@link MigrationService} implementations for testing. - */ -public final class TestSettingsMigrationServices { - - private TestSettingsMigrationServices() { - } - - /** - * Returns a settings migration service which always answers that all data is up-to-date. - * - * @return test settings migration service - */ - public static MigrationService alwaysFulfilled() { - return (propertyResource, knownProperties) -> false; - } -} diff --git a/src/test/java/fr/xephi/authme/task/purge/PurgeTaskTest.java b/src/test/java/fr/xephi/authme/task/purge/PurgeTaskTest.java index 728669f7f..286e01248 100644 --- a/src/test/java/fr/xephi/authme/task/purge/PurgeTaskTest.java +++ b/src/test/java/fr/xephi/authme/task/purge/PurgeTaskTest.java @@ -124,6 +124,27 @@ public class PurgeTaskTest { assertRanPurgeWithNames("foxtrot"); } + /** + * #1008: OfflinePlayer#getName may return null. + */ + @Test + public void shouldHandleOfflinePlayerWithNullName() { + // given + Set names = newHashSet("name1", "name2"); + OfflinePlayer[] players = asArray( + mockOfflinePlayer(null, false), mockOfflinePlayer("charlie", false), mockOfflinePlayer("name1", false)); + reset(purgeService, permissionsManager); + setPermissionsBehavior(); + + PurgeTask task = new PurgeTask(purgeService, permissionsManager, null, names, players); + + // when + task.run(); + + // then + assertRanPurgeWithPlayers(players[2]); + } + @Test public void shouldStopTaskAndInformSenderUponCompletion() { // given